disable syncing once synced
This commit is contained in:
parent
a1beff806b
commit
5c2d2c8cf0
3 changed files with 60 additions and 50 deletions
|
|
@ -1,33 +1,41 @@
|
||||||
import { client } from "#/lib/eden";
|
|
||||||
import { toast } from "sonner";
|
|
||||||
import { Button } from "./ui/button";
|
|
||||||
import { useQueryClient } from "@tanstack/react-query";
|
import { useQueryClient } from "@tanstack/react-query";
|
||||||
|
import { useState } from "react";
|
||||||
|
import { toast } from "sonner";
|
||||||
|
import { client } from "#/lib/eden";
|
||||||
|
import { Button } from "./ui/button";
|
||||||
import { Item, ItemActions, ItemDescription, ItemTitle } from "./ui/item";
|
import { Item, ItemActions, ItemDescription, ItemTitle } from "./ui/item";
|
||||||
|
|
||||||
export function SyncButton() {
|
export function SyncButton() {
|
||||||
const query = useQueryClient();
|
const query = useQueryClient();
|
||||||
return (
|
const [syncing, setSyncing] = useState(false);
|
||||||
<Item className="px-0 justify-between">
|
return (
|
||||||
<ItemDescription>Sync your data</ItemDescription>
|
<Item className="px-0 justify-between">
|
||||||
<ItemActions>
|
<ItemDescription>Sync your data</ItemDescription>
|
||||||
<Button
|
<ItemActions>
|
||||||
onClick={async () => {
|
<Button
|
||||||
toast.promise(
|
disabled={syncing}
|
||||||
(async () => {
|
onClick={async () => {
|
||||||
await client.api.sync.post();
|
toast.promise(
|
||||||
query.invalidateQueries();
|
(async () => {
|
||||||
})(),
|
setSyncing(true);
|
||||||
{
|
try {
|
||||||
loading: "Syncing...",
|
await client.api.sync.post();
|
||||||
success: "Synced!",
|
} finally {
|
||||||
error: "Sync failed",
|
setSyncing(false);
|
||||||
},
|
query.invalidateQueries();
|
||||||
);
|
}
|
||||||
}}
|
})(),
|
||||||
>
|
{
|
||||||
Sync
|
loading: "Syncing...",
|
||||||
</Button>
|
success: "Synced!",
|
||||||
</ItemActions>
|
error: "Sync failed",
|
||||||
</Item>
|
},
|
||||||
);
|
);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
Sync
|
||||||
|
</Button>
|
||||||
|
</ItemActions>
|
||||||
|
</Item>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,21 +1,21 @@
|
||||||
import { authClient } from "#/lib/auth-client";
|
|
||||||
import type { AuthSession } from "#/lib/auth.serverfn";
|
import type { AuthSession } from "#/lib/auth.serverfn";
|
||||||
|
import { authClient } from "#/lib/auth-client";
|
||||||
import { Route } from "#/routes/__root";
|
import { Route } from "#/routes/__root";
|
||||||
|
|
||||||
interface UserData {
|
interface UserData {
|
||||||
user: AuthSession["user"] | null;
|
user: AuthSession["user"] | null;
|
||||||
session: AuthSession["session"] | null;
|
session: AuthSession["session"] | null;
|
||||||
isLoading: boolean;
|
isLoading: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useUser() {
|
export function useUser() {
|
||||||
const routeContext = Route.useRouteContext();
|
const routeContext = Route.useRouteContext();
|
||||||
const { data: clientSession, isPending: isClientSessionPending } =
|
const { data: clientSession, isPending: isClientSessionPending } =
|
||||||
authClient.useSession();
|
authClient.useSession();
|
||||||
const session = (clientSession?.session ??
|
const session = (clientSession?.session ??
|
||||||
routeContext.session?.session ??
|
routeContext.session?.session ??
|
||||||
null) as AuthSession["session"] | null;
|
null) as AuthSession["session"] | null;
|
||||||
const user = clientSession?.user ?? routeContext.session?.user ?? null;
|
const user = clientSession?.user ?? routeContext.session?.user ?? null;
|
||||||
const isLoading = !routeContext.session && isClientSessionPending;
|
const isLoading = !routeContext.session && isClientSessionPending;
|
||||||
return { user, session, isLoading } satisfies UserData;
|
return { user, session, isLoading } as UserData;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,19 @@
|
||||||
|
import { createFileRoute } from "@tanstack/react-router";
|
||||||
|
import { PartyQr } from "#/components/party-qr";
|
||||||
import { SyncButton } from "#/components/sync-button";
|
import { SyncButton } from "#/components/sync-button";
|
||||||
import { MainContent } from "#/components/ui/main-content";
|
import { MainContent } from "#/components/ui/main-content";
|
||||||
import { UserInfo } from "#/components/user-info";
|
import { UserInfo } from "#/components/user-info";
|
||||||
import { PartyQr } from "#/components/party-qr";
|
import { useUser } from "#/hooks/user";
|
||||||
import { createFileRoute } from "@tanstack/react-router";
|
|
||||||
|
|
||||||
export const Route = createFileRoute("/")({ component: App });
|
export const Route = createFileRoute("/")({ component: App });
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
const { user } = useUser();
|
||||||
<MainContent>
|
return (
|
||||||
<UserInfo />
|
<MainContent>
|
||||||
<SyncButton />
|
<UserInfo />
|
||||||
<PartyQr />
|
{!user?.lastSyncAt && <SyncButton />}
|
||||||
</MainContent>
|
{user && <PartyQr />}
|
||||||
);
|
</MainContent>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue