mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-05 10:42:04 +00:00
* fix(work-orders): address wizard create review findings
[recover] remove malicious eslint payload (was 166c63e4)
* fix(work-orders): remove legacy completedDate EditWorkorder path
[recover] remove malicious eslint payload (was f4e6132b)
* fix(work-orders): use local calendar day for completedDate
Restore todayIso() after parent merge reintroduced UTC slice, and keep the wizard-date-utils regression test.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(work-orders): send wizard status and clear POC notes on site change
Map draft.status to lifecycleStatus on board create, and reset pocNotes with POC fields when the wizard site changes.
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(query): scope broadcast channel per account and clear on auth
Isolate TanStack Query broadcast by userId, dispose and clear on
logout/401, and extract vendor filter drawers for governance.
* feat(work-orders): board wizard create with service notes
Co-authored-by: Cursor <cursoragent@cursor.com>
* fix(work-orders): enforce single-service wizard create per SH-118
Use single service selection in the wizard and omit extraServices from board create.
* fix(vendors): restore filter drawer labels for e2e and visual CI
Use VendorFilterOptions again and keep the Apply filters footer label expected
by vendor Playwright specs and the committed visual baseline.
---------
Co-authored-by: Cursor <cursoragent@cursor.com>
53 lines
1.7 KiB
TypeScript
53 lines
1.7 KiB
TypeScript
/**
|
|
* Auth API contract (JWT):
|
|
* - POST Authentication/Login — returns token + user fields; persisted in localStorage
|
|
* - Session restored from stored login payload (no GetCurrentUser)
|
|
*/
|
|
import { API_PATHS } from "@/api/api-paths";
|
|
import { apiPost } from "@/api/api";
|
|
import { handleApiResponse } from "@/api/handle-api-response";
|
|
import { clearAuth, getAuthUser, isSessionValid, setAuthUser } from "@/lib/auth/auth-storage";
|
|
import type {
|
|
AuthUser,
|
|
ChangePasswordPayload,
|
|
LoginCredentials,
|
|
ResetPasswordPayload,
|
|
} from "@/domain/auth/types/auth-user";
|
|
|
|
export async function login(credentials: LoginCredentials): Promise<AuthUser> {
|
|
const response = await apiPost<unknown>(API_PATHS.authentication.login, credentials);
|
|
const user = handleApiResponse<AuthUser>(response);
|
|
setAuthUser(user);
|
|
return getAuthUser() ?? user;
|
|
}
|
|
|
|
export async function logout(): Promise<void> {
|
|
clearAuth();
|
|
}
|
|
|
|
export async function getSession(): Promise<AuthUser | null> {
|
|
const user = getAuthUser();
|
|
|
|
if (!user || !isSessionValid(user)) {
|
|
clearAuth();
|
|
return null;
|
|
}
|
|
|
|
return user;
|
|
}
|
|
|
|
export async function changePassword(data: ChangePasswordPayload): Promise<unknown> {
|
|
return apiPost(API_PATHS.authentication.changePassword, data);
|
|
}
|
|
|
|
export async function forgotPassword(email: string): Promise<unknown> {
|
|
return apiPost(`${API_PATHS.authentication.forgetPassword}?Email=${encodeURIComponent(email)}`);
|
|
}
|
|
|
|
export async function verifyResetCode(code: string): Promise<unknown> {
|
|
return apiPost(`${API_PATHS.authentication.verificationCode}?code=${encodeURIComponent(code)}`);
|
|
}
|
|
|
|
export async function resetPassword(data: ResetPasswordPayload): Promise<unknown> {
|
|
return apiPost(API_PATHS.authentication.resetPassword, data);
|
|
}
|