From e10030e18b87840e4c2707f773f6e54736e5d2d7 Mon Sep 17 00:00:00 2001 From: mihaic195 Date: Wed, 30 Jun 2021 16:48:34 +0300 Subject: [PATCH 01/17] fix api 500 and redirect to login if not authenticated when accessing /settings/team --- pages/api/teams.ts | 4 ++-- pages/settings/teams.tsx | 30 ++++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/pages/api/teams.ts b/pages/api/teams.ts index 1ab69adb..ef900fbe 100644 --- a/pages/api/teams.ts +++ b/pages/api/teams.ts @@ -30,8 +30,8 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) } }); - return res.status(201).setHeader('Location', process.env.BASE_URL + '/api/teams/1').send(null); + return res.status(201).json({ message: 'Team created' }); } - res.status(404).send(null); + res.status(404).json({ message: 'Team not found' }); } diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index e4d1dc5f..12719250 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -1,3 +1,4 @@ +import { GetServerSideProps } from "next"; import Head from 'next/head'; import prisma from '../../lib/prisma'; import Modal from '../../components/Modal'; @@ -18,14 +19,16 @@ export default function Teams(props) { const [invites, setInvites] = useState([]); const [showCreateTeamModal, setShowCreateTeamModal] = useState(false); - const loadTeams = () => fetch('/api/user/membership').then((res: any) => res.json()).then( + const loadData = () => fetch('/api/user/membership').then((res: any) => res.json()).then( (data) => { - setTeams(data.membership.filter((m) => m.role !== "INVITEE")); - setInvites(data.membership.filter((m) => m.role === "INVITEE")); + setTeams(data.membership && data.membership.filter((m) => m.role !== "INVITEE")); + setInvites(data.membership && data.membership.filter((m) => m.role === "INVITEE")); } ); - useEffect(() => { loadTeams(); }, []); + useEffect(() => { + loadData(); + }, []); if (loading) { return

Loading...

; @@ -40,7 +43,7 @@ export default function Teams(props) { 'Content-Type': 'application/json' } }).then(() => { - loadTeams(); + loadData(); setShowCreateTeamModal(false); }); } @@ -86,14 +89,14 @@ export default function Teams(props) {
{!!teams.length && - + } {!!invites.length &&

Open Invitations

    - {invites.map((team) => )} + {invites.map((team) => )}
}
@@ -153,4 +156,15 @@ export default function Teams(props) { ); -} \ No newline at end of file +} + +export const getServerSideProps: GetServerSideProps = async (context) => { + const session = await getSession(context); + if (!session) { + return { redirect: { permanent: false, destination: "/auth/login" } }; + } + + return { + props: { }, // will be passed to the page component as props + }; +}; From 8b00475b274f82d6964fa2af027777d5d23589a5 Mon Sep 17 00:00:00 2001 From: mihaic195 Date: Wed, 30 Jun 2021 16:52:18 +0300 Subject: [PATCH 02/17] remove unnecessary guard --- pages/settings/teams.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index 12719250..5ad5db34 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -21,8 +21,8 @@ export default function Teams(props) { const loadData = () => fetch('/api/user/membership').then((res: any) => res.json()).then( (data) => { - setTeams(data.membership && data.membership.filter((m) => m.role !== "INVITEE")); - setInvites(data.membership && data.membership.filter((m) => m.role === "INVITEE")); + setTeams(data.membership.filter((m) => m.role !== "INVITEE")); + setInvites(data.membership.filter((m) => m.role === "INVITEE")); } ); From 1122def2c05de9520521f0f356e0b24ccd404301 Mon Sep 17 00:00:00 2001 From: mihaic195 Date: Thu, 1 Jul 2021 11:47:27 +0300 Subject: [PATCH 03/17] update fetch to also handle errors --- pages/settings/teams.tsx | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index 5ad5db34..ca6b21c9 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -1,30 +1,37 @@ -import { GetServerSideProps } from "next"; import Head from 'next/head'; -import prisma from '../../lib/prisma'; -import Modal from '../../components/Modal'; import Shell from '../../components/Shell'; import SettingsShell from '../../components/Settings'; import { useEffect, useState } from 'react'; -import { useSession, getSession } from 'next-auth/client'; +import { useSession } from 'next-auth/client'; import { UsersIcon, } from "@heroicons/react/outline"; import TeamList from "../../components/team/TeamList"; import TeamListItem from "../../components/team/TeamListItem"; -export default function Teams(props) { - +export default function Teams() { const [session, loading] = useSession(); const [teams, setTeams] = useState([]); const [invites, setInvites] = useState([]); const [showCreateTeamModal, setShowCreateTeamModal] = useState(false); - const loadData = () => fetch('/api/user/membership').then((res: any) => res.json()).then( - (data) => { + const handleErrors = async (resp) => { + if (!resp.ok) { + const err = await resp.json(); + throw new Error(err.message); + } + return resp.json(); + } + + const loadData = () => { + fetch('/api/user/membership') + .then(handleErrors) + .then((data) => { setTeams(data.membership.filter((m) => m.role !== "INVITEE")); setInvites(data.membership.filter((m) => m.role === "INVITEE")); - } - ); + }) + .catch(console.log); + } useEffect(() => { loadData(); @@ -36,6 +43,7 @@ export default function Teams(props) { const createTeam = (e) => { e.preventDefault(); + return fetch('/api/teams', { method: 'POST', body: JSON.stringify({ name: e.target.elements['name'].value }), @@ -157,14 +165,3 @@ export default function Teams(props) { ); } - -export const getServerSideProps: GetServerSideProps = async (context) => { - const session = await getSession(context); - if (!session) { - return { redirect: { permanent: false, destination: "/auth/login" } }; - } - - return { - props: { }, // will be passed to the page component as props - }; -}; From b91d021fc88a3ff5e4a5ac7c1103db4d29a5f01a Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:29:55 +0300 Subject: [PATCH 04/17] Update pages/api/teams.ts Co-authored-by: Bailey Pumfleet --- pages/api/teams.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/api/teams.ts b/pages/api/teams.ts index ef900fbe..e632966e 100644 --- a/pages/api/teams.ts +++ b/pages/api/teams.ts @@ -33,5 +33,5 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) return res.status(201).json({ message: 'Team created' }); } - res.status(404).json({ message: 'Team not found' }); + res.status(404).json({ message: "Team not found" }); } From 769f36f8d5a2871a73f54aa1bbb441ff85963529 Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:30:10 +0300 Subject: [PATCH 05/17] Update pages/settings/teams.tsx Co-authored-by: Bailey Pumfleet --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index ca6b21c9..36b57984 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -24,7 +24,7 @@ export default function Teams() { } const loadData = () => { - fetch('/api/user/membership') + fetch("/api/user/membership") .then(handleErrors) .then((data) => { setTeams(data.membership.filter((m) => m.role !== "INVITEE")); From b71cc82a0ef9def80ad6615187666ab711de95d4 Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:30:20 +0300 Subject: [PATCH 06/17] Update pages/settings/teams.tsx Co-authored-by: Bailey Pumfleet --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index 36b57984..b0df7e31 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -26,7 +26,7 @@ export default function Teams() { const loadData = () => { fetch("/api/user/membership") .then(handleErrors) - .then((data) => { + .then((data) => { setTeams(data.membership.filter((m) => m.role !== "INVITEE")); setInvites(data.membership.filter((m) => m.role === "INVITEE")); }) From 0fb29841386363ad8570c7ad0a209111eb1707f7 Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:30:31 +0300 Subject: [PATCH 07/17] Update pages/settings/teams.tsx Co-authored-by: Bailey Pumfleet --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index b0df7e31..90e33d72 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -30,7 +30,7 @@ export default function Teams() { setTeams(data.membership.filter((m) => m.role !== "INVITEE")); setInvites(data.membership.filter((m) => m.role === "INVITEE")); }) - .catch(console.log); + .catch(console.log); } useEffect(() => { From 4a1e8cfbf77ce74bd1fc515726ac221d22e75ec2 Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:30:40 +0300 Subject: [PATCH 08/17] Update pages/settings/teams.tsx Co-authored-by: Bailey Pumfleet --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index 90e33d72..c50e937b 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -2,7 +2,7 @@ import Head from 'next/head'; import Shell from '../../components/Shell'; import SettingsShell from '../../components/Settings'; import { useEffect, useState } from 'react'; -import { useSession } from 'next-auth/client'; +import { useSession } from "next-auth/client"; import { UsersIcon, } from "@heroicons/react/outline"; From 9eff620ee0941e7d0ed279751f79f8406d5ba357 Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:30:51 +0300 Subject: [PATCH 09/17] Update pages/settings/teams.tsx Co-authored-by: Bailey Pumfleet --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index c50e937b..da622abe 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -29,7 +29,7 @@ export default function Teams() { .then((data) => { setTeams(data.membership.filter((m) => m.role !== "INVITEE")); setInvites(data.membership.filter((m) => m.role === "INVITEE")); - }) + }) .catch(console.log); } From 715033f4e1510be4d7b3c49c458ff63145f5a169 Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:31:40 +0300 Subject: [PATCH 10/17] Update pages/settings/teams.tsx Co-authored-by: Bailey Pumfleet --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index da622abe..ee026f06 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -104,7 +104,7 @@ export default function Teams() { {!!invites.length &&

Open Invitations

    - {invites.map((team) => )} + {invites.map((team) => (
} From 6463b3ba37c3493dc0d0c67333b426f7465a1862 Mon Sep 17 00:00:00 2001 From: mihaic195 Date: Thu, 1 Jul 2021 12:47:12 +0300 Subject: [PATCH 11/17] fix codacy suggestions --- pages/api/teams.ts | 4 ++-- pages/settings/teams.tsx | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pages/api/teams.ts b/pages/api/teams.ts index e632966e..1c1254fb 100644 --- a/pages/api/teams.ts +++ b/pages/api/teams.ts @@ -21,7 +21,7 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) }, }); - const createMembership = await prisma.membership.create({ + await prisma.membership.create({ data: { teamId: createTeam.id, userId: session.user.id, @@ -33,5 +33,5 @@ export default async function handler(req: NextApiRequest, res: NextApiResponse) return res.status(201).json({ message: 'Team created' }); } - res.status(404).json({ message: "Team not found" }); + res.status(404).json({ message: 'Team not found' }); } diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index ee026f06..dc70c3da 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -2,7 +2,7 @@ import Head from 'next/head'; import Shell from '../../components/Shell'; import SettingsShell from '../../components/Settings'; import { useEffect, useState } from 'react'; -import { useSession } from "next-auth/client"; +import { useSession } from 'next-auth/client'; import { UsersIcon, } from "@heroicons/react/outline"; @@ -26,11 +26,11 @@ export default function Teams() { const loadData = () => { fetch("/api/user/membership") .then(handleErrors) - .then((data) => { + .then((data) => { setTeams(data.membership.filter((m) => m.role !== "INVITEE")); setInvites(data.membership.filter((m) => m.role === "INVITEE")); - }) - .catch(console.log); + }) + .catch(console.log); } useEffect(() => { @@ -104,7 +104,7 @@ export default function Teams() { {!!invites.length &&

Open Invitations

    - {invites.map((team) => ( + {invites.map((team) => )}
} From 6f64df3e75f3446d3d6cefbb635c631d19d39d50 Mon Sep 17 00:00:00 2001 From: mihaic195 Date: Thu, 1 Jul 2021 12:51:51 +0300 Subject: [PATCH 12/17] lint --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index dc70c3da..36b57984 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -104,7 +104,7 @@ export default function Teams() { {!!invites.length &&

Open Invitations

    - {invites.map((team) => )} + {invites.map((team) => )}
} From 2008ad263ce1c1f7d32409a069545f300ffa3334 Mon Sep 17 00:00:00 2001 From: mihaic195 Date: Fri, 2 Jul 2021 13:28:33 +0300 Subject: [PATCH 13/17] fix: ssr session on teams page --- pages/_app.tsx | 3 ++- pages/settings/teams.tsx | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pages/_app.tsx b/pages/_app.tsx index e2964dde..8b0b9009 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,8 +1,9 @@ import '../styles/globals.css'; import {createTelemetryClient, TelemetryProvider} from '../lib/telemetry'; import { Provider } from 'next-auth/client'; +import type { AppProps } from "next/app" -function MyApp({ Component, pageProps }) { +function MyApp({ Component, pageProps }: AppProps) { return ( diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index 36b57984..21df9f4d 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -1,8 +1,10 @@ +import { GetServerSideProps } from "next" import Head from 'next/head'; import Shell from '../../components/Shell'; import SettingsShell from '../../components/Settings'; import { useEffect, useState } from 'react'; -import { useSession } from 'next-auth/client'; +import type { Session } from "next-auth" +import { useSession, getSession } from 'next-auth/client'; import { UsersIcon, } from "@heroicons/react/outline"; @@ -165,3 +167,15 @@ export default function Teams() { ); } + +// Export the `session` prop to use sessions with Server Side Rendering +export const getServerSideProps: GetServerSideProps<{session: Session | null}> = async (context) => { + const session = await getSession(context); + if (!session) { + return { redirect: { permanent: false, destination: '/auth/login' } }; + } + + return { + props: { session } + } +} From 8500a8dd64e1ab5daa6ff7413ad7451a8e91d4a9 Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Fri, 2 Jul 2021 13:31:59 +0300 Subject: [PATCH 14/17] Update pages/settings/teams.tsx Co-authored-by: Bailey Pumfleet --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index 21df9f4d..e0b9ae57 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -3,7 +3,7 @@ import Head from 'next/head'; import Shell from '../../components/Shell'; import SettingsShell from '../../components/Settings'; import { useEffect, useState } from 'react'; -import type { Session } from "next-auth" +import type { Session } from "next-auth"; import { useSession, getSession } from 'next-auth/client'; import { UsersIcon, From 2af9ed55a7a45acb92ca4e872169ab52289091ce Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Fri, 2 Jul 2021 13:32:11 +0300 Subject: [PATCH 15/17] Update pages/settings/teams.tsx Co-authored-by: Bailey Pumfleet --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index e0b9ae57..74132d38 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -1,4 +1,4 @@ -import { GetServerSideProps } from "next" +import { GetServerSideProps } from "next"; import Head from 'next/head'; import Shell from '../../components/Shell'; import SettingsShell from '../../components/Settings'; From b15ef1d8b09e75da3ecdde6a2b11d311a229b806 Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Fri, 2 Jul 2021 13:32:27 +0300 Subject: [PATCH 16/17] Update pages/settings/teams.tsx Co-authored-by: Bailey Pumfleet --- pages/settings/teams.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/settings/teams.tsx b/pages/settings/teams.tsx index 74132d38..d74c8ddd 100644 --- a/pages/settings/teams.tsx +++ b/pages/settings/teams.tsx @@ -169,7 +169,7 @@ export default function Teams() { } // Export the `session` prop to use sessions with Server Side Rendering -export const getServerSideProps: GetServerSideProps<{session: Session | null}> = async (context) => { +export const getServerSideProps: GetServerSideProps<{ session: Session | null }> = async (context) => { const session = await getSession(context); if (!session) { return { redirect: { permanent: false, destination: '/auth/login' } }; From dcf274456674c7e6ab7efd14c50e1a7a9b17e0b6 Mon Sep 17 00:00:00 2001 From: Mihai C <34626017+mihaic195@users.noreply.github.com> Date: Fri, 2 Jul 2021 13:32:45 +0300 Subject: [PATCH 17/17] Update pages/_app.tsx Co-authored-by: Bailey Pumfleet --- pages/_app.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/_app.tsx b/pages/_app.tsx index 8b0b9009..f521f293 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -1,7 +1,7 @@ import '../styles/globals.css'; import {createTelemetryClient, TelemetryProvider} from '../lib/telemetry'; import { Provider } from 'next-auth/client'; -import type { AppProps } from "next/app" +import type { AppProps } from "next/app"; function MyApp({ Component, pageProps }: AppProps) { return (