conflict-nuxt-4/app/stores/authStore.ts
2026-02-12 11:24:27 +03:30

135 lines
3.9 KiB
TypeScript
Executable File

// 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,
};
});