ソースを参照

feat: support customizing the supabase auth path (#3130)

Lucas.Xu 2 年 前
コミット
c6401da0b5

+ 58 - 3
frontend/appflowy_flutter/lib/startup/tasks/supabase_task.dart

@@ -1,9 +1,14 @@
 import 'package:appflowy/env/env.dart';
+import 'package:appflowy/workspace/application/settings/application_data_storage.dart';
+import 'package:flutter/foundation.dart';
 import 'package:supabase_flutter/supabase_flutter.dart';
+import 'package:hive_flutter/hive_flutter.dart';
+import 'package:path/path.dart' as p;
 
 import '../startup.dart';
 
 bool isSupabaseInitialized = false;
+const hiveBoxName = 'appflowy_supabase_authentication';
 
 class InitSupabaseTask extends LaunchTask {
   @override
@@ -18,10 +23,60 @@ class InitSupabaseTask extends LaunchTask {
     await Supabase.initialize(
       url: Env.supabaseUrl,
       anonKey: Env.supabaseAnonKey,
-      debug: true,
-      // authFlowType: AuthFlowType.pkce,
+      debug: kDebugMode,
+      localStorage: const SupabaseLocalStorage(),
     );
+  }
+}
+
+/// customize the supabase auth storage
+///
+/// We don't use the default one because it always save the session in the document directory.
+/// When we switch to the different folder, the session still exists.
+class SupabaseLocalStorage extends LocalStorage {
+  const SupabaseLocalStorage()
+      : super(
+          initialize: _initialize,
+          hasAccessToken: _hasAccessToken,
+          accessToken: _accessToken,
+          removePersistedSession: _removePersistedSession,
+          persistSession: _persistSession,
+        );
+
+  static Future<void> _initialize() async {
+    HiveCipher? encryptionCipher;
+
+    // customize the path for Hive
+    final path = await getIt<ApplicationDataStorage>().getPath();
+    Hive.init(p.join(path, 'supabase_auth'));
+    await Hive.openBox(
+      hiveBoxName,
+      encryptionCipher: encryptionCipher,
+    );
+  }
+
+  static Future<bool> _hasAccessToken() {
+    return Future.value(
+      Hive.box(hiveBoxName).containsKey(
+        supabasePersistSessionKey,
+      ),
+    );
+  }
+
+  static Future<String?> _accessToken() {
+    return Future.value(
+      Hive.box(hiveBoxName).get(supabasePersistSessionKey) as String?,
+    );
+  }
+
+  static Future<void> _removePersistedSession() {
+    return Hive.box(hiveBoxName).delete(supabasePersistSessionKey);
+  }
 
-    isSupabaseInitialized = true;
+  static Future<void> _persistSession(String persistSessionString) {
+    return Hive.box(hiveBoxName).put(
+      supabasePersistSessionKey,
+      persistSessionString,
+    );
   }
 }

+ 2 - 2
frontend/appflowy_flutter/pubspec.lock

@@ -628,7 +628,7 @@ packages:
     source: hosted
     version: "0.7.0"
   hive:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: hive
       sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941"
@@ -636,7 +636,7 @@ packages:
     source: hosted
     version: "2.2.3"
   hive_flutter:
-    dependency: transitive
+    dependency: "direct main"
     description:
       name: hive_flutter
       sha256: dca1da446b1d808a51689fb5d0c6c9510c0a2ba01e22805d492c73b68e33eecc

+ 2 - 0
frontend/appflowy_flutter/pubspec.yaml

@@ -98,6 +98,8 @@ dependencies:
   supabase_flutter: ^1.10.4
   envied: ^0.3.0+3
   dotted_border: ^2.0.0+3
+  hive: ^2.2.3
+  hive_flutter: ^1.1.0
 
 dev_dependencies:
   flutter_lints: ^2.0.1