// stores/authStore.ts import { defineStore } from "pinia"; import { useStorage } from "@vueuse/core"; export const useAuthStore = defineStore("authStore", () => { // ===== state ===== const user = ref({}); const isAuthenticated = ref(false); const isRealUser = ref(false); const errors = ref(null); // ===== actions ===== function setUser(response: any) { const payload = response?.data ?? {}; // data اصلی از API // userData از payload.user_data و user_id ساخته میشه const userData = { id: payload.user_id ?? null, level: payload.user_level ?? null, token: payload.token ?? null, expire: payload.expire ?? null, refresh_token: payload.refresh_token ?? null, ...payload.user_data, // first_name, last_name, avatar, username }; isAuthenticated.value = true; isRealUser.value = true; user.value = userData; errors.value = null; // ذخیره توکن در localStorage — امن بنویس (هرگز null ننویس) try { const id_token = useStorage("id_token", ""); id_token.value = userData.token ?? ""; } catch (e) { console.warn("Could not write id_token to storage:", e); } // ذخیره کامل user — مطمئن شو شیء است try { const userStorage = useStorage("user", {}); userStorage.value = userData ?? {}; } catch (e) { console.warn("Could not write user to storage:", e); } // ذخیره user_id جداگانه برای دسترسی سریع try { const userIdStorage = useStorage("user_id", ""); userIdStorage.value = String(userData.id ?? ""); } catch (e) { console.warn("Could not write user_id to storage:", e); } // --- محافظت از سایر storage هایی که ممکنه در برنامه استفاده شده باشند --- // مثال: اگر یه key برای UI مثل 'sidebar' انتظار فیلد collapsed داره، // اطمینان بده که مقدار آن null نیست: try { const maybeSidebar = useStorage("sidebar", { collapsed: false }); if (maybeSidebar.value == null) { // اگر در localStorage قبلاً null ذخیره شده بود، مقدار پیش‌فرض را بازنویسی کن maybeSidebar.value = { collapsed: false }; } } catch (e) { // اگر کلیدهای دیگری داری که انتظار فیلد collapsed دارند، مشابهشان را اضافه کن } } async function getCaptcha() { try { const nuxtApp = useNuxtApp(); const baseUrl = import.meta.env.VITE_AUTH_BASE_URL; const { $http: httpService } = nuxtApp; const data: string = await httpService.getRequest("/auth/captcha", { baseURL: baseUrl, }); return data; } catch (error) { console.error("Captcha Error:", error); return null; } } async function register(credentials: any) { try { const nuxtApp = useNuxtApp(); const baseUrl = import.meta.env.VITE_AUTH_BASE_URL; const { $http: httpService } = nuxtApp; const response = await httpService.postRequest( "/auth/register", credentials, { baseURL: baseUrl, }, ); setUser(response.data); return response; } catch (error: any) { errors.value = error?.response?.data?.message || error.message; return error; } } function userReset() { user.value = {}; isAuthenticated.value = false; isRealUser.value = false; errors.value = null; // پاک کردن localStorage / sessionStorage const id_token = useStorage("id_token", ""); id_token.value = ""; const userStorage = useStorage("user", {}); userStorage.value = {}; } return { // state user, isAuthenticated, isRealUser, errors, // actions setUser, getCaptcha, register, userReset, }; });