mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-04-07 13:41:23 +00:00
Migrate all 37 store definitions from the deprecated object-with-id
signature to the string-id-first signature required by Pinia 3:
defineStore({ id: 'name', ... }) → defineStore('name', { ... })
287 lines
8.5 KiB
JavaScript
Vendored
287 lines
8.5 KiB
JavaScript
Vendored
import http from '@/scripts/http'
|
|
import { defineStore } from 'pinia'
|
|
import { useCompanyStore } from './company'
|
|
import { useUserStore } from './user'
|
|
import { useModuleStore } from './module'
|
|
import { useNotificationStore } from '@/scripts/stores/notification'
|
|
import { handleError } from '@/scripts/helpers/error-handling'
|
|
import _ from 'lodash'
|
|
|
|
export const useGlobalStore = (useWindow = false) => {
|
|
const defineStoreFunc = useWindow ? window.pinia.defineStore : defineStore
|
|
const { global } = window.i18n
|
|
|
|
return defineStoreFunc('global', {
|
|
state: () => ({
|
|
// Global Configuration
|
|
config: null,
|
|
globalSettings: null,
|
|
|
|
// Global Lists
|
|
timeZones: [],
|
|
dateFormats: [],
|
|
timeFormats: [],
|
|
currencies: [],
|
|
countries: [],
|
|
languages: [],
|
|
fiscalYears: [],
|
|
|
|
// Menus
|
|
mainMenu: [],
|
|
settingMenu: [],
|
|
|
|
// Boolean Flags
|
|
isAppLoaded: false,
|
|
isSidebarOpen: false,
|
|
areCurrenciesLoading: false,
|
|
|
|
downloadReport: null,
|
|
}),
|
|
|
|
getters: {
|
|
menuGroups: (state) => {
|
|
return Object.values(_.groupBy(state.mainMenu, 'group'))
|
|
},
|
|
},
|
|
|
|
actions: {
|
|
bootstrap() {
|
|
return new Promise((resolve, reject) => {
|
|
http
|
|
.get('/api/v1/bootstrap')
|
|
.then(async (response) => {
|
|
const companyStore = useCompanyStore()
|
|
const userStore = useUserStore()
|
|
const moduleStore = useModuleStore()
|
|
|
|
this.mainMenu = response.data.main_menu
|
|
this.settingMenu = response.data.setting_menu
|
|
|
|
this.config = response.data.config
|
|
this.globalSettings = response.data.global_settings
|
|
|
|
// user store
|
|
userStore.currentUser = response.data.current_user
|
|
userStore.currentUserSettings =
|
|
response.data.current_user_settings
|
|
userStore.currentAbilities = response.data.current_user_abilities
|
|
|
|
// Module store
|
|
moduleStore.apiToken = response.data.global_settings.api_token
|
|
moduleStore.enableModules = response.data.modules
|
|
|
|
// company store
|
|
companyStore.companies = response.data.companies
|
|
companyStore.selectedCompany = response.data.current_company
|
|
companyStore.setSelectedCompany(response.data.current_company)
|
|
companyStore.selectedCompanySettings =
|
|
response.data.current_company_settings
|
|
companyStore.selectedCompanyCurrency =
|
|
response.data.current_company_currency
|
|
|
|
// Determine and load the appropriate language
|
|
const userLanguage = response.data.current_user_settings?.language
|
|
const companyLanguage = response.data.current_company_settings?.language
|
|
const targetLanguage = userLanguage || companyLanguage || 'en'
|
|
|
|
// Load the language dynamically if it's not English
|
|
if (targetLanguage !== 'en' && window.loadLanguage) {
|
|
try {
|
|
await window.loadLanguage(targetLanguage)
|
|
} catch (error) {
|
|
console.warn('Failed to load language during bootstrap:', error)
|
|
// Fall back to English if loading fails
|
|
if (typeof global.locale !== 'string') {
|
|
global.locale.value = 'en'
|
|
} else {
|
|
global.locale = 'en'
|
|
}
|
|
}
|
|
} else {
|
|
// Set locale for English or when loadLanguage is not available
|
|
if (typeof global.locale !== 'string') {
|
|
global.locale.value = targetLanguage
|
|
} else {
|
|
global.locale = targetLanguage
|
|
}
|
|
}
|
|
|
|
this.isAppLoaded = true
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
fetchCurrencies() {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.currencies.length || this.areCurrenciesLoading) {
|
|
resolve(this.currencies)
|
|
} else {
|
|
this.areCurrenciesLoading = true
|
|
http
|
|
.get('/api/v1/currencies')
|
|
.then((response) => {
|
|
this.currencies = response.data.data.filter((currency) => {
|
|
return (currency.name = `${currency.code} - ${currency.name}`)
|
|
})
|
|
this.areCurrenciesLoading = false
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
this.areCurrenciesLoading = false
|
|
reject(err)
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
fetchConfig(params) {
|
|
return new Promise((resolve, reject) => {
|
|
http
|
|
.get(`/api/v1/config`, { params })
|
|
.then((response) => {
|
|
if (response.data.languages) {
|
|
this.languages = response.data.languages
|
|
} else {
|
|
this.fiscalYears = response.data.fiscal_years
|
|
}
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
fetchDateFormats() {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.dateFormats.length) {
|
|
resolve(this.dateFormats)
|
|
} else {
|
|
http
|
|
.get('/api/v1/date/formats')
|
|
.then((response) => {
|
|
this.dateFormats = response.data.date_formats
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
fetchTimeFormats() {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.timeFormats.length) {
|
|
resolve(this.timeFormats)
|
|
} else {
|
|
http
|
|
.get('/api/v1/time/formats')
|
|
.then((response) => {
|
|
this.timeFormats = response.data.time_formats
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
fetchTimeZones() {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.timeZones.length) {
|
|
resolve(this.timeZones)
|
|
} else {
|
|
http
|
|
.get('/api/v1/timezones')
|
|
.then((response) => {
|
|
this.timeZones = response.data.time_zones
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
fetchCountries() {
|
|
return new Promise((resolve, reject) => {
|
|
if (this.countries.length) {
|
|
resolve(this.countries)
|
|
} else {
|
|
http
|
|
.get('/api/v1/countries')
|
|
.then((response) => {
|
|
this.countries = response.data.data
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
}
|
|
})
|
|
},
|
|
|
|
fetchPlaceholders(params) {
|
|
return new Promise((resolve, reject) => {
|
|
http
|
|
.get(`/api/v1/number-placeholders`, { params })
|
|
.then((response) => {
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
|
|
setSidebarVisibility(val) {
|
|
this.isSidebarOpen = val
|
|
},
|
|
|
|
setIsAppLoaded(isAppLoaded) {
|
|
this.isAppLoaded = isAppLoaded
|
|
},
|
|
|
|
updateGlobalSettings({ data, message }) {
|
|
return new Promise((resolve, reject) => {
|
|
http
|
|
.post('/api/v1/settings', data)
|
|
.then((response) => {
|
|
Object.assign(this.globalSettings, data.settings)
|
|
|
|
if (message) {
|
|
const notificationStore = useNotificationStore()
|
|
|
|
notificationStore.showNotification({
|
|
type: 'success',
|
|
message: global.t(message),
|
|
})
|
|
}
|
|
|
|
resolve(response)
|
|
})
|
|
.catch((err) => {
|
|
handleError(err)
|
|
reject(err)
|
|
})
|
|
})
|
|
},
|
|
},
|
|
})()
|
|
}
|