diff --git a/demos/react-supabase-todolist/src/app/router.tsx b/demos/react-supabase-todolist/src/app/router.tsx
index 8268cc66..59ae0d38 100644
--- a/demos/react-supabase-todolist/src/app/router.tsx
+++ b/demos/react-supabase-todolist/src/app/router.tsx
@@ -2,10 +2,11 @@ import { Outlet, createBrowserRouter } from "react-router-dom";
import LoginPage from "./auth/login/page";
import RegisterPage from "./auth/register/page";
import EntryPage from "./page";
-import TodoEditPage from "./views/todo-lists/edit/page";
-import TodoListsPage from "./views/todo-lists/page";
+import TodoEditPage, { todoPageLoader } from "./views/todo-lists/edit/page";
+import TodoListsPage, { todoListsLoader } from "./views/todo-lists/page";
import ViewsLayout from "./views/layout";
import SQLConsolePage from "./views/sql-console/page";
+import { db } from "@/components/providers/SystemProvider";
export const TODO_LISTS_ROUTE = '/views/todo-lists';
export const TODO_EDIT_ROUTE = '/views/todo-lists/:id';
@@ -38,11 +39,13 @@ export const router = createBrowserRouter([
children: [
{
path: TODO_LISTS_ROUTE,
- element:
+ element: ,
+ loader: todoListsLoader(db)
},
{
path: TODO_EDIT_ROUTE,
- element:
+ element: ,
+ loader: todoPageLoader(db)
},
{
path: SQL_CONSOLE_ROUTE,
diff --git a/demos/react-supabase-todolist/src/app/views/todo-lists/edit/page.tsx b/demos/react-supabase-todolist/src/app/views/todo-lists/edit/page.tsx
index c92f52db..86976758 100644
--- a/demos/react-supabase-todolist/src/app/views/todo-lists/edit/page.tsx
+++ b/demos/react-supabase-todolist/src/app/views/todo-lists/edit/page.tsx
@@ -1,7 +1,10 @@
+import { NavigationPage } from '@/components/navigation/NavigationPage';
import { useSupabase } from '@/components/providers/SystemProvider';
import { TodoItemWidget } from '@/components/widgets/TodoItemWidget';
+import { TodoListsWidget, loadTodoLists } from '@/components/widgets/TodoListsWidget';
import { LISTS_TABLE, TODOS_TABLE, TodoRecord } from '@/library/powersync/AppSchema';
import { usePowerSync, usePowerSyncWatchedQuery } from '@journeyapps/powersync-react';
+import { AbstractPowerSyncDatabase } from '@journeyapps/powersync-sdk-web';
import AddIcon from '@mui/icons-material/Add';
import {
Box,
@@ -12,6 +15,7 @@ import {
DialogContent,
DialogContentText,
DialogTitle,
+ Grid,
List,
TextField,
Typography,
@@ -19,8 +23,17 @@ import {
} from '@mui/material';
import Fab from '@mui/material/Fab';
import React, { Suspense } from 'react';
-import { useParams } from 'react-router-dom';
-import { NavigationPage } from '@/components/navigation/NavigationPage';
+import { LoaderFunctionArgs, useLoaderData, useParams } from 'react-router-dom';
+
+export const todoPageLoader = (db: AbstractPowerSyncDatabase) => async ({ params }: LoaderFunctionArgs) => {
+ return {
+ todos: await db.query(`SELECT * FROM ${TODOS_TABLE} WHERE list_id=? ORDER BY created_at DESC, id`, [params.id]).preload(),
+ list_names: await db.query<{ name: string }>(`SELECT name FROM ${LISTS_TABLE} WHERE id = ?`, [params.id]).preload(),
+ lists: await loadTodoLists(db)
+ };
+}
+
+type QueryLoaderType = Awaited>>;
/**
* useSearchParams causes the entire element to fall back to client side rendering
@@ -31,15 +44,10 @@ const TodoEditSection = () => {
const powerSync = usePowerSync();
const supabase = useSupabase();
const { id: listID } = useParams();
+ const queryResults = useLoaderData() as QueryLoaderType;
- const [listRecord] = usePowerSyncWatchedQuery<{ name: string }>(`SELECT name FROM ${LISTS_TABLE} WHERE id = ?`, [
- listID
- ]);
-
- const todos = usePowerSyncWatchedQuery(
- `SELECT * FROM ${TODOS_TABLE} WHERE list_id=? ORDER BY created_at DESC, id`,
- [listID]
- );
+ const [listRecord] = usePowerSyncWatchedQuery(queryResults.list_names);
+ const todos = usePowerSyncWatchedQuery(queryResults.todos);
const [showPrompt, setShowPrompt] = React.useState(false);
const nameInputRef = React.createRef();
@@ -104,17 +112,24 @@ const TodoEditSection = () => {
-
- {todos.map((r) => (
- deleteTodo(r.id)}
- isComplete={r.completed == 1}
- toggleCompletion={() => toggleCompletion(r, !r.completed)}
- />
- ))}
-
+
+
+
+
+
+
+ {todos.map((r) => (
+ deleteTodo(r.id)}
+ isComplete={r.completed == 1}
+ toggleCompletion={() => toggleCompletion(r, !r.completed)}
+ />
+ ))}
+
+
+
{/* TODO use a dialog service in future, this is just a simple example app */}