155 lines
3.7 KiB
TypeScript
155 lines
3.7 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();
|
|
|
|
// login
|
|
const email = ref();
|
|
const password = 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);
|
|
}
|
|
}
|
|
|
|
async function logIn() {
|
|
try {
|
|
const { data } = await useMyFetch<GenericResponse<object>>(
|
|
`/api/public/user/session/start`,
|
|
{
|
|
method: "POST",
|
|
body: JSON.stringify({
|
|
mail: email.value,
|
|
password: password.value,
|
|
}),
|
|
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,
|
|
email,
|
|
password,
|
|
logIn,
|
|
getCalculator,
|
|
getComponents,
|
|
getSections,
|
|
getMinValue,
|
|
};
|
|
});
|