feat(wizard): add real-time bi-directional sync, debounced auto-save, and bot draft prefill

This commit is contained in:
2026-09-21 20:22:12 +03:30
parent 6ee0822a96
commit 4cfb9ec6f6
5 changed files with 334 additions and 16 deletions
+12 -5
View File
@@ -1,5 +1,5 @@
import { useEffect, useMemo, useState } from "react";
import { useNavigate } from "react-router-dom";
import { useNavigate, useSearchParams } from "react-router-dom";
import { toast } from "sonner";
import { ClipboardList, Eye, EyeOff, Loader2, Lock, ShieldCheck, Wrench, X } from "lucide-react";
import { api, apiV26 } from "../../lib/api";
@@ -33,6 +33,8 @@ export function LoginPage() {
const setUser = useAuthStore((s) => s.setUser);
const setDevUser = useAuthStore((s) => s.setDevUser);
const navigate = useNavigate();
const [params] = useSearchParams();
const returnUrl = params.get("returnUrl");
// ---- فرم اصلی (Casdoor) ----
const [username, setUsername] = useState("");
@@ -83,8 +85,12 @@ export function LoginPage() {
identifyUser({ id: user.id, name: user.display_name, role: user.role });
track("login_success", { role: user.role });
toast.success(`خوش آمدید، ${user.display_name}`);
// مدیر پروژه → پنل انبار؛ مدیر تدارکات/ادمین → دفتر پیشنهادهای خرید
navigate(user.role === "pm" ? "/inventory" : "/");
if (returnUrl) {
navigate(decodeURIComponent(returnUrl));
} else {
// مدیر پروژه → پنل انبار؛ مدیر تدارکات/ادمین → دفتر پیشنهادهای خرید
navigate(user.role === "pm" ? "/inventory" : "/");
}
} catch (err) {
toast.error(err instanceof Error ? err.message : "خطا در ورود");
} finally {
@@ -125,8 +131,9 @@ export function LoginPage() {
}
setDevUser(devRole, devRole === "pm" ? devProjectId : null, devRole === "pm" ? devProject?.name || null : null);
toast.success(`ورود آزمایشی انجام شد — نقش: ${DEV_ROLE_LABELS[devRole]}`);
// ادمین → پنل مدیریت ادمین؛ مدیر تدارکات → دفتر؛ مدیر پروژه → پنل انبار
if (devRole === "admin") navigate("/admin");
if (returnUrl) {
navigate(decodeURIComponent(returnUrl));
} else if (devRole === "admin") navigate("/admin");
else if (devRole === "pm") navigate("/inventory");
else navigate("/");
};