浏览代码

[flutter]: export mark down & migrate to flutter_bloc 7.0 interface

appflowy 3 年之前
父节点
当前提交
345a695bce
共有 41 个文件被更改,包括 2845 次插入174 次删除
  1. 1 1
      app_flowy/lib/startup/tasks/application_task.dart
  2. 79 0
      app_flowy/lib/user/application/sign_in_bloc.freezed.dart
  3. 110 0
      app_flowy/lib/user/application/sign_up_bloc.freezed.dart
  4. 27 0
      app_flowy/lib/user/application/splash_bloc.freezed.dart
  5. 75 0
      app_flowy/lib/user/domain/auth_state.freezed.dart
  6. 177 0
      app_flowy/lib/workspace/application/app/app_bloc.freezed.dart
  7. 187 0
      app_flowy/lib/workspace/application/doc/doc_bloc.freezed.dart
  8. 45 0
      app_flowy/lib/workspace/application/doc/share_bloc.dart
  9. 867 0
      app_flowy/lib/workspace/application/doc/share_bloc.freezed.dart
  10. 49 0
      app_flowy/lib/workspace/application/edit_pannel/edit_pannel_bloc.freezed.dart
  11. 105 0
      app_flowy/lib/workspace/application/home/home_bloc.freezed.dart
  12. 123 0
      app_flowy/lib/workspace/application/home/home_listen_bloc.freezed.dart
  13. 145 0
      app_flowy/lib/workspace/application/menu/menu_bloc.freezed.dart
  14. 49 0
      app_flowy/lib/workspace/application/menu/menu_user_bloc.freezed.dart
  15. 177 0
      app_flowy/lib/workspace/application/trash/trash_bloc.freezed.dart
  16. 177 0
      app_flowy/lib/workspace/application/view/view_bloc.freezed.dart
  17. 110 0
      app_flowy/lib/workspace/application/workspace/welcome_bloc.freezed.dart
  18. 12 0
      app_flowy/lib/workspace/domain/i_share.dart
  19. 7 5
      app_flowy/lib/workspace/domain/page_stack/page_stack.dart
  20. 10 0
      app_flowy/lib/workspace/infrastructure/deps_resolver.dart
  21. 27 0
      app_flowy/lib/workspace/infrastructure/i_share_impl.dart
  22. 15 0
      app_flowy/lib/workspace/infrastructure/repos/share_repo.dart
  23. 3 3
      app_flowy/lib/workspace/presentation/home/navigation.dart
  24. 2 2
      app_flowy/lib/workspace/presentation/stack_page/blank/blank_page.dart
  25. 89 66
      app_flowy/lib/workspace/presentation/stack_page/doc/doc_stack_page.dart
  26. 2 2
      app_flowy/lib/workspace/presentation/stack_page/trash/trash_page.dart
  27. 1 1
      app_flowy/lib/workspace/presentation/widgets/home_top_bar.dart
  28. 0 3
      app_flowy/lib/workspace/presentation/widgets/menu/widget/app/header/right_click_action.dart
  29. 0 3
      app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/disclosure_action.dart
  30. 1 1
      app_flowy/lib/workspace/presentation/widgets/pop_up_action.dart
  31. 14 0
      app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace-infra/export.pb.dart
  32. 4 2
      app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace-infra/export.pbenum.dart
  33. 5 3
      app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace-infra/export.pbjson.dart
  34. 67 53
      app_flowy/pubspec.lock
  35. 3 0
      app_flowy/pubspec.yaml
  36. 3 3
      app_flowy/windows/flutter/generated_plugin_registrant.cc
  37. 1 0
      delta_markdown
  38. 7 2
      rust-lib/flowy-workspace-infra/src/entities/share/export.rs
  39. 62 22
      rust-lib/flowy-workspace-infra/src/protobuf/model/export.rs
  40. 3 1
      rust-lib/flowy-workspace-infra/src/protobuf/proto/export.proto
  41. 4 1
      rust-lib/flowy-workspace/src/services/view_controller.rs

+ 1 - 1
app_flowy/lib/startup/tasks/application_task.dart

@@ -33,7 +33,7 @@ class ApplicationWidget extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     const ratio = 1.73;
-    const minWidth = 1200.0;
+    const minWidth = 800.0;
     setWindowMinSize(const Size(minWidth, minWidth / ratio));
     // const launchWidth = 1310.0;
     // setWindowFrame(const Rect.fromLTWH(0, 0, launchWidth, launchWidth / ratio));

+ 79 - 0
app_flowy/lib/user/application/sign_in_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -46,6 +47,13 @@ mixin _$SignInEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? signedInWithUserEmailAndPassword,
+    TResult Function(String email)? emailChanged,
+    TResult Function(String password)? passwordChanged,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? signedInWithUserEmailAndPassword,
     TResult Function(String email)? emailChanged,
@@ -62,6 +70,14 @@ mixin _$SignInEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(SignedInWithUserEmailAndPassword value)?
+        signedInWithUserEmailAndPassword,
+    TResult Function(EmailChanged value)? emailChanged,
+    TResult Function(PasswordChanged value)? passwordChanged,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(SignedInWithUserEmailAndPassword value)?
         signedInWithUserEmailAndPassword,
@@ -140,6 +156,16 @@ class _$SignedInWithUserEmailAndPassword
     return signedInWithUserEmailAndPassword();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? signedInWithUserEmailAndPassword,
