import { CombiningLedgerResponse, CombiningLedgerResponseTypeEnum, CreateCombiningLedgerRequest, CreateMainLedgerRequest, LedgerResponseTypeEnum, MainLedgerResponse, MainLedgerResponseTypeEnum, UpdateCombiningLedgerRequest, UpdateMainLedgerRequest } from "@/generated/mammon"; import {defineStore} from "pinia"; import {ref, triggerRef} from "vue"; import {ledgerControllerApi} from "@/mammon"; export const LedgerTypes = LedgerResponseTypeEnum; export type LedgerType = LedgerResponseTypeEnum; export type MainLedger = MainLedgerResponse & {type: MainLedgerResponseTypeEnum} export type CombiningLedger = CombiningLedgerResponse & {type: CombiningLedgerResponseTypeEnum} export type Ledger = MainLedger | CombiningLedger; export const isMain = (ledger: Ledger): ledger is MainLedger => { return ledger.type === LedgerTypes.Main; } export const isCombining = (ledger: Ledger): ledger is CombiningLedger => { return ledger.type === LedgerTypes.Combining; } export const useLedgersStore = defineStore('ledgers', () => { const ledgers = ref([]); const addLedger = (ledger: Ledger) => { ledgers.value.push(ledger); triggerRef(ledgers); return ledger; }; const replaceLedger = (ledger: Ledger) => { const index = ledgers.value.findIndex(l => l.ledgerId === ledger.ledgerId); if (index !== -1) { ledgers.value[index] = ledger; } triggerRef(ledgers); return ledger; }; const findById = (ledgerId: string): Ledger | undefined => ledgers.value.find(l => l.ledgerId === ledgerId); const findAllById = (ledgerIds: string[]): Ledger[] => ledgerIds.map(findById).filter((x): x is Ledger => x !== undefined) const createMain = (ledger: CreateMainLedgerRequest) => ledgerControllerApi.createMainLedger(ledger).then(response => addLedger(response.data as Ledger)); const createCombining = (ledger: CreateCombiningLedgerRequest) => ledgerControllerApi.createCombiningLedger(ledger).then(response => addLedger(response.data as Ledger)); const updateMain = (ledgerId: string, ledger: UpdateMainLedgerRequest) => ledgerControllerApi.updateMainLedger(ledgerId, ledger).then(response => replaceLedger(response.data as Ledger)); const updateCombining = (ledgerId: string, ledger: UpdateCombiningLedgerRequest) => ledgerControllerApi.updateCombiningLedger(ledgerId, ledger).then(response => replaceLedger(response.data as Ledger)); const refresh = () => ledgerControllerApi.findAll().then(response => ledgers.value = response.data as Ledger[]); refresh(); return {ledgers, findById, findAllById, createMain, createCombining, updateMain, updateCombining, refresh}; })