2024-05-08 17:31:20 +00:00
|
|
|
import { FC, ReactNode } from "react";
|
|
|
|
import useSWR from "swr";
|
|
|
|
import { IWorkspaceMemberInvitation } from "@plane/types";
|
|
|
|
// components
|
2024-05-15 16:39:16 +00:00
|
|
|
import { LogoSpinner } from "@/components/common";
|
2024-05-08 17:31:20 +00:00
|
|
|
import { WorkspaceLogo } from "@/components/workspace/logo";
|
|
|
|
// helpers
|
|
|
|
import { EAuthModes, EAuthSteps } from "@/helpers/authentication.helper";
|
|
|
|
// services
|
|
|
|
import { WorkspaceService } from "@/services/workspace.service";
|
|
|
|
|
|
|
|
type TAuthHeader = {
|
|
|
|
workspaceSlug: string | undefined;
|
|
|
|
invitationId: string | undefined;
|
|
|
|
invitationEmail: string | undefined;
|
|
|
|
authMode: EAuthModes;
|
|
|
|
currentAuthStep: EAuthSteps;
|
|
|
|
children: ReactNode;
|
|
|
|
};
|
|
|
|
|
|
|
|
const Titles = {
|
|
|
|
[EAuthModes.SIGN_IN]: {
|
|
|
|
[EAuthSteps.EMAIL]: {
|
|
|
|
header: "Sign in to Plane",
|
|
|
|
subHeader: "Get back to your projects and make progress",
|
|
|
|
},
|
|
|
|
[EAuthSteps.PASSWORD]: {
|
|
|
|
header: "Sign in to Plane",
|
|
|
|
subHeader: "Get back to your projects and make progress",
|
|
|
|
},
|
|
|
|
[EAuthSteps.UNIQUE_CODE]: {
|
|
|
|
header: "Sign in to Plane",
|
|
|
|
subHeader: "Get back to your projects and make progress",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
[EAuthModes.SIGN_UP]: {
|
|
|
|
[EAuthSteps.EMAIL]: {
|
|
|
|
header: "Create your account",
|
|
|
|
subHeader: "Start tracking your projects with Plane",
|
|
|
|
},
|
|
|
|
[EAuthSteps.PASSWORD]: {
|
|
|
|
header: "Create your account",
|
|
|
|
subHeader: "Progress, visualize, and measure work how it works best for you.",
|
|
|
|
},
|
|
|
|
[EAuthSteps.UNIQUE_CODE]: {
|
|
|
|
header: "Create your account",
|
|
|
|
subHeader: "Progress, visualize, and measure work how it works best for you.",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
|
|
|
|
const workSpaceService = new WorkspaceService();
|
|
|
|
|
|
|
|
export const AuthHeader: FC<TAuthHeader> = (props) => {
|
|
|
|
const { workspaceSlug, invitationId, invitationEmail, authMode, currentAuthStep, children } = props;
|
|
|
|
|
|
|
|
const { data: invitation, isLoading } = useSWR(
|
|
|
|
workspaceSlug && invitationId ? `WORKSPACE_INVITATION_${workspaceSlug}_${invitationId}` : null,
|
|
|
|
async () => workspaceSlug && invitationId && workSpaceService.getWorkspaceInvitation(workspaceSlug, invitationId),
|
|
|
|
{
|
|
|
|
revalidateOnFocus: false,
|
|
|
|
shouldRetryOnError: false,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
const getHeaderSubHeader = (
|
|
|
|
step: EAuthSteps,
|
|
|
|
mode: EAuthModes,
|
|
|
|
invitation: IWorkspaceMemberInvitation | undefined,
|
|
|
|
email: string | undefined
|
|
|
|
) => {
|
|
|
|
if (invitation && email && invitation.email === email && invitation.workspace) {
|
|
|
|
const workspace = invitation.workspace;
|
|
|
|
return {
|
|
|
|
header: (
|
|
|
|
<div className="relative inline-flex items-center gap-2">
|
|
|
|
Join <WorkspaceLogo logo={workspace?.logo} name={workspace?.name} classNames="w-8 h-9 flex-shrink-0" />{" "}
|
|
|
|
{workspace.name}
|
|
|
|
</div>
|
|
|
|
),
|
|
|
|
subHeader: `${
|
|
|
|
mode == EAuthModes.SIGN_UP ? "Create an account" : "Sign in"
|
|
|
|
} to start managing work with your team.`,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return Titles[mode][step];
|
|
|
|
};
|
|
|
|
|
|
|
|
const { header, subHeader } = getHeaderSubHeader(currentAuthStep, authMode, invitation || undefined, invitationEmail);
|
|
|
|
|
|
|
|
if (isLoading)
|
|
|
|
return (
|
|
|
|
<div className="flex h-full w-full items-center justify-center">
|
2024-05-15 16:39:16 +00:00
|
|
|
<LogoSpinner />
|
2024-05-08 17:31:20 +00:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<>
|
|
|
|
<div className="space-y-1 text-center">
|
|
|
|
<h3 className="text-3xl font-bold text-onboarding-text-100">{header}</h3>
|
|
|
|
<p className="font-medium text-onboarding-text-400">{subHeader}</p>
|
|
|
|
</div>
|
|
|
|
{children}
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
};
|