@eintrek/erp-shell 0.1.20 → 0.1.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -2
- package/dist/hooks/use-org-side-effects.d.ts +14 -3
- package/dist/index.esm.js +68 -15
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +68 -15
- package/dist/index.js.map +1 -1
- package/dist/navigation/navigation-data-helpers.d.ts +3 -1
- package/dist/navigation/organization-switcher.d.ts +5 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -386,18 +386,32 @@ function useInvalidateQueriesOnOrgChange(organizationId) {
|
|
|
386
386
|
}, [organizationId, queryClient]);
|
|
387
387
|
}
|
|
388
388
|
/**
|
|
389
|
-
*
|
|
390
|
-
*
|
|
391
|
-
*
|
|
389
|
+
* Clear the selected organization when the signed-in user actually changes.
|
|
390
|
+
*
|
|
391
|
+
* Only a transition between two KNOWN users counts. An empty or absent id
|
|
392
|
+
* means "not resolved yet" — it is not a different person, and treating it as
|
|
393
|
+
* one is what made this fire on every cold load: hosts derive the id as
|
|
394
|
+
* `session?.user?.id ?? ""`, so the first effect run saw `""`, and the moment
|
|
395
|
+
* NextAuth resolved, `"" !== "abc"` looked like a user switch and wiped the
|
|
396
|
+
* org. Downstream that nulls organizationId, which re-keys every org-scoped
|
|
397
|
+
* query and remounts the page — visible as settings snapping back to their
|
|
398
|
+
* defaults.
|
|
399
|
+
*
|
|
400
|
+
* Remembering the last known id (rather than the last value seen) keeps the
|
|
401
|
+
* real case working: user A signs out — id goes empty, ignored — user B signs
|
|
402
|
+
* in, A !== B, and the org is cleared.
|
|
392
403
|
*/
|
|
393
404
|
function useClearOrgOnUserChange(userId, clearOrg) {
|
|
394
|
-
const
|
|
405
|
+
const lastKnownUserIdRef = React.useRef(null);
|
|
395
406
|
React.useEffect(() => {
|
|
396
|
-
|
|
397
|
-
|
|
407
|
+
const next = userId ?? "";
|
|
408
|
+
if (next === "")
|
|
409
|
+
return;
|
|
410
|
+
const previous = lastKnownUserIdRef.current;
|
|
411
|
+
lastKnownUserIdRef.current = next;
|
|
412
|
+
if (previous !== null && previous !== next) {
|
|
398
413
|
Promise.resolve(clearOrg(null)).catch(console.error);
|
|
399
414
|
}
|
|
400
|
-
previousUserIdRef.current = userId ?? null;
|
|
401
415
|
}, [userId, clearOrg]);
|
|
402
416
|
}
|
|
403
417
|
|
|
@@ -697,8 +711,15 @@ function getActiveSubModule(pathname, modules) {
|
|
|
697
711
|
}
|
|
698
712
|
return null;
|
|
699
713
|
}
|
|
700
|
-
/** Prepend `code` (org code) to a relative URL so `/sales` → `/O25.../sales`.
|
|
714
|
+
/** Prepend `code` (org code) to a relative URL so `/sales` → `/O25.../sales`.
|
|
715
|
+
* Absolute `http(s)://` URLs are left intact; optional `{code}` placeholder is replaced.
|
|
716
|
+
*/
|
|
701
717
|
function buildUrlWithCode(code, url) {
|
|
718
|
+
if (/^https?:\/\//i.test(url)) {
|
|
719
|
+
if (!code)
|
|
720
|
+
return url.split("{code}").join("");
|
|
721
|
+
return url.split("{code}").join(code);
|
|
722
|
+
}
|
|
702
723
|
if (!code)
|
|
703
724
|
return url;
|
|
704
725
|
const cleanUrl = url.startsWith("/") ? url.slice(1) : url;
|
|
@@ -845,7 +866,7 @@ function NavUser({ organization, avatarSrc, profileHref, selectOrganizationHref
|
|
|
845
866
|
{ code: "zh", label: "中文" },
|
|
846
867
|
{ code: "ja", label: "日本語" },
|
|
847
868
|
].map(({ code, label }) => (jsxRuntime.jsxs("button", { onClick: () => handleLanguageChange(code), className: "flex w-full items-center gap-3 px-3 py-2 text-sm text-sidebar-foreground hover:bg-sidebar-accent rounded-md transition-colors", children: [jsxRuntime.jsx("span", { className: "flex-1 text-left", children: label }), organization?.language === code && (jsxRuntime.jsx("div", { className: "h-2 w-2 rounded-full bg-primary" }))] }, code))) }))] }), profileHref && (jsxRuntime.jsxs("button", { onClick: handleProfile, className: "flex w-full items-center gap-3 px-3 py-2.5 text-sm text-sidebar-foreground hover:bg-sidebar-accent rounded-md transition-colors", children: [jsxRuntime.jsx(lucideReact.User, { className: "h-4 w-4" }), jsxRuntime.jsx("span", { className: "flex-1 text-left", children: "\u0E02\u0E49\u0E2D\u0E21\u0E39\u0E25\u0E2A\u0E48\u0E27\u0E19\u0E15\u0E31\u0E27" })] })), jsxRuntime.jsxs("button", { onClick: handleSelectOrganization, className: "flex w-full items-center gap-3 px-3 py-2.5 text-sm text-sidebar-foreground hover:bg-sidebar-accent rounded-md transition-colors", children: [jsxRuntime.jsx(lucideReact.Building2, { className: "h-4 w-4" }), jsxRuntime.jsx("span", { className: "flex-1 text-left", children: "\u0E40\u0E25\u0E37\u0E2D\u0E01\u0E18\u0E38\u0E23\u0E01\u0E34\u0E08" })] }), jsxRuntime.jsx("button", { onClick: handleSignOut, disabled: isSigningOut, className: "flex w-full items-center gap-3 px-3 py-2.5 text-sm text-sidebar-foreground hover:bg-sidebar-accent rounded-md transition-colors disabled:opacity-50 disabled:cursor-not-allowed mt-1", children: isSigningOut ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(lucideReact.Loader2, { className: "h-4 w-4 animate-spin" }), jsxRuntime.jsx("span", { className: "flex-1 text-left", children: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E2D\u0E2D\u0E01\u0E08\u0E32\u0E01\u0E23\u0E30\u0E1A\u0E1A..." })] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(lucideReact.LogOut, { className: "h-4 w-4" }), jsxRuntime.jsx("span", { className: "flex-1 text-left", children: "\u0E2D\u0E2D\u0E01\u0E08\u0E32\u0E01\u0E23\u0E30\u0E1A\u0E1A" })] })) })] })] })) : null;
|
|
848
|
-
return (jsxRuntime.jsx("div", { className: "p-2", children: jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsxs("button", { ref: buttonRef, onClick: () => setIsOpen(!isOpen), className: "flex w-full items-center gap-2 p-2 rounded-md transition-colors", children: [jsxRuntime.jsxs(erpTheme.Avatar, { className: "h-8 w-8 rounded-lg", children: [jsxRuntime.jsx(erpTheme.AvatarImage, { src: user.avatar, alt: user.name }), jsxRuntime.jsx(erpTheme.AvatarFallback, { className: "rounded-lg bg-[#E4525F] text-sidebar-primary-foreground w-8 h-8", children: getInitials(user.name) })] }), jsxRuntime.jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [jsxRuntime.jsx("span", { className: "truncate font-medium", title: user.name, children: user.name }), jsxRuntime.jsx("span", { className: "truncate text-xs text-sidebar-foreground/70", title: user.email, children: user.email })] }), jsxRuntime.jsx(lucideReact.ChevronUp, { className: `ml-auto size-4 transition-transform ${isOpen ? "rotate-180" : ""}` })] }), typeof window !== "undefined" &&
|
|
869
|
+
return (jsxRuntime.jsx("div", { className: "p-2", children: jsxRuntime.jsxs("div", { className: "relative", children: [jsxRuntime.jsxs("button", { ref: buttonRef, onClick: () => setIsOpen(!isOpen), className: "flex w-full items-center gap-2 p-2 rounded-md transition-colors", children: [jsxRuntime.jsxs(erpTheme.Avatar, { className: "h-8 w-8 rounded-lg", children: [user.avatar ? (jsxRuntime.jsx(erpTheme.AvatarImage, { src: user.avatar, alt: user.name })) : null, jsxRuntime.jsx(erpTheme.AvatarFallback, { className: "rounded-lg bg-[#E4525F] text-sidebar-primary-foreground w-8 h-8", children: getInitials(user.name) })] }), jsxRuntime.jsxs("div", { className: "grid flex-1 text-left text-sm leading-tight", children: [jsxRuntime.jsx("span", { className: "truncate font-medium", title: user.name, children: user.name }), jsxRuntime.jsx("span", { className: "truncate text-xs text-sidebar-foreground/70", title: user.email, children: user.email })] }), jsxRuntime.jsx(lucideReact.ChevronUp, { className: `ml-auto size-4 transition-transform ${isOpen ? "rotate-180" : ""}` })] }), typeof window !== "undefined" &&
|
|
849
870
|
reactDom.createPortal(dropdownContent, document.body)] }) }));
|
|
850
871
|
}
|
|
851
872
|
|
|
@@ -924,6 +945,17 @@ function NavMain({ items, orgCode, closeOnNavigation = false, approvalCounts, })
|
|
|
924
945
|
}) }) }));
|
|
925
946
|
}
|
|
926
947
|
|
|
948
|
+
function OrgMark({ logoUrl, size = "md", }) {
|
|
949
|
+
const [failed, setFailed] = React.useState(false);
|
|
950
|
+
const box = size === "sm"
|
|
951
|
+
? "flex size-6 items-center justify-center rounded-md border overflow-hidden bg-background"
|
|
952
|
+
: "flex aspect-square size-8 shrink-0 items-center justify-center rounded-lg bg-sidebar-primary text-sidebar-primary-foreground overflow-hidden";
|
|
953
|
+
const icon = size === "sm" ? "size-3.5 shrink-0" : "size-4";
|
|
954
|
+
if (logoUrl && !failed) {
|
|
955
|
+
return (jsxRuntime.jsx("div", { className: erpTheme.cn(box, size === "md" && "bg-white"), children: jsxRuntime.jsx("img", { src: logoUrl, alt: "", className: "size-full object-contain p-0.5", onError: () => setFailed(true) }) }));
|
|
956
|
+
}
|
|
957
|
+
return (jsxRuntime.jsx("div", { className: box, children: jsxRuntime.jsx(lucideReact.Building2, { className: icon }) }));
|
|
958
|
+
}
|
|
927
959
|
function OrganizationSwitcher({ activeOrganization, isContextLoading = false, organizations, isLoadingOrgs = false, setOrganizationCookie, registerOrganizationHref = "/register-organization", className, }) {
|
|
928
960
|
const { isMobile } = useSidebarToggle();
|
|
929
961
|
const router = navigation.useRouter();
|
|
@@ -969,10 +1001,10 @@ function OrganizationSwitcher({ activeOrganization, isContextLoading = false, or
|
|
|
969
1001
|
return (jsxRuntime.jsx(SidebarMenu, { className: className, children: jsxRuntime.jsx(SidebarMenuItem, { children: jsxRuntime.jsxs("div", { className: "flex items-center gap-2 p-2", children: [jsxRuntime.jsx(erpTheme.Skeleton, { className: "size-8 rounded-lg" }), jsxRuntime.jsx(erpTheme.Skeleton, { className: "h-4 w-24" })] }) }) }));
|
|
970
1002
|
}
|
|
971
1003
|
if (organizations.length <= 1) {
|
|
972
|
-
return (jsxRuntime.jsx(SidebarMenu, { className: className, children: jsxRuntime.jsx(SidebarMenuItem, { children: jsxRuntime.jsxs("div", { className: "flex items-center gap-2 p-2", children: [jsxRuntime.jsx(
|
|
1004
|
+
return (jsxRuntime.jsx(SidebarMenu, { className: className, children: jsxRuntime.jsx(SidebarMenuItem, { children: jsxRuntime.jsxs("div", { className: "flex items-center gap-2 p-2", children: [jsxRuntime.jsx(OrgMark, { logoUrl: activeOrganization?.logoUrl }), jsxRuntime.jsx("span", { className: "truncate font-semibold text-sm min-w-0 flex-1", children: activeOrganization?.name || "ไม่มีองค์กร" })] }) }) }));
|
|
973
1005
|
}
|
|
974
|
-
return (jsxRuntime.jsx(SidebarMenu, { className: className, children: jsxRuntime.jsx(SidebarMenuItem, { children: jsxRuntime.jsxs(erpTheme.DropdownMenu, { children: [jsxRuntime.jsx(erpTheme.DropdownMenuTrigger, { asChild: true, children: jsxRuntime.jsxs(SidebarMenuButton, { size: "lg", className: "data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground", children: [jsxRuntime.jsx(
|
|
975
|
-
"bg-accent"), children: [jsxRuntime.jsx(
|
|
1006
|
+
return (jsxRuntime.jsx(SidebarMenu, { className: className, children: jsxRuntime.jsx(SidebarMenuItem, { children: jsxRuntime.jsxs(erpTheme.DropdownMenu, { children: [jsxRuntime.jsx(erpTheme.DropdownMenuTrigger, { asChild: true, children: jsxRuntime.jsxs(SidebarMenuButton, { size: "lg", className: "data-[state=open]:bg-sidebar-accent data-[state=open]:text-sidebar-accent-foreground", children: [jsxRuntime.jsx(OrgMark, { logoUrl: activeOrganization?.logoUrl }), jsxRuntime.jsx("span", { className: "truncate font-semibold text-sm flex-1 min-w-0 text-left", children: activeOrganization?.name || "เลือกองค์กร" }), isPending ? (jsxRuntime.jsx(lucideReact.Loader2, { className: "ml-auto size-4 animate-spin" })) : (jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: "ml-auto size-4" }))] }) }), jsxRuntime.jsxs(erpTheme.DropdownMenuContent, { className: "w-[--radix-dropdown-menu-trigger-width] min-w-56 rounded-lg", align: "start", side: isMobile ? "bottom" : "right", sideOffset: 4, children: [jsxRuntime.jsx(erpTheme.DropdownMenuLabel, { className: "text-xs text-muted-foreground", children: "\u0E2D\u0E07\u0E04\u0E4C\u0E01\u0E23" }), organizations.map(org => (jsxRuntime.jsxs(erpTheme.DropdownMenuItem, { onClick: () => handleOrganizationChange(org), disabled: isPending, className: erpTheme.cn("gap-2 p-2 cursor-pointer", String(activeOrganization?.id) === String(org.id) &&
|
|
1007
|
+
"bg-accent"), children: [jsxRuntime.jsx(OrgMark, { logoUrl: org.logoUrl, size: "sm" }), jsxRuntime.jsx("span", { className: "truncate", children: org.name })] }, org.id))), jsxRuntime.jsx(erpTheme.DropdownMenuSeparator, {}), jsxRuntime.jsxs(erpTheme.DropdownMenuItem, { className: "gap-2 p-2 cursor-pointer", onClick: () => router.push(registerOrganizationHref), children: [jsxRuntime.jsx("div", { className: "flex size-6 items-center justify-center rounded-md border bg-transparent", children: jsxRuntime.jsx(lucideReact.Plus, { className: "size-4" }) }), jsxRuntime.jsx("span", { className: "text-muted-foreground font-medium", children: "\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E2D\u0E07\u0E04\u0E4C\u0E01\u0E23" })] })] })] }) }) }));
|
|
976
1008
|
}
|
|
977
1009
|
|
|
978
1010
|
function SidebarHeader({ children, className }) {
|
|
@@ -1046,6 +1078,25 @@ function AppLayoutShell({ children, sidebar, loadingComponent, breadcrumb, permi
|
|
|
1046
1078
|
code,
|
|
1047
1079
|
organizations.length,
|
|
1048
1080
|
]);
|
|
1081
|
+
// Key for the content subtree. It exists so switching organizations throws
|
|
1082
|
+
// away the previous org's component state — but it must react ONLY to a real
|
|
1083
|
+
// switch. organizationId legitimately passes through null while the context
|
|
1084
|
+
// re-settles (session resolving, cookie write in flight), and keying on that
|
|
1085
|
+
// unmounted and remounted the entire page: forms lost their loaded values,
|
|
1086
|
+
// in-flight edits vanished, and settings pickers snapped back to defaults.
|
|
1087
|
+
//
|
|
1088
|
+
// Holding the last known id makes a transient null a no-op while a genuine
|
|
1089
|
+
// org-to-org switch still changes the key.
|
|
1090
|
+
const lastOrgKeyRef = React__namespace.useRef("no-org");
|
|
1091
|
+
const currentOrgKey = organizationId === null ||
|
|
1092
|
+
organizationId === undefined ||
|
|
1093
|
+
String(organizationId).trim() === ""
|
|
1094
|
+
? null
|
|
1095
|
+
: String(organizationId);
|
|
1096
|
+
if (currentOrgKey !== null) {
|
|
1097
|
+
lastOrgKeyRef.current = currentOrgKey;
|
|
1098
|
+
}
|
|
1099
|
+
const contentOrgKey = lastOrgKeyRef.current;
|
|
1049
1100
|
// ≤1024px: sidebar renders as a modal overlay (backdrop dims content). >1024px:
|
|
1050
1101
|
// sidebar is docked and the content gets a left margin to clear it.
|
|
1051
1102
|
const [isSidebarModalLayout, setIsSidebarModalLayout] = React__namespace.useState(false);
|
|
@@ -1092,7 +1143,7 @@ function AppLayoutShell({ children, sidebar, loadingComponent, breadcrumb, permi
|
|
|
1092
1143
|
const contentMargin = open && !isSidebarModalLayout ? "ml-[21.5rem]" : "";
|
|
1093
1144
|
const needsLeftGutter = !(open && !isSidebarModalLayout);
|
|
1094
1145
|
const wrap = permissionProvider ?? ((c) => c);
|
|
1095
|
-
return (jsxRuntime.jsxs("div", { className: "flex min-h-screen w-full bg-background", children: [open && (jsxRuntime.jsx("div", { className: "fixed left-0 top-0 z-50 h-screen", children: sidebar })), open && isSidebarModalLayout && (jsxRuntime.jsx("button", { type: "button", "aria-label": "\u0E1B\u0E34\u0E14\u0E40\u0E21\u0E19\u0E39", className: "fixed inset-0 z-40 bg-black/50", onClick: () => setOpen(false) })), jsxRuntime.jsx("div", { className: cx("relative flex min-w-0 flex-1 flex-col transition-all", contentMargin), children: jsxRuntime.jsxs("main", { className: "flex flex-1 flex-col min-h-screen gap-4", children: [jsxRuntime.jsxs("div", { className: "sticky top-0 z-30 shrink-0 w-full", children: [jsxRuntime.jsx(HeaderBackground, {}), jsxRuntime.jsxs("header", { className: "relative shrink-0 gap-2 py-4 h-auto min-h-[123.5px] w-full z-10", children: [jsxRuntime.jsxs("div", { className: "flex w-full items-center gap-2 px-3 sm:px-4 lg:px-6", children: [jsxRuntime.jsx(SidebarTrigger, { className: "shrink-0 text-white hover:bg-white/10" }), jsxRuntime.jsx("div", { className: "flex-1 min-w-0", children: breadcrumb })] }), jsxRuntime.jsx("div", { id: "header-title" })] })] }), jsxRuntime.jsx(React.Suspense, { fallback: jsxRuntime.jsx("div", { className: "relative z-10 min-h-[calc(100vh-8rem)]", children: jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center", children: jsxRuntime.jsxs("div", { className: "space-y-4 text-center", children: [jsxRuntime.jsx("div", { className: "mx-auto h-8 w-8 animate-spin rounded-full border-b-2 border-primary" }), jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14..." })] }) }) }), children: jsxRuntime.jsx("div", { className: cx("relative z-10 pr-6", needsLeftGutter && "pl-6"), children: wrap(children) }, `org-${
|
|
1146
|
+
return (jsxRuntime.jsxs("div", { className: "flex min-h-screen w-full bg-background", children: [open && (jsxRuntime.jsx("div", { className: "fixed left-0 top-0 z-50 h-screen", children: sidebar })), open && isSidebarModalLayout && (jsxRuntime.jsx("button", { type: "button", "aria-label": "\u0E1B\u0E34\u0E14\u0E40\u0E21\u0E19\u0E39", className: "fixed inset-0 z-40 bg-black/50", onClick: () => setOpen(false) })), jsxRuntime.jsx("div", { className: cx("relative flex min-w-0 flex-1 flex-col transition-all", contentMargin), children: jsxRuntime.jsxs("main", { className: "flex flex-1 flex-col min-h-screen gap-4", children: [jsxRuntime.jsxs("div", { className: "sticky top-0 z-30 shrink-0 w-full", children: [jsxRuntime.jsx(HeaderBackground, {}), jsxRuntime.jsxs("header", { className: "relative shrink-0 gap-2 py-4 h-auto min-h-[123.5px] w-full z-10", children: [jsxRuntime.jsxs("div", { className: "flex w-full items-center gap-2 px-3 sm:px-4 lg:px-6", children: [jsxRuntime.jsx(SidebarTrigger, { className: "shrink-0 text-white hover:bg-white/10" }), jsxRuntime.jsx("div", { className: "flex-1 min-w-0", children: breadcrumb })] }), jsxRuntime.jsx("div", { id: "header-title" })] })] }), jsxRuntime.jsx(React.Suspense, { fallback: jsxRuntime.jsx("div", { className: "relative z-10 min-h-[calc(100vh-8rem)]", children: jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center", children: jsxRuntime.jsxs("div", { className: "space-y-4 text-center", children: [jsxRuntime.jsx("div", { className: "mx-auto h-8 w-8 animate-spin rounded-full border-b-2 border-primary" }), jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "\u0E01\u0E33\u0E25\u0E31\u0E07\u0E42\u0E2B\u0E25\u0E14..." })] }) }) }), children: jsxRuntime.jsx("div", { className: cx("relative z-10 pr-6", needsLeftGutter && "pl-6"), children: wrap(children) }, `org-${contentOrgKey}`) })] }) })] }));
|
|
1096
1147
|
}
|
|
1097
1148
|
/** Local tiny classnames helper — avoids pulling clsx/tailwind-merge into
|
|
1098
1149
|
* the shell just for the layout file. Falsy values are skipped. */
|
|
@@ -1405,7 +1456,9 @@ function SessionBackedProfileCacheSeeder({ queryKey, mapper, }) {
|
|
|
1405
1456
|
if (mapped) {
|
|
1406
1457
|
const existing = queryClient.getQueryData(queryKey);
|
|
1407
1458
|
if (!existing) {
|
|
1408
|
-
|
|
1459
|
+
// updatedAt: 0 → immediately stale so observers still GET /myprofile
|
|
1460
|
+
// for fields the JWT seed omits (avatar/signature paths).
|
|
1461
|
+
queryClient.setQueryData(queryKey, mapped, { updatedAt: 0 });
|
|
1409
1462
|
}
|
|
1410
1463
|
else {
|
|
1411
1464
|
// Only overwrite when the mapped id changed — we don't know T's shape
|
|
@@ -1413,7 +1466,7 @@ function SessionBackedProfileCacheSeeder({ queryKey, mapper, }) {
|
|
|
1413
1466
|
const existingId = existing?.id;
|
|
1414
1467
|
const mappedId = mapped?.id;
|
|
1415
1468
|
if (existingId !== mappedId) {
|
|
1416
|
-
queryClient.setQueryData(queryKey, mapped);
|
|
1469
|
+
queryClient.setQueryData(queryKey, mapped, { updatedAt: 0 });
|
|
1417
1470
|
}
|
|
1418
1471
|
}
|
|
1419
1472
|
}
|