diff --git a/src/app/(pages)/dashboard/onboarding/page.tsx b/src/app/(pages)/dashboard/onboarding/page.tsx index 4a7ee94..96ead0b 100644 --- a/src/app/(pages)/dashboard/onboarding/page.tsx +++ b/src/app/(pages)/dashboard/onboarding/page.tsx @@ -1,13 +1,13 @@ "use client"; import { ReactElement } from "react"; -import OnboardingForm from "@/components/dashboard/onboarding/onboarding-form"; +import OnboardingForm from "@/components/dashboard/user/onboarding/onboarding-form"; import { useUserContext } from "@/app/provider/user-provider"; import { UserState } from "@/app/store/user-store"; import { User } from "@/app/types/user/user"; import { hasFlag } from "@/lib/user"; import { UserFlag } from "@/app/types/user/user-flag"; -import CompletedOnboarding from "@/components/dashboard/onboarding/completed-onboarding"; +import CompletedOnboarding from "@/components/dashboard/user/onboarding/completed-onboarding"; const OnboardingPage = (): ReactElement => { const user: User | undefined = useUserContext( diff --git a/src/app/provider/user-provider.tsx b/src/app/provider/user-provider.tsx index 6bdd4e5..01d927d 100644 --- a/src/app/provider/user-provider.tsx +++ b/src/app/provider/user-provider.tsx @@ -23,6 +23,7 @@ import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.share import DashboardLoader from "@/components/dashboard/loader"; import { hasFlag } from "@/lib/user"; import { UserFlag } from "@/app/types/user/user-flag"; +import EmailVerificationScreen from "@/components/dashboard/user/email-verification-screen"; /** * The provider that will provide user context to children. @@ -33,9 +34,11 @@ import { UserFlag } from "@/app/types/user/user-flag"; const UserProvider = ({ children }: { children: ReactNode }) => { const storeRef = useRef(); const [authorized, setAuthorized] = useState(false); + const [emailVerified, setEmailVerified] = useState(false); const cookies: Cookies = useCookies(); const router: AppRouterInstance = useRouter(); const path: string = usePathname(); + if (!storeRef.current) { storeRef.current = createUserStore(); } @@ -66,6 +69,7 @@ const UserProvider = ({ children }: { children: ReactNode }) => { const user: User = data as User; storeRef.current?.getState().authorize(session, user); setAuthorized(true); + setEmailVerified(hasFlag(user, UserFlag.EMAIL_VERIFIED)); // User has not yet completed onboarding if ( @@ -82,6 +86,13 @@ const UserProvider = ({ children }: { children: ReactNode }) => { return ( + {/*{authorized && emailVerified ? (*/} + {/* children*/} + {/*) : !authorized ? (*/} + {/* */} + {/*) : (*/} + {/* */} + {/*)}*/} {authorized ? children : } ); diff --git a/src/app/types/user/user-flag.ts b/src/app/types/user/user-flag.ts index b48aa38..1ecb128 100644 --- a/src/app/types/user/user-flag.ts +++ b/src/app/types/user/user-flag.ts @@ -5,20 +5,25 @@ export enum UserFlag { /** * The user is disabled. */ - DISABLED = 0, + DISABLED = 1 << 0, + + /** + * The user's email has been verified. + */ + EMAIL_VERIFIED = 1 << 1, /** * The user completed the onboarding process. */ - COMPLETED_ONBOARDING = 1, + COMPLETED_ONBOARDING = 1 << 2, /** * The user has two-factor auth enabled. */ - TFA_ENABLED = 2, + TFA_ENABLED = 1 << 3, /** * The user is an administrator. */ - ADMINISTRATOR = 3, + ADMINISTRATOR = 1 << 4, } diff --git a/src/components/dashboard/user/email-verification-screen.tsx b/src/components/dashboard/user/email-verification-screen.tsx new file mode 100644 index 0000000..54641d5 --- /dev/null +++ b/src/components/dashboard/user/email-verification-screen.tsx @@ -0,0 +1,34 @@ +"use client"; + +import { ReactElement, useState } from "react"; +import { User } from "@/app/types/user/user"; +import { useUserContext } from "@/app/provider/user-provider"; +import { UserState } from "@/app/store/user-store"; + +/** + * The screen to verify your email. + * + * @return the screen jsx + */ +const EmailVerificationScreen = (): ReactElement => { + const user: User | undefined = useUserContext( + (state: UserState) => state.user + ); + const [lastEmailSent, setLastEmailSent] = useState(new Date()); + + return ( +
+ {/* Header */} +
+

Email Verification

+

+ + We have sent your verification code to the email + {" "} + {user?.email} +

+
+
+ ); +}; +export default EmailVerificationScreen; diff --git a/src/components/dashboard/onboarding/completed-onboarding.tsx b/src/components/dashboard/user/onboarding/completed-onboarding.tsx similarity index 100% rename from src/components/dashboard/onboarding/completed-onboarding.tsx rename to src/components/dashboard/user/onboarding/completed-onboarding.tsx diff --git a/src/components/dashboard/onboarding/onboarding-form.tsx b/src/components/dashboard/user/onboarding/onboarding-form.tsx similarity index 100% rename from src/components/dashboard/onboarding/onboarding-form.tsx rename to src/components/dashboard/user/onboarding/onboarding-form.tsx