@sanvika/auth 2.9.3 → 2.9.5

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.
Files changed (2) hide show
  1. package/dist/index.js +59 -14
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -314,8 +314,22 @@ function SanvikaAuthProvider({
314
314
  ...opts.headers
315
315
  };
316
316
  const res = await fetch(url, { ...opts, headers });
317
- const data = await res.json();
318
- return { data, success: data.success };
317
+ let data;
318
+ try {
319
+ data = await res.json();
320
+ } catch {
321
+ data = {
322
+ success: false,
323
+ message: `Invalid JSON response (HTTP ${res.status})`
324
+ };
325
+ }
326
+ const bodySuccess = (data == null ? void 0 : data.success) === true;
327
+ return {
328
+ data,
329
+ success: bodySuccess,
330
+ ok: res.ok && (data == null ? void 0 : data.success) !== false,
331
+ status: res.status
332
+ };
319
333
  },
320
334
  [persistence]
321
335
  );
@@ -368,7 +382,7 @@ function styleInject(css, { insertAt } = {}) {
368
382
  }
369
383
 
370
384
  // SanvikaAccountButton.css
371
- styleInject("@keyframes snvk-shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n}\n.snvk-skeleton {\n width: clamp(72px, 20vw, 96px);\n height: clamp(34px, 8vw, 40px);\n border-radius: 8px;\n background:\n linear-gradient(\n 90deg,\n var(--skeleton-base-color, #d0d0d0) 25%,\n var(--skeleton-highlight-color, #f0f0f0) 50%,\n var(--skeleton-base-color, #d0d0d0) 75%);\n background-size: 200% 100%;\n animation: snvk-shimmer 1.4s infinite;\n display: inline-block;\n}\n.snvk-wrapper {\n position: relative;\n display: inline-block;\n}\n.snvk-guestBtn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: clamp(6px, 2vw, 8px) clamp(10px, 3vw, 16px);\n min-height: 44px;\n min-width: 44px;\n background: var(--sanvika-brand-color, #4f46e5);\n color: #ffffff;\n border: none;\n border-radius: 8px;\n font-size: clamp(13px, 3vw, 14px);\n font-weight: 600;\n cursor: pointer;\n transition: background-color 0.3s ease, color 0.3s ease;\n white-space: nowrap;\n}\n.snvk-guestBtn:hover {\n background: var(--sanvika-brand-hover, #4338ca);\n}\n.snvk-iconWrap {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n.snvk-profileBtn {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 5px 10px 5px 5px;\n min-height: 44px;\n background: var(--muted-bg, #f5f5f5);\n border: 1px solid var(--border-color-light, #e5e7eb);\n border-radius: 99px;\n font-size: clamp(13px, 3vw, 14px);\n font-weight: 600;\n cursor: pointer;\n color: var(--text-color, #1a1a1a);\n transition:\n background-color 0.3s ease,\n border-color 0.3s ease,\n color 0.3s ease;\n white-space: nowrap;\n outline: none;\n}\n.snvk-profileBtn:hover {\n background: var(--hover-color, #ebebeb);\n border-color: var(--border-color-dark, #d1d5db);\n}\n.snvk-profileBtn:focus-visible {\n outline: 2px solid var(--sanvika-brand-color, #4f46e5);\n outline-offset: 2px;\n}\n.snvk-avatar {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n object-fit: cover;\n border: 2px solid var(--sanvika-brand-color, #4f46e5);\n flex-shrink: 0;\n}\n.snvk-textWrap {\n display: inline;\n}\n.snvk-hideTextOnMobile {\n display: none;\n}\n@media (min-width: 500px) {\n .snvk-hideTextOnMobile {\n display: inline;\n }\n}\n.snvk-dropdown {\n position: absolute;\n top: calc(100% + 8px);\n right: 0;\n min-width: clamp(200px, 60vw, 240px);\n background: var(--card-bg, #f3f3f3);\n border: 1px solid var(--border-color-light, #cccccc);\n border-radius: 12px;\n box-shadow: 0 8px 24px var(--shadow-color, rgba(0, 0, 0, 0.2));\n z-index: 9999;\n overflow: hidden;\n transition: background-color 0.3s ease, border-color 0.3s ease;\n}\n.snvk-dropdownHeader {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 14px 16px;\n background: var(--section-bg, #ebebeb);\n transition: background-color 0.3s ease;\n}\n.snvk-dropdownAvatar {\n width: 38px;\n height: 38px;\n border-radius: 50%;\n object-fit: cover;\n border: 2px solid var(--sanvika-brand-color, #4f46e5);\n flex-shrink: 0;\n}\n.snvk-dropdownName {\n font-size: clamp(13px, 3vw, 14px);\n font-weight: 800;\n color: var(--text-color, #000000);\n line-height: 1.3;\n transition: color 0.3s ease;\n}\n.snvk-dropdownMobile {\n font-size: clamp(11px, 2.5vw, 12px);\n color: var(--secondary-text-color, #333333);\n margin-top: 2px;\n transition: color 0.3s ease;\n font-weight: 700;\n}\n.snvk-divider {\n height: 1px;\n background: var(--muted-border, #d8d8d8);\n transition: background-color 0.3s ease;\n}\n.snvk-dropdownItem {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 11px 16px;\n min-height: 44px;\n background: none;\n border: none;\n font-size: clamp(13px, 3vw, 14px);\n color: var(--text-color, #000000);\n font-weight: 600;\n cursor: pointer;\n text-decoration: none;\n text-align: left;\n transition: background-color 0.3s ease, color 0.3s ease;\n}\n.snvk-dropdownItem:hover {\n background: var(--hover-color, #e8e8e8);\n}\n");
385
+ styleInject("@keyframes snvk-shimmer {\n 0% {\n background-position: 200% 0;\n }\n 100% {\n background-position: -200% 0;\n }\n}\n.snvk-skeleton {\n width: clamp(72px, 20vw, 96px);\n height: clamp(34px, 8vw, 40px);\n border-radius: 8px;\n background:\n linear-gradient(\n 90deg,\n var(--skeleton-base-color, #d0d0d0) 25%,\n var(--skeleton-highlight-color, #f0f0f0) 50%,\n var(--skeleton-base-color, #d0d0d0) 75%);\n background-size: 200% 100%;\n animation: snvk-shimmer 1.4s infinite;\n display: inline-block;\n}\n.snvk-wrapper {\n position: relative;\n display: inline-block;\n}\n.snvk-guestBtn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n padding: clamp(6px, 2vw, 8px) clamp(10px, 3vw, 16px);\n min-height: 44px;\n min-width: 44px;\n background: var(--sanvika-brand-color, #4f46e5);\n color: #ffffff;\n border: none;\n border-radius: 8px;\n font-size: clamp(13px, 3vw, 14px);\n font-weight: 600;\n cursor: pointer;\n transition: background-color 0.3s ease, color 0.3s ease;\n white-space: nowrap;\n}\n.snvk-guestBtn:hover {\n background: var(--sanvika-brand-hover, #4338ca);\n}\n.snvk-iconWrap {\n display: flex;\n align-items: center;\n flex-shrink: 0;\n}\n.snvk-profileBtn {\n display: inline-flex;\n align-items: center;\n gap: 7px;\n padding: 5px 10px 5px 5px;\n min-height: 44px;\n background: var(--muted-bg, #f5f5f5);\n border: 1px solid var(--border-color-light, #e5e7eb);\n border-radius: 99px;\n font-size: clamp(13px, 3vw, 14px);\n font-weight: 600;\n cursor: pointer;\n color: var(--text-color, #1a1a1a);\n transition:\n background-color 0.3s ease,\n border-color 0.3s ease,\n color 0.3s ease;\n white-space: nowrap;\n outline: none;\n}\n.snvk-profileBtn:hover {\n background: var(--hover-color, #ebebeb);\n border-color: var(--border-color-dark, #d1d5db);\n}\n.snvk-profileBtn:focus-visible {\n outline: 2px solid var(--sanvika-brand-color, #4f46e5);\n outline-offset: 2px;\n}\n.snvk-avatar {\n width: 28px;\n height: 28px;\n border-radius: 50%;\n object-fit: cover;\n border: 2px solid var(--sanvika-brand-color, #4f46e5);\n flex-shrink: 0;\n}\n.snvk-textWrap {\n display: inline;\n}\n.snvk-hideTextOnMobile {\n display: none;\n}\n@media (min-width: 500px) {\n .snvk-hideTextOnMobile {\n display: inline;\n }\n}\n.snvk-dropdown {\n position: absolute;\n top: calc(100% + 8px);\n right: 0;\n min-width: clamp(200px, 60vw, 240px);\n background: var(--card-bg, #f3f3f3);\n border: 1px solid var(--border-color-light, #cccccc);\n border-radius: 12px;\n box-shadow: 0 8px 24px var(--shadow-color, rgba(0, 0, 0, 0.2));\n z-index: 9999;\n overflow: hidden;\n transition: background-color 0.3s ease, border-color 0.3s ease;\n}\n.snvk-dropdownHeader {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 14px 16px;\n background: var(--section-bg, #ebebeb);\n transition: background-color 0.3s ease;\n}\n.snvk-dropdownAvatar {\n width: 38px;\n height: 38px;\n border-radius: 50%;\n object-fit: cover;\n border: 2px solid var(--sanvika-brand-color, #4f46e5);\n flex-shrink: 0;\n}\n.snvk-dropdownName {\n font-size: clamp(13px, 3vw, 14px);\n font-weight: 800;\n color: var(--text-color, #000000);\n line-height: 1.3;\n transition: color 0.3s ease;\n}\n.snvk-dropdownMobile {\n font-size: clamp(11px, 2.5vw, 12px);\n color: var(--secondary-text-color, #333333);\n margin-top: 2px;\n transition: color 0.3s ease;\n font-weight: 700;\n}\n.snvk-divider {\n height: 1px;\n background: var(--muted-border, #d8d8d8);\n transition: background-color 0.3s ease;\n}\n.snvk-dropdownItem {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 11px 16px;\n min-height: 44px;\n background: none;\n border: none;\n font-size: clamp(13px, 3vw, 14px);\n color: var(--text-color, #000000);\n font-weight: 600;\n cursor: pointer;\n text-decoration: none;\n text-align: left;\n transition: background-color 0.3s ease, color 0.3s ease;\n}\n.snvk-dropdownItem:hover {\n background: var(--hover-color, #e8e8e8);\n}\n.snvk-layout-navbarChip.snvk-guestBtn,\n.snvk-layout-navbarChip-profile {\n display: inline-flex !important;\n align-items: center !important;\n justify-content: center !important;\n height: clamp(32px, 8vw, 38px) !important;\n min-height: clamp(32px, 8vw, 38px) !important;\n max-height: clamp(32px, 8vw, 38px) !important;\n padding: clamp(3px, 0.8vw, 5px) clamp(4px, 1.2vw, 8px) !important;\n border-radius: 4px !important;\n border: 1px solid var(--border-color) !important;\n background-color: var(--btn-primary-bg) !important;\n color: var(--btn-primary-text) !important;\n font-size: clamp(9px, 2.4vw, 13px) !important;\n font-weight: 600 !important;\n line-height: 1.1 !important;\n box-sizing: border-box !important;\n white-space: nowrap !important;\n cursor: pointer;\n}\n.snvk-layout-navbarChip.snvk-guestBtn {\n min-width: clamp(52px, 16vw, 90px) !important;\n max-width: clamp(64px, 22vw, 200px) !important;\n gap: 0 !important;\n}\n.snvk-layout-navbarChip.snvk-guestBtn .snvk-iconWrap {\n display: none !important;\n}\n.snvk-layout-navbarChip-profile {\n min-width: clamp(52px, 16vw, 90px) !important;\n max-width: clamp(72px, 24vw, 120px) !important;\n gap: clamp(3px, 0.8vw, 5px) !important;\n}\n.snvk-layout-navbarChip-profile .snvk-avatar {\n width: clamp(18px, 5vw, 22px) !important;\n height: clamp(18px, 5vw, 22px) !important;\n border: 2px solid var(--success-color, #00b894) !important;\n}\n.snvk-layout-navbarChip-profile .snvk-textWrap {\n display: inline !important;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: clamp(32px, 12vw, 64px);\n}\n.snvk-layout-navbarChip.snvk-wrapper {\n display: inline-flex;\n align-items: center;\n}\n");
372
386
 
