Files
pancake-tui/src/components/detailsInvoice.ts
Tim Bendt fb36fb8303 wip
2024-11-01 11:32:37 -05:00

83 lines
2.5 KiB
TypeScript

import * as w from "wretched";
import Table from "cli-table3";
import {
getOneInvoice,
markInvoicePaid,
updateInvoice,
} from "../services/pancakeApi.js";
import { doubleBoxWithTitle } from "./helpers/boxBorders.js";
import { isNaN, omit, values } from "lodash-es";
import { fromUnixTime, format } from "date-fns";
import { InvoiceDetailsResponse } from "../services/invoiceResponse.js";
export const renderInvoiceDetails = async (invoiceId: string | number) => {
const { invoice } = await getOneInvoice(invoiceId.toString());
if (process.env.DEBUG) {
console.log("🚀 ~ renderInvoiceDetails ~ details:", invoice);
}
const mainWindow = new w.Scrollable({
children: [],
});
const mainTable = new Table();
for (const key in omit(invoice, "items", "partial_payments")) {
const rawValue = invoice[key as keyof InvoiceDetailsResponse];
if (typeof rawValue !== "object") {
let value: Table.Cell = rawValue;
if (typeof rawValue !== "boolean") {
if (key.indexOf("date") >= 0) {
value = Number(rawValue);
if (!isNaN(value)) {
value = format(fromUnixTime(value), "y-M-d");
}
}
}
mainTable.push({
[key]: value,
} as Table.VerticalTableRow);
}
}
mainWindow.addAll([
new w.Flow({
direction: "topToBottom",
children: [
new w.Text({ text: `Unpaid: $${invoice.unpaid_amount}` }),
new w.Button({
text: `Mark as ${invoice.unpaid_amount > 0 ? "Paid" : "Unpaid"}`,
onClick: async () => {
const isPaid = invoice.unpaid_amount > 0;
if (process.env.DEBUG) {
console.log("Switching paid status from", {
isPaid,
invoiceId,
});
}
if (isPaid) {
mainWindow.removeAllChildren();
mainWindow.addAll([
new w.Flow({
direction: "leftToRight",
children: [
new w.Text({ text: "Paid Amount" }),
new w.Input({ text: "Paid Amount" }),
],
}),
]);
} else {
if (!process.env.DEBUG) {
await markInvoicePaid(invoiceId);
}
}
},
}),
new w.Text({ text: mainTable.toString() }),
],
}),
]);
return new w.Box({
border: doubleBoxWithTitle(
`${invoice.client_name} 💸 Invoice: ${invoice.id}`,
),
child: mainWindow,
});
};