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

89.28% Statements 25/28
100% Branches 0/0
84.21% Functions 16/19
89.28% Lines 25/28

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                                          205x 36x 41x 41x 41x 41x       205x 23x   205x 6x 6x 6x     205x 34x 34x   20x 11x   3x         205x       28x 28x           16x           12x 12x   3x                        
import type { Debt } from "~app/trpc-types";
import type { DebtId } from "~db/ids";
 
import type {
	ControllerContext,
	ControllerWith,
	SnapshotFn,
	UpdateFn,
} from "../../types";
import {
	applyUpdateFnWithRevert,
	applyWithRevert,
	getUpdatedData,
	withRef,
} from "../utils";
 
type Controller = ControllerWith<{
	procedure: ControllerContext["trpc"]["debts"]["get"];
}>;
 
const update =
	({ queryClient, procedure }: Controller, debtId: DebtId) =>
	(updater: UpdateFn<Debt>) =>
		withRef<Debt | undefined>((ref) => {
			queryClient.setQueryData(procedure.queryKey({ id: debtId }), (debt) => {
				ref.current = debt;
				return getUpdatedData(debt, updater);
			});
		}).current;
 
const upsert = ({ queryClient, procedure }: Controller, debt: Debt) =>
	queryClient.setQueryData(procedure.queryKey({ id: debt.id }), debt);
 
const remove = ({ queryClient, procedure }: Controller, debtId: DebtId) =>
	withRef<Debt | undefined>((ref) => {
		ref.current = queryClient.getQueryData(procedure.queryKey({ id: debtId }));
		void queryClient.invalidateQueries(procedure.queryFilter({ id: debtId }));
	}).current;
 
export const getController = ({ queryClient, trpc }: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.debts.get };
	return {
		update: (debtId: DebtId, updater: UpdateFn<Debt>) =>
			update(controller, debtId)(updater),
		add: (debt: Debt) => upsert(controller, debt),
		remove: (debtId: DebtId) => {
			remove(controller, debtId);
		},
	};
};
 
export const getRevertController = ({
	queryClient,
	trpc,
}: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.debts.get };
	return {
		update: (
			debtId: DebtId,
			updater: UpdateFn<Debt>,
			revertUpdater: SnapshotFn<Debt>,
		) =>
			applyUpdateFnWithRevert(
				update(controller, debtId),
				updater,
				revertUpdater,
			),
		add: (debt: Debt) =>
			applyWithRevert(
				() => upsert(controller, debt),
				() => {
					remove(controller, debt.id);
				},
			),
		remove: (debtId: DebtId) =>
			applyWithRevert(
				() => remove(controller, debtId),
				(snapshot) => {
					upsert(controller, snapshot);
				},
			),
	};
};