diff --git a/frontend/appflowy_flutter/lib/startup/tasks/supabase_task.dart b/frontend/appflowy_flutter/lib/startup/tasks/supabase_task.dart index 412e3831ae..97597f307a 100644 --- a/frontend/appflowy_flutter/lib/startup/tasks/supabase_task.dart +++ b/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 _initialize() async { + HiveCipher? encryptionCipher; + + // customize the path for Hive + final path = await getIt().getPath(); + Hive.init(p.join(path, 'supabase_auth')); + await Hive.openBox( + hiveBoxName, + encryptionCipher: encryptionCipher, + ); + } + + static Future _hasAccessToken() { + return Future.value( + Hive.box(hiveBoxName).containsKey( + supabasePersistSessionKey, + ), + ); + } + + static Future _accessToken() { + return Future.value( + Hive.box(hiveBoxName).get(supabasePersistSessionKey) as String?, + ); + } + + static Future _removePersistedSession() { + return Hive.box(hiveBoxName).delete(supabasePersistSessionKey); + } + + static Future _persistSession(String persistSessionString) { + return Hive.box(hiveBoxName).put( + supabasePersistSessionKey, + persistSessionString, ); - - isSupabaseInitialized = true; } } diff --git a/frontend/appflowy_flutter/pubspec.lock b/frontend/appflowy_flutter/pubspec.lock index 783039d79e..e807553e65 100644 --- a/frontend/appflowy_flutter/pubspec.lock +++ b/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 diff --git a/frontend/appflowy_flutter/pubspec.yaml b/frontend/appflowy_flutter/pubspec.yaml index e5b2d85462..166b2fb37b 100644 --- a/frontend/appflowy_flutter/pubspec.yaml +++ b/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