From 981ba38c7814a647953788bf681a7a67c6f92d63 Mon Sep 17 00:00:00 2001 From: Shawn Erquhart Date: Thu, 27 Mar 2025 11:52:27 -0400 Subject: [PATCH] add optimistic updates to example --- example/src/App.tsx | 94 ++++++++++++++++++++++++++++----------- example/src/optimistic.ts | 57 ++++++++++++++++++++++++ package.json | 2 +- 3 files changed, 125 insertions(+), 28 deletions(-) create mode 100644 example/src/optimistic.ts diff --git a/example/src/App.tsx b/example/src/App.tsx index ac47b25..1adb118 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -5,14 +5,25 @@ import { AlertCircle } from "lucide-react"; import { useMutation, useQuery, useAction } from "convex/react"; import { api } from "../convex/_generated/api"; import { CheckoutLink, CustomerPortalLink } from "../../src/react"; +import { + insertTodoOptimistic, + completeTodoOptimistic, + deleteTodoOptimistic, +} from "@/optimistic"; export default function TodoList() { const user = useQuery(api.example.getCurrentUser); const todos = useQuery(api.example.listTodos); const products = useQuery(api.example.getConfiguredProducts); - const insertTodo = useMutation(api.example.insertTodo); - const completeTodo = useMutation(api.example.completeTodo); - const deleteTodo = useMutation(api.example.deleteTodo); + const insertTodo = useMutation(api.example.insertTodo).withOptimisticUpdate( + insertTodoOptimistic + ); + const completeTodo = useMutation( + api.example.completeTodo + ).withOptimisticUpdate(completeTodoOptimistic); + const deleteTodo = useMutation(api.example.deleteTodo).withOptimisticUpdate( + deleteTodoOptimistic + ); const cancelSubscription = useAction(api.example.cancelCurrentSubscription); const changeSubscription = useAction(api.example.changeCurrentSubscription); const [newTodo, setNewTodo] = useState(""); @@ -84,6 +95,14 @@ export default function TodoList() {

Todo List

+
+

Plan limits:

+ +
)} + + •{" "} + {user?.isPremiumPlus + ? "Unlimited todos" + : user?.isPremium + ? "Up to 6 todos" + : "Up to 3 todos"} + @@ -185,17 +212,25 @@ export default function TodoList() {

Premium

-

- ${(premiumMonthly.prices[0].priceAmount ?? 0) / 100} - /month -

- {premiumYearly && ( -

+

+ $ - {(premiumYearly.prices[0].priceAmount ?? 0) / 100} - /year -

- )} + {(premiumMonthly.prices[0].priceAmount ?? 0) / + 100} + /month +
+ {premiumYearly && ( + + or $ + {(premiumYearly.prices[0].priceAmount ?? 0) / + 100} + /year + + )} + + • Up to 6 todos + +
{user?.subscription?.productId !== premiumMonthly.id && @@ -212,7 +247,7 @@ export default function TodoList() { className="text-sm text-indigo-600 hover:text-indigo-700 dark:text-indigo-400 dark:hover:text-indigo-300" embed={false} > - Upgrade to Premium + Upgrade to Premium (redirect) ) : (