Skip to content

Commit cc51f19

Browse files
committed
Migrate SQL console
1 parent 2c2ca2d commit cc51f19

File tree

7 files changed

+153
-156
lines changed

7 files changed

+153
-156
lines changed

demos/supabase-todolist-drift/lib/components/page_layout.dart

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import 'package:auto_route/auto_route.dart';
12
import 'package:flutter/material.dart';
23
import 'package:hooks_riverpod/hooks_riverpod.dart';
34

5+
import '../navigation.gr.dart';
46
import '../supabase.dart';
57
import 'app_bar.dart';
68

@@ -43,7 +45,12 @@ final class PageLayout extends ConsumerWidget {
4345
),
4446
ListTile(
4547
title: const Text('SQL Console'),
46-
onTap: () {},
48+
onTap: () {
49+
final route = context.topRoute;
50+
if (route.name != SqlConsoleRoute.name) {
51+
context.pushRoute(const SqlConsoleRoute());
52+
}
53+
},
4754
),
4855
ListTile(
4956
title: const Text('Sign Out'),

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ final class AppRouter extends RootStackRouter {
3131
page: ListsRoute.page,
3232
),
3333
_dialogRoute(AddListRoute.page),
34-
CustomRoute(page: ListsDetailsRoute.page),
34+
AutoRoute(page: ListsDetailsRoute.page),
3535
_dialogRoute(AddItemRoute.page),
36+
AutoRoute(page: SqlConsoleRoute.page),
3637
],
3738
),
3839
];

demos/supabase-todolist-drift/lib/navigation.gr.dart

Lines changed: 44 additions & 27 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import 'package:auto_route/auto_route.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_hooks/flutter_hooks.dart';
4+
import 'package:hooks_riverpod/hooks_riverpod.dart';
5+
import 'package:powersync/sqlite3_common.dart' as sqlite;
6+
import 'package:riverpod_annotation/riverpod_annotation.dart';
7+
8+
import '../components/page_layout.dart';
9+
import '../powersync/powersync.dart';
10+
import '../powersync/schema.dart';
11+
12+
part 'sql_console.g.dart';
13+
14+
@riverpod
15+
Stream<sqlite.ResultSet> _watch(Ref ref, String sql) async* {
16+
final db = await ref.read(powerSyncInstanceProvider.future);
17+
yield* db.watch(sql);
18+
}
19+
20+
@RoutePage()
21+
final class SqlConsolePage extends HookConsumerWidget {
22+
const SqlConsolePage({super.key});
23+
24+
@override
25+
Widget build(BuildContext context, WidgetRef ref) {
26+
final query = useState('SELECT * FROM $todosTable');
27+
final controller = useTextEditingController(text: query.value);
28+
final rows = ref.watch(_watchProvider(query.value));
29+
30+
return PageLayout(
31+
showDrawer: false,
32+
content: Column(
33+
children: [
34+
Padding(
35+
padding: const EdgeInsets.all(12),
36+
child: TextField(
37+
controller: controller,
38+
onEditingComplete: () {
39+
query.value = controller.text;
40+
},
41+
decoration: InputDecoration(
42+
isDense: false,
43+
border: const OutlineInputBorder(),
44+
labelText: 'Query',
45+
errorText: rows.error?.toString(),
46+
),
47+
),
48+
),
49+
Expanded(
50+
child: SingleChildScrollView(
51+
scrollDirection: Axis.horizontal,
52+
child: SingleChildScrollView(
53+
scrollDirection: Axis.vertical,
54+
child: ResultSetTable(data: rows.value),
55+
),
56+
))
57+
],
58+
),
59+
);
60+
}
61+
}
62+
63+
/// Stateless DataTable rendering results from a SQLite query
64+
final class ResultSetTable extends StatelessWidget {
65+
const ResultSetTable({super.key, this.data});
66+
67+
final sqlite.ResultSet? data;
68+
69+
@override
70+
Widget build(BuildContext context) {
71+
if (data == null) {
72+
return const Text('Loading...');
73+
} else if (data!.isEmpty) {
74+
return const Text('Empty');
75+
}
76+
return DataTable(
77+
columns: <DataColumn>[
78+
for (var column in data!.columnNames)
79+
DataColumn(
80+
label: Expanded(
81+
child: Text(
82+
column,
83+
style: const TextStyle(fontStyle: FontStyle.italic),
84+
),
85+
),
86+
),
87+
],
88+
rows: <DataRow>[
89+
for (var row in data!.rows)
90+
DataRow(
91+
cells: <DataCell>[
92+
for (var cell in row) DataCell(Text((cell ?? '').toString())),
93+
],
94+
),
95+
],
96+
);
97+
}
98+
}

demos/supabase-todolist-drift/lib/widgets/query_widget.g.dart renamed to demos/supabase-todolist-drift/lib/screens/sql_console.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/widgets/query_widget.dart

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

0 commit comments

Comments
 (0)