Skip to content

fix: enhance cache key management in useQuery#3230

Open
eduardoformiga wants to merge 1 commit intodevfrom
fix/SFS-3037-cache-busting-use-query-1
Open

fix: enhance cache key management in useQuery#3230
eduardoformiga wants to merge 1 commit intodevfrom
fix/SFS-3037-cache-busting-use-query-1

Conversation

@eduardoformiga
Copy link
Member

@eduardoformiga eduardoformiga commented Feb 25, 2026

What's the purpose of this pull request?

This PR aims to improve cache data from queries between logged-in and anonymous users.

How it works?

  • Introduced a session-based cache key suffix in useQuery to differentiate between logged-in and anonymous users.
  • This change prevents stale product data from being served when users switch session states, improving data accuracy in the application.

Problem
The SWR cache key in useQuery was only operationName + variables. Because ProductShelf variables (term, sort, selectedFacets, etc.) are the same for logged-in and logged-out users, SWR reused the same cache and showed data from the previous session (e.g. wrong prices or availability after login/logout).

Solution
The cache key now includes the authentication state:
getSessionCacheKeySuffix()
Uses the same logic as the request: getClientCacheBustingValue() from cookieCacheBusting.ts.

Resulting keys:
operationName::variables::anonymous for logged-out users
operationName::variables:: for logged-in users

When the user logs in or out, the key changes so SWR treats it as a different cache entry: it fetches again and does not reuse data from the other session.

How to test it?

Starters Deploy Preview

References

Checklist

You may erase this after checking them all 😉

PR Title and Commit Messages

  • PR title and commit messages follow the Conventional Commits specification
    • Available prefixes: feat, fix, chore, docs, style, refactor, ci and test

PR Description

  • Added a label according to the PR goal - breaking change, bug, contributing, performance, documentation..

Dependencies

  • Committed the pnpm-lock.yaml file when there were changes to the packages

Documentation

  • PR description
  • For documentation changes, ping @Mariana-Caetano to review and update (Or submit a doc request)

Summary by CodeRabbit

  • Bug Fixes

    • Improved logout flow to fully clear browser storage (including IndexedDB) and ensure a clean session on return.
    • Ensured logout triggers a reliable full-page reload when returning, preventing stale UI or data.
  • Refactor

    • Converted cache-busting to use session person ID so data refreshes correctly when switching between anonymous and logged-in states.
  • Chores

    • Added a new dependency to support IndexedDB cleanup.

- Modified the comment in the checkAndReloadIfReturnedFromLogout function to include a period for improved readability and consistency.
@eduardoformiga eduardoformiga requested a review from a team as a code owner February 25, 2026 21:18
@eduardoformiga eduardoformiga requested review from emersonlaurentino and lemagnetic and removed request for a team February 25, 2026 21:18
@coderabbitai
Copy link

coderabbitai bot commented Feb 25, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 648c34a and 2eaf5b6.

📒 Files selected for processing (1)
  • packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/useReloadAfterLogoutReturn.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/useReloadAfterLogoutReturn.ts

Walkthrough

This PR adds session-based cache-busting (switching from cookie to session person ID), introduces a reload-after-logout mechanism, cleans IndexedDB during logout via idb-keyval, ensures logout Set-Cookie headers are consumed, and wires the reload hook into app initialization.

Changes

Cohort / File(s) Summary
Dependency Addition
packages/core/package.json
Added idb-keyval ^5.1.3 for IndexedDB cleanup.
Logout Flow Enhancement
packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/OrganizationDrawer.tsx
Remove faststore_person_id from sessionStorage; dynamically import idb-keyval to delete fs::session and drop keyval-store; consume res.json() after logout to process Set-Cookie; call setReloadAfterLogoutReturn() before redirect.
Reload After Logout Hook
packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/useReloadAfterLogoutReturn.ts
New exports: RELOAD_AFTER_LOGOUT_KEY, setReloadAfterLogoutReturn(), and useReloadAfterLogoutReturn() to set a session flag and force a cache-busting full-page reload (handles fresh loads and bfcache).
App Integration
packages/core/src/pages/_app.tsx
Invoked useReloadAfterLogoutReturn() during app initialization.
Session Cache-Busting Foundation
packages/core/src/sdk/sessionAuthState.ts
New module: setCacheBustingSource() and getSessionPersonId() to expose current session person ID at call time.
Session Cache Registration
packages/core/src/sdk/session/index.ts
Registers session person ID getter with cache-busting system via setCacheBustingSource.
Cache-Busting Utility Refactor
packages/core/src/utils/cookieCacheBusting.ts
Replaced cookie-based detection with session person ID; renamed storage key to STORAGE_KEY_PERSON_ID and adapted getters/setters/comparisons accordingly.
Query Layer Session Awareness
packages/core/src/sdk/graphql/useQuery.ts
Added getSessionCacheKeySuffix and appended session-derived suffix to SWR keys so caches are separated per session state.
Cache Busting Comment
packages/core/src/sdk/graphql/request.ts
Updated comment to reflect cache-busting based on session person ID rather than cookie.
Tests Updated
packages/core/test/utils/cookieCacheBusting.test.ts
Tests switched from cookie mocks to session-based mocks, using getSessionPersonId and STORAGE_KEY_PERSON_ID; adjusted assertions and helpers.
Minor
packages/core/src/sdk/graphql/request.ts
Documentation-only comment change describing new cache-busting source.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant App as React App
    participant API as Logout API
    participant Browser as Browser Storage<br/>(sessionStorage, IndexedDB)
    participant SWR as SWR Cache
    participant Return as Return Page Load

    User->>App: Click Logout
    App->>Browser: setReloadAfterLogoutReturn() (set sessionStorage flag)
    App->>API: POST /logout
    API-->>App: 200 OK + Set-Cookie
    App->>App: await res.json() (consume body to process Set-Cookie)
    App->>Browser: Clear sessionStorage (cookies, faststore_person_id)
    App->>Browser: import idb-keyval, delete 'fs::session' key, delete 'keyval-store' DB
    App->>Browser: window.location.replace(logout_url)
    User->>Return: Return to site (fresh load or bfcache)
    Return->>Browser: Check sessionStorage flag
    Return->>Browser: Clear flag, call forceRefreshWithoutCache()
    Return->>Return: window.location.replace(url + ts)
    Return->>SWR: Requests use new session-based cache key
    SWR-->>Return: Fresh data for current session
    Return->>User: Page fully refreshed
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • #3195 — Overlaps with logout/session cleanup and IndexedDB deletion via idb-keyval.
  • #3189 — Modifies the same logout flow (OrganizationDrawer) and returnUrl handling.
  • #3182 — Related browser storage and logout clearing changes.

Suggested labels

enhancement

Suggested reviewers

  • lemagnetic
  • emersonlaurentino
  • lariciamota

Poem

🔁 We set a flag, then say goodbye,
Clearing stores where secrets lie,
A tiny timestamp wakes the site,
Fresh session loads, and data right,
Caches reset — welcome new sky.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main objective: enhancing cache key management in useQuery to differentiate between logged-in and anonymous user sessions.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/SFS-3037-cache-busting-use-query-1

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@eduardoformiga eduardoformiga changed the title fix: update comment for clarity in logout reload logic fix: enhance cache key management in useQuery Feb 25, 2026
@codesandbox-ci
Copy link

codesandbox-ci bot commented Feb 25, 2026

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (4)
packages/core/src/utils/cookieCacheBusting.ts (1)

104-111: clearStorage() is called on every render via the SWR key function — worth noting it's a no-op after the first call but adds repeated storage access.

getClientCacheBustingValue is invoked by getSessionCacheKeySuffix in useQuery.ts, which runs on every SWR key evaluation (i.e., every render). When the user is not logged in, clearStorage() is called each time. Since removeItem on a non-existent key is a no-op, this is functionally safe but generates unnecessary storage churn on every render.

Consider short-circuiting early if already cleared, or moving the cleanup to a one-time effect.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/utils/cookieCacheBusting.ts` around lines 104 - 111, The
function getClientCacheBustingValue currently calls clearStorage() on every
render when getPersonId() returns null; to avoid repeated storage access, add a
short-circuit (e.g., a module-level boolean like storageCleared) that is checked
before calling clearStorage() and set to true after the first call, or move the
cleanup to a one-time effect in the consumer (getSessionCacheKeySuffix /
useQuery.ts); update getClientCacheBustingValue to check the flag before calling
clearStorage() so subsequent calls are no-ops without touching storage
repeatedly.
packages/core/src/sdk/graphql/useQuery.ts (1)

22-28: getSessionCacheKeySuffix calls getClientCacheBustingValue, which has storage side effects on every SWR key evaluation.

When the user is logged out, each SWR key evaluation triggers clearStorage() inside getClientCacheBustingValue. While benign (removeItem is idempotent), it's worth knowing this runs on every render cycle for every useQuery call. The impact is low but consider memoizing or using a lightweight flag to avoid redundant storage access in the hot path.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/sdk/graphql/useQuery.ts` around lines 22 - 28,
getSessionCacheKeySuffix currently calls getClientCacheBustingValue on every
evaluation causing repeated storage side-effects; change
getSessionCacheKeySuffix to cache the computed suffix in a module-level variable
(or a memo flag) so that after the first browser-side call it returns the cached
suffix ('', value, or 'anonymous') thereafter, still preserving the server check
(typeof window === 'undefined') and the fallback logic; reference
getSessionCacheKeySuffix and getClientCacheBustingValue when implementing the
cache to avoid repeated clearStorage/removeItem calls in hot paths.
packages/core/src/sdk/sessionAuthState.ts (1)

6-6: Consider exporting PersonIdGetter for type-safe call sites.

Callers passing a function to setCacheBustingSource have to manually match the signature or rely on inference. Exporting the type makes the contract explicit and improves DX.

-type PersonIdGetter = () => string | null
+export type PersonIdGetter = () => string | null
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/sdk/sessionAuthState.ts` at line 6, Export the
PersonIdGetter type so callers can import it and get a typed signature for
functions passed to setCacheBustingSource: change the local alias declaration to
an exported type (e.g. "export type PersonIdGetter = () => string | null") and
ensure any module-level exports (e.g. index/barrel) include PersonIdGetter so
consumer code can import it and annotate the parameter for
setCacheBustingSource.
packages/core/src/pages/_app.tsx (1)

9-9: useReloadAfterLogoutReturn is now a global app concern — consider relocating it out of OrganizationDrawer.

The hook is imported from deep inside OrganizationDrawer/, but it's wired at the top-level _app.tsx. This placement suggests it belongs in a more general location, e.g., src/sdk/ or src/hooks/, to reflect its app-wide scope and avoid misleading coupling to the drawer component.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/pages/_app.tsx` at line 9, The hook
useReloadAfterLogoutReturn is imported into the top-level _app.tsx but
implemented deep in OrganizationDrawer, so move it to a global location (e.g.,
src/hooks/useReloadAfterLogoutReturn.ts or
src/sdk/useReloadAfterLogoutReturn.ts) and update exports/imports accordingly;
specifically, extract the implementation from OrganizationDrawer's folder into
the new file, export the hook from there, update _app.tsx to import from the new
module name, and update OrganizationDrawer (and any other files) to import the
hook from the new global path to avoid misleading coupling.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/OrganizationDrawer.tsx`:
- Around line 60-75: The outer try is swallowing errors from the first cleanup
step and preventing the subsequent IndexedDB deletion (new Promise deleting
'keyval-store') from running; split the logic into two guarded blocks so each
step runs and failures are handled independently: wrap the idb-keyval import and
await del('fs::session') in its own try/catch (referencing the dynamic import
and del call), then always run the IndexedDB deletion logic (referencing
window.indexedDB, idb.deleteDatabase('keyval-store') and the
onsuccess/onerror/onblocked resolve handlers) in a separate try/catch so that an
error in the first step won’t skip deleting 'keyval-store'.

In `@packages/core/src/pages/_app.tsx`:
- Around line 28-29: The conditional call to the hook useScrollRestoration (via
storeConfig.experimental?.scrollRestoration && useScrollRestoration()) violates
the Rules of Hooks; change the call site to call useScrollRestoration
unconditionally next to useReloadAfterLogoutReturn(), and move the feature flag
check into the hook implementation of useScrollRestoration so the hook returns
early when storeConfig.experimental?.scrollRestoration is falsy. Ensure
useScrollRestoration contains the guard (early return) and any side-effects only
run when the flag is enabled.

In `@packages/core/src/sdk/graphql/request.ts`:
- Line 32: Fix the typo in the comment that reads "Get cache busting value based
person?.id from session" by inserting the missing preposition to read "Get cache
busting value based on person?.id from session" so the comment referencing
person?.id and session in request.ts is grammatically correct.

---

Nitpick comments:
In `@packages/core/src/pages/_app.tsx`:
- Line 9: The hook useReloadAfterLogoutReturn is imported into the top-level
_app.tsx but implemented deep in OrganizationDrawer, so move it to a global
location (e.g., src/hooks/useReloadAfterLogoutReturn.ts or
src/sdk/useReloadAfterLogoutReturn.ts) and update exports/imports accordingly;
specifically, extract the implementation from OrganizationDrawer's folder into
the new file, export the hook from there, update _app.tsx to import from the new
module name, and update OrganizationDrawer (and any other files) to import the
hook from the new global path to avoid misleading coupling.

In `@packages/core/src/sdk/graphql/useQuery.ts`:
- Around line 22-28: getSessionCacheKeySuffix currently calls
getClientCacheBustingValue on every evaluation causing repeated storage
side-effects; change getSessionCacheKeySuffix to cache the computed suffix in a
module-level variable (or a memo flag) so that after the first browser-side call
it returns the cached suffix ('', value, or 'anonymous') thereafter, still
preserving the server check (typeof window === 'undefined') and the fallback
logic; reference getSessionCacheKeySuffix and getClientCacheBustingValue when
implementing the cache to avoid repeated clearStorage/removeItem calls in hot
paths.

In `@packages/core/src/sdk/sessionAuthState.ts`:
- Line 6: Export the PersonIdGetter type so callers can import it and get a
typed signature for functions passed to setCacheBustingSource: change the local
alias declaration to an exported type (e.g. "export type PersonIdGetter = () =>
string | null") and ensure any module-level exports (e.g. index/barrel) include
PersonIdGetter so consumer code can import it and annotate the parameter for
setCacheBustingSource.

In `@packages/core/src/utils/cookieCacheBusting.ts`:
- Around line 104-111: The function getClientCacheBustingValue currently calls
clearStorage() on every render when getPersonId() returns null; to avoid
repeated storage access, add a short-circuit (e.g., a module-level boolean like
storageCleared) that is checked before calling clearStorage() and set to true
after the first call, or move the cleanup to a one-time effect in the consumer
(getSessionCacheKeySuffix / useQuery.ts); update getClientCacheBustingValue to
check the flag before calling clearStorage() so subsequent calls are no-ops
without touching storage repeatedly.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8318044 and 648c34a.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml and included by none
📒 Files selected for processing (10)
  • packages/core/package.json
  • packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/OrganizationDrawer.tsx
  • packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/useReloadAfterLogoutReturn.ts
  • packages/core/src/pages/_app.tsx
  • packages/core/src/sdk/graphql/request.ts
  • packages/core/src/sdk/graphql/useQuery.ts
  • packages/core/src/sdk/session/index.ts
  • packages/core/src/sdk/sessionAuthState.ts
  • packages/core/src/utils/cookieCacheBusting.ts
  • packages/core/test/utils/cookieCacheBusting.test.ts

Comment on lines +60 to +75
try {
if ('indexedDB' in window) {
const { del } = await import('idb-keyval')
await del('fs::session').catch(() => {})
}

const idb = window.indexedDB
if (idb) {
await new Promise<void>((resolve) => {
const req = idb.deleteDatabase('keyval-store')
req.onsuccess = () => resolve()
req.onerror = () => resolve()
req.onblocked = () => resolve()
})
}
} catch {}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Separate the guarded cleanup steps so DB deletion always runs.

With one outer try, any failure in the first step skips deleteDatabase('keyval-store'), which can leave stale IndexedDB state after logout.

💡 Proposed fix
-  try {
-    if ('indexedDB' in window) {
-      const { del } = await import('idb-keyval')
-      await del('fs::session').catch(() => {})
-    }
-
-    const idb = window.indexedDB
-    if (idb) {
-      await new Promise<void>((resolve) => {
-        const req = idb.deleteDatabase('keyval-store')
-        req.onsuccess = () => resolve()
-        req.onerror = () => resolve()
-        req.onblocked = () => resolve()
-      })
-    }
-  } catch {}
+  if ('indexedDB' in window) {
+    try {
+      const { del } = await import('idb-keyval')
+      await del('fs::session')
+    } catch {}
+
+    try {
+      const idb = window.indexedDB
+      if (idb) {
+        await new Promise<void>((resolve) => {
+          const req = idb.deleteDatabase('keyval-store')
+          req.onsuccess = () => resolve()
+          req.onerror = () => resolve()
+          req.onblocked = () => resolve()
+        })
+      }
+    } catch {}
+  }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
try {
if ('indexedDB' in window) {
const { del } = await import('idb-keyval')
await del('fs::session').catch(() => {})
}
const idb = window.indexedDB
if (idb) {
await new Promise<void>((resolve) => {
const req = idb.deleteDatabase('keyval-store')
req.onsuccess = () => resolve()
req.onerror = () => resolve()
req.onblocked = () => resolve()
})
}
} catch {}
if ('indexedDB' in window) {
try {
const { del } = await import('idb-keyval')
await del('fs::session')
} catch {}
try {
const idb = window.indexedDB
if (idb) {
await new Promise<void>((resolve) => {
const req = idb.deleteDatabase('keyval-store')
req.onsuccess = () => resolve()
req.onerror = () => resolve()
req.onblocked = () => resolve()
})
}
} catch {}
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@packages/core/src/components/account/MyAccountDrawer/OrganizationDrawer/OrganizationDrawer.tsx`
around lines 60 - 75, The outer try is swallowing errors from the first cleanup
step and preventing the subsequent IndexedDB deletion (new Promise deleting
'keyval-store') from running; split the logic into two guarded blocks so each
step runs and failures are handled independently: wrap the idb-keyval import and
await del('fs::session') in its own try/catch (referencing the dynamic import
and del call), then always run the IndexedDB deletion logic (referencing
window.indexedDB, idb.deleteDatabase('keyval-store') and the
onsuccess/onerror/onblocked resolve handlers) in a separate try/catch so that an
error in the first step won’t skip deleting 'keyval-store'.

Comment on lines +28 to 29
useReloadAfterLogoutReturn()
storeConfig.experimental?.scrollRestoration && useScrollRestoration()
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

useScrollRestoration is called conditionally — pre-existing Rules of Hooks violation.

Line 29 (storeConfig.experimental?.scrollRestoration && useScrollRestoration()) conditionally calls a hook, which violates the Rules of Hooks. While this is pre-existing and not introduced by this PR, the new useReloadAfterLogoutReturn() call on line 28 is correctly unconditional. Consider fixing the adjacent violation to avoid subtle bugs during React reconciliation.

🛠️ Suggested fix for the conditional hook call

Move the condition inside the hook itself, or call unconditionally:

-  storeConfig.experimental?.scrollRestoration && useScrollRestoration()
+  useScrollRestoration()

Then guard inside useScrollRestoration:

// inside useScrollRestoration
if (!storeConfig.experimental?.scrollRestoration) return
// ... rest of the hook
🧰 Tools
🪛 Biome (2.4.4)

[error] 29-29: This hook is being called conditionally, but all hooks must be called in the exact same order in every component render.

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/pages/_app.tsx` around lines 28 - 29, The conditional call
to the hook useScrollRestoration (via
storeConfig.experimental?.scrollRestoration && useScrollRestoration()) violates
the Rules of Hooks; change the call site to call useScrollRestoration
unconditionally next to useReloadAfterLogoutReturn(), and move the feature flag
check into the hook implementation of useScrollRestoration so the hook returns
early when storeConfig.experimental?.scrollRestoration is falsy. Ensure
useScrollRestoration contains the guard (early return) and any side-effects only
run when the flag is enabled.

options?: RequestOptions
) => {
// Get cache busting value based on cookie changes
// Get cache busting value based person?.id from session
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Typo in comment — missing "on".

-  // Get cache busting value based person?.id from session
+  // Get cache busting value based on person?.id from session
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Get cache busting value based person?.id from session
// Get cache busting value based on person?.id from session
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/core/src/sdk/graphql/request.ts` at line 32, Fix the typo in the
comment that reads "Get cache busting value based person?.id from session" by
inserting the missing preposition to read "Get cache busting value based on
person?.id from session" so the comment referencing person?.id and session in
request.ts is grammatically correct.

@eduardoformiga eduardoformiga force-pushed the fix/SFS-3037-cache-busting-use-query-1 branch from 2eaf5b6 to 648c34a Compare February 25, 2026 22:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant