diff --git a/src/components/dashboard/ProfileWidget.tsx b/src/components/dashboard/ProfileWidget.tsx index fc94800..42b38e4 100644 --- a/src/components/dashboard/ProfileWidget.tsx +++ b/src/components/dashboard/ProfileWidget.tsx @@ -1,5 +1,4 @@ import { createSignal, createResource, Show, onMount } from 'solid-js'; -import { fetchWithAuth } from '~/lib/http'; export default function ProfileWidget(props: { roleKey: string }) { const [loading, setLoading] = createSignal(false); @@ -10,7 +9,7 @@ export default function ProfileWidget(props: { roleKey: string }) { const [formData, setFormData] = createSignal>({}); const fetchProfile = async (roleKey: string) => { - const res = await fetchWithAuth(`/api/users/profile/get?roleKey=${roleKey}`); + const res = await fetch(`/api/users/profile/get?roleKey=${roleKey}`); if (!res.ok) throw new Error('Failed to load profile'); const payload = await res.json(); if (payload.data) { @@ -32,7 +31,7 @@ export default function ProfileWidget(props: { roleKey: string }) { setSuccess(false); try { - const res = await fetchWithAuth(`/api/users/profile/update?roleKey=${props.roleKey}`, { + const res = await fetch(`/api/users/profile/update?roleKey=${props.roleKey}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(formData()) diff --git a/src/lib/http.ts b/src/lib/http.ts index b65b140..73ca544 100644 --- a/src/lib/http.ts +++ b/src/lib/http.ts @@ -33,67 +33,3 @@ export function getServiceUrlForRole(roleKey: string | null | undefined): string } } -export function getAccessToken(): string | null { - if (typeof window === 'undefined') return null; - return window.localStorage.getItem('access_token'); -} - -export function setTokens(accessToken: string, refreshToken: string) { - if (typeof window === 'undefined') return; - window.localStorage.setItem('access_token', accessToken); - window.localStorage.setItem('refresh_token', refreshToken); -} - -export function clearTokens() { - if (typeof window === 'undefined') return; - window.localStorage.removeItem('access_token'); - window.localStorage.removeItem('refresh_token'); -} - -/** - * An HTTP client that automatically adds Bearer tokens and handles - * 401 Unauthorized errors by attempting token refresh. - */ -export async function fetchWithAuth(url: string, options: RequestInit = {}): Promise { - const token = getAccessToken(); - const headers = new Headers(options.headers || {}); - - if (token) { - headers.set('Authorization', `Bearer ${token}`); - } - - // 1. Make Original Request - let response = await fetch(url, { ...options, headers }); - - // 2. Refresh Token on 401 - if (response.status === 401) { - if (typeof window === 'undefined') return response; - const refreshToken = window.localStorage.getItem('refresh_token'); - - if (refreshToken) { - try { - const refreshRes = await fetch(`${RUST_API_URL}/api/auth/refresh`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ refresh_token: refreshToken }) - }); - - if (refreshRes.ok) { - const payload = await refreshRes.json(); - setTokens(payload.access_token, payload.refresh_token); - - // Retry Original Request - headers.set('Authorization', `Bearer ${payload.access_token}`); - response = await fetch(url, { ...options, headers }); - } else { - // Refresh Failed -> Session expired - clearTokens(); - } - } catch (err) { - clearTokens(); - } - } - } - - return response; -} diff --git a/src/routes/auth/verification/index.tsx b/src/routes/auth/verification/index.tsx index f49c8b7..0225240 100644 --- a/src/routes/auth/verification/index.tsx +++ b/src/routes/auth/verification/index.tsx @@ -1,7 +1,7 @@ import { A, useNavigate, useSearchParams } from '@solidjs/router'; import { createMemo, createSignal, For, onMount } from 'solid-js'; import { intentToOnboardingPath, normalizeIntent, readCanonicalIntent, saveCanonicalIntent } from '~/lib/auth-intent'; -import { setTokens } from '~/lib/http'; +import { login } from '~/lib/auth'; import PublicBackground from '~/components/PublicBackground'; const OTP_LENGTH = 6; @@ -124,25 +124,7 @@ export default function VerificationPage() { try { // Auto login after successful backend OTP verification - const loginResponse = await fetch('/api/users/auth/login', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - credentials: 'include', - body: JSON.stringify({ email: pending.email, password: pending.password }), - }); - const loginPayload = await loginResponse.json().catch(() => ({})); - - if (!loginResponse.ok || !loginPayload?.success) { - const loginError = getApiErrorMessage(loginPayload); - setError(loginError || 'Email verified and account created. Please sign in to continue.'); - setLoading(false); - return; - } - - // Save tokens using our utility - if (loginPayload.access_token && loginPayload.refresh_token) { - setTokens(loginPayload.access_token, loginPayload.refresh_token); - } + await login(pending.email, pending.password); window.localStorage.removeItem(PENDING_REGISTER_KEY); window.localStorage.removeItem(DEV_VERIFICATION_CODE_KEY); @@ -150,7 +132,7 @@ export default function VerificationPage() { return; } catch (err: any) { - setError('Login failed: ' + err.message); + setError(err.message || 'Email verified and account created. Please sign in to continue.'); setLoading(false); return; } diff --git a/src/routes/companies/applications.tsx b/src/routes/companies/applications.tsx deleted file mode 100644 index 25dc328..0000000 --- a/src/routes/companies/applications.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function CompaniesApplicationsAlias() { - return ; -} diff --git a/src/routes/companies/feedback.tsx b/src/routes/companies/feedback.tsx deleted file mode 100644 index 7bbedd5..0000000 --- a/src/routes/companies/feedback.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function CompaniesFeedbackAlias() { - return ; -} diff --git a/src/routes/companies/job-postings.tsx b/src/routes/companies/job-postings.tsx deleted file mode 100644 index 3bd6aac..0000000 --- a/src/routes/companies/job-postings.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function CompaniesJobPostingsAlias() { - return ; -} diff --git a/src/routes/companies/support.tsx b/src/routes/companies/support.tsx deleted file mode 100644 index 971f54c..0000000 --- a/src/routes/companies/support.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { useNavigate } from '@solidjs/router'; -import { onMount } from 'solid-js'; - -export default function CompaniesSupportAliasPage() { - const navigate = useNavigate(); - - onMount(() => { - navigate('/support', { replace: true }); - }); - - return

Redirecting to company support...

; -} diff --git a/src/routes/companies/tracecoins.tsx b/src/routes/companies/tracecoins.tsx deleted file mode 100644 index 2a7660c..0000000 --- a/src/routes/companies/tracecoins.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function CompaniesTracecoinsAlias() { - return ; -} diff --git a/src/routes/sign-in.tsx b/src/routes/sign-in.tsx deleted file mode 100644 index 94f8d93..0000000 --- a/src/routes/sign-in.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import LoginPage from '~/routes/auth/login/index'; - -export default function SignInAliasPage() { - return ; -} diff --git a/src/routes/sign-up.tsx b/src/routes/sign-up.tsx deleted file mode 100644 index 90be883..0000000 --- a/src/routes/sign-up.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import RegisterPage from '~/routes/auth/register/index'; - -export default function SignUpAliasPage() { - return ; -} diff --git a/src/routes/signin.tsx b/src/routes/signin.tsx deleted file mode 100644 index 843c9f2..0000000 --- a/src/routes/signin.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import LoginPage from '~/routes/auth/login/index'; - -export default function SigninAliasPage() { - return ; -} diff --git a/src/routes/signup.tsx b/src/routes/signup.tsx deleted file mode 100644 index aaa381d..0000000 --- a/src/routes/signup.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import RegisterPage from '~/routes/auth/register/index'; - -export default function SignupAliasPage() { - return ; -} diff --git a/src/routes/users/dashboard.tsx b/src/routes/users/dashboard.tsx deleted file mode 100644 index b2fcad5..0000000 --- a/src/routes/users/dashboard.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function UsersDashboardAlias() { - return ; -} diff --git a/src/routes/users/leads.tsx b/src/routes/users/leads.tsx deleted file mode 100644 index 1d9149c..0000000 --- a/src/routes/users/leads.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function UsersLeadsAlias() { - return ; -} diff --git a/src/routes/users/notifications.tsx b/src/routes/users/notifications.tsx deleted file mode 100644 index 30157e3..0000000 --- a/src/routes/users/notifications.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function UsersNotificationsAlias() { - return ; -} diff --git a/src/routes/users/onboarding/index.tsx b/src/routes/users/onboarding/index.tsx deleted file mode 100644 index a2ef99d..0000000 --- a/src/routes/users/onboarding/index.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function UsersOnboardingAlias() { - return ; -} diff --git a/src/routes/users/onboarding/jobseeker.tsx b/src/routes/users/onboarding/jobseeker.tsx deleted file mode 100644 index 8f63891..0000000 --- a/src/routes/users/onboarding/jobseeker.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { onMount } from 'solid-js'; -import { useNavigate } from '@solidjs/router'; - -export default function JobSeekerAliasRoute() { - const navigate = useNavigate(); - - onMount(() => { - navigate('/users/onboarding/job-seeker', { replace: true }); - }); - - return null; -} diff --git a/src/routes/users/onboarding/role-selection.tsx b/src/routes/users/onboarding/role-selection.tsx deleted file mode 100644 index 19baefa..0000000 --- a/src/routes/users/onboarding/role-selection.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function UsersRoleSelectionAlias() { - return ; -} diff --git a/src/routes/users/profile.tsx b/src/routes/users/profile.tsx deleted file mode 100644 index cf80bae..0000000 --- a/src/routes/users/profile.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function UsersProfileAlias() { - return ; -} diff --git a/src/routes/users/settings.tsx b/src/routes/users/settings.tsx deleted file mode 100644 index 82b5ba5..0000000 --- a/src/routes/users/settings.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function UsersSettingsAlias() { - return ; -} diff --git a/src/routes/users/support.tsx b/src/routes/users/support.tsx deleted file mode 100644 index 6ec49e3..0000000 --- a/src/routes/users/support.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function UsersSupportAlias() { - return ; -} diff --git a/src/routes/users/verification-status.tsx b/src/routes/users/verification-status.tsx deleted file mode 100644 index f34f172..0000000 --- a/src/routes/users/verification-status.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { Navigate } from '@solidjs/router'; - -export default function UsersVerificationStatusAlias() { - return ; -}