Fix consent records version coercion and cache key

Add strict numeric validation to all version filter refetch
paths and include orderBy in @connection filters to prevent
cache collisions across sort orders.

Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
Émile Ré
2026-04-28 11:57:26 +04:00
parent c23f9591a3
commit e850069b07

View File

@@ -80,7 +80,7 @@ const consentRecordsFragment = graphql`
) )
@connection( @connection(
key: "CookieBannerConsentRecordsPage_consentRecords" key: "CookieBannerConsentRecordsPage_consentRecords"
filters: ["filter"] filters: ["filter", "orderBy"]
) @required(action: THROW) { ) @required(action: THROW) {
edges { edges {
node { node {
@@ -119,13 +119,18 @@ export default function CookieBannerConsentRecordsPage({
const records = fragmentData.consentRecords.edges.map(edge => edge.node) ?? []; const records = fragmentData.consentRecords.edges.map(edge => edge.node) ?? [];
const parseVersion = (v: string): number | null => {
if (!v || !/^\d+$/.test(v)) return null;
return parseInt(v, 10);
};
const refetchFilters = (overrides: Record<string, unknown> = {}) => { const refetchFilters = (overrides: Record<string, unknown> = {}) => {
startTransition(() => { startTransition(() => {
pagination.refetch( pagination.refetch(
{ {
action: actionFilter, action: actionFilter,
visitorId: visitorIdFilter || null, visitorId: visitorIdFilter || null,
version: versionFilter ? parseInt(versionFilter, 10) : null, version: parseVersion(versionFilter),
...overrides, ...overrides,
}, },
{ fetchPolicy: "network-only" }, { fetchPolicy: "network-only" },
@@ -149,7 +154,7 @@ export default function CookieBannerConsentRecordsPage({
return; return;
} }
setVersionError(false); setVersionError(false);
refetchFilters({ version: versionFilter ? parseInt(versionFilter, 10) : null }); refetchFilters({ version: parseVersion(versionFilter) });
}; };
const refetchWithFilters: ComponentProps<typeof SortableTable>["refetch"] = ({ order }) => { const refetchWithFilters: ComponentProps<typeof SortableTable>["refetch"] = ({ order }) => {
@@ -157,7 +162,7 @@ export default function CookieBannerConsentRecordsPage({
order: { direction: order.direction, field: order.field as CookieConsentRecordOrderField }, order: { direction: order.direction, field: order.field as CookieConsentRecordOrderField },
action: actionFilter, action: actionFilter,
visitorId: visitorIdFilter || null, visitorId: visitorIdFilter || null,
version: versionFilter ? parseInt(versionFilter, 10) : null, version: parseVersion(versionFilter),
}); });
}; };