All files / packages/mutations/src/debts add.ts

96% Statements 24/25
70% Branches 7/10
94.73% Functions 18/19
95.23% Lines 20/21

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112                    137x       11x 11x                                       137x   11x 11x 11x 3x   3x           5x                         11x   11x         11x     5x       11x     11x   11x             11x               3x               4x                
import type { TRPCMutationInput, TRPCMutationOutput } from "~app/trpc";
import type { Debt } from "~app/trpc-types";
import { round } from "~utils/math";
 
import { update as updateDebts } from "../cache/debts";
import { update as updateReceipts } from "../cache/receipts";
import type { UseContextedMutationOptions } from "../context";
 
type AddResult = TRPCMutationOutput<"debts.add">;
 
const createDebt = (
	{ id, updatedAt, reverseAccepted }: AddResult,
	updateObject: TRPCMutationInput<"debts.add">,
): Debt => {
	const timestamp = updateObject.timestamp || Temporal.Now.plainDateISO();
	return {
		id,
		amount: updateObject.amount,
		currencyCode: updateObject.currencyCode,
		peerId: updateObject.peerId,
		timestamp,
		note: updateObject.note,
		updatedAt,
		their: reverseAccepted
			? {
					timestamp,
					amount: updateObject.amount,
					currencyCode: updateObject.currencyCode,
					updatedAt,
				}
			: undefined,
		receiptId: updateObject.receiptId,
	};
};
 
export const options: UseContextedMutationOptions<"debts.add"> = {
	mutationKey: "debts.add",
	onSuccess: (controllerContext) => (result, updateObject) => {
		const { receiptId } = updateObject;
		if (receiptId) {
			updateReceipts(controllerContext, {
				get: (controller) => {
					controller.update(receiptId, (receipt) => ({
						...receipt,
						debts: {
							direction: "outcoming",
							debts:
								receipt.debts.direction === "outcoming"
									? receipt.debts.debts.some((debt) => debt.id === result.id)
										? receipt.debts.debts
										: [
												...receipt.debts.debts,
												{ id: result.id, peerId: updateObject.peerId },
											]
									: [{ id: result.id, peerId: updateObject.peerId }],
						},
					}));
				},
				getPaged: undefined,
			});
		}
		updateDebts(controllerContext, {
			getAll: (controller) => {
				controller.update(updateObject.currencyCode, (sum) =>
					round(sum + updateObject.amount),
				);
			},
			getAllPeer: (controller) => {
				controller.update(
					updateObject.peerId,
					updateObject.currencyCode,
					(sum) => round(sum + updateObject.amount),
				);
			},
			getPeersPaged: (controller) => {
				controller.update(updateObject.peerId);
			},
			getByPeerPaged: (controller) =>
				controller.invalidate(updateObject.peerId),
			get: (controller) => {
				controller.add(createDebt(result, updateObject));
			},
			getIntentions: undefined,
		});
	},
	mutateToastOptions:
		({ t }) =>
		(variablesSet) => ({
			text: t("toasts.addDebt.mutate", {
				ns: "debts",
				debtsAmount: variablesSet.length,
			}),
		}),
	successToastOptions:
		({ t }) =>
		(resultSet) => ({
			text: t("toasts.addDebt.success", {
				ns: "debts",
				debtsAmount: resultSet.length,
			}),
		}),
	errorToastOptions:
		({ t }) =>
		(errors) => ({
			text: t("toasts.addDebt.error", {
				ns: "debts",
				debtsAmount: errors.length,
				errors,
			}),
		}),
};