Merge branch 'main' into workspace-invite

This commit is contained in:
Zack Fu Zi Xiang 2024-04-08 14:12:02 +08:00
commit 2d68960b69
No known key found for this signature in database
124 changed files with 1158 additions and 992 deletions

View File

@ -86,6 +86,7 @@ jobs:
model: 'iPhone 15' model: 'iPhone 15'
shutdown_after_job: false shutdown_after_job: false
- name: Run integration tests # enable it again if the 12 mins timeout is fixed
working-directory: frontend/appflowy_flutter # - name: Run integration tests
run: flutter test integration_test/runner.dart -d ${{ steps.simulator-action.outputs.udid }} # working-directory: frontend/appflowy_flutter
# run: flutter test integration_test/runner.dart -d ${{ steps.simulator-action.outputs.udid }}

View File

@ -4,6 +4,7 @@ import 'dart:io';
import 'package:appflowy/env/cloud_env.dart'; import 'package:appflowy/env/cloud_env.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
import 'package:appflowy/shared/feature_flags.dart'; import 'package:appflowy/shared/feature_flags.dart';
import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/user/application/auth/af_cloud_mock_auth_service.dart'; import 'package:appflowy/user/application/auth/af_cloud_mock_auth_service.dart';
@ -51,33 +52,23 @@ void main() {
await tester.expectToSeeHomePageWithGetStartedPage(); await tester.expectToSeeHomePageWithGetStartedPage();
const name = 'AppFlowy.IO'; const name = 'AppFlowy.IO';
// the workspace will be opened after created
await tester.createCollaborativeWorkspace(name); await tester.createCollaborativeWorkspace(name);
// see the success message final loading = find.byType(Loading);
var success = find.text(LocaleKeys.workspace_createSuccess.tr()); await tester.pumpUntilNotFound(loading);
expect(success, findsOneWidget);
await tester.pumpUntilNotFound(success);
// check the create result Finder success;
// delete the newly created workspace
await tester.openCollaborativeWorkspaceMenu(); await tester.openCollaborativeWorkspaceMenu();
var items = find.byType(WorkspaceMenuItem); final Finder items = find.byType(WorkspaceMenuItem);
expect(items, findsNWidgets(2)); expect(items, findsNWidgets(2));
expect( expect(
tester.widget<WorkspaceMenuItem>(items.last).workspace.name, tester.widget<WorkspaceMenuItem>(items.last).workspace.name,
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; final secondWorkspace = find.byType(WorkspaceMenuItem).last;
await tester.hoverOnWidget( await tester.hoverOnWidget(
secondWorkspace, secondWorkspace,
@ -97,20 +88,11 @@ void main() {
await tester.tapButton(find.text(LocaleKeys.button_ok.tr())); await tester.tapButton(find.text(LocaleKeys.button_ok.tr()));
// delete success // delete success
success = find.text(LocaleKeys.workspace_createSuccess.tr()); success = find.text(LocaleKeys.workspace_createSuccess.tr());
await tester.pumpUntilFound(success);
expect(success, findsOneWidget); expect(success, findsOneWidget);
await tester.pumpUntilNotFound(success); 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();
}); });
}); });
} }

View File

