diff --git a/clients/apps/web/src/app/[organization]/[repo]/issues/[number]/(create)/PledgePage.stories.tsx b/clients/apps/web/src/app/[organization]/[repo]/issues/[number]/(create)/PledgePage.stories.tsx index 3dc74fc377..a1991d0c84 100644 --- a/clients/apps/web/src/app/[organization]/[repo]/issues/[number]/(create)/PledgePage.stories.tsx +++ b/clients/apps/web/src/app/[organization]/[repo]/issues/[number]/(create)/PledgePage.stories.tsx @@ -32,7 +32,7 @@ export const Default: Story = { render: (args) => { return ( - + diff --git a/clients/apps/web/src/app/layout.tsx b/clients/apps/web/src/app/layout.tsx index 4b8522e1e4..1f75e00023 100644 --- a/clients/apps/web/src/app/layout.tsx +++ b/clients/apps/web/src/app/layout.tsx @@ -76,7 +76,7 @@ export default async function RootLayout({ inter.className, )} > - + diff --git a/clients/apps/web/src/components/Documentation/UserMenu.tsx b/clients/apps/web/src/components/Documentation/UserMenu.tsx index fca348698f..3f5daa0956 100644 --- a/clients/apps/web/src/components/Documentation/UserMenu.tsx +++ b/clients/apps/web/src/components/Documentation/UserMenu.tsx @@ -1,31 +1,15 @@ 'use client' import { PolarMenu } from '@/app/[organization]/(sidebar)/LayoutPolarMenu' +import { useClientSideLoadedUser } from '@/hooks/docs' import { useListAdminOrganizations } from '@/hooks/queries' -import { api } from '@/utils/api' -import { UserRead } from '@polar-sh/sdk' import { Skeleton } from 'polarkit/components/ui/skeleton' -import { useCallback, useEffect, useState } from 'react' const UserMenu = () => { - const [loaded, setLoaded] = useState(false) - const [currentUser, setCurrentUser] = useState() - const { data: organizations, refetch } = useListAdminOrganizations(false) - - const reload = useCallback(async (): Promise => { - try { - const user = await api.users.getAuthenticated() - setCurrentUser(user) - await refetch() - } catch { - } finally { - setLoaded(true) - } - }, [refetch]) - - useEffect(() => { - reload() - }, [reload]) + const { user, loaded } = useClientSideLoadedUser() + const { data: organizations } = useListAdminOrganizations( + loaded && user !== undefined, + ) if (!loaded) { return ( @@ -40,7 +24,7 @@ const UserMenu = () => { return ( ) diff --git a/clients/apps/web/src/components/Layout/DashboardLayout.stories.tsx b/clients/apps/web/src/components/Layout/DashboardLayout.stories.tsx index 699cadfc87..9e2a260826 100644 --- a/clients/apps/web/src/components/Layout/DashboardLayout.stories.tsx +++ b/clients/apps/web/src/components/Layout/DashboardLayout.stories.tsx @@ -29,7 +29,7 @@ export const Default: Story = { padding: 'p-0 m-0', }, render: (args) => ( - + @@ -60,7 +60,7 @@ export const Header: Story = { }, render: (args) => { return ( - + @@ -84,7 +84,7 @@ export const RepoPicker: Story = { }, render: (args) => { return ( - + diff --git a/clients/apps/web/src/components/Layout/Public/Topbar.stories.tsx b/clients/apps/web/src/components/Layout/Public/Topbar.stories.tsx index 01f28e13ce..d24de6d5cc 100644 --- a/clients/apps/web/src/components/Layout/Public/Topbar.stories.tsx +++ b/clients/apps/web/src/components/Layout/Public/Topbar.stories.tsx @@ -23,7 +23,7 @@ export const Default: Story = { chromatic: { viewports: [390, 1200] }, }, render: (args) => ( - + diff --git a/clients/apps/web/src/components/Pledge/PledgeCheckoutFundOnCompletion.stories.tsx b/clients/apps/web/src/components/Pledge/PledgeCheckoutFundOnCompletion.stories.tsx index f0abf5409f..5ad91a1a44 100644 --- a/clients/apps/web/src/components/Pledge/PledgeCheckoutFundOnCompletion.stories.tsx +++ b/clients/apps/web/src/components/Pledge/PledgeCheckoutFundOnCompletion.stories.tsx @@ -16,7 +16,7 @@ const meta: Meta = { }, }, render: (args) => ( - +
diff --git a/clients/apps/web/src/hooks/auth.ts b/clients/apps/web/src/hooks/auth.ts index 860ab8d370..b8a3e9b384 100644 --- a/clients/apps/web/src/hooks/auth.ts +++ b/clients/apps/web/src/hooks/auth.ts @@ -13,10 +13,6 @@ export const useAuth = (): { } => { const authCtx = useContext(AuthContext) - if (!authCtx) { - throw new Error('can not use useAuth outside of AuthContext') - } - const [currentUser, setCurrentUser] = useState(authCtx.user) const reloadUser = async (): Promise => { diff --git a/clients/apps/web/src/hooks/docs.ts b/clients/apps/web/src/hooks/docs.ts new file mode 100644 index 0000000000..b77b8760b6 --- /dev/null +++ b/clients/apps/web/src/hooks/docs.ts @@ -0,0 +1,36 @@ +import { AuthContext } from '@/providers/auth' +import { api } from '@/utils/api' +import { UserRead } from '@polar-sh/sdk' +import { useCallback, useContext, useEffect, useState } from 'react' + +export const useClientSideLoadedUser = (): { + user: UserRead | undefined + loaded: boolean +} => { + const { user: contextUser, setUser: setContextUser } = useContext(AuthContext) + const [loaded, setLoaded] = useState(false) + + const loadUser = useCallback(async (): Promise => { + if (contextUser) { + setLoaded(true) + return + } + + try { + const user = await api.users.getAuthenticated() + setContextUser(user) + } catch { + } finally { + setLoaded(true) + } + }, [contextUser, setContextUser]) + + useEffect(() => { + loadUser() + }, [loadUser]) + + return { + user: contextUser, + loaded, + } +} diff --git a/clients/apps/web/src/providers/auth.tsx b/clients/apps/web/src/providers/auth.tsx index 543e4b2f2b..3534607f20 100644 --- a/clients/apps/web/src/providers/auth.tsx +++ b/clients/apps/web/src/providers/auth.tsx @@ -5,18 +5,29 @@ import React from 'react' export type AuthContextValue = { user?: UserRead + setUser: (user: UserRead) => void } -export const AuthContext = React.createContext( - undefined, +const stub = (): never => { + throw new Error('You forgot to wrap your component in .') +} + +export const AuthContext = React.createContext( + // @ts-ignore + stub, ) export const UserContextProvider = ({ - user, + user: _user, children, }: { - user: AuthContextValue + user: UserRead | undefined children: React.ReactNode }) => { - return {children} + const [user, setUser] = React.useState(_user) + return ( + + {children} + + ) } diff --git a/clients/apps/web/src/stories/CheckoutSuccess.stories.tsx b/clients/apps/web/src/stories/CheckoutSuccess.stories.tsx index fc90d63112..bd99f29a2a 100644 --- a/clients/apps/web/src/stories/CheckoutSuccess.stories.tsx +++ b/clients/apps/web/src/stories/CheckoutSuccess.stories.tsx @@ -14,7 +14,7 @@ const meta: Meta = { }, render: (args) => { return ( - +