From 934eb780046fb49f56bf1d6439e93180a73ec850 Mon Sep 17 00:00:00 2001 From: Zai Shi Date: Mon, 1 Jul 2024 17:39:50 -0700 Subject: [PATCH] Fixed team selection (#124) * fixed selected team switcher * fixed selected team switcher * updated lock files --- apps/backend/src/lib/users.tsx | 1 - apps/dashboard/src/lib/users.tsx | 1 - .../docs/pages/concepts/team-selection.mdx | 8 ++-- .../.env | 0 .../.env.development | 0 .../.eslintrc.js | 0 .../.gitignore | 0 .../CHANGELOG.md | 0 .../LICENSE | 0 .../next.config.js | 0 .../package.json | 2 +- .../postcss.config.js | 0 .../src/app/drive/page.tsx | 0 .../src/app/favicon.ico | Bin .../src/app/global.css | 0 .../src/app/handler/[...stack]/page.tsx | 0 .../src/app/layout.tsx | 0 .../src/app/loading.tsx | 0 .../src/app/page-client.tsx | 0 .../src/app/page.tsx | 0 .../src/app/signin/page.tsx | 0 .../src/app/signup/page.tsx | 0 .../src/app/team/[teamId]/page.tsx | 24 ++++++++++ examples/docs-examples/src/app/team/page.tsx | 27 +++++++++++ .../src/components/provider.tsx | 0 .../src/stack.tsx | 0 .../tailwind.config.js | 0 .../tsconfig.json | 0 .../src/components/selected-team-switcher.tsx | 42 ++++++++++-------- pnpm-lock.yaml | 4 +- 30 files changed, 81 insertions(+), 28 deletions(-) rename examples/{custom-pages-example => docs-examples}/.env (100%) rename examples/{custom-pages-example => docs-examples}/.env.development (100%) rename examples/{custom-pages-example => docs-examples}/.eslintrc.js (100%) rename examples/{custom-pages-example => docs-examples}/.gitignore (100%) rename examples/{custom-pages-example => docs-examples}/CHANGELOG.md (100%) rename examples/{custom-pages-example => docs-examples}/LICENSE (100%) rename examples/{custom-pages-example => docs-examples}/next.config.js (100%) rename examples/{custom-pages-example => docs-examples}/package.json (95%) rename examples/{custom-pages-example => docs-examples}/postcss.config.js (100%) rename examples/{custom-pages-example => docs-examples}/src/app/drive/page.tsx (100%) rename examples/{custom-pages-example => docs-examples}/src/app/favicon.ico (100%) rename examples/{custom-pages-example => docs-examples}/src/app/global.css (100%) rename examples/{custom-pages-example => docs-examples}/src/app/handler/[...stack]/page.tsx (100%) rename examples/{custom-pages-example => docs-examples}/src/app/layout.tsx (100%) rename examples/{custom-pages-example => docs-examples}/src/app/loading.tsx (100%) rename examples/{custom-pages-example => docs-examples}/src/app/page-client.tsx (100%) rename examples/{custom-pages-example => docs-examples}/src/app/page.tsx (100%) rename examples/{custom-pages-example => docs-examples}/src/app/signin/page.tsx (100%) rename examples/{custom-pages-example => docs-examples}/src/app/signup/page.tsx (100%) create mode 100644 examples/docs-examples/src/app/team/[teamId]/page.tsx create mode 100644 examples/docs-examples/src/app/team/page.tsx rename examples/{custom-pages-example => docs-examples}/src/components/provider.tsx (100%) rename examples/{custom-pages-example => docs-examples}/src/stack.tsx (100%) rename examples/{custom-pages-example => docs-examples}/tailwind.config.js (100%) rename examples/{custom-pages-example => docs-examples}/tsconfig.json (100%) diff --git a/apps/backend/src/lib/users.tsx b/apps/backend/src/lib/users.tsx index 48ce59c97..a775e3fd4 100644 --- a/apps/backend/src/lib/users.tsx +++ b/apps/backend/src/lib/users.tsx @@ -109,7 +109,6 @@ export async function updateServerUser( primaryEmailVerified: update.primaryEmailVerified, clientMetadata: update.clientMetadata as any, serverMetadata: update.serverMetadata as any, - selectedTeamId: update.selectedTeamId, }), }); } catch (e) { diff --git a/apps/dashboard/src/lib/users.tsx b/apps/dashboard/src/lib/users.tsx index b3237159c..c096ae3a2 100644 --- a/apps/dashboard/src/lib/users.tsx +++ b/apps/dashboard/src/lib/users.tsx @@ -111,7 +111,6 @@ export async function updateServerUser( primaryEmailVerified: update.primaryEmailVerified, clientMetadata: update.clientMetadata as any, serverMetadata: update.serverMetadata as any, - selectedTeamId: update.selectedTeamId, }), }); } catch (e) { diff --git a/docs/fern/docs/pages/concepts/team-selection.mdx b/docs/fern/docs/pages/concepts/team-selection.mdx index 74c03150c..a202508f8 100644 --- a/docs/fern/docs/pages/concepts/team-selection.mdx +++ b/docs/fern/docs/pages/concepts/team-selection.mdx @@ -96,14 +96,14 @@ export default function TeamsPage() { const user = useUser({ or: 'redirect' }); const teams = user.useTeams(); const router = useRouter(); + const selectedTeam = user.selectedTeam; return (
- {user.selectedTeam && - - } + }

