This commit is contained in:
Alexey Bogomolov 2025-04-22 14:55:15 +08:00 committed by GitHub
commit 92bb4c4786
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 95 additions and 6 deletions

View File

@ -449,7 +449,6 @@ export function ChatAction(props: {
</div> </div>
); );
} }
function useScrollToBottom( function useScrollToBottom(
scrollRef: RefObject<HTMLDivElement>, scrollRef: RefObject<HTMLDivElement>,
detach: boolean = false, detach: boolean = false,
@ -457,15 +456,18 @@ function useScrollToBottom(
) { ) {
// for auto-scroll // for auto-scroll
const [autoScroll, setAutoScroll] = useState(true); const [autoScroll, setAutoScroll] = useState(true);
const config = useAppConfig();
const isAutoScrollEnabled: boolean = config.autoScrollMessage;
const scrollDomToBottom = useCallback(() => { const scrollDomToBottom = useCallback(() => {
const dom = scrollRef.current; const dom = scrollRef.current;
if (dom) { if (dom) {
requestAnimationFrame(() => { requestAnimationFrame(() => {
setAutoScroll(true); setAutoScroll(isAutoScrollEnabled);
dom.scrollTo(0, dom.scrollHeight); dom.scrollTo(0, dom.scrollHeight);
}); });
} }
}, [scrollRef]); }, [scrollRef, isAutoScrollEnabled]);
// auto scroll // auto scroll
useEffect(() => { useEffect(() => {
@ -490,7 +492,6 @@ function useScrollToBottom(
scrollDomToBottom, scrollDomToBottom,
}; };
} }
export function ChatActions(props: { export function ChatActions(props: {
uploadImage: () => void; uploadImage: () => void;
setAttachImages: (images: string[]) => void; setAttachImages: (images: string[]) => void;
@ -1420,7 +1421,8 @@ function _Chat() {
} }
setHitBottom(isHitBottom); setHitBottom(isHitBottom);
setAutoScroll(isHitBottom); let isAutoScrollEnabled: boolean = config.autoScrollMessage;
setAutoScroll(isAutoScrollEnabled);
}; };
function scrollToBottom() { function scrollToBottom() {

View File

@ -1666,7 +1666,21 @@ export function Settings() {
} }
></input> ></input>
</ListItem> </ListItem>
<ListItem
title={Locale.Settings.AutoScrollMessage.Title}
subTitle={Locale.Settings.AutoScrollMessage.SubTitle}
>
<input
type="checkbox"
checked={config.autoScrollMessage}
onChange={(e) =>
updateConfig(
(config) =>
(config.autoScrollMessage = e.currentTarget.checked),
)
}
></input>
</ListItem>
<ListItem <ListItem
title={Locale.Mask.Config.Artifacts.Title} title={Locale.Mask.Config.Artifacts.Title}
subTitle={Locale.Mask.Config.Artifacts.SubTitle} subTitle={Locale.Mask.Config.Artifacts.SubTitle}

View File

@ -242,6 +242,10 @@ const ar: PartialLocaleType = {
}, },
ImportFailed: "فشل الاستيراد", ImportFailed: "فشل الاستيراد",
}, },
AutoScrollMessage: {
Title: "الرد التلقائي للتمرير",
SubTitle: "تمرير الرسالة أثناء الرد",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "صفحة بدء القناع", Title: "صفحة بدء القناع",

View File

@ -245,6 +245,10 @@ const bn: PartialLocaleType = {
}, },
ImportFailed: "আমদানি ব্যর্থ", ImportFailed: "আমদানি ব্যর্থ",
}, },
AutoScrollMessage: {
Title: "অটো-স্ক্রল উত্তর",
SubTitle: "উত্তর দেওয়ার সময় বার্তা স্ক্রল করুন",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "মাস্ক লঞ্চ পেজ", Title: "মাস্ক লঞ্চ পেজ",

View File

@ -216,6 +216,10 @@ const cn = {
Title: "预览气泡", Title: "预览气泡",
SubTitle: "在预览气泡中预览 Markdown 内容", SubTitle: "在预览气泡中预览 Markdown 内容",
}, },
AutoScrollMessage: {
Title: "自动滚动回复",
SubTitle: "滚动消息以进行回复",
},
AutoGenerateTitle: { AutoGenerateTitle: {
Title: "自动生成标题", Title: "自动生成标题",
SubTitle: "根据对话内容生成合适的标题", SubTitle: "根据对话内容生成合适的标题",

View File

@ -244,6 +244,10 @@ const cs: PartialLocaleType = {
}, },
ImportFailed: "Import selhal", ImportFailed: "Import selhal",
}, },
AutoScrollMessage: {
Title: "Automatické rolování odpovědi",
SubTitle: "Rolovat zprávu při odpovídání",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "Úvodní stránka masky", Title: "Úvodní stránka masky",

View File

@ -249,6 +249,10 @@ const de: PartialLocaleType = {
}, },
ImportFailed: "Import fehlgeschlagen", ImportFailed: "Import fehlgeschlagen",
}, },
AutoScrollMessage: {
Title: "Auto-Scroll-Antwort",
SubTitle: "Nachricht beim Antworten scrollen",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "Masken-Startseite", Title: "Masken-Startseite",

View File

@ -218,6 +218,10 @@ const en: LocaleType = {
Title: "Send Preview Bubble", Title: "Send Preview Bubble",
SubTitle: "Preview markdown in bubble", SubTitle: "Preview markdown in bubble",
}, },
AutoScrollMessage: {
Title: "Auto-Scroll Reply",
SubTitle: "Scroll the message during reply",
},
AutoGenerateTitle: { AutoGenerateTitle: {
Title: "Auto Generate Title", Title: "Auto Generate Title",
SubTitle: "Generate a suitable title based on the conversation content", SubTitle: "Generate a suitable title based on the conversation content",

View File

@ -252,6 +252,10 @@ const es: PartialLocaleType = {
}, },
ImportFailed: "Importación fallida", ImportFailed: "Importación fallida",
}, },
AutoScrollMessage: {
Title: "Respuesta con Auto-Desplazamiento",
SubTitle: "Desplazar el mensaje durante la respuesta",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "Pantalla de inicio de máscara", Title: "Pantalla de inicio de máscara",

View File

@ -252,6 +252,10 @@ const fr: PartialLocaleType = {
}, },
ImportFailed: "Échec de l'importation", ImportFailed: "Échec de l'importation",
}, },
AutoScrollMessage: {
Title: "Réponse défilement automatique",
SubTitle: "Faire défiler le message lors de la réponse",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "Page de démarrage du masque", Title: "Page de démarrage du masque",

View File

@ -245,6 +245,10 @@ const id: PartialLocaleType = {
}, },
ImportFailed: "Impor Gagal", ImportFailed: "Impor Gagal",
}, },
AutoScrollMessage: {
Title: "Balasan Auto-Scroll",
SubTitle: "Gulir pesan saat membalas",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "Halaman Awal Masker", Title: "Halaman Awal Masker",

View File

@ -253,6 +253,10 @@ const it: PartialLocaleType = {
}, },
ImportFailed: "Importazione fallita", ImportFailed: "Importazione fallita",
}, },
AutoScrollMessage: {
Title: "Risposta Auto-Scroll",
SubTitle: "Scorri il messaggio durante la risposta",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "Pagina di avvio delle maschere", Title: "Pagina di avvio delle maschere",

View File

@ -244,6 +244,10 @@ const jp: PartialLocaleType = {
}, },
ImportFailed: "インポートに失敗しました", ImportFailed: "インポートに失敗しました",
}, },
AutoScrollMessage: {
Title: "オートスクロール返信",
SubTitle: "返信中にメッセージをスクロール",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "マスク起動画面", Title: "マスク起動画面",

View File

@ -243,6 +243,10 @@ const ko: PartialLocaleType = {
}, },
ImportFailed: "가져오기 실패", ImportFailed: "가져오기 실패",
}, },
AutoScrollMessage: {
Title: "자동 스크롤 답장",
SubTitle: "답장하는 동안 메시지 스크롤",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "마스크 시작 페이지", Title: "마스크 시작 페이지",

View File

@ -195,6 +195,10 @@ const pt: PartialLocaleType = {
Title: "Bolha de Pré-visualização de Envio", Title: "Bolha de Pré-visualização de Envio",
SubTitle: "Pré-visualizar markdown na bolha", SubTitle: "Pré-visualizar markdown na bolha",
}, },
AutoScrollMessage: {
Title: "Resposta de rolagem automática",
SubTitle: "Rolar a mensagem enquanto responde",
},
AutoGenerateTitle: { AutoGenerateTitle: {
Title: "Gerar Título Automaticamente", Title: "Gerar Título Automaticamente",
SubTitle: "Gerar um título adequado baseado no conteúdo da conversa", SubTitle: "Gerar um título adequado baseado no conteúdo da conversa",

View File

@ -246,6 +246,10 @@ const ru: PartialLocaleType = {
}, },
ImportFailed: "Не удалось импортировать", ImportFailed: "Не удалось импортировать",
}, },
AutoScrollMessage: {
Title: "Автопрокрутка ответа",
SubTitle: "Прокрутка сообщения во время ответа",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "Стартовая страница масок", Title: "Стартовая страница масок",

View File

@ -196,6 +196,10 @@ const sk: PartialLocaleType = {
Title: "Bublina náhľadu odoslania", Title: "Bublina náhľadu odoslania",
SubTitle: "Náhľad markdownu v bubline", SubTitle: "Náhľad markdownu v bubline",
}, },
AutoScrollMessage: {
Title: "Odpoveď s automatickým posúvaním",
SubTitle: "Posúvať správu počas odpovedania",
},
AutoGenerateTitle: { AutoGenerateTitle: {
Title: "Automaticky generovať názov", Title: "Automaticky generovať názov",
SubTitle: "Generovať vhodný názov na základe obsahu konverzácie", SubTitle: "Generovať vhodný názov na základe obsahu konverzácie",

View File

@ -244,6 +244,10 @@ const tr: PartialLocaleType = {
}, },
ImportFailed: "İçeri aktarma başarısız", ImportFailed: "İçeri aktarma başarısız",
}, },
AutoScrollMessage: {
Title: "Otomatik Kaydırma Yanıtı",
SubTitle: "Yanıt verirken mesajı kaydır",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "Maske Başlangıç Sayfası", Title: "Maske Başlangıç Sayfası",

View File

@ -203,6 +203,10 @@ const tw = {
Title: "預覽氣泡", Title: "預覽氣泡",
SubTitle: "在預覽氣泡中預覽 Markdown 內容", SubTitle: "在預覽氣泡中預覽 Markdown 內容",
}, },
AutoScrollMessage: {
Title: "自動滾動回覆",
SubTitle: "回覆時滾動訊息",
},
AutoGenerateTitle: { AutoGenerateTitle: {
Title: "自動產生標題", Title: "自動產生標題",
SubTitle: "根據對話內容產生合適的標題", SubTitle: "根據對話內容產生合適的標題",

View File

@ -244,6 +244,10 @@ const vi: PartialLocaleType = {
}, },
ImportFailed: "Nhập không thành công", ImportFailed: "Nhập không thành công",
}, },
AutoScrollMessage: {
Title: "Trả lời Tự động Cuộn",
SubTitle: "Cuộn tin nhắn khi trả lời",
},
Mask: { Mask: {
Splash: { Splash: {
Title: "Trang khởi động mặt nạ", Title: "Trang khởi động mặt nạ",

View File

@ -48,6 +48,7 @@ export const DEFAULT_CONFIG = {
theme: Theme.Auto as Theme, theme: Theme.Auto as Theme,
tightBorder: !!config?.isApp, tightBorder: !!config?.isApp,
sendPreviewBubble: true, sendPreviewBubble: true,
autoScrollMessage: true,
enableAutoGenerateTitle: true, enableAutoGenerateTitle: true,
sidebarWidth: DEFAULT_SIDEBAR_WIDTH, sidebarWidth: DEFAULT_SIDEBAR_WIDTH,