373
387
  // SanvikaAccountButton.jsx
374
388
  import { jsx as jsx2, jsxs } from "react/jsx-runtime";
@@ -453,9 +467,13 @@ function SanvikaAccountButtonContent({
453
467
  onLoginClick,
454
468
  onProfileClick,
455
469
  onboardingPath,
456
- className
470
+ className,
471
+ layout = "default"
457
472
  }) {
458
473
  var _a, _b;
474
+ const isNavbarChip = layout === "navbarChip";
475
+ const guestBtnClass = `snvk-guestBtn${isNavbarChip ? " snvk-layout-navbarChip" : ""}${className ? ` ${className}` : ""}`;
476
+ const wrapperClass = `snvk-wrapper${isNavbarChip ? " snvk-layout-navbarChip" : ""}${className ? ` ${className}` : ""}`;
459
477
  const auth = useSanvikaAuth();
460
478
  const [dropdownOpen, setDropdownOpen] = useState2(false);
461
479
  const [imgError, setImgError] = useState2(false);
@@ -475,7 +493,7 @@ function SanvikaAccountButtonContent({
475
493
  return /* @__PURE__ */ jsxs(
476
494
  "button",
477
495
  {
478
- className: `snvk-guestBtn ${className}`,
496
+ className: guestBtnClass,
479
497
  onClick: (e) => {
480
498
  if (onLoginClick) {
481
499
  onLoginClick();
@@ -485,11 +503,11 @@ function SanvikaAccountButtonContent({
485
503
  },
486
504
  "aria-label": "Login or Sign Up",
487
505
  children: [
488
- /* @__PURE__ */ jsx2("span", { className: "snvk-iconWrap", children: /* @__PURE__ */ jsx2(UserIcon, { size: 18 }) }),
506
+ !isNavbarChip ? /* @__PURE__ */ jsx2("span", { className: "snvk-iconWrap", children: /* @__PURE__ */ jsx2(UserIcon, { size: 18 }) }) : null,
489
507
  /* @__PURE__ */ jsx2(
490
508
  "span",
491
509
  {
492
- className: hideTextOnMobile ? "snvk-hideTextOnMobile" : "snvk-textWrap",
510
+ className: hideTextOnMobile && !isNavbarChip ? "snvk-hideTextOnMobile" : "snvk-textWrap",
493
511
  children: text
494
512
  }
495
513
  )
@@ -509,7 +527,7 @@ function SanvikaAccountButtonContent({
509
527
  return /* @__PURE__ */ jsxs(
510
528
  "button",
511
529
  {
512
- className: `snvk-guestBtn ${className}`,
530
+ className: guestBtnClass,
513
531
  onClick: (e) => {
514
532
  if (onLoginClick) {
515
533
  onLoginClick();
@@ -519,11 +537,11 @@ function SanvikaAccountButtonContent({
519
537
  },
520
538
  "aria-label": "Login or Sign Up",
521
539
  children: [
522
- /* @__PURE__ */ jsx2("span", { className: "snvk-iconWrap", children: /* @__PURE__ */ jsx2(UserIcon, { size: 18 }) }),
540
+ !isNavbarChip ? /* @__PURE__ */ jsx2("span", { className: "snvk-iconWrap", children: /* @__PURE__ */ jsx2(UserIcon, { size: 18 }) }) : null,
523
541
  /* @__PURE__ */ jsx2(
524
542
  "span",
525
543
  {
526
- className: hideTextOnMobile ? "snvk-hideTextOnMobile" : "snvk-textWrap",
544
+ className: hideTextOnMobile && !isNavbarChip ? "snvk-hideTextOnMobile" : "snvk-textWrap",
527
545
  children: text
528
546
  }
529
547
  )
@@ -541,11 +559,11 @@ function SanvikaAccountButtonContent({
541
559
  await logout(false);
542
560
  setDropdownOpen(false);
543
561
  };
544
- return /* @__PURE__ */ jsxs("div", { ref: wrapperRef, className: `snvk-wrapper ${className}`, children: [
562
+ return /* @__PURE__ */ jsxs("div", { ref: wrapperRef, className: wrapperClass, children: [
545
563
  /* @__PURE__ */ jsxs(
546
564
  "button",
547
565
  {
548
- className: "snvk-profileBtn",
566
+ className: `snvk-profileBtn${isNavbarChip ? " snvk-layout-navbarChip-profile" : ""}`,
549
567
  onClick: () => setDropdownOpen((o) => !o),
550
568
  onDoubleClick: handleProfileClick,
551
569
  "aria-label": "Account menu",
@@ -563,11 +581,11 @@ function SanvikaAccountButtonContent({
563
581
  /* @__PURE__ */ jsx2(
564
582
  "span",
565
583
  {
566
- className: hideTextOnMobile ? "snvk-hideTextOnMobile" : "snvk-textWrap",
584
+ className: hideTextOnMobile && !isNavbarChip ? "snvk-hideTextOnMobile" : "snvk-textWrap",
567
585
  children: displayName
568
586
  }
569
587
  ),
570
- /* @__PURE__ */ jsx2(ChevronIcon, { open: dropdownOpen })
588
+ !isNavbarChip ? /* @__PURE__ */ jsx2(ChevronIcon, { open: dropdownOpen }) : null
571
589
  ]
572
590
  }
573
591
  ),
@@ -862,6 +880,29 @@ function SanvikaAdminLogin({
862
880
  error && /* @__PURE__ */ jsx3("p", { style: S.error, children: error })
863
881
  ] }) });
864
882
  }
883
+
884
+ // authFetchResult.js
885
+ function isAuthFetchOk(response) {
886
+ var _a;
887
+ if (!response || typeof response !== "object") return false;
888
+ if (response.ok === true) return true;
889
+ return Boolean(response.success) || ((_a = response == null ? void 0 : response.data) == null ? void 0 : _a.success) === true;
890
+ }
891
+ function getAuthFetchMessage(response, fallback = "Request failed") {
892
+ var _a;
893
+ const msg = (_a = response == null ? void 0 : response.data) == null ? void 0 : _a.message;
894
+ return typeof msg === "string" && msg.trim() ? msg.trim() : fallback;
895
+ }
896
+ function getAuthFetchPayload(response) {
897
+ return (response == null ? void 0 : response.data) ?? null;
898
+ }
899
+ function getAuthFetchData(response) {
900
+ const payload = getAuthFetchPayload(response);
901
+ if (payload && typeof payload === "object" && payload.data !== void 0) {
902
+ return payload.data;
903
+ }
904
+ return payload;
905
+ }
865
906
  export {
866
907
  DEFAULT_AUTH_URL,
867
908
  DEFAULT_AVATAR_SVG,
@@ -874,7 +915,11 @@ export {
874
915
  SanvikaAuthProvider,
875
916
  checkMobile,
876
917
  deviceAwareLogin,
918
+ getAuthFetchData,
919
+ getAuthFetchMessage,
920
+ getAuthFetchPayload,
877
921
  getOrCreateWebDeviceId,
922
+ isAuthFetchOk,
878
923
  postLogin,
879
924
  randomDeviceId,
880
925
  resolveLogoutDeviceId,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanvika/auth",
3
- "version": "2.9.3",
3
+ "version": "2.9.5",
4
4
  "description": "Sanvika Auth SDK — React components/hooks + server-side token verification and user proxy",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",