Skip to content

Commit 15fbe08

Browse files
committed
scroll to extent
1 parent 9001e7a commit 15fbe08

30 files changed

+92
-10
lines changed

arb/app_de.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "Hauptbetreuer",
8585
"apiKey": "API-Schlüssel",
8686
"baseUrl": "Basis-URL",
87+
"scrollToRecent": "Zuletzt verwendet",
8788
"clearPrompt": "Prompt löschen",
8889
"submitPrompt": "Prompt senden",
8990
"stopPrompt": "Prompt stoppen",

arb/app_en.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@
102102
"leadMaintainer": "Lead Maintainer",
103103
"apiKey": "API Key",
104104
"baseUrl": "Base URL",
105+
"scrollToRecent": "Scroll to Recent",
105106
"clearPrompt": "Clear Prompt",
106107
"submitPrompt": "Submit Prompt",
107108
"stopPrompt": "Stop Prompt",

arb/app_es.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "Mantenedor principal",
8585
"apiKey": "Clave API",
8686
"baseUrl": "URL base",
87+
"scrollToRecent": "Desplazarse a reciente",
8788
"clearPrompt": "Borrar prompt",
8889
"submitPrompt": "Enviar prompt",
8990
"stopPrompt": "Detener prompt",

arb/app_fr.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "Responsable principal",
8585
"apiKey": "Clé API",
8686
"baseUrl": "URL de base",
87+
"scrollToRecent": "Faire défiler vers le récent",
8788
"clearPrompt": "Effacer le prompt",
8889
"submitPrompt": "Envoyer le prompt",
8990
"stopPrompt": "Arrêter le prompt",

arb/app_hi.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "प्रधान अनुरक्षक",
8585
"apiKey": "एपीआई कुंजी",
8686
"baseUrl": "बेस यूआरएल",
87+
"scrollToRecent": "हाल के संदेशों पर स्क्रॉल करें",
8788
"clearPrompt": "प्रॉम्प्ट साफ़ करें",
8889
"submitPrompt": "प्रॉम्प्ट सबमिट करें",
8990
"stopPrompt": "प्रॉम्प्ट रोकें",

arb/app_it.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "Manutentore principale",
8585
"apiKey": "Chiave API",
8686
"baseUrl": "Base URL",
87+
"scrollToRecent": "Scorri verso il recente",
8788
"clearPrompt": "Pulisci il prompt",
8889
"submitPrompt": "Invia il prompt",
8990
"stopPrompt": "Ferma il prompt",

arb/app_jp.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "リードメンテナー",
8585
"apiKey": "APIキー",
8686
"baseUrl": "ベースURL",
87+
"scrollToRecent": "最近のメッセージにスクロール",
8788
"clearPrompt": "プロンプトをクリア",
8889
"submitPrompt": "プロンプトを送信",
8990
"stopPrompt": "プロンプトを停止",

arb/app_ko.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "수석 유지 관리자",
8585
"apiKey": "API 키",
8686
"baseUrl": "기본 URL",
87+
"scrollToRecent": "최근 메시지로 스크롤",
8788
"clearPrompt": "프롬프트 삭제",
8889
"submitPrompt": "프롬프트 제출",
8990
"stopPrompt": "프롬프트 중지",

arb/app_pl.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "Główny opiekun projektu",
8585
"apiKey": "Klucz API",
8686
"baseUrl": "Bazowy URL",
87+
"scrollToRecent": "Przewiń do najnowszych wiadomości",
8788
"clearPrompt": "Wyczyść podpowiedź",
8889
"submitPrompt": "Wyślij podpowiedź",
8990
"stopPrompt": "Zatrzymaj podpowiedź",

arb/app_ru.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "Ведущий разработчик",
8585
"apiKey": "API-ключ",
8686
"baseUrl": "Базовый URL",
87+
"scrollToRecent": "Прокрутить к последним сообщениям",
8788
"clearPrompt": "Очистить промпт",
8889
"submitPrompt": "Отправить промпт",
8990
"stopPrompt": "Остановить промпт",

