Files
your-gold/stores/store.ts
2025-07-03 11:13:42 +02:00

121 lines
3.0 KiB
TypeScript

import { useMyFetch } from '#imports'
import type {
componentsListType,
GenericResponse,
PlanPrediction,
} from '~/types'
import type { FrontPageSection } from '~/types/frontSection'
export const useStore = defineStore('store', () => {
const currentPageID = ref('')
// calculator
const monthlySavings = ref(137)
const storagePeriod = ref(10)
const totalInvestment: Ref<number> = ref(0)
const minValue = ref()
const components = ref({} as FrontPageSection[])
const getSections = async (id: string) => {
const { data } = await useMyFetch<GenericResponse<FrontPageSection[]>>(
`/api/public/front/sections/${id}`,
)
components.value = data
}
async function getComponents(): Promise<componentsListType[]> {
try {
const children = components.value
if (!children || !Array.isArray(children)) {
console.warn('No components available in store.')
return []
}
const componentsList = [] as componentsListType[]
for (const child of children) {
const componentName = child.front_section.component_name
if (!componentName) continue
try {
const componentInstance = (
await import(`@/components/section/${componentName}.vue`)
).default
const nonReactiveComponent = markRaw(componentInstance)
componentsList.push({
name: componentName,
component: child.front_section,
componentInstance: nonReactiveComponent,
})
}
catch (error) {
console.error(`Failed to load component ${componentName}`, error)
}
}
return componentsList
}
catch (error) {
console.error('Failed to process components list', error)
}
return []
}
async function getCalculator() {
try {
const { data } = await useMyFetch<GenericResponse<PlanPrediction>>(
`/api/public/plan-prediction/easy/calculate?monthly_deposit=${monthlySavings.value}&years=${storagePeriod.value}`,
{
headers: {
'Content-Type': 'application/json',
},
onErrorOccured: (_, status) => {
throw new Error(`HTTP error: ${status}`)
},
},
)
totalInvestment.value = data.total_investement_value
}
catch (error) {
console.error('getList error:', error)
}
}
async function getMinValue() {
try {
const { data } = await useMyFetch<GenericResponse<number>>(
'/api/public/plan-prediction/free/minimum',
{
headers: {
'Content-Type': 'application/json',
},
onErrorOccured: (_, status) => {
throw new Error(`HTTP error: ${status}`)
},
},
)
minValue.value = data
}
catch (error) {
console.error('getList error:', error)
}
}
return {
currentPageID,
components,
totalInvestment,
monthlySavings,
storagePeriod,
minValue,
getCalculator,
getComponents,
getSections,
getMinValue,
}
})