Write the store file in src/stores/ (e.g., src/stores/backup.store.ts). Use this exact template:
import { defineStore } from 'pinia';
import { fetchWrapper } from '@/helpers/fetchWrapper';
import { snakeToCamel } from '@/helpers/snakeToCamel';
import { ClientLink, ServiceType, BillingDetails, ExtraInfoTableRow, ExtraInfoTables } from '@/types/view-service-common';
import { useAuthStore } from '@/stores/auth.store';
import { useSiteStore } from '@/stores/site.store';
export const useBackupStore = defineStore('backup', {
state: (): BackupState => ({
backupList: [],
loading: false,
error: false,
pkg: '',
linkDisplay: false,
serviceInfo: { },
clientLinks: [],
billingDetails: {
service_last_invoice_date: '',
service_payment_status: '',
service_frequency: '',
next_date: '',
service_next_invoice_date: '',
service_currency: 'USD',
service_currency_symbol: '$',
service_coupon: '',
service_cost_info: '0.00',
service_extra: [],
},
custCurrency: 'USD',
custCurrencySymbol: '$',
serviceExtra: [],
extraInfoTables: {
backup: { title: 'Connection Information', rows: [] },
tutorials: { title: 'Tutorials', rows: [] },
},
serviceType: {
services_id: 0,
services_name: '',
services_cost: 0,
services_category: 0,
services_buyable: 0,
services_type: 0,
services_field1: '',
services_field2: '',
services_module: 'backups',
},
usage_count: 0,
}),
getters: {
titleField: (state) => state.serviceInfo.backup_hostname,
titleField2: (state) => state.serviceInfo.backup_ip,
},
actions: {
async register(user: any): Promise<void> {
const siteStore = useSiteStore();
const baseUrl = siteStore.getBaseUrl();
await fetchWrapper.post(`${baseUrl}/register`, user);
},
async getAll(): Promise<void> {
const siteStore = useSiteStore();
const baseUrl = siteStore.getBaseUrl();
this.loading = true;
try {
this.backupList = await fetchWrapper.get(`${baseUrl}/backups`);
} catch (error: any) {
console.log(`got error response${error}`);
this.error = error;
}
this.loading = false;
},
async getById(id: number | string): Promise<void> {
const siteStore = useSiteStore();
const baseUrl = siteStore.getBaseUrl();
try {
const response = await fetchWrapper.get(`${baseUrl}/backups/${id}`);
this.$reset();
console.log(response);
this.serviceInfo = response.serviceInfo;
this.clientLinks = response.client_links;
this.billingDetails = response.billingDetails;
this.custCurrency = response.custCurrency;
this.custCurrencySymbol = response.custCurrencySymbol;
this.pkg = response.package;
this.serviceExtra = response.serviceExtra;
this.extraInfoTables = response.extraInfoTables;
this.serviceType = response.serviceType;
this.usage_count = response.usage_count;
} catch (error: any) {
console.log('api failed', error);
}
},
async update(id: number, params: any): Promise<void> {},
async delete(id: number): Promise<void> {
const siteStore = useSiteStore();
const baseUrl = siteStore.getBaseUrl();
await fetchWrapper.delete(`${baseUrl}/${id}`);
this.backupList = this.backupList.filter((x) => x.backup_id !== id);
},
},
});
Verify: file exports exactly one store. Run yarn ts to type-check:
yarn ts