base_ui/stores/commonStore.ts
2025-02-01 13:04:55 +03:30

580 lines
18 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { defineStore } from "pinia";
import { useAuthStore } from "./authStore";
import permitApis from "~/apis/permitApi";
import authApi from "~/apis/authApi";
import {useStorage} from "@vueuse/core";
import type {
JahatSection,
Book,
TempData,
AuthorizedPages,
Schemas,
ActiveSchema,
ForwardItem,
Selectedlists,
Permission,
System,
User,
lastRecord,
Pagination,
} from "~/types/commonTypes";
export const useCommonStore = defineStore("commonStore", {
persist: {
storage: piniaPluginPersistedstate.localStorage()
},
state: () => ({
count: 0 as number,
name: "" as string,
jahatSection: [] as JahatSection,
tokenIsValid: false,
pwaInstallPromptEvent: null,
axiosBaseUrl: null,
componentName: "",
show_base_modal: false,
book: {} as Book,
tempData: {} as TempData,
collapsed: +import.meta.env.VITE_BUILD_STATE as
| number
| boolean
| undefined,
show_form: false,
is_edit_mode: false,
refresh_form: false,
user_permissions: [] as string[],
authorized_pages: [] as AuthorizedPages,
isDesktop: false,
isMobile: false,
userLastState: null,
schemas: {} as Schemas,
activeSchema: {} as ActiveSchema,
forwardItem: {} as ForwardItem,
selectedlists: {} as Selectedlists,
sidebarListStatus: false,
userHistory: {},
lastRecord: {} as lastRecord | undefined,
lang: "fa" as string,
fontData: undefined,
pagination: {
pages: 0,
total: 0,
page: 1,
offset: 0,
limit: 10,
} as Pagination,
systems: [] as System[],
activeSystem: {} as System,
appVersion: "" as string,
isShowHilight: true as boolean,
sidebarMenu: {},
}),
getters: {
doubleCount: (state) => state.count * 2,
loginMicroServiceName: () => import.meta.env.VITE_AUTH,
messageMircroServiceName: () => import.meta.env.VITE_MESSAGE,
keyValueMircroServiceName: () => import.meta.env.VITE_KEY_VALUE,
permitMircroServiceName: () => import.meta.env.VITE_PERMIT,
repoMircroServiceName: () => import.meta.env.VITE_REPO,
logMircroServiceName: () => import.meta.env.VITE_LOG,
listMircroServiceName: () => import.meta.env.VITE_LIST,
getForwardItem: (state) => state.forwardItem,
activeSchemaGetter: (state) => state.activeSchema,
schemasGetter: (state) => state.schemas,
organNameGetter: () => import.meta.env.VITE_BUILD_NAME,
sectionsGetter: (state) => state.jahatSection,
getTokenIsValid: (state) => state.tokenIsValid,
getPwaInstallPromptEvent: (state) => state.pwaInstallPromptEvent,
getUserLastState: (state) => state.userLastState,
getAxiosBaseUrl: (state) => state.axiosBaseUrl,
authorizedPagesGetter: (state) => state.authorized_pages,
userPermisionGetter: (state) => state.user_permissions,
getBook: (state) => state.book,
getComponentName: (state) => state.componentName,
getShowBaseModal: (state) => state.show_base_modal,
isSidebarCollapsed: (state) => state.collapsed,
getPanelStatus: (state) => state.show_form,
getRefreshForm: (state) => state.refresh_form,
isDesktopGetter: (state) => state.isDesktop,
isMobileGetter: (state) => state.isMobile,
selectedlistsGetter: (state) => state.selectedlists,
sidebarListStatusGetter: (state) => state.sidebarListStatus,
sidebarMenuGetter: (state) => state.sidebarMenu,
userHistoryGetter: (state) => state.userHistory,
lastRecordGetter: (state) => state.lastRecord,
appVersionGetter: (state) => state.appVersion,
systemsGetter: (state) => state.systems,
activeSystemGetter: (state) => state.activeSystem,
langGetter: (state) => state.lang,
fontDataGetter: (state) => state.fontData,
paginationGetter: (state) => state.pagination,
isShowHilightGetter: (state) => state.isShowHilight,
},
actions: {
activeSchemaSetter(activeSchema: {}) {
if (this.activeSchema) this.activeSchema = activeSchema;
},
schemasSetter(schemas: any[]) {
this.schemas = schemas;
},
sidebarCollapsedSetter(isCollapsed: boolean) {
this.collapsed = isCollapsed;
},
SET_FORWARD_ITEM(forwardItem: ForwardItem) {
this.forwardItem = forwardItem;
},
SET_SECTIONS(jahatSection: JahatSection) {
this.jahatSection = jahatSection;
},
// SET_TOKEN_IS_VALID_EVENT(tokenIsValid: boolean) {
// this.tokenIsValid = tokenIsValid;
// },
SET_PWA_INSTALL_PROMPT_EVENT(event = null) {
this.pwaInstallPromptEvent = event;
},
// SET_USER_LAST_STATE(userLastState: null) {
// this.userLastState = userLastState;
// },
SET_IS_DESKTOP(isDesktop: boolean) {
this.isDesktop = isDesktop;
},
SET_IS_MOBILE(isMobile: boolean) {
this.isMobile = isMobile;
},
TOGGLE_SIDEBAR_MENU() {
this.collapsed = !this.collapsed;
},
BOOK_DATA(payload: Book) {
this.book = payload;
},
COMPONENT_NAME(payload: string) {
this.componentName = payload;
},
SHOW_BASE_MODAL(payload: boolean) {
this.show_base_modal = payload;
},
REFRESH_FORM() {
this.refresh_form = !this.refresh_form;
},
TOGGLE_PANEL(status: boolean) {
this.show_form = status;
},
SELECTED_LISTS(selectedlists: Selectedlists) {
this.selectedlists = selectedlists;
},
// SET_SIDEBAR_LIST_STATUS(newState = undefined) {
// this.sidebarListStatus =
// newState != undefined || newState != null
// ? newState
// : !this.sidebarListStatus;
// },
SET_AUTHORIZED_PAGES(pages: Permission[] = []) {
const AuthorizedPages: Set<string> = new Set();
if (pages && pages.length) {
pages.forEach((item: Permission) =>
AuthorizedPages.add(item.section_tag)
);
}
// this.authorized_pages = AuthorizedPages as Set<string>;
this.authorized_pages = Array.from(AuthorizedPages);
},
SET_USER_PERMISSIONS(permissions: Permission[] = []) {
const permissionArray: string[] = [];
if (permissions && permissions.length) {
permissions.forEach((item: Permission) =>
permissionArray.push(item.action_tag)
);
}
this.user_permissions = permissionArray;
// localStorage.setItem('user_permissions', JSON.stringify(permissionArray))
},
increment() {
this.count++;
},
// easily reset state using `$reset`
clearUser() {
this.$reset();
},
chatSidebarListStatusReactor(newState: boolean) {
// this.SET_SIDEBAR_LIST_STATUS = newVal;
this.sidebarListStatus =
newState != undefined || newState != null
? newState
: !this.sidebarListStatus;
},
async getState() {
const settingsApi = (await import("~/apis/adminApi")).default;
const url = settingsApi.user.get;
try {
const response = await useAPI(url, {
baseURL: import.meta.env.VITE_REPO_BASE_URL,
});
this.userLastState = JSON.parse(response?._source?.user_last_state);
return this.getUserLastState;
} catch (error) {
return error;
}
// const httpService = new HttpService(import.meta.env.VITE_REPO_BASE_URL);
// const url = settingsApi.user.get;
// return await httpService.getRequest(url).then((res: any) => {
// this.userLastState = JSON.parse(res?._source?.user_last_state);
// return this.getUserLastState;
// });
// const url = adminApi.admin.get.replace(
// "{{system}}/",
// "user_log/user_last_state"
// );
// return await httpService.getRequest(url).then((res) => {
// this.SET_USER_LAST_STATE", JSON.parse(res.hits.hits[0]._source.value));
// return getters.getUserLastState;
// });
},
// async storeState(userLastState: any) {
// const httpService = new HttpService(import.meta.env.VITE_REPO_BASE_URL);
// const settingsApi = require("~/apis/settingsApi");
// const payload = {
// user_id: getters.currentUser.user_id,
// username: getters.currentUser.username ?? null,
// project: "user_log",
// key_option: "user_last_state",
// value: JSON.stringify(userLastState),
// };
// return await httpService.postRequest(adminApi.admin.save, payload);
// const payload = {
// user_last_state: userLastState,
// };
// const url = settingsApi.user.setKey_object.replace(
// "{{key}}",
// "user_last_state"
// );
// return await httpService.postRequest(url, payload);
// },
setBodyClass(customClass: string | null = null) {
if (customClass) {
document.querySelector("body")?.classList.add(customClass);
} else {
const activeSystem = this.activeSystemGetter;
if (
activeSystem &&
activeSystem.link &&
location.pathname.includes(activeSystem.link)
) {
document
.querySelector("body")
?.classList.add(`${activeSystem.link}-system`);
} else {
if (this.systemsGetter) {
this.setNewSystem(this.systemsGetter);
} else {
this.getSystems().then((systems: any) => {
this.setNewSystem(systems);
});
}
}
}
},
// setNewSystem<Type>(systems: Type): void {
setNewSystem(systems: System[]) {
const extractedSystemName = location.pathname
.match(/\/(.*)\/{0,1}/)
?.pop()
?.split("/");
let result: System | null = null;
if (extractedSystemName && extractedSystemName.length > 0) {
result = systems.find(
(item) => item.link === extractedSystemName[0]
) as System;
}
if (result) {
this.activeSystem = result;
const bodyElement = document.querySelector("body");
if (bodyElement) {
bodyElement.classList.add(result.link + "-system");
}
}
},
async getSystems() {
const apiName = import.meta.env.VITE_API_NAME;
const baseUrl = import.meta.env.VITE_BASE_URL;
return await $fetch(permitApis.projects.list, {
baseURL: baseUrl + apiName + import.meta.env.VITE_PERMIT_BASE_URL,
headers: {
Authorization: useStorage('id_token','').value,
},
method: "post",
})
.then((res: any) => {
const systems = this.systemsGetter;
if (!systems) {
// this.systemsSetter = res.data.data;
this.systems = res.data;
}
return res;
})
.catch((error) => {
throw createError({
...error,
statusMessage: `Could not fetch posts`,
});
});
// const httpService = axios.create({
// baseURL: import.meta.env.VITE_PERMIT_BASE_URL,
// headers: {
// Authorization: getToken(),
// },
// });
// return new Promise((resolve, reject) => {
// httpService
// .post(permitApis.projects.list)
// .then((res: resModelOne) => {
// const systems = this.systemsGetter;
// if (!systems) {
// // this.systemsSetter = res.data.data;
// this.systems = res.data;
// }
// // resolve(res.data.data);
// resolve(res.data);
// })
// .catch((err: any) => {
// reject(err);
// });
// });
},
async getUserPermissions(projectId = undefined) {
const authStore = useAuthStore();
const data = {
project_id: projectId ?? this.activeSystem.id,
user_id: authStore.currentUser.user_id,
};
try {
const res = await useAPI(permitApis.permissions.listUserPermission, {
baseURL: import.meta.env.VITE_AUTH_BASE_URL,
method: "POST",
body: formDataParamMaker(data),
// headers: {
// 'Content-Type': 'application/x-www-form-urlencoded',
// },
});
this.SET_USER_PERMISSIONS(res.data);
this.SET_AUTHORIZED_PAGES(res.data);
return res.data;
} catch (error) {
return error;
}
// const httpService = new HttpService(import.meta.env.VITE_PERMIT_BASE_URL);
// return new Promise((resolve, reject) => {
// httpService
// .formDataRequest(permitApis.permissions.listUserPermission, data)
// .then((res) => {
// this.SET_USER_PERMISSIONS = res.data;
// this.SET_AUTHORIZED_PAGES = res.data;
// resolve(res.data);
// })
// .catch(({ response }) => {
// reject(response);
// });
// });
},
async checkPermissions(permission = null) {
const authStore = useAuthStore();
return new Promise((resolve, reject) => {
// اگر قبلا لیست دسترسی ها دریافت شده بود.
if (this.userPermisionGetter && this.userPermisionGetter.length) {
if (
authStore.currentUser.user_level > 1 ||
this.userPermisionGetter.includes(permission)
) {
resolve(null);
} else {
reject();
}
} else {
this.getUserPermissions().then((res) => {
if (
authStore.currentUser.user_level > 1 ||
this.userPermisionGetter.includes(permission)
) {
resolve(null);
} else {
// mySwalToast({
// title: "خطا",
// html: "عدم دسترسی",
// icon: "error",
// });
reject();
}
});
}
});
},
checkPagePermissions(pageUrl = null) {
return new Promise((resolve, reject) => {
// اگر قبلا لیست دسترسی صفحات دریافت شده بود.
if (this.authorizedPagesGetter && this.authorizedPagesGetter.size > 0) {
if (
pageUrl == "" ||
pageUrl == "view" ||
this.authorizedPagesGetter.has(pageUrl)
)
resolve(null);
else reject();
} else {
this.getUserPermissionTags().then(() => {
if (
pageUrl == "" ||
pageUrl == "view" ||
this.authorizedPagesGetter?.has(pageUrl)
)
resolve(null);
else reject();
});
}
});
},
async getUserPermissionTags() {
try {
const res = await useAPI(permitApis.permissions.userPermissionTags, {
baseURL: import.meta.env.VITE_PERMIT_BASE_URL,
method: "POST",
body: {},
});
this.SET_USER_PERMISSIONS(res.data);
this.SET_AUTHORIZED_PAGES(res.data);
return res.data;
} catch (error) {
return error;
}
// const httpService = new HttpService(import.meta.env.VITE_PERMIT_BASE_URL);
// return new Promise((resolve, reject) => {
// httpService
// .formDataRequest(permitApis.permissions.userPermissionTags, {})
// .then((res) => {
// this.SET_USER_PERMISSIONS = res.data;
// this.SET_AUTHORIZED_PAGES = res.data;
// resolve(res.data);
// })
// .catch(({ response }) => {
// reject(response);
// });
// });
},
async checkTokenIsValid() {
const authStore = useAuthStore();
try {
const res = await useAPI(authApi.validateUser, {
baseURL: import.meta.env.VITE_AUTH_BASE_URL,
});
this.tokenIsValid = true;
let userData = {
["user_data"]: res.data?.data,
} as User;
if (
userData.user_data?.user_id == 3 ||
userData.user_data?.username == "Guest"
) {
authStore.setGuest(userData);
}
return res;
} catch (error) {
return error;
}
// const httpService = new HttpService(import.meta.env.VITE_AUTH_BASE_URL);
// return new Promise((resolve, reject) => {
// httpService
// .getRequest(authApi.validateUser)
// .then((res) => {
// // this.SET_TOKEN_IS_VALID_EVENT = true;
// this.tokenIsValid = true;
// // if(typeof res.data == "boolean")
// // this.SET_TOKEN_IS_VALID_EVENT', res.data)
// // else{
// // this.SET_TOKEN_IS_VALID_EVENT', true)
// // }
// let userData = {
// ["user_data"]: res.data?.data,
// } as User;
// if (
// userData.user_data?.user_id == 3 ||
// userData.user_data?.username == "Guest"
// ) {
// authStore.setGuest(userData);
// }
// resolve(null);
// })
// .catch(({ response }) => {
// reject(response);
// });
// });
},
sidebarMenuSetter(sidebarMenu: {}) {
this.sidebarMenu = sidebarMenu;
},
lastRecordSetter(lastRecord: lastRecord) {
this.lastRecord = lastRecord;
},
appVersionSetter(appVersion = "") {
this.appVersion = appVersion;
},
systemsSetter(systems: System[]) {
this.systems = systems;
},
activeSystemSetter(activeSystem: System) {
this.activeSystem = activeSystem;
},
langSetter(lang = "fa") {
this.lang = lang;
},
fontDataSetter(fontData = undefined) {
this.fontData = fontData;
},
paginationSetter(pagination: Pagination) {
this.pagination = pagination;
},
isShowHilightSetter(isShowHilight = true) {
this.isShowHilight = isShowHilight;
},
},
});