feat: implement profile completion flow and guard commit

This commit is contained in:
mengstabketemaw
2026-06-26 15:27:13 +03:00
parent d7420d2de6
commit 08ade42157
9 changed files with 106 additions and 46 deletions

View File

@@ -28,6 +28,7 @@ import { AuthShell } from '../components/AuthShell';
import { loginSuccess, setUser } from '../store/auth.slice';
import type { LoginPayload, AuthUser } from '../types/auth.types';
import { useAuthConfig } from '../AuthConfig';
import { authStorage } from '../utils/auth-storage';
const schema = z.object({
email: z.string().email({ message: 'Enter a valid email' }),
@@ -76,12 +77,14 @@ export function LoginPage() {
url: '/profiles?take=10000&skip=0',
method: 'GET',
}).unwrap();
const hasProfile = profiles.items?.some((p) => p.userId === me.id);
const userProfile = profiles.items?.find((p) => p.userId === me.id);
if (!hasProfile) {
if (!userProfile) {
navigate('/profile-setup');
return;
}
authStorage.setProfileId(userProfile.id);
} catch {
// profile check failed — proceed to dashboard anyway
}

View File

@@ -37,10 +37,11 @@ export function OTPVerificationPage() {
const location = useLocation();
const { loginRedirectPath } = useAuthConfig();
const state = location.state as
| { email?: string; phoneNumber?: string }
| { email?: string; phoneNumber?: string; needsProfile?: boolean }
| null;
const email = state?.email ?? '';
const phoneNumber = state?.phoneNumber ?? '';
const needsProfile = state?.needsProfile ?? false;
const [verifyTrigger, { isLoading: loading }] = useApiMutation();
const [resendTrigger, { isLoading: resending }] = useApiMutation();
@@ -70,7 +71,7 @@ export function OTPVerificationPage() {
}).unwrap();
notify.success('Phone number verified successfully');
navigate(loginRedirectPath);
navigate(needsProfile ? '/profile-setup' : loginRedirectPath);
} catch (err) {
const msg = err instanceof Error ? err.message : 'Something went wrong';
notify.error(msg);

View File

@@ -27,7 +27,8 @@ import { useDispatch } from 'react-redux';
import { useApiMutation } from '@ema-platform/api';
import { notify } from '@ema-platform/ui';
import { AuthShell } from '../components/AuthShell';
import { loginSuccess } from '../store/auth.slice';
import { loginSuccess, setUser } from '../store/auth.slice';
import type { AuthUser } from '../types/auth.types';
import { useAuthConfig } from '../AuthConfig';
const schema = z
@@ -71,6 +72,7 @@ export function SignupPage() {
refreshToken: string;
isPhoneNumberVerified: boolean;
}>();
const [meTrigger] = useApiMutation<AuthUser>();
const {
register,
@@ -107,11 +109,18 @@ export function SignupPage() {
}),
);
const me = await meTrigger({ url: '/auth/me', method: 'GET' }).unwrap();
dispatch(setUser(me));
if (data.isPhoneNumberVerified) {
navigate(loginRedirectPath);
navigate('/profile-setup');
} else {
navigate('/otp-verify', {
state: { email: values.email, phoneNumber: values.phoneNumber },
state: {
email: values.email,
phoneNumber: values.phoneNumber,
needsProfile: true,
},
});
}
} catch (err) {