import type { Action, Thunk } from 'easy-peasy' import { action, thunk } from 'easy-peasy' import { Injections, StoreModel } from '.' import { getLocalization, setLocalization } from '../services/localization.service' import appConfig from '../proxy/configs/app.config' import { NavigationTree } from '../proxy/menus/navigation' import { MenuDto } from '../proxy/menus/models' import getChildren from '../utils/navigation' import { ApplicationConfigurationDto, ApplicationLocalizationRequestDto, } from '../proxy/config/models' import { setAppVersionInfo } from '../views/version/swRegistration' export type Texts = Record> export interface GetConfigOptions { /** Localization kaynaklarını da zorla yeniden yükle. */ reloadTexts?: boolean /** Hata global hata diyaloğunu açmasın — çağıran taraf kendisi ele alır. */ silentError?: boolean } /** Geriye dönük uyumluluk: boolean payload `reloadTexts` anlamına gelir. */ export type GetConfigPayload = boolean | GetConfigOptions export interface AbpConfigModel { config?: ApplicationConfigurationDto setConfig: Action getConfig: Thunk texts?: Texts setTexts: Action getTexts: Thunk menu: { mainMenu: NavigationTree[] } setMenu: Action getMenu: Thunk } export const abpConfigModel: AbpConfigModel = { config: undefined, setConfig: action((state, payload) => { state.config = payload }), getConfig: thunk(async (actions, payload, helpers) => { const { reloadTexts = false, silentError = false } = typeof payload === 'boolean' ? { reloadTexts: payload } : (payload ?? {}) const service = helpers.injections.abpConfigService const result = await service.getAppConfig(reloadTexts, { silentError }) // AppConfig'den gelen culture mevcuttan farklı ise localizationları da al const newCulture = result.data?.localization.currentCulture.cultureName const currentCulture = helpers.getState().config?.localization.currentCulture.cultureName const isCultureDifferent = newCulture && currentCulture !== newCulture const isTextsEmpty = !helpers.getState().texts if (reloadTexts || isCultureDifferent || isTextsEmpty) { await actions.getTexts({ cultureName: newCulture ?? currentCulture ?? appConfig.locale, onlyDynamics: false, }) } // Set HTML Lang document.documentElement.setAttribute('lang', newCulture ?? currentCulture ?? appConfig.locale) actions.setConfig(result.data) // Sürüm ve sürüm notları backend'den bu yanıtla gelir; güncelleme motoru // ayrı bir istek atmaz. setAppVersionInfo(result.data.extraProperties?.['changeLogs']) //Eğer login değilse if (result.data.currentUser.isAuthenticated) { await actions.getMenu() } }), texts: undefined, setTexts: action((state, payload) => { state.texts = payload }), getTexts: thunk(async (actions, payload, helpers) => { const service = helpers.injections.abpConfigService const result = await service.getLocalizations(payload) actions.setTexts(setLocalization(result.data)) }), menu: { mainMenu: [], }, setMenu: action((state, payload) => { state.menu.mainMenu = [...payload] }), getMenu: thunk(async (actions, _, { injections, getState, getStoreState }) => { const { signedIn } = getStoreState().auth.session if (!signedIn) { return } const result = await injections.menuService.getList( { sorting: 'order', skipCount: 0, maxResultCount: 1000, } ) const texts = getState().texts const defaultResourceName = getState().config?.localization.defaultResourceName result.data.items?.forEach((menu: MenuDto) => { const displayName = '::' + menu.displayName menu.displayName = getLocalization(texts || {}, defaultResourceName, displayName) }) const menu = getChildren(result.data.items ?? [], null) actions.setMenu(menu) }), }