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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | 193x 6x 6x 6x 6x 6x 193x 6x 193x 4x 4x 4x 4x 4x 193x 193x 1x 1x 193x 1x 1x 1x 1x 193x 9x 9x 5x 4x 4x | import type { ForeignPeer } from "~app/trpc-types";
import type { PeerId } from "~db/ids";
import type {
ControllerContext,
ControllerWith,
SnapshotFn,
UpdateFn,
} from "../../types";
import {
applyUpdateFnWithRevert,
applyWithRevert,
getAllInputs,
getUpdatedData,
withRef,
} from "../utils";
type Controller = ControllerWith<{
procedure: ControllerContext["trpc"]["peers"]["getForeign"];
}>;
type OwnPeer = Exclude<ForeignPeer, { remoteId: string }>;
const update =
({ queryClient, procedure }: Controller, peerId: PeerId) =>
(updater: UpdateFn<ForeignPeer>) =>
withRef<ForeignPeer | undefined>((ref) => {
queryClient.setQueryData(procedure.queryKey({ id: peerId }), (peer) => {
ref.current = peer;
return getUpdatedData(peer, updater);
});
}).current;
const updateOwn =
(controller: Controller, peerId: PeerId) => (updater: UpdateFn<OwnPeer>) =>
update(
controller,
peerId,
)((peer) => {
if ("remoteId" in peer) {
return peer;
}
return updater(peer);
}) as OwnPeer | undefined;
const removeOwn = ({ queryClient, procedure }: Controller, peerId: PeerId) =>
withRef<OwnPeer | undefined>((ref) => {
const currentPeer = queryClient.getQueryData(
procedure.queryKey({ id: peerId }),
);
Iif (currentPeer && "remoteId" in currentPeer) {
return;
}
ref.current = currentPeer;
void queryClient.invalidateQueries(procedure.queryFilter({ id: peerId }));
}).current;
const addOwn = ({ queryClient, procedure }: Controller, peer: OwnPeer) =>
queryClient.setQueryData(procedure.queryKey({ id: peer.id }), peer);
const invalidateForeign = ({ queryClient, procedure }: Controller) => {
const inputs = getAllInputs<"peers.getForeign">(
queryClient,
procedure.queryKey(),
);
for (const input of inputs) {
const currentPeer = queryClient.getQueryData(procedure.queryKey(input));
if (!currentPeer || !("publicName" in currentPeer)) {
void queryClient.invalidateQueries(procedure.queryFilter(input));
}
}
};
export const getController = ({ queryClient, trpc }: ControllerContext) => {
const controller = { queryClient, procedure: trpc.peers.getForeign };
return {
updateOwn: (peerId: PeerId, updater: UpdateFn<OwnPeer>) =>
updateOwn(controller, peerId)(updater),
invalidateForeign: () => invalidateForeign(controller),
};
};
export const getRevertController = ({
queryClient,
trpc,
}: ControllerContext) => {
const controller = { queryClient, procedure: trpc.peers.getForeign };
return {
updateOwn: (
peerId: PeerId,
updater: UpdateFn<OwnPeer>,
revertUpdater: SnapshotFn<OwnPeer>,
) =>
applyUpdateFnWithRevert(
updateOwn(controller, peerId),
updater,
revertUpdater,
),
removeOwn: (peerId: PeerId) =>
applyWithRevert(
() => removeOwn(controller, peerId),
(snapshot) => {
addOwn(controller, snapshot);
},
),
};
};
|