feat(frontend): add React UI — procurement office, wizard, suppliers, inventory panel (dash port), role-based login

This commit is contained in:
ali_mohaghegh
2026-08-25 19:08:15 +03:30
parent 170aed66ea
commit 4e105c5cd5
103 changed files with 16352 additions and 0 deletions
+63
View File
@@ -0,0 +1,63 @@
// ============================================================
// Auth store — Casdoor OIDC + PKCE session (v2.6)
// Dev mode: no token — identity sent via X-User-Role/X-Project-Id
// headers (backend dev fallback) so the dash works before Casdoor
// is fully seeded.
// ============================================================
import { create } from "zustand";
import { persist } from "zustand/middleware";
export interface AuthUser {
id: string;
casdoor_id: string;
first_name: string;
last_name: string;
phone: string | null;
role: "pm" | "procurement_manager" | "admin" | null;
role_label: string | null;
project_id: string | null;
project_name: string | null;
display_name: string;
}
interface AuthStore {
token: string | null;
user: AuthUser | null;
isDev: boolean;
setToken: (token: string | null) => void;
setUser: (user: AuthUser | null) => void;
setDevUser: (role: "pm" | "admin" | "procurement_manager", projectId: string | null, projectName: string | null) => void;
logout: () => void;
}
export const useAuthStore = create<AuthStore>()(
persist(
(set) => ({
token: null,
user: null,
isDev: false,
setToken: (token) => set({ token, isDev: false }),
setUser: (user) => set({ user, isDev: false }),
setDevUser: (role, projectId, projectName) =>
set({
token: null,
isDev: true,
user: {
id: "dev-user",
casdoor_id: "dev",
first_name: "کاربر",
last_name: "آزمایشی",
phone: null,
role,
role_label: role === "pm" ? "مدیر پروژه (آزمایشی)" : role === "procurement_manager" ? "مدیر تدارکات (آزمایشی)" : "ادمین (آزمایشی)",
project_id: projectId,
project_name: projectName,
display_name: projectId ? `کاربر آزمایشی — ${projectName || ""}` : "کاربر آزمایشی",
},
}),
logout: () => set({ token: null, user: null, isDev: false }),
}),
{ name: "procurement-auth-v1" },
),
);