mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
Merge branch 'main' into workspace-invite
This commit is contained in:
commit
2d68960b69
7
.github/workflows/ios_ci.yaml
vendored
7
.github/workflows/ios_ci.yaml
vendored
@ -86,6 +86,7 @@ jobs:
|
||||
model: 'iPhone 15'
|
||||
shutdown_after_job: false
|
||||
|
||||
- name: Run integration tests
|
||||
working-directory: frontend/appflowy_flutter
|
||||
run: flutter test integration_test/runner.dart -d ${{ steps.simulator-action.outputs.udid }}
|
||||
# enable it again if the 12 mins timeout is fixed
|
||||
# - name: Run integration tests
|
||||
# working-directory: frontend/appflowy_flutter
|
||||
# run: flutter test integration_test/runner.dart -d ${{ steps.simulator-action.outputs.udid }}
|
||||
|
@ -4,6 +4,7 @@ import 'dart:io';
|
||||
|
||||
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/startup/startup.dart';
|
||||
import 'package:appflowy/user/application/auth/af_cloud_mock_auth_service.dart';
|
||||
@ -51,33 +52,23 @@ void main() {
|
||||
await tester.expectToSeeHomePageWithGetStartedPage();
|
||||
|
||||
const name = 'AppFlowy.IO';
|
||||
// the workspace will be opened after created
|
||||
await tester.createCollaborativeWorkspace(name);
|
||||
|
||||
// see the success message
|
||||
var success = find.text(LocaleKeys.workspace_createSuccess.tr());
|
||||
expect(success, findsOneWidget);
|
||||
await tester.pumpUntilNotFound(success);
|
||||
final loading = find.byType(Loading);
|
||||
await tester.pumpUntilNotFound(loading);
|
||||
|
||||
// check the create result
|
||||
Finder success;
|
||||
|
||||
// delete the newly created workspace
|
||||
await tester.openCollaborativeWorkspaceMenu();
|
||||
var items = find.byType(WorkspaceMenuItem);
|
||||
final Finder items = find.byType(WorkspaceMenuItem);
|
||||
expect(items, findsNWidgets(2));
|
||||
expect(
|
||||
tester.widget<WorkspaceMenuItem>(items.last).workspace.name,
|
||||
name,
|
||||
);
|
||||
|
||||
// open the newly created workspace
|
||||
await tester.tapButton(items.last, milliseconds: 1000);
|
||||
success = find.text(LocaleKeys.workspace_openSuccess.tr());
|
||||
await tester.pumpUntilFound(success);
|
||||
expect(success, findsOneWidget);
|
||||
await tester.pumpUntilNotFound(success);
|
||||
|
||||
await tester.closeCollaborativeWorkspaceMenu();
|
||||
|
||||
// delete the newly created workspace
|
||||
await tester.openCollaborativeWorkspaceMenu();
|
||||
final secondWorkspace = find.byType(WorkspaceMenuItem).last;
|
||||
await tester.hoverOnWidget(
|
||||
secondWorkspace,
|
||||
@ -97,20 +88,11 @@ void main() {
|
||||
await tester.tapButton(find.text(LocaleKeys.button_ok.tr()));
|
||||
// delete success
|
||||
success = find.text(LocaleKeys.workspace_createSuccess.tr());
|
||||
await tester.pumpUntilFound(success);
|
||||
expect(success, findsOneWidget);
|
||||
await tester.pumpUntilNotFound(success);
|
||||
},
|
||||
);
|
||||
|
||||
// check the result
|
||||
await tester.openCollaborativeWorkspaceMenu();
|
||||
items = find.byType(WorkspaceMenuItem);
|
||||
expect(items, findsOneWidget);
|
||||
expect(
|
||||
tester.widget<WorkspaceMenuItem>(items.last).workspace.name != name,
|
||||
true,
|
||||
);
|
||||
await tester.closeCollaborativeWorkspaceMenu();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -180,7 +180,11 @@ extension AppFlowyTestBase on WidgetTester {
|
||||
buttons: buttons,
|
||||
warnIfMissed: warnIfMissed,
|
||||
);
|
||||
await pumpAndSettle(Duration(milliseconds: milliseconds));
|
||||
await pumpAndSettle(
|
||||
Duration(milliseconds: milliseconds),
|
||||
EnginePhase.sendSemanticsUpdate,
|
||||
const Duration(seconds: 5),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> tapButtonWithName(
|
||||
|
@ -528,7 +528,7 @@ extension CommonOperations on WidgetTester {
|
||||
final workspace = find.byType(SidebarWorkspace);
|
||||
expect(workspace, findsOneWidget);
|
||||
// click it
|
||||
await tapButton(workspace);
|
||||
await tapButton(workspace, milliseconds: 2000);
|
||||
}
|
||||
|
||||
Future<void> closeCollaborativeWorkspaceMenu() async {
|
||||
@ -560,7 +560,6 @@ extension CommonOperations on WidgetTester {
|
||||
|
||||
// input the workspace name
|
||||
await enterText(find.byType(TextField), name);
|
||||
await pumpAndSettle();
|
||||
|
||||
await tapButtonWithName(LocaleKeys.button_ok.tr());
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ class AppFlowyConfiguration {
|
||||
required this.custom_app_path,
|
||||
required this.origin_app_path,
|
||||
required this.device_id,
|
||||
required this.platform,
|
||||
required this.authenticator_type,
|
||||
required this.supabase_config,
|
||||
required this.appflowy_cloud_config,
|
||||
@ -25,6 +26,7 @@ class AppFlowyConfiguration {
|
||||
final String custom_app_path;
|
||||
final String origin_app_path;
|
||||
final String device_id;
|
||||
final String platform;
|
||||
final int authenticator_type;
|
||||
final SupabaseConfiguration supabase_config;
|
||||
final AppFlowyCloudConfiguration appflowy_cloud_config;
|
||||
|
@ -69,7 +69,7 @@ class MobileFolders extends StatelessWidget {
|
||||
...isCollaborativeWorkspace
|
||||
? [
|
||||
MobileSectionFolder(
|
||||
title: LocaleKeys.sideBar_public.tr(),
|
||||
title: LocaleKeys.sideBar_workspace.tr(),
|
||||
categoryType: FolderCategoryType.public,
|
||||
views: state.section.publicViews,
|
||||
),
|
||||
|
@ -31,6 +31,7 @@ class MobileWorkspaceMenu extends StatelessWidget {
|
||||
final workspace = workspaces[i];
|
||||
children.add(
|
||||
_WorkspaceMenuItem(
|
||||
key: ValueKey(workspace.workspaceId),
|
||||
userProfile: userProfile,
|
||||
workspace: workspace,
|
||||
showTopBorder: i == 0,
|
||||
@ -47,6 +48,7 @@ class MobileWorkspaceMenu extends StatelessWidget {
|
||||
|
||||
class _WorkspaceMenuItem extends StatelessWidget {
|
||||
const _WorkspaceMenuItem({
|
||||
super.key,
|
||||
required this.userProfile,
|
||||
required this.workspace,
|
||||
required this.showTopBorder,
|
||||
|
@ -30,8 +30,8 @@ class DatabaseSyncBloc extends Bloc<DatabaseSyncEvent, DatabaseSyncBlocState> {
|
||||
.then((value) => value.fold((s) => s, (f) => null));
|
||||
emit(
|
||||
state.copyWith(
|
||||
shouldShowIndicator:
|
||||
userProfile?.authenticator != AuthenticatorPB.Local &&
|
||||
shouldShowIndicator: userProfile?.authenticator ==
|
||||
AuthenticatorPB.AppFlowyCloud &&
|
||||
databaseId != null,
|
||||
),
|
||||
);
|
||||
|
@ -16,6 +16,7 @@ import 'package:appflowy/user/application/auth/auth_service.dart';
|
||||
import 'package:appflowy/util/color_generator/color_generator.dart';
|
||||
import 'package:appflowy/util/color_to_hex_string.dart';
|
||||
import 'package:appflowy/util/debounce.dart';
|
||||
import 'package:appflowy/util/throttle.dart';
|
||||
import 'package:appflowy/workspace/application/view/view_listener.dart';
|
||||
import 'package:appflowy_backend/protobuf/flowy-document/entities.pb.dart';
|
||||
import 'package:appflowy_backend/protobuf/flowy-document/protobuf.dart';
|
||||
@ -66,7 +67,7 @@ class DocumentBloc extends Bloc<DocumentEvent, DocumentState> {
|
||||
StreamSubscription? _transactionSubscription;
|
||||
|
||||
final _updateSelectionDebounce = Debounce();
|
||||
final _syncDocDebounce = Debounce();
|
||||
final _syncThrottle = Throttler(duration: const Duration(milliseconds: 500));
|
||||
|
||||
bool get isLocalMode {
|
||||
final userProfilePB = state.userProfilePB;
|
||||
@ -155,7 +156,7 @@ class DocumentBloc extends Bloc<DocumentEvent, DocumentState> {
|
||||
/// subscribe to the document content change
|
||||
void _onDocumentChanged() {
|
||||
_documentListener.start(
|
||||
onDocEventUpdate: _debounceSyncDoc,
|
||||
onDocEventUpdate: _throttleSyncDoc,
|
||||
onDocAwarenessUpdate: _onAwarenessStatesUpdate,
|
||||
);
|
||||
|
||||
@ -290,8 +291,8 @@ class DocumentBloc extends Bloc<DocumentEvent, DocumentState> {
|
||||
_updateSelectionDebounce.call(_onSelectionUpdate);
|
||||
}
|
||||
|
||||
void _debounceSyncDoc(DocEventPB docEvent) {
|
||||
_syncDocDebounce.call(() {
|
||||
void _throttleSyncDoc(DocEventPB docEvent) {
|
||||
_syncThrottle.call(() {
|
||||
_onDocumentStateUpdate(docEvent);
|
||||
});
|
||||
}
|
||||
|
@ -77,17 +77,30 @@ class DocumentCollabAdapter {
|
||||
|
||||
final ops = diffNodes(editorState.document.root, document.root);
|
||||
if (ops.isEmpty) {
|
||||
debugPrint('[collab] received empty ops');
|
||||
Log.info('Doc diff, no changes');
|
||||
return;
|
||||
}
|
||||
|
||||
debugPrint('[collab] received ops: $ops');
|
||||
prettyPrintJson(ops.map((op) => op.toJson()).toList());
|
||||
|
||||
final transaction = editorState.transaction;
|
||||
for (final op in ops) {
|
||||
transaction.add(op);
|
||||
}
|
||||
await editorState.apply(transaction, isRemote: true);
|
||||
|
||||
// Use for debugging, DO NOT REMOVE
|
||||
// assert(() {
|
||||
// final local = editorState.document.root.toJson();
|
||||
// final remote = document.root.toJson();
|
||||
// if (!const DeepCollectionEquality().equals(local, remote)) {
|
||||
// Log.error('Invalid diff status');
|
||||
// Log.error('Local: $local');
|
||||
// Log.error('Remote: $remote');
|
||||
// return false;
|
||||
// }
|
||||
// return true;
|
||||
// }());
|
||||
}
|
||||
|
||||
Future<void> _syncUpdated(
|
||||
|
@ -32,7 +32,7 @@ class DocumentCollaboratorsBloc
|
||||
emit(
|
||||
state.copyWith(
|
||||
shouldShowIndicator:
|
||||
userProfile?.authenticator != AuthenticatorPB.Local,
|
||||
userProfile?.authenticator == AuthenticatorPB.AppFlowyCloud,
|
||||
),
|
||||
);
|
||||
final deviceId = ApplicationInfo.deviceId;
|
||||
|
@ -31,7 +31,7 @@ class DocumentSyncBloc extends Bloc<DocumentSyncEvent, DocumentSyncBlocState> {
|
||||
emit(
|
||||
state.copyWith(
|
||||
shouldShowIndicator:
|
||||
userProfile?.authenticator != AuthenticatorPB.Local,
|
||||
userProfile?.authenticator == AuthenticatorPB.AppFlowyCloud,
|
||||
),
|
||||
);
|
||||
_syncStateListener.start(
|
||||
|
@ -145,7 +145,7 @@ class DocumentPluginWidgetBuilder extends PluginWidgetBuilder
|
||||
? [
|
||||
DocumentCollaborators(
|
||||
key: ValueKey('collaborators_${view.id}'),
|
||||
width: 100,
|
||||
width: 150,
|
||||
height: 32,
|
||||
view: view,
|
||||
),
|
||||
|
@ -39,17 +39,12 @@ class _DocumentPageState extends State<DocumentPage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
|
||||
// The appflowy editor use Intl as localization, set the default language as fallback.
|
||||
Intl.defaultLocale = 'en_US';
|
||||
|
||||
EditorNotification.addListener(_onEditorNotification);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
EditorNotification.removeListener(_onEditorNotification);
|
||||
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@ class CollaboratorAvatarStack extends StatelessWidget {
|
||||
this.borderWidth,
|
||||
this.borderColor,
|
||||
this.backgroundColor,
|
||||
required this.plusWidgetBuilder,
|
||||
});
|
||||
|
||||
final List<Widget> avatars;
|
||||
@ -31,13 +32,16 @@ class CollaboratorAvatarStack extends StatelessWidget {
|
||||
|
||||
final Color? backgroundColor;
|
||||
|
||||
final Widget Function(int value, BorderSide border) plusWidgetBuilder;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final settings = this.settings ??
|
||||
RestrictedPositions(
|
||||
maxCoverage: 0.3,
|
||||
minCoverage: 0.1,
|
||||
minCoverage: 0.2,
|
||||
align: StackAlign.right,
|
||||
laying: StackLaying.first,
|
||||
);
|
||||
|
||||
final border = BorderSide(
|
||||
@ -45,27 +49,12 @@ class CollaboratorAvatarStack extends StatelessWidget {
|
||||
width: borderWidth ?? 2.0,
|
||||
);
|
||||
|
||||
Widget textInfoWidgetBuilder(surplus) => BorderedCircleAvatar(
|
||||
border: border,
|
||||
backgroundColor: backgroundColor,
|
||||
child: FittedBox(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Text(
|
||||
'+$surplus',
|
||||
style: Theme.of(context).textTheme.titleLarge,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
final infoWidgetBuilder = this.infoWidgetBuilder ?? textInfoWidgetBuilder;
|
||||
|
||||
return SizedBox(
|
||||
height: height,
|
||||
width: width,
|
||||
child: WidgetStack(
|
||||
positions: settings,
|
||||
buildInfoWidget: infoWidgetBuilder,
|
||||
buildInfoWidget: (value) => plusWidgetBuilder(value, border),
|
||||
stackedWidgets: avatars
|
||||
.map(
|
||||
(avatar) => CircleAvatar(
|
||||
|
@ -2,6 +2,7 @@ import 'package:appflowy/plugins/document/application/doc_collaborators_bloc.dar
|
||||
import 'package:appflowy/plugins/document/presentation/collaborator_avater_stack.dart';
|
||||
import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
|
||||
import 'package:appflowy_editor/appflowy_editor.dart';
|
||||
import 'package:avatar_stack/avatar_stack.dart';
|
||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||
import 'package:flowy_infra_ui/widget/flowy_tooltip.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@ -41,8 +42,30 @@ class DocumentCollaborators extends StatelessWidget {
|
||||
height: height,
|
||||
width: width,
|
||||
borderWidth: 1.0,
|
||||
backgroundColor:
|
||||
Theme.of(context).colorScheme.onSecondaryContainer,
|
||||
plusWidgetBuilder: (value, border) {
|
||||
final lastXCollaborators = collaborators.sublist(
|
||||
collaborators.length - value,
|
||||
);
|
||||
return BorderedCircleAvatar(
|
||||
border: border,
|
||||
backgroundColor: Theme.of(context).hoverColor,
|
||||
child: FittedBox(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: FlowyTooltip(
|
||||
message: lastXCollaborators
|
||||
.map((e) => e.userName)
|
||||
.join('\n'),
|
||||
child: FlowyText(
|
||||
'+$value',
|
||||
fontSize: fontSize,
|
||||
color: Colors.black,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
avatars: collaborators
|
||||
.map(
|
||||
(c) => FlowyTooltip(
|
||||
|
@ -1,5 +1,7 @@
|
||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||
import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart';
|
||||
import 'package:appflowy_editor/appflowy_editor.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
final List<CommandShortcutEvent> customTextAlignCommands = [
|
||||
@ -19,7 +21,7 @@ final List<CommandShortcutEvent> customTextAlignCommands = [
|
||||
final CommandShortcutEvent customTextLeftAlignCommand = CommandShortcutEvent(
|
||||
key: 'Align text to the left',
|
||||
command: 'ctrl+shift+l',
|
||||
getDescription: () => 'Align text to the left',
|
||||
getDescription: LocaleKeys.settings_shortcuts_commands_textAlignLeft.tr,
|
||||
handler: (editorState) => _textAlignHandler(editorState, leftAlignmentKey),
|
||||
);
|
||||
|
||||
@ -34,7 +36,7 @@ final CommandShortcutEvent customTextLeftAlignCommand = CommandShortcutEvent(
|
||||
final CommandShortcutEvent customTextCenterAlignCommand = CommandShortcutEvent(
|
||||
key: 'Align text to the center',
|
||||
command: 'ctrl+shift+e',
|
||||
getDescription: () => 'Align text to the center',
|
||||
getDescription: LocaleKeys.settings_shortcuts_commands_textAlignCenter.tr,
|
||||
handler: (editorState) => _textAlignHandler(editorState, centerAlignmentKey),
|
||||
);
|
||||
|
||||
@ -49,7 +51,7 @@ final CommandShortcutEvent customTextCenterAlignCommand = CommandShortcutEvent(
|
||||
final CommandShortcutEvent customTextRightAlignCommand = CommandShortcutEvent(
|
||||
key: 'Align text to the right',
|
||||
command: 'ctrl+shift+r',
|
||||
getDescription: () => 'Align text to the right',
|
||||
getDescription: LocaleKeys.settings_shortcuts_commands_textAlignRight.tr,
|
||||
handler: (editorState) => _textAlignHandler(editorState, rightAlignmentKey),
|
||||
);
|
||||
|
||||
|
@ -1,5 +1,8 @@
|
||||
import 'package:appflowy/generated/locale_keys.g.dart' show LocaleKeys;
|
||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||
import 'package:appflowy_editor/appflowy_editor.dart';
|
||||
import 'package:easy_localization/easy_localization.dart'
|
||||
show StringTranslateExtension;
|
||||
import 'package:easy_localization/easy_localization.dart' hide TextDirection;
|
||||
import 'package:flowy_infra/theme_extension.dart';
|
||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||
@ -49,7 +52,7 @@ Node calloutNode({
|
||||
|
||||
// defining the callout block menu item in selection menu
|
||||
SelectionMenuItem calloutItem = SelectionMenuItem.node(
|
||||
getName: () => LocaleKeys.document_plugins_callout.tr(),
|
||||
getName: LocaleKeys.document_plugins_callout.tr,
|
||||
iconData: Icons.note,
|
||||
keywords: [CalloutBlockKeys.type],
|
||||
nodeBuilder: (editorState, context) =>
|
||||
|
@ -107,7 +107,7 @@ Node codeBlockNode({
|
||||
|
||||
// defining the callout block menu item for selection
|
||||
SelectionMenuItem codeBlockItem = SelectionMenuItem.node(
|
||||
getName: () => LocaleKeys.document_selectionMenu_codeBlock.tr(),
|
||||
getName: LocaleKeys.document_selectionMenu_codeBlock.tr,
|
||||
iconData: Icons.abc,
|
||||
keywords: ['code', 'codeblock'],
|
||||
nodeBuilder: (editorState, _) => codeBlockNode(),
|
||||
|
@ -1,5 +1,7 @@
|
||||
import 'package:appflowy/generated/locale_keys.g.dart';
|
||||
import 'package:appflowy/plugins/document/presentation/editor_plugins/plugins.dart';
|
||||
import 'package:appflowy_editor/appflowy_editor.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
final List<CharacterShortcutEvent> codeBlockCharacterEvents = [
|
||||
@ -59,7 +61,8 @@ final CommandShortcutEvent insertNewParagraphNextToCodeBlockCommand =
|
||||
CommandShortcutEvent(
|
||||
key: 'insert a new paragraph next to the code block',
|
||||
command: 'shift+enter',
|
||||
getDescription: () => 'Insert a new paragraph next to the code block',
|
||||
getDescription:
|
||||
LocaleKeys.settings_shortcuts_commands_codeBlockNewParagraph.tr,
|
||||
handler: _insertNewParagraphNextToCodeBlockCommandHandler,
|
||||
);
|
||||
|
||||
@ -72,7 +75,8 @@ final CommandShortcutEvent tabToInsertSpacesInCodeBlockCommand =
|
||||
CommandShortcutEvent(
|
||||
key: 'tab to insert two spaces at the line start in code block',
|
||||
command: 'tab',
|
||||
getDescription: () => 'Insert two spaces at the line start in code block',
|
||||
getDescription:
|
||||
LocaleKeys.settings_shortcuts_commands_codeBlockAddTwoSpaces.tr,
|
||||
handler: _tabToInsertSpacesInCodeBlockCommandHandler,
|
||||
);
|
||||
|
||||
@ -85,7 +89,8 @@ final CommandShortcutEvent tabToDeleteSpacesInCodeBlockCommand =
|
||||
CommandShortcutEvent(
|
||||
key: 'shift + tab to delete two spaces at the line start in code block',
|
||||
command: 'shift+tab',
|
||||
getDescription: () => 'Delete two spaces at the line start in code block',
|
||||
getDescription:
|
||||
LocaleKeys.settings_shortcuts_commands_codeBlockDeleteTwoSpaces.tr,
|
||||
handler: _tabToDeleteSpacesInCodeBlockCommandHandler,
|
||||
);
|
||||
|
||||
@ -98,7 +103,7 @@ final CommandShortcutEvent selectAllInCodeBlockCommand = CommandShortcutEvent(
|
||||
key: 'ctrl + a to select all content inside a code block',
|
||||
command: 'ctrl+a',
|
||||
macOSCommand: 'meta+a',
|
||||
getDescription: () => 'Select all content inside a code block',
|
||||
getDescription: LocaleKeys.settings_shortcuts_commands_codeBlockSelectAll.tr,
|
||||
handler: _selectAllInCodeBlockCommandHandler,
|
||||
);
|
||||
|
||||
@ -111,7 +116,7 @@ final CommandShortcutEvent pasteInCodeblock = CommandShortcutEvent(
|
||||
key: 'paste in codeblock',
|
||||
command: 'ctrl+v',
|
||||
macOSCommand: 'cmd+v',
|
||||
getDescription: () => 'Paste text in codeblock',
|
||||
getDescription: LocaleKeys.settings_shortcuts_commands_codeBlockPasteText.tr,
|
||||
handler: _pasteInCodeBlock,
|
||||
);
|
||||
|
||||
|
@ -6,15 +6,15 @@ import 'package:easy_localization/easy_localization.dart';
|
||||
final List<List<ContextMenuItem>> customContextMenuItems = [
|
||||
[
|
||||
ContextMenuItem(
|
||||
getName: () => LocaleKeys.document_plugins_contextMenu_copy.tr(),
|
||||
getName: LocaleKeys.document_plugins_contextMenu_copy.tr,
|
||||
onPressed: (editorState) => customCopyCommand.execute(editorState),
|
||||
),
|
||||
ContextMenuItem(
|
||||
getName: () => LocaleKeys.document_plugins_contextMenu_paste.tr(),
|
||||
getName: LocaleKeys.document_plugins_contextMenu_paste.tr,
|
||||
onPressed: (editorState) => customPasteCommand.execute(editorState),
|
||||
),
|
||||
ContextMenuItem(
|
||||
getName: () => LocaleKeys.document_plugins_contextMenu_cut.tr(),
|
||||
getName: LocaleKeys.document_plugins_contextMenu_cut.tr,
|
||||
onPressed: (editorState) => customCutCommand.execute(editorState),
|
||||
),
|
||||
],
|
||||
|
@ -13,8 +13,8 @@ import 'package:flutter/material.dart';
|
||||
/// - mobile
|
||||
///
|
||||
final CommandShortcutEvent customCopyCommand = CommandShortcutEvent(
|
||||
key: 'copy the selected content (with formatting)',
|
||||
getDescription: () => 'copy the selected content (with formatting)',
|
||||
key: 'copy the selected content',
|
||||
getDescription: () => AppFlowyEditorL10n.current.cmdCopySelection,
|
||||
command: 'ctrl+c',
|
||||
macOSCommand: 'cmd+c',
|
||||
handler: _copyCommandHandler,
|
||||
|
@ -11,8 +11,8 @@ import 'package:flutter/material.dart';
|
||||
/// - mobile
|
||||
///
|
||||
final CommandShortcutEvent customCutCommand = CommandShortcutEvent(
|
||||
key: 'cut the selected content (with formatting)',
|
||||
getDescription: () => 'cut the selected content (with formatting)',
|
||||
key: 'cut the selected content',
|
||||
getDescription: () => AppFlowyEditorL10n.current.cmdCutSelection,
|
||||
command: 'ctrl+x',
|
||||
macOSCommand: 'cmd+x',
|
||||
handler: _cutCommandHandler,
|
||||
|
@ -18,8 +18,8 @@ import 'package:string_validator/string_validator.dart';
|
||||
/// - mobile
|
||||
///
|
||||
final CommandShortcutEvent customPasteCommand = CommandShortcutEvent(
|
||||
key: 'paste the content (with formatting)',
|
||||
getDescription: () => 'paste the content (with formatting)',
|
||||
key: 'paste the content',
|
||||
getDescription: () => AppFlowyEditorL10n.current.cmdPasteContent,
|
||||
command: 'ctrl+v',
|
||||
macOSCommand: 'cmd+v',
|
||||
handler: _pasteCommandHandler,
|
||||
|
@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart';
|
||||
|
||||
SelectionMenuItem inlineGridMenuItem(DocumentBloc documentBloc) =>
|
||||
SelectionMenuItem(
|
||||
getName: () => LocaleKeys.document_slashMenu_grid_createANewGrid.tr(),
|
||||
getName: LocaleKeys.document_slashMenu_grid_createANewGrid.tr,
|
||||
icon: (editorState, onSelected, style) => SelectableSvgWidget(
|
||||
data: FlowySvgs.grid_s,
|
||||
isSelected: onSelected,
|
||||
@ -31,7 +31,7 @@ SelectionMenuItem inlineGridMenuItem(DocumentBloc documentBloc) =>
|
||||
|
||||
SelectionMenuItem inlineBoardMenuItem(DocumentBloc documentBloc) =>
|
||||
SelectionMenuItem(
|
||||
getName: () => LocaleKeys.document_slashMenu_board_createANewBoard.tr(),
|
||||
getName: LocaleKeys.document_slashMenu_board_createANewBoard.tr,
|
||||
icon: (editorState, onSelected, style) => SelectableSvgWidget(
|
||||
data: FlowySvgs.board_s,
|
||||
isSelected: onSelected,
|
||||
@ -52,8 +52,7 @@ SelectionMenuItem inlineBoardMenuItem(DocumentBloc documentBloc) =>
|
||||
|
||||
SelectionMenuItem inlineCalendarMenuItem(DocumentBloc documentBloc) =>
|
||||
SelectionMenuItem(
|
||||
getName: () =>
|
||||
LocaleKeys.document_slashMenu_calendar_createANewCalendar.tr(),
|
||||
getName: LocaleKeys.document_slashMenu_calendar_createANewCalendar.tr,
|
||||
icon: (editorState, onSelected, style) => SelectableSvgWidget(
|
||||
data: FlowySvgs.date_s,
|
||||
isSelected: onSelected,
|
||||
|
@ -9,7 +9,7 @@ import 'package:easy_localization/easy_localization.dart';
|
||||
// Document Reference
|
||||
|
||||
SelectionMenuItem referencedDocumentMenuItem = SelectionMenuItem(
|
||||
getName: () => LocaleKeys.document_plugins_referencedDocument.tr(),
|
||||
getName: LocaleKeys.document_plugins_referencedDocument.tr,
|
||||
icon: (editorState, onSelected, style) => SelectableSvgWidget(
|
||||
data: FlowySvgs.document_s,
|
||||
isSelected: onSelected,
|
||||
@ -23,7 +23,7 @@ SelectionMenuItem referencedDocumentMenuItem = SelectionMenuItem(
|
||||
// Database References
|
||||
|
||||
SelectionMenuItem referencedGridMenuItem = SelectionMenuItem(
|
||||
getName: () => LocaleKeys.document_plugins_referencedGrid.tr(),
|
||||
getName: LocaleKeys.document_plugins_referencedGrid.tr,
|
||||
icon: (editorState, onSelected, style) => SelectableSvgWidget(
|
||||
data: FlowySvgs.grid_s,
|
||||
isSelected: onSelected,
|
||||
@ -35,7 +35,7 @@ SelectionMenuItem referencedGridMenuItem = SelectionMenuItem(
|
||||
);
|
||||
|
||||
SelectionMenuItem referencedBoardMenuItem = SelectionMenuItem(
|
||||
getName: () => LocaleKeys.document_plugins_referencedBoard.tr(),
|
||||
getName: LocaleKeys.document_plugins_referencedBoard.tr,
|
||||
icon: (editorState, onSelected, style) => SelectableSvgWidget(
|
||||
data: FlowySvgs.board_s,
|
||||
isSelected: onSelected,
|
||||
@ -47,7 +47,7 @@ SelectionMenuItem referencedBoardMenuItem = SelectionMenuItem(
|
||||
);
|
||||
|
||||
SelectionMenuItem referencedCalendarMenuItem = SelectionMenuItem(
|
||||
getName: () => LocaleKeys.document_plugins_referencedCalendar.tr(),
|
||||
getName: LocaleKeys.document_plugins_referencedCalendar.tr,
|
||||
icon: (editorState, onSelected, style) => SelectableSvgWidget(
|
||||
data: FlowySvgs.date_s,
|
||||
isSelected: onSelected,
|
||||
|
@ -36,7 +36,7 @@ Node mathEquationNode({
|
||||
|
||||
// defining the callout block menu item for selection
|
||||
SelectionMenuItem mathEquationItem = SelectionMenuItem.node(
|
||||
getName: () => LocaleKeys.document_plugins_mathEquation_name.tr(),
|
||||
getName: LocaleKeys.document_plugins_mathEquation_name.tr,
|
||||
iconData: Icons.text_fields_rounded,
|
||||
keywords: ['tex, latex, katex', 'math equation', 'formula'],
|
||||
nodeBuilder: (editorState, _) => mathEquationNode(),
|
||||
|
@ -258,11 +258,11 @@ class _MentionDateBlockState extends State<MentionDateBlock> {
|
||||
}
|
||||
|
||||
DateTime _parseTime(String timeStr, UserTimeFormatPB timeFormat) {
|
||||
final twelveHourFormat = DateFormat('HH:mm a');
|
||||
final twelveHourFormat = DateFormat('hh:mm a');
|
||||
final twentyFourHourFormat = DateFormat('HH:mm');
|
||||
|
||||
try {
|
||||
if (timeFormat == TimeFormatPB.TwelveHour) {
|
||||
if (timeFormat == UserTimeFormatPB.TwelveHour) {
|
||||
return twelveHourFormat.parseStrict(timeStr);
|
||||
}
|
||||
|
||||
|
@ -5,7 +5,7 @@ import 'package:appflowy_editor/appflowy_editor.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
|
||||
SelectionMenuItem dateMenuItem = SelectionMenuItem(
|
||||
getName: () => LocaleKeys.document_plugins_date.tr(),
|
||||
getName: LocaleKeys.document_plugins_insertDate.tr,
|
||||
icon: (_, isSelected, style) => FlowySvg(
|
||||
FlowySvgs.date_s,
|
||||
color: isSelected
|
||||
|
@ -43,7 +43,7 @@ Node autoCompletionNode({
|
||||
}
|
||||
|
||||
SelectionMenuItem autoGeneratorMenuItem = SelectionMenuItem.node(
|
||||
getName: () => LocaleKeys.document_plugins_autoGeneratorMenuItemName.tr(),
|
||||
getName: LocaleKeys.document_plugins_autoGeneratorMenuItemName.tr,
|
||||
iconData: Icons.generating_tokens,
|
||||
keywords: ['ai', 'openai' 'writer', 'autogenerator'],
|
||||
nodeBuilder: (editorState, _) {
|
||||
|
@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
|
||||
class Loading {
|
||||
Loading(this.context);
|
||||
|
||||
late BuildContext loadingContext;
|
||||
BuildContext? loadingContext;
|
||||
final BuildContext context;
|
||||
|
||||
Future<void> start() async => showDialog<void>(
|
||||
@ -24,7 +24,12 @@ class Loading {
|
||||
},
|
||||
);
|
||||
|
||||
Future<void> stop() async => Navigator.of(loadingContext).pop();
|
||||
Future<void> stop() async {
|
||||
if (loadingContext != null) {
|
||||
Navigator.of(loadingContext!).pop();
|
||||
loadingContext = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class BarrierDialog {
|
||||
|
@ -19,7 +19,7 @@ class OutlineBlockKeys {
|
||||
|
||||
// defining the callout block menu item for selection
|
||||
SelectionMenuItem outlineItem = SelectionMenuItem.node(
|
||||
getName: () => LocaleKeys.document_selectionMenu_outline.tr(),
|
||||
getName: LocaleKeys.document_selectionMenu_outline.tr,
|
||||
iconData: Icons.list_alt,
|
||||
keywords: ['outline', 'table of contents'],
|
||||
nodeBuilder: (editorState, _) => outlineBlockNode(),
|
||||
|
@ -46,7 +46,7 @@ Node toggleListBlockNode({
|
||||
|
||||
// defining the toggle list block menu item
|
||||
SelectionMenuItem toggleListBlockItem = SelectionMenuItem.node(
|
||||
getName: () => LocaleKeys.document_plugins_toggleList.tr(),
|
||||
getName: LocaleKeys.document_plugins_toggleList.tr,
|
||||
iconData: Icons.arrow_right,
|
||||
keywords: ['collapsed list', 'toggle list', 'list'],
|
||||
nodeBuilder: (editorState, _) => toggleListBlockNode(),
|
||||
|
@ -110,7 +110,7 @@ CharacterShortcutEvent insertChildNodeInsideToggleList = CharacterShortcutEvent(
|
||||
// toggle the todo list
|
||||
final CommandShortcutEvent toggleToggleListCommand = CommandShortcutEvent(
|
||||
key: 'toggle the toggle list',
|
||||
getDescription: () => 'Toggle the toggle list',
|
||||
getDescription: () => AppFlowyEditorL10n.current.cmdToggleTodoList,
|
||||
command: 'ctrl+enter',
|
||||
macOSCommand: 'cmd+enter',
|
||||
handler: _toggleToggleListCommandHandler,
|
||||
|
@ -5,6 +5,7 @@ import 'package:appflowy/env/backend_env.dart';
|
||||
import 'package:appflowy/env/cloud_env.dart';
|
||||
import 'package:appflowy/user/application/auth/device_id.dart';
|
||||
import 'package:appflowy_backend/appflowy_backend.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
|
||||
@ -28,6 +29,7 @@ class InitRustSDKTask extends LaunchTask {
|
||||
final dir = customApplicationPath ?? applicationPath;
|
||||
final deviceId = await getDeviceId();
|
||||
|
||||
debugPrint('application path: ${applicationPath.path}');
|
||||
// Pass the environment variables to the Rust SDK
|
||||
final env = _makeAppFlowyConfiguration(
|
||||
root.path,
|
||||
@ -59,6 +61,7 @@ AppFlowyConfiguration _makeAppFlowyConfiguration(
|
||||
custom_app_path: customAppPath,
|
||||
origin_app_path: originAppPath,
|
||||
device_id: deviceId,
|
||||
platform: Platform.operatingSystem,
|
||||
authenticator_type: env.authenticatorType.value,
|
||||
supabase_config: env.supabaseConfig,
|
||||
appflowy_cloud_config: env.appflowyCloudConfig,
|
||||
|
@ -1,7 +1,5 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
class Debounce {
|
||||
Debounce({
|
||||
this.duration = const Duration(milliseconds: 1000),
|
||||
@ -10,8 +8,9 @@ class Debounce {
|
||||
final Duration duration;
|
||||
Timer? _timer;
|
||||
|
||||
void call(VoidCallback action) {
|
||||
void call(Function action) {
|
||||
dispose();
|
||||
|
||||
_timer = Timer(duration, () {
|
||||
action();
|
||||
});
|
||||
|
23
frontend/appflowy_flutter/lib/util/throttle.dart
Normal file
23
frontend/appflowy_flutter/lib/util/throttle.dart
Normal file
@ -0,0 +1,23 @@
|
||||
import 'dart:async';
|
||||
|
||||
class Throttler {
|
||||
Throttler({
|
||||
this.duration = const Duration(milliseconds: 1000),
|
||||
});
|
||||
|
||||
final Duration duration;
|
||||
Timer? _timer;
|
||||
|
||||
void call(Function callback) {
|
||||
if (_timer?.isActive ?? false) return;
|
||||
|
||||
_timer = Timer(duration, () {
|
||||
callback();
|
||||
});
|
||||
}
|
||||
|
||||
void dispose() {
|
||||
_timer?.cancel();
|
||||
_timer = null;
|
||||
}
|
||||
}
|
@ -1,5 +1,9 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:appflowy/startup/plugin/plugin.dart';
|
||||
import 'package:appflowy/startup/startup.dart';
|
||||
import 'package:appflowy/workspace/application/tabs/tabs_bloc.dart';
|
||||
import 'package:appflowy/workspace/application/view/view_ext.dart';
|
||||
import 'package:appflowy/workspace/application/workspace/workspace_sections_listener.dart';
|
||||
import 'package:appflowy/workspace/application/workspace/workspace_service.dart';
|
||||
import 'package:appflowy_backend/log.dart';
|
||||
@ -152,6 +156,37 @@ class SidebarSectionsBloc
|
||||
},
|
||||
);
|
||||
},
|
||||
reload: (userProfile, workspaceId) async {
|
||||
_initial(userProfile, workspaceId);
|
||||
final sectionViews = await _getSectionViews();
|
||||
if (sectionViews != null) {
|
||||
emit(
|
||||
state.copyWith(
|
||||
section: sectionViews,
|
||||
),
|
||||
);
|
||||
// try to open the fist view in public section or private section
|
||||
if (sectionViews.publicViews.isNotEmpty) {
|
||||
getIt<TabsBloc>().add(
|
||||
TabsEvent.openPlugin(
|
||||
plugin: sectionViews.publicViews.first.plugin(),
|
||||
),
|
||||
);
|
||||
} else if (sectionViews.privateViews.isNotEmpty) {
|
||||
getIt<TabsBloc>().add(
|
||||
TabsEvent.openPlugin(
|
||||
plugin: sectionViews.privateViews.first.plugin(),
|
||||
),
|
||||
);
|
||||
} else {
|
||||
getIt<TabsBloc>().add(
|
||||
TabsEvent.openPlugin(
|
||||
plugin: makePlugin(pluginType: PluginType.blank),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
@ -245,6 +280,10 @@ class SidebarSectionsEvent with _$SidebarSectionsEvent {
|
||||
const factory SidebarSectionsEvent.receiveSectionViewsUpdate(
|
||||
SectionViewsPB sectionViews,
|
||||
) = _ReceiveSectionViewsUpdate;
|
||||
const factory SidebarSectionsEvent.reload(
|
||||
UserProfilePB userProfile,
|
||||
String workspaceId,
|
||||
) = _Reload;
|
||||
}
|
||||
|
||||
@freezed
|
||||
|
@ -10,6 +10,8 @@ import 'package:appflowy/workspace/application/settings/appearance/base_appearan
|
||||
import 'package:appflowy_backend/log.dart';
|
||||
import 'package:appflowy_backend/protobuf/flowy-user/date_time.pbenum.dart';
|
||||
import 'package:appflowy_backend/protobuf/flowy-user/user_setting.pb.dart';
|
||||
import 'package:appflowy_editor/appflowy_editor.dart'
|
||||
show AppFlowyEditorLocalizations;
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flowy_infra/theme.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
@ -193,6 +195,9 @@ class AppearanceSettingsCubit extends Cubit<AppearanceSettingsState> {
|
||||
Log.warn('Catch error in setLocale: $e}');
|
||||
});
|
||||
|
||||
// Sync the app's locale with the editor (initialization and update)
|
||||
AppFlowyEditorLocalizations.load(newLocale);
|
||||
|
||||
if (state.locale != newLocale) {
|
||||
_appearanceSettings.locale.languageCode = newLocale.languageCode;
|
||||
_appearanceSettings.locale.countryCode = newLocale.countryCode ?? "";
|
||||
|
@ -39,8 +39,10 @@ class ShortcutsCubit extends Cubit<ShortcutsState> {
|
||||
commandShortcutEvents,
|
||||
customizeShortcuts,
|
||||
);
|
||||
|
||||
//sort the shortcuts
|
||||
commandShortcutEvents.sort((a, b) => a.key.compareTo(b.key));
|
||||
|
||||
emit(
|
||||
state.copyWith(
|
||||
status: ShortcutsStatus.success,
|
||||
|
@ -40,7 +40,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
final currentWorkspace = result.$1;
|
||||
final workspaces = result.$2;
|
||||
final isCollabWorkspaceOn =
|
||||
userProfile.authenticator != AuthenticatorPB.Local &&
|
||||
userProfile.authenticator == AuthenticatorPB.AppFlowyCloud &&
|
||||
FeatureFlag.collaborativeWorkspace.isOn;
|
||||
if (currentWorkspace != null && result.$3 == true) {
|
||||
final result = await _userService
|
||||
@ -71,6 +71,15 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
);
|
||||
},
|
||||
createWorkspace: (name) async {
|
||||
emit(
|
||||
state.copyWith(
|
||||
actionResult: const UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.create,
|
||||
isLoading: true,
|
||||
result: null,
|
||||
),
|
||||
),
|
||||
);
|
||||
final result = await _userService.createUserWorkspace(name);
|
||||
final workspaces = result.fold(
|
||||
(s) => [...state.workspaces, s],
|
||||
@ -81,6 +90,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
workspaces: workspaces,
|
||||
actionResult: UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.create,
|
||||
isLoading: false,
|
||||
result: result,
|
||||
),
|
||||
),
|
||||
@ -91,6 +101,15 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
});
|
||||
},
|
||||
deleteWorkspace: (workspaceId) async {
|
||||
emit(
|
||||
state.copyWith(
|
||||
actionResult: const UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.delete,
|
||||
isLoading: true,
|
||||
result: null,
|
||||
),
|
||||
),
|
||||
);
|
||||
final remoteWorkspaces = await _fetchWorkspaces().then(
|
||||
(value) => value.$2,
|
||||
);
|
||||
@ -108,6 +127,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
actionResult: UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.delete,
|
||||
result: result,
|
||||
isLoading: false,
|
||||
),
|
||||
),
|
||||
);
|
||||
@ -134,11 +154,21 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
actionResult: UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.delete,
|
||||
result: result,
|
||||
isLoading: false,
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
openWorkspace: (workspaceId) async {
|
||||
emit(
|
||||
state.copyWith(
|
||||
actionResult: const UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.open,
|
||||
isLoading: true,
|
||||
result: null,
|
||||
),
|
||||
),
|
||||
);
|
||||
final result = await _userService.openWorkspace(workspaceId);
|
||||
final currentWorkspace = result.fold(
|
||||
(s) => state.workspaces.firstWhereOrNull(
|
||||
@ -157,6 +187,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
currentWorkspace: currentWorkspace,
|
||||
actionResult: UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.open,
|
||||
isLoading: false,
|
||||
result: result,
|
||||
),
|
||||
),
|
||||
@ -188,6 +219,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
currentWorkspace: currentWorkspace,
|
||||
actionResult: UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.rename,
|
||||
isLoading: false,
|
||||
result: result,
|
||||
),
|
||||
),
|
||||
@ -221,6 +253,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
currentWorkspace: currentWorkspace,
|
||||
actionResult: UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.updateIcon,
|
||||
isLoading: false,
|
||||
result: result,
|
||||
),
|
||||
),
|
||||
@ -245,6 +278,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
workspaces: workspaces,
|
||||
actionResult: UserWorkspaceActionResult(
|
||||
actionType: UserWorkspaceActionType.leave,
|
||||
isLoading: false,
|
||||
result: result,
|
||||
),
|
||||
),
|
||||
@ -253,7 +287,11 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
|
||||
updateWorkspaces: (workspaces) async {
|
||||
emit(
|
||||
state.copyWith(
|
||||
workspaces: workspaces.items,
|
||||
workspaces: workspaces.items
|
||||
..sort(
|
||||
(a, b) =>
|
||||
a.createdAtTimestamp.compareTo(b.createdAtTimestamp),
|
||||
),
|
||||
),
|
||||
);
|
||||
},
|
||||
@ -359,11 +397,13 @@ enum UserWorkspaceActionType {
|
||||
class UserWorkspaceActionResult {
|
||||
const UserWorkspaceActionResult({
|
||||
required this.actionType,
|
||||
required this.isLoading,
|
||||
required this.result,
|
||||
});
|
||||
|
||||
final UserWorkspaceActionType actionType;
|
||||
final FlowyResult<void, FlowyError> result;
|
||||
final bool isLoading;
|
||||
final FlowyResult<void, FlowyError>? result;
|
||||
}
|
||||
|
||||
@freezed
|
||||
|
@ -1,6 +1,5 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:appflowy/startup/plugin/plugin.dart';
|
||||
import 'package:appflowy/startup/startup.dart';
|
||||
import 'package:appflowy/workspace/application/favorite/favorite_bloc.dart';
|
||||
import 'package:appflowy/workspace/application/favorite/prelude.dart';
|
||||
@ -106,13 +105,13 @@ class HomeSideBar extends StatelessWidget {
|
||||
),
|
||||
BlocListener<UserWorkspaceBloc, UserWorkspaceState>(
|
||||
listener: (context, state) {
|
||||
context.read<TabsBloc>().add(
|
||||
TabsEvent.openPlugin(
|
||||
plugin: makePlugin(pluginType: PluginType.blank),
|
||||
),
|
||||
);
|
||||
final actionType = state.actionResult?.actionType;
|
||||
|
||||
if (actionType == UserWorkspaceActionType.create ||
|
||||
actionType == UserWorkspaceActionType.delete ||
|
||||
actionType == UserWorkspaceActionType.open) {
|
||||
context.read<SidebarSectionsBloc>().add(
|
||||
SidebarSectionsEvent.initial(
|
||||
SidebarSectionsEvent.reload(
|
||||
userProfile,
|
||||
state.currentWorkspace?.workspaceId ??
|
||||
workspaceSetting.workspaceId,
|
||||
@ -121,6 +120,7 @@ class HomeSideBar extends StatelessWidget {
|
||||
context.read<FavoriteBloc>().add(
|
||||
const FavoriteEvent.fetchFavorites(),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
],
|
||||
|
@ -103,10 +103,10 @@ class PublicSectionFolder extends SectionFolder {
|
||||
super.key,
|
||||
required super.views,
|
||||
}) : super(
|
||||
title: LocaleKeys.sideBar_public.tr(),
|
||||
title: LocaleKeys.sideBar_workspace.tr(),
|
||||
categoryType: FolderCategoryType.public,
|
||||
expandButtonTooltip: LocaleKeys.sideBar_clickToHidePublic.tr(),
|
||||
addButtonTooltip: LocaleKeys.sideBar_addAPageToPublic.tr(),
|
||||
expandButtonTooltip: LocaleKeys.sideBar_clickToHideWorkspace.tr(),
|
||||
addButtonTooltip: LocaleKeys.sideBar_addAPageToWorkspace.tr(),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -1,5 +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/workspace/application/user/user_workspace_bloc.dart';
|
||||
import 'package:appflowy/workspace/presentation/home/menu/sidebar/sidebar_setting.dart';
|
||||
import 'package:appflowy/workspace/presentation/home/menu/sidebar/workspace/_sidebar_workspace_icon.dart';
|
||||
@ -16,7 +17,7 @@ import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
||||
class SidebarWorkspace extends StatelessWidget {
|
||||
class SidebarWorkspace extends StatefulWidget {
|
||||
const SidebarWorkspace({
|
||||
super.key,
|
||||
required this.userProfile,
|
||||
@ -24,9 +25,18 @@ class SidebarWorkspace extends StatelessWidget {
|
||||
|
||||
final UserProfilePB userProfile;
|
||||
|
||||
@override
|
||||
State<SidebarWorkspace> createState() => _SidebarWorkspaceState();
|
||||
}
|
||||
|
||||
class _SidebarWorkspaceState extends State<SidebarWorkspace> {
|
||||
Loading? loadingIndicator;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BlocConsumer<UserWorkspaceBloc, UserWorkspaceState>(
|
||||
listenWhen: (previous, current) =>
|
||||
previous.actionResult != current.actionResult,
|
||||
listener: _showResultDialog,
|
||||
builder: (context, state) {
|
||||
final currentWorkspace = state.currentWorkspace;
|
||||
@ -37,11 +47,11 @@ class SidebarWorkspace extends StatelessWidget {
|
||||
children: [
|
||||
Expanded(
|
||||
child: SidebarSwitchWorkspaceButton(
|
||||
userProfile: userProfile,
|
||||
userProfile: widget.userProfile,
|
||||
currentWorkspace: currentWorkspace,
|
||||
),
|
||||
),
|
||||
UserSettingButton(userProfile: userProfile),
|
||||
UserSettingButton(userProfile: widget.userProfile),
|
||||
const HSpace(4),
|
||||
const NotificationButton(),
|
||||
],
|
||||
@ -58,6 +68,19 @@ class SidebarWorkspace extends StatelessWidget {
|
||||
|
||||
final actionType = actionResult.actionType;
|
||||
final result = actionResult.result;
|
||||
final isLoading = actionResult.isLoading;
|
||||
|
||||
if (isLoading) {
|
||||
loadingIndicator ??= Loading(context)..start();
|
||||
return;
|
||||
} else {
|
||||
loadingIndicator?.stop();
|
||||
loadingIndicator = null;
|
||||
}
|
||||
|
||||
if (result == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
result.onFailure((f) {
|
||||
Log.error(
|
||||
@ -193,6 +216,7 @@ class _SidebarSwitchWorkspaceButtonState
|
||||
child: FlowyText.medium(
|
||||
widget.currentWorkspace.name,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
withTooltip: true,
|
||||
),
|
||||
),
|
||||
const FlowySvg(FlowySvgs.drop_menu_show_m),
|
||||
|
@ -110,7 +110,6 @@ class _WorkspaceMoreActionWrapper extends CustomActionCell {
|
||||
await showDialog(
|
||||
context: context,
|
||||
builder: (_) => NavigatorOkCancelDialog(
|
||||
title: LocaleKeys.workspace_leaveCurrentWorkspace.tr(),
|
||||
message: LocaleKeys.workspace_leaveCurrentWorkspacePrompt.tr(),
|
||||
onOkPressed: () {
|
||||
workspaceBloc.add(
|
||||
|
@ -9,6 +9,7 @@ import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
|
||||
import 'package:appflowy_popover/appflowy_popover.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||
import 'package:flowy_infra_ui/widget/flowy_tooltip.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
||||
@ -136,8 +137,10 @@ class WorkspaceMenuItem extends StatelessWidget {
|
||||
PopoverContainer.of(context).closeAll();
|
||||
}
|
||||
},
|
||||
margin:
|
||||
const EdgeInsets.symmetric(vertical: 8, horizontal: 12),
|
||||
margin: const EdgeInsets.symmetric(
|
||||
vertical: 8,
|
||||
horizontal: 12,
|
||||
),
|
||||
iconPadding: 10.0,
|
||||
leftIconSize: const Size.square(32),
|
||||
leftIcon: const SizedBox.square(
|
||||
@ -146,12 +149,12 @@ class WorkspaceMenuItem extends StatelessWidget {
|
||||
rightIcon: const HSpace(42.0),
|
||||
text: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
FlowyText.medium(
|
||||
workspace.name,
|
||||
fontSize: 14.0,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
withTooltip: true,
|
||||
),
|
||||
FlowyText(
|
||||
state.isLoading
|
||||
@ -171,6 +174,9 @@ class WorkspaceMenuItem extends StatelessWidget {
|
||||
left: 8,
|
||||
child: SizedBox.square(
|
||||
dimension: 32,
|
||||
child: FlowyTooltip(
|
||||
message:
|
||||
LocaleKeys.document_plugins_cover_changeIcon.tr(),
|
||||
child: WorkspaceIcon(
|
||||
workspace: workspace,
|
||||
iconSize: 26,
|
||||
@ -178,6 +184,7 @@ class WorkspaceMenuItem extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned(
|
||||
right: 12.0,
|
||||
child: Align(
|
||||
|
@ -62,6 +62,7 @@ class SettingsDialog extends StatelessWidget {
|
||||
SizedBox(
|
||||
width: 200,
|
||||
child: SettingsMenu(
|
||||
userProfile: user,
|
||||
changeSelectedPage: (index) {
|
||||
context
|
||||
.read<SettingsDialogBloc>()
|
||||
|
@ -8,7 +8,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
SelectionMenuItem emojiMenuItem = SelectionMenuItem(
|
||||
getName: () => LocaleKeys.document_plugins_emoji.tr(),
|
||||
getName: LocaleKeys.document_plugins_emoji.tr,
|
||||
icon: (editorState, onSelected, style) => SelectableIconWidget(
|
||||
icon: Icons.emoji_emotions_outlined,
|
||||
isSelected: onSelected,
|
||||
|
@ -117,13 +117,14 @@ class CloudTypeSwitcher extends StatelessWidget {
|
||||
Widget build(BuildContext context) {
|
||||
final isDevelopMode = integrationMode().isDevelop;
|
||||
// Only show the appflowyCloudDevelop in develop mode
|
||||
final values = AuthenticatorType.values
|
||||
.where(
|
||||
(element) =>
|
||||
isDevelopMode ||
|
||||
element != AuthenticatorType.appflowyCloudDevelop,
|
||||
)
|
||||
.toList();
|
||||
final values = AuthenticatorType.values.where((element) {
|
||||
// Supabase will going to be removed in the future
|
||||
if (element == AuthenticatorType.supabase) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return isDevelopMode || element != AuthenticatorType.appflowyCloudDevelop;
|
||||
}).toList();
|
||||
return PlatformExtension.isDesktopOrWeb
|
||||
? AppFlowyPopover(
|
||||
direction: PopoverDirection.bottomWithRightAligned,
|
||||
|
@ -117,7 +117,7 @@ class ShortcutsListTile extends StatelessWidget {
|
||||
Expanded(
|
||||
child: FlowyText.medium(
|
||||
key: Key(shortcutEvent.key),
|
||||
shortcutEvent.key.capitalize(),
|
||||
shortcutEvent.description!.capitalize(),
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
|
@ -2,6 +2,7 @@ import 'package:appflowy/generated/locale_keys.g.dart';
|
||||
import 'package:appflowy/shared/feature_flags.dart';
|
||||
import 'package:appflowy/workspace/application/settings/settings_dialog_bloc.dart';
|
||||
import 'package:appflowy/workspace/presentation/settings/widgets/settings_menu_element.dart';
|
||||
import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flowy_infra_ui/flowy_infra_ui.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
@ -12,10 +13,12 @@ class SettingsMenu extends StatelessWidget {
|
||||
super.key,
|
||||
required this.changeSelectedPage,
|
||||
required this.currentPage,
|
||||
required this.userProfile,
|
||||
});
|
||||
|
||||
final Function changeSelectedPage;
|
||||
final SettingsPage currentPage;
|
||||
final UserProfilePB userProfile;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -72,7 +75,8 @@ class SettingsMenu extends StatelessWidget {
|
||||
icon: Icons.cut,
|
||||
changeSelectedPage: changeSelectedPage,
|
||||
),
|
||||
if (FeatureFlag.membersSettings.isOn)
|
||||
if (FeatureFlag.membersSettings.isOn &&
|
||||
userProfile.authenticator == AuthenticatorPB.AppFlowyCloud)
|
||||
SettingsMenuElement(
|
||||
page: SettingsPage.member,
|
||||
selectedPage: currentPage,
|
||||
|
@ -174,7 +174,12 @@ class _AppFlowyDatePickerState extends State<AppFlowyDatePicker> {
|
||||
}
|
||||
|
||||
Widget buildDesktopPicker() {
|
||||
return Padding(
|
||||
// GestureDetector is a workaround to stop popover from closing
|
||||
// when clicking on the date picker.
|
||||
return GestureDetector(
|
||||
behavior: HitTestBehavior.opaque,
|
||||
onTap: () {},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(top: 18.0, bottom: 12.0),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
@ -207,8 +212,9 @@ class _AppFlowyDatePickerState extends State<AppFlowyDatePicker> {
|
||||
}
|
||||
},
|
||||
onRangeSelected: widget.onRangeSelected,
|
||||
selectedDay:
|
||||
widget.rebuildOnDaySelected ? _selectedDay : widget.selectedDay,
|
||||
selectedDay: widget.rebuildOnDaySelected
|
||||
? _selectedDay
|
||||
: widget.selectedDay,
|
||||
firstDay: widget.firstDay,
|
||||
lastDay: widget.lastDay,
|
||||
startDay: widget.startDay,
|
||||
@ -254,6 +260,7 @@ class _AppFlowyDatePickerState extends State<AppFlowyDatePicker> {
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,7 @@ import 'package:flutter/services.dart';
|
||||
import 'package:appflowy_backend/protobuf/flowy-database2/date_entities.pbenum.dart';
|
||||
import 'package:appflowy_popover/appflowy_popover.dart';
|
||||
import 'package:flowy_infra_ui/style_widget/text_field.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
const _maxLengthTwelveHour = 8;
|
||||
const _maxLengthTwentyFourHour = 5;
|
||||
@ -55,6 +56,13 @@ class _TimeTextFieldState extends State<TimeTextField> {
|
||||
text = widget.endTimeStr!;
|
||||
}
|
||||
|
||||
if (widget.timeFormat == TimeFormatPB.TwelveHour) {
|
||||
final twentyFourHourFormat = DateFormat('HH:mm');
|
||||
final twelveHourFormat = DateFormat('hh:mm a');
|
||||
final date = twentyFourHourFormat.parse(text);
|
||||
text = twelveHourFormat.format(date);
|
||||
}
|
||||
|
||||
_focusNode.addListener(_focusNodeListener);
|
||||
widget.popoverMutex?.listenOnPopoverChanged(_popoverListener);
|
||||
}
|
||||
@ -86,6 +94,7 @@ class _TimeTextFieldState extends State<TimeTextField> {
|
||||
padding: const EdgeInsets.symmetric(horizontal: 18.0),
|
||||
child: FlowyTextField(
|
||||
text: text,
|
||||
keyboardType: TextInputType.datetime,
|
||||
focusNode: _focusNode,
|
||||
autoFocus: false,
|
||||
controller: _textController,
|
||||
@ -97,7 +106,16 @@ class _TimeTextFieldState extends State<TimeTextField> {
|
||||
? _maxLengthTwelveHour
|
||||
: _maxLengthTwentyFourHour,
|
||||
showCounter: false,
|
||||
inputFormatters: [TimeInputFormatter(widget.timeFormat)],
|
||||
inputFormatters: [
|
||||
if (widget.timeFormat == TimeFormatPB.TwelveHour) ...[
|
||||
// Allow for AM/PM if time format is 12-hour
|
||||
FilteringTextInputFormatter.allow(RegExp('[0-9:aApPmM ]')),
|
||||
] else ...[
|
||||
// Default allow for hh:mm format
|
||||
FilteringTextInputFormatter.allow(RegExp('[0-9:]')),
|
||||
],
|
||||
TimeInputFormatter(widget.timeFormat),
|
||||
],
|
||||
onSubmitted: widget.onSubmitted,
|
||||
),
|
||||
);
|
||||
@ -134,7 +152,20 @@ class TimeInputFormatter extends TextInputFormatter {
|
||||
return _formatText(newText, spacePosition, ' ');
|
||||
}
|
||||
|
||||
return newValue;
|
||||
if (timeFormat == TimeFormatPB.TwentyFourHour &&
|
||||
newValue.text.length == 5) {
|
||||
final prefix = newValue.text.substring(0, 3);
|
||||
final suffix = newValue.text.length > 5 ? newValue.text.substring(6) : '';
|
||||
|
||||
final minutes = int.tryParse(newValue.text.substring(3, 5));
|
||||
if (minutes == null || minutes <= 0) {
|
||||
return newValue.copyWith(text: '${prefix}00$suffix'.toUpperCase());
|
||||
} else if (minutes > 59) {
|
||||
return newValue.copyWith(text: '${prefix}59$suffix'.toUpperCase());
|
||||
}
|
||||
}
|
||||
|
||||
return newValue.copyWith(text: newText.toUpperCase());
|
||||
}
|
||||
|
||||
TextEditingValue _formatText(String text, int index, String separator) {
|
||||
|
@ -1,10 +1,15 @@
|
||||
export 'package:async/async.dart';
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'package:appflowy_backend/rust_stream.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'dart:ffi';
|
||||
import 'ffi.dart' as ffi;
|
||||
import 'package:ffi/ffi.dart';
|
||||
import 'dart:isolate';
|
||||
import 'dart:io';
|
||||
import 'package:logger/logger.dart';
|
||||
|
||||
enum ExceptionType {
|
||||
AppearanceSettingsIsEmpty,
|
||||
@ -27,10 +32,15 @@ class FlowySDK {
|
||||
Future<void> dispose() async {}
|
||||
|
||||
Future<void> init(String configuration) async {
|
||||
final port = RustStreamReceiver.shared.port;
|
||||
ffi.set_stream_port(port);
|
||||
ffi.set_stream_port(RustStreamReceiver.shared.port);
|
||||
ffi.store_dart_post_cobject(NativeApi.postCObject);
|
||||
|
||||
// On iOS, VSCode can't print logs from Rust, so we need to use a different method to print logs.
|
||||
// So we use a shared port to receive logs from Rust and print them using the logger. In release mode, we don't print logs.
|
||||
if (Platform.isIOS && kDebugMode) {
|
||||
ffi.set_log_stream_port(RustLogStreamReceiver.logShared.port);
|
||||
}
|
||||
|
||||
// final completer = Completer<Uint8List>();
|
||||
// // Create a SendPort that accepts only one message.
|
||||
// final sendPort = singleCompletePort(completer);
|
||||
@ -42,3 +52,44 @@ class FlowySDK {
|
||||
// return completer.future;
|
||||
}
|
||||
}
|
||||
|
||||
class RustLogStreamReceiver {
|
||||
static RustLogStreamReceiver logShared = RustLogStreamReceiver._internal();
|
||||
late RawReceivePort _ffiPort;
|
||||
late StreamController<Uint8List> _streamController;
|
||||
late StreamSubscription<Uint8List> _subscription;
|
||||
int get port => _ffiPort.sendPort.nativePort;
|
||||
late Logger _logger;
|
||||
|
||||
RustLogStreamReceiver._internal() {
|
||||
_ffiPort = RawReceivePort();
|
||||
_streamController = StreamController();
|
||||
_ffiPort.handler = _streamController.add;
|
||||
_logger = Logger(
|
||||
printer: PrettyPrinter(
|
||||
methodCount: 0, // number of method calls to be displayed
|
||||
errorMethodCount: 8, // number of method calls if stacktrace is provided
|
||||
lineLength: 120, // width of the output
|
||||
colors: false, // Colorful log messages
|
||||
printEmojis: false, // Print an emoji for each log message
|
||||
printTime: false, // Should each log print contain a timestamp
|
||||
),
|
||||
level: kDebugMode ? Level.trace : Level.info,
|
||||
);
|
||||
|
||||
_subscription = _streamController.stream.listen((data) {
|
||||
String decodedString = utf8.decode(data);
|
||||
_logger.i(decodedString);
|
||||
});
|
||||
}
|
||||
|
||||
factory RustLogStreamReceiver() {
|
||||
return logShared;
|
||||
}
|
||||
|
||||
Future<void> dispose() async {
|
||||
await _streamController.close();
|
||||
await _subscription.cancel();
|
||||
_ffiPort.close();
|
||||
}
|
||||
}
|
||||
|
@ -110,6 +110,22 @@ typedef _set_stream_port_Dart = int Function(
|
||||
int port,
|
||||
);
|
||||
|
||||
/// C function `set log stream port`.
|
||||
int set_log_stream_port(int port) {
|
||||
return _set_log_stream_port(port);
|
||||
}
|
||||
|
||||
final _set_log_stream_port_Dart _set_log_stream_port = _dart_ffi_lib
|
||||
.lookupFunction<_set_log_stream_port_C, _set_log_stream_port_Dart>(
|
||||
'set_log_stream_port');
|
||||
|
||||
typedef _set_log_stream_port_C = Int32 Function(
|
||||
Int64 port,
|
||||
);
|
||||
typedef _set_log_stream_port_Dart = int Function(
|
||||
int port,
|
||||
);
|
||||
|
||||
/// C function `link_me_please`.
|
||||
void link_me_please() {
|
||||
_link_me_please();
|
||||
|
@ -1,6 +1,5 @@
|
||||
// ignore: import_of_legacy_library_into_null_safe
|
||||
import 'dart:ffi';
|
||||
|
||||
import 'package:ffi/ffi.dart' as ffi;
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:logger/logger.dart';
|
||||
|
@ -2,7 +2,6 @@ import 'dart:async';
|
||||
import 'dart:ffi';
|
||||
import 'dart:isolate';
|
||||
import 'dart:typed_data';
|
||||
|
||||
import 'package:appflowy_backend/log.dart';
|
||||
|
||||
import 'protobuf/flowy-notification/subject.pb.dart';
|
||||
|
@ -11,6 +11,8 @@ const uint8_t *sync_event(const uint8_t *input, uintptr_t len);
|
||||
|
||||
int32_t set_stream_port(int64_t port);
|
||||
|
||||
int32_t set_log_stream_port(int64_t port);
|
||||
|
||||
void link_me_please(void);
|
||||
|
||||
void rust_log(int64_t level, const char *data);
|
||||
|
@ -15,6 +15,7 @@ class FlowyText extends StatelessWidget {
|
||||
final String? fontFamily;
|
||||
final List<String>? fallbackFontFamily;
|
||||
final double? lineHeight;
|
||||
final bool withTooltip;
|
||||
|
||||
const FlowyText(
|
||||
this.text, {
|
||||
@ -30,6 +31,7 @@ class FlowyText extends StatelessWidget {
|
||||
this.fontFamily,
|
||||
this.fallbackFontFamily,
|
||||
this.lineHeight,
|
||||
this.withTooltip = false,
|
||||
});
|
||||
|
||||
FlowyText.small(
|
||||
@ -44,6 +46,7 @@ class FlowyText extends StatelessWidget {
|
||||
this.fontFamily,
|
||||
this.fallbackFontFamily,
|
||||
this.lineHeight,
|
||||
this.withTooltip = false,
|
||||
}) : fontWeight = FontWeight.w400,
|
||||
fontSize = (Platform.isIOS || Platform.isAndroid) ? 14 : 12;
|
||||
|
||||
@ -60,6 +63,7 @@ class FlowyText extends StatelessWidget {
|
||||
this.fontFamily,
|
||||
this.fallbackFontFamily,
|
||||
this.lineHeight,
|
||||
this.withTooltip = false,
|
||||
}) : fontWeight = FontWeight.w400;
|
||||
|
||||
const FlowyText.medium(
|
||||
@ -75,6 +79,7 @@ class FlowyText extends StatelessWidget {
|
||||
this.fontFamily,
|
||||
this.fallbackFontFamily,
|
||||
this.lineHeight,
|
||||
this.withTooltip = false,
|
||||
}) : fontWeight = FontWeight.w500;
|
||||
|
||||
const FlowyText.semibold(
|
||||
@ -90,6 +95,7 @@ class FlowyText extends StatelessWidget {
|
||||
this.fontFamily,
|
||||
this.fallbackFontFamily,
|
||||
this.lineHeight,
|
||||
this.withTooltip = false,
|
||||
}) : fontWeight = FontWeight.w600;
|
||||
|
||||
// Some emojis are not supported on Linux and Android, fallback to noto color emoji
|
||||
@ -104,14 +110,17 @@ class FlowyText extends StatelessWidget {
|
||||
this.decoration,
|
||||
this.selectable = false,
|
||||
this.lineHeight,
|
||||
this.withTooltip = false,
|
||||
}) : fontWeight = FontWeight.w400,
|
||||
fontFamily = 'noto color emoji',
|
||||
fallbackFontFamily = null;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Widget child;
|
||||
|
||||
if (selectable) {
|
||||
return SelectableText(
|
||||
child = SelectableText(
|
||||
text,
|
||||
maxLines: maxLines,
|
||||
textAlign: textAlign,
|
||||
@ -126,7 +135,7 @@ class FlowyText extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
} else {
|
||||
return Text(
|
||||
child = Text(
|
||||
text,
|
||||
maxLines: maxLines,
|
||||
textAlign: textAlign,
|
||||
@ -142,5 +151,14 @@ class FlowyText extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
if (withTooltip) {
|
||||
child = Tooltip(
|
||||
message: text,
|
||||
child: child,
|
||||
);
|
||||
}
|
||||
|
||||
return child;
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,10 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flowy_infra/size.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
import 'package:flowy_infra/size.dart';
|
||||
|
||||
class FlowyTextField extends StatefulWidget {
|
||||
final String? hintText;
|
||||
final String? text;
|
||||
@ -31,6 +32,7 @@ class FlowyTextField extends StatefulWidget {
|
||||
final TextStyle? hintStyle;
|
||||
final InputDecoration? decoration;
|
||||
final TextAlignVertical? textAlignVertical;
|
||||
final TextInputAction? textInputAction;
|
||||
final TextInputType? keyboardType;
|
||||
final List<TextInputFormatter>? inputFormatters;
|
||||
|
||||
@ -62,6 +64,7 @@ class FlowyTextField extends StatefulWidget {
|
||||
this.hintStyle,
|
||||
this.decoration,
|
||||
this.textAlignVertical,
|
||||
this.textInputAction,
|
||||
this.keyboardType = TextInputType.multiline,
|
||||
this.inputFormatters,
|
||||
});
|
||||
|
@ -53,8 +53,8 @@ packages:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
path: "."
|
||||
ref: b927ec0
|
||||
resolved-ref: b927ec0685c870c731c5b6d9688a031d0cd31e76
|
||||
ref: c8cd407
|
||||
resolved-ref: c8cd4071e36ca6b1fb6d9ef803abb61e9a743c8b
|
||||
url: "https://github.com/AppFlowy-IO/appflowy-editor.git"
|
||||
source: git
|
||||
version: "2.3.3"
|
||||
|
@ -169,7 +169,7 @@ dependency_overrides:
|
||||
appflowy_editor:
|
||||
git:
|
||||
url: https://github.com/AppFlowy-IO/appflowy-editor.git
|
||||
ref: "b927ec0"
|
||||
ref: "c8cd407"
|
||||
|
||||
sheet:
|
||||
git:
|
||||
|
166
frontend/appflowy_tauri/src-tauri/Cargo.lock
generated
166
frontend/appflowy_tauri/src-tauri/Cargo.lock
generated
@ -156,7 +156,7 @@ checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
|
||||
[[package]]
|
||||
name = "app-error"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -712,7 +712,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "client-api"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"again",
|
||||
"anyhow",
|
||||
@ -733,7 +733,6 @@ dependencies = [
|
||||
"getrandom 0.2.10",
|
||||
"gotrue",
|
||||
"gotrue-entity",
|
||||
"governor",
|
||||
"mime",
|
||||
"parking_lot 0.12.1",
|
||||
"prost",
|
||||
@ -752,14 +751,13 @@ dependencies = [
|
||||
"url",
|
||||
"uuid",
|
||||
"wasm-bindgen-futures",
|
||||
"workspace-template",
|
||||
"yrs",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "client-websocket"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
@ -833,7 +831,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@ -857,7 +855,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-database"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@ -887,7 +885,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-document"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"collab",
|
||||
@ -906,7 +904,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bytes",
|
||||
@ -921,7 +919,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-folder"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@ -959,7 +957,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-plugins"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-stream",
|
||||
@ -998,7 +996,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-rt-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -1023,7 +1021,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-rt-protocol"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -1037,7 +1035,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-user"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"collab",
|
||||
@ -1096,9 +1094,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
|
||||
|
||||
[[package]]
|
||||
name = "cookie"
|
||||
version = "0.16.2"
|
||||
version = "0.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb"
|
||||
checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
|
||||
dependencies = [
|
||||
"percent-encoding",
|
||||
"time",
|
||||
@ -1107,12 +1105,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cookie_store"
|
||||
version = "0.16.2"
|
||||
version = "0.20.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa"
|
||||
checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6"
|
||||
dependencies = [
|
||||
"cookie",
|
||||
"idna 0.2.3",
|
||||
"idna 0.3.0",
|
||||
"log",
|
||||
"publicsuffix",
|
||||
"serde",
|
||||
@ -1260,7 +1258,7 @@ dependencies = [
|
||||
"cssparser-macros",
|
||||
"dtoa-short",
|
||||
"itoa 1.0.6",
|
||||
"phf 0.8.0",
|
||||
"phf 0.11.2",
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
@ -1371,7 +1369,7 @@ checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
|
||||
[[package]]
|
||||
name = "database-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -2352,12 +2350,6 @@ version = "0.3.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
|
||||
|
||||
[[package]]
|
||||
name = "futures-timer"
|
||||
version = "3.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
|
||||
|
||||
[[package]]
|
||||
name = "futures-util"
|
||||
version = "0.3.30"
|
||||
@ -2687,7 +2679,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "gotrue"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"futures-util",
|
||||
@ -2704,7 +2696,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "gotrue-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -2715,24 +2707,6 @@ dependencies = [
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "governor"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "821239e5672ff23e2a7060901fa622950bbd80b649cdaadd78d1c1767ed14eb4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"dashmap",
|
||||
"futures",
|
||||
"futures-timer",
|
||||
"no-std-compat",
|
||||
"nonzero_ext",
|
||||
"parking_lot 0.12.1",
|
||||
"quanta",
|
||||
"rand 0.8.5",
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gtk"
|
||||
version = "0.15.5"
|
||||
@ -3027,17 +3001,6 @@ version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
|
||||
dependencies = [
|
||||
"matches",
|
||||
"unicode-bidi",
|
||||
"unicode-normalization",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "0.3.0"
|
||||
@ -3155,7 +3118,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "infra"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"reqwest",
|
||||
@ -3399,6 +3362,7 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"lazy_static",
|
||||
"lib-infra",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tracing",
|
||||
@ -3519,15 +3483,6 @@ version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
|
||||
|
||||
[[package]]
|
||||
name = "mach2"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "macroific"
|
||||
version = "1.3.1"
|
||||
@ -3788,12 +3743,6 @@ version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
|
||||
|
||||
[[package]]
|
||||
name = "no-std-compat"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
|
||||
|
||||
[[package]]
|
||||
name = "nodrop"
|
||||
version = "0.1.14"
|
||||
@ -3810,12 +3759,6 @@ dependencies = [
|
||||
"minimal-lexical",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nonzero_ext"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
|
||||
|
||||
[[package]]
|
||||
name = "ntapi"
|
||||
version = "0.4.1"
|
||||
@ -4759,22 +4702,6 @@ dependencies = [
|
||||
"psl-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quanta"
|
||||
version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
"libc",
|
||||
"mach2",
|
||||
"once_cell",
|
||||
"raw-cpuid",
|
||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||
"web-sys",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quick-xml"
|
||||
version = "0.28.2"
|
||||
@ -4891,15 +4818,6 @@ dependencies = [
|
||||
"rand_core 0.5.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raw-cpuid"
|
||||
version = "10.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raw-window-handle"
|
||||
version = "0.5.2"
|
||||
@ -5013,9 +4931,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "reqwest"
|
||||
version = "0.11.23"
|
||||
version = "0.11.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41"
|
||||
checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
|
||||
dependencies = [
|
||||
"base64 0.21.5",
|
||||
"bytes",
|
||||
@ -5044,6 +4962,7 @@ dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper",
|
||||
"system-configuration",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
@ -5599,7 +5518,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "shared-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -5865,6 +5784,12 @@ dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sync_wrapper"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
|
||||
|
||||
[[package]]
|
||||
name = "sysinfo"
|
||||
version = "0.30.5"
|
||||
@ -7050,9 +6975,9 @@ checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
|
||||
|
||||
[[package]]
|
||||
name = "wasm-streams"
|
||||
version = "0.3.0"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7"
|
||||
checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"js-sys",
|
||||
@ -7584,27 +7509,6 @@ dependencies = [
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "workspace-template"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
"bytes",
|
||||
"collab",
|
||||
"collab-document",
|
||||
"collab-entity",
|
||||
"collab-folder",
|
||||
"getrandom 0.2.10",
|
||||
"indexmap 2.1.0",
|
||||
"nanoid",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tokio",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wry"
|
||||
version = "0.24.6"
|
||||
|
@ -87,7 +87,7 @@ yrs = { git = "https://github.com/appflowy/y-crdt", rev = "3f25bb510ca5274e7657d
|
||||
# Run the script:
|
||||
# scripts/tool/update_client_api_rev.sh new_rev_id
|
||||
# ⚠️⚠️⚠️️
|
||||
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "aa4df32f6d3b53bec5e3715f5abfe4fb9079021b" }
|
||||
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "4c002360698c978256ff324ebeed20506e79b3fc" }
|
||||
# Please use the following script to update collab.
|
||||
# Working directory: frontend
|
||||
#
|
||||
@ -97,10 +97,10 @@ client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "aa4
|
||||
# To switch to the local path, run:
|
||||
# scripts/tool/update_collab_source.sh
|
||||
# ⚠️⚠️⚠️️
|
||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
|
@ -29,7 +29,12 @@ pub fn init_flowy_core() -> AppFlowyCore {
|
||||
let config_json = include_str!("../tauri.conf.json");
|
||||
let config: tauri_utils::config::Config = serde_json::from_str(config_json).unwrap();
|
||||
|
||||
let app_version = config.package.version.clone().map(|v| v.to_string()).unwrap_or_else(|| "0.0.0".to_string());
|
||||
let app_version = config
|
||||
.package
|
||||
.version
|
||||
.clone()
|
||||
.map(|v| v.to_string())
|
||||
.unwrap_or_else(|| "0.0.0".to_string());
|
||||
let mut data_path = tauri::api::path::app_local_data_dir(&config).unwrap();
|
||||
if cfg!(debug_assertions) {
|
||||
data_path.push("data_dev");
|
||||
@ -49,11 +54,12 @@ pub fn init_flowy_core() -> AppFlowyCore {
|
||||
custom_application_path,
|
||||
application_path,
|
||||
device_id,
|
||||
"tauri".to_string(),
|
||||
DEFAULT_NAME.to_string(),
|
||||
)
|
||||
.log_filter("trace", vec!["appflowy_tauri".to_string()]);
|
||||
|
||||
let runtime = Arc::new(AFPluginRuntime::new().unwrap());
|
||||
let cloned_runtime = runtime.clone();
|
||||
runtime.block_on(async move { AppFlowyCore::new(config, cloned_runtime).await })
|
||||
runtime.block_on(async move { AppFlowyCore::new(config, cloned_runtime, None).await })
|
||||
}
|
||||
|
180
frontend/appflowy_web/wasm-libs/Cargo.lock
generated
180
frontend/appflowy_web/wasm-libs/Cargo.lock
generated
@ -215,7 +215,7 @@ checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
|
||||
[[package]]
|
||||
name = "app-error"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -378,9 +378,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "brotli"
|
||||
version = "3.4.0"
|
||||
version = "3.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f"
|
||||
checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391"
|
||||
dependencies = [
|
||||
"alloc-no-stdlib",
|
||||
"alloc-stdlib",
|
||||
@ -541,7 +541,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "client-api"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"again",
|
||||
"anyhow",
|
||||
@ -562,7 +562,6 @@ dependencies = [
|
||||
"getrandom 0.2.12",
|
||||
"gotrue",
|
||||
"gotrue-entity",
|
||||
"governor",
|
||||
"mime",
|
||||
"parking_lot 0.12.1",
|
||||
"prost",
|
||||
@ -587,7 +586,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "client-websocket"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
@ -631,7 +630,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@ -655,7 +654,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-document"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"collab",
|
||||
@ -674,7 +673,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bytes",
|
||||
@ -689,7 +688,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-folder"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@ -727,7 +726,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-plugins"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-stream",
|
||||
@ -765,7 +764,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-rt-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -790,7 +789,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-rt-protocol"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -804,7 +803,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-user"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"collab",
|
||||
@ -851,9 +850,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
|
||||
|
||||
[[package]]
|
||||
name = "cookie"
|
||||
version = "0.16.2"
|
||||
version = "0.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb"
|
||||
checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
|
||||
dependencies = [
|
||||
"percent-encoding",
|
||||
"time",
|
||||
@ -862,12 +861,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cookie_store"
|
||||
version = "0.16.2"
|
||||
version = "0.20.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa"
|
||||
checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6"
|
||||
dependencies = [
|
||||
"cookie",
|
||||
"idna 0.2.3",
|
||||
"idna 0.3.0",
|
||||
"log",
|
||||
"publicsuffix",
|
||||
"serde",
|
||||
@ -956,7 +955,7 @@ dependencies = [
|
||||
"cssparser-macros",
|
||||
"dtoa-short",
|
||||
"itoa",
|
||||
"phf 0.11.2",
|
||||
"phf 0.8.0",
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
@ -1001,7 +1000,7 @@ checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
|
||||
[[package]]
|
||||
name = "database-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -1629,12 +1628,6 @@ version = "0.3.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
|
||||
|
||||
[[package]]
|
||||
name = "futures-timer"
|
||||
version = "3.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
|
||||
|
||||
[[package]]
|
||||
name = "futures-util"
|
||||
version = "0.3.30"
|
||||
@ -1769,7 +1762,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "gotrue"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"futures-util",
|
||||
@ -1786,7 +1779,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "gotrue-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -1797,24 +1790,6 @@ dependencies = [
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "governor"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "821239e5672ff23e2a7060901fa622950bbd80b649cdaadd78d1c1767ed14eb4"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"dashmap",
|
||||
"futures",
|
||||
"futures-timer",
|
||||
"no-std-compat",
|
||||
"nonzero_ext",
|
||||
"parking_lot 0.12.1",
|
||||
"quanta",
|
||||
"rand 0.8.5",
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.3.24"
|
||||
@ -2022,17 +1997,6 @@ dependencies = [
|
||||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
|
||||
dependencies = [
|
||||
"matches",
|
||||
"unicode-bidi",
|
||||
"unicode-normalization",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "0.3.0"
|
||||
@ -2116,7 +2080,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "infra"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"reqwest",
|
||||
@ -2342,15 +2306,6 @@ version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
|
||||
|
||||
[[package]]
|
||||
name = "mach2"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "macroific"
|
||||
version = "1.3.1"
|
||||
@ -2412,12 +2367,6 @@ dependencies = [
|
||||
"tendril",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "matches"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
|
||||
|
||||
[[package]]
|
||||
name = "md5"
|
||||
version = "0.7.0"
|
||||
@ -2517,12 +2466,6 @@ version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
|
||||
|
||||
[[package]]
|
||||
name = "no-std-compat"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "7.1.3"
|
||||
@ -2533,12 +2476,6 @@ dependencies = [
|
||||
"minimal-lexical",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nonzero_ext"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.4"
|
||||
@ -2569,16 +2506,6 @@ dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num_cpus"
|
||||
version = "1.16.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
|
||||
dependencies = [
|
||||
"hermit-abi",
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "object"
|
||||
version = "0.32.2"
|
||||
@ -2836,7 +2763,7 @@ version = "0.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
|
||||
dependencies = [
|
||||
"phf_macros 0.8.0",
|
||||
"phf_macros",
|
||||
"phf_shared 0.8.0",
|
||||
"proc-macro-hack",
|
||||
]
|
||||
@ -2856,7 +2783,6 @@ version = "0.11.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
|
||||
dependencies = [
|
||||
"phf_macros 0.11.2",
|
||||
"phf_shared 0.11.2",
|
||||
]
|
||||
|
||||
@ -2924,19 +2850,6 @@ dependencies = [
|
||||
"syn 1.0.109",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "phf_macros"
|
||||
version = "0.11.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
|
||||
dependencies = [
|
||||
"phf_generator 0.11.2",
|
||||
"phf_shared 0.11.2",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.48",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "phf_shared"
|
||||
version = "0.8.0"
|
||||
@ -3247,22 +3160,6 @@ dependencies = [
|
||||
"psl-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quanta"
|
||||
version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
"libc",
|
||||
"mach2",
|
||||
"once_cell",
|
||||
"raw-cpuid",
|
||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||
"web-sys",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.35"
|
||||
@ -3353,15 +3250,6 @@ dependencies = [
|
||||
"rand_core 0.5.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raw-cpuid"
|
||||
version = "10.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "redox_syscall"
|
||||
version = "0.1.57"
|
||||
@ -3417,9 +3305,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
|
||||
|
||||
[[package]]
|
||||
name = "reqwest"
|
||||
version = "0.11.23"
|
||||
version = "0.11.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41"
|
||||
checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
|
||||
dependencies = [
|
||||
"base64 0.21.7",
|
||||
"bytes",
|
||||
@ -3448,6 +3336,7 @@ dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper",
|
||||
"system-configuration",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
@ -3816,7 +3705,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "shared-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -4009,6 +3898,12 @@ dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sync_wrapper"
|
||||
version = "0.1.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
|
||||
|
||||
[[package]]
|
||||
name = "system-configuration"
|
||||
version = "0.5.1"
|
||||
@ -4190,7 +4085,6 @@ dependencies = [
|
||||
"bytes",
|
||||
"libc",
|
||||
"mio",
|
||||
"num_cpus",
|
||||
"pin-project-lite",
|
||||
"socket2",
|
||||
"tokio-macros",
|
||||
@ -4738,9 +4632,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-streams"
|
||||
version = "0.3.0"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7"
|
||||
checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"js-sys",
|
||||
@ -5073,4 +4967,4 @@ dependencies = [
|
||||
[[patch.unused]]
|
||||
name = "collab-database"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
|
@ -55,7 +55,7 @@ codegen-units = 1
|
||||
# Run the script:
|
||||
# scripts/tool/update_client_api_rev.sh new_rev_id
|
||||
# ⚠️⚠️⚠️️
|
||||
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "aa4df32f6d3b53bec5e3715f5abfe4fb9079021b" }
|
||||
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "4c002360698c978256ff324ebeed20506e79b3fc" }
|
||||
# Please use the following script to update collab.
|
||||
# Working directory: frontend
|
||||
#
|
||||
@ -65,10 +65,10 @@ client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "aa4
|
||||
# To switch to the local path, run:
|
||||
# scripts/tool/update_collab_source.sh
|
||||
# ⚠️⚠️⚠️️
|
||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
|
@ -14,7 +14,7 @@ flowy-user-pub = { workspace = true }
|
||||
strum_macros = "0.25.2"
|
||||
tracing.workspace = true
|
||||
lib-infra = { workspace = true }
|
||||
collab = { workspace = true, features = ["async-plugin"] }
|
||||
collab = { workspace = true }
|
||||
collab-entity.workspace = true
|
||||
collab-user.workspace = true
|
||||
collab-integrate = { workspace = true }
|
||||
|
@ -30,7 +30,7 @@ flowy-error = { workspace = true, features = ["impl_from_dispatch_error", "web_t
|
||||
flowy-document = { workspace = true, features = ["web_ts"] }
|
||||
flowy-folder = { workspace = true, features = ["web_ts"] }
|
||||
lib-infra = { workspace = true }
|
||||
collab = { workspace = true, features = ["async-plugin"] }
|
||||
collab = { workspace = true }
|
||||
web-sys = "0.3"
|
||||
wasm-bindgen-futures.workspace = true
|
||||
uuid.workspace = true
|
||||
|
134
frontend/appflowy_web_app/src-tauri/Cargo.lock
generated
134
frontend/appflowy_web_app/src-tauri/Cargo.lock
generated
@ -147,7 +147,7 @@ checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247"
|
||||
[[package]]
|
||||
name = "app-error"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -687,7 +687,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "client-api"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"again",
|
||||
"anyhow",
|
||||
@ -708,7 +708,6 @@ dependencies = [
|
||||
"getrandom 0.2.12",
|
||||
"gotrue",
|
||||
"gotrue-entity",
|
||||
"governor",
|
||||
"mime",
|
||||
"parking_lot 0.12.1",
|
||||
"prost",
|
||||
@ -727,14 +726,13 @@ dependencies = [
|
||||
"url",
|
||||
"uuid",
|
||||
"wasm-bindgen-futures",
|
||||
"workspace-template",
|
||||
"yrs",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "client-websocket"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
@ -817,7 +815,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@ -841,7 +839,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-database"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@ -871,7 +869,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-document"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"collab",
|
||||
@ -890,7 +888,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bytes",
|
||||
@ -905,7 +903,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-folder"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@ -943,7 +941,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-plugins"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-stream",
|
||||
@ -982,7 +980,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-rt-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -1007,7 +1005,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-rt-protocol"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -1021,7 +1019,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-user"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"collab",
|
||||
@ -1359,7 +1357,7 @@ checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
|
||||
[[package]]
|
||||
name = "database-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -2412,12 +2410,6 @@ version = "0.3.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
|
||||
|
||||
[[package]]
|
||||
name = "futures-timer"
|
||||
version = "3.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24"
|
||||
|
||||
[[package]]
|
||||
name = "futures-util"
|
||||
version = "0.3.30"
|
||||
@ -2757,7 +2749,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "gotrue"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"futures-util",
|
||||
@ -2774,7 +2766,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "gotrue-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -2785,26 +2777,6 @@ dependencies = [
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "governor"
|
||||
version = "0.6.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "68a7f542ee6b35af73b06abc0dad1c1bae89964e4e253bc4b587b91c9637867b"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"dashmap",
|
||||
"futures",
|
||||
"futures-timer",
|
||||
"no-std-compat",
|
||||
"nonzero_ext",
|
||||
"parking_lot 0.12.1",
|
||||
"portable-atomic",
|
||||
"quanta",
|
||||
"rand 0.8.5",
|
||||
"smallvec",
|
||||
"spinning_top",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gtk"
|
||||
version = "0.15.5"
|
||||
@ -3221,7 +3193,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "infra"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"reqwest",
|
||||
@ -3847,12 +3819,6 @@ dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "no-std-compat"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
|
||||
|
||||
[[package]]
|
||||
name = "nodrop"
|
||||
version = "0.1.14"
|
||||
@ -3869,12 +3835,6 @@ dependencies = [
|
||||
"minimal-lexical",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nonzero_ext"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
|
||||
|
||||
[[package]]
|
||||
name = "ntapi"
|
||||
version = "0.4.1"
|
||||
@ -4546,12 +4506,6 @@ dependencies = [
|
||||
"universal-hash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "portable-atomic"
|
||||
version = "1.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
|
||||
|
||||
[[package]]
|
||||
name = "postgrest"
|
||||
version = "1.6.0"
|
||||
@ -4824,21 +4778,6 @@ dependencies = [
|
||||
"psl-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quanta"
|
||||
version = "0.12.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9ca0b7bac0b97248c40bb77288fc52029cf1459c0461ea1b05ee32ccf011de2c"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
"libc",
|
||||
"once_cell",
|
||||
"raw-cpuid",
|
||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||
"web-sys",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quick-xml"
|
||||
version = "0.31.0"
|
||||
@ -4955,15 +4894,6 @@ dependencies = [
|
||||
"rand_core 0.5.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raw-cpuid"
|
||||
version = "11.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1"
|
||||
dependencies = [
|
||||
"bitflags 2.5.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raw-window-handle"
|
||||
version = "0.5.2"
|
||||
@ -5678,7 +5608,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "shared-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -5835,15 +5765,6 @@ version = "0.9.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
|
||||
|
||||
[[package]]
|
||||
name = "spinning_top"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300"
|
||||
dependencies = [
|
||||
"lock_api",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
version = "1.2.0"
|
||||
@ -7877,27 +7798,6 @@ dependencies = [
|
||||
"wayland-protocols-wlr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "workspace-template"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
"bytes",
|
||||
"collab",
|
||||
"collab-document",
|
||||
"collab-entity",
|
||||
"collab-folder",
|
||||
"getrandom 0.2.12",
|
||||
"indexmap 2.2.6",
|
||||
"nanoid",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tokio",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wry"
|
||||
version = "0.24.7"
|
||||
|
@ -87,7 +87,7 @@ yrs = { git = "https://github.com/appflowy/y-crdt", rev = "3f25bb510ca5274e7657d
|
||||
# Run the script:
|
||||
# scripts/tool/update_client_api_rev.sh new_rev_id
|
||||
# ⚠️⚠️⚠️️
|
||||
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "aa4df32f6d3b53bec5e3715f5abfe4fb9079021b" }
|
||||
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "4c002360698c978256ff324ebeed20506e79b3fc" }
|
||||
# Please use the following script to update collab.
|
||||
# Working directory: frontend
|
||||
#
|
||||
@ -97,10 +97,10 @@ client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "aa4
|
||||
# To switch to the local path, run:
|
||||
# scripts/tool/update_collab_source.sh
|
||||
# ⚠️⚠️⚠️️
|
||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
|
@ -49,11 +49,12 @@ pub fn init_flowy_core() -> AppFlowyCore {
|
||||
custom_application_path,
|
||||
application_path,
|
||||
device_id,
|
||||
"web".to_string(),
|
||||
DEFAULT_NAME.to_string(),
|
||||
)
|
||||
.log_filter("trace", vec!["appflowy_tauri".to_string()]);
|
||||
|
||||
let runtime = Arc::new(AFPluginRuntime::new().unwrap());
|
||||
let cloned_runtime = runtime.clone();
|
||||
runtime.block_on(async move { AppFlowyCore::new(config, cloned_runtime).await })
|
||||
runtime.block_on(async move { AppFlowyCore::new(config, cloned_runtime, None).await })
|
||||
}
|
||||
|
@ -74,12 +74,12 @@
|
||||
"copyLink": "کۆپی کردنی لینک"
|
||||
},
|
||||
"moreAction": {
|
||||
"fontSize": "قەبارەی قەڵەم",
|
||||
"import": "زیادکردن",
|
||||
"moreOptions": "بژاردەی زیاتر",
|
||||
"small": "بچووک",
|
||||
"medium": "ناوەند",
|
||||
"large": "گەورە"
|
||||
"large": "گەورە",
|
||||
"fontSize": "قەبارەی قەڵەم",
|
||||
"import": "زیادکردن",
|
||||
"moreOptions": "بژاردەی زیاتر"
|
||||
},
|
||||
"importPanel": {
|
||||
"textAndMarkdown": "Text & Markdown",
|
||||
@ -521,18 +521,6 @@
|
||||
"isComplete": "تەواوە",
|
||||
"isIncomplted": "ناتەواوە"
|
||||
},
|
||||
"singleSelectOptionFilter": {
|
||||
"is": "هەیە",
|
||||
"isNot": "نییە",
|
||||
"isEmpty": "بهتاڵه",
|
||||
"isNotEmpty": "بەتاڵ نییە"
|
||||
},
|
||||
"multiSelectOptionFilter": {
|
||||
"contains": "لەخۆ دەگرێت",
|
||||
"doesNotContain": "لەخۆناگرێت",
|
||||
"isEmpty": "بهتاڵه",
|
||||
"isNotEmpty": "بەتاڵ نییە"
|
||||
},
|
||||
"dateFilter": {
|
||||
"is": "هەیە",
|
||||
"before": "پێشترە",
|
||||
@ -651,6 +639,18 @@
|
||||
"median": "ناوەند",
|
||||
"min": "کەم",
|
||||
"sum": "کۆ"
|
||||
},
|
||||
"singleSelectOptionFilter": {
|
||||
"is": "هەیە",
|
||||
"isNot": "نییە",
|
||||
"isEmpty": "بهتاڵه",
|
||||
"isNotEmpty": "بەتاڵ نییە"
|
||||
},
|
||||
"multiSelectOptionFilter": {
|
||||
"contains": "لەخۆ دەگرێت",
|
||||
"doesNotContain": "لەخۆناگرێت",
|
||||
"isEmpty": "بهتاڵه",
|
||||
"isNotEmpty": "بەتاڵ نییە"
|
||||
}
|
||||
},
|
||||
"document": {
|
||||
|
@ -553,14 +553,14 @@
|
||||
"typeAValue": "Einen Wert eingeben...",
|
||||
"layout": "Layout",
|
||||
"databaseLayout": "Layout",
|
||||
"viewList": "Datenbank-Ansichten",
|
||||
"editView": "Ansicht editieren",
|
||||
"boardSettings": "Board-Einstellungen",
|
||||
"calendarSettings": "Kalender-Einstellungen",
|
||||
"createView": "New Ansicht",
|
||||
"duplicateView": "Ansicht duplizieren",
|
||||
"deleteView": "Anslicht löschen",
|
||||
"numberOfVisibleFields": "{} angezeigt"
|
||||
"numberOfVisibleFields": "{} angezeigt",
|
||||
"viewList": "Datenbank-Ansichten"
|
||||
},
|
||||
"textFilter": {
|
||||
"contains": "Enthält",
|
||||
|
@ -213,15 +213,15 @@
|
||||
"openSidebar": "Open side bar",
|
||||
"personal": "Personal",
|
||||
"private": "Private",
|
||||
"public": "Public",
|
||||
"workspace": "Workspace",
|
||||
"favorites": "Favorites",
|
||||
"clickToHidePrivate": "Click to hide private space\nPages you created here are only visible to you",
|
||||
"clickToHidePublic": "Click to hide public space\nPages you created here are visible to every member",
|
||||
"clickToHideWorkspace": "Click to hide workspace\nPages you created here are visible to every member",
|
||||
"clickToHidePersonal": "Click to hide personal space",
|
||||
"clickToHideFavorites": "Click to hide favorite space",
|
||||
"addAPage": "Add a page",
|
||||
"addAPageToPrivate": "Add a page to private space",
|
||||
"addAPageToPublic": "Add a page to public space",
|
||||
"addAPageToWorkspace": "Add a page to workspace",
|
||||
"recent": "Recent"
|
||||
},
|
||||
"notifications": {
|
||||
@ -514,7 +514,17 @@
|
||||
"shortcutIsAlreadyUsed": "This shortcut is already used for: {conflict}",
|
||||
"resetToDefault": "Reset to default keybindings",
|
||||
"couldNotLoadErrorMsg": "Could not load shortcuts, Try again",
|
||||
"couldNotSaveErrorMsg": "Could not save shortcuts, Try again"
|
||||
"couldNotSaveErrorMsg": "Could not save shortcuts, Try again",
|
||||
"commands": {
|
||||
"codeBlockNewParagraph": "Insert a new paragraph next to the code block",
|
||||
"codeBlockAddTwoSpaces": "Insert two spaces at the line start in code block",
|
||||
"codeBlockDeleteTwoSpaces": "Delete two spaces at the line start in code block",
|
||||
"codeBlockSelectAll": "Select all content inside a code block",
|
||||
"codeBlockPasteText": "Paste text in codeblock",
|
||||
"textAlignLeft": "Align text to the left",
|
||||
"textAlignCenter": "Align text to the center",
|
||||
"textAlignRight": "Align text to the right"
|
||||
}
|
||||
},
|
||||
"mobile": {
|
||||
"personalInfo": "Personal Information",
|
||||
@ -835,6 +845,8 @@
|
||||
"discardResponse": "Do you want to discard the AI responses?",
|
||||
"createInlineMathEquation": "Create equation",
|
||||
"fonts": "Fonts",
|
||||
"insertDate": "Insert date",
|
||||
"emoji": "Emoji",
|
||||
"toggleList": "Toggle list",
|
||||
"quoteList": "Quote list",
|
||||
"numberedList": "Numbered list",
|
||||
|
@ -9,6 +9,7 @@
|
||||
"title": "Titre",
|
||||
"youCanAlso": "Vous pouvez aussi",
|
||||
"and": "et",
|
||||
"failedToOpenUrl": "Échec de l'ouverture de l'URL : {}",
|
||||
"blockActions": {
|
||||
"addBelowTooltip": "Cliquez pour ajouter ci-dessous",
|
||||
"addAboveCmd": "Alt+clic",
|
||||
@ -49,6 +50,7 @@
|
||||
"LogInWithGithub": "Se connecter avec Github",
|
||||
"LogInWithDiscord": "Se connecter avec Discord",
|
||||
"signInWith": "Se connecter avec :",
|
||||
"signInWithEmail": "Se connecter via e-mail",
|
||||
"loginAsGuestButtonText": "Commencer"
|
||||
},
|
||||
"workspace": {
|
||||
@ -64,7 +66,24 @@
|
||||
"reportIssueOnGithub": "Signaler un bug sur Github",
|
||||
"exportLogFiles": "Exporter les logs",
|
||||
"reachOut": "Contactez-nous sur Discord"
|
||||
}
|
||||
},
|
||||
"menuTitle": "Espaces de travail",
|
||||
"deleteWorkspaceHintText": "Êtes-vous sûr de vouloir supprimer l'espace de travail ? Cette action ne peut pas être annulée.",
|
||||
"createSuccess": "Espace de travail créé avec succès",
|
||||
"createFailed": "Échec de la création de l'espace de travail",
|
||||
"createLimitExceeded": "Vous avez atteint la limite maximale d'espace de travail autorisée pour votre compte. Si vous avez besoin d'espaces de travail supplémentaires pour continuer votre travail, veuillez en faire la demande sur Github.",
|
||||
"deleteSuccess": "Espace de travail supprimé avec succès",
|
||||
"deleteFailed": "Échec de la suppression de l'espace de travail",
|
||||
"openSuccess": "Ouverture de l'espace de travail réussie",
|
||||
"openFailed": "Échec de l'ouverture de l'espace de travail",
|
||||
"renameSuccess": "Espace de travail renommé avec succès",
|
||||
"renameFailed": "Échec du renommage de l'espace de travail",
|
||||
"updateIconSuccess": "L'icône de l'espace de travail a été mise à jour avec succès",
|
||||
"updateIconFailed": "La mise a jour de l'icône de l'espace de travail a échoué",
|
||||
"cannotDeleteTheOnlyWorkspace": "Impossible de supprimer le seul espace de travail",
|
||||
"fetchWorkspacesFailed": "Échec de la récupération des espaces de travail",
|
||||
"leaveCurrentWorkspace": "Quitter l'espace de travail",
|
||||
"leaveCurrentWorkspacePrompt": "Êtes-vous sûr de vouloir quitter l'espace de travail actuel ?"
|
||||
},
|
||||
"shareAction": {
|
||||
"buttonText": "Partager",
|
||||
@ -133,7 +152,8 @@
|
||||
"emptyDescription": "Vous n'avez aucun fichier supprimé",
|
||||
"isDeleted": "a été supprimé",
|
||||
"isRestored": "a été restauré"
|
||||
}
|
||||
},
|
||||
"confirmDeleteTitle": "Etes-vous sûr de vouloir supprimer définitivement cette page ?"
|
||||
},
|
||||
"deletePagePrompt": {
|
||||
"text": "Cette page se trouve dans la corbeille",
|
||||
@ -193,10 +213,16 @@
|
||||
"closeSidebar": "Fermer le menu latéral",
|
||||
"openSidebar": "Ouvrir le menu latéral",
|
||||
"personal": "Personnel",
|
||||
"private": "Privé",
|
||||
"public": "Publique",
|
||||
"favorites": "Favoris",
|
||||
"clickToHidePrivate": "Cliquez pour masquer l'espace privé\nLes pages que vous avez créées ici ne sont visibles que par vous",
|
||||
"clickToHidePublic": "Cliquez pour masquer l'espace public\nLes pages que vous avez créées ici sont visibles par tous les membres",
|
||||
"clickToHidePersonal": "Cliquez pour cacher la section personnelle",
|
||||
"clickToHideFavorites": "Cliquez pour cacher la section favorite",
|
||||
"addAPage": "Ajouter une page",
|
||||
"addAPageToPrivate": "Ajouter une page à l'espace privé",
|
||||
"addAPageToPublic": "Ajouter une page à l'espace public",
|
||||
"recent": "Récent"
|
||||
},
|
||||
"notifications": {
|
||||
@ -240,9 +266,18 @@
|
||||
"helpCenter": "Centre d'aide",
|
||||
"add": "Ajouter",
|
||||
"yes": "Oui",
|
||||
"clear": "Nettoyer",
|
||||
"remove": "Retirer",
|
||||
"dontRemove": "Ne pas retirer",
|
||||
"copyLink": "Copier le lien",
|
||||
"align": "Aligner",
|
||||
"login": "Se connecter",
|
||||
"logout": "Se déconnecter",
|
||||
"deleteAccount": "Supprimer le compte",
|
||||
"back": "Retour",
|
||||
"signInGoogle": "Se connecter avec Google",
|
||||
"signInGithub": "Se connecter avec Github",
|
||||
"signInDiscord": "Se connecter avec Discord",
|
||||
"tryAGain": "Réessayer"
|
||||
},
|
||||
"label": {
|
||||
@ -340,6 +375,7 @@
|
||||
"dark": "Mode sombre",
|
||||
"system": "S'adapter au système"
|
||||
},
|
||||
"fontScaleFactor": "Facteur d'échelle de police",
|
||||
"documentSettings": {
|
||||
"cursorColor": "Couleur du curseur du document",
|
||||
"selectionColor": "Couleur de sélection du document",
|
||||
@ -394,7 +430,9 @@
|
||||
"twentyFourHour": "Vingt-quatre heures"
|
||||
},
|
||||
"showNamingDialogWhenCreatingPage": "Afficher la boîte de dialogue de nommage lors de la création d'une page",
|
||||
"enableRTLToolbarItems": "Activer les éléments de la barre d'outils RTL",
|
||||
"members": {
|
||||
"title": "Paramètres des membres",
|
||||
"inviteMembers": "Inviter des membres",
|
||||
"sendInvite": "Envoyer une invitation",
|
||||
"copyInviteLink": "Copier le lien d'invitation",
|
||||
@ -408,7 +446,15 @@
|
||||
"memberHintText": "Un membre peut lire, commenter, et éditer des pages. Inviter des membres et des invités.",
|
||||
"guestHintText": "Un invité peut lire, réagir, commenter, et peut éditer certaines pages avec une permission",
|
||||
"emailInvalidError": "Email invalide, veuillez le vérifier et recommencer",
|
||||
"emailSent": "Email envoyé, veuillez vérifier dans votre boîte mail."
|
||||
"emailSent": "Email envoyé, veuillez vérifier dans votre boîte mail.",
|
||||
"members": "membres",
|
||||
"membersCount": {
|
||||
"zero": "{} membres",
|
||||
"one": "{} membre",
|
||||
"other": "{} membres"
|
||||
},
|
||||
"memberLimitExceeded": "Vous avez atteint la limite maximale de membres autorisée pour votre compte. Si vous souhaitez ajouter d'autres membres pour continuer votre travail, veuillez en faire la demande sur Github.",
|
||||
"failedToAddMember": "Échec de l'ajout d'un membre"
|
||||
}
|
||||
},
|
||||
"files": {
|
||||
|
@ -434,7 +434,17 @@
|
||||
"shortcutIsAlreadyUsed": "Este atalho já é usado para: {conflict}",
|
||||
"resetToDefault": "Redefinir para atalhos de teclado padrão",
|
||||
"couldNotLoadErrorMsg": "Não foi possível carregar os atalhos. Tente novamente",
|
||||
"couldNotSaveErrorMsg": "Não foi possível salvar os atalhos. Tente novamente"
|
||||
"couldNotSaveErrorMsg": "Não foi possível salvar os atalhos. Tente novamente",
|
||||
"commands": {
|
||||
"codeBlockNewParagraph": "Bloco de código: insirir um novo parágrafo",
|
||||
"codeBlockAddTwoSpaces": "Bloco de código: insirir dois espaços no início da linha",
|
||||
"codeBlockDeleteTwoSpaces": "Bloco de código: excluir dois espaços no início da linha",
|
||||
"codeBlockSelectAll": "Bloco de código: selecionar tudo",
|
||||
"codeBlockPasteText": "Bloco de códito: Colar texto",
|
||||
"textAlignLeft": "Alinhar texto à esquerda",
|
||||
"textAlignCenter": "Alinhar texto ao centro",
|
||||
"textAlignRight": "Alinhar texto à direita"
|
||||
}
|
||||
},
|
||||
"mobile": {
|
||||
"personalInfo": "Informações pessoais",
|
||||
@ -677,9 +687,9 @@
|
||||
"codeBlock": "Bloco de código"
|
||||
},
|
||||
"plugins": {
|
||||
"referencedBoard": "Quadro vinculado",
|
||||
"referencedGrid": "Grade vinculado",
|
||||
"referencedCalendar": "calendário referenciado",
|
||||
"referencedBoard": "Quadro referenciado",
|
||||
"referencedGrid": "Grade referenciada",
|
||||
"referencedCalendar": "Calendário referenciado",
|
||||
"referencedDocument": "Referenciar um documento",
|
||||
"autoGeneratorMenuItemName": "Gerar nome automaticamente",
|
||||
"autoGeneratorTitleName": "Gerar por IA",
|
||||
@ -707,6 +717,8 @@
|
||||
"bulletedList": "Lista com marcadores",
|
||||
"todoList": "Lista de afazeres",
|
||||
"callout": "Destacar",
|
||||
"insertDate": "Inserir data",
|
||||
"emoji": "Emoji",
|
||||
"cover": {
|
||||
"changeCover": "Mudar capa",
|
||||
"colors": "cores",
|
||||
|
@ -2,14 +2,14 @@
|
||||
"appName": "AppFlowy",
|
||||
"defaultUsername": "Jag",
|
||||
"welcomeText": "Välkommen till @:appName",
|
||||
"failedToOpenUrl": "Det gick inte att öppna webbadressen: {}",
|
||||
"welcomeTo": "Välkommen till",
|
||||
"githubStarText": "Stjärna på GitHub",
|
||||
"subscribeNewsletterText": "Prenumerera på nyhetsbrev",
|
||||
"letsGoButtonText": "Snabbstart",
|
||||
"title": "Titel",
|
||||
"welcomeTo": "Välkommen till",
|
||||
"youCanAlso": "Du kan också",
|
||||
"and": "och",
|
||||
"failedToOpenUrl": "Det gick inte att öppna webbadressen: {}",
|
||||
"blockActions": {
|
||||
"addBelowTooltip": "Klicka för att lägga till nedan",
|
||||
"addAboveCmd": "Alt+klicka",
|
||||
@ -34,17 +34,17 @@
|
||||
"signIn": {
|
||||
"loginTitle": "Logga in till @:appName",
|
||||
"loginButtonText": "Logga in",
|
||||
"loginStartWithAnonymous": "Börja med en anonym session",
|
||||
"continueAnonymousUser": "Fortsätt med en anonym session",
|
||||
"buttonText": "Registrera",
|
||||
"signingInText": "Loggar in...",
|
||||
"forgotPassword": "Glömt ditt lösenord?",
|
||||
"emailHint": "Epost",
|
||||
"passwordHint": "Lösenord",
|
||||
"dontHaveAnAccount": "Har du inget konto?",
|
||||
"repeatPasswordEmptyError": "Upprepat lösenord kan inte vara tomt",
|
||||
"unmatchedPasswordError": "Upprepat lösenord är inte samma som det första",
|
||||
"loginAsGuestButtonText": "Komma igång",
|
||||
"continueAnonymousUser": "Fortsätt med en anonym session",
|
||||
"loginStartWithAnonymous": "Börja med en anonym session",
|
||||
"signingInText": "Loggar in..."
|
||||
"loginAsGuestButtonText": "Komma igång"
|
||||
},
|
||||
"workspace": {
|
||||
"create": "Skapa arbetsyta",
|
||||
@ -167,7 +167,9 @@
|
||||
"editContact": "Redigera kontakt"
|
||||
},
|
||||
"button": {
|
||||
"ok": "OK",
|
||||
"done": "Gjort",
|
||||
"cancel": "Avbryt",
|
||||
"signIn": "Logga in",
|
||||
"signOut": "Logga ut",
|
||||
"complete": "Slutfört",
|
||||
@ -184,8 +186,6 @@
|
||||
"delete": "Radera",
|
||||
"duplicate": "Duplicera",
|
||||
"putback": "Ställ tillbaka",
|
||||
"ok": "OK",
|
||||
"cancel": "Avbryt",
|
||||
"update": "Uppdatering",
|
||||
"share": "Dela",
|
||||
"removeFromFavorites": "Ta bort från favoriter",
|
||||
@ -215,15 +215,15 @@
|
||||
},
|
||||
"oAuth": {
|
||||
"err": {
|
||||
"failedMsg": "Se till att du har slutfört inloggningsprocessen i din webbläsare.",
|
||||
"failedTitle": "Det går inte att ansluta till ditt konto."
|
||||
"failedTitle": "Det går inte att ansluta till ditt konto.",
|
||||
"failedMsg": "Se till att du har slutfört inloggningsprocessen i din webbläsare."
|
||||
},
|
||||
"google": {
|
||||
"title": "GOOGLE LOGGA IN",
|
||||
"instruction1": "För att kunna importera dina Google-kontakter måste du auktorisera denna applikation med din webbläsare.",
|
||||
"instruction2": "Kopiera den här koden till ditt urklipp genom att klicka på ikonen eller välja texten:",
|
||||
"instruction3": "Navigera till följande länk i din webbläsare och ange koden ovan:",
|
||||
"instruction4": "Tryck på knappen nedan när du har slutfört registreringen:",
|
||||
"title": "GOOGLE LOGGA IN"
|
||||
"instruction4": "Tryck på knappen nedan när du har slutfört registreringen:"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@ -233,53 +233,53 @@
|
||||
"language": "Språk",
|
||||
"user": "Användare",
|
||||
"files": "Filer",
|
||||
"notifications": "Aviseringar",
|
||||
"open": "Öppna Inställningar",
|
||||
"supabaseSetting": "Supabase-inställning",
|
||||
"appFlowyCloudUrlCanNotBeEmpty": "Molnets webbadress får inte vara tom",
|
||||
"changeServerTip": "När du har bytt server måste du klicka på omstartsknappen för att ändringarna ska träda i kraft",
|
||||
"clickToCopy": "Klicka för att kopiera",
|
||||
"clickToCopySecret": "Klicka för att kopiera hemlighet",
|
||||
"cloudLocal": "Lokal",
|
||||
"logout": "Logga ut",
|
||||
"logoutPrompt": "Är du säker på att logga ut?",
|
||||
"selfEncryptionLogoutPrompt": "Är du säker på att du vill logga ut? Se till att du har kopierat krypteringshemligheten",
|
||||
"syncSetting": "Synkroniseringsinställning",
|
||||
"cloudSettings": "Molninställningar",
|
||||
"enableSync": "Aktivera synkronisering",
|
||||
"enableEncrypt": "Kryptera data",
|
||||
"cloudURL": "Grund-URL",
|
||||
"invalidCloudURLScheme": "Ogiltigt schema",
|
||||
"cloudServerType": "Molnserver",
|
||||
"cloudServerTypeTip": "Observera att det kan logga ut ditt nuvarande konto efter att ha bytt molnserver",
|
||||
"cloudSettings": "Molninställningar",
|
||||
"cloudLocal": "Lokal",
|
||||
"cloudSupabase": "Supabase",
|
||||
"cloudSupabaseAnonKey": "Supabase anonym nyckel",
|
||||
"cloudSupabaseAnonKeyCanNotBeEmpty": "Anon-nyckeln kan inte vara tom",
|
||||
"cloudSupabaseUrl": "Supabase URL",
|
||||
"cloudSupabaseUrlCanNotBeEmpty": "Webbadressen för supabase kan inte vara tom",
|
||||
"cloudURL": "Grund-URL",
|
||||
"cloudSupabaseAnonKey": "Supabase anonym nyckel",
|
||||
"cloudSupabaseAnonKeyCanNotBeEmpty": "Anon-nyckeln kan inte vara tom",
|
||||
"appFlowyCloudUrlCanNotBeEmpty": "Molnets webbadress får inte vara tom",
|
||||
"clickToCopy": "Klicka för att kopiera",
|
||||
"selfHostStart": "Om du inte har en server, vänligen se",
|
||||
"selfHostContent": "dokument",
|
||||
"selfHostEnd": "för vägledning om hur du själv är värd för din egen server",
|
||||
"cloudURLHint": "Ange grundadressen till din server",
|
||||
"cloudWSURL": "Websocket URL",
|
||||
"cloudWSURLHint": "Infoga websocket-adressen till din server",
|
||||
"configServerGuide": "Efter att ha valt `Quick Start`, navigera till `Settings` och sedan \"Cloud Settings\" för att konfigurera din egen värdserver.",
|
||||
"configServerSetting": "Konfigurera dina serverinställningar",
|
||||
"customPathPrompt": "Att lagra AppFlowy-datamappen i en molnsynkroniserad mapp som Google Drive kan innebära risker. Om databasen i den här mappen nås eller ändras från flera platser samtidigt, kan det resultera i synkroniseringskonflikter och potentiell datakorruption",
|
||||
"enableEncrypt": "Kryptera data",
|
||||
"enableEncryptPrompt": "Aktivera kryptering för att säkra dina data med denna hemlighet. Förvara det säkert; när den väl är aktiverad kan den inte stängas av. Om din data går förlorad blir den omöjlig att återställa. Klicka för att kopiera",
|
||||
"enableSync": "Aktivera synkronisering",
|
||||
"historicalUserList": "Användarinloggningshistorik",
|
||||
"historicalUserListTooltip": "Den här listan visar dina anonyma konton. Du kan klicka på ett konto för att se dess detaljer. Anonyma konton skapas genom att klicka på knappen \"Kom igång\".",
|
||||
"importAppFlowyData": "Importera data från extern AppFlowy-mapp",
|
||||
"importAppFlowyDataDescription": "Kopiera data från en extern AppFlowy-datamapp och importera den till den aktuella AppFlowy-datamappen",
|
||||
"importFailed": "Det gick inte att importera AppFlowy-datamappen",
|
||||
"importGuide": "För ytterligare information, snälla se det refererade dokumentet",
|
||||
"importingAppFlowyDataTip": "Dataimport pågår. Stäng inte appen",
|
||||
"importSuccess": "AppFlowy-datamappen har importerats",
|
||||
"inputEncryptPrompt": "Vänligen ange din krypteringshemlighet för",
|
||||
"inputTextFieldHint": "Din hemlighet",
|
||||
"invalidCloudURLScheme": "Ogiltigt schema",
|
||||
"logout": "Logga ut",
|
||||
"logoutPrompt": "Är du säker på att logga ut?",
|
||||
"notifications": "Aviseringar",
|
||||
"openHistoricalUser": "Klicka för att öppna det anonyma kontot",
|
||||
"restartApp": "Omstart",
|
||||
"restartAppTip": "Starta om programmet för att ändringarna ska träda i kraft. Observera att detta kan logga ut ditt nuvarande konto",
|
||||
"selfEncryptionLogoutPrompt": "Är du säker på att du vill logga ut? Se till att du har kopierat krypteringshemligheten",
|
||||
"selfHostContent": "dokument",
|
||||
"selfHostEnd": "för vägledning om hur du själv är värd för din egen server",
|
||||
"selfHostStart": "Om du inte har en server, vänligen se",
|
||||
"syncSetting": "Synkroniseringsinställning"
|
||||
"changeServerTip": "När du har bytt server måste du klicka på omstartsknappen för att ändringarna ska träda i kraft",
|
||||
"enableEncryptPrompt": "Aktivera kryptering för att säkra dina data med denna hemlighet. Förvara det säkert; när den väl är aktiverad kan den inte stängas av. Om din data går förlorad blir den omöjlig att återställa. Klicka för att kopiera",
|
||||
"inputEncryptPrompt": "Vänligen ange din krypteringshemlighet för",
|
||||
"clickToCopySecret": "Klicka för att kopiera hemlighet",
|
||||
"configServerSetting": "Konfigurera dina serverinställningar",
|
||||
"configServerGuide": "Efter att ha valt `Quick Start`, navigera till `Settings` och sedan \"Cloud Settings\" för att konfigurera din egen värdserver.",
|
||||
"inputTextFieldHint": "Din hemlighet",
|
||||
"historicalUserList": "Användarinloggningshistorik",
|
||||
"historicalUserListTooltip": "Den här listan visar dina anonyma konton. Du kan klicka på ett konto för att se dess detaljer. Anonyma konton skapas genom att klicka på knappen \"Kom igång\".",
|
||||
"openHistoricalUser": "Klicka för att öppna det anonyma kontot",
|
||||
"customPathPrompt": "Att lagra AppFlowy-datamappen i en molnsynkroniserad mapp som Google Drive kan innebära risker. Om databasen i den här mappen nås eller ändras från flera platser samtidigt, kan det resultera i synkroniseringskonflikter och potentiell datakorruption",
|
||||
"importAppFlowyData": "Importera data från extern AppFlowy-mapp",
|
||||
"importingAppFlowyDataTip": "Dataimport pågår. Stäng inte appen",
|
||||
"importAppFlowyDataDescription": "Kopiera data från en extern AppFlowy-datamapp och importera den till den aktuella AppFlowy-datamappen",
|
||||
"importSuccess": "AppFlowy-datamappen har importerats",
|
||||
"importFailed": "Det gick inte att importera AppFlowy-datamappen",
|
||||
"importGuide": "För ytterligare information, snälla se det refererade dokumentet",
|
||||
"supabaseSetting": "Supabase-inställning"
|
||||
},
|
||||
"appearance": {
|
||||
"fontFamily": {
|
||||
@ -295,12 +295,12 @@
|
||||
"themeUpload": {
|
||||
"button": "Ladda upp",
|
||||
"description": "Ladda upp ditt eget AppFlowy-tema med knappen nedan.",
|
||||
"failure": "Temat som laddades upp hade ett ogiltigt format.",
|
||||
"loading": "Vänta medan vi validerar och laddar upp ditt tema...",
|
||||
"uploadSuccess": "Ditt tema laddades upp",
|
||||
"deletionFailure": "Det gick inte att ta bort temat. Försök att radera det manuellt.",
|
||||
"filePickerDialogTitle": "Välj en .flowy_plugin-fil",
|
||||
"urlUploadFailure": "Det gick inte att öppna webbadressen: {}"
|
||||
"urlUploadFailure": "Det gick inte att öppna webbadressen: {}",
|
||||
"failure": "Temat som laddades upp hade ett ogiltigt format."
|
||||
},
|
||||
"theme": "Tema",
|
||||
"builtInsLabel": "Inbyggda teman",
|
||||
@ -614,11 +614,11 @@
|
||||
}
|
||||
},
|
||||
"board": {
|
||||
"menuName": "Tavla",
|
||||
"referencedBoardPrefix": "Utsikt över",
|
||||
"column": {
|
||||
"createNewCard": "Nytt"
|
||||
}
|
||||
},
|
||||
"menuName": "Tavla",
|
||||
"referencedBoardPrefix": "Utsikt över"
|
||||
},
|
||||
"calendar": {
|
||||
"menuName": "Kalender",
|
||||
|
159
frontend/rust-lib/Cargo.lock
generated
159
frontend/rust-lib/Cargo.lock
generated
@ -157,7 +157,7 @@ checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
|
||||
[[package]]
|
||||
name = "app-error"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -669,7 +669,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "client-api"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"again",
|
||||
"anyhow",
|
||||
@ -690,7 +690,6 @@ dependencies = [
|
||||
"getrandom 0.2.10",
|
||||
"gotrue",
|
||||
"gotrue-entity",
|
||||
"governor",
|
||||
"mime",
|
||||
"parking_lot 0.12.1",
|
||||
"prost",
|
||||
@ -709,14 +708,13 @@ dependencies = [
|
||||
"url",
|
||||
"uuid",
|
||||
"wasm-bindgen-futures",
|
||||
"workspace-template",
|
||||
"yrs",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "client-websocket"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"futures-channel",
|
||||
"futures-util",
|
||||
@ -759,7 +757,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@ -783,7 +781,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-database"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@ -813,7 +811,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-document"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"collab",
|
||||
@ -832,7 +830,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bytes",
|
||||
@ -847,7 +845,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-folder"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@ -885,7 +883,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-plugins"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-stream",
|
||||
@ -924,7 +922,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-rt-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -949,7 +947,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-rt-protocol"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bincode",
|
||||
@ -963,7 +961,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "collab-user"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=5f66f8c921646d7d8762cafc8bbec72d56c2e157#5f66f8c921646d7d8762cafc8bbec72d56c2e157"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Collab?rev=352c55199449fbe321965fd42d2ff09ff54cf3f1#352c55199449fbe321965fd42d2ff09ff54cf3f1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"collab",
|
||||
@ -1037,9 +1035,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
|
||||
|
||||
[[package]]
|
||||
name = "cookie"
|
||||
version = "0.16.2"
|
||||
version = "0.17.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb"
|
||||
checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
|
||||
dependencies = [
|
||||
"percent-encoding",
|
||||
"time",
|
||||
@ -1048,12 +1046,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cookie_store"
|
||||
version = "0.16.2"
|
||||
version = "0.20.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa"
|
||||
checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6"
|
||||
dependencies = [
|
||||
"cookie",
|
||||
"idna 0.2.3",
|
||||
"idna 0.3.0",
|
||||
"log",
|
||||
"publicsuffix",
|
||||
"serde",
|
||||
@ -1261,6 +1259,7 @@ dependencies = [
|
||||
"flowy-user",
|
||||
"lazy_static",
|
||||
"lib-dispatch",
|
||||
"lib-log",
|
||||
"parking_lot 0.12.1",
|
||||
"protobuf",
|
||||
"serde",
|
||||
@ -1293,7 +1292,7 @@ checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
|
||||
[[package]]
|
||||
name = "database-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -2482,7 +2481,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "gotrue"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"futures-util",
|
||||
@ -2499,7 +2498,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "gotrue-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -2510,24 +2509,6 @@ dependencies = [
|
||||
"serde_json",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "governor"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "821239e5672ff23e2a7060901fa622950bbd80b649cdaadd78d1c1767ed14eb4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"dashmap",
|
||||
"futures",
|
||||
"futures-timer",
|
||||
"no-std-compat",
|
||||
"nonzero_ext",
|
||||
"parking_lot 0.12.1",
|
||||
"quanta",
|
||||
"rand 0.8.5",
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.3.21"
|
||||
@ -2784,17 +2765,6 @@ version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
|
||||
dependencies = [
|
||||
"matches",
|
||||
"unicode-bidi",
|
||||
"unicode-normalization",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "0.3.0"
|
||||
@ -2889,7 +2859,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "infra"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"reqwest",
|
||||
@ -3037,6 +3007,7 @@ version = "0.1.0"
|
||||
dependencies = [
|
||||
"chrono",
|
||||
"lazy_static",
|
||||
"lib-infra",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tracing",
|
||||
@ -3132,15 +3103,6 @@ version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
|
||||
|
||||
[[package]]
|
||||
name = "mach2"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "macroific"
|
||||
version = "1.3.1"
|
||||
@ -3211,12 +3173,6 @@ dependencies = [
|
||||
"regex-automata 0.1.10",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "matches"
|
||||
version = "0.1.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
|
||||
|
||||
[[package]]
|
||||
name = "matchit"
|
||||
version = "0.7.2"
|
||||
@ -3355,12 +3311,6 @@ version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
|
||||
|
||||
[[package]]
|
||||
name = "no-std-compat"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
|
||||
|
||||
[[package]]
|
||||
name = "nom"
|
||||
version = "7.1.3"
|
||||
@ -3371,12 +3321,6 @@ dependencies = [
|
||||
"minimal-lexical",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "nonzero_ext"
|
||||
version = "0.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
|
||||
|
||||
[[package]]
|
||||
name = "ntapi"
|
||||
version = "0.4.1"
|
||||
@ -4148,22 +4092,6 @@ dependencies = [
|
||||
"psl-types",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quanta"
|
||||
version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
"libc",
|
||||
"mach2",
|
||||
"once_cell",
|
||||
"raw-cpuid",
|
||||
"wasi 0.11.0+wasi-snapshot-preview1",
|
||||
"web-sys",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quickcheck"
|
||||
version = "1.0.3"
|
||||
@ -4321,15 +4249,6 @@ dependencies = [
|
||||
"rand_core 0.5.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "raw-cpuid"
|
||||
version = "10.7.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332"
|
||||
dependencies = [
|
||||
"bitflags 1.3.2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rayon"
|
||||
version = "1.9.0"
|
||||
@ -4456,9 +4375,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "reqwest"
|
||||
version = "0.11.23"
|
||||
version = "0.11.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41"
|
||||
checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
|
||||
dependencies = [
|
||||
"base64 0.21.5",
|
||||
"bytes",
|
||||
@ -4488,6 +4407,7 @@ dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper",
|
||||
"system-configuration",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
@ -4953,7 +4873,7 @@ dependencies = [
|
||||
[[package]]
|
||||
name = "shared-entity"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=4c002360698c978256ff324ebeed20506e79b3fc#4c002360698c978256ff324ebeed20506e79b3fc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"app-error",
|
||||
@ -6123,9 +6043,9 @@ checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
|
||||
|
||||
[[package]]
|
||||
name = "wasm-streams"
|
||||
version = "0.3.0"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7"
|
||||
checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
|
||||
dependencies = [
|
||||
"futures-util",
|
||||
"js-sys",
|
||||
@ -6388,27 +6308,6 @@ dependencies = [
|
||||
"windows-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "workspace-template"
|
||||
version = "0.1.0"
|
||||
source = "git+https://github.com/AppFlowy-IO/AppFlowy-Cloud?rev=aa4df32f6d3b53bec5e3715f5abfe4fb9079021b#aa4df32f6d3b53bec5e3715f5abfe4fb9079021b"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
"bytes",
|
||||
"collab",
|
||||
"collab-document",
|
||||
"collab-entity",
|
||||
"collab-folder",
|
||||
"getrandom 0.2.10",
|
||||
"indexmap 2.1.0",
|
||||
"nanoid",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tokio",
|
||||
"uuid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wyz"
|
||||
version = "0.5.1"
|
||||
|
@ -111,7 +111,7 @@ rocksdb = { git = "https://github.com/LucasXu0/rust-rocksdb", rev = "21cf4a23ec1
|
||||
# Run the script.add_workspace_members:
|
||||
# scripts/tool/update_client_api_rev.sh new_rev_id
|
||||
# ⚠️⚠️⚠️️
|
||||
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "aa4df32f6d3b53bec5e3715f5abfe4fb9079021b" }
|
||||
client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "4c002360698c978256ff324ebeed20506e79b3fc" }
|
||||
# Please use the following script to update collab.
|
||||
# Working directory: frontend
|
||||
#
|
||||
@ -121,10 +121,10 @@ client-api = { git = "https://github.com/AppFlowy-IO/AppFlowy-Cloud", rev = "aa4
|
||||
# To switch to the local path, run:
|
||||
# scripts/tool/update_collab_source.sh
|
||||
# ⚠️⚠️⚠️️
|
||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" }
|
||||
collab = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
|
||||
|
@ -24,6 +24,7 @@ crossbeam-utils = "0.8.15"
|
||||
lazy_static = "1.4.0"
|
||||
parking_lot.workspace = true
|
||||
tracing.workspace = true
|
||||
lib-log.workspace = true
|
||||
|
||||
# workspace
|
||||
lib-dispatch = { workspace = true }
|
||||
|
@ -11,6 +11,8 @@ const uint8_t *sync_event(const uint8_t *input, uintptr_t len);
|
||||
|
||||
int32_t set_stream_port(int64_t port);
|
||||
|
||||
int32_t set_log_stream_port(int64_t port);
|
||||
|
||||
void link_me_please(void);
|
||||
|
||||
void rust_log(int64_t level, const char *data);
|
||||
|
@ -15,6 +15,7 @@ pub struct AppFlowyDartConfiguration {
|
||||
pub custom_app_path: String,
|
||||
pub origin_app_path: String,
|
||||
pub device_id: String,
|
||||
pub platform: String,
|
||||
pub authenticator_type: AuthenticatorType,
|
||||
pub(crate) supabase_config: SupabaseConfiguration,
|
||||
pub(crate) appflowy_cloud_config: AFCloudConfiguration,
|
||||
|
@ -1,5 +1,6 @@
|
||||
#![allow(clippy::not_unsafe_ptr_arg_deref)]
|
||||
|
||||
use allo_isolate::Isolate;
|
||||
use std::sync::Arc;
|
||||
use std::{ffi::CStr, os::raw::c_char};
|
||||
|
||||
@ -14,6 +15,7 @@ use flowy_server_pub::AuthenticatorType;
|
||||
use lib_dispatch::prelude::ToBytes;
|
||||
use lib_dispatch::prelude::*;
|
||||
use lib_dispatch::runtime::AFPluginRuntime;
|
||||
use lib_log::stream_log::StreamLogSender;
|
||||
|
||||
use crate::appflowy_yaml::save_appflowy_cloud_config;
|
||||
use crate::env_serde::AppFlowyDartConfiguration;
|
||||
@ -32,6 +34,7 @@ mod protobuf;
|
||||
|
||||
lazy_static! {
|
||||
static ref APPFLOWY_CORE: MutexAppFlowyCore = MutexAppFlowyCore::new();
|
||||
static ref LOG_STREAM_ISOLATE: Mutex<Option<Isolate>> = Mutex::new(None);
|
||||
}
|
||||
|
||||
struct MutexAppFlowyCore(Arc<Mutex<Option<AppFlowyCore>>>);
|
||||
@ -69,6 +72,7 @@ pub extern "C" fn init_sdk(_port: i64, data: *mut c_char) -> i64 {
|
||||
configuration.custom_app_path,
|
||||
configuration.origin_app_path,
|
||||
configuration.device_id,
|
||||
configuration.platform,
|
||||
DEFAULT_NAME.to_string(),
|
||||
);
|
||||
|
||||
@ -80,9 +84,15 @@ pub extern "C" fn init_sdk(_port: i64, data: *mut c_char) -> i64 {
|
||||
|
||||
let runtime = Arc::new(AFPluginRuntime::new().unwrap());
|
||||
let cloned_runtime = runtime.clone();
|
||||
|
||||
let log_stream = LOG_STREAM_ISOLATE
|
||||
.lock()
|
||||
.take()
|
||||
.map(|isolate| Arc::new(LogStreamSenderImpl { isolate }) as Arc<dyn StreamLogSender>);
|
||||
|
||||
// let isolate = allo_isolate::Isolate::new(port);
|
||||
*APPFLOWY_CORE.0.lock() = runtime.block_on(async move {
|
||||
Some(AppFlowyCore::new(config, cloned_runtime).await)
|
||||
Some(AppFlowyCore::new(config, cloned_runtime, log_stream).await)
|
||||
// isolate.post("".to_string());
|
||||
});
|
||||
0
|
||||
@ -140,10 +150,23 @@ pub extern "C" fn sync_event(input: *const u8, len: usize) -> *const u8 {
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn set_stream_port(port: i64) -> i32 {
|
||||
pub extern "C" fn set_stream_port(notification_port: i64) -> i32 {
|
||||
// Make sure hot reload won't register the notification sender twice
|
||||
unregister_all_notification_sender();
|
||||
register_notification_sender(DartNotificationSender::new(port));
|
||||
register_notification_sender(DartNotificationSender::new(notification_port));
|
||||
0
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub extern "C" fn set_log_stream_port(port: i64) -> i32 {
|
||||
*LOG_STREAM_ISOLATE.lock() = Some(Isolate::new(port));
|
||||
|
||||
LOG_STREAM_ISOLATE
|
||||
.lock()
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.post("hello log".to_string().as_bytes().to_vec());
|
||||
|
||||
0
|
||||
}
|
||||
|
||||
@ -227,3 +250,12 @@ pub extern "C" fn rust_log(level: i64, data: *const c_char) {
|
||||
pub extern "C" fn set_env(_data: *const c_char) {
|
||||
// Deprecated
|
||||
}
|
||||
|
||||
struct LogStreamSenderImpl {
|
||||
isolate: Isolate,
|
||||
}
|
||||
impl StreamLogSender for LogStreamSenderImpl {
|
||||
fn send(&self, message: &[u8]) {
|
||||
self.isolate.post(message.to_vec());
|
||||
}
|
||||
}
|
||||
|
@ -54,7 +54,14 @@ impl EventIntegrationTest {
|
||||
let path = path_buf.to_str().unwrap().to_string();
|
||||
let device_id = uuid::Uuid::new_v4().to_string();
|
||||
|
||||
let config = AppFlowyCoreConfig::new("".to_string(), path.clone(), path, device_id, name)
|
||||
let config = AppFlowyCoreConfig::new(
|
||||
"".to_string(),
|
||||
path.clone(),
|
||||
path,
|
||||
device_id,
|
||||
"test".to_string(),
|
||||
name,
|
||||
)
|
||||
.log_filter(
|
||||
"trace",
|
||||
vec![
|
||||
@ -142,7 +149,7 @@ async fn init_core(config: AppFlowyCoreConfig) -> AppFlowyCore {
|
||||
std::thread::spawn(|| {
|
||||
let runtime = Arc::new(AFPluginRuntime::new().unwrap());
|
||||
let cloned_runtime = runtime.clone();
|
||||
runtime.block_on(async move { AppFlowyCore::new(config, cloned_runtime).await })
|
||||
runtime.block_on(async move { AppFlowyCore::new(config, cloned_runtime, None).await })
|
||||
})
|
||||
.join()
|
||||
.unwrap()
|
||||
|
@ -284,6 +284,7 @@ async fn assert_040_local_2_import_content(test: &EventIntegrationTest, view_id:
|
||||
assert_json_include!(actual: json!(data), expected: expected_doc_1_json());
|
||||
|
||||
// // Check doc 1 remote content
|
||||
// TODO(natan): enable these following lines
|
||||
// let doc_1_doc_state = test
|
||||
// .get_collab_doc_state(&doc_1.id, CollabType::Document)
|
||||
// .await
|
||||
@ -297,15 +298,17 @@ async fn assert_040_local_2_import_content(test: &EventIntegrationTest, view_id:
|
||||
assert_json_include!(actual: json!(data), expected: expected_doc_2_json());
|
||||
|
||||
// Check doc 2 remote content
|
||||
// TODO(natan): enable these following lines
|
||||
// let doc_2_doc_state = test.get_document_doc_state(&doc_2.id).await;
|
||||
// assert_json_include!(actual:document_data_from_document_doc_state(&doc_2.id, doc_2_doc_state), expected: expected_doc_2_json());
|
||||
|
||||
let grid_1 = local_2_getting_started_child_views[2].clone();
|
||||
assert_eq!(grid_1.name, "Grid1");
|
||||
assert_eq!(
|
||||
test.get_database_export_data(&grid_1.id).await,
|
||||
"Name,Type,Done\n1,A,Yes\n2,,Yes\n3,,No\n"
|
||||
);
|
||||
// TODO(natan): enable these following lines
|
||||
// assert_eq!(
|
||||
// test.get_database_export_data(&grid_1.id).await,
|
||||
// "Name,Type,Done\n1,A,Yes\n2,,Yes\n3,,No\n"
|
||||
// );
|
||||
|
||||
assert_eq!(local_2_getting_started_child_views[3].name, "Doc3");
|
||||
|
||||
@ -318,10 +321,12 @@ async fn assert_040_local_2_import_content(test: &EventIntegrationTest, view_id:
|
||||
|
||||
let doc3_grid_2 = doc_3_child_views[1].clone();
|
||||
assert_eq!(doc3_grid_2.name, "doc3_grid_2");
|
||||
assert_eq!(
|
||||
test.get_database_export_data(&doc3_grid_2.id).await,
|
||||
"Name,Type,Done\n1,A,Yes\n2,,\n,,\n"
|
||||
);
|
||||
|
||||
// TODO(natan): enable these following lines
|
||||
// assert_eq!(
|
||||
// test.get_database_export_data(&doc3_grid_2.id).await,
|
||||
// "Name,Type,Done\n1,A,Yes\n2,,\n,,\n"
|
||||
// );
|
||||
assert_eq!(doc_3_child_views[2].name, "doc3_calendar_1");
|
||||
}
|
||||
|
||||
|
@ -29,7 +29,7 @@ collab = { version = "0.1.0" }
|
||||
diesel.workspace = true
|
||||
uuid.workspace = true
|
||||
flowy-storage = { workspace = true }
|
||||
client-api = { version = "0.1.0", features = ["collab-sync", "template"] }
|
||||
client-api = { version = "0.1.0" }
|
||||
|
||||
tracing.workspace = true
|
||||
futures-core = { version = "0.3", default-features = false }
|
||||
@ -68,4 +68,9 @@ ts = [
|
||||
]
|
||||
rev-sqlite = ["flowy-user/rev-sqlite"]
|
||||
openssl_vendored = ["flowy-sqlite/openssl_vendored"]
|
||||
verbose_log = ["flowy-document/verbose_log", "client-api/sync_verbose_log"]
|
||||
|
||||
# Enable/Disable AppFlowy Verbose Log Configuration
|
||||
verbose_log = [
|
||||
# "flowy-document/verbose_log",
|
||||
"client-api/sync_verbose_log"
|
||||
]
|
@ -8,6 +8,7 @@ use flowy_server_pub::af_cloud_config::AFCloudConfiguration;
|
||||
use flowy_server_pub::supabase_config::SupabaseConfiguration;
|
||||
use flowy_user::services::entities::URL_SAFE_ENGINE;
|
||||
use lib_infra::file_util::copy_dir_recursive;
|
||||
use lib_infra::util::Platform;
|
||||
|
||||
use crate::integrate::log::create_log_filter;
|
||||
|
||||
@ -17,6 +18,7 @@ pub struct AppFlowyCoreConfig {
|
||||
pub(crate) app_version: String,
|
||||
pub(crate) name: String,
|
||||
pub(crate) device_id: String,
|
||||
pub platform: String,
|
||||
/// Used to store the user data
|
||||
pub storage_path: String,
|
||||
/// Origin application path is the path of the application binary. By default, the
|
||||
@ -77,6 +79,7 @@ impl AppFlowyCoreConfig {
|
||||
custom_application_path: String,
|
||||
application_path: String,
|
||||
device_id: String,
|
||||
platform: String,
|
||||
name: String,
|
||||
) -> Self {
|
||||
let cloud_config = AFCloudConfiguration::from_env().ok();
|
||||
@ -90,6 +93,7 @@ impl AppFlowyCoreConfig {
|
||||
},
|
||||
Some(config) => make_user_data_folder(&custom_application_path, &config.base_url),
|
||||
};
|
||||
let log_filter = create_log_filter("info".to_owned(), vec![], Platform::from(&platform));
|
||||
|
||||
AppFlowyCoreConfig {
|
||||
app_version,
|
||||
@ -97,13 +101,18 @@ impl AppFlowyCoreConfig {
|
||||
storage_path,
|
||||
application_path,
|
||||
device_id,
|
||||
log_filter: create_log_filter("info".to_owned(), vec![]),
|
||||
platform,
|
||||
log_filter,
|
||||
cloud_config,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn log_filter(mut self, level: &str, with_crates: Vec<String>) -> Self {
|
||||
self.log_filter = create_log_filter(level.to_owned(), with_crates);
|
||||
self.log_filter = create_log_filter(
|
||||
level.to_owned(),
|
||||
with_crates,
|
||||
Platform::from(&self.platform),
|
||||
);
|
||||
self
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,16 @@
|
||||
use lib_infra::util::Platform;
|
||||
use lib_log::stream_log::StreamLogSender;
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::AppFlowyCoreConfig;
|
||||
|
||||
static INIT_LOG: AtomicBool = AtomicBool::new(false);
|
||||
pub(crate) fn init_log(config: &AppFlowyCoreConfig) {
|
||||
pub(crate) fn init_log(
|
||||
config: &AppFlowyCoreConfig,
|
||||
platform: &Platform,
|
||||
stream_log_sender: Option<Arc<dyn StreamLogSender>>,
|
||||
) {
|
||||
#[cfg(debug_assertions)]
|
||||
if get_bool_from_env_var("DISABLE_CI_TEST_LOG") {
|
||||
return;
|
||||
@ -12,14 +19,24 @@ pub(crate) fn init_log(config: &AppFlowyCoreConfig) {
|
||||
if !INIT_LOG.load(Ordering::SeqCst) {
|
||||
INIT_LOG.store(true, Ordering::SeqCst);
|
||||
|
||||
let _ = lib_log::Builder::new("log", &config.storage_path)
|
||||
let _ = lib_log::Builder::new("log", &config.storage_path, platform, stream_log_sender)
|
||||
.env_filter(&config.log_filter)
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn create_log_filter(level: String, with_crates: Vec<String>) -> String {
|
||||
let level = std::env::var("RUST_LOG").unwrap_or(level);
|
||||
pub(crate) fn create_log_filter(
|
||||
level: String,
|
||||
with_crates: Vec<String>,
|
||||
platform: Platform,
|
||||
) -> String {
|
||||
let mut level = std::env::var("RUST_LOG").unwrap_or(level);
|
||||
|
||||
#[cfg(debug_assertions)]
|
||||
if matches!(platform, Platform::IOS) {
|
||||
level = "trace".to_string();
|
||||
}
|
||||
|
||||
let mut filters = with_crates
|
||||
.into_iter()
|
||||
.map(|crate_name| format!("{}={}", crate_name, level))
|
||||
|
@ -20,6 +20,8 @@ use flowy_user::user_manager::UserManager;
|
||||
use lib_dispatch::prelude::*;
|
||||
use lib_dispatch::runtime::AFPluginRuntime;
|
||||
use lib_infra::priority_task::{TaskDispatcher, TaskRunner};
|
||||
use lib_infra::util::Platform;
|
||||
use lib_log::stream_log::StreamLogSender;
|
||||
use module::make_plugins;
|
||||
|
||||
use crate::config::AppFlowyCoreConfig;
|
||||
@ -53,16 +55,13 @@ pub struct AppFlowyCore {
|
||||
}
|
||||
|
||||
impl AppFlowyCore {
|
||||
pub async fn new(config: AppFlowyCoreConfig, runtime: Arc<AFPluginRuntime>) -> Self {
|
||||
Self::init(config, runtime).await
|
||||
}
|
||||
pub async fn new(
|
||||
config: AppFlowyCoreConfig,
|
||||
runtime: Arc<AFPluginRuntime>,
|
||||
stream_log_sender: Option<Arc<dyn StreamLogSender>>,
|
||||
) -> Self {
|
||||
let platform = Platform::from(&config.platform);
|
||||
|
||||
pub fn close_db(&self) {
|
||||
self.user_manager.close_db();
|
||||
}
|
||||
|
||||
#[instrument(skip(config, runtime))]
|
||||
async fn init(config: AppFlowyCoreConfig, runtime: Arc<AFPluginRuntime>) -> Self {
|
||||
#[allow(clippy::if_same_then_else)]
|
||||
if cfg!(debug_assertions) {
|
||||
/// The profiling can be used to tracing the performance of the application.
|
||||
@ -73,15 +72,29 @@ impl AppFlowyCore {
|
||||
|
||||
// Init the logger before anything else
|
||||
#[cfg(not(feature = "profiling"))]
|
||||
init_log(&config);
|
||||
init_log(&config, &platform, stream_log_sender);
|
||||
} else {
|
||||
init_log(&config);
|
||||
init_log(&config, &platform, stream_log_sender);
|
||||
}
|
||||
|
||||
info!(
|
||||
"💡{:?}, platform: {:?}",
|
||||
System::long_os_version(),
|
||||
platform
|
||||
);
|
||||
|
||||
Self::init(config, runtime).await
|
||||
}
|
||||
|
||||
pub fn close_db(&self) {
|
||||
self.user_manager.close_db();
|
||||
}
|
||||
|
||||
#[instrument(skip(config, runtime))]
|
||||
async fn init(config: AppFlowyCoreConfig, runtime: Arc<AFPluginRuntime>) -> Self {
|
||||
// Init the key value database
|
||||
let store_preference = Arc::new(StorePreferences::new(&config.storage_path).unwrap());
|
||||
info!("🔥{:?}", &config);
|
||||
info!("💡System info: {:?}", System::long_os_version());
|
||||
|
||||
let task_scheduler = TaskDispatcher::new(Duration::from_secs(2));
|
||||
let task_dispatcher = Arc::new(RwLock::new(task_scheduler));
|
||||
|
@ -55,4 +55,6 @@ tauri_ts = ["flowy-codegen/ts"]
|
||||
web_ts = [
|
||||
"flowy-codegen/ts",
|
||||
]
|
||||
|
||||
# search "Enable/Disable AppFlowy Verbose Log" to find the place that can enable verbose log
|
||||
verbose_log = ["collab-document/verbose_log"]
|
||||
|
@ -12,7 +12,7 @@ use std::{
|
||||
ops::{Deref, DerefMut},
|
||||
sync::Arc,
|
||||
};
|
||||
use tracing::{instrument, trace, warn};
|
||||
use tracing::{instrument, warn};
|
||||
|
||||
/// This struct wrap the document::Document
|
||||
#[derive(Clone)]
|
||||
@ -67,7 +67,9 @@ fn subscribe_document_changed(doc_id: &str, document: &MutexDocument) {
|
||||
document
|
||||
.lock()
|
||||
.subscribe_block_changed(move |events, is_remote| {
|
||||
trace!("subscribe_document_changed: {:?}", events);
|
||||
#[cfg(feature = "verbose_log")]
|
||||
tracing::trace!("subscribe_document_changed: {:?}", events);
|
||||
|
||||
// send notification to the client.
|
||||
send_notification(
|
||||
&doc_id_clone_for_block_changed,
|
||||
@ -79,7 +81,8 @@ fn subscribe_document_changed(doc_id: &str, document: &MutexDocument) {
|
||||
|
||||
let doc_id_clone_for_awareness_state = doc_id.to_owned();
|
||||
document.lock().subscribe_awareness_state(move |events| {
|
||||
trace!("subscribe_awareness_state: {:?}", events);
|
||||
#[cfg(feature = "verbose_log")]
|
||||
tracing::trace!("subscribe_awareness_state: {:?}", events);
|
||||
send_notification(
|
||||
&doc_id_clone_for_awareness_state,
|
||||
DocumentNotification::DidUpdateDocumentAwarenessState,
|
||||
|
@ -51,7 +51,6 @@ pub struct FolderCollabParams {
|
||||
pub object_id: String,
|
||||
pub encoded_collab_v1: Vec<u8>,
|
||||
pub collab_type: CollabType,
|
||||
pub override_if_exist: bool,
|
||||
}
|
||||
|
||||
pub struct FolderSnapshot {
|
||||
|
@ -508,16 +508,14 @@ impl FolderManager {
|
||||
let view_id = view_id.to_string();
|
||||
let folder = self.mutex_folder.lock();
|
||||
let folder = folder.as_ref().ok_or_else(folder_not_init_error)?;
|
||||
let trash_ids = folder
|
||||
.get_all_trash_sections()
|
||||
.into_iter()
|
||||
.map(|trash| trash.id)
|
||||
.collect::<Vec<String>>();
|
||||
|
||||
if trash_ids.contains(&view_id) {
|
||||
// trash views and other private views should not be accessed
|
||||
let view_ids_should_be_filtered = self.get_view_ids_should_be_filtered(folder);
|
||||
|
||||
if view_ids_should_be_filtered.contains(&view_id) {
|
||||
return Err(FlowyError::new(
|
||||
ErrorCode::RecordNotFound,
|
||||
format!("View:{} is in trash", view_id),
|
||||
format!("View:{} is in trash or other private section", view_id),
|
||||
));
|
||||
}
|
||||
|
||||
@ -531,7 +529,7 @@ impl FolderManager {
|
||||
.views
|
||||
.get_views_belong_to(&view.id)
|
||||
.into_iter()
|
||||
.filter(|view| !trash_ids.contains(&view.id))
|
||||
.filter(|view| !view_ids_should_be_filtered.contains(&view.id))
|
||||
.collect::<Vec<_>>();
|
||||
let view_pb = view_pb_with_child_views(view, child_views);
|
||||
Ok(view_pb)
|
||||
|
@ -55,6 +55,7 @@ version = "0.1.0"
|
||||
features = [
|
||||
"collab-sync",
|
||||
"test_util",
|
||||
"enable_brotli",
|
||||
# Uncomment the following line to enable verbose logging for sync
|
||||
# "sync_verbose_log",
|
||||
]
|
||||
@ -65,7 +66,6 @@ tracing-subscriber = { version = "0.3.3", features = ["env-filter"] }
|
||||
dotenv = "0.15.0"
|
||||
assert-json-diff = "2.0.2"
|
||||
serde_json.workspace = true
|
||||
client-api = { version = "0.1.0" }
|
||||
|
||||
[features]
|
||||
enable_supabase = ["collab-plugins/postgres_plugin"]
|
@ -157,7 +157,6 @@ where
|
||||
object_id: object.object_id,
|
||||
encoded_collab_v1: object.encoded_collab_v1,
|
||||
collab_type: object.collab_type,
|
||||
override_if_exist: object.override_if_exist,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
try_get_client?
|
||||
|
@ -333,7 +333,6 @@ where
|
||||
&self,
|
||||
collab_object: &CollabObject,
|
||||
data: Vec<u8>,
|
||||
override_if_exist: bool,
|
||||
) -> FutureResult<(), FlowyError> {
|
||||
let try_get_client = self.server.try_get_client();
|
||||
let collab_object = collab_object.clone();
|
||||
@ -344,7 +343,6 @@ where
|
||||
object_id: collab_object.object_id.clone(),
|
||||
encoded_collab_v1: data,
|
||||
collab_type: collab_object.collab_type.clone(),
|
||||
override_if_exist,
|
||||
};
|
||||
client.create_collab(params).await?;
|
||||
Ok(())
|
||||
@ -365,7 +363,6 @@ where
|
||||
object_id: object.object_id,
|
||||
encoded_collab_v1: object.encoded_collab,
|
||||
collab_type: object.collab_type,
|
||||
override_if_exist: false,
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
try_get_client?
|
||||
|
@ -166,7 +166,6 @@ impl UserCloudService for LocalServerUserAuthServiceImpl {
|
||||
&self,
|
||||
_collab_object: &CollabObject,
|
||||
_data: Vec<u8>,
|
||||
_override_if_exist: bool,
|
||||
) -> FutureResult<(), FlowyError> {
|
||||
FutureResult::new(async { Ok(()) })
|
||||
}
|
||||
|
@ -333,7 +333,6 @@ where
|
||||
&self,
|
||||
collab_object: &CollabObject,
|
||||
data: Vec<u8>,
|
||||
_override_if_exist: bool,
|
||||
) -> FutureResult<(), FlowyError> {
|
||||
let try_get_postgrest = self.server.try_get_weak_postgrest();
|
||||
let cloned_collab_object = collab_object.clone();
|
||||
|
@ -252,7 +252,6 @@ pub trait UserCloudService: Send + Sync + 'static {
|
||||
&self,
|
||||
collab_object: &CollabObject,
|
||||
data: Vec<u8>,
|
||||
override_if_exist: bool,
|
||||
) -> FutureResult<(), FlowyError>;
|
||||
|
||||
fn batch_create_collab_object(
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user