Skip to content

Commit bb5fc50

Browse files
committed
Refactor how the database is opened
1 parent f689ac6 commit bb5fc50

16 files changed

+113
-161
lines changed

demos/supabase-todolist-drift/lib/attachments/queue.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ part 'queue.g.dart';
1313

1414
@Riverpod(keepAlive: true)
1515
Future<PhotoAttachmentQueue> attachmentQueue(Ref ref) async {
16-
final db = await ref.read(initializePowerSyncProvider.future);
16+
final db = await ref.read(powerSyncInstanceProvider.future);
1717
final queue = PhotoAttachmentQueue(db, remoteStorage);
1818
await queue.init();
1919
return queue;

demos/supabase-todolist-drift/lib/attachments/queue.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demos/supabase-todolist-drift/lib/fts_helpers.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ String _createSearchTermWithOptions(String searchTerm) {
1616
@riverpod
1717
Future<List> search(Ref ref, String searchTerm, String tableName) async {
1818
String searchTermWithOptions = _createSearchTermWithOptions(searchTerm);
19-
final db = await ref.read(initializePowerSyncProvider.future);
19+
final db = await ref.read(powerSyncInstanceProvider.future);
2020
return await db.getAll(
2121
'SELECT * FROM fts_$tableName WHERE fts_$tableName MATCH ? ORDER BY rank',
2222
[searchTermWithOptions]);

demos/supabase-todolist-drift/lib/fts_helpers.g.dart

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demos/supabase-todolist-drift/lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ class MyHomePage extends ConsumerWidget {
112112
var navigator = Navigator.of(context);
113113
navigator.pop();
114114
await Supabase.instance.client.auth.signOut();
115-
await (await ref.read(initializePowerSyncProvider.future))
115+
await (await ref.read(powerSyncInstanceProvider.future))
116116
.disconnectAndClear();
117117

118118
navigator.pushReplacement(MaterialPageRoute(

demos/supabase-todolist-drift/lib/powersync.dart

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -140,37 +140,40 @@ class SupabaseConnector extends PowerSyncBackendConnector {
140140
}
141141

142142
@Riverpod(keepAlive: true)
143-
Future<PowerSyncDatabase> initializePowerSync(Ref ref) async {
144-
final db = PowerSyncDatabase(
145-
schema: schema, path: await _getDatabasePath(), logger: attachedLogger);
146-
await db.initialize();
147-
148-
SupabaseConnector? currentConnector;
149-
150-
if (ref.read(session) != null) {
151-
currentConnector = SupabaseConnector();
152-
db.connect(connector: currentConnector);
153-
}
143+
final class PowerSyncInstance extends _$PowerSyncInstance {
144+
@override
145+
Future<PowerSyncDatabase> build() async {
146+
final db = PowerSyncDatabase(
147+
schema: schema, path: await _getDatabasePath(), logger: attachedLogger);
148+
await db.initialize();
154149

155-
final instance = Supabase.instance.client.auth;
156-
final sub = instance.onAuthStateChange.listen((data) async {
157-
final event = data.event;
158-
if (event == AuthChangeEvent.signedIn) {
159-
// Connect to PowerSync when the user is signed in
150+
SupabaseConnector? currentConnector;
151+
if (ref.read(session) != null) {
160152
currentConnector = SupabaseConnector();
161-
db.connect(connector: currentConnector!);
162-
} else if (event == AuthChangeEvent.signedOut) {
163-
// Implicit sign out - disconnect, but don't delete data
164-
currentConnector = null;
165-
await db.disconnect();
166-
} else if (event == AuthChangeEvent.tokenRefreshed) {
167-
// Supabase token refreshed - trigger token refresh for PowerSync.
168-
currentConnector?.prefetchCredentials();
153+
db.connect(connector: currentConnector);
169154
}
170-
});
171-
ref.onDispose(sub.cancel);
172155

173-
return db;
156+
// Connect and disconnect based on auth changes
157+
final instance = Supabase.instance.client.auth;
158+
final sub = instance.onAuthStateChange.listen((data) async {
159+
final event = data.event;
160+
if (event == AuthChangeEvent.signedIn) {
161+
// Connect to PowerSync when the user is signed in
162+
currentConnector = SupabaseConnector();
163+
db.connect(connector: currentConnector!);
164+
} else if (event == AuthChangeEvent.signedOut) {
165+
// Implicit sign out - disconnect, but don't delete data
166+
currentConnector = null;
167+
await db.disconnect();
168+
} else if (event == AuthChangeEvent.tokenRefreshed) {
169+
// Supabase token refreshed - trigger token refresh for PowerSync.
170+
currentConnector?.prefetchCredentials();
171+
}
172+
});
173+
ref.onDispose(sub.cancel);
174+
175+
return db;
176+
}
174177
}
175178

176179
final session = statefulProvider<Session?>((ref, change) {
@@ -185,7 +188,7 @@ final session = statefulProvider<Session?>((ref, change) {
185188
});
186189

187190
final syncStatus = statefulProvider<SyncStatus>((ref, change) {
188-
final status = Stream.fromFuture(ref.read(initializePowerSyncProvider.future))
191+
final status = Stream.fromFuture(ref.read(powerSyncInstanceProvider.future))
189192
.asyncExpand((db) => db.statusStream);
190193
final sub = status.listen(change);
191194
ref.onDispose(sub.cancel);
@@ -194,7 +197,7 @@ final syncStatus = statefulProvider<SyncStatus>((ref, change) {
194197
});
195198

196199
final driftDatabase = Provider<AppDatabase>((ref) {
197-
final powerSync = ref.read(initializePowerSyncProvider.future);
200+
final powerSync = ref.read(powerSyncInstanceProvider.future);
198201
return AppDatabase(DatabaseConnection.delayed(Future(() async {
199202
return SqliteAsyncDriftConnection(await powerSync);
200203
})));

demos/supabase-todolist-drift/lib/powersync.g.dart

Lines changed: 17 additions & 18 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

demos/supabase-todolist-drift/lib/widgets/lists_page.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ import 'package:powersync/powersync.dart';
44
import 'package:supabase_todolist_drift/powersync.dart';
55

66
import 'list_item.dart';
7-
import 'list_item_dialog.dart';
7+
import 'new_list_dialog.dart';
88
import '../main.dart';
99

1010
void _showAddDialog(BuildContext context) async {
1111
return showDialog<void>(
1212
context: context,
1313
barrierDismissible: false, // user must tap button!
1414
builder: (BuildContext context) {
15-
return const ListItemDialog();
15+
return const NewListDialog();
1616
},
1717
);
1818
}

demos/supabase-todolist-drift/lib/widgets/lists_page.g.dart

Lines changed: 0 additions & 30 deletions
This file was deleted.

demos/supabase-todolist-drift/lib/widgets/list_item_dialog.dart renamed to demos/supabase-todolist-drift/lib/widgets/new_list_dialog.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import 'package:flutter_hooks/flutter_hooks.dart';
33
import 'package:hooks_riverpod/hooks_riverpod.dart';
44
import 'package:supabase_todolist_drift/powersync.dart';
55

6-
final class ListItemDialog extends HookConsumerWidget {
7-
const ListItemDialog({super.key});
6+
final class NewListDialog extends HookConsumerWidget {
7+
const NewListDialog({super.key});
88

99
@override
1010
Widget build(BuildContext context, WidgetRef ref) {

0 commit comments

Comments
 (0)