@ -180,7 +180,11 @@ extension AppFlowyTestBase on WidgetTester {
buttons: buttons, buttons: buttons,
warnIfMissed: warnIfMissed, warnIfMissed: warnIfMissed,
); );
await pumpAndSettle(Duration(milliseconds: milliseconds)); await pumpAndSettle(
Duration(milliseconds: milliseconds),
EnginePhase.sendSemanticsUpdate,
const Duration(seconds: 5),
);
} }
Future<void> tapButtonWithName( Future<void> tapButtonWithName(

View File

@ -528,7 +528,7 @@ extension CommonOperations on WidgetTester {
final workspace = find.byType(SidebarWorkspace); final workspace = find.byType(SidebarWorkspace);
expect(workspace, findsOneWidget); expect(workspace, findsOneWidget);
// click it // click it
await tapButton(workspace); await tapButton(workspace, milliseconds: 2000);
} }
Future<void> closeCollaborativeWorkspaceMenu() async { Future<void> closeCollaborativeWorkspaceMenu() async {
@ -560,7 +560,6 @@ extension CommonOperations on WidgetTester {
// input the workspace name // input the workspace name
await enterText(find.byType(TextField), name); await enterText(find.byType(TextField), name);
await pumpAndSettle();
await tapButtonWithName(LocaleKeys.button_ok.tr()); await tapButtonWithName(LocaleKeys.button_ok.tr());
} }

View File

@ -11,6 +11,7 @@ class AppFlowyConfiguration {
required this.custom_app_path, required this.custom_app_path,
required this.origin_app_path, required this.origin_app_path,
required this.device_id, required this.device_id,
required this.platform,
required this.authenticator_type, required this.authenticator_type,
required this.supabase_config, required this.supabase_config,
required this.appflowy_cloud_config, required this.appflowy_cloud_config,
@ -25,6 +26,7 @@ class AppFlowyConfiguration {
final String custom_app_path; final String custom_app_path;
final String origin_app_path; final String origin_app_path;
final String device_id; final String device_id;
final String platform;
final int authenticator_type; final int authenticator_type;
final SupabaseConfiguration supabase_config; final SupabaseConfiguration supabase_config;
final AppFlowyCloudConfiguration appflowy_cloud_config; final AppFlowyCloudConfiguration appflowy_cloud_config;

View File

@ -69,7 +69,7 @@ class MobileFolders extends StatelessWidget {
...isCollaborativeWorkspace ...isCollaborativeWorkspace
? [ ? [
MobileSectionFolder( MobileSectionFolder(
title: LocaleKeys.sideBar_public.tr(), title: LocaleKeys.sideBar_workspace.tr(),
categoryType: FolderCategoryType.public, categoryType: FolderCategoryType.public,
views: state.section.publicViews, views: state.section.publicViews,
), ),

View File

@ -31,6 +31,7 @@ class MobileWorkspaceMenu extends StatelessWidget {
final workspace = workspaces[i]; final workspace = workspaces[i];
children.add( children.add(
_WorkspaceMenuItem( _WorkspaceMenuItem(
key: ValueKey(workspace.workspaceId),
userProfile: userProfile, userProfile: userProfile,
workspace: workspace, workspace: workspace,
showTopBorder: i == 0, showTopBorder: i == 0,
@ -47,6 +48,7 @@ class MobileWorkspaceMenu extends StatelessWidget {
class _WorkspaceMenuItem extends StatelessWidget { class _WorkspaceMenuItem extends StatelessWidget {
const _WorkspaceMenuItem({ const _WorkspaceMenuItem({
super.key,
required this.userProfile, required this.userProfile,
required this.workspace, required this.workspace,
required this.showTopBorder, required this.showTopBorder,

View File

@ -30,9 +30,9 @@ class DatabaseSyncBloc extends Bloc<DatabaseSyncEvent, DatabaseSyncBlocState> {
.then((value) => value.fold((s) => s, (f) => null)); .then((value) => value.fold((s) => s, (f) => null));
emit( emit(
state.copyWith( state.copyWith(
shouldShowIndicator: shouldShowIndicator: userProfile?.authenticator ==
userProfile?.authenticator != AuthenticatorPB.Local && AuthenticatorPB.AppFlowyCloud &&
databaseId != null, databaseId != null,
), ),
); );
if (databaseId != null) { if (databaseId != null) {

View File

@ -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_generator/color_generator.dart';
import 'package:appflowy/util/color_to_hex_string.dart'; import 'package:appflowy/util/color_to_hex_string.dart';
import 'package:appflowy/util/debounce.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/workspace/application/view/view_listener.dart';
import 'package:appflowy_backend/protobuf/flowy-document/entities.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-document/entities.pb.dart';
import 'package:appflowy_backend/protobuf/flowy-document/protobuf.dart'; import 'package:appflowy_backend/protobuf/flowy-document/protobuf.dart';
@ -66,7 +67,7 @@ class DocumentBloc extends Bloc<DocumentEvent, DocumentState> {
StreamSubscription? _transactionSubscription; StreamSubscription? _transactionSubscription;
final _updateSelectionDebounce = Debounce(); final _updateSelectionDebounce = Debounce();
final _syncDocDebounce = Debounce(); final _syncThrottle = Throttler(duration: const Duration(milliseconds: 500));
bool get isLocalMode { bool get isLocalMode {
final userProfilePB = state.userProfilePB; final userProfilePB = state.userProfilePB;
@ -155,7 +156,7 @@ class DocumentBloc extends Bloc<DocumentEvent, DocumentState> {
/// subscribe to the document content change /// subscribe to the document content change
void _onDocumentChanged() { void _onDocumentChanged() {
_documentListener.start( _documentListener.start(
onDocEventUpdate: _debounceSyncDoc, onDocEventUpdate: _throttleSyncDoc,
onDocAwarenessUpdate: _onAwarenessStatesUpdate, onDocAwarenessUpdate: _onAwarenessStatesUpdate,
); );
@ -290,8 +291,8 @@ class DocumentBloc extends Bloc<DocumentEvent, DocumentState> {
_updateSelectionDebounce.call(_onSelectionUpdate); _updateSelectionDebounce.call(_onSelectionUpdate);
} }
void _debounceSyncDoc(DocEventPB docEvent) { void _throttleSyncDoc(DocEventPB docEvent) {
_syncDocDebounce.call(() { _syncThrottle.call(() {
_onDocumentStateUpdate(docEvent); _onDocumentStateUpdate(docEvent);
}); });
} }

View File

@ -77,17 +77,30 @@ class DocumentCollabAdapter {
final ops = diffNodes(editorState.document.root, document.root); final ops = diffNodes(editorState.document.root, document.root);
if (ops.isEmpty) { if (ops.isEmpty) {
debugPrint('[collab] received empty ops'); Log.info('Doc diff, no changes');
return; return;
} }
debugPrint('[collab] received ops: $ops'); prettyPrintJson(ops.map((op) => op.toJson()).toList());
final transaction = editorState.transaction; final transaction = editorState.transaction;
for (final op in ops) { for (final op in ops) {
transaction.add(op); transaction.add(op);
} }
await editorState.apply(transaction, isRemote: true); 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( Future<void> _syncUpdated(

View File

@ -32,7 +32,7 @@ class DocumentCollaboratorsBloc
emit( emit(
state.copyWith( state.copyWith(
shouldShowIndicator: shouldShowIndicator:
userProfile?.authenticator != AuthenticatorPB.Local, userProfile?.authenticator == AuthenticatorPB.AppFlowyCloud,
), ),
); );
final deviceId = ApplicationInfo.deviceId; final deviceId = ApplicationInfo.deviceId;

View File

@ -31,7 +31,7 @@ class DocumentSyncBloc extends Bloc<DocumentSyncEvent, DocumentSyncBlocState> {
emit( emit(
state.copyWith( state.copyWith(
shouldShowIndicator: shouldShowIndicator:
userProfile?.authenticator != AuthenticatorPB.Local, userProfile?.authenticator == AuthenticatorPB.AppFlowyCloud,
), ),
); );
_syncStateListener.start( _syncStateListener.start(

View File

@ -145,7 +145,7 @@ class DocumentPluginWidgetBuilder extends PluginWidgetBuilder
? [ ? [
DocumentCollaborators( DocumentCollaborators(
key: ValueKey('collaborators_${view.id}'), key: ValueKey('collaborators_${view.id}'),
width: 100, width: 150,
height: 32, height: 32,
view: view, view: view,
), ),

View File

@ -39,17 +39,12 @@ class _DocumentPageState extends State<DocumentPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
// The appflowy editor use Intl as localization, set the default language as fallback.
Intl.defaultLocale = 'en_US';
EditorNotification.addListener(_onEditorNotification); EditorNotification.addListener(_onEditorNotification);
} }
@override @override
void dispose() { void dispose() {
EditorNotification.removeListener(_onEditorNotification); EditorNotification.removeListener(_onEditorNotification);
super.dispose(); super.dispose();
} }

View File

@ -13,6 +13,7 @@ class CollaboratorAvatarStack extends StatelessWidget {
this.borderWidth, this.borderWidth,
this.borderColor, this.borderColor,
this.backgroundColor, this.backgroundColor,
required this.plusWidgetBuilder,
}); });
final List<Widget> avatars; final List<Widget> avatars;
@ -31,13 +32,16 @@ class CollaboratorAvatarStack extends StatelessWidget {
final Color? backgroundColor; final Color? backgroundColor;
final Widget Function(int value, BorderSide border) plusWidgetBuilder;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final settings = this.settings ?? final settings = this.settings ??
RestrictedPositions( RestrictedPositions(
maxCoverage: 0.3, maxCoverage: 0.3,
minCoverage: 0.1, minCoverage: 0.2,
align: StackAlign.right, align: StackAlign.right,
laying: StackLaying.first,
); );
final border = BorderSide( final border = BorderSide(
@ -45,27 +49,12 @@ class CollaboratorAvatarStack extends StatelessWidget {
width: borderWidth ?? 2.0, 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( return SizedBox(
height: height, height: height,
width: width, width: width,
child: WidgetStack( child: WidgetStack(
positions: settings, positions: settings,
buildInfoWidget: infoWidgetBuilder, buildInfoWidget: (value) => plusWidgetBuilder(value, border),
stackedWidgets: avatars stackedWidgets: avatars
.map( .map(
(avatar) => CircleAvatar( (avatar) => CircleAvatar(

View File

@ -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/plugins/document/presentation/collaborator_avater_stack.dart';
import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart'; import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
import 'package:appflowy_editor/appflowy_editor.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/flowy_infra_ui.dart';
import 'package:flowy_infra_ui/widget/flowy_tooltip.dart'; import 'package:flowy_infra_ui/widget/flowy_tooltip.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -41,8 +42,30 @@ class DocumentCollaborators extends StatelessWidget {
height: height, height: height,
width: width, width: width,
borderWidth: 1.0, borderWidth: 1.0,
backgroundColor: plusWidgetBuilder: (value, border) {
Theme.of(context).colorScheme.onSecondaryContainer, 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 avatars: collaborators
.map( .map(
(c) => FlowyTooltip( (c) => FlowyTooltip(

View File

@ -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/plugins/document/presentation/editor_plugins/plugins.dart';
import 'package:appflowy_editor/appflowy_editor.dart'; import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
final List<CommandShortcutEvent> customTextAlignCommands = [ final List<CommandShortcutEvent> customTextAlignCommands = [
@ -19,7 +21,7 @@ final List<CommandShortcutEvent> customTextAlignCommands = [
final CommandShortcutEvent customTextLeftAlignCommand = CommandShortcutEvent( final CommandShortcutEvent customTextLeftAlignCommand = CommandShortcutEvent(
key: 'Align text to the left', key: 'Align text to the left',
command: 'ctrl+shift+l', command: 'ctrl+shift+l',
getDescription: () => 'Align text to the left', getDescription: LocaleKeys.settings_shortcuts_commands_textAlignLeft.tr,
handler: (editorState) => _textAlignHandler(editorState, leftAlignmentKey), handler: (editorState) => _textAlignHandler(editorState, leftAlignmentKey),
); );
@ -34,7 +36,7 @@ final CommandShortcutEvent customTextLeftAlignCommand = CommandShortcutEvent(
final CommandShortcutEvent customTextCenterAlignCommand = CommandShortcutEvent( final CommandShortcutEvent customTextCenterAlignCommand = CommandShortcutEvent(
key: 'Align text to the center', key: 'Align text to the center',
command: 'ctrl+shift+e', command: 'ctrl+shift+e',
getDescription: () => 'Align text to the center', getDescription: LocaleKeys.settings_shortcuts_commands_textAlignCenter.tr,
handler: (editorState) => _textAlignHandler(editorState, centerAlignmentKey), handler: (editorState) => _textAlignHandler(editorState, centerAlignmentKey),
); );
@ -49,7 +51,7 @@ final CommandShortcutEvent customTextCenterAlignCommand = CommandShortcutEvent(
final CommandShortcutEvent customTextRightAlignCommand = CommandShortcutEvent( final CommandShortcutEvent customTextRightAlignCommand = CommandShortcutEvent(
key: 'Align text to the right', key: 'Align text to the right',
command: 'ctrl+shift+r', command: 'ctrl+shift+r',
getDescription: () => 'Align text to the right', getDescription: LocaleKeys.settings_shortcuts_commands_textAlignRight.tr,
handler: (editorState) => _textAlignHandler(editorState, rightAlignmentKey), handler: (editorState) => _textAlignHandler(editorState, rightAlignmentKey),
); );

View File

@ -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/generated/locale_keys.g.dart';
import 'package:appflowy_editor/appflowy_editor.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:easy_localization/easy_localization.dart' hide TextDirection;
import 'package:flowy_infra/theme_extension.dart'; import 'package:flowy_infra/theme_extension.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.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 // defining the callout block menu item in selection menu
SelectionMenuItem calloutItem = SelectionMenuItem.node( SelectionMenuItem calloutItem = SelectionMenuItem.node(
getName: () => LocaleKeys.document_plugins_callout.tr(), getName: LocaleKeys.document_plugins_callout.tr,
iconData: Icons.note, iconData: Icons.note,
keywords: [CalloutBlockKeys.type], keywords: [CalloutBlockKeys.type],
nodeBuilder: (editorState, context) => nodeBuilder: (editorState, context) =>

View File

@ -107,7 +107,7 @@ Node codeBlockNode({
// defining the callout block menu item for selection // defining the callout block menu item for selection
SelectionMenuItem codeBlockItem = SelectionMenuItem.node( SelectionMenuItem codeBlockItem = SelectionMenuItem.node(
getName: () => LocaleKeys.document_selectionMenu_codeBlock.tr(), getName: LocaleKeys.document_selectionMenu_codeBlock.tr,
iconData: Icons.abc, iconData: Icons.abc,
keywords: ['code', 'codeblock'], keywords: ['code', 'codeblock'],
nodeBuilder: (editorState, _) => codeBlockNode(), nodeBuilder: (editorState, _) => codeBlockNode(),

View File

@ -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/plugins/document/presentation/editor_plugins/plugins.dart';
import 'package:appflowy_editor/appflowy_editor.dart'; import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
final List<CharacterShortcutEvent> codeBlockCharacterEvents = [ final List<CharacterShortcutEvent> codeBlockCharacterEvents = [
@ -59,7 +61,8 @@ final CommandShortcutEvent insertNewParagraphNextToCodeBlockCommand =
CommandShortcutEvent( CommandShortcutEvent(
key: 'insert a new paragraph next to the code block', key: 'insert a new paragraph next to the code block',
command: 'shift+enter', command: 'shift+enter',
getDescription: () => 'Insert a new paragraph next to the code block', getDescription:
LocaleKeys.settings_shortcuts_commands_codeBlockNewParagraph.tr,
handler: _insertNewParagraphNextToCodeBlockCommandHandler, handler: _insertNewParagraphNextToCodeBlockCommandHandler,
); );
@ -72,7 +75,8 @@ final CommandShortcutEvent tabToInsertSpacesInCodeBlockCommand =
CommandShortcutEvent( CommandShortcutEvent(
key: 'tab to insert two spaces at the line start in code block', key: 'tab to insert two spaces at the line start in code block',
command: 'tab', command: 'tab',
getDescription: () => 'Insert two spaces at the line start in code block', getDescription:
LocaleKeys.settings_shortcuts_commands_codeBlockAddTwoSpaces.tr,
handler: _tabToInsertSpacesInCodeBlockCommandHandler, handler: _tabToInsertSpacesInCodeBlockCommandHandler,
); );
@ -85,7 +89,8 @@ final CommandShortcutEvent tabToDeleteSpacesInCodeBlockCommand =
CommandShortcutEvent( CommandShortcutEvent(
key: 'shift + tab to delete two spaces at the line start in code block', key: 'shift + tab to delete two spaces at the line start in code block',
command: 'shift+tab', command: 'shift+tab',
getDescription: () => 'Delete two spaces at the line start in code block', getDescription:
LocaleKeys.settings_shortcuts_commands_codeBlockDeleteTwoSpaces.tr,
handler: _tabToDeleteSpacesInCodeBlockCommandHandler, handler: _tabToDeleteSpacesInCodeBlockCommandHandler,
); );
@ -98,7 +103,7 @@ final CommandShortcutEvent selectAllInCodeBlockCommand = CommandShortcutEvent(
key: 'ctrl + a to select all content inside a code block', key: 'ctrl + a to select all content inside a code block',
command: 'ctrl+a', command: 'ctrl+a',
macOSCommand: 'meta+a', macOSCommand: 'meta+a',
getDescription: () => 'Select all content inside a code block', getDescription: LocaleKeys.settings_shortcuts_commands_codeBlockSelectAll.tr,
handler: _selectAllInCodeBlockCommandHandler, handler: _selectAllInCodeBlockCommandHandler,
); );
@ -111,7 +116,7 @@ final CommandShortcutEvent pasteInCodeblock = CommandShortcutEvent(
key: 'paste in codeblock', key: 'paste in codeblock',
command: 'ctrl+v', command: 'ctrl+v',
macOSCommand: 'cmd+v', macOSCommand: 'cmd+v',
getDescription: () => 'Paste text in codeblock', getDescription: LocaleKeys.settings_shortcuts_commands_codeBlockPasteText.tr,
handler: _pasteInCodeBlock, handler: _pasteInCodeBlock,
); );

View File

@ -6,15 +6,15 @@ import 'package:easy_localization/easy_localization.dart';
final List<List<ContextMenuItem>> customContextMenuItems = [ final List<List<ContextMenuItem>> customContextMenuItems = [
[ [
ContextMenuItem( ContextMenuItem(
getName: () => LocaleKeys.document_plugins_contextMenu_copy.tr(), getName: LocaleKeys.document_plugins_contextMenu_copy.tr,
onPressed: (editorState) => customCopyCommand.execute(editorState), onPressed: (editorState) => customCopyCommand.execute(editorState),
), ),
ContextMenuItem( ContextMenuItem(
getName: () => LocaleKeys.document_plugins_contextMenu_paste.tr(), getName: LocaleKeys.document_plugins_contextMenu_paste.tr,
onPressed: (editorState) => customPasteCommand.execute(editorState), onPressed: (editorState) => customPasteCommand.execute(editorState),
), ),
ContextMenuItem( ContextMenuItem(
getName: () => LocaleKeys.document_plugins_contextMenu_cut.tr(), getName: LocaleKeys.document_plugins_contextMenu_cut.tr,
onPressed: (editorState) => customCutCommand.execute(editorState), onPressed: (editorState) => customCutCommand.execute(editorState),
), ),
], ],

View File

@ -13,8 +13,8 @@ import 'package:flutter/material.dart';
/// - mobile /// - mobile
/// ///
final CommandShortcutEvent customCopyCommand = CommandShortcutEvent( final CommandShortcutEvent customCopyCommand = CommandShortcutEvent(
key: 'copy the selected content (with formatting)', key: 'copy the selected content',
getDescription: () => 'copy the selected content (with formatting)', getDescription: () => AppFlowyEditorL10n.current.cmdCopySelection,
command: 'ctrl+c', command: 'ctrl+c',
macOSCommand: 'cmd+c', macOSCommand: 'cmd+c',
handler: _copyCommandHandler, handler: _copyCommandHandler,

View File

@ -11,8 +11,8 @@ import 'package:flutter/material.dart';
/// - mobile /// - mobile
/// ///
final CommandShortcutEvent customCutCommand = CommandShortcutEvent( final CommandShortcutEvent customCutCommand = CommandShortcutEvent(
key: 'cut the selected content (with formatting)', key: 'cut the selected content',
getDescription: () => 'cut the selected content (with formatting)', getDescription: () => AppFlowyEditorL10n.current.cmdCutSelection,
command: 'ctrl+x', command: 'ctrl+x',
macOSCommand: 'cmd+x', macOSCommand: 'cmd+x',
handler: _cutCommandHandler, handler: _cutCommandHandler,

View File

@ -18,8 +18,8 @@ import 'package:string_validator/string_validator.dart';
/// - mobile /// - mobile
/// ///
final CommandShortcutEvent customPasteCommand = CommandShortcutEvent( final CommandShortcutEvent customPasteCommand = CommandShortcutEvent(
key: 'paste the content (with formatting)', key: 'paste the content',
getDescription: () => 'paste the content (with formatting)', getDescription: () => AppFlowyEditorL10n.current.cmdPasteContent,
command: 'ctrl+v', command: 'ctrl+v',
macOSCommand: 'cmd+v', macOSCommand: 'cmd+v',
handler: _pasteCommandHandler, handler: _pasteCommandHandler,

View File

@ -10,7 +10,7 @@ import 'package:easy_localization/easy_localization.dart';
SelectionMenuItem inlineGridMenuItem(DocumentBloc documentBloc) => SelectionMenuItem inlineGridMenuItem(DocumentBloc documentBloc) =>
SelectionMenuItem( SelectionMenuItem(
getName: () => LocaleKeys.document_slashMenu_grid_createANewGrid.tr(), getName: LocaleKeys.document_slashMenu_grid_createANewGrid.tr,
icon: (editorState, onSelected, style) => SelectableSvgWidget( icon: (editorState, onSelected, style) => SelectableSvgWidget(
data: FlowySvgs.grid_s, data: FlowySvgs.grid_s,
isSelected: onSelected, isSelected: onSelected,
@ -31,7 +31,7 @@ SelectionMenuItem inlineGridMenuItem(DocumentBloc documentBloc) =>
SelectionMenuItem inlineBoardMenuItem(DocumentBloc documentBloc) => SelectionMenuItem inlineBoardMenuItem(DocumentBloc documentBloc) =>
SelectionMenuItem( SelectionMenuItem(
getName: () => LocaleKeys.document_slashMenu_board_createANewBoard.tr(), getName: LocaleKeys.document_slashMenu_board_createANewBoard.tr,
icon: (editorState, onSelected, style) => SelectableSvgWidget( icon: (editorState, onSelected, style) => SelectableSvgWidget(
data: FlowySvgs.board_s, data: FlowySvgs.board_s,
isSelected: onSelected, isSelected: onSelected,
@ -52,8 +52,7 @@ SelectionMenuItem inlineBoardMenuItem(DocumentBloc documentBloc) =>
SelectionMenuItem inlineCalendarMenuItem(DocumentBloc documentBloc) => SelectionMenuItem inlineCalendarMenuItem(DocumentBloc documentBloc) =>
SelectionMenuItem( SelectionMenuItem(
getName: () => getName: LocaleKeys.document_slashMenu_calendar_createANewCalendar.tr,
LocaleKeys.document_slashMenu_calendar_createANewCalendar.tr(),
icon: (editorState, onSelected, style) => SelectableSvgWidget( icon: (editorState, onSelected, style) => SelectableSvgWidget(
data: FlowySvgs.date_s, data: FlowySvgs.date_s,
isSelected: onSelected, isSelected: onSelected,

View File

@ -9,7 +9,7 @@ import 'package:easy_localization/easy_localization.dart';
// Document Reference // Document Reference
SelectionMenuItem referencedDocumentMenuItem = SelectionMenuItem( SelectionMenuItem referencedDocumentMenuItem = SelectionMenuItem(
getName: () => LocaleKeys.document_plugins_referencedDocument.tr(), getName: LocaleKeys.document_plugins_referencedDocument.tr,
icon: (editorState, onSelected, style) => SelectableSvgWidget( icon: (editorState, onSelected, style) => SelectableSvgWidget(
data: FlowySvgs.document_s, data: FlowySvgs.document_s,
isSelected: onSelected, isSelected: onSelected,
@ -23,7 +23,7 @@ SelectionMenuItem referencedDocumentMenuItem = SelectionMenuItem(
// Database References // Database References
SelectionMenuItem referencedGridMenuItem = SelectionMenuItem( SelectionMenuItem referencedGridMenuItem = SelectionMenuItem(
getName: () => LocaleKeys.document_plugins_referencedGrid.tr(), getName: LocaleKeys.document_plugins_referencedGrid.tr,
icon: (editorState, onSelected, style) => SelectableSvgWidget( icon: (editorState, onSelected, style) => SelectableSvgWidget(
data: FlowySvgs.grid_s, data: FlowySvgs.grid_s,
isSelected: onSelected, isSelected: onSelected,
@ -35,7 +35,7 @@ SelectionMenuItem referencedGridMenuItem = SelectionMenuItem(
); );
SelectionMenuItem referencedBoardMenuItem = SelectionMenuItem( SelectionMenuItem referencedBoardMenuItem = SelectionMenuItem(
getName: () => LocaleKeys.document_plugins_referencedBoard.tr(), getName: LocaleKeys.document_plugins_referencedBoard.tr,
icon: (editorState, onSelected, style) => SelectableSvgWidget( icon: (editorState, onSelected, style) => SelectableSvgWidget(
data: FlowySvgs.board_s, data: FlowySvgs.board_s,
isSelected: onSelected, isSelected: onSelected,
@ -47,7 +47,7 @@ SelectionMenuItem referencedBoardMenuItem = SelectionMenuItem(
); );
SelectionMenuItem referencedCalendarMenuItem = SelectionMenuItem( SelectionMenuItem referencedCalendarMenuItem = SelectionMenuItem(
getName: () => LocaleKeys.document_plugins_referencedCalendar.tr(), getName: LocaleKeys.document_plugins_referencedCalendar.tr,
icon: (editorState, onSelected, style) => SelectableSvgWidget( icon: (editorState, onSelected, style) => SelectableSvgWidget(
data: FlowySvgs.date_s, data: FlowySvgs.date_s,
isSelected: onSelected, isSelected: onSelected,

View File

@ -36,7 +36,7 @@ Node mathEquationNode({
// defining the callout block menu item for selection // defining the callout block menu item for selection
SelectionMenuItem mathEquationItem = SelectionMenuItem.node( SelectionMenuItem mathEquationItem = SelectionMenuItem.node(
getName: () => LocaleKeys.document_plugins_mathEquation_name.tr(), getName: LocaleKeys.document_plugins_mathEquation_name.tr,
iconData: Icons.text_fields_rounded, iconData: Icons.text_fields_rounded,
keywords: ['tex, latex, katex', 'math equation', 'formula'], keywords: ['tex, latex, katex', 'math equation', 'formula'],
nodeBuilder: (editorState, _) => mathEquationNode(), nodeBuilder: (editorState, _) => mathEquationNode(),

View File

@ -258,11 +258,11 @@ class _MentionDateBlockState extends State<MentionDateBlock> {
} }
DateTime _parseTime(String timeStr, UserTimeFormatPB timeFormat) { DateTime _parseTime(String timeStr, UserTimeFormatPB timeFormat) {
final twelveHourFormat = DateFormat('HH:mm a'); final twelveHourFormat = DateFormat('hh:mm a');
final twentyFourHourFormat = DateFormat('HH:mm'); final twentyFourHourFormat = DateFormat('HH:mm');
try { try {
if (timeFormat == TimeFormatPB.TwelveHour) { if (timeFormat == UserTimeFormatPB.TwelveHour) {
return twelveHourFormat.parseStrict(timeStr); return twelveHourFormat.parseStrict(timeStr);
} }

View File

@ -5,7 +5,7 @@ import 'package:appflowy_editor/appflowy_editor.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
SelectionMenuItem dateMenuItem = SelectionMenuItem( SelectionMenuItem dateMenuItem = SelectionMenuItem(
getName: () => LocaleKeys.document_plugins_date.tr(), getName: LocaleKeys.document_plugins_insertDate.tr,
icon: (_, isSelected, style) => FlowySvg( icon: (_, isSelected, style) => FlowySvg(
FlowySvgs.date_s, FlowySvgs.date_s,
color: isSelected color: isSelected

View File

@ -43,7 +43,7 @@ Node autoCompletionNode({
} }
SelectionMenuItem autoGeneratorMenuItem = SelectionMenuItem.node( SelectionMenuItem autoGeneratorMenuItem = SelectionMenuItem.node(
getName: () => LocaleKeys.document_plugins_autoGeneratorMenuItemName.tr(), getName: LocaleKeys.document_plugins_autoGeneratorMenuItemName.tr,
iconData: Icons.generating_tokens, iconData: Icons.generating_tokens,
keywords: ['ai', 'openai' 'writer', 'autogenerator'], keywords: ['ai', 'openai' 'writer', 'autogenerator'],
nodeBuilder: (editorState, _) { nodeBuilder: (editorState, _) {

View File

@ -3,7 +3,7 @@ import 'package:flutter/material.dart';
class Loading { class Loading {
Loading(this.context); Loading(this.context);
late BuildContext loadingContext; BuildContext? loadingContext;
final BuildContext context; final BuildContext context;
Future<void> start() async => showDialog<void>( 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 { class BarrierDialog {

View File

@ -19,7 +19,7 @@ class OutlineBlockKeys {
// defining the callout block menu item for selection // defining the callout block menu item for selection
SelectionMenuItem outlineItem = SelectionMenuItem.node( SelectionMenuItem outlineItem = SelectionMenuItem.node(
getName: () => LocaleKeys.document_selectionMenu_outline.tr(), getName: LocaleKeys.document_selectionMenu_outline.tr,
iconData: Icons.list_alt, iconData: Icons.list_alt,
keywords: ['outline', 'table of contents'], keywords: ['outline', 'table of contents'],
nodeBuilder: (editorState, _) => outlineBlockNode(), nodeBuilder: (editorState, _) => outlineBlockNode(),

View File

@ -46,7 +46,7 @@ Node toggleListBlockNode({
// defining the toggle list block menu item // defining the toggle list block menu item
SelectionMenuItem toggleListBlockItem = SelectionMenuItem.node( SelectionMenuItem toggleListBlockItem = SelectionMenuItem.node(
getName: () => LocaleKeys.document_plugins_toggleList.tr(), getName: LocaleKeys.document_plugins_toggleList.tr,
iconData: Icons.arrow_right, iconData: Icons.arrow_right,
keywords: ['collapsed list', 'toggle list', 'list'], keywords: ['collapsed list', 'toggle list', 'list'],
nodeBuilder: (editorState, _) => toggleListBlockNode(), nodeBuilder: (editorState, _) => toggleListBlockNode(),

View File

@ -110,7 +110,7 @@ CharacterShortcutEvent insertChildNodeInsideToggleList = CharacterShortcutEvent(
// toggle the todo list // toggle the todo list
final CommandShortcutEvent toggleToggleListCommand = CommandShortcutEvent( final CommandShortcutEvent toggleToggleListCommand = CommandShortcutEvent(
key: 'toggle the toggle list', key: 'toggle the toggle list',
getDescription: () => 'Toggle the toggle list', getDescription: () => AppFlowyEditorL10n.current.cmdToggleTodoList,
command: 'ctrl+enter', command: 'ctrl+enter',
macOSCommand: 'cmd+enter', macOSCommand: 'cmd+enter',
handler: _toggleToggleListCommandHandler, handler: _toggleToggleListCommandHandler,

View File

@ -5,6 +5,7 @@ import 'package:appflowy/env/backend_env.dart';
import 'package:appflowy/env/cloud_env.dart'; import 'package:appflowy/env/cloud_env.dart';
import 'package:appflowy/user/application/auth/device_id.dart'; import 'package:appflowy/user/application/auth/device_id.dart';
import 'package:appflowy_backend/appflowy_backend.dart'; import 'package:appflowy_backend/appflowy_backend.dart';
import 'package:flutter/foundation.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path; import 'package:path/path.dart' as path;
@ -28,6 +29,7 @@ class InitRustSDKTask extends LaunchTask {
final dir = customApplicationPath ?? applicationPath; final dir = customApplicationPath ?? applicationPath;
final deviceId = await getDeviceId(); final deviceId = await getDeviceId();
debugPrint('application path: ${applicationPath.path}');
// Pass the environment variables to the Rust SDK // Pass the environment variables to the Rust SDK
final env = _makeAppFlowyConfiguration( final env = _makeAppFlowyConfiguration(
root.path, root.path,
@ -59,6 +61,7 @@ AppFlowyConfiguration _makeAppFlowyConfiguration(
custom_app_path: customAppPath, custom_app_path: customAppPath,
origin_app_path: originAppPath, origin_app_path: originAppPath,
device_id: deviceId, device_id: deviceId,
platform: Platform.operatingSystem,
authenticator_type: env.authenticatorType.value, authenticator_type: env.authenticatorType.value,
supabase_config: env.supabaseConfig, supabase_config: env.supabaseConfig,
appflowy_cloud_config: env.appflowyCloudConfig, appflowy_cloud_config: env.appflowyCloudConfig,

View File

@ -1,7 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/material.dart';
class Debounce { class Debounce {
Debounce({ Debounce({
this.duration = const Duration(milliseconds: 1000), this.duration = const Duration(milliseconds: 1000),
@ -10,8 +8,9 @@ class Debounce {
final Duration duration; final Duration duration;
Timer? _timer; Timer? _timer;
void call(VoidCallback action) { void call(Function action) {
dispose(); dispose();
_timer = Timer(duration, () { _timer = Timer(duration, () {
action(); action();
}); });

View 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;
}
}

View File

@ -1,5 +1,9 @@
import 'dart:async'; 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_sections_listener.dart';
import 'package:appflowy/workspace/application/workspace/workspace_service.dart'; import 'package:appflowy/workspace/application/workspace/workspace_service.dart';
import 'package:appflowy_backend/log.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( const factory SidebarSectionsEvent.receiveSectionViewsUpdate(
SectionViewsPB sectionViews, SectionViewsPB sectionViews,
) = _ReceiveSectionViewsUpdate; ) = _ReceiveSectionViewsUpdate;
const factory SidebarSectionsEvent.reload(
UserProfilePB userProfile,
String workspaceId,
) = _Reload;
} }
@freezed @freezed

View File

@ -10,6 +10,8 @@ import 'package:appflowy/workspace/application/settings/appearance/base_appearan
import 'package:appflowy_backend/log.dart'; import 'package:appflowy_backend/log.dart';
import 'package:appflowy_backend/protobuf/flowy-user/date_time.pbenum.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_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:easy_localization/easy_localization.dart';
import 'package:flowy_infra/theme.dart'; import 'package:flowy_infra/theme.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -193,6 +195,9 @@ class AppearanceSettingsCubit extends Cubit<AppearanceSettingsState> {
Log.warn('Catch error in setLocale: $e}'); 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) { if (state.locale != newLocale) {
_appearanceSettings.locale.languageCode = newLocale.languageCode; _appearanceSettings.locale.languageCode = newLocale.languageCode;
_appearanceSettings.locale.countryCode = newLocale.countryCode ?? ""; _appearanceSettings.locale.countryCode = newLocale.countryCode ?? "";

View File

@ -39,8 +39,10 @@ class ShortcutsCubit extends Cubit<ShortcutsState> {
commandShortcutEvents, commandShortcutEvents,
customizeShortcuts, customizeShortcuts,
); );
//sort the shortcuts //sort the shortcuts
commandShortcutEvents.sort((a, b) => a.key.compareTo(b.key)); commandShortcutEvents.sort((a, b) => a.key.compareTo(b.key));
emit( emit(
state.copyWith( state.copyWith(
status: ShortcutsStatus.success, status: ShortcutsStatus.success,

View File

@ -40,7 +40,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
final currentWorkspace = result.$1; final currentWorkspace = result.$1;
final workspaces = result.$2; final workspaces = result.$2;
final isCollabWorkspaceOn = final isCollabWorkspaceOn =
userProfile.authenticator != AuthenticatorPB.Local && userProfile.authenticator == AuthenticatorPB.AppFlowyCloud &&
FeatureFlag.collaborativeWorkspace.isOn; FeatureFlag.collaborativeWorkspace.isOn;
if (currentWorkspace != null && result.$3 == true) { if (currentWorkspace != null && result.$3 == true) {
final result = await _userService final result = await _userService
@ -71,6 +71,15 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
); );
}, },
createWorkspace: (name) async { createWorkspace: (name) async {
emit(
state.copyWith(
actionResult: const UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.create,
isLoading: true,
result: null,
),
),
);
final result = await _userService.createUserWorkspace(name); final result = await _userService.createUserWorkspace(name);
final workspaces = result.fold( final workspaces = result.fold(
(s) => [...state.workspaces, s], (s) => [...state.workspaces, s],
@ -81,6 +90,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
workspaces: workspaces, workspaces: workspaces,
actionResult: UserWorkspaceActionResult( actionResult: UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.create, actionType: UserWorkspaceActionType.create,
isLoading: false,
result: result, result: result,
), ),
), ),
@ -91,6 +101,15 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
}); });
}, },
deleteWorkspace: (workspaceId) async { deleteWorkspace: (workspaceId) async {
emit(
state.copyWith(
actionResult: const UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.delete,
isLoading: true,
result: null,
),
),
);
final remoteWorkspaces = await _fetchWorkspaces().then( final remoteWorkspaces = await _fetchWorkspaces().then(
(value) => value.$2, (value) => value.$2,
); );
@ -108,6 +127,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
actionResult: UserWorkspaceActionResult( actionResult: UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.delete, actionType: UserWorkspaceActionType.delete,
result: result, result: result,
isLoading: false,
), ),
), ),
); );
@ -134,11 +154,21 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
actionResult: UserWorkspaceActionResult( actionResult: UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.delete, actionType: UserWorkspaceActionType.delete,
result: result, result: result,
isLoading: false,
), ),
), ),
); );
}, },
openWorkspace: (workspaceId) async { openWorkspace: (workspaceId) async {
emit(
state.copyWith(
actionResult: const UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.open,
isLoading: true,
result: null,
),
),
);
final result = await _userService.openWorkspace(workspaceId); final result = await _userService.openWorkspace(workspaceId);
final currentWorkspace = result.fold( final currentWorkspace = result.fold(
(s) => state.workspaces.firstWhereOrNull( (s) => state.workspaces.firstWhereOrNull(
@ -157,6 +187,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
currentWorkspace: currentWorkspace, currentWorkspace: currentWorkspace,
actionResult: UserWorkspaceActionResult( actionResult: UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.open, actionType: UserWorkspaceActionType.open,
isLoading: false,
result: result, result: result,
), ),
), ),
@ -188,6 +219,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
currentWorkspace: currentWorkspace, currentWorkspace: currentWorkspace,
actionResult: UserWorkspaceActionResult( actionResult: UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.rename, actionType: UserWorkspaceActionType.rename,
isLoading: false,
result: result, result: result,
), ),
), ),
@ -221,6 +253,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
currentWorkspace: currentWorkspace, currentWorkspace: currentWorkspace,
actionResult: UserWorkspaceActionResult( actionResult: UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.updateIcon, actionType: UserWorkspaceActionType.updateIcon,
isLoading: false,
result: result, result: result,
), ),
), ),
@ -245,6 +278,7 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
workspaces: workspaces, workspaces: workspaces,
actionResult: UserWorkspaceActionResult( actionResult: UserWorkspaceActionResult(
actionType: UserWorkspaceActionType.leave, actionType: UserWorkspaceActionType.leave,
isLoading: false,
result: result, result: result,
), ),
), ),
@ -253,7 +287,11 @@ class UserWorkspaceBloc extends Bloc<UserWorkspaceEvent, UserWorkspaceState> {
updateWorkspaces: (workspaces) async { updateWorkspaces: (workspaces) async {
emit( emit(
state.copyWith( state.copyWith(
workspaces: workspaces.items, workspaces: workspaces.items
..sort(
(a, b) =>
a.createdAtTimestamp.compareTo(b.createdAtTimestamp),
),
), ),
); );
}, },
@ -359,11 +397,13 @@ enum UserWorkspaceActionType {
class UserWorkspaceActionResult { class UserWorkspaceActionResult {
const UserWorkspaceActionResult({ const UserWorkspaceActionResult({
required this.actionType, required this.actionType,
required this.isLoading,
required this.result, required this.result,
}); });
final UserWorkspaceActionType actionType; final UserWorkspaceActionType actionType;
final FlowyResult<void, FlowyError> result; final bool isLoading;
final FlowyResult<void, FlowyError>? result;
} }
@freezed @freezed

View File

@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:appflowy/startup/plugin/plugin.dart';
import 'package:appflowy/startup/startup.dart'; import 'package:appflowy/startup/startup.dart';
import 'package:appflowy/workspace/application/favorite/favorite_bloc.dart'; import 'package:appflowy/workspace/application/favorite/favorite_bloc.dart';
import 'package:appflowy/workspace/application/favorite/prelude.dart'; import 'package:appflowy/workspace/application/favorite/prelude.dart';
@ -106,21 +105,22 @@ class HomeSideBar extends StatelessWidget {
), ),
BlocListener<UserWorkspaceBloc, UserWorkspaceState>( BlocListener<UserWorkspaceBloc, UserWorkspaceState>(
listener: (context, state) { listener: (context, state) {
context.read<TabsBloc>().add( final actionType = state.actionResult?.actionType;
TabsEvent.openPlugin(
plugin: makePlugin(pluginType: PluginType.blank), if (actionType == UserWorkspaceActionType.create ||
), actionType == UserWorkspaceActionType.delete ||
); actionType == UserWorkspaceActionType.open) {
context.read<SidebarSectionsBloc>().add( context.read<SidebarSectionsBloc>().add(
SidebarSectionsEvent.initial( SidebarSectionsEvent.reload(
userProfile, userProfile,
state.currentWorkspace?.workspaceId ?? state.currentWorkspace?.workspaceId ??
workspaceSetting.workspaceId, workspaceSetting.workspaceId,
), ),
); );
context.read<FavoriteBloc>().add( context.read<FavoriteBloc>().add(
const FavoriteEvent.fetchFavorites(), const FavoriteEvent.fetchFavorites(),
); );
}
}, },
), ),
], ],

View File

@ -103,10 +103,10 @@ class PublicSectionFolder extends SectionFolder {
super.key, super.key,
required super.views, required super.views,
}) : super( }) : super(
title: LocaleKeys.sideBar_public.tr(), title: LocaleKeys.sideBar_workspace.tr(),
categoryType: FolderCategoryType.public, categoryType: FolderCategoryType.public,
expandButtonTooltip: LocaleKeys.sideBar_clickToHidePublic.tr(), expandButtonTooltip: LocaleKeys.sideBar_clickToHideWorkspace.tr(),
addButtonTooltip: LocaleKeys.sideBar_addAPageToPublic.tr(), addButtonTooltip: LocaleKeys.sideBar_addAPageToWorkspace.tr(),
); );
} }

View File

@ -1,5 +1,6 @@
import 'package:appflowy/generated/flowy_svgs.g.dart'; import 'package:appflowy/generated/flowy_svgs.g.dart';
import 'package:appflowy/generated/locale_keys.g.dart'; import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/plugins/document/presentation/editor_plugins/openai/widgets/loading.dart';
import 'package:appflowy/workspace/application/user/user_workspace_bloc.dart'; import 'package:appflowy/workspace/application/user/user_workspace_bloc.dart';
import 'package:appflowy/workspace/presentation/home/menu/sidebar/sidebar_setting.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'; 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/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
class SidebarWorkspace extends StatelessWidget { class SidebarWorkspace extends StatefulWidget {
const SidebarWorkspace({ const SidebarWorkspace({
super.key, super.key,
required this.userProfile, required this.userProfile,
@ -24,9 +25,18 @@ class SidebarWorkspace extends StatelessWidget {
final UserProfilePB userProfile; final UserProfilePB userProfile;
@override
State<SidebarWorkspace> createState() => _SidebarWorkspaceState();
}
class _SidebarWorkspaceState extends State<SidebarWorkspace> {
Loading? loadingIndicator;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return BlocConsumer<UserWorkspaceBloc, UserWorkspaceState>( return BlocConsumer<UserWorkspaceBloc, UserWorkspaceState>(
listenWhen: (previous, current) =>
previous.actionResult != current.actionResult,
listener: _showResultDialog, listener: _showResultDialog,
builder: (context, state) { builder: (context, state) {
final currentWorkspace = state.currentWorkspace; final currentWorkspace = state.currentWorkspace;
@ -37,11 +47,11 @@ class SidebarWorkspace extends StatelessWidget {
children: [ children: [
Expanded( Expanded(
child: SidebarSwitchWorkspaceButton( child: SidebarSwitchWorkspaceButton(
userProfile: userProfile, userProfile: widget.userProfile,
currentWorkspace: currentWorkspace, currentWorkspace: currentWorkspace,
), ),
), ),
UserSettingButton(userProfile: userProfile), UserSettingButton(userProfile: widget.userProfile),
const HSpace(4), const HSpace(4),
const NotificationButton(), const NotificationButton(),
], ],
@ -58,6 +68,19 @@ class SidebarWorkspace extends StatelessWidget {
final actionType = actionResult.actionType; final actionType = actionResult.actionType;
final result = actionResult.result; 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) { result.onFailure((f) {
Log.error( Log.error(
@ -193,6 +216,7 @@ class _SidebarSwitchWorkspaceButtonState
child: FlowyText.medium( child: FlowyText.medium(
widget.currentWorkspace.name, widget.currentWorkspace.name,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
withTooltip: true,
), ),
), ),
const FlowySvg(FlowySvgs.drop_menu_show_m), const FlowySvg(FlowySvgs.drop_menu_show_m),

View File

@ -110,7 +110,6 @@ class _WorkspaceMoreActionWrapper extends CustomActionCell {
await showDialog( await showDialog(
context: context, context: context,
builder: (_) => NavigatorOkCancelDialog( builder: (_) => NavigatorOkCancelDialog(
title: LocaleKeys.workspace_leaveCurrentWorkspace.tr(),
message: LocaleKeys.workspace_leaveCurrentWorkspacePrompt.tr(), message: LocaleKeys.workspace_leaveCurrentWorkspacePrompt.tr(),
onOkPressed: () { onOkPressed: () {
workspaceBloc.add( workspaceBloc.add(

View File

@ -9,6 +9,7 @@ import 'package:appflowy_backend/protobuf/flowy-user/protobuf.dart';
import 'package:appflowy_popover/appflowy_popover.dart'; import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.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/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.dart';
@ -136,8 +137,10 @@ class WorkspaceMenuItem extends StatelessWidget {
PopoverContainer.of(context).closeAll(); PopoverContainer.of(context).closeAll();
} }
}, },
margin: margin: const EdgeInsets.symmetric(
const EdgeInsets.symmetric(vertical: 8, horizontal: 12), vertical: 8,
horizontal: 12,
),
iconPadding: 10.0, iconPadding: 10.0,
leftIconSize: const Size.square(32), leftIconSize: const Size.square(32),
leftIcon: const SizedBox.square( leftIcon: const SizedBox.square(
@ -146,12 +149,12 @@ class WorkspaceMenuItem extends StatelessWidget {
rightIcon: const HSpace(42.0), rightIcon: const HSpace(42.0),
text: Column( text: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
// mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
FlowyText.medium( FlowyText.medium(
workspace.name, workspace.name,
fontSize: 14.0, fontSize: 14.0,
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
withTooltip: true,
), ),
FlowyText( FlowyText(
state.isLoading state.isLoading
@ -171,10 +174,14 @@ class WorkspaceMenuItem extends StatelessWidget {
left: 8, left: 8,
child: SizedBox.square( child: SizedBox.square(
dimension: 32, dimension: 32,
child: WorkspaceIcon( child: FlowyTooltip(
workspace: workspace, message:
iconSize: 26, LocaleKeys.document_plugins_cover_changeIcon.tr(),
enableEdit: true, child: WorkspaceIcon(
workspace: workspace,
iconSize: 26,
enableEdit: true,
),
), ),
), ),
), ),

View File

@ -62,6 +62,7 @@ class SettingsDialog extends StatelessWidget {
SizedBox( SizedBox(
width: 200, width: 200,
child: SettingsMenu( child: SettingsMenu(
userProfile: user,
changeSelectedPage: (index) { changeSelectedPage: (index) {
context context
.read<SettingsDialogBloc>() .read<SettingsDialogBloc>()

View File

@ -8,7 +8,7 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
SelectionMenuItem emojiMenuItem = SelectionMenuItem( SelectionMenuItem emojiMenuItem = SelectionMenuItem(
getName: () => LocaleKeys.document_plugins_emoji.tr(), getName: LocaleKeys.document_plugins_emoji.tr,
icon: (editorState, onSelected, style) => SelectableIconWidget( icon: (editorState, onSelected, style) => SelectableIconWidget(
icon: Icons.emoji_emotions_outlined, icon: Icons.emoji_emotions_outlined,
isSelected: onSelected, isSelected: onSelected,

View File

@ -117,13 +117,14 @@ class CloudTypeSwitcher extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final isDevelopMode = integrationMode().isDevelop; final isDevelopMode = integrationMode().isDevelop;
// Only show the appflowyCloudDevelop in develop mode // Only show the appflowyCloudDevelop in develop mode
final values = AuthenticatorType.values final values = AuthenticatorType.values.where((element) {
.where( // Supabase will going to be removed in the future
(element) => if (element == AuthenticatorType.supabase) {
isDevelopMode || return false;
element != AuthenticatorType.appflowyCloudDevelop, }
)
.toList(); return isDevelopMode || element != AuthenticatorType.appflowyCloudDevelop;
}).toList();
return PlatformExtension.isDesktopOrWeb return PlatformExtension.isDesktopOrWeb
? AppFlowyPopover( ? AppFlowyPopover(
direction: PopoverDirection.bottomWithRightAligned, direction: PopoverDirection.bottomWithRightAligned,

View File

@ -117,7 +117,7 @@ class ShortcutsListTile extends StatelessWidget {
Expanded( Expanded(
child: FlowyText.medium( child: FlowyText.medium(
key: Key(shortcutEvent.key), key: Key(shortcutEvent.key),
shortcutEvent.key.capitalize(), shortcutEvent.description!.capitalize(),
overflow: TextOverflow.ellipsis, overflow: TextOverflow.ellipsis,
), ),
), ),

View File

@ -2,6 +2,7 @@ import 'package:appflowy/generated/locale_keys.g.dart';
import 'package:appflowy/shared/feature_flags.dart'; import 'package:appflowy/shared/feature_flags.dart';
import 'package:appflowy/workspace/application/settings/settings_dialog_bloc.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/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:easy_localization/easy_localization.dart';
import 'package:flowy_infra_ui/flowy_infra_ui.dart'; import 'package:flowy_infra_ui/flowy_infra_ui.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
@ -12,10 +13,12 @@ class SettingsMenu extends StatelessWidget {
super.key, super.key,
required this.changeSelectedPage, required this.changeSelectedPage,
required this.currentPage, required this.currentPage,
required this.userProfile,
}); });
final Function changeSelectedPage; final Function changeSelectedPage;
final SettingsPage currentPage; final SettingsPage currentPage;
final UserProfilePB userProfile;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -72,7 +75,8 @@ class SettingsMenu extends StatelessWidget {
icon: Icons.cut, icon: Icons.cut,
changeSelectedPage: changeSelectedPage, changeSelectedPage: changeSelectedPage,
), ),
if (FeatureFlag.membersSettings.isOn) if (FeatureFlag.membersSettings.isOn &&
userProfile.authenticator == AuthenticatorPB.AppFlowyCloud)
SettingsMenuElement( SettingsMenuElement(
page: SettingsPage.member, page: SettingsPage.member,
selectedPage: currentPage, selectedPage: currentPage,

View File

@ -174,85 +174,92 @@ class _AppFlowyDatePickerState extends State<AppFlowyDatePicker> {
} }
Widget buildDesktopPicker() { Widget buildDesktopPicker() {
return Padding( // GestureDetector is a workaround to stop popover from closing
padding: const EdgeInsets.only(top: 18.0, bottom: 12.0), // when clicking on the date picker.
child: Column( return GestureDetector(
mainAxisSize: MainAxisSize.min, behavior: HitTestBehavior.opaque,
children: [ onTap: () {},
StartTextField( child: Padding(
includeTime: widget.includeTime, padding: const EdgeInsets.only(top: 18.0, bottom: 12.0),
timeFormat: widget.timeFormat, child: Column(
timeHintText: widget.timeHintText, mainAxisSize: MainAxisSize.min,
parseEndTimeError: widget.parseEndTimeError, children: [
parseTimeError: widget.parseTimeError, StartTextField(
timeStr: widget.timeStr, includeTime: widget.includeTime,
popoverMutex: widget.popoverMutex, timeFormat: widget.timeFormat,
onSubmitted: widget.onStartTimeSubmitted, timeHintText: widget.timeHintText,
), parseEndTimeError: widget.parseEndTimeError,
EndTextField( parseTimeError: widget.parseTimeError,
includeTime: widget.includeTime, timeStr: widget.timeStr,
timeFormat: widget.timeFormat, popoverMutex: widget.popoverMutex,
isRange: widget.isRange, onSubmitted: widget.onStartTimeSubmitted,
endTimeStr: widget.endTimeStr, ),
popoverMutex: widget.popoverMutex, EndTextField(
onSubmitted: widget.onEndTimeSubmitted, includeTime: widget.includeTime,
), timeFormat: widget.timeFormat,
DatePicker(
isRange: widget.isRange,
onDaySelected: (selectedDay, focusedDay) {
widget.onDaySelected?.call(selectedDay, focusedDay);
if (widget.rebuildOnDaySelected) {
setState(() => _selectedDay = selectedDay);
}
},
onRangeSelected: widget.onRangeSelected,
selectedDay:
widget.rebuildOnDaySelected ? _selectedDay : widget.selectedDay,
firstDay: widget.firstDay,
lastDay: widget.lastDay,
startDay: widget.startDay,
endDay: widget.endDay,
onCalendarCreated: widget.onCalendarCreated,
onPageChanged: widget.onPageChanged,
),
const TypeOptionSeparator(spacing: 12.0),
if (widget.enableRanges && widget.onIsRangeChanged != null) ...[
EndTimeButton(
isRange: widget.isRange, isRange: widget.isRange,
onChanged: widget.onIsRangeChanged!, endTimeStr: widget.endTimeStr,
popoverMutex: widget.popoverMutex,
onSubmitted: widget.onEndTimeSubmitted,
), ),
const VSpace(4.0), DatePicker(
], isRange: widget.isRange,
Padding( onDaySelected: (selectedDay, focusedDay) {
padding: const EdgeInsets.symmetric(horizontal: 12.0), widget.onDaySelected?.call(selectedDay, focusedDay);
child: IncludeTimeButton(
value: widget.includeTime, if (widget.rebuildOnDaySelected) {
onChanged: widget.onIncludeTimeChanged, setState(() => _selectedDay = selectedDay);
}
},
onRangeSelected: widget.onRangeSelected,
selectedDay: widget.rebuildOnDaySelected
? _selectedDay
: widget.selectedDay,
firstDay: widget.firstDay,
lastDay: widget.lastDay,
startDay: widget.startDay,
endDay: widget.endDay,
onCalendarCreated: widget.onCalendarCreated,
onPageChanged: widget.onPageChanged,
),
const TypeOptionSeparator(spacing: 12.0),
if (widget.enableRanges && widget.onIsRangeChanged != null) ...[
EndTimeButton(
isRange: widget.isRange,
onChanged: widget.onIsRangeChanged!,
),
const VSpace(4.0),
],
Padding(
padding: const EdgeInsets.symmetric(horizontal: 12.0),
child: IncludeTimeButton(
value: widget.includeTime,
onChanged: widget.onIncludeTimeChanged,
),
), ),
),
const _GroupSeparator(),
ReminderSelector(
mutex: widget.popoverMutex,
hasTime: widget.includeTime,
timeFormat: widget.timeFormat,
selectedOption: _selectedReminderOption,
onOptionSelected: (option) {
setState(() => _selectedReminderOption = option);
widget.onReminderSelected?.call(option);
},
),
if (widget.options?.isNotEmpty ?? false) ...[
const _GroupSeparator(), const _GroupSeparator(),
ListView.separated( ReminderSelector(
shrinkWrap: true, mutex: widget.popoverMutex,
itemCount: widget.options!.length, hasTime: widget.includeTime,
separatorBuilder: (_, __) => const _GroupSeparator(), timeFormat: widget.timeFormat,
itemBuilder: (_, index) => selectedOption: _selectedReminderOption,
_renderGroupOptions(widget.options![index].options), onOptionSelected: (option) {
setState(() => _selectedReminderOption = option);
widget.onReminderSelected?.call(option);
},
), ),
if (widget.options?.isNotEmpty ?? false) ...[
const _GroupSeparator(),
ListView.separated(
shrinkWrap: true,
itemCount: widget.options!.length,
separatorBuilder: (_, __) => const _GroupSeparator(),
itemBuilder: (_, index) =>
_renderGroupOptions(widget.options![index].options),
),
],
], ],
], ),
), ),
); );
} }

View File

@ -4,6 +4,7 @@ import 'package:flutter/services.dart';
import 'package:appflowy_backend/protobuf/flowy-database2/date_entities.pbenum.dart'; import 'package:appflowy_backend/protobuf/flowy-database2/date_entities.pbenum.dart';
import 'package:appflowy_popover/appflowy_popover.dart'; import 'package:appflowy_popover/appflowy_popover.dart';
import 'package:flowy_infra_ui/style_widget/text_field.dart'; import 'package:flowy_infra_ui/style_widget/text_field.dart';
import 'package:intl/intl.dart';
const _maxLengthTwelveHour = 8; const _maxLengthTwelveHour = 8;
const _maxLengthTwentyFourHour = 5; const _maxLengthTwentyFourHour = 5;
@ -55,6 +56,13 @@ class _TimeTextFieldState extends State<TimeTextField> {
text = widget.endTimeStr!; 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); _focusNode.addListener(_focusNodeListener);
widget.popoverMutex?.listenOnPopoverChanged(_popoverListener); widget.popoverMutex?.listenOnPopoverChanged(_popoverListener);
} }
@ -86,6 +94,7 @@ class _TimeTextFieldState extends State<TimeTextField> {
padding: const EdgeInsets.symmetric(horizontal: 18.0), padding: const EdgeInsets.symmetric(horizontal: 18.0),
child: FlowyTextField( child: FlowyTextField(
text: text, text: text,
keyboardType: TextInputType.datetime,
focusNode: _focusNode, focusNode: _focusNode,
autoFocus: false, autoFocus: false,
controller: _textController, controller: _textController,
@ -97,7 +106,16 @@ class _TimeTextFieldState extends State<TimeTextField> {
? _maxLengthTwelveHour ? _maxLengthTwelveHour
: _maxLengthTwentyFourHour, : _maxLengthTwentyFourHour,
showCounter: false, 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, onSubmitted: widget.onSubmitted,
), ),
); );
@ -134,7 +152,20 @@ class TimeInputFormatter extends TextInputFormatter {
return _formatText(newText, spacePosition, ' '); 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) { TextEditingValue _formatText(String text, int index, String separator) {

View File

@ -1,10 +1,15 @@
export 'package:async/async.dart'; export 'package:async/async.dart';
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'package:appflowy_backend/rust_stream.dart'; import 'package:appflowy_backend/rust_stream.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'dart:ffi'; import 'dart:ffi';
import 'ffi.dart' as ffi; import 'ffi.dart' as ffi;
import 'package:ffi/ffi.dart'; import 'package:ffi/ffi.dart';
import 'dart:isolate';
import 'dart:io';
import 'package:logger/logger.dart';
enum ExceptionType { enum ExceptionType {
AppearanceSettingsIsEmpty, AppearanceSettingsIsEmpty,
@ -27,10 +32,15 @@ class FlowySDK {
Future<void> dispose() async {} Future<void> dispose() async {}
Future<void> init(String configuration) async { Future<void> init(String configuration) async {
final port = RustStreamReceiver.shared.port; ffi.set_stream_port(RustStreamReceiver.shared.port);
ffi.set_stream_port(port);
ffi.store_dart_post_cobject(NativeApi.postCObject); 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>(); // final completer = Completer<Uint8List>();
// // Create a SendPort that accepts only one message. // // Create a SendPort that accepts only one message.
// final sendPort = singleCompletePort(completer); // final sendPort = singleCompletePort(completer);
@ -42,3 +52,44 @@ class FlowySDK {
// return completer.future; // 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();
}
}

View File

@ -110,6 +110,22 @@ typedef _set_stream_port_Dart = int Function(
int port, 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`. /// C function `link_me_please`.
void link_me_please() { void link_me_please() {
_link_me_please(); _link_me_please();

View File

@ -1,6 +1,5 @@
// ignore: import_of_legacy_library_into_null_safe // ignore: import_of_legacy_library_into_null_safe
import 'dart:ffi'; import 'dart:ffi';
import 'package:ffi/ffi.dart' as ffi; import 'package:ffi/ffi.dart' as ffi;
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';

View File

@ -2,7 +2,6 @@ import 'dart:async';
import 'dart:ffi'; import 'dart:ffi';
import 'dart:isolate'; import 'dart:isolate';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:appflowy_backend/log.dart'; import 'package:appflowy_backend/log.dart';
import 'protobuf/flowy-notification/subject.pb.dart'; import 'protobuf/flowy-notification/subject.pb.dart';

View File

@ -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_stream_port(int64_t port);
int32_t set_log_stream_port(int64_t port);
void link_me_please(void); void link_me_please(void);
void rust_log(int64_t level, const char *data); void rust_log(int64_t level, const char *data);

View File

@ -15,6 +15,7 @@ class FlowyText extends StatelessWidget {
final String? fontFamily; final String? fontFamily;
final List<String>? fallbackFontFamily; final List<String>? fallbackFontFamily;
final double? lineHeight; final double? lineHeight;
final bool withTooltip;
const FlowyText( const FlowyText(
this.text, { this.text, {
@ -30,6 +31,7 @@ class FlowyText extends StatelessWidget {
this.fontFamily, this.fontFamily,
this.fallbackFontFamily, this.fallbackFontFamily,
this.lineHeight, this.lineHeight,
this.withTooltip = false,
}); });
FlowyText.small( FlowyText.small(
@ -44,6 +46,7 @@ class FlowyText extends StatelessWidget {
this.fontFamily, this.fontFamily,
this.fallbackFontFamily, this.fallbackFontFamily,
this.lineHeight, this.lineHeight,
this.withTooltip = false,
}) : fontWeight = FontWeight.w400, }) : fontWeight = FontWeight.w400,
fontSize = (Platform.isIOS || Platform.isAndroid) ? 14 : 12; fontSize = (Platform.isIOS || Platform.isAndroid) ? 14 : 12;
@ -60,6 +63,7 @@ class FlowyText extends StatelessWidget {
this.fontFamily, this.fontFamily,
this.fallbackFontFamily, this.fallbackFontFamily,
this.lineHeight, this.lineHeight,
this.withTooltip = false,
}) : fontWeight = FontWeight.w400; }) : fontWeight = FontWeight.w400;
const FlowyText.medium( const FlowyText.medium(
@ -75,6 +79,7 @@ class FlowyText extends StatelessWidget {
this.fontFamily, this.fontFamily,
this.fallbackFontFamily, this.fallbackFontFamily,
this.lineHeight, this.lineHeight,
this.withTooltip = false,
}) : fontWeight = FontWeight.w500; }) : fontWeight = FontWeight.w500;
const FlowyText.semibold( const FlowyText.semibold(
@ -90,6 +95,7 @@ class FlowyText extends StatelessWidget {
this.fontFamily, this.fontFamily,
this.fallbackFontFamily, this.fallbackFontFamily,
this.lineHeight, this.lineHeight,
this.withTooltip = false,
}) : fontWeight = FontWeight.w600; }) : fontWeight = FontWeight.w600;
// Some emojis are not supported on Linux and Android, fallback to noto color emoji // 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.decoration,
this.selectable = false, this.selectable = false,
this.lineHeight, this.lineHeight,
this.withTooltip = false,
}) : fontWeight = FontWeight.w400, }) : fontWeight = FontWeight.w400,
fontFamily = 'noto color emoji', fontFamily = 'noto color emoji',
fallbackFontFamily = null; fallbackFontFamily = null;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Widget child;
if (selectable) { if (selectable) {
return SelectableText( child = SelectableText(
text, text,
maxLines: maxLines, maxLines: maxLines,
textAlign: textAlign, textAlign: textAlign,
@ -126,7 +135,7 @@ class FlowyText extends StatelessWidget {
), ),
); );
} else { } else {
return Text( child = Text(
text, text,
maxLines: maxLines, maxLines: maxLines,
textAlign: textAlign, textAlign: textAlign,
@ -142,5 +151,14 @@ class FlowyText extends StatelessWidget {
), ),
); );
} }
if (withTooltip) {
child = Tooltip(
message: text,
child: child,
);
}
return child;
} }
} }

View File

@ -1,9 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'package:flowy_infra/size.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flowy_infra/size.dart';
class FlowyTextField extends StatefulWidget { class FlowyTextField extends StatefulWidget {
final String? hintText; final String? hintText;
final String? text; final String? text;
@ -31,6 +32,7 @@ class FlowyTextField extends StatefulWidget {
final TextStyle? hintStyle; final TextStyle? hintStyle;
final InputDecoration? decoration; final InputDecoration? decoration;
final TextAlignVertical? textAlignVertical; final TextAlignVertical? textAlignVertical;
final TextInputAction? textInputAction;
final TextInputType? keyboardType; final TextInputType? keyboardType;
final List<TextInputFormatter>? inputFormatters; final List<TextInputFormatter>? inputFormatters;
@ -62,6 +64,7 @@ class FlowyTextField extends StatefulWidget {
this.hintStyle, this.hintStyle,
this.decoration, this.decoration,
this.textAlignVertical, this.textAlignVertical,
this.textInputAction,
this.keyboardType = TextInputType.multiline, this.keyboardType = TextInputType.multiline,
this.inputFormatters, this.inputFormatters,
}); });

View File

@ -53,8 +53,8 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: b927ec0 ref: c8cd407
resolved-ref: b927ec0685c870c731c5b6d9688a031d0cd31e76 resolved-ref: c8cd4071e36ca6b1fb6d9ef803abb61e9a743c8b
url: "https://github.com/AppFlowy-IO/appflowy-editor.git" url: "https://github.com/AppFlowy-IO/appflowy-editor.git"
source: git source: git
version: "2.3.3" version: "2.3.3"

View File

@ -169,7 +169,7 @@ dependency_overrides:
appflowy_editor: appflowy_editor:
git: git:
url: https://github.com/AppFlowy-IO/appflowy-editor.git url: https://github.com/AppFlowy-IO/appflowy-editor.git
ref: "b927ec0" ref: "c8cd407"
sheet: sheet:
git: git:

View File

@ -156,7 +156,7 @@ checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
[[package]] [[package]]
name = "app-error" name = "app-error"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -712,7 +712,7 @@ dependencies = [
[[package]] [[package]]
name = "client-api" name = "client-api"
version = "0.1.0" 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 = [ dependencies = [
"again", "again",
"anyhow", "anyhow",
@ -733,7 +733,6 @@ dependencies = [
"getrandom 0.2.10", "getrandom 0.2.10",
"gotrue", "gotrue",
"gotrue-entity", "gotrue-entity",
"governor",
"mime", "mime",
"parking_lot 0.12.1", "parking_lot 0.12.1",
"prost", "prost",
@ -752,14 +751,13 @@ dependencies = [
"url", "url",
"uuid", "uuid",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"workspace-template",
"yrs", "yrs",
] ]
[[package]] [[package]]
name = "client-websocket" name = "client-websocket"
version = "0.1.0" 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 = [ dependencies = [
"futures-channel", "futures-channel",
"futures-util", "futures-util",
@ -833,7 +831,7 @@ dependencies = [
[[package]] [[package]]
name = "collab" name = "collab"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@ -857,7 +855,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-database" name = "collab-database"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@ -887,7 +885,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-document" name = "collab-document"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"collab", "collab",
@ -906,7 +904,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-entity" name = "collab-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@ -921,7 +919,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-folder" name = "collab-folder"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@ -959,7 +957,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-plugins" name = "collab-plugins"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-stream", "async-stream",
@ -998,7 +996,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-rt-entity" name = "collab-rt-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -1023,7 +1021,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-rt-protocol" name = "collab-rt-protocol"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -1037,7 +1035,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-user" name = "collab-user"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"collab", "collab",
@ -1096,9 +1094,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
[[package]] [[package]]
name = "cookie" name = "cookie"
version = "0.16.2" version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
dependencies = [ dependencies = [
"percent-encoding", "percent-encoding",
"time", "time",
@ -1107,12 +1105,12 @@ dependencies = [
[[package]] [[package]]
name = "cookie_store" name = "cookie_store"
version = "0.16.2" version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa" checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6"
dependencies = [ dependencies = [
"cookie", "cookie",
"idna 0.2.3", "idna 0.3.0",
"log", "log",
"publicsuffix", "publicsuffix",
"serde", "serde",
@ -1260,7 +1258,7 @@ dependencies = [
"cssparser-macros", "cssparser-macros",
"dtoa-short", "dtoa-short",
"itoa 1.0.6", "itoa 1.0.6",
"phf 0.8.0", "phf 0.11.2",
"smallvec", "smallvec",
] ]
@ -1371,7 +1369,7 @@ checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
[[package]] [[package]]
name = "database-entity" name = "database-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -2352,12 +2350,6 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-timer"
version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
[[package]] [[package]]
name = "futures-util" name = "futures-util"
version = "0.3.30" version = "0.3.30"
@ -2687,7 +2679,7 @@ dependencies = [
[[package]] [[package]]
name = "gotrue" name = "gotrue"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"futures-util", "futures-util",
@ -2704,7 +2696,7 @@ dependencies = [
[[package]] [[package]]
name = "gotrue-entity" name = "gotrue-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -2715,24 +2707,6 @@ dependencies = [
"serde_json", "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]] [[package]]
name = "gtk" name = "gtk"
version = "0.15.5" version = "0.15.5"
@ -3027,17 +3001,6 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 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]] [[package]]
name = "idna" name = "idna"
version = "0.3.0" version = "0.3.0"
@ -3155,7 +3118,7 @@ dependencies = [
[[package]] [[package]]
name = "infra" name = "infra"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"reqwest", "reqwest",
@ -3399,6 +3362,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"chrono", "chrono",
"lazy_static", "lazy_static",
"lib-infra",
"serde", "serde",
"serde_json", "serde_json",
"tracing", "tracing",
@ -3519,15 +3483,6 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
[[package]]
name = "mach2"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "macroific" name = "macroific"
version = "1.3.1" version = "1.3.1"
@ -3788,12 +3743,6 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
[[package]]
name = "no-std-compat"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
[[package]] [[package]]
name = "nodrop" name = "nodrop"
version = "0.1.14" version = "0.1.14"
@ -3810,12 +3759,6 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "nonzero_ext"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
[[package]] [[package]]
name = "ntapi" name = "ntapi"
version = "0.4.1" version = "0.4.1"
@ -4759,22 +4702,6 @@ dependencies = [
"psl-types", "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]] [[package]]
name = "quick-xml" name = "quick-xml"
version = "0.28.2" version = "0.28.2"
@ -4891,15 +4818,6 @@ dependencies = [
"rand_core 0.5.1", "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]] [[package]]
name = "raw-window-handle" name = "raw-window-handle"
version = "0.5.2" version = "0.5.2"
@ -5013,9 +4931,9 @@ dependencies = [
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.11.23" version = "0.11.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
dependencies = [ dependencies = [
"base64 0.21.5", "base64 0.21.5",
"bytes", "bytes",
@ -5044,6 +4962,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"serde_urlencoded", "serde_urlencoded",
"sync_wrapper",
"system-configuration", "system-configuration",
"tokio", "tokio",
"tokio-native-tls", "tokio-native-tls",
@ -5599,7 +5518,7 @@ dependencies = [
[[package]] [[package]]
name = "shared-entity" name = "shared-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -5865,6 +5784,12 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "sync_wrapper"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]] [[package]]
name = "sysinfo" name = "sysinfo"
version = "0.30.5" version = "0.30.5"
@ -7050,9 +6975,9 @@ checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
[[package]] [[package]]
name = "wasm-streams" name = "wasm-streams"
version = "0.3.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"js-sys", "js-sys",
@ -7584,27 +7509,6 @@ dependencies = [
"windows-sys 0.48.0", "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]] [[package]]
name = "wry" name = "wry"
version = "0.24.6" version = "0.24.6"

View File

@ -87,7 +87,7 @@ yrs = { git = "https://github.com/appflowy/y-crdt", rev = "3f25bb510ca5274e7657d
# Run the script: # Run the script:
# scripts/tool/update_client_api_rev.sh new_rev_id # 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. # Please use the following script to update collab.
# Working directory: frontend # 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: # To switch to the local path, run:
# scripts/tool/update_collab_source.sh # scripts/tool/update_collab_source.sh
# ⚠️⚠️⚠️️ # ⚠️⚠️⚠️️
collab = { 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 = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }

View File

@ -9,19 +9,19 @@ pub fn read_env() {
dotenv().ok(); dotenv().ok();
let env = if cfg!(debug_assertions) { let env = if cfg!(debug_assertions) {
include_str!("../env.development") include_str!("../env.development")
} else { } else {
include_str!("../env.production") include_str!("../env.production")
}; };
for line in env.lines() { for line in env.lines() {
if let Some((key, value)) = line.split_once('=') { if let Some((key, value)) = line.split_once('=') {
// Check if the environment variable is not already set in the system // Check if the environment variable is not already set in the system
let current_value = std::env::var(key).unwrap_or_default(); let current_value = std::env::var(key).unwrap_or_default();
if current_value.is_empty() { if current_value.is_empty() {
std::env::set_var(key, value); std::env::set_var(key, value);
}
} }
}
} }
} }
@ -29,7 +29,12 @@ pub fn init_flowy_core() -> AppFlowyCore {
let config_json = include_str!("../tauri.conf.json"); let config_json = include_str!("../tauri.conf.json");
let config: tauri_utils::config::Config = serde_json::from_str(config_json).unwrap(); 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(); let mut data_path = tauri::api::path::app_local_data_dir(&config).unwrap();
if cfg!(debug_assertions) { if cfg!(debug_assertions) {
data_path.push("data_dev"); data_path.push("data_dev");
@ -49,11 +54,12 @@ pub fn init_flowy_core() -> AppFlowyCore {
custom_application_path, custom_application_path,
application_path, application_path,
device_id, device_id,
"tauri".to_string(),
DEFAULT_NAME.to_string(), DEFAULT_NAME.to_string(),
) )
.log_filter("trace", vec!["appflowy_tauri".to_string()]); .log_filter("trace", vec!["appflowy_tauri".to_string()]);
let runtime = Arc::new(AFPluginRuntime::new().unwrap()); let runtime = Arc::new(AFPluginRuntime::new().unwrap());
let cloned_runtime = runtime.clone(); 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 })
} }

View File

@ -215,7 +215,7 @@ checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
[[package]] [[package]]
name = "app-error" name = "app-error"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -378,9 +378,9 @@ dependencies = [
[[package]] [[package]]
name = "brotli" name = "brotli"
version = "3.4.0" version = "3.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391"
dependencies = [ dependencies = [
"alloc-no-stdlib", "alloc-no-stdlib",
"alloc-stdlib", "alloc-stdlib",
@ -541,7 +541,7 @@ dependencies = [
[[package]] [[package]]
name = "client-api" name = "client-api"
version = "0.1.0" 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 = [ dependencies = [
"again", "again",
"anyhow", "anyhow",
@ -562,7 +562,6 @@ dependencies = [
"getrandom 0.2.12", "getrandom 0.2.12",
"gotrue", "gotrue",
"gotrue-entity", "gotrue-entity",
"governor",
"mime", "mime",
"parking_lot 0.12.1", "parking_lot 0.12.1",
"prost", "prost",
@ -587,7 +586,7 @@ dependencies = [
[[package]] [[package]]
name = "client-websocket" name = "client-websocket"
version = "0.1.0" 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 = [ dependencies = [
"futures-channel", "futures-channel",
"futures-util", "futures-util",
@ -631,7 +630,7 @@ dependencies = [
[[package]] [[package]]
name = "collab" name = "collab"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@ -655,7 +654,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-document" name = "collab-document"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"collab", "collab",
@ -674,7 +673,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-entity" name = "collab-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@ -689,7 +688,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-folder" name = "collab-folder"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@ -727,7 +726,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-plugins" name = "collab-plugins"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-stream", "async-stream",
@ -765,7 +764,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-rt-entity" name = "collab-rt-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -790,7 +789,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-rt-protocol" name = "collab-rt-protocol"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -804,7 +803,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-user" name = "collab-user"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"collab", "collab",
@ -851,9 +850,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
[[package]] [[package]]
name = "cookie" name = "cookie"
version = "0.16.2" version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
dependencies = [ dependencies = [
"percent-encoding", "percent-encoding",
"time", "time",
@ -862,12 +861,12 @@ dependencies = [
[[package]] [[package]]
name = "cookie_store" name = "cookie_store"
version = "0.16.2" version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa" checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6"
dependencies = [ dependencies = [
"cookie", "cookie",
"idna 0.2.3", "idna 0.3.0",
"log", "log",
"publicsuffix", "publicsuffix",
"serde", "serde",
@ -956,7 +955,7 @@ dependencies = [
"cssparser-macros", "cssparser-macros",
"dtoa-short", "dtoa-short",
"itoa", "itoa",
"phf 0.11.2", "phf 0.8.0",
"smallvec", "smallvec",
] ]
@ -1001,7 +1000,7 @@ checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
[[package]] [[package]]
name = "database-entity" name = "database-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -1629,12 +1628,6 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-timer"
version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
[[package]] [[package]]
name = "futures-util" name = "futures-util"
version = "0.3.30" version = "0.3.30"
@ -1769,7 +1762,7 @@ dependencies = [
[[package]] [[package]]
name = "gotrue" name = "gotrue"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"futures-util", "futures-util",
@ -1786,7 +1779,7 @@ dependencies = [
[[package]] [[package]]
name = "gotrue-entity" name = "gotrue-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -1797,24 +1790,6 @@ dependencies = [
"serde_json", "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]] [[package]]
name = "h2" name = "h2"
version = "0.3.24" version = "0.3.24"
@ -2022,17 +1997,6 @@ dependencies = [
"cc", "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]] [[package]]
name = "idna" name = "idna"
version = "0.3.0" version = "0.3.0"
@ -2116,7 +2080,7 @@ dependencies = [
[[package]] [[package]]
name = "infra" name = "infra"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"reqwest", "reqwest",
@ -2342,15 +2306,6 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
[[package]]
name = "mach2"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "macroific" name = "macroific"
version = "1.3.1" version = "1.3.1"
@ -2412,12 +2367,6 @@ dependencies = [
"tendril", "tendril",
] ]
[[package]]
name = "matches"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
[[package]] [[package]]
name = "md5" name = "md5"
version = "0.7.0" version = "0.7.0"
@ -2517,12 +2466,6 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
[[package]]
name = "no-std-compat"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
[[package]] [[package]]
name = "nom" name = "nom"
version = "7.1.3" version = "7.1.3"
@ -2533,12 +2476,6 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "nonzero_ext"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
[[package]] [[package]]
name = "num-bigint" name = "num-bigint"
version = "0.4.4" version = "0.4.4"
@ -2569,16 +2506,6 @@ dependencies = [
"autocfg", "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]] [[package]]
name = "object" name = "object"
version = "0.32.2" version = "0.32.2"
@ -2836,7 +2763,7 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
dependencies = [ dependencies = [
"phf_macros 0.8.0", "phf_macros",
"phf_shared 0.8.0", "phf_shared 0.8.0",
"proc-macro-hack", "proc-macro-hack",
] ]
@ -2856,7 +2783,6 @@ version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
dependencies = [ dependencies = [
"phf_macros 0.11.2",
"phf_shared 0.11.2", "phf_shared 0.11.2",
] ]
@ -2924,19 +2850,6 @@ dependencies = [
"syn 1.0.109", "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]] [[package]]
name = "phf_shared" name = "phf_shared"
version = "0.8.0" version = "0.8.0"
@ -3247,22 +3160,6 @@ dependencies = [
"psl-types", "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]] [[package]]
name = "quote" name = "quote"
version = "1.0.35" version = "1.0.35"
@ -3353,15 +3250,6 @@ dependencies = [
"rand_core 0.5.1", "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]] [[package]]
name = "redox_syscall" name = "redox_syscall"
version = "0.1.57" version = "0.1.57"
@ -3417,9 +3305,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.11.23" version = "0.11.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
dependencies = [ dependencies = [
"base64 0.21.7", "base64 0.21.7",
"bytes", "bytes",
@ -3448,6 +3336,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"serde_urlencoded", "serde_urlencoded",
"sync_wrapper",
"system-configuration", "system-configuration",
"tokio", "tokio",
"tokio-native-tls", "tokio-native-tls",
@ -3816,7 +3705,7 @@ dependencies = [
[[package]] [[package]]
name = "shared-entity" name = "shared-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -4009,6 +3898,12 @@ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]]
name = "sync_wrapper"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]] [[package]]
name = "system-configuration" name = "system-configuration"
version = "0.5.1" version = "0.5.1"
@ -4190,7 +4085,6 @@ dependencies = [
"bytes", "bytes",
"libc", "libc",
"mio", "mio",
"num_cpus",
"pin-project-lite", "pin-project-lite",
"socket2", "socket2",
"tokio-macros", "tokio-macros",
@ -4738,9 +4632,9 @@ dependencies = [
[[package]] [[package]]
name = "wasm-streams" name = "wasm-streams"
version = "0.3.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"js-sys", "js-sys",
@ -5073,4 +4967,4 @@ dependencies = [
[[patch.unused]] [[patch.unused]]
name = "collab-database" name = "collab-database"
version = "0.1.0" 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"

View File

@ -55,7 +55,7 @@ codegen-units = 1
# Run the script: # Run the script:
# scripts/tool/update_client_api_rev.sh new_rev_id # 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. # Please use the following script to update collab.
# Working directory: frontend # 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: # To switch to the local path, run:
# scripts/tool/update_collab_source.sh # scripts/tool/update_collab_source.sh
# ⚠️⚠️⚠️️ # ⚠️⚠️⚠️️
collab = { 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 = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }

View File

@ -14,7 +14,7 @@ flowy-user-pub = { workspace = true }
strum_macros = "0.25.2" strum_macros = "0.25.2"
tracing.workspace = true tracing.workspace = true
lib-infra = { workspace = true } lib-infra = { workspace = true }
collab = { workspace = true, features = ["async-plugin"] } collab = { workspace = true }
collab-entity.workspace = true collab-entity.workspace = true
collab-user.workspace = true collab-user.workspace = true
collab-integrate = { workspace = true } collab-integrate = { workspace = true }

View File

@ -30,7 +30,7 @@ flowy-error = { workspace = true, features = ["impl_from_dispatch_error", "web_t
flowy-document = { workspace = true, features = ["web_ts"] } flowy-document = { workspace = true, features = ["web_ts"] }
flowy-folder = { workspace = true, features = ["web_ts"] } flowy-folder = { workspace = true, features = ["web_ts"] }
lib-infra = { workspace = true } lib-infra = { workspace = true }
collab = { workspace = true, features = ["async-plugin"] } collab = { workspace = true }
web-sys = "0.3" web-sys = "0.3"
wasm-bindgen-futures.workspace = true wasm-bindgen-futures.workspace = true
uuid.workspace = true uuid.workspace = true

View File

@ -147,7 +147,7 @@ checksum = "0952808a6c2afd1aa8947271f3a60f1a6763c7b912d210184c5149b5cf147247"
[[package]] [[package]]
name = "app-error" name = "app-error"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -687,7 +687,7 @@ dependencies = [
[[package]] [[package]]
name = "client-api" name = "client-api"
version = "0.1.0" 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 = [ dependencies = [
"again", "again",
"anyhow", "anyhow",
@ -708,7 +708,6 @@ dependencies = [
"getrandom 0.2.12", "getrandom 0.2.12",
"gotrue", "gotrue",
"gotrue-entity", "gotrue-entity",
"governor",
"mime", "mime",
"parking_lot 0.12.1", "parking_lot 0.12.1",
"prost", "prost",
@ -727,14 +726,13 @@ dependencies = [
"url", "url",
"uuid", "uuid",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"workspace-template",
"yrs", "yrs",
] ]
[[package]] [[package]]
name = "client-websocket" name = "client-websocket"
version = "0.1.0" 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 = [ dependencies = [
"futures-channel", "futures-channel",
"futures-util", "futures-util",
@ -817,7 +815,7 @@ dependencies = [
[[package]] [[package]]
name = "collab" name = "collab"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@ -841,7 +839,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-database" name = "collab-database"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@ -871,7 +869,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-document" name = "collab-document"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"collab", "collab",
@ -890,7 +888,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-entity" name = "collab-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@ -905,7 +903,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-folder" name = "collab-folder"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@ -943,7 +941,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-plugins" name = "collab-plugins"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-stream", "async-stream",
@ -982,7 +980,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-rt-entity" name = "collab-rt-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -1007,7 +1005,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-rt-protocol" name = "collab-rt-protocol"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -1021,7 +1019,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-user" name = "collab-user"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"collab", "collab",
@ -1359,7 +1357,7 @@ checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
[[package]] [[package]]
name = "database-entity" name = "database-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -2412,12 +2410,6 @@ version = "0.3.30"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
[[package]]
name = "futures-timer"
version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24"
[[package]] [[package]]
name = "futures-util" name = "futures-util"
version = "0.3.30" version = "0.3.30"
@ -2757,7 +2749,7 @@ dependencies = [
[[package]] [[package]]
name = "gotrue" name = "gotrue"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"futures-util", "futures-util",
@ -2774,7 +2766,7 @@ dependencies = [
[[package]] [[package]]
name = "gotrue-entity" name = "gotrue-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -2785,26 +2777,6 @@ dependencies = [
"serde_json", "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]] [[package]]
name = "gtk" name = "gtk"
version = "0.15.5" version = "0.15.5"
@ -3221,7 +3193,7 @@ dependencies = [
[[package]] [[package]]
name = "infra" name = "infra"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"reqwest", "reqwest",
@ -3847,12 +3819,6 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "no-std-compat"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
[[package]] [[package]]
name = "nodrop" name = "nodrop"
version = "0.1.14" version = "0.1.14"
@ -3869,12 +3835,6 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "nonzero_ext"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
[[package]] [[package]]
name = "ntapi" name = "ntapi"
version = "0.4.1" version = "0.4.1"
@ -4546,12 +4506,6 @@ dependencies = [
"universal-hash", "universal-hash",
] ]
[[package]]
name = "portable-atomic"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
[[package]] [[package]]
name = "postgrest" name = "postgrest"
version = "1.6.0" version = "1.6.0"
@ -4824,21 +4778,6 @@ dependencies = [
"psl-types", "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]] [[package]]
name = "quick-xml" name = "quick-xml"
version = "0.31.0" version = "0.31.0"
@ -4955,15 +4894,6 @@ dependencies = [
"rand_core 0.5.1", "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]] [[package]]
name = "raw-window-handle" name = "raw-window-handle"
version = "0.5.2" version = "0.5.2"
@ -5678,7 +5608,7 @@ dependencies = [
[[package]] [[package]]
name = "shared-entity" name = "shared-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -5835,15 +5765,6 @@ version = "0.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" 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]] [[package]]
name = "stable_deref_trait" name = "stable_deref_trait"
version = "1.2.0" version = "1.2.0"
@ -7877,27 +7798,6 @@ dependencies = [
"wayland-protocols-wlr", "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]] [[package]]
name = "wry" name = "wry"
version = "0.24.7" version = "0.24.7"

View File

@ -87,7 +87,7 @@ yrs = { git = "https://github.com/appflowy/y-crdt", rev = "3f25bb510ca5274e7657d
# Run the script: # Run the script:
# scripts/tool/update_client_api_rev.sh new_rev_id # 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. # Please use the following script to update collab.
# Working directory: frontend # 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: # To switch to the local path, run:
# scripts/tool/update_collab_source.sh # scripts/tool/update_collab_source.sh
# ⚠️⚠️⚠️️ # ⚠️⚠️⚠️️
collab = { 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 = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }

View File

@ -49,11 +49,12 @@ pub fn init_flowy_core() -> AppFlowyCore {
custom_application_path, custom_application_path,
application_path, application_path,
device_id, device_id,
"web".to_string(),
DEFAULT_NAME.to_string(), DEFAULT_NAME.to_string(),
) )
.log_filter("trace", vec!["appflowy_tauri".to_string()]); .log_filter("trace", vec!["appflowy_tauri".to_string()]);
let runtime = Arc::new(AFPluginRuntime::new().unwrap()); let runtime = Arc::new(AFPluginRuntime::new().unwrap());
let cloned_runtime = runtime.clone(); 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 })
} }

View File

@ -1169,4 +1169,4 @@
"addField": "إضافة حقل", "addField": "إضافة حقل",
"userIcon": "رمز المستخدم" "userIcon": "رمز المستخدم"
} }
} }

View File

@ -807,4 +807,4 @@
"deleteContentTitle": "Esteu segur que voleu suprimir {pageType}?", "deleteContentTitle": "Esteu segur que voleu suprimir {pageType}?",
"deleteContentCaption": "si suprimiu aquest {pageType}, podeu restaurar-lo des de la paperera." "deleteContentCaption": "si suprimiu aquest {pageType}, podeu restaurar-lo des de la paperera."
} }
} }

View File

@ -74,12 +74,12 @@
"copyLink": "کۆپی کردنی لینک" "copyLink": "کۆپی کردنی لینک"
}, },
"moreAction": { "moreAction": {
"fontSize": "قەبارەی قەڵەم",
"import": "زیادکردن",
"moreOptions": "بژاردەی زیاتر",
"small": "بچووک", "small": "بچووک",
"medium": "ناوەند", "medium": "ناوەند",
"large": "گەورە" "large": "گەورە",
"fontSize": "قەبارەی قەڵەم",
"import": "زیادکردن",
"moreOptions": "بژاردەی زیاتر"
}, },
"importPanel": { "importPanel": {
"textAndMarkdown": "Text & Markdown", "textAndMarkdown": "Text & Markdown",
@ -521,18 +521,6 @@
"isComplete": "تەواوە", "isComplete": "تەواوە",
"isIncomplted": "ناتەواوە" "isIncomplted": "ناتەواوە"
}, },
"singleSelectOptionFilter": {
"is": "هەیە",
"isNot": "نییە",
"isEmpty": "به‌تاڵه‌",
"isNotEmpty": "بەتاڵ نییە"
},
"multiSelectOptionFilter": {
"contains": "لەخۆ دەگرێت",
"doesNotContain": "لەخۆناگرێت",
"isEmpty": "به‌تاڵه‌",
"isNotEmpty": "بەتاڵ نییە"
},
"dateFilter": { "dateFilter": {
"is": "هەیە", "is": "هەیە",
"before": "پێشترە", "before": "پێشترە",
@ -651,6 +639,18 @@
"median": "ناوەند", "median": "ناوەند",
"min": "کەم", "min": "کەم",
"sum": "کۆ" "sum": "کۆ"
},
"singleSelectOptionFilter": {
"is": "هەیە",
"isNot": "نییە",
"isEmpty": "به‌تاڵه‌",
"isNotEmpty": "بەتاڵ نییە"
},
"multiSelectOptionFilter": {
"contains": "لەخۆ دەگرێت",
"doesNotContain": "لەخۆناگرێت",
"isEmpty": "به‌تاڵه‌",
"isNotEmpty": "بەتاڵ نییە"
} }
}, },
"document": { "document": {
@ -892,4 +892,4 @@
"frequentlyUsed": "زۆرجار بەکارت هێناوە" "frequentlyUsed": "زۆرجار بەکارت هێناوە"
} }
} }
} }

View File

@ -553,14 +553,14 @@
"typeAValue": "Einen Wert eingeben...", "typeAValue": "Einen Wert eingeben...",
"layout": "Layout", "layout": "Layout",
"databaseLayout": "Layout", "databaseLayout": "Layout",
"viewList": "Datenbank-Ansichten",
"editView": "Ansicht editieren", "editView": "Ansicht editieren",
"boardSettings": "Board-Einstellungen", "boardSettings": "Board-Einstellungen",
"calendarSettings": "Kalender-Einstellungen", "calendarSettings": "Kalender-Einstellungen",
"createView": "New Ansicht", "createView": "New Ansicht",
"duplicateView": "Ansicht duplizieren", "duplicateView": "Ansicht duplizieren",
"deleteView": "Anslicht löschen", "deleteView": "Anslicht löschen",
"numberOfVisibleFields": "{} angezeigt" "numberOfVisibleFields": "{} angezeigt",
"viewList": "Datenbank-Ansichten"
}, },
"textFilter": { "textFilter": {
"contains": "Enthält", "contains": "Enthält",
@ -1417,4 +1417,4 @@
"title": "Arbeitsbereichseinstellungen" "title": "Arbeitsbereichseinstellungen"
} }
} }
} }

View File

@ -213,15 +213,15 @@
"openSidebar": "Open side bar", "openSidebar": "Open side bar",
"personal": "Personal", "personal": "Personal",
"private": "Private", "private": "Private",
"public": "Public", "workspace": "Workspace",
"favorites": "Favorites", "favorites": "Favorites",
"clickToHidePrivate": "Click to hide private space\nPages you created here are only visible to you", "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", "clickToHidePersonal": "Click to hide personal space",
"clickToHideFavorites": "Click to hide favorite space", "clickToHideFavorites": "Click to hide favorite space",
"addAPage": "Add a page", "addAPage": "Add a page",
"addAPageToPrivate": "Add a page to private space", "addAPageToPrivate": "Add a page to private space",
"addAPageToPublic": "Add a page to public space", "addAPageToWorkspace": "Add a page to workspace",
"recent": "Recent" "recent": "Recent"
}, },
"notifications": { "notifications": {
@ -514,7 +514,17 @@
"shortcutIsAlreadyUsed": "This shortcut is already used for: {conflict}", "shortcutIsAlreadyUsed": "This shortcut is already used for: {conflict}",
"resetToDefault": "Reset to default keybindings", "resetToDefault": "Reset to default keybindings",
"couldNotLoadErrorMsg": "Could not load shortcuts, Try again", "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": { "mobile": {
"personalInfo": "Personal Information", "personalInfo": "Personal Information",
@ -835,6 +845,8 @@
"discardResponse": "Do you want to discard the AI responses?", "discardResponse": "Do you want to discard the AI responses?",
"createInlineMathEquation": "Create equation", "createInlineMathEquation": "Create equation",
"fonts": "Fonts", "fonts": "Fonts",
"insertDate": "Insert date",
"emoji": "Emoji",
"toggleList": "Toggle list", "toggleList": "Toggle list",
"quoteList": "Quote list", "quoteList": "Quote list",
"numberedList": "Numbered list", "numberedList": "Numbered list",

View File

@ -1085,4 +1085,4 @@
"backgroundColorPink": "fondo rosa", "backgroundColorPink": "fondo rosa",
"backgroundColorRed": "fondo rojo" "backgroundColorRed": "fondo rojo"
} }
} }

View File

@ -596,4 +596,4 @@
"deleteContentTitle": "Ziur {pageType} ezabatu nahi duzula?", "deleteContentTitle": "Ziur {pageType} ezabatu nahi duzula?",
"deleteContentCaption": "{pageType} hau ezabatzen baduzu, zaborrontzitik leheneratu dezakezu." "deleteContentCaption": "{pageType} hau ezabatzen baduzu, zaborrontzitik leheneratu dezakezu."
} }
} }

View File

@ -669,4 +669,4 @@
"frequentlyUsed": "استفاده‌شده" "frequentlyUsed": "استفاده‌شده"
} }
} }
} }

View File

@ -1262,4 +1262,4 @@
"userIcon": "Icône utilisateur" "userIcon": "Icône utilisateur"
}, },
"noLogFiles": "Il n'y a pas de log" "noLogFiles": "Il n'y a pas de log"
} }

View File

@ -9,6 +9,7 @@
"title": "Titre", "title": "Titre",
"youCanAlso": "Vous pouvez aussi", "youCanAlso": "Vous pouvez aussi",
"and": "et", "and": "et",
"failedToOpenUrl": "Échec de l'ouverture de l'URL : {}",
"blockActions": { "blockActions": {
"addBelowTooltip": "Cliquez pour ajouter ci-dessous", "addBelowTooltip": "Cliquez pour ajouter ci-dessous",
"addAboveCmd": "Alt+clic", "addAboveCmd": "Alt+clic",
@ -49,6 +50,7 @@
"LogInWithGithub": "Se connecter avec Github", "LogInWithGithub": "Se connecter avec Github",
"LogInWithDiscord": "Se connecter avec Discord", "LogInWithDiscord": "Se connecter avec Discord",
"signInWith": "Se connecter avec :", "signInWith": "Se connecter avec :",
"signInWithEmail": "Se connecter via e-mail",
"loginAsGuestButtonText": "Commencer" "loginAsGuestButtonText": "Commencer"
}, },
"workspace": { "workspace": {
@ -64,7 +66,24 @@
"reportIssueOnGithub": "Signaler un bug sur Github", "reportIssueOnGithub": "Signaler un bug sur Github",
"exportLogFiles": "Exporter les logs", "exportLogFiles": "Exporter les logs",
"reachOut": "Contactez-nous sur Discord" "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": { "shareAction": {
"buttonText": "Partager", "buttonText": "Partager",
@ -133,7 +152,8 @@
"emptyDescription": "Vous n'avez aucun fichier supprimé", "emptyDescription": "Vous n'avez aucun fichier supprimé",
"isDeleted": "a été supprimé", "isDeleted": "a été supprimé",
"isRestored": "a été restauré" "isRestored": "a été restauré"
} },
"confirmDeleteTitle": "Etes-vous sûr de vouloir supprimer définitivement cette page ?"
}, },
"deletePagePrompt": { "deletePagePrompt": {
"text": "Cette page se trouve dans la corbeille", "text": "Cette page se trouve dans la corbeille",
@ -193,10 +213,16 @@
"closeSidebar": "Fermer le menu latéral", "closeSidebar": "Fermer le menu latéral",
"openSidebar": "Ouvrir le menu latéral", "openSidebar": "Ouvrir le menu latéral",
"personal": "Personnel", "personal": "Personnel",
"private": "Privé",
"public": "Publique",
"favorites": "Favoris", "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", "clickToHidePersonal": "Cliquez pour cacher la section personnelle",
"clickToHideFavorites": "Cliquez pour cacher la section favorite", "clickToHideFavorites": "Cliquez pour cacher la section favorite",
"addAPage": "Ajouter une page", "addAPage": "Ajouter une page",
"addAPageToPrivate": "Ajouter une page à l'espace privé",
"addAPageToPublic": "Ajouter une page à l'espace public",
"recent": "Récent" "recent": "Récent"
}, },
"notifications": { "notifications": {
@ -240,9 +266,18 @@
"helpCenter": "Centre d'aide", "helpCenter": "Centre d'aide",
"add": "Ajouter", "add": "Ajouter",
"yes": "Oui", "yes": "Oui",
"clear": "Nettoyer",
"remove": "Retirer", "remove": "Retirer",
"dontRemove": "Ne pas retirer", "dontRemove": "Ne pas retirer",
"copyLink": "Copier le lien",
"align": "Aligner", "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" "tryAGain": "Réessayer"
}, },
"label": { "label": {
@ -340,6 +375,7 @@
"dark": "Mode sombre", "dark": "Mode sombre",
"system": "S'adapter au système" "system": "S'adapter au système"
}, },
"fontScaleFactor": "Facteur d'échelle de police",
"documentSettings": { "documentSettings": {
"cursorColor": "Couleur du curseur du document", "cursorColor": "Couleur du curseur du document",
"selectionColor": "Couleur de sélection du document", "selectionColor": "Couleur de sélection du document",
@ -394,7 +430,9 @@
"twentyFourHour": "Vingt-quatre heures" "twentyFourHour": "Vingt-quatre heures"
}, },
"showNamingDialogWhenCreatingPage": "Afficher la boîte de dialogue de nommage lors de la création d'une page", "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": { "members": {
"title": "Paramètres des membres",
"inviteMembers": "Inviter des membres", "inviteMembers": "Inviter des membres",
"sendInvite": "Envoyer une invitation", "sendInvite": "Envoyer une invitation",
"copyInviteLink": "Copier le lien d'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.", "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", "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", "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": { "files": {
@ -1317,4 +1363,4 @@
"userIcon": "Icône utilisateur" "userIcon": "Icône utilisateur"
}, },
"noLogFiles": "Il n'y a pas de log" "noLogFiles": "Il n'y a pas de log"
} }

View File

@ -594,4 +594,4 @@
"deleteContentTitle": "Biztosan törli a következőt: {pageType}?", "deleteContentTitle": "Biztosan törli a következőt: {pageType}?",
"deleteContentCaption": "ha törli ezt a {pageType} oldalt, visszaállíthatja a kukából." "deleteContentCaption": "ha törli ezt a {pageType} oldalt, visszaállíthatja a kukából."
} }
} }

View File

@ -1017,4 +1017,4 @@
"noFavorite": "Tidak ada halaman favorit", "noFavorite": "Tidak ada halaman favorit",
"noFavoriteHintText": "Geser halaman ke kiri untuk menambahkannya ke favorit Anda" "noFavoriteHintText": "Geser halaman ke kiri untuk menambahkannya ke favorit Anda"
} }
} }

View File

@ -1262,4 +1262,4 @@
"userIcon": "Icona utente" "userIcon": "Icona utente"
}, },
"noLogFiles": "Non ci sono file di log" "noLogFiles": "Non ci sono file di log"
} }

View File

@ -681,4 +681,4 @@
"deleteContentTitle": "{pageType} を削除してもよろしいですか?", "deleteContentTitle": "{pageType} を削除してもよろしいですか?",
"deleteContentCaption": "この {pageType} を削除しても、ゴミ箱から復元できます。" "deleteContentCaption": "この {pageType} を削除しても、ゴミ箱から復元できます。"
} }
} }

View File

@ -593,4 +593,4 @@
"deleteContentTitle": "{pageType}을(를) 삭제하시겠습니까?", "deleteContentTitle": "{pageType}을(를) 삭제하시겠습니까?",
"deleteContentCaption": "이 {pageType}을(를) 삭제하면 휴지통에서 복원할 수 있습니다." "deleteContentCaption": "이 {pageType}을(를) 삭제하면 휴지통에서 복원할 수 있습니다."
} }
} }

View File

@ -1072,4 +1072,4 @@
"language": "Język", "language": "Język",
"font": "Czcionka" "font": "Czcionka"
} }
} }

View File

@ -434,7 +434,17 @@
"shortcutIsAlreadyUsed": "Este atalho já é usado para: {conflict}", "shortcutIsAlreadyUsed": "Este atalho já é usado para: {conflict}",
"resetToDefault": "Redefinir para atalhos de teclado padrão", "resetToDefault": "Redefinir para atalhos de teclado padrão",
"couldNotLoadErrorMsg": "Não foi possível carregar os atalhos. Tente novamente", "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": { "mobile": {
"personalInfo": "Informações pessoais", "personalInfo": "Informações pessoais",
@ -677,9 +687,9 @@
"codeBlock": "Bloco de código" "codeBlock": "Bloco de código"
}, },
"plugins": { "plugins": {
"referencedBoard": "Quadro vinculado", "referencedBoard": "Quadro referenciado",
"referencedGrid": "Grade vinculado", "referencedGrid": "Grade referenciada",
"referencedCalendar": "calendário referenciado", "referencedCalendar": "Calendário referenciado",
"referencedDocument": "Referenciar um documento", "referencedDocument": "Referenciar um documento",
"autoGeneratorMenuItemName": "Gerar nome automaticamente", "autoGeneratorMenuItemName": "Gerar nome automaticamente",
"autoGeneratorTitleName": "Gerar por IA", "autoGeneratorTitleName": "Gerar por IA",
@ -707,6 +717,8 @@
"bulletedList": "Lista com marcadores", "bulletedList": "Lista com marcadores",
"todoList": "Lista de afazeres", "todoList": "Lista de afazeres",
"callout": "Destacar", "callout": "Destacar",
"insertDate": "Inserir data",
"emoji": "Emoji",
"cover": { "cover": {
"changeCover": "Mudar capa", "changeCover": "Mudar capa",
"colors": "cores", "colors": "cores",
@ -1207,4 +1219,4 @@
"addField": "Adicionar campo", "addField": "Adicionar campo",
"userIcon": "Ícone do usuário" "userIcon": "Ícone do usuário"
} }
} }

View File

@ -852,4 +852,4 @@
"noResult": "Nenhum resultado", "noResult": "Nenhum resultado",
"caseSensitive": "Maiúsculas e minúsculas" "caseSensitive": "Maiúsculas e minúsculas"
} }
} }

View File

@ -1311,4 +1311,4 @@
"userIcon": "Пользовательская иконка" "userIcon": "Пользовательская иконка"
}, },
"noLogFiles": "Нет файлов журналов" "noLogFiles": "Нет файлов журналов"
} }

View File

@ -2,14 +2,14 @@
"appName": "AppFlowy", "appName": "AppFlowy",
"defaultUsername": "Jag", "defaultUsername": "Jag",
"welcomeText": "Välkommen till @:appName", "welcomeText": "Välkommen till @:appName",
"failedToOpenUrl": "Det gick inte att öppna webbadressen: {}", "welcomeTo": "Välkommen till",
"githubStarText": "Stjärna på GitHub", "githubStarText": "Stjärna på GitHub",
"subscribeNewsletterText": "Prenumerera på nyhetsbrev", "subscribeNewsletterText": "Prenumerera på nyhetsbrev",
"letsGoButtonText": "Snabbstart", "letsGoButtonText": "Snabbstart",
"title": "Titel", "title": "Titel",
"welcomeTo": "Välkommen till",
"youCanAlso": "Du kan också", "youCanAlso": "Du kan också",
"and": "och", "and": "och",
"failedToOpenUrl": "Det gick inte att öppna webbadressen: {}",
"blockActions": { "blockActions": {
"addBelowTooltip": "Klicka för att lägga till nedan", "addBelowTooltip": "Klicka för att lägga till nedan",
"addAboveCmd": "Alt+klicka", "addAboveCmd": "Alt+klicka",
@ -34,17 +34,17 @@
"signIn": { "signIn": {
"loginTitle": "Logga in till @:appName", "loginTitle": "Logga in till @:appName",
"loginButtonText": "Logga in", "loginButtonText": "Logga in",
"loginStartWithAnonymous": "Börja med en anonym session",
"continueAnonymousUser": "Fortsätt med en anonym session",
"buttonText": "Registrera", "buttonText": "Registrera",
"signingInText": "Loggar in...",
"forgotPassword": "Glömt ditt lösenord?", "forgotPassword": "Glömt ditt lösenord?",
"emailHint": "Epost", "emailHint": "Epost",
"passwordHint": "Lösenord", "passwordHint": "Lösenord",
"dontHaveAnAccount": "Har du inget konto?", "dontHaveAnAccount": "Har du inget konto?",
"repeatPasswordEmptyError": "Upprepat lösenord kan inte vara tomt", "repeatPasswordEmptyError": "Upprepat lösenord kan inte vara tomt",
"unmatchedPasswordError": "Upprepat lösenord är inte samma som det första", "unmatchedPasswordError": "Upprepat lösenord är inte samma som det första",
"loginAsGuestButtonText": "Komma igång", "loginAsGuestButtonText": "Komma igång"
"continueAnonymousUser": "Fortsätt med en anonym session",
"loginStartWithAnonymous": "Börja med en anonym session",
"signingInText": "Loggar in..."
}, },
"workspace": { "workspace": {
"create": "Skapa arbetsyta", "create": "Skapa arbetsyta",
@ -167,7 +167,9 @@
"editContact": "Redigera kontakt" "editContact": "Redigera kontakt"
}, },
"button": { "button": {
"ok": "OK",
"done": "Gjort", "done": "Gjort",
"cancel": "Avbryt",
"signIn": "Logga in", "signIn": "Logga in",
"signOut": "Logga ut", "signOut": "Logga ut",
"complete": "Slutfört", "complete": "Slutfört",
@ -184,8 +186,6 @@
"delete": "Radera", "delete": "Radera",
"duplicate": "Duplicera", "duplicate": "Duplicera",
"putback": "Ställ tillbaka", "putback": "Ställ tillbaka",
"ok": "OK",
"cancel": "Avbryt",
"update": "Uppdatering", "update": "Uppdatering",
"share": "Dela", "share": "Dela",
"removeFromFavorites": "Ta bort från favoriter", "removeFromFavorites": "Ta bort från favoriter",
@ -215,15 +215,15 @@
}, },
"oAuth": { "oAuth": {
"err": { "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": { "google": {
"title": "GOOGLE LOGGA IN",
"instruction1": "För att kunna importera dina Google-kontakter måste du auktorisera denna applikation med din webbläsare.", "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:", "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:", "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:", "instruction4": "Tryck på knappen nedan när du har slutfört registreringen:"
"title": "GOOGLE LOGGA IN"
} }
}, },
"settings": { "settings": {
@ -233,53 +233,53 @@
"language": "Språk", "language": "Språk",
"user": "Användare", "user": "Användare",
"files": "Filer", "files": "Filer",
"notifications": "Aviseringar",
"open": "Öppna Inställningar", "open": "Öppna Inställningar",
"supabaseSetting": "Supabase-inställning", "logout": "Logga ut",
"appFlowyCloudUrlCanNotBeEmpty": "Molnets webbadress får inte vara tom", "logoutPrompt": "Är du säker på att logga ut?",
"changeServerTip": "När du har bytt server måste du klicka på omstartsknappen för att ändringarna ska träda i kraft", "selfEncryptionLogoutPrompt": "Är du säker på att du vill logga ut? Se till att du har kopierat krypteringshemligheten",
"clickToCopy": "Klicka för att kopiera", "syncSetting": "Synkroniseringsinställning",
"clickToCopySecret": "Klicka för att kopiera hemlighet", "cloudSettings": "Molninställningar",
"cloudLocal": "Lokal", "enableSync": "Aktivera synkronisering",
"enableEncrypt": "Kryptera data",
"cloudURL": "Grund-URL",
"invalidCloudURLScheme": "Ogiltigt schema",
"cloudServerType": "Molnserver", "cloudServerType": "Molnserver",
"cloudServerTypeTip": "Observera att det kan logga ut ditt nuvarande konto efter att ha bytt molnserver", "cloudServerTypeTip": "Observera att det kan logga ut ditt nuvarande konto efter att ha bytt molnserver",
"cloudSettings": "Molninställningar", "cloudLocal": "Lokal",
"cloudSupabase": "Supabase", "cloudSupabase": "Supabase",
"cloudSupabaseAnonKey": "Supabase anonym nyckel",
"cloudSupabaseAnonKeyCanNotBeEmpty": "Anon-nyckeln kan inte vara tom",
"cloudSupabaseUrl": "Supabase URL", "cloudSupabaseUrl": "Supabase URL",
"cloudSupabaseUrlCanNotBeEmpty": "Webbadressen för supabase kan inte vara tom", "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", "cloudURLHint": "Ange grundadressen till din server",
"cloudWSURL": "Websocket URL", "cloudWSURL": "Websocket URL",
"cloudWSURLHint": "Infoga websocket-adressen till din server", "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", "restartApp": "Omstart",
"restartAppTip": "Starta om programmet för att ändringarna ska träda i kraft. Observera att detta kan logga ut ditt nuvarande konto", "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", "changeServerTip": "När du har bytt server måste du klicka på omstartsknappen för att ändringarna ska träda i kraft",
"selfHostContent": "dokument", "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",
"selfHostEnd": "för vägledning om hur du själv är värd för din egen server", "inputEncryptPrompt": "Vänligen ange din krypteringshemlighet för",
"selfHostStart": "Om du inte har en server, vänligen se", "clickToCopySecret": "Klicka för att kopiera hemlighet",
"syncSetting": "Synkroniseringsinställning" "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": { "appearance": {
"fontFamily": { "fontFamily": {
@ -295,12 +295,12 @@
"themeUpload": { "themeUpload": {
"button": "Ladda upp", "button": "Ladda upp",
"description": "Ladda upp ditt eget AppFlowy-tema med knappen nedan.", "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...", "loading": "Vänta medan vi validerar och laddar upp ditt tema...",
"uploadSuccess": "Ditt tema laddades upp", "uploadSuccess": "Ditt tema laddades upp",
"deletionFailure": "Det gick inte att ta bort temat. Försök att radera det manuellt.", "deletionFailure": "Det gick inte att ta bort temat. Försök att radera det manuellt.",
"filePickerDialogTitle": "Välj en .flowy_plugin-fil", "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", "theme": "Tema",
"builtInsLabel": "Inbyggda teman", "builtInsLabel": "Inbyggda teman",
@ -614,11 +614,11 @@
} }
}, },
"board": { "board": {
"menuName": "Tavla",
"referencedBoardPrefix": "Utsikt över",
"column": { "column": {
"createNewCard": "Nytt" "createNewCard": "Nytt"
} },
"menuName": "Tavla",
"referencedBoardPrefix": "Utsikt över"
}, },
"calendar": { "calendar": {
"menuName": "Kalender", "menuName": "Kalender",

View File

@ -1089,4 +1089,4 @@
"language": "Dil", "language": "Dil",
"font": "Yazı tipi" "font": "Yazı tipi"
} }
} }

View File

@ -807,4 +807,4 @@
"font": "Phông chữ", "font": "Phông chữ",
"date": "Ngày" "date": "Ngày"
} }
} }

View File

@ -1289,4 +1289,4 @@
"userIcon": "用户图标" "userIcon": "用户图标"
}, },
"noLogFiles": "没有日志文件" "noLogFiles": "没有日志文件"
} }

View File

@ -1257,4 +1257,4 @@
"userIcon": "使用者圖示" "userIcon": "使用者圖示"
}, },
"noLogFiles": "這裡沒有日誌記錄檔案" "noLogFiles": "這裡沒有日誌記錄檔案"
} }

View File

@ -157,7 +157,7 @@ checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
[[package]] [[package]]
name = "app-error" name = "app-error"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -669,7 +669,7 @@ dependencies = [
[[package]] [[package]]
name = "client-api" name = "client-api"
version = "0.1.0" 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 = [ dependencies = [
"again", "again",
"anyhow", "anyhow",
@ -690,7 +690,6 @@ dependencies = [
"getrandom 0.2.10", "getrandom 0.2.10",
"gotrue", "gotrue",
"gotrue-entity", "gotrue-entity",
"governor",
"mime", "mime",
"parking_lot 0.12.1", "parking_lot 0.12.1",
"prost", "prost",
@ -709,14 +708,13 @@ dependencies = [
"url", "url",
"uuid", "uuid",
"wasm-bindgen-futures", "wasm-bindgen-futures",
"workspace-template",
"yrs", "yrs",
] ]
[[package]] [[package]]
name = "client-websocket" name = "client-websocket"
version = "0.1.0" 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 = [ dependencies = [
"futures-channel", "futures-channel",
"futures-util", "futures-util",
@ -759,7 +757,7 @@ dependencies = [
[[package]] [[package]]
name = "collab" name = "collab"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@ -783,7 +781,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-database" name = "collab-database"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-trait", "async-trait",
@ -813,7 +811,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-document" name = "collab-document"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"collab", "collab",
@ -832,7 +830,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-entity" name = "collab-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",
@ -847,7 +845,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-folder" name = "collab-folder"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"chrono", "chrono",
@ -885,7 +883,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-plugins" name = "collab-plugins"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"async-stream", "async-stream",
@ -924,7 +922,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-rt-entity" name = "collab-rt-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -949,7 +947,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-rt-protocol" name = "collab-rt-protocol"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bincode", "bincode",
@ -963,7 +961,7 @@ dependencies = [
[[package]] [[package]]
name = "collab-user" name = "collab-user"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"collab", "collab",
@ -1037,9 +1035,9 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
[[package]] [[package]]
name = "cookie" name = "cookie"
version = "0.16.2" version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb" checksum = "7efb37c3e1ccb1ff97164ad95ac1606e8ccd35b3fa0a7d99a304c7f4a428cc24"
dependencies = [ dependencies = [
"percent-encoding", "percent-encoding",
"time", "time",
@ -1048,12 +1046,12 @@ dependencies = [
[[package]] [[package]]
name = "cookie_store" name = "cookie_store"
version = "0.16.2" version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d606d0fba62e13cf04db20536c05cb7f13673c161cb47a47a82b9b9e7d3f1daa" checksum = "387461abbc748185c3a6e1673d826918b450b87ff22639429c694619a83b6cf6"
dependencies = [ dependencies = [
"cookie", "cookie",
"idna 0.2.3", "idna 0.3.0",
"log", "log",
"publicsuffix", "publicsuffix",
"serde", "serde",
@ -1261,6 +1259,7 @@ dependencies = [
"flowy-user", "flowy-user",
"lazy_static", "lazy_static",
"lib-dispatch", "lib-dispatch",
"lib-log",
"parking_lot 0.12.1", "parking_lot 0.12.1",
"protobuf", "protobuf",
"serde", "serde",
@ -1293,7 +1292,7 @@ checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308"
[[package]] [[package]]
name = "database-entity" name = "database-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -2482,7 +2481,7 @@ dependencies = [
[[package]] [[package]]
name = "gotrue" name = "gotrue"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"futures-util", "futures-util",
@ -2499,7 +2498,7 @@ dependencies = [
[[package]] [[package]]
name = "gotrue-entity" name = "gotrue-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -2510,24 +2509,6 @@ dependencies = [
"serde_json", "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]] [[package]]
name = "h2" name = "h2"
version = "0.3.21" version = "0.3.21"
@ -2784,17 +2765,6 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 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]] [[package]]
name = "idna" name = "idna"
version = "0.3.0" version = "0.3.0"
@ -2889,7 +2859,7 @@ dependencies = [
[[package]] [[package]]
name = "infra" name = "infra"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"reqwest", "reqwest",
@ -3037,6 +3007,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"chrono", "chrono",
"lazy_static", "lazy_static",
"lib-infra",
"serde", "serde",
"serde_json", "serde_json",
"tracing", "tracing",
@ -3132,15 +3103,6 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
[[package]]
name = "mach2"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709"
dependencies = [
"libc",
]
[[package]] [[package]]
name = "macroific" name = "macroific"
version = "1.3.1" version = "1.3.1"
@ -3211,12 +3173,6 @@ dependencies = [
"regex-automata 0.1.10", "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]] [[package]]
name = "matchit" name = "matchit"
version = "0.7.2" version = "0.7.2"
@ -3355,12 +3311,6 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
[[package]]
name = "no-std-compat"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b93853da6d84c2e3c7d730d6473e8817692dd89be387eb01b94d7f108ecb5b8c"
[[package]] [[package]]
name = "nom" name = "nom"
version = "7.1.3" version = "7.1.3"
@ -3371,12 +3321,6 @@ dependencies = [
"minimal-lexical", "minimal-lexical",
] ]
[[package]]
name = "nonzero_ext"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21"
[[package]] [[package]]
name = "ntapi" name = "ntapi"
version = "0.4.1" version = "0.4.1"
@ -4148,22 +4092,6 @@ dependencies = [
"psl-types", "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]] [[package]]
name = "quickcheck" name = "quickcheck"
version = "1.0.3" version = "1.0.3"
@ -4321,15 +4249,6 @@ dependencies = [
"rand_core 0.5.1", "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]] [[package]]
name = "rayon" name = "rayon"
version = "1.9.0" version = "1.9.0"
@ -4456,9 +4375,9 @@ dependencies = [
[[package]] [[package]]
name = "reqwest" name = "reqwest"
version = "0.11.23" version = "0.11.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62"
dependencies = [ dependencies = [
"base64 0.21.5", "base64 0.21.5",
"bytes", "bytes",
@ -4488,6 +4407,7 @@ dependencies = [
"serde", "serde",
"serde_json", "serde_json",
"serde_urlencoded", "serde_urlencoded",
"sync_wrapper",
"system-configuration", "system-configuration",
"tokio", "tokio",
"tokio-native-tls", "tokio-native-tls",
@ -4953,7 +4873,7 @@ dependencies = [
[[package]] [[package]]
name = "shared-entity" name = "shared-entity"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"app-error", "app-error",
@ -6123,9 +6043,9 @@ checksum = "4d91413b1c31d7539ba5ef2451af3f0b833a005eb27a631cec32bc0635a8602b"
[[package]] [[package]]
name = "wasm-streams" name = "wasm-streams"
version = "0.3.0" version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
dependencies = [ dependencies = [
"futures-util", "futures-util",
"js-sys", "js-sys",
@ -6388,27 +6308,6 @@ dependencies = [
"windows-sys", "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]] [[package]]
name = "wyz" name = "wyz"
version = "0.5.1" version = "0.5.1"

View File

@ -111,7 +111,7 @@ rocksdb = { git = "https://github.com/LucasXu0/rust-rocksdb", rev = "21cf4a23ec1
# Run the script.add_workspace_members: # Run the script.add_workspace_members:
# scripts/tool/update_client_api_rev.sh new_rev_id # 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. # Please use the following script to update collab.
# Working directory: frontend # 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: # To switch to the local path, run:
# scripts/tool/update_collab_source.sh # scripts/tool/update_collab_source.sh
# ⚠️⚠️⚠️️ # ⚠️⚠️⚠️️
collab = { 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 = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-folder = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-document = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-database = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-plugins = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-user = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }
collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "5f66f8c921646d7d8762cafc8bbec72d56c2e157" } collab-entity = { git = "https://github.com/AppFlowy-IO/AppFlowy-Collab", rev = "352c55199449fbe321965fd42d2ff09ff54cf3f1" }

View File

@ -24,6 +24,7 @@ crossbeam-utils = "0.8.15"
lazy_static = "1.4.0" lazy_static = "1.4.0"
parking_lot.workspace = true parking_lot.workspace = true
tracing.workspace = true tracing.workspace = true
lib-log.workspace = true
# workspace # workspace
lib-dispatch = { workspace = true } lib-dispatch = { workspace = true }

View File

@ -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_stream_port(int64_t port);
int32_t set_log_stream_port(int64_t port);
void link_me_please(void); void link_me_please(void);
void rust_log(int64_t level, const char *data); void rust_log(int64_t level, const char *data);

Some files were not shown because too many files have changed in this diff Show More