All files / packages/mutations/src/cache/user-settings get.ts

56.52% Statements 13/23
100% Branches 0/0
40% Functions 6/15
56.52% Lines 13/23

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                                        22x       22x           22x 2x 3x 3x 3x 3x       22x               22x       2x 2x       2x                    
import type { UserSettings } from "~app/trpc-types";
 
import type {
	ControllerContext,
	ControllerWith,
	SnapshotFn,
	UpdateFn,
} from "../../types";
import {
	applyUpdateFnWithRevert,
	applyWithRevert,
	getUpdatedData,
	withRef,
} from "../utils";
 
type Controller = ControllerWith<{
	procedure: ControllerContext["trpc"]["userSettings"]["get"];
}>;
 
const invalidateUserSettings =
	({ queryClient, procedure }: Controller) =>
	() =>
		queryClient.invalidateQueries(procedure.queryFilter());
 
const upsert = (
	{ queryClient, procedure }: Controller,
	userSettings: UserSettings,
) => queryClient.setQueryData(procedure.queryKey(), userSettings);
 
const update =
	({ queryClient, procedure }: Controller) =>
	(updater: UpdateFn<UserSettings>) =>
		withRef<UserSettings | undefined>((ref) => {
			queryClient.setQueryData(procedure.queryKey(), (userSettings) => {
				ref.current = userSettings;
				return getUpdatedData(userSettings, updater);
			});
		}).current;
 
export const getController = ({ queryClient, trpc }: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.userSettings.get };
	return {
		update: (updater: UpdateFn<UserSettings>) => update(controller)(updater),
		upsert: (user: UserSettings) => upsert(controller, user),
	};
};
 
export const getRevertController = ({
	queryClient,
	trpc,
}: ControllerContext) => {
	const controller = { queryClient, procedure: trpc.userSettings.get };
	return {
		update: (
			updater: UpdateFn<UserSettings>,
			revertUpdater: SnapshotFn<UserSettings>,
		) => applyUpdateFnWithRevert(update(controller), updater, revertUpdater),
		upsert: (userSettings: UserSettings) =>
			applyWithRevert(
				() => upsert(controller, userSettings),
				() => {
					invalidateUserSettings(controller);
				},
			),
	};
};