+    TResult Function(String email)? emailChanged,
+    TResult Function(String password)? passwordChanged,
+  }) {
+    return signedInWithUserEmailAndPassword?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -165,6 +191,17 @@ class _$SignedInWithUserEmailAndPassword
     return signedInWithUserEmailAndPassword(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(SignedInWithUserEmailAndPassword value)?
+        signedInWithUserEmailAndPassword,
+    TResult Function(EmailChanged value)? emailChanged,
+    TResult Function(PasswordChanged value)? passwordChanged,
+  }) {
+    return signedInWithUserEmailAndPassword?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -257,6 +294,16 @@ class _$EmailChanged implements EmailChanged {
     return emailChanged(email);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? signedInWithUserEmailAndPassword,
+    TResult Function(String email)? emailChanged,
+    TResult Function(String password)? passwordChanged,
+  }) {
+    return emailChanged?.call(email);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -282,6 +329,17 @@ class _$EmailChanged implements EmailChanged {
     return emailChanged(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(SignedInWithUserEmailAndPassword value)?
+        signedInWithUserEmailAndPassword,
+    TResult Function(EmailChanged value)? emailChanged,
+    TResult Function(PasswordChanged value)? passwordChanged,
+  }) {
+    return emailChanged?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -380,6 +438,16 @@ class _$PasswordChanged implements PasswordChanged {
     return passwordChanged(password);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? signedInWithUserEmailAndPassword,
+    TResult Function(String email)? emailChanged,
+    TResult Function(String password)? passwordChanged,
+  }) {
+    return passwordChanged?.call(password);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -405,6 +473,17 @@ class _$PasswordChanged implements PasswordChanged {
     return passwordChanged(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(SignedInWithUserEmailAndPassword value)?
+        signedInWithUserEmailAndPassword,
+    TResult Function(EmailChanged value)? emailChanged,
+    TResult Function(PasswordChanged value)? passwordChanged,
+  }) {
+    return passwordChanged?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 110 - 0
app_flowy/lib/user/application/sign_up_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -53,6 +54,14 @@ mixin _$SignUpEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? signUpWithUserEmailAndPassword,
+    TResult Function(String email)? emailChanged,
+    TResult Function(String password)? passwordChanged,
+    TResult Function(String password)? repeatPasswordChanged,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? signUpWithUserEmailAndPassword,
     TResult Function(String email)? emailChanged,
@@ -72,6 +81,15 @@ mixin _$SignUpEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(SignUpWithUserEmailAndPassword value)?
+        signUpWithUserEmailAndPassword,
+    TResult Function(EmailChanged value)? emailChanged,
+    TResult Function(PasswordChanged value)? passwordChanged,
+    TResult Function(RepeatPasswordChanged value)? repeatPasswordChanged,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(SignUpWithUserEmailAndPassword value)?
         signUpWithUserEmailAndPassword,
@@ -151,6 +169,17 @@ class _$SignUpWithUserEmailAndPassword
     return signUpWithUserEmailAndPassword();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? signUpWithUserEmailAndPassword,
+    TResult Function(String email)? emailChanged,
+    TResult Function(String password)? passwordChanged,
+    TResult Function(String password)? repeatPasswordChanged,
+  }) {
+    return signUpWithUserEmailAndPassword?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -179,6 +208,18 @@ class _$SignUpWithUserEmailAndPassword
     return signUpWithUserEmailAndPassword(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(SignUpWithUserEmailAndPassword value)?
+        signUpWithUserEmailAndPassword,
+    TResult Function(EmailChanged value)? emailChanged,
+    TResult Function(PasswordChanged value)? passwordChanged,
+    TResult Function(RepeatPasswordChanged value)? repeatPasswordChanged,
+  }) {
+    return signUpWithUserEmailAndPassword?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -273,6 +314,17 @@ class _$EmailChanged implements EmailChanged {
     return emailChanged(email);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? signUpWithUserEmailAndPassword,
+    TResult Function(String email)? emailChanged,
+    TResult Function(String password)? passwordChanged,
+    TResult Function(String password)? repeatPasswordChanged,
+  }) {
+    return emailChanged?.call(email);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -301,6 +353,18 @@ class _$EmailChanged implements EmailChanged {
     return emailChanged(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(SignUpWithUserEmailAndPassword value)?
+        signUpWithUserEmailAndPassword,
+    TResult Function(EmailChanged value)? emailChanged,
+    TResult Function(PasswordChanged value)? passwordChanged,
+    TResult Function(RepeatPasswordChanged value)? repeatPasswordChanged,
+  }) {
+    return emailChanged?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -401,6 +465,17 @@ class _$PasswordChanged implements PasswordChanged {
     return passwordChanged(password);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? signUpWithUserEmailAndPassword,
+    TResult Function(String email)? emailChanged,
+    TResult Function(String password)? passwordChanged,
+    TResult Function(String password)? repeatPasswordChanged,
+  }) {
+    return passwordChanged?.call(password);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -429,6 +504,18 @@ class _$PasswordChanged implements PasswordChanged {
     return passwordChanged(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(SignUpWithUserEmailAndPassword value)?
+        signUpWithUserEmailAndPassword,
+    TResult Function(EmailChanged value)? emailChanged,
+    TResult Function(PasswordChanged value)? passwordChanged,
+    TResult Function(RepeatPasswordChanged value)? repeatPasswordChanged,
+  }) {
+    return passwordChanged?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -530,6 +617,17 @@ class _$RepeatPasswordChanged implements RepeatPasswordChanged {
     return repeatPasswordChanged(password);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? signUpWithUserEmailAndPassword,
+    TResult Function(String email)? emailChanged,
+    TResult Function(String password)? passwordChanged,
+    TResult Function(String password)? repeatPasswordChanged,
+  }) {
+    return repeatPasswordChanged?.call(password);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -558,6 +656,18 @@ class _$RepeatPasswordChanged implements RepeatPasswordChanged {
     return repeatPasswordChanged(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(SignUpWithUserEmailAndPassword value)?
+        signUpWithUserEmailAndPassword,
+    TResult Function(EmailChanged value)? emailChanged,
+    TResult Function(PasswordChanged value)? passwordChanged,
+    TResult Function(RepeatPasswordChanged value)? repeatPasswordChanged,
+  }) {
+    return repeatPasswordChanged?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 27 - 0
app_flowy/lib/user/application/splash_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -32,6 +33,11 @@ mixin _$SplashEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? getUser,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? getUser,
     required TResult orElse(),
@@ -43,6 +49,11 @@ mixin _$SplashEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_GetUser value)? getUser,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(_GetUser value)? getUser,
     required TResult orElse(),
@@ -108,6 +119,14 @@ class _$_GetUser implements _GetUser {
     return getUser();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? getUser,
+  }) {
+    return getUser?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -128,6 +147,14 @@ class _$_GetUser implements _GetUser {
     return getUser(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_GetUser value)? getUser,
+  }) {
+    return getUser?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 75 - 0
app_flowy/lib/user/domain/auth_state.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -46,6 +47,13 @@ mixin _$AuthState {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(UserProfile userProfile)? authenticated,
+    TResult Function(UserError error)? unauthenticated,
+    TResult Function()? initial,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function(UserProfile userProfile)? authenticated,
     TResult Function(UserError error)? unauthenticated,
@@ -61,6 +69,13 @@ mixin _$AuthState {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Authenticated value)? authenticated,
+    TResult Function(Unauthenticated value)? unauthenticated,
+    TResult Function(_Initial value)? initial,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(Authenticated value)? authenticated,
     TResult Function(Unauthenticated value)? unauthenticated,
@@ -157,6 +172,16 @@ class _$Authenticated implements Authenticated {
     return authenticated(userProfile);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(UserProfile userProfile)? authenticated,
+    TResult Function(UserError error)? unauthenticated,
+    TResult Function()? initial,
+  }) {
+    return authenticated?.call(userProfile);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -181,6 +206,16 @@ class _$Authenticated implements Authenticated {
     return authenticated(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Authenticated value)? authenticated,
+    TResult Function(Unauthenticated value)? unauthenticated,
+    TResult Function(_Initial value)? initial,
+  }) {
+    return authenticated?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -276,6 +311,16 @@ class _$Unauthenticated implements Unauthenticated {
     return unauthenticated(error);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(UserProfile userProfile)? authenticated,
+    TResult Function(UserError error)? unauthenticated,
+    TResult Function()? initial,
+  }) {
+    return unauthenticated?.call(error);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -300,6 +345,16 @@ class _$Unauthenticated implements Unauthenticated {
     return unauthenticated(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Authenticated value)? authenticated,
+    TResult Function(Unauthenticated value)? unauthenticated,
+    TResult Function(_Initial value)? initial,
+  }) {
+    return unauthenticated?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -368,6 +423,16 @@ class _$_Initial implements _Initial {
     return initial();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(UserProfile userProfile)? authenticated,
+    TResult Function(UserError error)? unauthenticated,
+    TResult Function()? initial,
+  }) {
+    return initial?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -392,6 +457,16 @@ class _$_Initial implements _Initial {
     return initial(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Authenticated value)? authenticated,
+    TResult Function(Unauthenticated value)? unauthenticated,
+    TResult Function(_Initial value)? initial,
+  }) {
+    return initial?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 177 - 0
app_flowy/lib/workspace/application/app/app_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -68,6 +69,16 @@ mixin _$AppEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc, ViewType viewType)? createView,
+    TResult Function()? delete,
+    TResult Function(String newName)? rename,
+    TResult Function(List<View> views)? didReceiveViews,
+    TResult Function(App app)? appDidUpdate,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? initial,
     TResult Function(String name, String desc, ViewType viewType)? createView,
@@ -89,6 +100,16 @@ mixin _$AppEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateView value)? createView,
+    TResult Function(Delete value)? delete,
+    TResult Function(Rename value)? rename,
+    TResult Function(ReceiveViews value)? didReceiveViews,
+    TResult Function(AppDidUpdate value)? appDidUpdate,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(Initial value)? initial,
     TResult Function(CreateView value)? createView,
@@ -164,6 +185,19 @@ class _$Initial implements Initial {
     return initial();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc, ViewType viewType)? createView,
+    TResult Function()? delete,
+    TResult Function(String newName)? rename,
+    TResult Function(List<View> views)? didReceiveViews,
+    TResult Function(App app)? appDidUpdate,
+  }) {
+    return initial?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -194,6 +228,19 @@ class _$Initial implements Initial {
     return initial(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateView value)? createView,
+    TResult Function(Delete value)? delete,
+    TResult Function(Rename value)? rename,
+    TResult Function(ReceiveViews value)? didReceiveViews,
+    TResult Function(AppDidUpdate value)? appDidUpdate,
+  }) {
+    return initial?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -312,6 +359,19 @@ class _$CreateView implements CreateView {
     return createView(name, desc, viewType);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc, ViewType viewType)? createView,
+    TResult Function()? delete,
+    TResult Function(String newName)? rename,
+    TResult Function(List<View> views)? didReceiveViews,
+    TResult Function(App app)? appDidUpdate,
+  }) {
+    return createView?.call(name, desc, viewType);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -342,6 +402,19 @@ class _$CreateView implements CreateView {
     return createView(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateView value)? createView,
+    TResult Function(Delete value)? delete,
+    TResult Function(Rename value)? rename,
+    TResult Function(ReceiveViews value)? didReceiveViews,
+    TResult Function(AppDidUpdate value)? appDidUpdate,
+  }) {
+    return createView?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -420,6 +493,19 @@ class _$Delete implements Delete {
     return delete();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc, ViewType viewType)? createView,
+    TResult Function()? delete,
+    TResult Function(String newName)? rename,
+    TResult Function(List<View> views)? didReceiveViews,
+    TResult Function(App app)? appDidUpdate,
+  }) {
+    return delete?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -450,6 +536,19 @@ class _$Delete implements Delete {
     return delete(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateView value)? createView,
+    TResult Function(Delete value)? delete,
+    TResult Function(Rename value)? rename,
+    TResult Function(ReceiveViews value)? didReceiveViews,
+    TResult Function(AppDidUpdate value)? appDidUpdate,
+  }) {
+    return delete?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -545,6 +644,19 @@ class _$Rename implements Rename {
     return rename(newName);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc, ViewType viewType)? createView,
+    TResult Function()? delete,
+    TResult Function(String newName)? rename,
+    TResult Function(List<View> views)? didReceiveViews,
+    TResult Function(App app)? appDidUpdate,
+  }) {
+    return rename?.call(newName);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -575,6 +687,19 @@ class _$Rename implements Rename {
     return rename(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateView value)? createView,
+    TResult Function(Delete value)? delete,
+    TResult Function(Rename value)? rename,
+    TResult Function(ReceiveViews value)? didReceiveViews,
+    TResult Function(AppDidUpdate value)? appDidUpdate,
+  }) {
+    return rename?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -676,6 +801,19 @@ class _$ReceiveViews implements ReceiveViews {
     return didReceiveViews(views);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc, ViewType viewType)? createView,
+    TResult Function()? delete,
+    TResult Function(String newName)? rename,
+    TResult Function(List<View> views)? didReceiveViews,
+    TResult Function(App app)? appDidUpdate,
+  }) {
+    return didReceiveViews?.call(views);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -706,6 +844,19 @@ class _$ReceiveViews implements ReceiveViews {
     return didReceiveViews(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateView value)? createView,
+    TResult Function(Delete value)? delete,
+    TResult Function(Rename value)? rename,
+    TResult Function(ReceiveViews value)? didReceiveViews,
+    TResult Function(AppDidUpdate value)? appDidUpdate,
+  }) {
+    return didReceiveViews?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -808,6 +959,19 @@ class _$AppDidUpdate implements AppDidUpdate {
     return appDidUpdate(app);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc, ViewType viewType)? createView,
+    TResult Function()? delete,
+    TResult Function(String newName)? rename,
+    TResult Function(List<View> views)? didReceiveViews,
+    TResult Function(App app)? appDidUpdate,
+  }) {
+    return appDidUpdate?.call(app);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -838,6 +1002,19 @@ class _$AppDidUpdate implements AppDidUpdate {
     return appDidUpdate(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateView value)? createView,
+    TResult Function(Delete value)? delete,
+    TResult Function(Rename value)? rename,
+    TResult Function(ReceiveViews value)? didReceiveViews,
+    TResult Function(AppDidUpdate value)? appDidUpdate,
+  }) {
+    return appDidUpdate?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 187 - 0
app_flowy/lib/workspace/application/doc/doc_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -52,6 +53,15 @@ mixin _$DocEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? deleted,
+    TResult Function()? restore,
+    TResult Function()? restorePage,
+    TResult Function()? deletePermanently,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? initial,
     TResult Function()? deleted,
@@ -71,6 +81,15 @@ mixin _$DocEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(Deleted value)? deleted,
+    TResult Function(Restore value)? restore,
+    TResult Function(RestorePage value)? restorePage,
+    TResult Function(DeletePermanently value)? deletePermanently,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(Initial value)? initial,
     TResult Function(Deleted value)? deleted,
@@ -143,6 +162,18 @@ class _$Initial implements Initial {
     return initial();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? deleted,
+    TResult Function()? restore,
+    TResult Function()? restorePage,
+    TResult Function()? deletePermanently,
+  }) {
+    return initial?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -171,6 +202,18 @@ class _$Initial implements Initial {
     return initial(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(Deleted value)? deleted,
+    TResult Function(Restore value)? restore,
+    TResult Function(RestorePage value)? restorePage,
+    TResult Function(DeletePermanently value)? deletePermanently,
+  }) {
+    return initial?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -238,6 +281,18 @@ class _$Deleted implements Deleted {
     return deleted();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? deleted,
+    TResult Function()? restore,
+    TResult Function()? restorePage,
+    TResult Function()? deletePermanently,
+  }) {
+    return deleted?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -266,6 +321,18 @@ class _$Deleted implements Deleted {
     return deleted(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(Deleted value)? deleted,
+    TResult Function(Restore value)? restore,
+    TResult Function(RestorePage value)? restorePage,
+    TResult Function(DeletePermanently value)? deletePermanently,
+  }) {
+    return deleted?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -333,6 +400,18 @@ class _$Restore implements Restore {
     return restore();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? deleted,
+    TResult Function()? restore,
+    TResult Function()? restorePage,
+    TResult Function()? deletePermanently,
+  }) {
+    return restore?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -361,6 +440,18 @@ class _$Restore implements Restore {
     return restore(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(Deleted value)? deleted,
+    TResult Function(Restore value)? restore,
+    TResult Function(RestorePage value)? restorePage,
+    TResult Function(DeletePermanently value)? deletePermanently,
+  }) {
+    return restore?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -430,6 +521,18 @@ class _$RestorePage implements RestorePage {
     return restorePage();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? deleted,
+    TResult Function()? restore,
+    TResult Function()? restorePage,
+    TResult Function()? deletePermanently,
+  }) {
+    return restorePage?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -458,6 +561,18 @@ class _$RestorePage implements RestorePage {
     return restorePage(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(Deleted value)? deleted,
+    TResult Function(Restore value)? restore,
+    TResult Function(RestorePage value)? restorePage,
+    TResult Function(DeletePermanently value)? deletePermanently,
+  }) {
+    return restorePage?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -527,6 +642,18 @@ class _$DeletePermanently implements DeletePermanently {
     return deletePermanently();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? deleted,
+    TResult Function()? restore,
+    TResult Function()? restorePage,
+    TResult Function()? deletePermanently,
+  }) {
+    return deletePermanently?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -555,6 +682,18 @@ class _$DeletePermanently implements DeletePermanently {
     return deletePermanently(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(Deleted value)? deleted,
+    TResult Function(Restore value)? restore,
+    TResult Function(RestorePage value)? restorePage,
+    TResult Function(DeletePermanently value)? deletePermanently,
+  }) {
+    return deletePermanently?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -790,6 +929,12 @@ mixin _$DocLoadState {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? loading,
+    TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? loading,
     TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish,
@@ -803,6 +948,12 @@ mixin _$DocLoadState {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(_Loading value)? loading,
     TResult Function(_Finish value)? finish,
@@ -871,6 +1022,15 @@ class _$_Loading implements _Loading {
     return loading();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? loading,
+    TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish,
+  }) {
+    return loading?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -893,6 +1053,15 @@ class _$_Loading implements _Loading {
     return loading(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+  }) {
+    return loading?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -981,6 +1150,15 @@ class _$_Finish implements _Finish {
     return finish(successOrFail);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? loading,
+    TResult Function(Either<Unit, WorkspaceError> successOrFail)? finish,
+  }) {
+    return finish?.call(successOrFail);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -1003,6 +1181,15 @@ class _$_Finish implements _Finish {
     return finish(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+  }) {
+    return finish?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 45 - 0
app_flowy/lib/workspace/application/doc/share_bloc.dart

@@ -0,0 +1,45 @@
+import 'package:app_flowy/workspace/domain/i_share.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace-infra/export.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
+import 'package:freezed_annotation/freezed_annotation.dart';
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:dartz/dartz.dart';
+part 'share_bloc.freezed.dart';
+
+class DocShareBloc extends Bloc<DocShareEvent, DocShareState> {
+  IShare shareManager;
+  View view;
+  DocShareBloc({required this.view, required this.shareManager}) : super(const DocShareState.initial()) {
+    on<DocShareEvent>((event, emit) async {
+      await event.map(
+        shareMarkdown: (ShareMarkdown value) async {
+          await shareManager.exportMarkdown(view.id).then((result) {
+            result.fold(
+              (value) => emit(DocShareState.finish(left(value))),
+              (error) => emit(DocShareState.finish(right(error))),
+            );
+          });
+
+          emit(const DocShareState.loading());
+        },
+        shareLink: (ShareLink value) {},
+        shareText: (ShareText value) {},
+      );
+    });
+  }
+}
+
+@freezed
+class DocShareEvent with _$DocShareEvent {
+  const factory DocShareEvent.shareMarkdown() = ShareMarkdown;
+  const factory DocShareEvent.shareText() = ShareText;
+  const factory DocShareEvent.shareLink() = ShareLink;
+}
+
+@freezed
+class DocShareState with _$DocShareState {
+  const factory DocShareState.initial() = _Initial;
+  const factory DocShareState.loading() = _Loading;
+  const factory DocShareState.finish(Either<ExportData, WorkspaceError> successOrFail) = _Finish;
+}

+ 867 - 0
app_flowy/lib/workspace/application/doc/share_bloc.freezed.dart

@@ -0,0 +1,867 @@
+// coverage:ignore-file
+// GENERATED CODE - DO NOT MODIFY BY HAND
+// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
+
+part of 'share_bloc.dart';
+
+// **************************************************************************
+// FreezedGenerator
+// **************************************************************************
+
+T _$identity<T>(T value) => value;
+
+final _privateConstructorUsedError = UnsupportedError(
+    'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more informations: https://github.com/rrousselGit/freezed#custom-getters-and-methods');
+
+/// @nodoc
+class _$DocShareEventTearOff {
+  const _$DocShareEventTearOff();
+
+  ShareMarkdown shareMarkdown() {
+    return const ShareMarkdown();
+  }
+
+  ShareText shareText() {
+    return const ShareText();
+  }
+
+  ShareLink shareLink() {
+    return const ShareLink();
+  }
+}
+
+/// @nodoc
+const $DocShareEvent = _$DocShareEventTearOff();
+
+/// @nodoc
+mixin _$DocShareEvent {
+  @optionalTypeArgs
+  TResult when<TResult extends Object?>({
+    required TResult Function() shareMarkdown,
+    required TResult Function() shareText,
+    required TResult Function() shareLink,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? shareMarkdown,
+    TResult Function()? shareText,
+    TResult Function()? shareLink,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult maybeWhen<TResult extends Object?>({
+    TResult Function()? shareMarkdown,
+    TResult Function()? shareText,
+    TResult Function()? shareLink,
+    required TResult orElse(),
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult map<TResult extends Object?>({
+    required TResult Function(ShareMarkdown value) shareMarkdown,
+    required TResult Function(ShareText value) shareText,
+    required TResult Function(ShareLink value) shareLink,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(ShareMarkdown value)? shareMarkdown,
+    TResult Function(ShareText value)? shareText,
+    TResult Function(ShareLink value)? shareLink,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult maybeMap<TResult extends Object?>({
+    TResult Function(ShareMarkdown value)? shareMarkdown,
+    TResult Function(ShareText value)? shareText,
+    TResult Function(ShareLink value)? shareLink,
+    required TResult orElse(),
+  }) =>
+      throw _privateConstructorUsedError;
+}
+
+/// @nodoc
+abstract class $DocShareEventCopyWith<$Res> {
+  factory $DocShareEventCopyWith(
+          DocShareEvent value, $Res Function(DocShareEvent) then) =
+      _$DocShareEventCopyWithImpl<$Res>;
+}
+
+/// @nodoc
+class _$DocShareEventCopyWithImpl<$Res>
+    implements $DocShareEventCopyWith<$Res> {
+  _$DocShareEventCopyWithImpl(this._value, this._then);
+
+  final DocShareEvent _value;
+  // ignore: unused_field
+  final $Res Function(DocShareEvent) _then;
+}
+
+/// @nodoc
+abstract class $ShareMarkdownCopyWith<$Res> {
+  factory $ShareMarkdownCopyWith(
+          ShareMarkdown value, $Res Function(ShareMarkdown) then) =
+      _$ShareMarkdownCopyWithImpl<$Res>;
+}
+
+/// @nodoc
+class _$ShareMarkdownCopyWithImpl<$Res>
+    extends _$DocShareEventCopyWithImpl<$Res>
+    implements $ShareMarkdownCopyWith<$Res> {
+  _$ShareMarkdownCopyWithImpl(
+      ShareMarkdown _value, $Res Function(ShareMarkdown) _then)
+      : super(_value, (v) => _then(v as ShareMarkdown));
+
+  @override
+  ShareMarkdown get _value => super._value as ShareMarkdown;
+}
+
+/// @nodoc
+
+class _$ShareMarkdown implements ShareMarkdown {
+  const _$ShareMarkdown();
+
+  @override
+  String toString() {
+    return 'DocShareEvent.shareMarkdown()';
+  }
+
+  @override
+  bool operator ==(dynamic other) {
+    return identical(this, other) || (other is ShareMarkdown);
+  }
+
+  @override
+  int get hashCode => runtimeType.hashCode;
+
+  @override
+  @optionalTypeArgs
+  TResult when<TResult extends Object?>({
+    required TResult Function() shareMarkdown,
+    required TResult Function() shareText,
+    required TResult Function() shareLink,
+  }) {
+    return shareMarkdown();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? shareMarkdown,
+    TResult Function()? shareText,
+    TResult Function()? shareLink,
+  }) {
+    return shareMarkdown?.call();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeWhen<TResult extends Object?>({
+    TResult Function()? shareMarkdown,
+    TResult Function()? shareText,
+    TResult Function()? shareLink,
+    required TResult orElse(),
+  }) {
+    if (shareMarkdown != null) {
+      return shareMarkdown();
+    }
+    return orElse();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult map<TResult extends Object?>({
+    required TResult Function(ShareMarkdown value) shareMarkdown,
+    required TResult Function(ShareText value) shareText,
+    required TResult Function(ShareLink value) shareLink,
+  }) {
+    return shareMarkdown(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(ShareMarkdown value)? shareMarkdown,
+    TResult Function(ShareText value)? shareText,
+    TResult Function(ShareLink value)? shareLink,
+  }) {
+    return shareMarkdown?.call(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeMap<TResult extends Object?>({
+    TResult Function(ShareMarkdown value)? shareMarkdown,
+    TResult Function(ShareText value)? shareText,
+    TResult Function(ShareLink value)? shareLink,
+    required TResult orElse(),
+  }) {
+    if (shareMarkdown != null) {
+      return shareMarkdown(this);
+    }
+    return orElse();
+  }
+}
+
+abstract class ShareMarkdown implements DocShareEvent {
+  const factory ShareMarkdown() = _$ShareMarkdown;
+}
+
+/// @nodoc
+abstract class $ShareTextCopyWith<$Res> {
+  factory $ShareTextCopyWith(ShareText value, $Res Function(ShareText) then) =
+      _$ShareTextCopyWithImpl<$Res>;
+}
+
+/// @nodoc
+class _$ShareTextCopyWithImpl<$Res> extends _$DocShareEventCopyWithImpl<$Res>
+    implements $ShareTextCopyWith<$Res> {
+  _$ShareTextCopyWithImpl(ShareText _value, $Res Function(ShareText) _then)
+      : super(_value, (v) => _then(v as ShareText));
+
+  @override
+  ShareText get _value => super._value as ShareText;
+}
+
+/// @nodoc
+
+class _$ShareText implements ShareText {
+  const _$ShareText();
+
+  @override
+  String toString() {
+    return 'DocShareEvent.shareText()';
+  }
+
+  @override
+  bool operator ==(dynamic other) {
+    return identical(this, other) || (other is ShareText);
+  }
+
+  @override
+  int get hashCode => runtimeType.hashCode;
+
+  @override
+  @optionalTypeArgs
+  TResult when<TResult extends Object?>({
+    required TResult Function() shareMarkdown,
+    required TResult Function() shareText,
+    required TResult Function() shareLink,
+  }) {
+    return shareText();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? shareMarkdown,
+    TResult Function()? shareText,
+    TResult Function()? shareLink,
+  }) {
+    return shareText?.call();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeWhen<TResult extends Object?>({
+    TResult Function()? shareMarkdown,
+    TResult Function()? shareText,
+    TResult Function()? shareLink,
+    required TResult orElse(),
+  }) {
+    if (shareText != null) {
+      return shareText();
+    }
+    return orElse();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult map<TResult extends Object?>({
+    required TResult Function(ShareMarkdown value) shareMarkdown,
+    required TResult Function(ShareText value) shareText,
+    required TResult Function(ShareLink value) shareLink,
+  }) {
+    return shareText(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(ShareMarkdown value)? shareMarkdown,
+    TResult Function(ShareText value)? shareText,
+    TResult Function(ShareLink value)? shareLink,
+  }) {
+    return shareText?.call(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeMap<TResult extends Object?>({
+    TResult Function(ShareMarkdown value)? shareMarkdown,
+    TResult Function(ShareText value)? shareText,
+    TResult Function(ShareLink value)? shareLink,
+    required TResult orElse(),
+  }) {
+    if (shareText != null) {
+      return shareText(this);
+    }
+    return orElse();
+  }
+}
+
+abstract class ShareText implements DocShareEvent {
+  const factory ShareText() = _$ShareText;
+}
+
+/// @nodoc
+abstract class $ShareLinkCopyWith<$Res> {
+  factory $ShareLinkCopyWith(ShareLink value, $Res Function(ShareLink) then) =
+      _$ShareLinkCopyWithImpl<$Res>;
+}
+
+/// @nodoc
+class _$ShareLinkCopyWithImpl<$Res> extends _$DocShareEventCopyWithImpl<$Res>
+    implements $ShareLinkCopyWith<$Res> {
+  _$ShareLinkCopyWithImpl(ShareLink _value, $Res Function(ShareLink) _then)
+      : super(_value, (v) => _then(v as ShareLink));
+
+  @override
+  ShareLink get _value => super._value as ShareLink;
+}
+
+/// @nodoc
+
+class _$ShareLink implements ShareLink {
+  const _$ShareLink();
+
+  @override
+  String toString() {
+    return 'DocShareEvent.shareLink()';
+  }
+
+  @override
+  bool operator ==(dynamic other) {
+    return identical(this, other) || (other is ShareLink);
+  }
+
+  @override
+  int get hashCode => runtimeType.hashCode;
+
+  @override
+  @optionalTypeArgs
+  TResult when<TResult extends Object?>({
+    required TResult Function() shareMarkdown,
+    required TResult Function() shareText,
+    required TResult Function() shareLink,
+  }) {
+    return shareLink();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? shareMarkdown,
+    TResult Function()? shareText,
+    TResult Function()? shareLink,
+  }) {
+    return shareLink?.call();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeWhen<TResult extends Object?>({
+    TResult Function()? shareMarkdown,
+    TResult Function()? shareText,
+    TResult Function()? shareLink,
+    required TResult orElse(),
+  }) {
+    if (shareLink != null) {
+      return shareLink();
+    }
+    return orElse();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult map<TResult extends Object?>({
+    required TResult Function(ShareMarkdown value) shareMarkdown,
+    required TResult Function(ShareText value) shareText,
+    required TResult Function(ShareLink value) shareLink,
+  }) {
+    return shareLink(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(ShareMarkdown value)? shareMarkdown,
+    TResult Function(ShareText value)? shareText,
+    TResult Function(ShareLink value)? shareLink,
+  }) {
+    return shareLink?.call(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeMap<TResult extends Object?>({
+    TResult Function(ShareMarkdown value)? shareMarkdown,
+    TResult Function(ShareText value)? shareText,
+    TResult Function(ShareLink value)? shareLink,
+    required TResult orElse(),
+  }) {
+    if (shareLink != null) {
+      return shareLink(this);
+    }
+    return orElse();
+  }
+}
+
+abstract class ShareLink implements DocShareEvent {
+  const factory ShareLink() = _$ShareLink;
+}
+
+/// @nodoc
+class _$DocShareStateTearOff {
+  const _$DocShareStateTearOff();
+
+  _Initial initial() {
+    return const _Initial();
+  }
+
+  _Loading loading() {
+    return const _Loading();
+  }
+
+  _Finish finish(Either<ExportData, WorkspaceError> successOrFail) {
+    return _Finish(
+      successOrFail,
+    );
+  }
+}
+
+/// @nodoc
+const $DocShareState = _$DocShareStateTearOff();
+
+/// @nodoc
+mixin _$DocShareState {
+  @optionalTypeArgs
+  TResult when<TResult extends Object?>({
+    required TResult Function() initial,
+    required TResult Function() loading,
+    required TResult Function(Either<ExportData, WorkspaceError> successOrFail)
+        finish,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? loading,
+    TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult maybeWhen<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? loading,
+    TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish,
+    required TResult orElse(),
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult map<TResult extends Object?>({
+    required TResult Function(_Initial value) initial,
+    required TResult Function(_Loading value) loading,
+    required TResult Function(_Finish value) finish,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
+  TResult maybeMap<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+    required TResult orElse(),
+  }) =>
+      throw _privateConstructorUsedError;
+}
+
+/// @nodoc
+abstract class $DocShareStateCopyWith<$Res> {
+  factory $DocShareStateCopyWith(
+          DocShareState value, $Res Function(DocShareState) then) =
+      _$DocShareStateCopyWithImpl<$Res>;
+}
+
+/// @nodoc
+class _$DocShareStateCopyWithImpl<$Res>
+    implements $DocShareStateCopyWith<$Res> {
+  _$DocShareStateCopyWithImpl(this._value, this._then);
+
+  final DocShareState _value;
+  // ignore: unused_field
+  final $Res Function(DocShareState) _then;
+}
+
+/// @nodoc
+abstract class _$InitialCopyWith<$Res> {
+  factory _$InitialCopyWith(_Initial value, $Res Function(_Initial) then) =
+      __$InitialCopyWithImpl<$Res>;
+}
+
+/// @nodoc
+class __$InitialCopyWithImpl<$Res> extends _$DocShareStateCopyWithImpl<$Res>
+    implements _$InitialCopyWith<$Res> {
+  __$InitialCopyWithImpl(_Initial _value, $Res Function(_Initial) _then)
+      : super(_value, (v) => _then(v as _Initial));
+
+  @override
+  _Initial get _value => super._value as _Initial;
+}
+
+/// @nodoc
+
+class _$_Initial implements _Initial {
+  const _$_Initial();
+
+  @override
+  String toString() {
+    return 'DocShareState.initial()';
+  }
+
+  @override
+  bool operator ==(dynamic other) {
+    return identical(this, other) || (other is _Initial);
+  }
+
+  @override
+  int get hashCode => runtimeType.hashCode;
+
+  @override
+  @optionalTypeArgs
+  TResult when<TResult extends Object?>({
+    required TResult Function() initial,
+    required TResult Function() loading,
+    required TResult Function(Either<ExportData, WorkspaceError> successOrFail)
+        finish,
+  }) {
+    return initial();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? loading,
+    TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish,
+  }) {
+    return initial?.call();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeWhen<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? loading,
+    TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish,
+    required TResult orElse(),
+  }) {
+    if (initial != null) {
+      return initial();
+    }
+    return orElse();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult map<TResult extends Object?>({
+    required TResult Function(_Initial value) initial,
+    required TResult Function(_Loading value) loading,
+    required TResult Function(_Finish value) finish,
+  }) {
+    return initial(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+  }) {
+    return initial?.call(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeMap<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+    required TResult orElse(),
+  }) {
+    if (initial != null) {
+      return initial(this);
+    }
+    return orElse();
+  }
+}
+
+abstract class _Initial implements DocShareState {
+  const factory _Initial() = _$_Initial;
+}
+
+/// @nodoc
+abstract class _$LoadingCopyWith<$Res> {
+  factory _$LoadingCopyWith(_Loading value, $Res Function(_Loading) then) =
+      __$LoadingCopyWithImpl<$Res>;
+}
+
+/// @nodoc
+class __$LoadingCopyWithImpl<$Res> extends _$DocShareStateCopyWithImpl<$Res>
+    implements _$LoadingCopyWith<$Res> {
+  __$LoadingCopyWithImpl(_Loading _value, $Res Function(_Loading) _then)
+      : super(_value, (v) => _then(v as _Loading));
+
+  @override
+  _Loading get _value => super._value as _Loading;
+}
+
+/// @nodoc
+
+class _$_Loading implements _Loading {
+  const _$_Loading();
+
+  @override
+  String toString() {
+    return 'DocShareState.loading()';
+  }
+
+  @override
+  bool operator ==(dynamic other) {
+    return identical(this, other) || (other is _Loading);
+  }
+
+  @override
+  int get hashCode => runtimeType.hashCode;
+
+  @override
+  @optionalTypeArgs
+  TResult when<TResult extends Object?>({
+    required TResult Function() initial,
+    required TResult Function() loading,
+    required TResult Function(Either<ExportData, WorkspaceError> successOrFail)
+        finish,
+  }) {
+    return loading();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? loading,
+    TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish,
+  }) {
+    return loading?.call();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeWhen<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? loading,
+    TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish,
+    required TResult orElse(),
+  }) {
+    if (loading != null) {
+      return loading();
+    }
+    return orElse();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult map<TResult extends Object?>({
+    required TResult Function(_Initial value) initial,
+    required TResult Function(_Loading value) loading,
+    required TResult Function(_Finish value) finish,
+  }) {
+    return loading(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+  }) {
+    return loading?.call(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeMap<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+    required TResult orElse(),
+  }) {
+    if (loading != null) {
+      return loading(this);
+    }
+    return orElse();
+  }
+}
+
+abstract class _Loading implements DocShareState {
+  const factory _Loading() = _$_Loading;
+}
+
+/// @nodoc
+abstract class _$FinishCopyWith<$Res> {
+  factory _$FinishCopyWith(_Finish value, $Res Function(_Finish) then) =
+      __$FinishCopyWithImpl<$Res>;
+  $Res call({Either<ExportData, WorkspaceError> successOrFail});
+}
+
+/// @nodoc
+class __$FinishCopyWithImpl<$Res> extends _$DocShareStateCopyWithImpl<$Res>
+    implements _$FinishCopyWith<$Res> {
+  __$FinishCopyWithImpl(_Finish _value, $Res Function(_Finish) _then)
+      : super(_value, (v) => _then(v as _Finish));
+
+  @override
+  _Finish get _value => super._value as _Finish;
+
+  @override
+  $Res call({
+    Object? successOrFail = freezed,
+  }) {
+    return _then(_Finish(
+      successOrFail == freezed
+          ? _value.successOrFail
+          : successOrFail // ignore: cast_nullable_to_non_nullable
+              as Either<ExportData, WorkspaceError>,
+    ));
+  }
+}
+
+/// @nodoc
+
+class _$_Finish implements _Finish {
+  const _$_Finish(this.successOrFail);
+
+  @override
+  final Either<ExportData, WorkspaceError> successOrFail;
+
+  @override
+  String toString() {
+    return 'DocShareState.finish(successOrFail: $successOrFail)';
+  }
+
+  @override
+  bool operator ==(dynamic other) {
+    return identical(this, other) ||
+        (other is _Finish &&
+            (identical(other.successOrFail, successOrFail) ||
+                const DeepCollectionEquality()
+                    .equals(other.successOrFail, successOrFail)));
+  }
+
+  @override
+  int get hashCode =>
+      runtimeType.hashCode ^ const DeepCollectionEquality().hash(successOrFail);
+
+  @JsonKey(ignore: true)
+  @override
+  _$FinishCopyWith<_Finish> get copyWith =>
+      __$FinishCopyWithImpl<_Finish>(this, _$identity);
+
+  @override
+  @optionalTypeArgs
+  TResult when<TResult extends Object?>({
+    required TResult Function() initial,
+    required TResult Function() loading,
+    required TResult Function(Either<ExportData, WorkspaceError> successOrFail)
+        finish,
+  }) {
+    return finish(successOrFail);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? loading,
+    TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish,
+  }) {
+    return finish?.call(successOrFail);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeWhen<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? loading,
+    TResult Function(Either<ExportData, WorkspaceError> successOrFail)? finish,
+    required TResult orElse(),
+  }) {
+    if (finish != null) {
+      return finish(successOrFail);
+    }
+    return orElse();
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult map<TResult extends Object?>({
+    required TResult Function(_Initial value) initial,
+    required TResult Function(_Loading value) loading,
+    required TResult Function(_Finish value) finish,
+  }) {
+    return finish(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+  }) {
+    return finish?.call(this);
+  }
+
+  @override
+  @optionalTypeArgs
+  TResult maybeMap<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_Loading value)? loading,
+    TResult Function(_Finish value)? finish,
+    required TResult orElse(),
+  }) {
+    if (finish != null) {
+      return finish(this);
+    }
+    return orElse();
+  }
+}
+
+abstract class _Finish implements DocShareState {
+  const factory _Finish(Either<ExportData, WorkspaceError> successOrFail) =
+      _$_Finish;
+
+  Either<ExportData, WorkspaceError> get successOrFail =>
+      throw _privateConstructorUsedError;
+  @JsonKey(ignore: true)
+  _$FinishCopyWith<_Finish> get copyWith => throw _privateConstructorUsedError;
+}

+ 49 - 0
app_flowy/lib/workspace/application/edit_pannel/edit_pannel_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -43,6 +44,12 @@ mixin _$EditPannelEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(EditPannelContext context)? startEdit,
+    TResult Function(EditPannelContext context)? endEdit,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function(EditPannelContext context)? startEdit,
     TResult Function(EditPannelContext context)? endEdit,
@@ -56,6 +63,12 @@ mixin _$EditPannelEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_StartEdit value)? startEdit,
+    TResult Function(_EndEdit value)? endEdit,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(_StartEdit value)? startEdit,
     TResult Function(_EndEdit value)? endEdit,
@@ -169,6 +182,15 @@ class _$_StartEdit implements _StartEdit {
     return startEdit(context);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(EditPannelContext context)? startEdit,
+    TResult Function(EditPannelContext context)? endEdit,
+  }) {
+    return startEdit?.call(context);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -191,6 +213,15 @@ class _$_StartEdit implements _StartEdit {
     return startEdit(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_StartEdit value)? startEdit,
+    TResult Function(_EndEdit value)? endEdit,
+  }) {
+    return startEdit?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -286,6 +317,15 @@ class _$_EndEdit implements _EndEdit {
     return endEdit(context);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(EditPannelContext context)? startEdit,
+    TResult Function(EditPannelContext context)? endEdit,
+  }) {
+    return endEdit?.call(context);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -308,6 +348,15 @@ class _$_EndEdit implements _EndEdit {
     return endEdit(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_StartEdit value)? startEdit,
+    TResult Function(_EndEdit value)? endEdit,
+  }) {
+    return endEdit?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 105 - 0
app_flowy/lib/workspace/application/home/home_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -53,6 +54,14 @@ mixin _$HomeEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(bool isLoading)? showLoading,
+    TResult Function(bool forceCollapse)? forceCollapse,
+    TResult Function(EditPannelContext editContext)? setEditPannel,
+    TResult Function()? dismissEditPannel,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function(bool isLoading)? showLoading,
     TResult Function(bool forceCollapse)? forceCollapse,
@@ -70,6 +79,14 @@ mixin _$HomeEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_ShowLoading value)? showLoading,
+    TResult Function(_ForceCollapse value)? forceCollapse,
+    TResult Function(_ShowEditPannel value)? setEditPannel,
+    TResult Function(_DismissEditPannel value)? dismissEditPannel,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(_ShowLoading value)? showLoading,
     TResult Function(_ForceCollapse value)? forceCollapse,
@@ -168,6 +185,17 @@ class _$_ShowLoading implements _ShowLoading {
     return showLoading(isLoading);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(bool isLoading)? showLoading,
+    TResult Function(bool forceCollapse)? forceCollapse,
+    TResult Function(EditPannelContext editContext)? setEditPannel,
+    TResult Function()? dismissEditPannel,
+  }) {
+    return showLoading?.call(isLoading);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -194,6 +222,17 @@ class _$_ShowLoading implements _ShowLoading {
     return showLoading(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_ShowLoading value)? showLoading,
+    TResult Function(_ForceCollapse value)? forceCollapse,
+    TResult Function(_ShowEditPannel value)? setEditPannel,
+    TResult Function(_DismissEditPannel value)? dismissEditPannel,
+  }) {
+    return showLoading?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -292,6 +331,17 @@ class _$_ForceCollapse implements _ForceCollapse {
     return forceCollapse(this.forceCollapse);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(bool isLoading)? showLoading,
+    TResult Function(bool forceCollapse)? forceCollapse,
+    TResult Function(EditPannelContext editContext)? setEditPannel,
+    TResult Function()? dismissEditPannel,
+  }) {
+    return forceCollapse?.call(this.forceCollapse);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -318,6 +368,17 @@ class _$_ForceCollapse implements _ForceCollapse {
     return forceCollapse(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_ShowLoading value)? showLoading,
+    TResult Function(_ForceCollapse value)? forceCollapse,
+    TResult Function(_ShowEditPannel value)? setEditPannel,
+    TResult Function(_DismissEditPannel value)? dismissEditPannel,
+  }) {
+    return forceCollapse?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -416,6 +477,17 @@ class _$_ShowEditPannel implements _ShowEditPannel {
     return setEditPannel(editContext);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(bool isLoading)? showLoading,
+    TResult Function(bool forceCollapse)? forceCollapse,
+    TResult Function(EditPannelContext editContext)? setEditPannel,
+    TResult Function()? dismissEditPannel,
+  }) {
+    return setEditPannel?.call(editContext);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -442,6 +514,17 @@ class _$_ShowEditPannel implements _ShowEditPannel {
     return setEditPannel(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_ShowLoading value)? showLoading,
+    TResult Function(_ForceCollapse value)? forceCollapse,
+    TResult Function(_ShowEditPannel value)? setEditPannel,
+    TResult Function(_DismissEditPannel value)? dismissEditPannel,
+  }) {
+    return setEditPannel?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -516,6 +599,17 @@ class _$_DismissEditPannel implements _DismissEditPannel {
     return dismissEditPannel();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function(bool isLoading)? showLoading,
+    TResult Function(bool forceCollapse)? forceCollapse,
+    TResult Function(EditPannelContext editContext)? setEditPannel,
+    TResult Function()? dismissEditPannel,
+  }) {
+    return dismissEditPannel?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -542,6 +636,17 @@ class _$_DismissEditPannel implements _DismissEditPannel {
     return dismissEditPannel(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_ShowLoading value)? showLoading,
+    TResult Function(_ForceCollapse value)? forceCollapse,
+    TResult Function(_ShowEditPannel value)? setEditPannel,
+    TResult Function(_DismissEditPannel value)? dismissEditPannel,
+  }) {
+    return dismissEditPannel?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 123 - 0
app_flowy/lib/workspace/application/home/home_listen_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -44,6 +45,13 @@ mixin _$HomeListenEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? started,
+    TResult Function()? stop,
+    TResult Function(String msg)? unauthorized,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? started,
     TResult Function()? stop,
@@ -59,6 +67,13 @@ mixin _$HomeListenEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Started value)? started,
+    TResult Function(_Stop value)? stop,
+    TResult Function(_Unauthorized value)? unauthorized,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(_Started value)? started,
     TResult Function(_Stop value)? stop,
@@ -129,6 +144,16 @@ class _$_Started implements _Started {
     return started();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? started,
+    TResult Function()? stop,
+    TResult Function(String msg)? unauthorized,
+  }) {
+    return started?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -153,6 +178,16 @@ class _$_Started implements _Started {
     return started(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Started value)? started,
+    TResult Function(_Stop value)? stop,
+    TResult Function(_Unauthorized value)? unauthorized,
+  }) {
+    return started?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -216,6 +251,16 @@ class _$_Stop implements _Stop {
     return stop();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? started,
+    TResult Function()? stop,
+    TResult Function(String msg)? unauthorized,
+  }) {
+    return stop?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -240,6 +285,16 @@ class _$_Stop implements _Stop {
     return stop(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Started value)? started,
+    TResult Function(_Stop value)? stop,
+    TResult Function(_Unauthorized value)? unauthorized,
+  }) {
+    return stop?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -331,6 +386,16 @@ class _$_Unauthorized implements _Unauthorized {
     return unauthorized(msg);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? started,
+    TResult Function()? stop,
+    TResult Function(String msg)? unauthorized,
+  }) {
+    return unauthorized?.call(msg);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -355,6 +420,16 @@ class _$_Unauthorized implements _Unauthorized {
     return unauthorized(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Started value)? started,
+    TResult Function(_Stop value)? stop,
+    TResult Function(_Unauthorized value)? unauthorized,
+  }) {
+    return unauthorized?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -406,6 +481,12 @@ mixin _$HomeListenState {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? loading,
+    TResult Function(String msg)? unauthorized,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? loading,
     TResult Function(String msg)? unauthorized,
@@ -419,6 +500,12 @@ mixin _$HomeListenState {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Loading value)? loading,
+    TResult Function(Unauthorized value)? unauthorized,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(Loading value)? loading,
     TResult Function(Unauthorized value)? unauthorized,
@@ -487,6 +574,15 @@ class _$Loading implements Loading {
     return loading();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? loading,
+    TResult Function(String msg)? unauthorized,
+  }) {
+    return loading?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -509,6 +605,15 @@ class _$Loading implements Loading {
     return loading(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Loading value)? loading,
+    TResult Function(Unauthorized value)? unauthorized,
+  }) {
+    return loading?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -598,6 +703,15 @@ class _$Unauthorized implements Unauthorized {
     return unauthorized(msg);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? loading,
+    TResult Function(String msg)? unauthorized,
+  }) {
+    return unauthorized?.call(msg);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -620,6 +734,15 @@ class _$Unauthorized implements Unauthorized {
     return unauthorized(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Loading value)? loading,
+    TResult Function(Unauthorized value)? unauthorized,
+  }) {
+    return unauthorized?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 145 - 0
app_flowy/lib/workspace/application/menu/menu_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -61,6 +62,16 @@ mixin _$MenuEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? collapse,
+    TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
+    TResult Function(String name, String? desc)? createApp,
+    TResult Function(Either<List<App>, WorkspaceError> appsOrFail)?
+        didReceiveApps,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? initial,
     TResult Function()? collapse,
@@ -81,6 +92,15 @@ mixin _$MenuEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(Collapse value)? collapse,
+    TResult Function(OpenPage value)? openPage,
+    TResult Function(CreateApp value)? createApp,
+    TResult Function(ReceiveApps value)? didReceiveApps,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(_Initial value)? initial,
     TResult Function(Collapse value)? collapse,
@@ -155,6 +175,19 @@ class _$_Initial implements _Initial {
     return initial();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? collapse,
+    TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
+    TResult Function(String name, String? desc)? createApp,
+    TResult Function(Either<List<App>, WorkspaceError> appsOrFail)?
+        didReceiveApps,
+  }) {
+    return initial?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -184,6 +217,18 @@ class _$_Initial implements _Initial {
     return initial(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(Collapse value)? collapse,
+    TResult Function(OpenPage value)? openPage,
+    TResult Function(CreateApp value)? createApp,
+    TResult Function(ReceiveApps value)? didReceiveApps,
+  }) {
+    return initial?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -253,6 +298,19 @@ class _$Collapse implements Collapse {
     return collapse();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? collapse,
+    TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
+    TResult Function(String name, String? desc)? createApp,
+    TResult Function(Either<List<App>, WorkspaceError> appsOrFail)?
+        didReceiveApps,
+  }) {
+    return collapse?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -282,6 +340,18 @@ class _$Collapse implements Collapse {
     return collapse(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(Collapse value)? collapse,
+    TResult Function(OpenPage value)? openPage,
+    TResult Function(CreateApp value)? createApp,
+    TResult Function(ReceiveApps value)? didReceiveApps,
+  }) {
+    return collapse?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -376,6 +446,19 @@ class _$OpenPage implements OpenPage {
     return openPage(context);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? collapse,
+    TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
+    TResult Function(String name, String? desc)? createApp,
+    TResult Function(Either<List<App>, WorkspaceError> appsOrFail)?
+        didReceiveApps,
+  }) {
+    return openPage?.call(context);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -405,6 +488,18 @@ class _$OpenPage implements OpenPage {
     return openPage(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(Collapse value)? collapse,
+    TResult Function(OpenPage value)? openPage,
+    TResult Function(CreateApp value)? createApp,
+    TResult Function(ReceiveApps value)? didReceiveApps,
+  }) {
+    return openPage?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -517,6 +612,19 @@ class _$CreateApp implements CreateApp {
     return createApp(name, desc);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? collapse,
+    TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
+    TResult Function(String name, String? desc)? createApp,
+    TResult Function(Either<List<App>, WorkspaceError> appsOrFail)?
+        didReceiveApps,
+  }) {
+    return createApp?.call(name, desc);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -546,6 +654,18 @@ class _$CreateApp implements CreateApp {
     return createApp(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(Collapse value)? collapse,
+    TResult Function(OpenPage value)? openPage,
+    TResult Function(CreateApp value)? createApp,
+    TResult Function(ReceiveApps value)? didReceiveApps,
+  }) {
+    return createApp?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -649,6 +769,19 @@ class _$ReceiveApps implements ReceiveApps {
     return didReceiveApps(appsOrFail);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? collapse,
+    TResult Function(HomeStackContext<dynamic, dynamic> context)? openPage,
+    TResult Function(String name, String? desc)? createApp,
+    TResult Function(Either<List<App>, WorkspaceError> appsOrFail)?
+        didReceiveApps,
+  }) {
+    return didReceiveApps?.call(appsOrFail);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -678,6 +811,18 @@ class _$ReceiveApps implements ReceiveApps {
     return didReceiveApps(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(Collapse value)? collapse,
+    TResult Function(OpenPage value)? openPage,
+    TResult Function(CreateApp value)? createApp,
+    TResult Function(ReceiveApps value)? didReceiveApps,
+  }) {
+    return didReceiveApps?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 49 - 0
app_flowy/lib/workspace/application/menu/menu_user_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -37,6 +38,12 @@ mixin _$MenuUserEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? fetchWorkspaces,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? initial,
     TResult Function()? fetchWorkspaces,
@@ -50,6 +57,12 @@ mixin _$MenuUserEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_FetchWorkspaces value)? fetchWorkspaces,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(_Initial value)? initial,
     TResult Function(_FetchWorkspaces value)? fetchWorkspaces,
@@ -118,6 +131,15 @@ class _$_Initial implements _Initial {
     return initial();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? fetchWorkspaces,
+  }) {
+    return initial?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -140,6 +162,15 @@ class _$_Initial implements _Initial {
     return initial(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_FetchWorkspaces value)? fetchWorkspaces,
+  }) {
+    return initial?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -204,6 +235,15 @@ class _$_FetchWorkspaces implements _FetchWorkspaces {
     return fetchWorkspaces();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function()? fetchWorkspaces,
+  }) {
+    return fetchWorkspaces?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -226,6 +266,15 @@ class _$_FetchWorkspaces implements _FetchWorkspaces {
     return fetchWorkspaces(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(_Initial value)? initial,
+    TResult Function(_FetchWorkspaces value)? fetchWorkspaces,
+  }) {
+    return fetchWorkspaces?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 177 - 0
app_flowy/lib/workspace/application/trash/trash_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -63,6 +64,16 @@ mixin _$TrashEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(List<Trash> trash)? didReceiveTrash,
+    TResult Function(String trashId)? putback,
+    TResult Function(Trash trash)? delete,
+    TResult Function()? restoreAll,
+    TResult Function()? deleteAll,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? initial,
     TResult Function(List<Trash> trash)? didReceiveTrash,
@@ -84,6 +95,16 @@ mixin _$TrashEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(ReceiveTrash value)? didReceiveTrash,
+    TResult Function(Putback value)? putback,
+    TResult Function(Delete value)? delete,
+    TResult Function(RestoreAll value)? restoreAll,
+    TResult Function(DeleteAll value)? deleteAll,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(Initial value)? initial,
     TResult Function(ReceiveTrash value)? didReceiveTrash,
@@ -159,6 +180,19 @@ class _$Initial implements Initial {
     return initial();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(List<Trash> trash)? didReceiveTrash,
+    TResult Function(String trashId)? putback,
+    TResult Function(Trash trash)? delete,
+    TResult Function()? restoreAll,
+    TResult Function()? deleteAll,
+  }) {
+    return initial?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -189,6 +223,19 @@ class _$Initial implements Initial {
     return initial(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(ReceiveTrash value)? didReceiveTrash,
+    TResult Function(Putback value)? putback,
+    TResult Function(Delete value)? delete,
+    TResult Function(RestoreAll value)? restoreAll,
+    TResult Function(DeleteAll value)? deleteAll,
+  }) {
+    return initial?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -285,6 +332,19 @@ class _$ReceiveTrash implements ReceiveTrash {
     return didReceiveTrash(trash);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(List<Trash> trash)? didReceiveTrash,
+    TResult Function(String trashId)? putback,
+    TResult Function(Trash trash)? delete,
+    TResult Function()? restoreAll,
+    TResult Function()? deleteAll,
+  }) {
+    return didReceiveTrash?.call(trash);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -315,6 +375,19 @@ class _$ReceiveTrash implements ReceiveTrash {
     return didReceiveTrash(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(ReceiveTrash value)? didReceiveTrash,
+    TResult Function(Putback value)? putback,
+    TResult Function(Delete value)? delete,
+    TResult Function(RestoreAll value)? restoreAll,
+    TResult Function(DeleteAll value)? deleteAll,
+  }) {
+    return didReceiveTrash?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -414,6 +487,19 @@ class _$Putback implements Putback {
     return putback(trashId);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(List<Trash> trash)? didReceiveTrash,
+    TResult Function(String trashId)? putback,
+    TResult Function(Trash trash)? delete,
+    TResult Function()? restoreAll,
+    TResult Function()? deleteAll,
+  }) {
+    return putback?.call(trashId);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -444,6 +530,19 @@ class _$Putback implements Putback {
     return putback(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(ReceiveTrash value)? didReceiveTrash,
+    TResult Function(Putback value)? putback,
+    TResult Function(Delete value)? delete,
+    TResult Function(RestoreAll value)? restoreAll,
+    TResult Function(DeleteAll value)? deleteAll,
+  }) {
+    return putback?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -542,6 +641,19 @@ class _$Delete implements Delete {
     return delete(trash);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(List<Trash> trash)? didReceiveTrash,
+    TResult Function(String trashId)? putback,
+    TResult Function(Trash trash)? delete,
+    TResult Function()? restoreAll,
+    TResult Function()? deleteAll,
+  }) {
+    return delete?.call(trash);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -572,6 +684,19 @@ class _$Delete implements Delete {
     return delete(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(ReceiveTrash value)? didReceiveTrash,
+    TResult Function(Putback value)? putback,
+    TResult Function(Delete value)? delete,
+    TResult Function(RestoreAll value)? restoreAll,
+    TResult Function(DeleteAll value)? deleteAll,
+  }) {
+    return delete?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -646,6 +771,19 @@ class _$RestoreAll implements RestoreAll {
     return restoreAll();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(List<Trash> trash)? didReceiveTrash,
+    TResult Function(String trashId)? putback,
+    TResult Function(Trash trash)? delete,
+    TResult Function()? restoreAll,
+    TResult Function()? deleteAll,
+  }) {
+    return restoreAll?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -676,6 +814,19 @@ class _$RestoreAll implements RestoreAll {
     return restoreAll(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(ReceiveTrash value)? didReceiveTrash,
+    TResult Function(Putback value)? putback,
+    TResult Function(Delete value)? delete,
+    TResult Function(RestoreAll value)? restoreAll,
+    TResult Function(DeleteAll value)? deleteAll,
+  }) {
+    return restoreAll?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -745,6 +896,19 @@ class _$DeleteAll implements DeleteAll {
     return deleteAll();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(List<Trash> trash)? didReceiveTrash,
+    TResult Function(String trashId)? putback,
+    TResult Function(Trash trash)? delete,
+    TResult Function()? restoreAll,
+    TResult Function()? deleteAll,
+  }) {
+    return deleteAll?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -775,6 +939,19 @@ class _$DeleteAll implements DeleteAll {
     return deleteAll(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(ReceiveTrash value)? didReceiveTrash,
+    TResult Function(Putback value)? putback,
+    TResult Function(Delete value)? delete,
+    TResult Function(RestoreAll value)? restoreAll,
+    TResult Function(DeleteAll value)? deleteAll,
+  }) {
+    return deleteAll?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 177 - 0
app_flowy/lib/workspace/application/view/view_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -64,6 +65,16 @@ mixin _$ViewEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(bool isEditing)? setIsEditing,
+    TResult Function(String newName)? rename,
+    TResult Function()? delete,
+    TResult Function()? duplicate,
+    TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? initial,
     TResult Function(bool isEditing)? setIsEditing,
@@ -85,6 +96,16 @@ mixin _$ViewEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(SetEditing value)? setIsEditing,
+    TResult Function(Rename value)? rename,
+    TResult Function(Delete value)? delete,
+    TResult Function(Duplicate value)? duplicate,
+    TResult Function(ViewDidUpdate value)? viewDidUpdate,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(Initial value)? initial,
     TResult Function(SetEditing value)? setIsEditing,
@@ -160,6 +181,19 @@ class _$Initial implements Initial {
     return initial();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(bool isEditing)? setIsEditing,
+    TResult Function(String newName)? rename,
+    TResult Function()? delete,
+    TResult Function()? duplicate,
+    TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate,
+  }) {
+    return initial?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -190,6 +224,19 @@ class _$Initial implements Initial {
     return initial(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(SetEditing value)? setIsEditing,
+    TResult Function(Rename value)? rename,
+    TResult Function(Delete value)? delete,
+    TResult Function(Duplicate value)? duplicate,
+    TResult Function(ViewDidUpdate value)? viewDidUpdate,
+  }) {
+    return initial?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -287,6 +334,19 @@ class _$SetEditing implements SetEditing {
     return setIsEditing(isEditing);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(bool isEditing)? setIsEditing,
+    TResult Function(String newName)? rename,
+    TResult Function()? delete,
+    TResult Function()? duplicate,
+    TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate,
+  }) {
+    return setIsEditing?.call(isEditing);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -317,6 +377,19 @@ class _$SetEditing implements SetEditing {
     return setIsEditing(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(SetEditing value)? setIsEditing,
+    TResult Function(Rename value)? rename,
+    TResult Function(Delete value)? delete,
+    TResult Function(Duplicate value)? duplicate,
+    TResult Function(ViewDidUpdate value)? viewDidUpdate,
+  }) {
+    return setIsEditing?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -417,6 +490,19 @@ class _$Rename implements Rename {
     return rename(newName);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(bool isEditing)? setIsEditing,
+    TResult Function(String newName)? rename,
+    TResult Function()? delete,
+    TResult Function()? duplicate,
+    TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate,
+  }) {
+    return rename?.call(newName);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -447,6 +533,19 @@ class _$Rename implements Rename {
     return rename(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(SetEditing value)? setIsEditing,
+    TResult Function(Rename value)? rename,
+    TResult Function(Delete value)? delete,
+    TResult Function(Duplicate value)? duplicate,
+    TResult Function(ViewDidUpdate value)? viewDidUpdate,
+  }) {
+    return rename?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -521,6 +620,19 @@ class _$Delete implements Delete {
     return delete();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(bool isEditing)? setIsEditing,
+    TResult Function(String newName)? rename,
+    TResult Function()? delete,
+    TResult Function()? duplicate,
+    TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate,
+  }) {
+    return delete?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -551,6 +663,19 @@ class _$Delete implements Delete {
     return delete(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(SetEditing value)? setIsEditing,
+    TResult Function(Rename value)? rename,
+    TResult Function(Delete value)? delete,
+    TResult Function(Duplicate value)? duplicate,
+    TResult Function(ViewDidUpdate value)? viewDidUpdate,
+  }) {
+    return delete?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -621,6 +746,19 @@ class _$Duplicate implements Duplicate {
     return duplicate();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(bool isEditing)? setIsEditing,
+    TResult Function(String newName)? rename,
+    TResult Function()? delete,
+    TResult Function()? duplicate,
+    TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate,
+  }) {
+    return duplicate?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -651,6 +789,19 @@ class _$Duplicate implements Duplicate {
     return duplicate(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(SetEditing value)? setIsEditing,
+    TResult Function(Rename value)? rename,
+    TResult Function(Delete value)? delete,
+    TResult Function(Duplicate value)? duplicate,
+    TResult Function(ViewDidUpdate value)? viewDidUpdate,
+  }) {
+    return duplicate?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -748,6 +899,19 @@ class _$ViewDidUpdate implements ViewDidUpdate {
     return viewDidUpdate(result);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(bool isEditing)? setIsEditing,
+    TResult Function(String newName)? rename,
+    TResult Function()? delete,
+    TResult Function()? duplicate,
+    TResult Function(Either<View, WorkspaceError> result)? viewDidUpdate,
+  }) {
+    return viewDidUpdate?.call(result);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -778,6 +942,19 @@ class _$ViewDidUpdate implements ViewDidUpdate {
     return viewDidUpdate(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(SetEditing value)? setIsEditing,
+    TResult Function(Rename value)? rename,
+    TResult Function(Delete value)? delete,
+    TResult Function(Duplicate value)? duplicate,
+    TResult Function(ViewDidUpdate value)? viewDidUpdate,
+  }) {
+    return viewDidUpdate?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 110 - 0
app_flowy/lib/workspace/application/workspace/welcome_bloc.freezed.dart

@@ -1,3 +1,4 @@
+// coverage:ignore-file
 // GENERATED CODE - DO NOT MODIFY BY HAND
 // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target
 
@@ -57,6 +58,15 @@ mixin _$WelcomeEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc)? createWorkspace,
+    TResult Function(Workspace workspace)? openWorkspace,
+    TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)?
+        workspacesReveived,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
     TResult Function()? initial,
     TResult Function(String name, String desc)? createWorkspace,
@@ -75,6 +85,14 @@ mixin _$WelcomeEvent {
   }) =>
       throw _privateConstructorUsedError;
   @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateWorkspace value)? createWorkspace,
+    TResult Function(OpenWorkspace value)? openWorkspace,
+    TResult Function(WorkspacesReceived value)? workspacesReveived,
+  }) =>
+      throw _privateConstructorUsedError;
+  @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
     TResult Function(Initial value)? initial,
     TResult Function(CreateWorkspace value)? createWorkspace,
@@ -148,6 +166,18 @@ class _$Initial implements Initial {
     return initial();
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc)? createWorkspace,
+    TResult Function(Workspace workspace)? openWorkspace,
+    TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)?
+        workspacesReveived,
+  }) {
+    return initial?.call();
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -175,6 +205,17 @@ class _$Initial implements Initial {
     return initial(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateWorkspace value)? createWorkspace,
+    TResult Function(OpenWorkspace value)? openWorkspace,
+    TResult Function(WorkspacesReceived value)? workspacesReveived,
+  }) {
+    return initial?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -281,6 +322,18 @@ class _$CreateWorkspace implements CreateWorkspace {
     return createWorkspace(name, desc);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc)? createWorkspace,
+    TResult Function(Workspace workspace)? openWorkspace,
+    TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)?
+        workspacesReveived,
+  }) {
+    return createWorkspace?.call(name, desc);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -308,6 +361,17 @@ class _$CreateWorkspace implements CreateWorkspace {
     return createWorkspace(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateWorkspace value)? createWorkspace,
+    TResult Function(OpenWorkspace value)? openWorkspace,
+    TResult Function(WorkspacesReceived value)? workspacesReveived,
+  }) {
+    return createWorkspace?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -409,6 +473,18 @@ class _$OpenWorkspace implements OpenWorkspace {
     return openWorkspace(workspace);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc)? createWorkspace,
+    TResult Function(Workspace workspace)? openWorkspace,
+    TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)?
+        workspacesReveived,
+  }) {
+    return openWorkspace?.call(workspace);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -436,6 +512,17 @@ class _$OpenWorkspace implements OpenWorkspace {
     return openWorkspace(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateWorkspace value)? createWorkspace,
+    TResult Function(OpenWorkspace value)? openWorkspace,
+    TResult Function(WorkspacesReceived value)? workspacesReveived,
+  }) {
+    return openWorkspace?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({
@@ -538,6 +625,18 @@ class _$WorkspacesReceived implements WorkspacesReceived {
     return workspacesReveived(workspacesOrFail);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? whenOrNull<TResult extends Object?>({
+    TResult Function()? initial,
+    TResult Function(String name, String desc)? createWorkspace,
+    TResult Function(Workspace workspace)? openWorkspace,
+    TResult Function(Either<List<Workspace>, WorkspaceError> workspacesOrFail)?
+        workspacesReveived,
+  }) {
+    return workspacesReveived?.call(workspacesOrFail);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeWhen<TResult extends Object?>({
@@ -565,6 +664,17 @@ class _$WorkspacesReceived implements WorkspacesReceived {
     return workspacesReveived(this);
   }
 
+  @override
+  @optionalTypeArgs
+  TResult? mapOrNull<TResult extends Object?>({
+    TResult Function(Initial value)? initial,
+    TResult Function(CreateWorkspace value)? createWorkspace,
+    TResult Function(OpenWorkspace value)? openWorkspace,
+    TResult Function(WorkspacesReceived value)? workspacesReveived,
+  }) {
+    return workspacesReveived?.call(this);
+  }
+
   @override
   @optionalTypeArgs
   TResult maybeMap<TResult extends Object?>({

+ 12 - 0
app_flowy/lib/workspace/domain/i_share.dart

@@ -0,0 +1,12 @@
+import 'dart:async';
+import 'package:dartz/dartz.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
+
+abstract class IShare {
+  Future<Either<ExportData, WorkspaceError>> exportText(String docId);
+
+  Future<Either<ExportData, WorkspaceError>> exportMarkdown(String docId);
+
+  Future<Either<ExportData, WorkspaceError>> exportURL(String docId);
+}

+ 7 - 5
app_flowy/lib/workspace/domain/page_stack/page_stack.dart

@@ -9,7 +9,8 @@ import 'package:app_flowy/workspace/presentation/widgets/prelude.dart';
 typedef NavigationCallback = void Function(String id);
 
 abstract class NavigationItem {
-  Widget get naviTitle;
+  Widget get leftBarItem;
+  Widget? get rightBarItem => null;
   String get identifier;
 
   NavigationCallback get action => (id) {
@@ -29,9 +30,10 @@ abstract class HomeStackContext<T, S> with NavigationItem {
   List<NavigationItem> get navigationItems;
 
   @override
-  Widget get naviTitle;
+  Widget get leftBarItem;
 
-  Widget? Function(BuildContext context) get buildNaviAction;
+  @override
+  Widget? get rightBarItem;
 
   @override
   String get identifier;
@@ -49,7 +51,7 @@ class HomeStackNotifier extends ChangeNotifier {
   HomeStackContext stackContext;
   PublishNotifier<bool> collapsedNotifier = PublishNotifier();
 
-  Widget get titleWidget => stackContext.naviTitle;
+  Widget get titleWidget => stackContext.leftBarItem;
 
   HomeStackNotifier({HomeStackContext? context}) : stackContext = context ?? BlankStackContext();
 
@@ -71,7 +73,7 @@ class HomeStackManager {
   HomeStackManager();
 
   Widget title() {
-    return _notifier.context.naviTitle;
+    return _notifier.context.leftBarItem;
   }
 
   PublishNotifier<bool> get collapsedNotifier => _notifier.collapsedNotifier;

+ 10 - 0
app_flowy/lib/workspace/infrastructure/deps_resolver.dart

@@ -1,11 +1,13 @@
 import 'package:app_flowy/workspace/application/app/app_bloc.dart';
 import 'package:app_flowy/workspace/application/doc/doc_bloc.dart';
+import 'package:app_flowy/workspace/application/doc/share_bloc.dart';
 import 'package:app_flowy/workspace/application/menu/menu_bloc.dart';
 import 'package:app_flowy/workspace/application/menu/menu_user_bloc.dart';
 import 'package:app_flowy/workspace/application/trash/trash_bloc.dart';
 import 'package:app_flowy/workspace/application/view/view_bloc.dart';
 import 'package:app_flowy/workspace/application/workspace/welcome_bloc.dart';
 import 'package:app_flowy/workspace/domain/i_doc.dart';
+import 'package:app_flowy/workspace/domain/i_share.dart';
 import 'package:app_flowy/workspace/domain/i_trash.dart';
 import 'package:app_flowy/workspace/domain/i_view.dart';
 import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
@@ -23,8 +25,10 @@ import 'package:flowy_sdk/protobuf/flowy-workspace-infra/app_create.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart';
 import 'package:get_it/get_it.dart';
 
+import 'i_share_impl.dart';
 import 'i_user_impl.dart';
 import 'i_view_impl.dart';
+import 'repos/share_repo.dart';
 
 class HomeDepsResolver {
   static Future<void> resolve(GetIt getIt) async {
@@ -102,5 +106,11 @@ class HomeDepsResolver {
     getIt.registerFactory<ITrash>(() => ITrashImpl(repo: getIt<TrashRepo>()));
     getIt.registerFactory<ITrashListener>(() => ITrashListenerImpl(repo: getIt<TrashListenerRepo>()));
     getIt.registerFactory<TrashBloc>(() => TrashBloc(trasnManager: getIt<ITrash>(), listener: getIt<ITrashListener>()));
+
+    // share
+    getIt.registerLazySingleton<ShareRepo>(() => ShareRepo());
+    getIt.registerFactory<IShare>(() => IShareImpl(repo: getIt<ShareRepo>()));
+    getIt.registerFactoryParam<DocShareBloc, View, void>(
+        (view, _) => DocShareBloc(view: view, shareManager: getIt<IShare>()));
   }
 }

+ 27 - 0
app_flowy/lib/workspace/infrastructure/i_share_impl.dart

@@ -0,0 +1,27 @@
+import 'package:app_flowy/workspace/domain/i_share.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
+import 'package:dartz/dartz.dart';
+
+import 'repos/share_repo.dart';
+
+class IShareImpl extends IShare {
+  ShareRepo repo;
+
+  IShareImpl({required this.repo});
+
+  @override
+  Future<Either<ExportData, WorkspaceError>> exportText(String docId) {
+    return repo.export(docId, ExportType.Text);
+  }
+
+  @override
+  Future<Either<ExportData, WorkspaceError>> exportMarkdown(String docId) {
+    return repo.export(docId, ExportType.Markdown);
+  }
+
+  @override
+  Future<Either<ExportData, WorkspaceError>> exportURL(String docId) {
+    return repo.export(docId, ExportType.Link);
+  }
+}

+ 15 - 0
app_flowy/lib/workspace/infrastructure/repos/share_repo.dart

@@ -0,0 +1,15 @@
+import 'dart:async';
+import 'package:dartz/dartz.dart';
+import 'package:flowy_sdk/dispatch/dispatch.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace-infra/protobuf.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
+
+class ShareRepo {
+  Future<Either<ExportData, WorkspaceError>> export(String docId, ExportType type) {
+    final request = ExportRequest.create()
+      ..docId = docId
+      ..exportType = type;
+
+    return WorkspaceEventExportDocument(request).send();
+  }
+}

+ 3 - 3
app_flowy/lib/workspace/presentation/home/navigation.dart

@@ -138,7 +138,7 @@ class IconNaviItemWidget extends StatelessWidget {
     return SizedBox(
       height: 24,
       child: InkWell(
-        child: item.naviTitle,
+        child: item.leftBarItem,
         onTap: () {
           debugPrint('show app document');
         },
@@ -156,7 +156,7 @@ class NaviItemWidget extends StatelessWidget {
     return SizedBox(
       height: 24,
       child: InkWell(
-        child: item.naviTitle,
+        child: item.leftBarItem,
         onTap: () {
           debugPrint('show app document');
         },
@@ -184,7 +184,7 @@ class EllipsisNaviItem extends NavigationItem {
   });
 
   @override
-  Widget get naviTitle => const FlowyText.medium('...');
+  Widget get leftBarItem => const FlowyText.medium('...');
 
   @override
   NavigationCallback get action => (id) {};

+ 2 - 2
app_flowy/lib/workspace/presentation/stack_page/blank/blank_page.dart

@@ -9,10 +9,10 @@ class BlankStackContext extends HomeStackContext {
   String get identifier => "1";
 
   @override
-  Widget get naviTitle => const FlowyText.medium('Blank page', fontSize: 12);
+  Widget get leftBarItem => const FlowyText.medium('Blank page', fontSize: 12);
 
   @override
-  Widget? Function(BuildContext context) get buildNaviAction => (_) => null;
+  Widget? get rightBarItem => null;
 
   @override
   HomeStackType get type => HomeStackType.blank;

+ 89 - 66
app_flowy/lib/workspace/presentation/stack_page/doc/doc_stack_page.dart

@@ -1,4 +1,5 @@
 import 'package:app_flowy/startup/startup.dart';
+import 'package:app_flowy/workspace/application/doc/share_bloc.dart';
 import 'package:app_flowy/workspace/domain/i_view.dart';
 import 'package:app_flowy/workspace/domain/page_stack/page_stack.dart';
 import 'package:app_flowy/workspace/domain/view_ext.dart';
@@ -7,9 +8,13 @@ import 'package:flowy_infra/size.dart';
 import 'package:flowy_infra_ui/flowy_infra_ui.dart';
 import 'package:flowy_infra_ui/style_widget/text.dart';
 import 'package:flowy_infra_ui/widget/rounded_button.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace-infra/export.pb.dart';
 import 'package:flowy_sdk/protobuf/flowy-workspace-infra/view_create.pb.dart';
+import 'package:flowy_sdk/protobuf/flowy-workspace/errors.pb.dart';
 import 'package:flutter/material.dart';
 import 'package:dartz/dartz.dart' as dartz;
+import 'package:flutter_bloc/flutter_bloc.dart';
+import 'package:clipboard/clipboard.dart';
 
 import 'doc_page.dart';
 
@@ -33,10 +38,10 @@ class DocStackContext extends HomeStackContext<String, ShareActionWrapper> {
   }
 
   @override
-  Widget get naviTitle => FlowyText.medium(_view.name, fontSize: 12);
+  Widget get leftBarItem => FlowyText.medium(_view.name, fontSize: 12);
 
   @override
-  Widget? Function(BuildContext context) get buildNaviAction => _buildNaviAction;
+  Widget? get rightBarItem => DocShareButton(view: _view);
 
   @override
   String get identifier => _view.id;
@@ -45,7 +50,7 @@ class DocStackContext extends HomeStackContext<String, ShareActionWrapper> {
   HomeStackType get type => _view.stackType();
 
   @override
-  Widget buildWidget() => DocStackPage(_view, key: ValueKey(_view.id));
+  Widget buildWidget() => DocPage(view: _view, key: ValueKey(_view.id));
 
   @override
   List<NavigationItem> get navigationItems => _makeNavigationItems();
@@ -65,74 +70,99 @@ class DocStackContext extends HomeStackContext<String, ShareActionWrapper> {
   void dispose() {
     _listener.stop();
   }
-
-  Widget _buildNaviAction(BuildContext context) {
-    return const DocShareButton();
-  }
 }
 
 class DocShareButton extends StatelessWidget {
-  const DocShareButton({Key? key}) : super(key: key);
+  final View view;
+  DocShareButton({Key? key, required this.view}) : super(key: ValueKey(view.id));
 
   @override
   Widget build(BuildContext context) {
     double buttonWidth = 60;
-    return RoundedTextButton(
-      title: 'Share',
-      height: 30,
-      width: buttonWidth,
-      fontSize: 12,
-      borderRadius: Corners.s6Border,
-      color: Colors.lightBlue,
-      onPressed: () {
-        final actionList = ShareActions(onSelected: (result) {
-          result.fold(() {}, (action) {
-            switch (action) {
-              case ShareAction.markdown:
-                break;
-              case ShareAction.copyLink:
-                break;
-            }
-          });
-        });
-        actionList.show(
-          context,
-          context,
-          anchorDirection: AnchorDirection.bottomWithCenterAligned,
-          anchorOffset: Offset(-(buttonWidth / 2), 10),
-        );
-      },
+    return BlocProvider(
+      create: (context) => getIt<DocShareBloc>(param1: view),
+      child: BlocListener<DocShareBloc, DocShareState>(
+        listener: (context, state) {
+          state.map(
+            initial: (_) {},
+            loading: (_) {},
+            finish: (state) {
+              state.successOrFail.fold(
+                _handleExportData,
+                _handleExportError,
+              );
+            },
+          );
+        },
+        child: BlocBuilder<DocShareBloc, DocShareState>(
+          builder: (context, state) {
+            return RoundedTextButton(
+              title: 'Share',
+              height: 30,
+              width: buttonWidth,
+              fontSize: 12,
+              borderRadius: Corners.s6Border,
+              color: Colors.lightBlue,
+              onPressed: () => _showActionList(context, Offset(-(buttonWidth / 2), 10)),
+            );
+          },
+        ),
+      ),
     );
   }
-}
-
-class DocStackPage extends StatefulWidget {
-  final View view;
-  const DocStackPage(this.view, {Key? key}) : super(key: key);
-
-  @override
-  _DocStackPageState createState() => _DocStackPageState();
-}
-
-class _DocStackPageState extends State<DocStackPage> {
-  @override
-  Widget build(BuildContext context) {
-    return DocPage(view: widget.view);
-  }
 
-  @override
-  void dispose() {
-    super.dispose();
+  void _handleExportData(ExportData exportData) {
+    switch (exportData.exportType) {
+      case ExportType.Link:
+        // TODO: Handle this case.
+        break;
+      case ExportType.Markdown:
+        FlutterClipboard.copy(exportData.data).then(
+          (value) => print('copied'),
+        );
+        break;
+      case ExportType.Text:
+        // TODO: Handle this case.
+        break;
+    }
   }
 
-  @override
-  void deactivate() {
-    super.deactivate();
+  void _handleExportError(WorkspaceError error) {}
+
+  void _showActionList(BuildContext context, Offset offset) {
+    final actionList = ShareActions(onSelected: (result) {
+      result.fold(() {}, (action) {
+        switch (action) {
+          case ShareAction.markdown:
+            context.read<DocShareBloc>().add(const DocShareEvent.shareMarkdown());
+            break;
+          case ShareAction.copyLink:
+            showWorkInProgressDialog(context);
+            break;
+        }
+      });
+    });
+    actionList.show(
+      context,
+      context,
+      anchorDirection: AnchorDirection.bottomWithCenterAligned,
+      anchorOffset: offset,
+    );
   }
 
-  @override
-  void didUpdateWidget(covariant DocStackPage oldWidget) {
-    super.didUpdateWidget(oldWidget);
+  void showWorkInProgressDialog(BuildContext context) {
+    showDialog(
+      context: context,
+      builder: (_) {
+        return AlertDialog(
+          title: const Text('Select Color'),
+          backgroundColor: Theme.of(context).canvasColor,
+          content: SingleChildScrollView(
+            child: Text("WIP"),
+          ),
+        );
+      },
+    );
   }
 }
 
@@ -140,9 +170,7 @@ class ShareActions with ActionList<ShareActionWrapper> implements FlowyOverlayDe
   final Function(dartz.Option<ShareAction>) onSelected;
   final _items = ShareAction.values.map((action) => ShareActionWrapper(action)).toList();
 
-  ShareActions({
-    required this.onSelected,
-  });
+  ShareActions({required this.onSelected});
 
   @override
   double get maxWidth => 130;
@@ -167,12 +195,7 @@ class ShareActions with ActionList<ShareActionWrapper> implements FlowyOverlayDe
   FlowyOverlayDelegate? get delegate => this;
 
   @override
-  void didRemove() {
-    onSelected(dartz.none());
-  }
-
-  @override
-  ListOverlayFooter? get footer => null;
+  void didRemove() => onSelected(dartz.none());
 }
 
 enum ShareAction {

+ 2 - 2
app_flowy/lib/workspace/presentation/stack_page/trash/trash_page.dart

@@ -26,10 +26,10 @@ class TrashStackContext extends HomeStackContext {
   String get identifier => "TrashStackContext";
 
   @override
-  Widget get naviTitle => const FlowyText.medium('Trash', fontSize: 12);
+  Widget get leftBarItem => const FlowyText.medium('Trash', fontSize: 12);
 
   @override
-  Widget? Function(BuildContext context) get buildNaviAction => (_) => null;
+  Widget? get rightBarItem => null;
 
   @override
   HomeStackType get type => HomeStackType.trash;

+ 1 - 1
app_flowy/lib/workspace/presentation/widgets/home_top_bar.dart

@@ -26,7 +26,7 @@ class HomeTopBar extends StatelessWidget {
             value: Provider.of<HomeStackNotifier>(context, listen: false),
             child: Consumer(
               builder: (BuildContext context, HomeStackNotifier notifier, Widget? child) {
-                return notifier.stackContext.buildNaviAction(context) ?? const SizedBox();
+                return notifier.stackContext.rightBarItem ?? const SizedBox();
               },
             ),
           ) // _renderMoreButton(),

+ 0 - 3
app_flowy/lib/workspace/presentation/widgets/menu/widget/app/header/right_click_action.dart

@@ -32,9 +32,6 @@ class AppDisclosureActionSheet with ActionList<DisclosureActionWrapper> implemen
   void didRemove() {
     onSelected(dartz.none());
   }
-
-  @override
-  ListOverlayFooter? get footer => null;
 }
 
 class DisclosureActionWrapper extends ActionItem {

+ 0 - 3
app_flowy/lib/workspace/presentation/widgets/menu/widget/app/section/disclosure_action.dart

@@ -52,9 +52,6 @@ class ViewDisclosureButton extends StatelessWidget
   void didRemove() {
     onSelected(dartz.none());
   }
-
-  @override
-  ListOverlayFooter? get footer => null;
 }
 
 class ViewDisclosureActionWrapper extends ActionItem {

+ 1 - 1
app_flowy/lib/workspace/presentation/widgets/pop_up_action.dart

@@ -17,7 +17,7 @@ abstract class ActionList<T extends ActionItem> {
 
   double get itemHeight => ActionListSizes.itemHeight;
 
-  ListOverlayFooter? get footer;
+  ListOverlayFooter? get footer => null;
 
   void Function(dartz.Option<T>) get selectCallback;
 

+ 14 - 0
app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace-infra/export.pb.dart

@@ -77,17 +77,22 @@ class ExportRequest extends $pb.GeneratedMessage {
 class ExportData extends $pb.GeneratedMessage {
   static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'ExportData', createEmptyInstance: create)
     ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'data')
+    ..e<ExportType>(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'exportType', $pb.PbFieldType.OE, defaultOrMaker: ExportType.Text, valueOf: ExportType.valueOf, enumValues: ExportType.values)
     ..hasRequiredFields = false
   ;
 
   ExportData._() : super();
   factory ExportData({
     $core.String? data,
+    ExportType? exportType,
   }) {
     final _result = create();
     if (data != null) {
       _result.data = data;
     }
+    if (exportType != null) {
+      _result.exportType = exportType;
+    }
     return _result;
   }
   factory ExportData.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
@@ -119,5 +124,14 @@ class ExportData extends $pb.GeneratedMessage {
   $core.bool hasData() => $_has(0);
   @$pb.TagNumber(1)
   void clearData() => clearField(1);
+
+  @$pb.TagNumber(2)
+  ExportType get exportType => $_getN(1);
+  @$pb.TagNumber(2)
+  set exportType(ExportType v) { setField(2, v); }
+  @$pb.TagNumber(2)
+  $core.bool hasExportType() => $_has(1);
+  @$pb.TagNumber(2)
+  void clearExportType() => clearField(2);
 }
 

+ 4 - 2
app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace-infra/export.pbenum.dart

@@ -11,11 +11,13 @@ import 'package:protobuf/protobuf.dart' as $pb;
 
 class ExportType extends $pb.ProtobufEnum {
   static const ExportType Text = ExportType._(0, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Text');
-  static const ExportType RichText = ExportType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'RichText');
+  static const ExportType Markdown = ExportType._(1, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Markdown');
+  static const ExportType Link = ExportType._(2, const $core.bool.fromEnvironment('protobuf.omit_enum_names') ? '' : 'Link');
 
   static const $core.List<ExportType> values = <ExportType> [
     Text,
-    RichText,
+    Markdown,
+    Link,
   ];
 
   static final $core.Map<$core.int, ExportType> _byValue = $pb.ProtobufEnum.initByValue(values);

+ 5 - 3
app_flowy/packages/flowy_sdk/lib/protobuf/flowy-workspace-infra/export.pbjson.dart

@@ -13,12 +13,13 @@ const ExportType$json = const {
   '1': 'ExportType',
   '2': const [
     const {'1': 'Text', '2': 0},
-    const {'1': 'RichText', '2': 1},
+    const {'1': 'Markdown', '2': 1},
+    const {'1': 'Link', '2': 2},
   ],
 };
 
 /// Descriptor for `ExportType`. Decode as a `google.protobuf.EnumDescriptorProto`.
-final $typed_data.Uint8List exportTypeDescriptor = $convert.base64Decode('CgpFeHBvcnRUeXBlEggKBFRleHQQABIMCghSaWNoVGV4dBAB');
+final $typed_data.Uint8List exportTypeDescriptor = $convert.base64Decode('CgpFeHBvcnRUeXBlEggKBFRleHQQABIMCghNYXJrZG93bhABEggKBExpbmsQAg==');
 @$core.Deprecated('Use exportRequestDescriptor instead')
 const ExportRequest$json = const {
   '1': 'ExportRequest',
@@ -35,8 +36,9 @@ const ExportData$json = const {
   '1': 'ExportData',
   '2': const [
     const {'1': 'data', '3': 1, '4': 1, '5': 9, '10': 'data'},
+    const {'1': 'export_type', '3': 2, '4': 1, '5': 14, '6': '.ExportType', '10': 'exportType'},
   ],
 };
 
 /// Descriptor for `ExportData`. Decode as a `google.protobuf.DescriptorProto`.
-final $typed_data.Uint8List exportDataDescriptor = $convert.base64Decode('CgpFeHBvcnREYXRhEhIKBGRhdGEYASABKAlSBGRhdGE=');
+final $typed_data.Uint8List exportDataDescriptor = $convert.base64Decode('CgpFeHBvcnREYXRhEhIKBGRhdGEYASABKAlSBGRhdGESLAoLZXhwb3J0X3R5cGUYAiABKA4yCy5FeHBvcnRUeXBlUgpleHBvcnRUeXBl');

+ 67 - 53
app_flowy/pubspec.lock

@@ -7,28 +7,28 @@ packages:
       name: _fe_analyzer_shared
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "23.0.0"
+    version: "30.0.0"
   analyzer:
     dependency: transitive
     description:
       name: analyzer
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.0"
+    version: "2.7.0"
   animations:
     dependency: transitive
     description:
       name: animations
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.1"
+    version: "2.0.2"
   args:
     dependency: transitive
     description:
       name: args
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.2.0"
+    version: "2.3.0"
   async:
     dependency: transitive
     description:
@@ -56,7 +56,7 @@ packages:
       name: build
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.3"
+    version: "2.1.1"
   build_config:
     dependency: transitive
     description:
@@ -70,7 +70,7 @@ packages:
       name: build_daemon
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.0.0"
+    version: "3.0.1"
   build_resolvers:
     dependency: transitive
     description:
@@ -84,28 +84,28 @@ packages:
       name: build_runner
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.6"
+    version: "2.1.5"
   build_runner_core:
     dependency: transitive
     description:
       name: build_runner_core
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "7.0.1"
+    version: "7.2.2"
   built_collection:
     dependency: transitive
     description:
       name: built_collection
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "5.1.0"
+    version: "5.1.1"
   built_value:
     dependency: transitive
     description:
       name: built_value
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "8.1.1"
+    version: "8.1.3"
   characters:
     dependency: transitive
     description:
@@ -133,7 +133,14 @@ packages:
       name: cli_util
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.3.3"
+    version: "0.3.5"
+  clipboard:
+    dependency: "direct main"
+    description:
+      name: clipboard
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "0.1.3"
   clock:
     dependency: transitive
     description:
@@ -168,7 +175,7 @@ packages:
       name: cross_file
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.3.1+5"
+    version: "0.3.2"
   crypto:
     dependency: transitive
     description:
@@ -189,14 +196,14 @@ packages:
       name: cupertino_icons
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.3"
+    version: "1.0.4"
   dart_style:
     dependency: transitive
     description:
       name: dart_style
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.3"
+    version: "2.2.0"
   dartz:
     dependency: transitive
     description:
@@ -246,6 +253,13 @@ packages:
       url: "https://pub.dartlang.org"
     source: hosted
     version: "6.1.2"
+  file_picker:
+    dependency: "direct main"
+    description:
+      name: file_picker
+      url: "https://pub.dartlang.org"
+    source: hosted
+    version: "4.2.1"
   fixnum:
     dependency: transitive
     description:
@@ -313,14 +327,14 @@ packages:
       name: flutter_bloc
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "7.3.1"
+    version: "7.3.3"
   flutter_colorpicker:
     dependency: "direct main"
     description:
       name: flutter_colorpicker
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.6.0"
+    version: "0.6.1"
   flutter_inappwebview:
     dependency: transitive
     description:
@@ -334,7 +348,7 @@ packages:
       name: flutter_keyboard_visibility
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "5.0.3"
+    version: "5.1.0"
   flutter_keyboard_visibility_platform_interface:
     dependency: transitive
     description:
@@ -362,7 +376,7 @@ packages:
       name: flutter_plugin_android_lifecycle
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.3"
+    version: "2.0.4"
   flutter_quill:
     dependency: "direct main"
     description:
@@ -395,7 +409,7 @@ packages:
       name: freezed
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.14.3"
+    version: "0.14.5"
   freezed_annotation:
     dependency: "direct main"
     description:
@@ -409,7 +423,7 @@ packages:
       name: frontend_server_client
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.0"
+    version: "2.1.2"
   get_it:
     dependency: "direct main"
     description:
@@ -430,14 +444,14 @@ packages:
       name: glob
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.1"
+    version: "2.0.2"
   graphs:
     dependency: transitive
     description:
       name: graphs
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.0"
+    version: "2.1.0"
   html:
     dependency: transitive
     description:
@@ -479,14 +493,14 @@ packages:
       name: image_picker
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.8.4+2"
+    version: "0.8.4+4"
   image_picker_for_web:
     dependency: transitive
     description:
       name: image_picker_for_web
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.1.3"
+    version: "2.1.4"
   image_picker_platform_interface:
     dependency: transitive
     description:
@@ -528,14 +542,14 @@ packages:
       name: json_annotation
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "4.1.0"
+    version: "4.3.0"
   lint:
     dependency: transitive
     description:
       name: lint
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.5.3"
+    version: "1.7.2"
   lints:
     dependency: transitive
     description:
@@ -549,21 +563,21 @@ packages:
       name: loading_indicator
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.0.1"
+    version: "3.0.2"
   logger:
     dependency: transitive
     description:
       name: logger
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.0"
+    version: "1.1.0"
   logging:
     dependency: transitive
     description:
       name: logging
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.1"
+    version: "1.0.2"
   matcher:
     dependency: transitive
     description:
@@ -584,7 +598,7 @@ packages:
       name: mime
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.1"
   nested:
     dependency: transitive
     description:
@@ -598,7 +612,7 @@ packages:
       name: package_config
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.0"
+    version: "2.0.2"
   package_info_plus:
     dependency: "direct main"
     description:
@@ -654,7 +668,7 @@ packages:
       name: path_drawing
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.5.1"
+    version: "0.5.1+1"
   path_parsing:
     dependency: transitive
     description:
@@ -668,14 +682,14 @@ packages:
       name: path_provider
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.2"
+    version: "2.0.6"
   path_provider_linux:
     dependency: transitive
     description:
       name: path_provider_linux
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.2"
+    version: "2.1.0"
   path_provider_macos:
     dependency: transitive
     description:
@@ -710,7 +724,7 @@ packages:
       name: petitparser
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "4.2.0"
+    version: "4.4.0"
   photo_view:
     dependency: transitive
     description:
@@ -724,14 +738,14 @@ packages:
       name: platform
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.0.0"
+    version: "3.0.2"
   plugin_platform_interface:
     dependency: transitive
     description:
       name: plugin_platform_interface
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.1"
+    version: "2.0.2"
   pool:
     dependency: transitive
     description:
@@ -745,7 +759,7 @@ packages:
       name: process
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "4.2.3"
+    version: "4.2.4"
   protobuf:
     dependency: transitive
     description:
@@ -766,21 +780,21 @@ packages:
       name: pub_semver
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.0"
+    version: "2.1.0"
   pubspec_parse:
     dependency: transitive
     description:
       name: pubspec_parse
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.0"
+    version: "1.1.0"
   quiver:
     dependency: transitive
     description:
       name: quiver
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.0.1"
+    version: "3.0.1+1"
   quiver_hashcode:
     dependency: transitive
     description:
@@ -820,7 +834,7 @@ packages:
       name: source_gen
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.5"
+    version: "1.1.1"
   source_span:
     dependency: transitive
     description:
@@ -876,7 +890,7 @@ packages:
       name: styled_widget
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "0.3.1+2"
+    version: "0.4.0+3"
   term_glyph:
     dependency: transitive
     description:
@@ -939,21 +953,21 @@ packages:
       name: url_launcher
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "6.0.9"
+    version: "6.0.12"
   url_launcher_linux:
     dependency: transitive
     description:
       name: url_launcher_linux
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.1"
+    version: "2.0.2"
   url_launcher_macos:
     dependency: transitive
     description:
       name: url_launcher_macos
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.1"
+    version: "2.0.2"
   url_launcher_platform_interface:
     dependency: transitive
     description:
@@ -967,21 +981,21 @@ packages:
       name: url_launcher_web
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.2"
+    version: "2.0.4"
   url_launcher_windows:
     dependency: transitive
     description:
       name: url_launcher_windows
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.0.1"
+    version: "2.0.2"
   uuid:
     dependency: transitive
     description:
       name: uuid
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "3.0.4"
+    version: "3.0.5"
   vector_math:
     dependency: transitive
     description:
@@ -995,7 +1009,7 @@ packages:
       name: video_player
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.2.5"
+    version: "2.2.7"
   video_player_platform_interface:
     dependency: transitive
     description:
@@ -1016,7 +1030,7 @@ packages:
       name: watcher
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "1.0.0"
+    version: "1.0.1"
   web_socket_channel:
     dependency: transitive
     description:
@@ -1030,7 +1044,7 @@ packages:
       name: win32
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "2.2.5"
+    version: "2.2.10"
   window_size:
     dependency: "direct main"
     description:
@@ -1053,7 +1067,7 @@ packages:
       name: xml
       url: "https://pub.dartlang.org"
     source: hosted
-    version: "5.1.2"
+    version: "5.3.1"
   yaml:
     dependency: transitive
     description:

+ 3 - 0
app_flowy/pubspec.yaml

@@ -64,6 +64,9 @@ dependencies:
   flutter_colorpicker: ^0.6.0
   package_info_plus: ^1.3.0
   url_launcher: ^6.0.2
+  # file_picker: ^4.2.1
+  clipboard: ^0.1.3
+  delta_markdown: '>=0.3.0'
 
   # The following adds the Cupertino Icons font to your application.
   # Use with the CupertinoIcons class for iOS style icons.

+ 3 - 3
app_flowy/windows/flutter/generated_plugin_registrant.cc

@@ -8,7 +8,7 @@
 
 #include <flowy_editor/flowy_editor_plugin.h>
 #include <flowy_infra_ui/flowy_infra_u_i_plugin.h>
-#include <url_launcher_windows/url_launcher_plugin.h>
+#include <url_launcher_windows/url_launcher_windows.h>
 #include <window_size/window_size_plugin.h>
 
 void RegisterPlugins(flutter::PluginRegistry* registry) {
@@ -16,8 +16,8 @@ void RegisterPlugins(flutter::PluginRegistry* registry) {
       registry->GetRegistrarForPlugin("FlowyEditorPlugin"));
   FlowyInfraUIPluginRegisterWithRegistrar(
       registry->GetRegistrarForPlugin("FlowyInfraUIPlugin"));
-  UrlLauncherPluginRegisterWithRegistrar(
-      registry->GetRegistrarForPlugin("UrlLauncherPlugin"));
+  UrlLauncherWindowsRegisterWithRegistrar(
+      registry->GetRegistrarForPlugin("UrlLauncherWindows"));
   WindowSizePluginRegisterWithRegistrar(
       registry->GetRegistrarForPlugin("WindowSizePlugin"));
 }

+ 1 - 0
delta_markdown

@@ -0,0 +1 @@
+Subproject commit 3e121c546fe40f91e9817ad0e0f04910315db681

+ 7 - 2
rust-lib/flowy-workspace-infra/src/entities/share/export.rs

@@ -5,7 +5,8 @@ use std::convert::TryInto;
 #[derive(PartialEq, Debug, ProtoBuf_Enum, Clone)]
 pub enum ExportType {
     Text     = 0,
-    RichText = 1,
+    Markdown = 1,
+    Link     = 2,
 }
 
 impl std::default::Default for ExportType {
@@ -16,7 +17,8 @@ impl std::convert::From<i32> for ExportType {
     fn from(val: i32) -> Self {
         match val {
             0 => ExportType::Text,
-            1 => ExportType::RichText,
+            1 => ExportType::Markdown,
+            2 => ExportType::Link,
             _ => {
                 log::error!("Invalid export type: {}", val);
                 ExportType::Text
@@ -54,4 +56,7 @@ impl TryInto<ExportParams> for ExportRequest {
 pub struct ExportData {
     #[pb(index = 1)]
     pub data: String,
+
+    #[pb(index = 2)]
+    pub export_type: ExportType,
 }

+ 62 - 22
rust-lib/flowy-workspace-infra/src/protobuf/model/export.rs

@@ -217,6 +217,7 @@ impl ::protobuf::reflect::ProtobufValue for ExportRequest {
 pub struct ExportData {
     // message fields
     pub data: ::std::string::String,
+    pub export_type: ExportType,
     // special fields
     pub unknown_fields: ::protobuf::UnknownFields,
     pub cached_size: ::protobuf::CachedSize,
@@ -258,6 +259,21 @@ impl ExportData {
     pub fn take_data(&mut self) -> ::std::string::String {
         ::std::mem::replace(&mut self.data, ::std::string::String::new())
     }
+
+    // .ExportType export_type = 2;
+
+
+    pub fn get_export_type(&self) -> ExportType {
+        self.export_type
+    }
+    pub fn clear_export_type(&mut self) {
+        self.export_type = ExportType::Text;
+    }
+
+    // Param is passed by value, moved
+    pub fn set_export_type(&mut self, v: ExportType) {
+        self.export_type = v;
+    }
 }
 
 impl ::protobuf::Message for ExportData {
@@ -272,6 +288,9 @@ impl ::protobuf::Message for ExportData {
                 1 => {
                     ::protobuf::rt::read_singular_proto3_string_into(wire_type, is, &mut self.data)?;
                 },
+                2 => {
+                    ::protobuf::rt::read_proto3_enum_with_unknown_fields_into(wire_type, is, &mut self.export_type, 2, &mut self.unknown_fields)?
+                },
                 _ => {
                     ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
                 },
@@ -287,6 +306,9 @@ impl ::protobuf::Message for ExportData {
         if !self.data.is_empty() {
             my_size += ::protobuf::rt::string_size(1, &self.data);
         }
+        if self.export_type != ExportType::Text {
+            my_size += ::protobuf::rt::enum_size(2, self.export_type);
+        }
         my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
         self.cached_size.set(my_size);
         my_size
@@ -296,6 +318,9 @@ impl ::protobuf::Message for ExportData {
         if !self.data.is_empty() {
             os.write_string(1, &self.data)?;
         }
+        if self.export_type != ExportType::Text {
+            os.write_enum(2, ::protobuf::ProtobufEnum::value(&self.export_type))?;
+        }
         os.write_unknown_fields(self.get_unknown_fields())?;
         ::std::result::Result::Ok(())
     }
@@ -339,6 +364,11 @@ impl ::protobuf::Message for ExportData {
                 |m: &ExportData| { &m.data },
                 |m: &mut ExportData| { &mut m.data },
             ));
+            fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeEnum<ExportType>>(
+                "export_type",
+                |m: &ExportData| { &m.export_type },
+                |m: &mut ExportData| { &mut m.export_type },
+            ));
             ::protobuf::reflect::MessageDescriptor::new_pb_name::<ExportData>(
                 "ExportData",
                 fields,
@@ -356,6 +386,7 @@ impl ::protobuf::Message for ExportData {
 impl ::protobuf::Clear for ExportData {
     fn clear(&mut self) {
         self.data.clear();
+        self.export_type = ExportType::Text;
         self.unknown_fields.clear();
     }
 }
@@ -375,7 +406,8 @@ impl ::protobuf::reflect::ProtobufValue for ExportData {
 #[derive(Clone,PartialEq,Eq,Debug,Hash)]
 pub enum ExportType {
     Text = 0,
-    RichText = 1,
+    Markdown = 1,
+    Link = 2,
 }
 
 impl ::protobuf::ProtobufEnum for ExportType {
@@ -386,7 +418,8 @@ impl ::protobuf::ProtobufEnum for ExportType {
     fn from_i32(value: i32) -> ::std::option::Option<ExportType> {
         match value {
             0 => ::std::option::Option::Some(ExportType::Text),
-            1 => ::std::option::Option::Some(ExportType::RichText),
+            1 => ::std::option::Option::Some(ExportType::Markdown),
+            2 => ::std::option::Option::Some(ExportType::Link),
             _ => ::std::option::Option::None
         }
     }
@@ -394,7 +427,8 @@ impl ::protobuf::ProtobufEnum for ExportType {
     fn values() -> &'static [Self] {
         static values: &'static [ExportType] = &[
             ExportType::Text,
-            ExportType::RichText,
+            ExportType::Markdown,
+            ExportType::Link,
         ];
         values
     }
@@ -425,25 +459,31 @@ impl ::protobuf::reflect::ProtobufValue for ExportType {
 static file_descriptor_proto_data: &'static [u8] = b"\
     \n\x0cexport.proto\"T\n\rExportRequest\x12\x15\n\x06doc_id\x18\x01\x20\
     \x01(\tR\x05docId\x12,\n\x0bexport_type\x18\x02\x20\x01(\x0e2\x0b.Export\
-    TypeR\nexportType\"\x20\n\nExportData\x12\x12\n\x04data\x18\x01\x20\x01(\
-    \tR\x04data*$\n\nExportType\x12\x08\n\x04Text\x10\0\x12\x0c\n\x08RichTex\
-    t\x10\x01J\xd1\x02\n\x06\x12\x04\0\0\x0c\x01\n\x08\n\x01\x0c\x12\x03\0\0\
-    \x12\n\n\n\x02\x04\0\x12\x04\x02\0\x05\x01\n\n\n\x03\x04\0\x01\x12\x03\
-    \x02\x08\x15\n\x0b\n\x04\x04\0\x02\0\x12\x03\x03\x04\x16\n\x0c\n\x05\x04\
-    \0\x02\0\x05\x12\x03\x03\x04\n\n\x0c\n\x05\x04\0\x02\0\x01\x12\x03\x03\
-    \x0b\x11\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x03\x14\x15\n\x0b\n\x04\x04\
-    \0\x02\x01\x12\x03\x04\x04\x1f\n\x0c\n\x05\x04\0\x02\x01\x06\x12\x03\x04\
-    \x04\x0e\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\x04\x0f\x1a\n\x0c\n\x05\
-    \x04\0\x02\x01\x03\x12\x03\x04\x1d\x1e\n\n\n\x02\x04\x01\x12\x04\x06\0\
-    \x08\x01\n\n\n\x03\x04\x01\x01\x12\x03\x06\x08\x12\n\x0b\n\x04\x04\x01\
-    \x02\0\x12\x03\x07\x04\x14\n\x0c\n\x05\x04\x01\x02\0\x05\x12\x03\x07\x04\
-    \n\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x03\x07\x0b\x0f\n\x0c\n\x05\x04\x01\
-    \x02\0\x03\x12\x03\x07\x12\x13\n\n\n\x02\x05\0\x12\x04\t\0\x0c\x01\n\n\n\
-    \x03\x05\0\x01\x12\x03\t\x05\x0f\n\x0b\n\x04\x05\0\x02\0\x12\x03\n\x04\r\
-    \n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\n\x04\x08\n\x0c\n\x05\x05\0\x02\0\
-    \x02\x12\x03\n\x0b\x0c\n\x0b\n\x04\x05\0\x02\x01\x12\x03\x0b\x04\x11\n\
-    \x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x0b\x04\x0c\n\x0c\n\x05\x05\0\x02\
-    \x01\x02\x12\x03\x0b\x0f\x10b\x06proto3\
+    TypeR\nexportType\"N\n\nExportData\x12\x12\n\x04data\x18\x01\x20\x01(\tR\
+    \x04data\x12,\n\x0bexport_type\x18\x02\x20\x01(\x0e2\x0b.ExportTypeR\nex\
+    portType*.\n\nExportType\x12\x08\n\x04Text\x10\0\x12\x0c\n\x08Markdown\
+    \x10\x01\x12\x08\n\x04Link\x10\x02J\xb1\x03\n\x06\x12\x04\0\0\x0e\x01\n\
+    \x08\n\x01\x0c\x12\x03\0\0\x12\n\n\n\x02\x04\0\x12\x04\x02\0\x05\x01\n\n\
+    \n\x03\x04\0\x01\x12\x03\x02\x08\x15\n\x0b\n\x04\x04\0\x02\0\x12\x03\x03\
+    \x04\x16\n\x0c\n\x05\x04\0\x02\0\x05\x12\x03\x03\x04\n\n\x0c\n\x05\x04\0\
+    \x02\0\x01\x12\x03\x03\x0b\x11\n\x0c\n\x05\x04\0\x02\0\x03\x12\x03\x03\
+    \x14\x15\n\x0b\n\x04\x04\0\x02\x01\x12\x03\x04\x04\x1f\n\x0c\n\x05\x04\0\
+    \x02\x01\x06\x12\x03\x04\x04\x0e\n\x0c\n\x05\x04\0\x02\x01\x01\x12\x03\
+    \x04\x0f\x1a\n\x0c\n\x05\x04\0\x02\x01\x03\x12\x03\x04\x1d\x1e\n\n\n\x02\
+    \x04\x01\x12\x04\x06\0\t\x01\n\n\n\x03\x04\x01\x01\x12\x03\x06\x08\x12\n\
+    \x0b\n\x04\x04\x01\x02\0\x12\x03\x07\x04\x14\n\x0c\n\x05\x04\x01\x02\0\
+    \x05\x12\x03\x07\x04\n\n\x0c\n\x05\x04\x01\x02\0\x01\x12\x03\x07\x0b\x0f\
+    \n\x0c\n\x05\x04\x01\x02\0\x03\x12\x03\x07\x12\x13\n\x0b\n\x04\x04\x01\
+    \x02\x01\x12\x03\x08\x04\x1f\n\x0c\n\x05\x04\x01\x02\x01\x06\x12\x03\x08\
+    \x04\x0e\n\x0c\n\x05\x04\x01\x02\x01\x01\x12\x03\x08\x0f\x1a\n\x0c\n\x05\
+    \x04\x01\x02\x01\x03\x12\x03\x08\x1d\x1e\n\n\n\x02\x05\0\x12\x04\n\0\x0e\
+    \x01\n\n\n\x03\x05\0\x01\x12\x03\n\x05\x0f\n\x0b\n\x04\x05\0\x02\0\x12\
+    \x03\x0b\x04\r\n\x0c\n\x05\x05\0\x02\0\x01\x12\x03\x0b\x04\x08\n\x0c\n\
+    \x05\x05\0\x02\0\x02\x12\x03\x0b\x0b\x0c\n\x0b\n\x04\x05\0\x02\x01\x12\
+    \x03\x0c\x04\x11\n\x0c\n\x05\x05\0\x02\x01\x01\x12\x03\x0c\x04\x0c\n\x0c\
+    \n\x05\x05\0\x02\x01\x02\x12\x03\x0c\x0f\x10\n\x0b\n\x04\x05\0\x02\x02\
+    \x12\x03\r\x04\r\n\x0c\n\x05\x05\0\x02\x02\x01\x12\x03\r\x04\x08\n\x0c\n\
+    \x05\x05\0\x02\x02\x02\x12\x03\r\x0b\x0cb\x06proto3\
 ";
 
 static file_descriptor_proto_lazy: ::protobuf::rt::LazyV2<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::rt::LazyV2::INIT;

+ 3 - 1
rust-lib/flowy-workspace-infra/src/protobuf/proto/export.proto

@@ -6,8 +6,10 @@ message ExportRequest {
 }
 message ExportData {
     string data = 1;
+    ExportType export_type = 2;
 }
 enum ExportType {
     Text = 0;
-    RichText = 1;
+    Markdown = 1;
+    Link = 2;
 }

+ 4 - 1
rust-lib/flowy-workspace/src/services/view_controller.rs

@@ -147,7 +147,10 @@ impl ViewController {
             .read_document_data(doc_identifier, self.database.db_pool()?)
             .await?;
 
-        Ok(ExportData { data: doc.data })
+        Ok(ExportData {
+            data: doc.data,
+            export_type: params.export_type,
+        })
     }
 
     // belong_to_id will be the app_id or view_id.