Nextjs-boilerplate/src/app/[lang]/dashboard/vm/create-random-invoice-button-vm.ts
2024-11-02 20:41:38 +03:00

46 lines
1.7 KiB
TypeScript

import ButtonVm from "@/app/components/button/button-vm";
import { useServerAction } from "@/bootstrap/helpers/hooks/use-server-action";
import useThrottle from "@/bootstrap/helpers/hooks/use-throttle";
import BaseVM from "@/bootstrap/helpers/vm/base-vm";
import langKey from "@/bootstrap/i18n/dictionaries/lang-key";
import { InvoiceParam } from "@/feature/core/invoice/domain/param/invoice-param";
import createInvoiceUsecase from "@/feature/core/invoice/domain/usecase/create-invoice-usecase";
import { faker } from "@faker-js/faker";
import { useRouter } from "next/navigation";
import { useTranslation } from "react-i18next";
export default class CreateRandomInvoiceButtonVM extends BaseVM<ButtonVm> {
private createInvoice: typeof createInvoiceUsecase
constructor() {
super()
this.createInvoice = this.di.resolve(createInvoiceUsecase.name)
}
useVM(): ButtonVm {
const router = useRouter()
const [action, isPending] = useServerAction(() => this.onClickHandler(router.refresh))
const throttledOnClick = useThrottle(action, 5000)
const {t} = useTranslation()
return {
props: {
title: t(isPending ? langKey.global.loading : langKey.dashboard.invoice.createButton),
isDisable: isPending ? true : false
},
onClick: throttledOnClick.bind(this)
}
}
async onClickHandler(refreshPage: () => void) {
const fakedParams: InvoiceParam = {
amount: faker.number.int({
min: 1,
max: 10
}),
status: "paid"
}
await this.createInvoice(fakedParams)
refreshPage()
}
}