135 lines
3.9 KiB
TypeScript
Executable File
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,
|
|
};
|
|
});
|