feat: add toast messages for ai chat interactions (#7086)

This commit is contained in:
Richard Shiue 2024-12-30 17:17:36 +08:00 committed by GitHub
parent 5ffa27f545
commit 20b16cf174
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 55 additions and 6 deletions

View File

@ -274,7 +274,7 @@ class _SaveToPageButtonState extends State<SaveToPageButton> {
onPressed: () async { onPressed: () async {
final documentId = getOpenedDocumentId(); final documentId = getOpenedDocumentId();
if (documentId != null) { if (documentId != null) {
await onAddToExistingPage(documentId); await onAddToExistingPage(context, documentId);
await forceReloadAndUpdateSelection(documentId); await forceReloadAndUpdateSelection(documentId);
} else { } else {
widget.onOverrideVisibility?.call(true); widget.onOverrideVisibility?.call(true);
@ -298,9 +298,8 @@ class _SaveToPageButtonState extends State<SaveToPageButton> {
}, },
onAddToExistingPage: (documentId) async { onAddToExistingPage: (documentId) async {
popoverController.close(); popoverController.close();
await onAddToExistingPage(documentId); final view = await onAddToExistingPage(context, documentId);
final view =
await ViewBackendService.getView(documentId).toNullable();
if (context.mounted) { if (context.mounted) {
openPageFromMessage(context, view); openPageFromMessage(context, view);
} }
@ -309,12 +308,20 @@ class _SaveToPageButtonState extends State<SaveToPageButton> {
); );
} }
Future<void> onAddToExistingPage(String documentId) async { Future<ViewPB?> onAddToExistingPage(
BuildContext context,
String documentId,
) async {
await ChatEditDocumentService.addMessageToPage( await ChatEditDocumentService.addMessageToPage(
documentId, documentId,
widget.textMessage, widget.textMessage,
); );
await Future.delayed(const Duration(milliseconds: 500)); await Future.delayed(const Duration(milliseconds: 500));
final view = await ViewBackendService.getView(documentId).toNullable();
if (context.mounted) {
showSaveMessageSuccessToast(context, view);
}
return view;
} }
void addMessageToNewPage(BuildContext context) async { void addMessageToNewPage(BuildContext context) async {
@ -327,12 +334,43 @@ class _SaveToPageButtonState extends State<SaveToPageButton> {
chatView.parentViewId, chatView.parentViewId,
[widget.textMessage], [widget.textMessage],
); );
if (context.mounted) { if (context.mounted) {
showSaveMessageSuccessToast(context, newView);
openPageFromMessage(context, newView); openPageFromMessage(context, newView);
} }
} }
} }
void showSaveMessageSuccessToast(BuildContext context, ViewPB? view) {
if (view == null) {
return;
}
showToastNotification(
context,
richMessage: TextSpan(
children: [
TextSpan(
text: LocaleKeys.chat_addToNewPageSuccessToast.tr(),
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: const Color(0xFFFFFFFF),
),
),
const TextSpan(
text: ' ',
),
TextSpan(
text: view.nameOrDefault,
style: Theme.of(context).textTheme.bodyMedium?.copyWith(
color: const Color(0xFFFFFFFF),
fontWeight: FontWeight.w700,
),
),
],
),
);
}
Future<void> forceReloadAndUpdateSelection(String documentId) async { Future<void> forceReloadAndUpdateSelection(String documentId) async {
final bloc = DocumentBloc.findOpen(documentId); final bloc = DocumentBloc.findOpen(documentId);
if (bloc == null) { if (bloc == null) {

View File

@ -90,6 +90,7 @@ class _AIMessageMetadataState extends State<AIMessageMetadata> {
data == null) { data == null) {
return _MetadataButton( return _MetadataButton(
name: m.name, name: m.name,
onTap: () => widget.onSelectedMetadata?.call(m),
); );
} }
return BlocProvider( return BlocProvider(

View File

@ -1,8 +1,11 @@
import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/mobile/application/mobile_router.dart'; import 'package:appflowy/mobile/application/mobile_router.dart';
import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart'; import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';
import 'package:appflowy/workspace/application/view/view_ext.dart'; import 'package:appflowy/workspace/application/view/view_ext.dart';
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart'; import 'package:appflowy_backend/protobuf/flowy-folder/protobuf.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:universal_platform/universal_platform.dart'; import 'package:universal_platform/universal_platform.dart';
@ -10,6 +13,11 @@ import 'package:universal_platform/universal_platform.dart';
/// on mobile /// on mobile
void openPageFromMessage(BuildContext context, ViewPB? view) { void openPageFromMessage(BuildContext context, ViewPB? view) {
if (view == null) { if (view == null) {
showToastNotification(
context,
message: LocaleKeys.chat_openPagePreviewFailedToast.tr(),
type: ToastificationType.error,
);
return; return;
} }
if (UniversalPlatform.isDesktop) { if (UniversalPlatform.isDesktop) {

View File

@ -218,7 +218,9 @@
"addToPageButton": "Add to page", "addToPageButton": "Add to page",
"addToPageTitle": "Add message to...", "addToPageTitle": "Add message to...",
"addToNewPage": "Add to a new page", "addToNewPage": "Add to a new page",
"addToNewPageName": "Messages extracted from \"{}\"" "addToNewPageName": "Messages extracted from \"{}\"",
"addToNewPageSuccessToast": "Message added to",
"openPagePreviewFailedToast": "Failed to open page"
}, },
"trash": { "trash": {
"text": "Trash", "text": "Trash",