All files / packages/mutations/src/cache/debts get-all.ts

100% Statements 25/25
100% Branches 0/0
100% Functions 17/17
100% Lines 24/24

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                                  205x 58x 58x 58x 58x 58x               205x 58x 58x 58x 2x   2x 2x               205x 45x 1x   205x 12x 12x   11x         205x       33x 33x           47x                
import type { AggregatedDebt, AggregatedDebts } from "~app/trpc-types";
import type { CurrencyCode } from "~app/utils/currency";
import { upsertInArray } from "~utils/array";
 
import type {
	ControllerContext,
	ControllerWith,
	SnapshotFn,
	UpdateFn,
} from "../../types";
import { applyUpdateFnWithRevert, getUpdatedData, withRef } from "../utils";
 
type Controller = ControllerWith<{
	procedure: ControllerContext["trpc"]["debts"]["getAll"];
}>;
 
const updateAllSums =
	({ queryClient, procedure }: Controller) =>
	(updater: UpdateFn<AggregatedDebt[]>) =>
		withRef<AggregatedDebts | undefined>((ref) => {
			queryClient.setQueryData(procedure.queryKey(), (prevDebts) => {
				ref.current = prevDebts;
				return getUpdatedData(prevDebts, (prevData) => ({
					...prevData,
					items: updater(prevData.items),
				}));
			});
		});
 
const update =
	(controller: Controller, currencyCode: CurrencyCode) =>
	(updater: UpdateFn<number>) =>
		withRef<AggregatedDebt | undefined>((ref) => {
			updateAllSums(controller)((prevData) =>
				upsertInArray<(typeof prevData)[number]>(
					prevData,
					(entry) => entry.currencyCode === currencyCode,
					(entry) => ({ ...entry, sum: updater(entry.sum) }),
					{ currencyCode, sum: 0 },
					ref,
				),
			);
		}).current?.sum;
 
const invalidate =
	({ queryClient, procedure }: Controller) =>
	() =>
		queryClient.invalidateQueries(procedure.queryFilter());
 
export const getController = ({ queryClient, trpc }: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.debts.getAll };
	return {
		update: (currencyCode: CurrencyCode, updater: UpdateFn<number>) =>
			update(controller, currencyCode)(updater),
		invalidate: invalidate(controller),
	};
};
 
export const getRevertController = ({
	queryClient,
	trpc,
}: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.debts.getAll };
	return {
		update: (
			currencyCode: CurrencyCode,
			updater: UpdateFn<number>,
			revertUpdater: SnapshotFn<number>,
		) =>
			applyUpdateFnWithRevert(
				update(controller, currencyCode),
				updater,
				revertUpdater,
			),
		invalidate: invalidate(controller),
	};
};