chore: code cleanup (#7150)

This commit is contained in:
Richard Shiue 2025-01-06 13:34:11 +08:00 committed by GitHub
parent ed646ccba2
commit fd9baf7a06
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
27 changed files with 171 additions and 183 deletions

View File

@ -1,7 +1,7 @@
import 'package:appflowy/env/cloud_env.dart'; import 'package:appflowy/env/cloud_env.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
import 'package:appflowy/shared/feature_flags.dart'; import 'package:appflowy/shared/feature_flags.dart';
import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/workspace/presentation/home/menu/sidebar/workspace/_sidebar_workspace_actions.dart'; import 'package:appflowy/workspace/presentation/home/menu/sidebar/workspace/_sidebar_workspace_actions.dart';
import 'package:appflowy/workspace/presentation/home/menu/sidebar/workspace/_sidebar_workspace_menu.dart'; import 'package:appflowy/workspace/presentation/home/menu/sidebar/workspace/_sidebar_workspace_menu.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';

View File

@ -1,5 +1,5 @@
import 'package:appflowy/env/cloud_env.dart'; import 'package:appflowy/env/cloud_env.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/loading.dart'; import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/workspace/presentation/home/menu/sidebar/workspace/_sidebar_workspace_menu.dart'; import 'package:appflowy/workspace/presentation/home/menu/sidebar/workspace/_sidebar_workspace_menu.dart';
import 'package:appflowy/workspace/presentation/home/tabs/flowy_tab.dart'; import 'package:appflowy/workspace/presentation/home/tabs/flowy_tab.dart';
import 'package:appflowy/workspace/presentation/home/tabs/tabs_manager.dart'; import 'package:appflowy/workspace/presentation/home/tabs/tabs_manager.dart';

View File

@ -1,9 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/error.dart'; import 'package:appflowy/ai/error.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/openai_client.dart'; import 'package:appflowy/ai/openai_client.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/text_completion.dart'; import 'package:appflowy/ai/text_completion.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:mocktail/mocktail.dart'; import 'package:mocktail/mocktail.dart';

View File

@ -1,8 +1,9 @@
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/error.dart'; import 'package:appflowy_backend/protobuf/flowy-ai/protobuf.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/text_completion.dart';
import 'package:appflowy_backend/protobuf/flowy-ai/entities.pb.dart';
import 'package:appflowy_result/appflowy_result.dart'; import 'package:appflowy_result/appflowy_result.dart';
import 'error.dart';
import 'text_completion.dart';
abstract class AIRepository { abstract class AIRepository {
Future<void> getStreamedCompletions({ Future<void> getStreamedCompletions({
required String prompt, required String prompt,

View File

@ -3,9 +3,6 @@ import 'dart:ffi';
import 'dart:isolate'; import 'dart:isolate';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/ai_client.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/error.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/text_completion.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action.dart';
import 'package:appflowy_backend/dispatch/dispatch.dart'; import 'package:appflowy_backend/dispatch/dispatch.dart';
import 'package:appflowy_backend/protobuf/flowy-ai/entities.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-ai/entities.pb.dart';
@ -13,6 +10,10 @@ import 'package:appflowy_result/appflowy_result.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:fixnum/fixnum.dart' as fixnum; import 'package:fixnum/fixnum.dart' as fixnum;
import 'ai_client.dart';
import 'error.dart';
import 'text_completion.dart';
class AppFlowyAIService implements AIRepository { class AppFlowyAIService implements AIRepository {
@override @override
Future<FlowyResult<List<String>, AIError>> generateImage({ Future<FlowyResult<List<String>, AIError>> generateImage({

View File

@ -1,11 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/ai_client.dart';
import 'package:appflowy_backend/protobuf/flowy-ai/entities.pbenum.dart'; import 'package:appflowy_backend/protobuf/flowy-ai/entities.pbenum.dart';
import 'package:appflowy_result/appflowy_result.dart'; import 'package:appflowy_result/appflowy_result.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'ai_client.dart';
import 'error.dart'; import 'error.dart';
import 'text_completion.dart'; import 'text_completion.dart';

View File

@ -1,4 +1,5 @@
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
part 'text_completion.freezed.dart'; part 'text_completion.freezed.dart';
part 'text_completion.g.dart'; part 'text_completion.g.dart';

View File

@ -2,7 +2,7 @@ import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/mobile/presentation/home/mobile_home_page_header.dart'; import 'package:appflowy/mobile/presentation/home/mobile_home_page_header.dart';
import 'package:appflowy/mobile/presentation/home/tab/mobile_space_tab.dart'; import 'package:appflowy/mobile/presentation/home/tab/mobile_space_tab.dart';
import 'package:appflowy/mobile/presentation/home/tab/space_order_bloc.dart'; import 'package:appflowy/mobile/presentation/home/tab/space_order_bloc.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/loading.dart'; import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/user/application/auth/auth_service.dart'; import 'package:appflowy/user/application/auth/auth_service.dart';
import 'package:appflowy/user/application/reminder/reminder_bloc.dart'; import 'package:appflowy/user/application/reminder/reminder_bloc.dart';

View File

@ -11,6 +11,7 @@ import 'package:appflowy/plugins/database/widgets/media_file_type_ext.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/file/file_util.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/file/file_util.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/image/common.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/image/common.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/image/multi_image_block_component/image_render.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/image/multi_image_block_component/image_render.dart';
import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/workspace/presentation/widgets/image_viewer/interactive_image_viewer.dart'; import 'package:appflowy/workspace/presentation/widgets/image_viewer/interactive_image_viewer.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/file_entities.pbenum.dart'; import 'package:appflowy_backend/protobuf/flowy-database2/file_entities.pbenum.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/media_entities.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-database2/media_entities.pb.dart';
@ -21,8 +22,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import '../../../document/presentation/editor_plugins/openai/widgets/loading.dart';
class MobileMediaCellEditor extends StatelessWidget { class MobileMediaCellEditor extends StatelessWidget {
const MobileMediaCellEditor({super.key}); const MobileMediaCellEditor({super.key});

View File

@ -30,8 +30,7 @@ class ChangeCoverPopoverBloc
void _dispatch() { void _dispatch() {
on<ChangeCoverPopoverEvent>((event, emit) async { on<ChangeCoverPopoverEvent>((event, emit) async {
await event.map( await event.map(
fetchPickedImagePaths: fetchPickedImagePaths: (fetchPickedImagePaths) async {
(FetchPickedImagePaths fetchPickedImagePaths) async {
final imageNames = await _getPreviouslyPickedImagePaths(); final imageNames = await _getPreviouslyPickedImagePaths();
emit( emit(
@ -41,11 +40,11 @@ class ChangeCoverPopoverBloc
), ),
); );
}, },
deleteImage: (DeleteImage deleteImage) async { deleteImage: (deleteImage) async {
final currentState = state; final currentState = state;
final currentlySelectedImage = final currentlySelectedImage =
node.attributes[DocumentHeaderBlockKeys.coverDetails]; node.attributes[DocumentHeaderBlockKeys.coverDetails];
if (currentState is Loaded) { if (currentState is _Loaded) {
await _deleteImageInStorage(deleteImage.path); await _deleteImageInStorage(deleteImage.path);
if (currentlySelectedImage == deleteImage.path) { if (currentlySelectedImage == deleteImage.path) {
_removeCoverImageFromNode(); _removeCoverImageFromNode();
@ -54,15 +53,15 @@ class ChangeCoverPopoverBloc
.where((path) => path != deleteImage.path) .where((path) => path != deleteImage.path)
.toList(); .toList();
_updateImagePathsInStorage(updateImageList); _updateImagePathsInStorage(updateImageList);
emit(Loaded(updateImageList)); emit(ChangeCoverPopoverState.loaded(updateImageList));
} }
}, },
clearAllImages: (ClearAllImages clearAllImages) async { clearAllImages: (clearAllImages) async {
final currentState = state; final currentState = state;
final currentlySelectedImage = final currentlySelectedImage =
node.attributes[DocumentHeaderBlockKeys.coverDetails]; node.attributes[DocumentHeaderBlockKeys.coverDetails];
if (currentState is Loaded) { if (currentState is _Loaded) {
for (final image in currentState.imageNames) { for (final image in currentState.imageNames) {
await _deleteImageInStorage(image); await _deleteImageInStorage(image);
if (currentlySelectedImage == image) { if (currentlySelectedImage == image) {
@ -70,7 +69,7 @@ class ChangeCoverPopoverBloc
} }
} }
_updateImagePathsInStorage([]); _updateImagePathsInStorage([]);
emit(const Loaded([])); emit(const ChangeCoverPopoverState.loaded([]));
} }
}, },
); );
@ -113,18 +112,18 @@ class ChangeCoverPopoverBloc
class ChangeCoverPopoverEvent with _$ChangeCoverPopoverEvent { class ChangeCoverPopoverEvent with _$ChangeCoverPopoverEvent {
const factory ChangeCoverPopoverEvent.fetchPickedImagePaths({ const factory ChangeCoverPopoverEvent.fetchPickedImagePaths({
@Default(false) bool selectLatestImage, @Default(false) bool selectLatestImage,
}) = FetchPickedImagePaths; }) = _FetchPickedImagePaths;
const factory ChangeCoverPopoverEvent.deleteImage(String path) = DeleteImage; const factory ChangeCoverPopoverEvent.deleteImage(String path) = _DeleteImage;
const factory ChangeCoverPopoverEvent.clearAllImages() = ClearAllImages; const factory ChangeCoverPopoverEvent.clearAllImages() = _ClearAllImages;
} }
@freezed @freezed
class ChangeCoverPopoverState with _$ChangeCoverPopoverState { class ChangeCoverPopoverState with _$ChangeCoverPopoverState {
const factory ChangeCoverPopoverState.initial() = Initial; const factory ChangeCoverPopoverState.initial() = _Initial;
const factory ChangeCoverPopoverState.loading() = Loading; const factory ChangeCoverPopoverState.loading() = _Loading;
const factory ChangeCoverPopoverState.loaded( const factory ChangeCoverPopoverState.loaded(
List<String> imageNames, { List<String> imageNames, {
@Default(false) selectLatestImage, @Default(false) selectLatestImage,
}) = Loaded; }) = _Loaded;
} }

View File

@ -36,17 +36,18 @@ class _CoverImagePickerState extends State<CoverImagePicker> {
..add(const CoverImagePickerEvent.initialEvent()), ..add(const CoverImagePickerEvent.initialEvent()),
child: BlocListener<CoverImagePickerBloc, CoverImagePickerState>( child: BlocListener<CoverImagePickerBloc, CoverImagePickerState>(
listener: (context, state) { listener: (context, state) {
if (state is NetworkImagePicked) { state.maybeWhen(
state.successOrFail.fold( networkImage: (successOrFail) {
successOrFail.fold(
(s) {}, (s) {},
(e) => showSnapBar( (e) => showSnapBar(
context, context,
LocaleKeys.document_plugins_cover_invalidImageUrl.tr(), LocaleKeys.document_plugins_cover_invalidImageUrl.tr(),
), ),
); );
} },
if (state is Done) { done: (successOrFail) {
state.successOrFail.fold( successOrFail.fold(
(l) => widget.onFileSubmit(l), (l) => widget.onFileSubmit(l),
(r) => showSnapBar( (r) => showSnapBar(
context, context,
@ -54,25 +55,30 @@ class _CoverImagePickerState extends State<CoverImagePicker> {
.tr(), .tr(),
), ),
); );
} },
orElse: () {},
);
}, },
child: BlocBuilder<CoverImagePickerBloc, CoverImagePickerState>( child: BlocBuilder<CoverImagePickerBloc, CoverImagePickerState>(
builder: (context, state) { builder: (context, state) {
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
state is Loading state.maybeMap(
? const SizedBox( loading: (_) => const SizedBox(
height: 180, height: 180,
child: Center( child: Center(
child: CircularProgressIndicator(), child: CircularProgressIndicator(),
), ),
) ),
: CoverImagePreviewWidget(state: state), orElse: () => CoverImagePreviewWidget(state: state),
),
const VSpace(10), const VSpace(10),
NetworkImageUrlInput( NetworkImageUrlInput(
onAdd: (url) { onAdd: (url) {
context.read<CoverImagePickerBloc>().add(UrlSubmit(url)); context
.read<CoverImagePickerBloc>()
.add(CoverImagePickerEvent.urlSubmit(url));
}, },
), ),
const VSpace(10), const VSpace(10),
@ -81,9 +87,9 @@ class _CoverImagePickerState extends State<CoverImagePicker> {
widget.onBackPressed(); widget.onBackPressed();
}, },
onSave: () { onSave: () {
context.read<CoverImagePickerBloc>().add( context
SaveToGallery(state), .read<CoverImagePickerBloc>()
); .add(CoverImagePickerEvent.saveToGallery(state));
}, },
), ),
], ],
@ -196,7 +202,7 @@ class ImagePickerActionButtons extends StatelessWidget {
class CoverImagePreviewWidget extends StatefulWidget { class CoverImagePreviewWidget extends StatefulWidget {
const CoverImagePreviewWidget({super.key, required this.state}); const CoverImagePreviewWidget({super.key, required this.state});
final dynamic state; final CoverImagePickerState state;
@override @override
State<CoverImagePreviewWidget> createState() => State<CoverImagePreviewWidget> createState() =>
@ -242,7 +248,9 @@ class _CoverImagePreviewWidgetState extends State<CoverImagePreviewWidget> {
FlowyButton( FlowyButton(
hoverColor: Theme.of(context).hoverColor, hoverColor: Theme.of(context).hoverColor,
onTap: () { onTap: () {
ctx.read<CoverImagePickerBloc>().add(const PickFileImage()); ctx
.read<CoverImagePickerBloc>()
.add(const CoverImagePickerEvent.pickFileImage());
}, },
useIntrinsicWidth: true, useIntrinsicWidth: true,
leftIcon: const FlowySvg( leftIcon: const FlowySvg(
@ -265,7 +273,9 @@ class _CoverImagePreviewWidgetState extends State<CoverImagePreviewWidget> {
top: 10, top: 10,
child: InkWell( child: InkWell(
onTap: () { onTap: () {
ctx.read<CoverImagePickerBloc>().add(const DeleteImage()); ctx
.read<CoverImagePickerBloc>()
.add(const CoverImagePickerEvent.deleteImage());
}, },
child: DecoratedBox( child: DecoratedBox(
decoration: BoxDecoration( decoration: BoxDecoration(
@ -291,42 +301,42 @@ class _CoverImagePreviewWidgetState extends State<CoverImagePreviewWidget> {
decoration: BoxDecoration( decoration: BoxDecoration(
color: Theme.of(context).colorScheme.secondary, color: Theme.of(context).colorScheme.secondary,
borderRadius: Corners.s6Border, borderRadius: Corners.s6Border,
image: widget.state is Initial image: widget.state.whenOrNull(
? null networkImage: (successOrFail) {
: widget.state is NetworkImagePicked return successOrFail.fold(
? widget.state.successOrFail.fold(
(path) => DecorationImage( (path) => DecorationImage(
image: NetworkImage(path), image: NetworkImage(path),
fit: BoxFit.cover, fit: BoxFit.cover,
), ),
(r) => null, (r) => null,
) );
: widget.state is FileImagePicked },
? DecorationImage( fileImage: (path) {
image: FileImage(File(widget.state.path)), return DecorationImage(
image: FileImage(File(path)),
fit: BoxFit.cover, fit: BoxFit.cover,
) );
: null, },
), ),
child: (widget.state is Initial) ),
? _buildFilePickerWidget(context) child: widget.state.whenOrNull(
: (widget.state is NetworkImagePicked) initial: () => _buildFilePickerWidget(context),
? widget.state.successOrFail.fold( networkImage: (successOrFail) => successOrFail.fold(
(l) => null, (l) => null,
(r) => _buildFilePickerWidget( (r) => _buildFilePickerWidget(
context, context,
), ),
)
: null,
), ),
(widget.state is FileImagePicked) ),
? _buildImageDeleteButton(context) ),
: (widget.state is NetworkImagePicked) widget.state.maybeWhen(
? widget.state.successOrFail.fold( fileImage: (_) => _buildImageDeleteButton(context),
networkImage: (successOrFail) => successOrFail.fold(
(l) => _buildImageDeleteButton(context), (l) => _buildImageDeleteButton(context),
(r) => const SizedBox.shrink(), (r) => const SizedBox.shrink(),
) ),
: const SizedBox.shrink(), orElse: () => const SizedBox.shrink(),
),
], ],
); );
} }

View File

@ -28,10 +28,10 @@ class CoverImagePickerBloc
on<CoverImagePickerEvent>( on<CoverImagePickerEvent>(
(event, emit) async { (event, emit) async {
await event.map( await event.map(
initialEvent: (InitialEvent initialEvent) { initialEvent: (initialEvent) {
emit(const CoverImagePickerState.initial()); emit(const CoverImagePickerState.initial());
}, },
urlSubmit: (UrlSubmit urlSubmit) async { urlSubmit: (urlSubmit) async {
emit(const CoverImagePickerState.loading()); emit(const CoverImagePickerState.loading());
final validateImage = await _validateURL(urlSubmit.path); final validateImage = await _validateURL(urlSubmit.path);
if (validateImage) { if (validateImage) {
@ -53,7 +53,7 @@ class CoverImagePickerBloc
); );
} }
}, },
pickFileImage: (PickFileImage pickFileImage) async { pickFileImage: (pickFileImage) async {
final imagePickerResults = await _pickImages(); final imagePickerResults = await _pickImages();
if (imagePickerResults != null) { if (imagePickerResults != null) {
emit(CoverImagePickerState.fileImage(imagePickerResults)); emit(CoverImagePickerState.fileImage(imagePickerResults));
@ -61,10 +61,10 @@ class CoverImagePickerBloc
emit(const CoverImagePickerState.initial()); emit(const CoverImagePickerState.initial());
} }
}, },
deleteImage: (DeleteImage deleteImage) { deleteImage: (deleteImage) {
emit(const CoverImagePickerState.initial()); emit(const CoverImagePickerState.initial());
}, },
saveToGallery: (SaveToGallery saveToGallery) async { saveToGallery: (saveToGallery) async {
emit(const CoverImagePickerState.loading()); emit(const CoverImagePickerState.loading());
final saveImage = await _saveToGallery(saveToGallery.previousState); final saveImage = await _saveToGallery(saveToGallery.previousState);
if (saveImage != null) { if (saveImage != null) {
@ -93,7 +93,7 @@ class CoverImagePickerBloc
final List<String> imagePaths = prefs.getStringList(kLocalImagesKey) ?? []; final List<String> imagePaths = prefs.getStringList(kLocalImagesKey) ?? [];
final directory = await _coverPath(); final directory = await _coverPath();
if (state is FileImagePicked) { if (state is _FileImagePicked) {
try { try {
final path = state.path; final path = state.path;
final newPath = p.join(directory, p.split(path).last); final newPath = p.join(directory, p.split(path).last);
@ -102,7 +102,7 @@ class CoverImagePickerBloc
} catch (e) { } catch (e) {
return null; return null;
} }
} else if (state is NetworkImagePicked) { } else if (state is _NetworkImagePicked) {
try { try {
final url = state.successOrFail.fold((path) => path, (r) => null); final url = state.successOrFail.fold((path) => path, (r) => null);
if (url != null) { if (url != null) {
@ -197,25 +197,25 @@ class CoverImagePickerBloc
@freezed @freezed
class CoverImagePickerEvent with _$CoverImagePickerEvent { class CoverImagePickerEvent with _$CoverImagePickerEvent {
const factory CoverImagePickerEvent.urlSubmit(String path) = UrlSubmit; const factory CoverImagePickerEvent.urlSubmit(String path) = _UrlSubmit;
const factory CoverImagePickerEvent.pickFileImage() = PickFileImage; const factory CoverImagePickerEvent.pickFileImage() = _PickFileImage;
const factory CoverImagePickerEvent.deleteImage() = DeleteImage; const factory CoverImagePickerEvent.deleteImage() = _DeleteImage;
const factory CoverImagePickerEvent.saveToGallery( const factory CoverImagePickerEvent.saveToGallery(
CoverImagePickerState previousState, CoverImagePickerState previousState,
) = SaveToGallery; ) = _SaveToGallery;
const factory CoverImagePickerEvent.initialEvent() = InitialEvent; const factory CoverImagePickerEvent.initialEvent() = _InitialEvent;
} }
@freezed @freezed
class CoverImagePickerState with _$CoverImagePickerState { class CoverImagePickerState with _$CoverImagePickerState {
const factory CoverImagePickerState.initial() = Initial; const factory CoverImagePickerState.initial() = _Initial;
const factory CoverImagePickerState.loading() = Loading; const factory CoverImagePickerState.loading() = _Loading;
const factory CoverImagePickerState.networkImage( const factory CoverImagePickerState.networkImage(
FlowyResult<String, FlowyError> successOrFail, FlowyResult<String, FlowyError> successOrFail,
) = NetworkImagePicked; ) = _NetworkImagePicked;
const factory CoverImagePickerState.fileImage(String path) = FileImagePicked; const factory CoverImagePickerState.fileImage(String path) = _FileImagePicked;
const factory CoverImagePickerState.done( const factory CoverImagePickerState.done(
FlowyResult<List<String>, FlowyError> successOrFail, FlowyResult<List<String>, FlowyError> successOrFail,
) = Done; ) = _Done;
} }

View File

@ -1,24 +0,0 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'text_edit.freezed.dart';
part 'text_edit.g.dart';
@freezed
class TextEditChoice with _$TextEditChoice {
factory TextEditChoice({
required String text,
required int index,
}) = _TextEditChoice;
factory TextEditChoice.fromJson(Map<String, Object?> json) =>
_$TextEditChoiceFromJson(json);
}
@freezed
class TextEditResponse with _$TextEditResponse {
const factory TextEditResponse({
required List<TextEditChoice> choices,
}) = _TextEditResponse;
factory TextEditResponse.fromJson(Map<String, Object?> json) =>
_$TextEditResponseFromJson(json);
}

View File

@ -1,13 +1,9 @@
import 'package:appflowy/ai/appflowy_ai_service.dart';
import 'package:appflowy/ai/error.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/application/prelude.dart'; import 'package:appflowy/plugins/document/application/prelude.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/base/build_context_extension.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/base/build_context_extension.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/base/markdown_text_robot.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/base/markdown_text_robot.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/error.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ai_writer_block_operations.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ai_writer_block_widgets.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/discard_dialog.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
import 'package:appflowy/user/application/ai_service.dart';
import 'package:appflowy/workspace/presentation/widgets/dialogs.dart'; import 'package:appflowy/workspace/presentation/widgets/dialogs.dart';
import 'package:appflowy_backend/log.dart'; import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-ai/entities.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-ai/entities.pb.dart';
@ -20,6 +16,10 @@ import 'package:provider/provider.dart';
import 'package:universal_platform/universal_platform.dart'; import 'package:universal_platform/universal_platform.dart';
import 'ai_limit_dialog.dart'; import 'ai_limit_dialog.dart';
import 'ai_writer_block_operations.dart';
import 'ai_writer_block_widgets.dart';
import 'discard_dialog.dart';
import 'barrier_dialog.dart';
class AIWriterBlockKeys { class AIWriterBlockKeys {
const AIWriterBlockKeys._(); const AIWriterBlockKeys._();
@ -91,8 +91,7 @@ class _AIWriterBlockComponentState extends State<AIWriterBlockComponent> {
late final editorState = context.read<EditorState>(); late final editorState = context.read<EditorState>();
late final SelectionGestureInterceptor interceptor; late final SelectionGestureInterceptor interceptor;
late final AIWriterBlockOperations aiWriterOperations = late final aiWriterOperations = AIWriterBlockOperations(
AIWriterBlockOperations(
editorState: editorState, editorState: editorState,
aiWriterNode: widget.node, aiWriterNode: widget.node,
); );

View File

@ -1,11 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/ai_client.dart'; import 'package:appflowy/ai/ai_client.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/error.dart'; import 'package:appflowy/ai/error.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart';
import 'package:appflowy/shared/markdown_to_document.dart'; import 'package:appflowy/shared/markdown_to_document.dart';
import 'package:appflowy/user/application/ai_service.dart'; import 'package:appflowy/ai/appflowy_ai_service.dart';
import 'package:appflowy_backend/log.dart'; import 'package:appflowy_backend/log.dart';
import 'package:appflowy_editor/appflowy_editor.dart'; import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -1,8 +1,8 @@
import 'dart:async'; import 'dart:async';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/ai_client.dart'; import 'package:appflowy/ai/ai_client.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/error.dart'; import 'package:appflowy/ai/error.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ai_limit_dialog.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ai_limit_dialog.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action_bloc.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action_bloc.dart';

View File

@ -0,0 +1,24 @@
import 'dart:async';
import 'package:flutter/material.dart';
class BarrierDialog {
BarrierDialog(this.context);
late BuildContext loadingContext;
final BuildContext context;
void show() => unawaited(
showDialog<void>(
context: context,
barrierDismissible: false,
barrierColor: Colors.transparent,
builder: (BuildContext context) {
loadingContext = context;
return const SizedBox.shrink();
},
),
);
void dismiss() => Navigator.of(loadingContext).pop();
}

View File

@ -47,24 +47,3 @@ class Loading {
hasStopped = true; hasStopped = true;
} }
} }
class BarrierDialog {
BarrierDialog(this.context);
late BuildContext loadingContext;
final BuildContext context;
void show() => unawaited(
showDialog<void>(
context: context,
barrierDismissible: false,
barrierColor: Colors.transparent,
builder: (BuildContext context) {
loadingContext = context;
return const SizedBox.shrink();
},
),
);
void dismiss() => Navigator.of(loadingContext).pop();
}

View File

@ -3,13 +3,13 @@ import 'package:appflowy/core/network_monitor.dart';
import 'package:appflowy/env/cloud_env.dart'; import 'package:appflowy/env/cloud_env.dart';
import 'package:appflowy/plugins/document/application/prelude.dart'; import 'package:appflowy/plugins/document/application/prelude.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/copy_and_paste/clipboard_service.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/copy_and_paste/clipboard_service.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/ai_client.dart'; import 'package:appflowy/ai/ai_client.dart';
import 'package:appflowy/plugins/trash/application/prelude.dart'; import 'package:appflowy/plugins/trash/application/prelude.dart';
import 'package:appflowy/shared/appflowy_cache_manager.dart'; import 'package:appflowy/shared/appflowy_cache_manager.dart';
import 'package:appflowy/shared/custom_image_cache_manager.dart'; import 'package:appflowy/shared/custom_image_cache_manager.dart';
import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/startup/tasks/appflowy_cloud_task.dart'; import 'package:appflowy/startup/tasks/appflowy_cloud_task.dart';
import 'package:appflowy/user/application/ai_service.dart'; import 'package:appflowy/ai/appflowy_ai_service.dart';
import 'package:appflowy/user/application/auth/af_cloud_auth_service.dart'; import 'package:appflowy/user/application/auth/af_cloud_auth_service.dart';
import 'package:appflowy/user/application/auth/auth_service.dart'; import 'package:appflowy/user/application/auth/auth_service.dart';
import 'package:appflowy/user/application/prelude.dart'; import 'package:appflowy/user/application/prelude.dart';

View File

@ -4,8 +4,8 @@ import 'dart:io';
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/blank/blank.dart'; import 'package:appflowy/plugins/blank/blank.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
import 'package:appflowy/shared/feature_flags.dart'; import 'package:appflowy/shared/feature_flags.dart';
import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/application/action_navigation/action_navigation_bloc.dart'; import 'package:appflowy/workspace/application/action_navigation/action_navigation_bloc.dart';
import 'package:appflowy/workspace/application/action_navigation/navigation_action.dart'; import 'package:appflowy/workspace/application/action_navigation/navigation_action.dart';

View File

@ -1,6 +1,6 @@
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/loading.dart'; import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/workspace/application/user/user_workspace_bloc.dart'; import 'package:appflowy/workspace/application/user/user_workspace_bloc.dart';
import 'package:appflowy/workspace/presentation/home/menu/sidebar/shared/sidebar_setting.dart'; import 'package:appflowy/workspace/presentation/home/menu/sidebar/shared/sidebar_setting.dart';
import 'package:appflowy/workspace/presentation/home/menu/sidebar/workspace/_sidebar_workspace_icon.dart'; import 'package:appflowy/workspace/presentation/home/menu/sidebar/workspace/_sidebar_workspace_icon.dart';

View File

@ -1,6 +1,6 @@
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/loading.dart'; import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/user/application/user_service.dart'; import 'package:appflowy/user/application/user_service.dart';
import 'package:appflowy/util/navigator_context_extension.dart'; import 'package:appflowy/util/navigator_context_extension.dart';

View File

@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:appflowy/shared/flowy_error_page.dart'; import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/util/int64_extension.dart'; import 'package:appflowy/util/int64_extension.dart';
import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart'; import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart';
import 'package:appflowy/workspace/application/settings/billing/settings_billing_bloc.dart'; import 'package:appflowy/workspace/application/settings/billing/settings_billing_bloc.dart';
@ -25,7 +26,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../generated/locale_keys.g.dart'; import '../../../../generated/locale_keys.g.dart';
import '../../../../plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
const _buttonsMinWidth = 100.0; const _buttonsMinWidth = 100.0;

View File

@ -1,4 +1,5 @@
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/util/theme_extension.dart'; import 'package:appflowy/util/theme_extension.dart';
import 'package:appflowy/workspace/application/settings/plan/settings_plan_bloc.dart'; import 'package:appflowy/workspace/application/settings/plan/settings_plan_bloc.dart';
import 'package:appflowy/workspace/application/settings/plan/workspace_subscription_ext.dart'; import 'package:appflowy/workspace/application/settings/plan/workspace_subscription_ext.dart';
@ -13,7 +14,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../generated/locale_keys.g.dart'; import '../../../../generated/locale_keys.g.dart';
import '../../../../plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
class SettingsPlanComparisonDialog extends StatefulWidget { class SettingsPlanComparisonDialog extends StatefulWidget {
const SettingsPlanComparisonDialog({ const SettingsPlanComparisonDialog({

View File

@ -4,6 +4,7 @@ import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/shared/colors.dart'; import 'package:appflowy/shared/colors.dart';
import 'package:appflowy/shared/flowy_error_page.dart'; import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/util/int64_extension.dart'; import 'package:appflowy/util/int64_extension.dart';
import 'package:appflowy/util/theme_extension.dart'; import 'package:appflowy/util/theme_extension.dart';
import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart'; import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.dart';
@ -24,8 +25,6 @@ import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
class SettingsPlanView extends StatefulWidget { class SettingsPlanView extends StatefulWidget {
const SettingsPlanView({ const SettingsPlanView({
super.key, super.key,

View File

@ -1,5 +1,5 @@
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/ai_client.dart'; import 'package:appflowy/ai/ai_client.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/error.dart'; import 'package:appflowy/ai/error.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action_bloc.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/ask_ai_action_bloc.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart'; import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart';