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/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/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_menu.dart';
import 'package:easy_localization/easy_localization.dart';

View File

@ -1,5 +1,5 @@
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/tabs/flowy_tab.dart';
import 'package:appflowy/workspace/presentation/home/tabs/tabs_manager.dart';

View File

@ -1,9 +1,9 @@
import 'dart:async';
import 'dart:convert';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/error.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/openai_client.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/service/text_completion.dart';
import 'package:appflowy/ai/error.dart';
import 'package:appflowy/ai/openai_client.dart';
import 'package:appflowy/ai/text_completion.dart';
import 'package:http/http.dart' as http;
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/plugins/document/presentation/editor_plugins/openai/service/text_completion.dart';
import 'package:appflowy_backend/protobuf/flowy-ai/entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-ai/protobuf.dart';
import 'package:appflowy_result/appflowy_result.dart';
import 'error.dart';
import 'text_completion.dart';
abstract class AIRepository {
Future<void> getStreamedCompletions({
required String prompt,

View File

@ -3,9 +3,6 @@ import 'dart:ffi';
import 'dart:isolate';
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_backend/dispatch/dispatch.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:fixnum/fixnum.dart' as fixnum;
import 'ai_client.dart';
import 'error.dart';
import 'text_completion.dart';
class AppFlowyAIService implements AIRepository {
@override
Future<FlowyResult<List<String>, AIError>> generateImage({

View File

@ -1,11 +1,11 @@
import 'dart:async';
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_result/appflowy_result.dart';
import 'package:http/http.dart' as http;
import 'ai_client.dart';
import 'error.dart';
import 'text_completion.dart';

View File

@ -1,4 +1,5 @@
import 'package:freezed_annotation/freezed_annotation.dart';
part 'text_completion.freezed.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/tab/mobile_space_tab.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/user/application/auth/auth_service.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/image/common.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_backend/protobuf/flowy-database2/file_entities.pbenum.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:go_router/go_router.dart';
import '../../../document/presentation/editor_plugins/openai/widgets/loading.dart';
class MobileMediaCellEditor extends StatelessWidget {
const MobileMediaCellEditor({super.key});

View File

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

View File

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

View File

@ -28,10 +28,10 @@ class CoverImagePickerBloc
on<CoverImagePickerEvent>(
(event, emit) async {
await event.map(
initialEvent: (InitialEvent initialEvent) {
initialEvent: (initialEvent) {
emit(const CoverImagePickerState.initial());
},
urlSubmit: (UrlSubmit urlSubmit) async {
urlSubmit: (urlSubmit) async {
emit(const CoverImagePickerState.loading());
final validateImage = await _validateURL(urlSubmit.path);
if (validateImage) {
@ -53,7 +53,7 @@ class CoverImagePickerBloc
);
}
},
pickFileImage: (PickFileImage pickFileImage) async {
pickFileImage: (pickFileImage) async {
final imagePickerResults = await _pickImages();
if (imagePickerResults != null) {
emit(CoverImagePickerState.fileImage(imagePickerResults));
@ -61,10 +61,10 @@ class CoverImagePickerBloc
emit(const CoverImagePickerState.initial());
}
},
deleteImage: (DeleteImage deleteImage) {
deleteImage: (deleteImage) {
emit(const CoverImagePickerState.initial());
},
saveToGallery: (SaveToGallery saveToGallery) async {
saveToGallery: (saveToGallery) async {
emit(const CoverImagePickerState.loading());
final saveImage = await _saveToGallery(saveToGallery.previousState);
if (saveImage != null) {
@ -93,7 +93,7 @@ class CoverImagePickerBloc
final List<String> imagePaths = prefs.getStringList(kLocalImagesKey) ?? [];
final directory = await _coverPath();
if (state is FileImagePicked) {
if (state is _FileImagePicked) {
try {
final path = state.path;
final newPath = p.join(directory, p.split(path).last);
@ -102,7 +102,7 @@ class CoverImagePickerBloc
} catch (e) {
return null;
}
} else if (state is NetworkImagePicked) {
} else if (state is _NetworkImagePicked) {
try {
final url = state.successOrFail.fold((path) => path, (r) => null);
if (url != null) {
@ -197,25 +197,25 @@ class CoverImagePickerBloc
@freezed
class CoverImagePickerEvent with _$CoverImagePickerEvent {
const factory CoverImagePickerEvent.urlSubmit(String path) = UrlSubmit;
const factory CoverImagePickerEvent.pickFileImage() = PickFileImage;
const factory CoverImagePickerEvent.deleteImage() = DeleteImage;
const factory CoverImagePickerEvent.urlSubmit(String path) = _UrlSubmit;
const factory CoverImagePickerEvent.pickFileImage() = _PickFileImage;
const factory CoverImagePickerEvent.deleteImage() = _DeleteImage;
const factory CoverImagePickerEvent.saveToGallery(
CoverImagePickerState previousState,
) = SaveToGallery;
const factory CoverImagePickerEvent.initialEvent() = InitialEvent;
) = _SaveToGallery;
const factory CoverImagePickerEvent.initialEvent() = _InitialEvent;
}
@freezed
class CoverImagePickerState with _$CoverImagePickerState {
const factory CoverImagePickerState.initial() = Initial;
const factory CoverImagePickerState.loading() = Loading;
const factory CoverImagePickerState.initial() = _Initial;
const factory CoverImagePickerState.loading() = _Loading;
const factory CoverImagePickerState.networkImage(
FlowyResult<String, FlowyError> successOrFail,
) = NetworkImagePicked;
const factory CoverImagePickerState.fileImage(String path) = FileImagePicked;
) = _NetworkImagePicked;
const factory CoverImagePickerState.fileImage(String path) = _FileImagePicked;
const factory CoverImagePickerState.done(
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/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/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_backend/log.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 '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 {
const AIWriterBlockKeys._();
@ -91,8 +91,7 @@ class _AIWriterBlockComponentState extends State<AIWriterBlockComponent> {
late final editorState = context.read<EditorState>();
late final SelectionGestureInterceptor interceptor;
late final AIWriterBlockOperations aiWriterOperations =
AIWriterBlockOperations(
late final aiWriterOperations = AIWriterBlockOperations(
editorState: editorState,
aiWriterNode: widget.node,
);

View File

@ -1,11 +1,11 @@
import 'dart:async';
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/ai/ai_client.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/plugins.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_editor/appflowy_editor.dart';
import 'package:flutter_bloc/flutter_bloc.dart';

View File

@ -1,8 +1,8 @@
import 'dart:async';
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/ai/ai_client.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/ask_ai_action.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;
}
}
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/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/openai/service/ai_client.dart';
import 'package:appflowy/ai/ai_client.dart';
import 'package:appflowy/plugins/trash/application/prelude.dart';
import 'package:appflowy/shared/appflowy_cache_manager.dart';
import 'package:appflowy/shared/custom_image_cache_manager.dart';
import 'package:appflowy/startup/startup.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/auth_service.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/locale_keys.g.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/loading.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/navigation_action.dart';

View File

@ -1,6 +1,6 @@
import 'package:appflowy/generated/flowy_svgs.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/presentation/home/menu/sidebar/shared/sidebar_setting.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/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/user/application/user_service.dart';
import 'package:appflowy/util/navigator_context_extension.dart';

View File

@ -1,6 +1,7 @@
import 'dart:io';
import 'package:appflowy/shared/flowy_error_page.dart';
import 'package:appflowy/shared/loading.dart';
import 'package:appflowy/util/int64_extension.dart';
import 'package:appflowy/workspace/application/settings/appearance/appearance_cubit.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 '../../../../generated/locale_keys.g.dart';
import '../../../../plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
const _buttonsMinWidth = 100.0;

View File

@ -1,4 +1,5 @@
import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/shared/loading.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/workspace_subscription_ext.dart';
@ -13,7 +14,6 @@ import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../generated/locale_keys.g.dart';
import '../../../../plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
class SettingsPlanComparisonDialog extends StatefulWidget {
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/shared/colors.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/theme_extension.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_bloc/flutter_bloc.dart';
import '../../../../plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
class SettingsPlanView extends StatefulWidget {
const SettingsPlanView({
super.key,

View File

@ -1,5 +1,5 @@
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/ai/ai_client.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_bloc.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart';