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:
@@ -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),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user