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

58.97% Statements 23/39
8.33% Branches 1/12
76.92% Functions 20/26
55.88% Lines 19/34

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 113 114 115 116 117 118 119 120 121 122 123                          51x       5x 5x   5x           5x     2x 1x   5x                   3x 3x   3x                                                                     3x       3x 3x   3x         3x           5x               3x               2x                
import type { Debt } from "~app/trpc-types";
import { round } from "~utils/math";
 
import {
	update as updateDebts,
	updateRevert as updateRevertDebts,
} from "../cache/debts";
import { update as updateReceipts } from "../cache/receipts";
import type { UseContextedMutationOptions } from "../context";
 
export const options: UseContextedMutationOptions<
	"debts.remove",
	{ debt: Debt }
> = {
	mutationKey: "debts.remove",
	onMutate:
		(controllerContext, { debt: currDebt }) =>
		() =>
			updateRevertDebts(controllerContext, {
				getAll: (controller) =>
					controller.update(
						currDebt.currencyCode,
						(sum) => round(sum - currDebt.amount),
						() => (sum) => round(sum + currDebt.amount),
					),
				getAllPeer: (controller) =>
					controller.update(
						currDebt.peerId,
						currDebt.currencyCode,
						(sum) => round(sum - currDebt.amount),
						() => (sum) => round(sum + currDebt.amount),
					),
				getPeersPaged: (controller) => controller.update(currDebt.peerId),
				getByPeerPaged: undefined,
				// We remove the debt from everywhere else
				// but it's own page
				// otherwise the page will try to refetch the data immediately
				get: undefined,
				getIntentions: undefined,
			}),
	onSuccess:
		(controllerContext, { debt: currDebt }) =>
		(result, updateObject) => {
			updateReceipts(controllerContext, {
				get: (controller) =>
					controller.updateAll((receipt) => {
						if (receipt.debts.direction === "incoming") {
							if (!receipt.debts.id) {
								return receipt;
							}
							if (receipt.debts.id === updateObject.id) {
								return {
									...receipt,
									debts: receipt.debts.hasForeign
										? { ...receipt.debts, hasForeign: true, hasMine: false }
										: {
												...receipt.debts,
												hasForeign: false,
												hasMine: false,
												id: undefined,
											},
								};
							}
							return receipt;
						}
						if (
							receipt.debts.debts.some((debt) => debt.id === updateObject.id)
						) {
							const nextDebts = receipt.debts.debts.filter(
								({ id }) => id !== updateObject.id,
							);
							return {
								...receipt,
								debts: { ...receipt.debts, debts: nextDebts },
							};
						}
						return receipt;
					}),
				getPaged: undefined,
			});
			updateDebts(controllerContext, {
				getAll: undefined,
				getAllPeer: undefined,
				getPeersPaged: undefined,
				getByPeerPaged: (controller) => controller.invalidate(currDebt.peerId),
				get: (controller) => controller.remove(updateObject.id),
				getIntentions: (controller) => {
					Iif (result.reverseRemoved) {
						return;
					}
					// We may or may not know the parameters of counterparty debt
					// Invalidating intentions might be a good idea
					controller.invalidate();
				},
			});
		},
	mutateToastOptions:
		({ t }) =>
		(variablesSet) => ({
			text: t("toasts.removeDebt.mutate", {
				ns: "debts",
				debtsAmount: variablesSet.length,
			}),
		}),
	successToastOptions:
		({ t }) =>
		(_, variablesSet) => ({
			text: t("toasts.removeDebt.success", {
				ns: "debts",
				debtsAmount: variablesSet.length,
			}),
		}),
	errorToastOptions:
		({ t }) =>
		(errors) => ({
			text: t("toasts.removeDebt.error", {
				ns: "debts",
				debtsAmount: errors.length,
				errors,
			}),
		}),
};