diff --git a/components/pages/Dashboard.js b/components/pages/Dashboard.js index c979c130..113476c2 100644 --- a/components/pages/Dashboard.js +++ b/components/pages/Dashboard.js @@ -6,6 +6,7 @@ import PageHeader from 'components/layout/PageHeader'; import WebsiteChartList from 'components/pages/WebsiteChartList'; import DashboardSettingsButton from 'components/settings/DashboardSettingsButton'; import useApi from 'hooks/useApi'; +import useRequireLogin from 'hooks/useRequireLogin'; import useDashboard from 'store/dashboard'; import DashboardEdit from './DashboardEdit'; import styles from './WebsiteList.module.css'; @@ -16,6 +17,7 @@ const messages = defineMessages({ }); export default function Dashboard({ userId }) { + const { user } = useRequireLogin(); const dashboard = useDashboard(); const { showCharts, limit, editing } = dashboard; const [max, setMax] = useState(limit); @@ -27,7 +29,7 @@ export default function Dashboard({ userId }) { setMax(max + limit); } - if (isLoading) { + if (!user || isLoading) { return ; } diff --git a/components/pages/Settings.js b/components/pages/Settings.js index 120411c3..f9e6401a 100644 --- a/components/pages/Settings.js +++ b/components/pages/Settings.js @@ -1,10 +1,10 @@ import Layout from 'components/layout/Layout'; import Menu from 'components/nav/Nav'; -import useUser from 'hooks/useUser'; +import useRequireLogin from 'hooks/useRequireLogin'; import styles from './Settings.module.css'; export default function Settings({ children }) { - const user = useUser(); + const { user } = useRequireLogin(); if (!user) { return null; diff --git a/hooks/useRequireLogin.js b/hooks/useRequireLogin.js new file mode 100644 index 00000000..24cfdf0b --- /dev/null +++ b/hooks/useRequireLogin.js @@ -0,0 +1,28 @@ +import { useEffect } from 'react'; +import { useRouter } from 'next/router'; +import useApi from 'hooks/useApi'; +import useUser from 'hooks/useUser'; + +export default function useRequireLogin() { + const router = useRouter(); + const { get } = useApi(); + const { user, setUser } = useUser(); + + useEffect(() => { + async function loadUser() { + try { + const { user } = await get('/auth/verify'); + + setUser(user); + } catch { + await router.push('/login'); + } + } + + if (!user) { + loadUser(); + } + }, [user]); + + return { user }; +} diff --git a/hooks/useUser.js b/hooks/useUser.js index 108888ea..6b73c113 100644 --- a/hooks/useUser.js +++ b/hooks/useUser.js @@ -1,33 +1,9 @@ -import { useEffect } from 'react'; -import { useRouter } from 'next/router'; import useStore, { setUser } from 'store/app'; -import useApi from 'hooks/useApi'; const selector = state => state.user; -let loading = false; export default function useUser() { const user = useStore(selector); - const { get } = useApi(); - const router = useRouter(); - useEffect(() => { - async function loadUser() { - const { user } = await get('/auth/verify'); - loading = false; - - if (!user) { - await router.push('/login'); - } else { - setUser(user); - } - } - - if (!user && !loading) { - loading = true; - loadUser(); - } - }, [user, get, router]); - - return user; + return { user, setUser }; } diff --git a/pages/console/[[...id]].js b/pages/console/[[...id]].js index 666e0597..7a94378f 100644 --- a/pages/console/[[...id]].js +++ b/pages/console/[[...id]].js @@ -1,9 +1,9 @@ import Layout from 'components/layout/Layout'; import TestConsole from 'components/pages/TestConsole'; -import useUser from 'hooks/useUser'; +import useRequireLogin from 'hooks/useRequireLogin'; export default function ConsolePage({ pageDisabled }) { - const user = useUser(); + const { user } = useRequireLogin(); if (pageDisabled || !user || !user.isAdmin) { return null; diff --git a/pages/dashboard/[[...id]].js b/pages/dashboard/[[...id]].js index b6fc4492..5a185677 100644 --- a/pages/dashboard/[[...id]].js +++ b/pages/dashboard/[[...id]].js @@ -1,8 +1,8 @@ import { useRouter } from 'next/router'; import Layout from 'components/layout/Layout'; import Dashboard from 'components/pages/Dashboard'; -import useUser from 'hooks/useUser'; import useConfig from 'hooks/useConfig'; +import useRequireLogin from 'hooks/useRequireLogin'; export default function DashboardPage() { const { @@ -10,7 +10,7 @@ export default function DashboardPage() { isReady, asPath, } = useRouter(); - const user = useUser(); + const { user } = useRequireLogin(); const { adminDisabled } = useConfig(); if (adminDisabled || !user || !isReady) { diff --git a/pages/realtime.js b/pages/realtime.js index 472f2692..b8d7f664 100644 --- a/pages/realtime.js +++ b/pages/realtime.js @@ -1,9 +1,9 @@ import Layout from 'components/layout/Layout'; import RealtimeDashboard from 'components/pages/RealtimeDashboard'; -import useUser from 'hooks/useUser'; +import useRequireLogin from 'hooks/useRequireLogin'; export default function RealtimePage() { - const user = useUser(); + const { user } = useRequireLogin(); if (!user) { return null; diff --git a/pages/websites/[id]/index.js b/pages/websites/[id]/index.js index 034295a0..f249cc97 100644 --- a/pages/websites/[id]/index.js +++ b/pages/websites/[id]/index.js @@ -1,10 +1,10 @@ import { useRouter } from 'next/router'; import Layout from 'components/layout/Layout'; import WebsiteDetails from 'components/pages/WebsiteDetails'; -import useUser from 'hooks/useUser'; +import useRequireLogin from 'hooks/useRequireLogin'; export default function DetailsPage() { - const user = useUser(); + const { user } = useRequireLogin(); const router = useRouter(); const { id } = router.query; diff --git a/pages/websites/index.js b/pages/websites/index.js index 56f9c67c..e09978a7 100644 --- a/pages/websites/index.js +++ b/pages/websites/index.js @@ -1,11 +1,10 @@ import Settings from 'components/pages/Settings'; import useConfig from 'hooks/useConfig'; -import useUser from 'hooks/useUser'; - +import useRequireLogin from 'hooks/useRequireLogin'; import WebsitesList from 'components/pages/WebsitesList'; export default function WebsitesPage() { - const user = useUser(); + const { user } = useRequireLogin(); const { adminDisabled } = useConfig(); if (adminDisabled || !user) { diff --git a/queries/admin/team.ts b/queries/admin/team.ts index 1bebcadb..add282a9 100644 --- a/queries/admin/team.ts +++ b/queries/admin/team.ts @@ -26,7 +26,7 @@ export async function getTeamWebsites(teamId: string): Promise { name: 'asc', }, ], - }); + } as any); } export async function createTeam(data: Prisma.TeamCreateInput): Promise {