3959 create a activationstatus in coreworkspace and use it in front to redirect properly (#3989)

* Add computed field to workspace entity

* Add activationStatus to front requests

* Update Selector

* Use activation status

* Stop using selector for mock values

* Remove isCurrentWorkspaceActiveSelector

* Use activation status

* Fix typo

* Use activation status

* Create hook for sign in up navigate

* Update hook to handle profile creation

* Use varaible

* Use more readable boolean function
This commit is contained in:
martmull
2024-02-16 16:00:39 +01:00
committed by GitHub
parent 03a1d3aa75
commit 0ee512a983
26 changed files with 165 additions and 105 deletions

View File

@ -0,0 +1,44 @@
import { useCallback } from 'react';
import { useNavigate } from 'react-router-dom';
import { useRecoilValue } from 'recoil';
import { CurrentWorkspace } from '@/auth/states/currentWorkspaceState.ts';
import { billingState } from '@/client-config/states/billingState.ts';
import { AppPath } from '@/types/AppPath.ts';
import { WorkspaceMember } from '~/generated/graphql.tsx';
export const useNavigateAfterSignInUp = () => {
const navigate = useNavigate();
const billing = useRecoilValue(billingState);
const navigateAfterSignInUp = useCallback(
(
currentWorkspace: CurrentWorkspace,
currentWorkspaceMember: WorkspaceMember | null,
) => {
if (
billing?.isBillingEnabled &&
currentWorkspace.subscriptionStatus !== 'active'
) {
navigate(AppPath.PlanRequired);
return;
}
if (currentWorkspace.activationStatus !== 'active') {
navigate(AppPath.CreateWorkspace);
return;
}
if (
!currentWorkspaceMember?.name.firstName ||
!currentWorkspaceMember?.name.lastName
) {
navigate(AppPath.CreateProfile);
return;
}
navigate(AppPath.Index);
},
[billing, navigate],
);
return { navigateAfterSignInUp };
};

View File

@ -1,10 +1,9 @@
import { useCallback, useState } from 'react';
import { SubmitHandler, UseFormReturn } from 'react-hook-form';
import { useNavigate, useParams } from 'react-router-dom';
import { useRecoilValue } from 'recoil';
import { useParams } from 'react-router-dom';
import { useNavigateAfterSignInUp } from '@/auth/sign-in-up/hooks/useNavigateAfterSignInUp.ts';
import { Form } from '@/auth/sign-in-up/hooks/useSignInUpForm.ts';
import { billingState } from '@/client-config/states/billingState';
import { AppPath } from '@/types/AppPath';
import { PageHotkeyScope } from '@/types/PageHotkeyScope';
import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar';
@ -26,14 +25,18 @@ export enum SignInUpStep {
}
export const useSignInUp = (form: UseFormReturn<Form>) => {
const navigate = useNavigate();
const { enqueueSnackBar } = useSnackBar();
const isMatchingLocation = useIsMatchingLocation();
const billing = useRecoilValue(billingState);
const workspaceInviteHash = useParams().workspaceInviteHash;
const { navigateAfterSignInUp } = useNavigateAfterSignInUp();
const [signInUpStep, setSignInUpStep] = useState<SignInUpStep>(
SignInUpStep.Init,
);
const [signInUpMode, setSignInUpMode] = useState<SignInUpMode>(() => {
if (isMatchingLocation(AppPath.Invite)) {
return SignInUpMode.Invite;
@ -43,6 +46,7 @@ export const useSignInUp = (form: UseFormReturn<Form>) => {
? SignInUpMode.SignIn
: SignInUpMode.SignUp;
});
const {
signInWithCredentials,
signUpWithCredentials,
@ -84,7 +88,10 @@ export const useSignInUp = (form: UseFormReturn<Form>) => {
throw new Error('Email and password are required');
}
const { workspace: currentWorkspace } =
const {
workspace: currentWorkspace,
workspaceMember: currentWorkspaceMember,
} =
signInUpMode === SignInUpMode.SignIn
? await signInWithCredentials(
data.email.toLowerCase().trim(),
@ -96,19 +103,7 @@ export const useSignInUp = (form: UseFormReturn<Form>) => {
workspaceInviteHash,
);
if (
billing?.isBillingEnabled &&
currentWorkspace.subscriptionStatus !== 'active'
) {
navigate(AppPath.PlanRequired);
return;
}
if (currentWorkspace.displayName) {
navigate(AppPath.Index);
return;
}
navigate(AppPath.CreateWorkspace);
navigateAfterSignInUp(currentWorkspace, currentWorkspaceMember);
} catch (err: any) {
enqueueSnackBar(err?.message, {
variant: 'error',
@ -120,8 +115,7 @@ export const useSignInUp = (form: UseFormReturn<Form>) => {
signInWithCredentials,
signUpWithCredentials,
workspaceInviteHash,
billing?.isBillingEnabled,
navigate,
navigateAfterSignInUp,
enqueueSnackBar,
],
);

View File

@ -11,6 +11,7 @@ export type CurrentWorkspace = Pick<
| 'allowImpersonation'
| 'featureFlags'
| 'subscriptionStatus'
| 'activationStatus'
>;
export const currentWorkspaceState = atom<CurrentWorkspace | null>({

View File

@ -1,11 +0,0 @@
import { selector } from 'recoil';
import { currentWorkspaceMemberState } from '@/auth/states/currentWorkspaceMemberState';
export const isCurrentWorkspaceActiveSelector = selector({
key: 'isCurrentWorkspaceActiveSelector',
get: ({ get }) => {
const currentWorkspaceMember = get(currentWorkspaceMemberState);
return !!currentWorkspaceMember;
},
});

View File

@ -39,13 +39,13 @@ export const getOnboardingStatus = ({
return OnboardingStatus.Canceled;
}
if (!currentWorkspaceMember) {
if (currentWorkspace?.activationStatus !== 'active') {
return OnboardingStatus.OngoingWorkspaceActivation;
}
if (
!currentWorkspaceMember.name.firstName ||
!currentWorkspaceMember.name.lastName
!currentWorkspaceMember?.name.firstName ||
!currentWorkspaceMember?.name.lastName
) {
return OnboardingStatus.OngoingProfileCreation;
}