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),
};
};
|