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

85.71% Statements 24/28
100% Branches 0/0
78.94% Functions 15/19
85.71% Lines 24/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                                          193x 8x 11x 11x 11x 11x       193x 3x   193x 2x 2x 2x     193x 3x 3x   1x 2x         193x       9x 9x           7x                         2x 2x   1x          
import type { Peer } from "~app/trpc-types";
import type { PeerId } from "~db/ids";
 
import type {
	ControllerContext,
	ControllerWith,
	SnapshotFn,
	UpdateFn,
} from "../../types";
import {
	applyUpdateFnWithRevert,
	applyWithRevert,
	getUpdatedData,
	withRef,
} from "../utils";
 
type Controller = ControllerWith<{
	procedure: ControllerContext["trpc"]["peers"]["get"];
}>;
 
const update =
	({ queryClient, procedure }: Controller, peerId: PeerId) =>
	(updater: UpdateFn<Peer>) =>
		withRef<Peer | undefined>((ref) => {
			queryClient.setQueryData(procedure.queryKey({ id: peerId }), (peer) => {
				ref.current = peer;
				return getUpdatedData(peer, updater);
			});
		}).current;
 
const upsert = ({ queryClient, procedure }: Controller, peer: Peer) =>
	queryClient.setQueryData(procedure.queryKey({ id: peer.id }), peer);
 
const remove = ({ queryClient, procedure }: Controller, peerId: PeerId) =>
	withRef<Peer | undefined>((ref) => {
		ref.current = queryClient.getQueryData(procedure.queryKey({ id: peerId }));
		void queryClient.invalidateQueries(procedure.queryFilter({ id: peerId }));
	}).current;
 
export const getController = ({ queryClient, trpc }: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.peers.get };
	return {
		update: (peerId: PeerId, updater: UpdateFn<Peer>) =>
			update(controller, peerId)(updater),
		add: (peer: Peer) => upsert(controller, peer),
		remove: (peerId: PeerId) => remove(controller, peerId),
	};
};
 
export const getRevertController = ({
	queryClient,
	trpc,
}: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.peers.get };
	return {
		update: (
			peerId: PeerId,
			updater: UpdateFn<Peer>,
			revertUpdater: SnapshotFn<Peer>,
		) =>
			applyUpdateFnWithRevert(
				update(controller, peerId),
				updater,
				revertUpdater,
			),
		add: (peer: Peer) =>
			applyWithRevert(
				() => upsert(controller, peer),
				() => {
					remove(controller, peer.id);
				},
			),
		remove: (peerId: PeerId) =>
			applyWithRevert(
				() => remove(controller, peerId),
				(snapshot) => {
					upsert(controller, snapshot);
				},
			),
	};
};