All Teams

{teams.map(team => ( diff --git a/examples/custom-pages-example/.env b/examples/docs-examples/.env similarity index 100% rename from examples/custom-pages-example/.env rename to examples/docs-examples/.env diff --git a/examples/custom-pages-example/.env.development b/examples/docs-examples/.env.development similarity index 100% rename from examples/custom-pages-example/.env.development rename to examples/docs-examples/.env.development diff --git a/examples/custom-pages-example/.eslintrc.js b/examples/docs-examples/.eslintrc.js similarity index 100% rename from examples/custom-pages-example/.eslintrc.js rename to examples/docs-examples/.eslintrc.js diff --git a/examples/custom-pages-example/.gitignore b/examples/docs-examples/.gitignore similarity index 100% rename from examples/custom-pages-example/.gitignore rename to examples/docs-examples/.gitignore diff --git a/examples/custom-pages-example/CHANGELOG.md b/examples/docs-examples/CHANGELOG.md similarity index 100% rename from examples/custom-pages-example/CHANGELOG.md rename to examples/docs-examples/CHANGELOG.md diff --git a/examples/custom-pages-example/LICENSE b/examples/docs-examples/LICENSE similarity index 100% rename from examples/custom-pages-example/LICENSE rename to examples/docs-examples/LICENSE diff --git a/examples/custom-pages-example/next.config.js b/examples/docs-examples/next.config.js similarity index 100% rename from examples/custom-pages-example/next.config.js rename to examples/docs-examples/next.config.js diff --git a/examples/custom-pages-example/package.json b/examples/docs-examples/package.json similarity index 95% rename from examples/custom-pages-example/package.json rename to examples/docs-examples/package.json index 99126c6e9..9bc752677 100644 --- a/examples/custom-pages-example/package.json +++ b/examples/docs-examples/package.json @@ -1,5 +1,5 @@ { - "name": "@stackframe/custom-pages-example", + "name": "@stackframe/docs-examples", "version": "2.4.28", "description": "", "private": true, diff --git a/examples/custom-pages-example/postcss.config.js b/examples/docs-examples/postcss.config.js similarity index 100% rename from examples/custom-pages-example/postcss.config.js rename to examples/docs-examples/postcss.config.js diff --git a/examples/custom-pages-example/src/app/drive/page.tsx b/examples/docs-examples/src/app/drive/page.tsx similarity index 100% rename from examples/custom-pages-example/src/app/drive/page.tsx rename to examples/docs-examples/src/app/drive/page.tsx diff --git a/examples/custom-pages-example/src/app/favicon.ico b/examples/docs-examples/src/app/favicon.ico similarity index 100% rename from examples/custom-pages-example/src/app/favicon.ico rename to examples/docs-examples/src/app/favicon.ico diff --git a/examples/custom-pages-example/src/app/global.css b/examples/docs-examples/src/app/global.css similarity index 100% rename from examples/custom-pages-example/src/app/global.css rename to examples/docs-examples/src/app/global.css diff --git a/examples/custom-pages-example/src/app/handler/[...stack]/page.tsx b/examples/docs-examples/src/app/handler/[...stack]/page.tsx similarity index 100% rename from examples/custom-pages-example/src/app/handler/[...stack]/page.tsx rename to examples/docs-examples/src/app/handler/[...stack]/page.tsx diff --git a/examples/custom-pages-example/src/app/layout.tsx b/examples/docs-examples/src/app/layout.tsx similarity index 100% rename from examples/custom-pages-example/src/app/layout.tsx rename to examples/docs-examples/src/app/layout.tsx diff --git a/examples/custom-pages-example/src/app/loading.tsx b/examples/docs-examples/src/app/loading.tsx similarity index 100% rename from examples/custom-pages-example/src/app/loading.tsx rename to examples/docs-examples/src/app/loading.tsx diff --git a/examples/custom-pages-example/src/app/page-client.tsx b/examples/docs-examples/src/app/page-client.tsx similarity index 100% rename from examples/custom-pages-example/src/app/page-client.tsx rename to examples/docs-examples/src/app/page-client.tsx diff --git a/examples/custom-pages-example/src/app/page.tsx b/examples/docs-examples/src/app/page.tsx similarity index 100% rename from examples/custom-pages-example/src/app/page.tsx rename to examples/docs-examples/src/app/page.tsx diff --git a/examples/custom-pages-example/src/app/signin/page.tsx b/examples/docs-examples/src/app/signin/page.tsx similarity index 100% rename from examples/custom-pages-example/src/app/signin/page.tsx rename to examples/docs-examples/src/app/signin/page.tsx diff --git a/examples/custom-pages-example/src/app/signup/page.tsx b/examples/docs-examples/src/app/signup/page.tsx similarity index 100% rename from examples/custom-pages-example/src/app/signup/page.tsx rename to examples/docs-examples/src/app/signup/page.tsx diff --git a/examples/docs-examples/src/app/team/[teamId]/page.tsx b/examples/docs-examples/src/app/team/[teamId]/page.tsx new file mode 100644 index 000000000..6430fbf4a --- /dev/null +++ b/examples/docs-examples/src/app/team/[teamId]/page.tsx @@ -0,0 +1,24 @@ +"use client"; + +import { useUser, SelectedTeamSwitcher } from "@stackframe/stack"; + +export default function TeamPage({ params }: { params: { teamId: string } }) { + const user = useUser({ or: 'redirect' }); + const team = user.useTeam(params.teamId); + + if (!team) { + return
Team not found
; + } + + return ( +
+ `/team/${team.id}`} + selectedTeam={team} + /> + +

Team Name: {team.displayName}

+

You are a member of this team.

+
+ ); +} \ No newline at end of file diff --git a/examples/docs-examples/src/app/team/page.tsx b/examples/docs-examples/src/app/team/page.tsx new file mode 100644 index 000000000..30d371ffa --- /dev/null +++ b/examples/docs-examples/src/app/team/page.tsx @@ -0,0 +1,27 @@ +"use client"; + +import { useRouter } from "next/navigation"; +import { useUser } from "@stackframe/stack"; + +export default function TeamsPage() { + const user = useUser({ or: 'redirect' }); + const teams = user.useTeams(); + const router = useRouter(); + const selectedTeam = user.selectedTeam; + + return ( +
+ {selectedTeam && + } + +

All Teams

+ {teams.map(team => ( + + ))} +
+ ); +} \ No newline at end of file diff --git a/examples/custom-pages-example/src/components/provider.tsx b/examples/docs-examples/src/components/provider.tsx similarity index 100% rename from examples/custom-pages-example/src/components/provider.tsx rename to examples/docs-examples/src/components/provider.tsx diff --git a/examples/custom-pages-example/src/stack.tsx b/examples/docs-examples/src/stack.tsx similarity index 100% rename from examples/custom-pages-example/src/stack.tsx rename to examples/docs-examples/src/stack.tsx diff --git a/examples/custom-pages-example/tailwind.config.js b/examples/docs-examples/tailwind.config.js similarity index 100% rename from examples/custom-pages-example/tailwind.config.js rename to examples/docs-examples/tailwind.config.js diff --git a/examples/custom-pages-example/tsconfig.json b/examples/docs-examples/tsconfig.json similarity index 100% rename from examples/custom-pages-example/tsconfig.json rename to examples/docs-examples/tsconfig.json diff --git a/packages/stack/src/components/selected-team-switcher.tsx b/packages/stack/src/components/selected-team-switcher.tsx index 307511988..750c38f49 100644 --- a/packages/stack/src/components/selected-team-switcher.tsx +++ b/packages/stack/src/components/selected-team-switcher.tsx @@ -15,7 +15,7 @@ import { import { useEffect, useMemo } from "react"; type SelectedTeamSwitcherProps = { - urlMap?: (projectId: string) => string, + urlMap?: (team: Team) => string, selectedTeam?: Team, noUpdateSelectedTeam?: boolean, }; @@ -36,32 +36,36 @@ export function SelectedTeamSwitcher(props: SelectedTeamSwitcherProps) { const teams = useMemo(() => rawTeams?.sort((a, b) => b.id === selectedTeam?.id ? 1 : -1), [rawTeams, selectedTeam]); useEffect(() => { - if (!props.noUpdateSelectedTeam && teams && selectedTeam && !teams.find(team => team.id === selectedTeam.id)) { - runAsynchronouslyWithAlert(user?.setSelectedTeam(selectedTeam)); + if (!props.noUpdateSelectedTeam && props.selectedTeam) { + runAsynchronouslyWithAlert(user?.setSelectedTeam(props.selectedTeam)); } - }, [teams, selectedTeam, props.noUpdateSelectedTeam]); + }, [props.noUpdateSelectedTeam, props.selectedTeam]); return ( - { + runAsynchronouslyWithAlert(async () => { + const team = teams?.find(team => team.id === value); + if (!team) { + throw new Error('Team not found, this should not happen'); + } + + if (!props.noUpdateSelectedTeam) { + await user?.setSelectedTeam(team); + } + if (props.urlMap) { + router.push(props.urlMap(team)); + } + }); + }} + > {teams && teams.map(team => ( - { - runAsynchronouslyWithAlert(async () => { - if (!props.noUpdateSelectedTeam) { - await user?.setSelectedTeam(team); - } - if (props.urlMap) { - router.push(props.urlMap(team.id)); - } - }); - }} - > +
{team.displayName} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f31ec707..dd76ba5c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -566,7 +566,7 @@ importers: specifier: ^5 version: 5.3.3 - examples/custom-pages-example: + examples/demo: dependencies: '@emotion/react': specifier: ^11.11.3 @@ -621,7 +621,7 @@ importers: specifier: ^3.4.1 version: 3.4.4 - examples/demo: + examples/docs-examples: dependencies: '@emotion/react': specifier: ^11.11.3