From 22d8178c88fb8430c91c0528a4c736e3a7b8ca37 Mon Sep 17 00:00:00 2001 From: Daniel Date: Sun, 21 May 2023 13:24:42 +0330 Subject: [PATCH] fixed session bug --- components/Modal/UserSettings.tsx | 22 ++++++++++++++++------ pages/api/auth/[...nextauth].ts | 9 +++++++++ pages/api/routes/users/index.ts | 5 ----- store/account.ts | 5 +++-- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/components/Modal/UserSettings.tsx b/components/Modal/UserSettings.tsx index a7310ab..077e9c4 100644 --- a/components/Modal/UserSettings.tsx +++ b/components/Modal/UserSettings.tsx @@ -9,12 +9,14 @@ import { faCircleUser, faClose } from "@fortawesome/free-solid-svg-icons"; import Checkbox from "../Checkbox"; import useAccountStore from "@/store/account"; import { AccountSettings } from "@/types/global"; +import { useSession } from "next-auth/react"; type Props = { toggleSettingsModal: Function; }; export default function UserSettings({ toggleSettingsModal }: Props) { + const { update } = useSession(); const { account, updateAccount } = useAccountStore(); let initialUser = { @@ -37,7 +39,7 @@ export default function UserSettings({ toggleSettingsModal }: Props) { }; const submit = async () => { - updateAccount(user); + await updateAccount(user); initialUser = { name: account.name, @@ -45,6 +47,11 @@ export default function UserSettings({ toggleSettingsModal }: Props) { collectionProtection: account.collectionProtection, whitelistedUsers: account.whitelistedUsers, }; + + console.log({ email: user.email, name: user.name }); + + if (user.email !== initialUser.email || user.name !== initialUser.name) + update({ email: user.email, name: user.name }); }; return ( @@ -53,6 +60,13 @@ export default function UserSettings({ toggleSettingsModal }: Props) {

Profile Settings

+ {user.email !== initialUser.email || user.name !== initialUser.name ? ( +

+ Note: The page will be refreshed to apply the changes of "Email" or + "Display Name". +

+ ) : null} +
@@ -67,11 +81,6 @@ export default function UserSettings({ toggleSettingsModal }: Props) {

Email

- {user.email !== initialUser.email ? ( -

- Please log back in if you change the Email. -

- ) : null} diff --git a/pages/api/auth/[...nextauth].ts b/pages/api/auth/[...nextauth].ts index 1b475f5..4fa11f7 100644 --- a/pages/api/auth/[...nextauth].ts +++ b/pages/api/auth/[...nextauth].ts @@ -57,6 +57,15 @@ export const authOptions: AuthOptions = { return session; }, + // Using the `...rest` parameter to be able to narrow down the type based on `trigger` + jwt({ token, trigger, session }) { + if (trigger === "update" && session?.name && session?.email) { + // Note, that `session` can be any arbitrary object, remember to validate it! + token.name = session.name; + token.email = session.email; + } + return token; + }, }, }; diff --git a/pages/api/routes/users/index.ts b/pages/api/routes/users/index.ts index 9ee8bdc..75ca851 100644 --- a/pages/api/routes/users/index.ts +++ b/pages/api/routes/users/index.ts @@ -19,11 +19,6 @@ export default async function (req: NextApiRequest, res: NextApiResponse) { const lookupEmail = req.query.email as string; const isSelf = session.user.email === lookupEmail ? true : false; - // const lookup = - // req.query.email == req.query.id - // ? { id: req.query.id } - // : { email: req.query.email }; - if (req.method === "GET") { const users = await getUsers(lookupEmail, isSelf); return res.status(users.status).json({ response: users.response }); diff --git a/store/account.ts b/store/account.ts index 03f3139..5a0e3bb 100644 --- a/store/account.ts +++ b/store/account.ts @@ -6,12 +6,11 @@ import { create } from "zustand"; import { User } from "@prisma/client"; import { AccountSettings } from "@/types/global"; -import { useSession } from "next-auth/react"; type AccountStore = { account: User; setAccount: (email: string) => void; - updateAccount: (user: AccountSettings) => void; + updateAccount: (user: AccountSettings) => Promise; }; const useAccountStore = create()((set) => ({ @@ -39,6 +38,8 @@ const useAccountStore = create()((set) => ({ console.log(data); if (response.ok) set({ account: data.response }); + + return response.ok; }, }));