import type { Action, Thunk } from 'easy-peasy' import { action, thunk } from 'easy-peasy' import { Injections } from './store' import { GridOptionsEditDto } from '../proxy/form/models' import setNull from '../utils/setNull' import { ListState } from '@/proxy/admin/list-form/models' import { Conversation } from '@/proxy/ai/models' export type DashboardLayout = 'default' | 'wide-center' | 'balanced' | 'wide-left' | 'wide-right' export interface DashboardState { dashboardLayout: DashboardLayout hiddenWidgetIds: string[] widgetOrder: { left: string[] center: string[] right: string[] } } export interface AiConversationsState { items: Conversation[] aiActiveConversationId: string | null } export interface AdminStoreModel { lists: { values: GridOptionsEditDto | undefined states: ListState[] } dashboard: DashboardState aiConversations: AiConversationsState } export interface AdminStoreActions { lists: { setListFormValues: Action setJsonValue: Action getListFormValues: Thunk< AdminStoreModel['lists'] & AdminStoreActions['lists'], string | undefined, Injections > setStates: Action } dashboard: { setDashboardLayout: Action setHiddenWidgetIds: Action setWidgetOrder: Action reset: Action } setAiConversations: Action } export type AdminModel = AdminStoreModel & AdminStoreActions const initialDashboardState: DashboardState = { dashboardLayout: 'default', hiddenWidgetIds: [], widgetOrder: { left: [], center: [], right: [], }, } const initialState: AdminStoreModel = { lists: { values: undefined, states: [], }, dashboard: initialDashboardState, aiConversations: { items: [], aiActiveConversationId: null, }, } export const adminModel: AdminModel = { lists: { ...initialState.lists, setStates: action((state, payload) => { const stateId = state.states.findIndex((s) => s.listFormCode === payload.listFormCode) if (stateId !== -1) { state.states[stateId] = { ...state.states[stateId], ...payload } } else { state.states = [...state.states, payload] } }), setListFormValues: action((state, payload) => { state.values = { ...state.values, ...payload } }), setJsonValue: action((state, payload) => { if (state.values) { state.values[payload.field] = payload.data } }), getListFormValues: thunk(async (actions, payload, helpers) => { if (!payload) return const service = helpers.injections.listFormService const result = await service.getListFormByCode(payload) setNull(result.data) actions.setListFormValues(result.data) }), }, dashboard: { ...initialState.dashboard, setDashboardLayout: action((state, payload) => { state.dashboardLayout = payload }), setHiddenWidgetIds: action((state, payload) => { state.hiddenWidgetIds = payload }), setWidgetOrder: action((state, payload) => { state.widgetOrder = payload }), reset: action((state) => { state.dashboardLayout = initialDashboardState.dashboardLayout state.hiddenWidgetIds = initialDashboardState.hiddenWidgetIds state.widgetOrder = initialDashboardState.widgetOrder }), }, aiConversations: initialState.aiConversations, setAiConversations: action((state, payload) => { state.aiConversations = payload }), }