arb/app_tr.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "Baş Sorumlu",
8585
"apiKey": "API Anahtarı",
8686
"baseUrl": "Temel URL",
87+
"scrollToRecent": "Son Mesajlara Kaydır",
8788
"clearPrompt": "İstemi Temizle",
8889
"submitPrompt": "İstemi Gönder",
8990
"stopPrompt": "İstemi Durdur",

arb/app_vi.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "Người bảo trì chính",
8585
"apiKey": "Khóa API",
8686
"baseUrl": "URL cơ sở",
87+
"scrollToRecent": "Cuộn đến tin nhắn gần đây",
8788
"clearPrompt": "Xóa lời nhắc",
8889
"submitPrompt": "Gửi lời nhắc",
8990
"stopPrompt": "Dừng lời nhắc",

arb/app_zh.arb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@
8484
"leadMaintainer": "主要维护者",
8585
"apiKey": "API 密钥",
8686
"baseUrl": "基础 URL",
87+
"scrollToRecent": "滚动到最近的消息",
8788
"clearPrompt": "清除提示词",
8889
"submitPrompt": "提交提示词",
8990
"stopPrompt": "停止提示词",

lib/locale/app_localizations.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,12 @@ abstract class AppLocalizations {
621621
/// **'Base URL'**
622622
String get baseUrl;
623623

624+
/// No description provided for @scrollToRecent.
625+
///
626+
/// In en, this message translates to:
627+
/// **'Scroll to Recent'**
628+
String get scrollToRecent;
629+
624630
/// No description provided for @clearPrompt.
625631
///
626632
/// In en, this message translates to:

lib/locale/app_localizations_de.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsDe extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'Basis-URL';
266266

267+
@override
268+
String get scrollToRecent => 'Zuletzt verwendet';
269+
267270
@override
268271
String get clearPrompt => 'Prompt löschen';
269272

lib/locale/app_localizations_en.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsEn extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'Base URL';
266266

267+
@override
268+
String get scrollToRecent => 'Scroll to Recent';
269+
267270
@override
268271
String get clearPrompt => 'Clear Prompt';
269272

lib/locale/app_localizations_es.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsEs extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'URL base';
266266

267+
@override
268+
String get scrollToRecent => 'Desplazarse a reciente';
269+
267270
@override
268271
String get clearPrompt => 'Borrar prompt';
269272

lib/locale/app_localizations_fr.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsFr extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'URL de base';
266266

267+
@override
268+
String get scrollToRecent => 'Faire défiler vers le récent';
269+
267270
@override
268271
String get clearPrompt => 'Effacer le prompt';
269272

lib/locale/app_localizations_hi.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsHi extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'बेस यूआरएल';
266266

267+
@override
268+
String get scrollToRecent => 'हाल के संदेशों पर स्क्रॉल करें';
269+
267270
@override
268271
String get clearPrompt => 'प्रॉम्प्ट साफ़ करें';
269272

lib/locale/app_localizations_it.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsIt extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'Base URL';
266266

267+
@override
268+
String get scrollToRecent => 'Scorri verso il recente';
269+
267270
@override
268271
String get clearPrompt => 'Pulisci il prompt';
269272

lib/locale/app_localizations_ja.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsJa extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'ベースURL';
266266

267+
@override
268+
String get scrollToRecent => '最近のメッセージにスクロール';
269+
267270
@override
268271
String get clearPrompt => 'プロンプトをクリア';
269272

lib/locale/app_localizations_ko.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsKo extends AppLocalizations {
264264
@override
265265
String get baseUrl => '기본 URL';
266266

267+
@override
268+
String get scrollToRecent => '최근 메시지로 스크롤';
269+
267270
@override
268271
String get clearPrompt => '프롬프트 삭제';
269272

lib/locale/app_localizations_pl.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsPl extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'Bazowy URL';
266266

267+
@override
268+
String get scrollToRecent => 'Przewiń do najnowszych wiadomości';
269+
267270
@override
268271
String get clearPrompt => 'Wyczyść podpowiedź';
269272

lib/locale/app_localizations_ru.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsRu extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'Базовый URL';
266266

267+
@override
268+
String get scrollToRecent => 'Прокрутить к последним сообщениям';
269+
267270
@override
268271
String get clearPrompt => 'Очистить промпт';
269272

lib/locale/app_localizations_tr.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsTr extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'Temel URL';
266266

267+
@override
268+
String get scrollToRecent => 'Son Mesajlara Kaydır';
269+
267270
@override
268271
String get clearPrompt => 'İstemi Temizle';
269272

lib/locale/app_localizations_vi.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsVi extends AppLocalizations {
264264
@override
265265
String get baseUrl => 'URL cơ sở';
266266

267+
@override
268+
String get scrollToRecent => 'Cuộn đến tin nhắn gần đây';
269+
267270
@override
268271
String get clearPrompt => 'Xóa lời nhắc';
269272

lib/locale/app_localizations_zh.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,9 @@ class AppLocalizationsZh extends AppLocalizations {
264264
@override
265265
String get baseUrl => '基础 URL';
266266

267+
@override
268+
String get scrollToRecent => '滚动到最近的消息';
269+
267270
@override
268271
String get clearPrompt => '清除提示词';
269272

lib/widgets/message/message_view.dart

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -123,13 +123,30 @@ class MessageViewState extends State<MessageView> {
123123
}
124124

125125
@override
126-
Widget build(BuildContext context) => Expanded(
127-
child: SingleChildScrollView(
128-
controller: controller,
129-
child: buildChatListener(),
126+
Widget build(BuildContext context) => Column(
127+
children: [
128+
if (rootPosition >= 0 && rootPosition < ChatController.instance.root.chain.length - maxMessages)
129+
buildClearButton(),
130+
Expanded(
131+
child: buildScrollView()
132+
)
133+
],
134+
);
135+
136+
Widget buildClearButton() => Padding(
137+
padding: const EdgeInsets.only(bottom: 8.0),
138+
child: ElevatedButton(
139+
key: ValueKey('scroll_to_recent_button'),
140+
onPressed: () => setState(() => rootPosition = ChatController.instance.root.chain.length - maxMessages),
141+
child: Text(AppLocalizations.of(context)!.scrollToRecent),
130142
)
131143
);
132144

145+
Widget buildScrollView() => SingleChildScrollView(
146+
controller: controller,
147+
child: buildChatListener(),
148+
);
149+
133150
Widget buildChatListener() => ListenableBuilder(
134151
listenable: ChatController.instance,
135152
builder: buildSettingsListener

lib/widgets/pages/home_page.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ class HomePageState extends State<HomePage> {
3434

3535
Widget buildBody() => Column(
3636
children: [
37-
MessageView(),
37+
Expanded(
38+
child: MessageView(),
39+
),
3840
PromptField(),
3941
],
4042
);

lib/widgets/text_fields/prompt_field.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,20 +69,25 @@ class PromptFieldState extends State<PromptField> {
6969
controller.clear();
7070
setState(() => isNotEmpty = controller.text.isNotEmpty);
7171
try {
72-
ChatMessage newMessage = ChatMessage(
72+
final userMessage = ChatMessage(
73+
parent: ChatController.instance.root.tail.id,
7374
content: prompt,
7475
role: ChatMessageRole.user,
7576
);
7677

77-
ChatController.instance.addMessage(newMessage);
78+
ChatController.instance.root.tail.addChild(userMessage);
7879

7980
Stream<String> stream = AIController.instance.prompt();
8081

81-
newMessage = ChatMessage(content: '', role: ChatMessageRole.assistant);
82+
final assistantMessage = ChatMessage(
83+
parent: userMessage.id,
84+
content: '',
85+
role: ChatMessageRole.assistant
86+
);
8287

83-
ChatController.instance.addMessage(newMessage);
88+
userMessage.addChild(assistantMessage);
8489

85-
await newMessage.listenToStream(stream);
90+
await assistantMessage.listenToStream(stream);
8691

8792
await ChatController.instance.save();
8893
}

0 commit comments

Comments
 (0)