@tern-secure/nextjs 3.3.5 → 3.4.1

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 (197) hide show
  1. package/dist/cjs/app-router/client/TernSecureProvider.js +33 -0
  2. package/dist/cjs/app-router/client/TernSecureProvider.js.map +1 -0
  3. package/dist/cjs/app-router/client/actions.js +180 -0
  4. package/dist/cjs/app-router/client/actions.js.map +1 -0
  5. package/dist/cjs/app-router/route-handler/internal-route.js +45 -0
  6. package/dist/cjs/app-router/route-handler/internal-route.js.map +1 -0
  7. package/dist/cjs/app-router/server/auth.js +71 -0
  8. package/dist/cjs/app-router/server/auth.js.map +1 -0
  9. package/dist/cjs/app-router/server/index.js +42 -0
  10. package/dist/cjs/app-router/server/index.js.map +1 -0
  11. package/dist/cjs/app-router/server/sessionTernSecure.js +159 -0
  12. package/dist/cjs/app-router/server/sessionTernSecure.js.map +1 -0
  13. package/dist/cjs/app-router/server/ternSecureMiddleware.js +50 -0
  14. package/dist/cjs/app-router/server/ternSecureMiddleware.js.map +1 -0
  15. package/dist/cjs/boundary/TernSecureClientProvider.js +107 -0
  16. package/dist/cjs/boundary/TernSecureClientProvider.js.map +1 -0
  17. package/dist/cjs/boundary/TernSecureCtx.js +49 -0
  18. package/dist/cjs/boundary/TernSecureCtx.js.map +1 -0
  19. package/dist/cjs/boundary/hooks/useAuth.js +51 -0
  20. package/dist/cjs/boundary/hooks/useAuth.js.map +1 -0
  21. package/dist/cjs/boundary/hooks/useSignUp.js +40 -0
  22. package/dist/cjs/boundary/hooks/useSignUp.js.map +1 -0
  23. package/dist/cjs/boundary/hooks/useUser.js +44 -0
  24. package/dist/cjs/boundary/hooks/useUser.js.map +1 -0
  25. package/dist/cjs/components/background.js +65 -0
  26. package/dist/cjs/components/background.js.map +1 -0
  27. package/dist/cjs/components/sign-in.js +242 -0
  28. package/dist/cjs/components/sign-in.js.map +1 -0
  29. package/dist/cjs/components/sign-out.js +69 -0
  30. package/dist/cjs/components/sign-out.js.map +1 -0
  31. package/dist/cjs/components/sign-up.js +328 -0
  32. package/dist/cjs/components/sign-up.js.map +1 -0
  33. package/dist/cjs/components/ui/alert.js +88 -0
  34. package/dist/cjs/components/ui/alert.js.map +1 -0
  35. package/dist/cjs/components/ui/button.js +84 -0
  36. package/dist/cjs/components/ui/button.js.map +1 -0
  37. package/dist/cjs/components/ui/card.js +101 -0
  38. package/dist/cjs/components/ui/card.js.map +1 -0
  39. package/dist/cjs/components/ui/input.js +58 -0
  40. package/dist/cjs/components/ui/input.js.map +1 -0
  41. package/dist/cjs/components/ui/label.js +55 -0
  42. package/dist/cjs/components/ui/label.js.map +1 -0
  43. package/dist/cjs/components/ui/separator.js +59 -0
  44. package/dist/cjs/components/ui/separator.js.map +1 -0
  45. package/dist/cjs/components/verify.js +195 -0
  46. package/dist/cjs/components/verify.js.map +1 -0
  47. package/dist/cjs/errors.js +41 -0
  48. package/dist/cjs/errors.js.map +1 -0
  49. package/dist/cjs/index.js +59 -0
  50. package/dist/cjs/index.js.map +1 -0
  51. package/dist/cjs/lib/utils.d.js +17 -0
  52. package/dist/cjs/lib/utils.d.js.map +1 -0
  53. package/dist/cjs/lib/utils.js +33 -0
  54. package/dist/cjs/lib/utils.js.map +1 -0
  55. package/dist/cjs/types.js +17 -0
  56. package/dist/cjs/types.js.map +1 -0
  57. package/dist/cjs/utils/admin-init.js +57 -0
  58. package/dist/cjs/utils/admin-init.js.map +1 -0
  59. package/dist/cjs/utils/client-init.js +49 -0
  60. package/dist/cjs/utils/client-init.js.map +1 -0
  61. package/dist/cjs/utils/config.js +113 -0
  62. package/dist/cjs/utils/config.js.map +1 -0
  63. package/dist/cjs/utils/construct.js +63 -0
  64. package/dist/cjs/utils/construct.js.map +1 -0
  65. package/dist/cjs/utils/create-styles.js +149 -0
  66. package/dist/cjs/utils/create-styles.js.map +1 -0
  67. package/dist/esm/app-router/client/TernSecureProvider.js +9 -0
  68. package/dist/esm/app-router/client/TernSecureProvider.js.map +1 -0
  69. package/dist/esm/app-router/client/actions.js +151 -0
  70. package/dist/esm/app-router/client/actions.js.map +1 -0
  71. package/dist/esm/app-router/route-handler/internal-route.js +20 -0
  72. package/dist/esm/app-router/route-handler/internal-route.js.map +1 -0
  73. package/dist/esm/app-router/server/auth.js +47 -0
  74. package/dist/esm/app-router/server/auth.js.map +1 -0
  75. package/dist/esm/app-router/server/index.js +13 -0
  76. package/dist/esm/app-router/server/index.js.map +1 -0
  77. package/dist/esm/app-router/server/sessionTernSecure.js +129 -0
  78. package/dist/esm/app-router/server/sessionTernSecure.js.map +1 -0
  79. package/dist/esm/app-router/server/ternSecureMiddleware.js +26 -0
  80. package/dist/esm/app-router/server/ternSecureMiddleware.js.map +1 -0
  81. package/dist/esm/boundary/TernSecureClientProvider.js +83 -0
  82. package/dist/esm/boundary/TernSecureClientProvider.js.map +1 -0
  83. package/dist/esm/boundary/TernSecureCtx.js +23 -0
  84. package/dist/esm/boundary/TernSecureCtx.js.map +1 -0
  85. package/dist/esm/boundary/hooks/useAuth.js +27 -0
  86. package/dist/esm/boundary/hooks/useAuth.js.map +1 -0
  87. package/dist/esm/boundary/hooks/useSignUp.js +16 -0
  88. package/dist/esm/boundary/hooks/useSignUp.js.map +1 -0
  89. package/dist/esm/boundary/hooks/useUser.js +20 -0
  90. package/dist/esm/boundary/hooks/useUser.js.map +1 -0
  91. package/dist/esm/components/background.js +41 -0
  92. package/dist/esm/components/background.js.map +1 -0
  93. package/dist/esm/components/sign-in.js +218 -0
  94. package/dist/esm/components/sign-in.js.map +1 -0
  95. package/dist/esm/components/sign-out.js +45 -0
  96. package/dist/esm/components/sign-out.js.map +1 -0
  97. package/dist/esm/components/sign-up.js +294 -0
  98. package/dist/esm/components/sign-up.js.map +1 -0
  99. package/dist/esm/components/ui/alert.js +52 -0
  100. package/dist/esm/components/ui/alert.js.map +1 -0
  101. package/dist/esm/components/ui/button.js +49 -0
  102. package/dist/esm/components/ui/button.js.map +1 -0
  103. package/dist/esm/components/ui/card.js +62 -0
  104. package/dist/esm/components/ui/card.js.map +1 -0
  105. package/dist/esm/components/ui/input.js +24 -0
  106. package/dist/esm/components/ui/input.js.map +1 -0
  107. package/dist/esm/components/ui/label.js +21 -0
  108. package/dist/esm/components/ui/label.js.map +1 -0
  109. package/dist/esm/components/ui/separator.js +25 -0
  110. package/dist/esm/components/ui/separator.js.map +1 -0
  111. package/dist/esm/components/verify.js +161 -0
  112. package/dist/esm/components/verify.js.map +1 -0
  113. package/dist/esm/errors.js +16 -0
  114. package/dist/esm/errors.js.map +1 -0
  115. package/dist/esm/index.js +24 -0
  116. package/dist/esm/index.js.map +1 -0
  117. package/dist/esm/lib/utils.d.js +1 -0
  118. package/dist/esm/lib/utils.d.js.map +1 -0
  119. package/dist/esm/lib/utils.js +9 -0
  120. package/dist/esm/lib/utils.js.map +1 -0
  121. package/dist/esm/types.js +1 -0
  122. package/dist/esm/types.js.map +1 -0
  123. package/dist/esm/utils/admin-init.js +22 -0
  124. package/dist/esm/utils/admin-init.js.map +1 -0
  125. package/dist/esm/utils/client-init.js +22 -0
  126. package/dist/esm/utils/client-init.js.map +1 -0
  127. package/dist/esm/utils/config.js +84 -0
  128. package/dist/esm/utils/config.js.map +1 -0
  129. package/dist/esm/utils/construct.js +37 -0
  130. package/dist/esm/utils/construct.js.map +1 -0
  131. package/dist/esm/utils/create-styles.js +123 -0
  132. package/dist/esm/utils/create-styles.js.map +1 -0
  133. package/dist/types/app-router/client/TernSecureProvider.d.ts +26 -0
  134. package/dist/types/app-router/client/TernSecureProvider.d.ts.map +1 -0
  135. package/dist/types/app-router/client/actions.d.ts +49 -0
  136. package/dist/types/app-router/client/actions.d.ts.map +1 -0
  137. package/dist/types/app-router/route-handler/internal-route.d.ts +9 -0
  138. package/dist/types/app-router/route-handler/internal-route.d.ts.map +1 -0
  139. package/dist/types/app-router/server/auth.d.ts +7 -0
  140. package/dist/types/app-router/server/auth.d.ts.map +1 -0
  141. package/dist/types/app-router/server/index.d.ts +5 -0
  142. package/dist/types/app-router/server/index.d.ts.map +1 -0
  143. package/dist/types/app-router/server/sessionTernSecure.d.ts +37 -0
  144. package/dist/types/app-router/server/sessionTernSecure.d.ts.map +1 -0
  145. package/dist/types/app-router/server/ternSecureMiddleware.d.ts +7 -0
  146. package/dist/types/app-router/server/ternSecureMiddleware.d.ts.map +1 -0
  147. package/dist/types/boundary/TernSecureClientProvider.d.ts +11 -0
  148. package/dist/types/boundary/TernSecureClientProvider.d.ts.map +1 -0
  149. package/dist/types/boundary/TernSecureCtx.d.ts +17 -0
  150. package/dist/types/boundary/TernSecureCtx.d.ts.map +1 -0
  151. package/dist/types/boundary/hooks/useAuth.d.ts +11 -0
  152. package/dist/types/boundary/hooks/useAuth.d.ts.map +1 -0
  153. package/dist/types/boundary/hooks/useSignUp.d.ts +5 -0
  154. package/dist/types/boundary/hooks/useSignUp.d.ts.map +1 -0
  155. package/dist/types/boundary/hooks/useUser.d.ts +7 -0
  156. package/dist/types/boundary/hooks/useUser.d.ts.map +1 -0
  157. package/dist/types/components/background.d.ts +2 -0
  158. package/dist/types/components/background.d.ts.map +1 -0
  159. package/dist/types/components/sign-in.d.ts +18 -0
  160. package/dist/types/components/sign-in.d.ts.map +1 -0
  161. package/dist/types/components/sign-out.d.ts +10 -0
  162. package/dist/types/components/sign-out.d.ts.map +1 -0
  163. package/dist/types/components/sign-up.d.ts +7 -0
  164. package/dist/types/components/sign-up.d.ts.map +1 -0
  165. package/dist/types/components/ui/alert.d.ts +9 -0
  166. package/dist/types/components/ui/alert.d.ts.map +1 -0
  167. package/dist/types/components/ui/button.d.ts +12 -0
  168. package/dist/types/components/ui/button.d.ts.map +1 -0
  169. package/dist/types/components/ui/card.d.ts +9 -0
  170. package/dist/types/components/ui/card.d.ts.map +1 -0
  171. package/dist/types/components/ui/input.d.ts +4 -0
  172. package/dist/types/components/ui/input.d.ts.map +1 -0
  173. package/dist/types/components/ui/label.d.ts +6 -0
  174. package/dist/types/components/ui/label.d.ts.map +1 -0
  175. package/dist/types/components/ui/separator.d.ts +5 -0
  176. package/dist/types/components/ui/separator.d.ts.map +1 -0
  177. package/dist/types/components/verify.d.ts +2 -0
  178. package/dist/types/components/verify.d.ts.map +1 -0
  179. package/dist/types/errors.d.ts +9 -0
  180. package/dist/types/errors.d.ts.map +1 -0
  181. package/dist/types/index.d.ts +1 -0
  182. package/dist/types/index.d.ts.map +1 -0
  183. package/dist/types/lib/utils.d.ts +3 -0
  184. package/dist/types/lib/utils.d.ts.map +1 -0
  185. package/dist/types/types.d.ts +63 -0
  186. package/dist/types/types.d.ts.map +1 -0
  187. package/dist/types/utils/admin-init.d.ts +4 -0
  188. package/dist/types/utils/admin-init.d.ts.map +1 -0
  189. package/dist/types/utils/client-init.d.ts +5 -0
  190. package/dist/types/utils/client-init.d.ts.map +1 -0
  191. package/dist/types/utils/config.d.ts +35 -0
  192. package/dist/types/utils/config.d.ts.map +1 -0
  193. package/dist/types/utils/construct.d.ts +22 -0
  194. package/dist/types/utils/construct.d.ts.map +1 -0
  195. package/dist/types/utils/create-styles.d.ts +99 -0
  196. package/dist/types/utils/create-styles.d.ts.map +1 -0
  197. package/package.json +1 -1
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { useTernSecure } from "../TernSecureCtx";
3
+ function useSignUp() {
4
+ const {
5
+ email,
6
+ setEmail
7
+ } = useTernSecure("useSignUp");
8
+ return {
9
+ email,
10
+ setEmail
11
+ };
12
+ }
13
+ export {
14
+ useSignUp
15
+ };
16
+ //# sourceMappingURL=useSignUp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/boundary/hooks/useSignUp.ts"],"sourcesContent":["\"use client\"\n\nimport { useTernSecure } from '../TernSecureCtx'\n\nexport function useSignUp() {\n const {\n email,\n setEmail\n } = useTernSecure('useSignUp')\n\n return {\n email, \n setEmail\n }\n}\n"],"mappings":";AAEA,SAAS,qBAAqB;AAEvB,SAAS,YAAY;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,EACF,IAAI,cAAc,WAAW;AAE7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { onAuthStateChanged } from "firebase/auth";
3
+ import { useEffect, useState } from "react";
4
+ import { ternSecureAuth } from "../../utils/client-init";
5
+ function useUser() {
6
+ const [user, setUser] = useState(null);
7
+ const [loading, setLoading] = useState(true);
8
+ useEffect(() => {
9
+ const unsubscribe = onAuthStateChanged(ternSecureAuth, (authUser) => {
10
+ setUser(authUser);
11
+ setLoading(false);
12
+ });
13
+ return () => unsubscribe();
14
+ }, []);
15
+ return { user, loading };
16
+ }
17
+ export {
18
+ useUser
19
+ };
20
+ //# sourceMappingURL=useUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/boundary/hooks/useUser.ts"],"sourcesContent":["\"use client\";\n\nimport { onAuthStateChanged } from \"firebase/auth\";\nimport { useEffect, useState } from \"react\";\n\nimport { ternSecureAuth} from \"../../utils/client-init\";\n\ninterface UseUserReturn {\n user: any | null;\n loading: boolean;\n }\n\nexport function useUser(): UseUserReturn {\n const [user, setUser] = useState<any| null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const unsubscribe = onAuthStateChanged(ternSecureAuth, (authUser) => {\n setUser(authUser);\n setLoading(false);\n });\n\n return () => unsubscribe();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return {user, loading};\n}\n"],"mappings":";AAEA,SAAS,0BAA0B;AACnC,SAAS,WAAW,gBAAgB;AAEpC,SAAS,sBAAqB;AAOvB,SAAS,UAAyB;AACvC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAoB,IAAI;AAChD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAE3C,YAAU,MAAM;AACd,UAAM,cAAc,mBAAmB,gBAAgB,CAAC,aAAa;AACnE,cAAQ,QAAQ;AAChB,iBAAW,KAAK;AAAA,IAClB,CAAC;AAED,WAAO,MAAM,YAAY;AAAA,EAE3B,GAAG,CAAC,CAAC;AAEL,SAAO,EAAC,MAAM,QAAO;AACvB;","names":[]}
@@ -0,0 +1,41 @@
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ function AuthBackground() {
3
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
4
+ /* @__PURE__ */ jsx(
5
+ "div",
6
+ {
7
+ className: "absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80",
8
+ "aria-hidden": "true",
9
+ children: /* @__PURE__ */ jsx(
10
+ "div",
11
+ {
12
+ className: "relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[30deg] bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]",
13
+ style: {
14
+ clipPath: "polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"
15
+ }
16
+ }
17
+ )
18
+ }
19
+ ),
20
+ /* @__PURE__ */ jsx(
21
+ "div",
22
+ {
23
+ className: "absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]",
24
+ "aria-hidden": "true",
25
+ children: /* @__PURE__ */ jsx(
26
+ "div",
27
+ {
28
+ className: "relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 bg-gradient-to-tr from-[hsl(var(--secondary)_/_0.3)] to-[hsl(var(--primary)_/_0.3)] opacity-30 sm:left-[calc(50%+36rem)] sm:w-[72.1875rem]",
29
+ style: {
30
+ clipPath: "polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)"
31
+ }
32
+ }
33
+ )
34
+ }
35
+ )
36
+ ] });
37
+ }
38
+ export {
39
+ AuthBackground
40
+ };
41
+ //# sourceMappingURL=background.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/background.tsx"],"sourcesContent":["export function AuthBackground() {\n return (\n <>\n {/* Primary gradient blob */}\n <div\n className=\"absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80\"\n aria-hidden=\"true\"\n >\n <div\n className=\"relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[30deg] bg-gradient-to-tr from-[#ff80b5] to-[#9089fc] opacity-30 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]\"\n style={{\n clipPath:\n 'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',\n }}\n />\n </div>\n \n {/* Secondary gradient blob */}\n <div\n className=\"absolute inset-x-0 top-[calc(100%-13rem)] -z-10 transform-gpu overflow-hidden blur-3xl sm:top-[calc(100%-30rem)]\"\n aria-hidden=\"true\"\n >\n <div\n className=\"relative left-[calc(50%+3rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 bg-gradient-to-tr from-[hsl(var(--secondary)_/_0.3)] to-[hsl(var(--primary)_/_0.3)] opacity-30 sm:left-[calc(50%+36rem)] sm:w-[72.1875rem]\"\n style={{\n clipPath:\n 'polygon(74.1% 44.1%, 100% 61.6%, 97.5% 26.9%, 85.5% 0.1%, 80.7% 2%, 72.5% 32.5%, 60.2% 62.4%, 52.4% 68.1%, 47.5% 58.3%, 45.2% 34.5%, 27.5% 76.7%, 0.1% 64.9%, 17.9% 100%, 27.6% 76.8%, 76.1% 97.7%, 74.1% 44.1%)',\n }}\n />\n </div>\n </>\n )\n }\n \n "],"mappings":"AAEM,mBAMM,KANN;AAFC,SAAS,iBAAiB;AAC7B,SACE,iCAEE;AAAA;AAAA,MAAC;AAAA;AAAA,QACG,WAAU;AAAA,QACV,eAAY;AAAA,QAEZ;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,UACE;AAAA,YACJ;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IAGF;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,eAAY;AAAA,QAEZ;AAAA,UAAC;AAAA;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,UACE;AAAA,YACJ;AAAA;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,218 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { useState, useCallback, useEffect } from "react";
4
+ import { useSearchParams } from "next/navigation";
5
+ import { signInWithEmail, signInWithRedirectGoogle, signInWithMicrosoft } from "../app-router/client/actions";
6
+ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from "./ui/card";
7
+ import { Input } from "./ui/input";
8
+ import { Label } from "./ui/label";
9
+ import { Button } from "./ui/button";
10
+ import { Alert, AlertDescription } from "./ui/alert";
11
+ import { Separator } from "./ui/separator";
12
+ import { cn } from "../lib/utils";
13
+ import { Loader2 } from "lucide-react";
14
+ import { getRedirectResult } from "firebase/auth";
15
+ import { ternSecureAuth } from "../utils/client-init";
16
+ import { createSessionCookie } from "../app-router/server/sessionTernSecure";
17
+ import { AuthBackground } from "./background";
18
+ import { getValidRedirectUrl } from "../utils/construct";
19
+ const authDomain = process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN;
20
+ const appName = process.env.NEXT_PUBLIC_FIREBASE_APP_NAME || "TernSecure";
21
+ function SignIn({
22
+ redirectUrl,
23
+ onError,
24
+ onSuccess,
25
+ className,
26
+ customStyles = {}
27
+ }) {
28
+ const [loading, setLoading] = useState(false);
29
+ const [checkingRedirect, setCheckingRedirect] = useState(true);
30
+ const [error, setError] = useState("");
31
+ const [email, setEmail] = useState("");
32
+ const [password, setPassword] = useState("");
33
+ const searchParams = useSearchParams();
34
+ const isRedirectSignIn = searchParams.get("signInRedirect") === "true";
35
+ const handleRedirectResult = useCallback(async () => {
36
+ if (!isRedirectSignIn) return false;
37
+ setCheckingRedirect(true);
38
+ try {
39
+ console.log("Checking redirect result...");
40
+ console.log("Current hostname:", window.location.hostname);
41
+ console.log("Auth domain hostname:", authDomain);
42
+ const isOnAuth = authDomain && window.location.hostname === authDomain.replace(/https?:\/\//, "");
43
+ console.log("Is on AuthDomain:", isOnAuth);
44
+ const result = await getRedirectResult(ternSecureAuth);
45
+ console.log("Redirect result:", result);
46
+ if (result) {
47
+ const idToken = await result.user.getIdToken();
48
+ const sessionResult = await createSessionCookie(idToken);
49
+ if (!sessionResult.success) {
50
+ throw new Error("Failed to create session");
51
+ }
52
+ const storedRedirectUrl = sessionStorage.getItem("auth_return_url");
53
+ sessionStorage.removeItem("auth_redirect_url");
54
+ onSuccess == null ? void 0 : onSuccess();
55
+ window.location.href = storedRedirectUrl || getValidRedirectUrl(redirectUrl, searchParams);
56
+ return true;
57
+ }
58
+ setCheckingRedirect(false);
59
+ } catch (err) {
60
+ console.error("Redirect result error:", err);
61
+ const errorMessage = err instanceof Error ? err.message : "Authentication failed";
62
+ setError(errorMessage);
63
+ onError == null ? void 0 : onError(err instanceof Error ? err : new Error(errorMessage));
64
+ sessionStorage.removeItem("auth_redirect_url");
65
+ return false;
66
+ }
67
+ }, [isRedirectSignIn, redirectUrl, searchParams, onSuccess, onError]);
68
+ useEffect(() => {
69
+ if (isRedirectSignIn) {
70
+ handleRedirectResult();
71
+ }
72
+ ;
73
+ }, [handleRedirectResult, isRedirectSignIn]);
74
+ const handleSubmit = async (e) => {
75
+ e.preventDefault();
76
+ setLoading(true);
77
+ try {
78
+ const user = await signInWithEmail(email, password);
79
+ if (user.success) {
80
+ onSuccess == null ? void 0 : onSuccess();
81
+ window.location.href = getValidRedirectUrl(redirectUrl, searchParams);
82
+ }
83
+ } catch (err) {
84
+ const errorMessage = err instanceof Error ? err.message : "Failed to sign in";
85
+ setError(errorMessage);
86
+ onError == null ? void 0 : onError(err instanceof Error ? err : new Error("Failed to sign in"));
87
+ } finally {
88
+ setLoading(false);
89
+ }
90
+ };
91
+ const handleSocialSignIn = async (provider) => {
92
+ setLoading(true);
93
+ try {
94
+ const validRedirectUrl = getValidRedirectUrl(redirectUrl, searchParams);
95
+ sessionStorage.setItem("auth_redirect_url", validRedirectUrl);
96
+ const currentUrl = new URL(window.location.href);
97
+ currentUrl.searchParams.set("signInRedirect", "true");
98
+ window.history.replaceState({}, "", currentUrl.toString());
99
+ const result = provider === "google" ? await signInWithRedirectGoogle() : await signInWithMicrosoft();
100
+ if (!result.success) {
101
+ throw new Error(result.error);
102
+ }
103
+ } catch (err) {
104
+ const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${provider}`;
105
+ setError(errorMessage);
106
+ onError == null ? void 0 : onError(err instanceof Error ? err : new Error(`Failed to sign in with ${provider}`));
107
+ setLoading(false);
108
+ sessionStorage.removeItem("auth_redirect_url");
109
+ }
110
+ };
111
+ if (checkingRedirect && isRedirectSignIn) {
112
+ return /* @__PURE__ */ jsx("div", { className: "flex min-h-screen items-center justify-center", children: /* @__PURE__ */ jsx("div", { className: "text-center space-y-4", children: /* @__PURE__ */ jsx("div", { className: "animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto" }) }) });
113
+ }
114
+ return /* @__PURE__ */ jsxs("div", { className: "relative flex items-center justify-center", children: [
115
+ /* @__PURE__ */ jsx(AuthBackground, {}),
116
+ /* @__PURE__ */ jsxs(Card, { className: cn("w-full max-w-md mx-auto mt-8", className, customStyles.card), children: [
117
+ /* @__PURE__ */ jsxs(CardHeader, { className: "space-y-1 text-center", children: [
118
+ /* @__PURE__ */ jsxs(CardTitle, { className: cn("font-bold", customStyles.title), children: [
119
+ "Sign in to ",
120
+ `${appName}`
121
+ ] }),
122
+ /* @__PURE__ */ jsx(CardDescription, { className: cn("text-muted-foreground", customStyles.description), children: "Please sign in to continue" })
123
+ ] }),
124
+ /* @__PURE__ */ jsxs(CardContent, { className: "space-y-4", children: [
125
+ /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [
126
+ error && /* @__PURE__ */ jsx(Alert, { variant: "destructive", children: /* @__PURE__ */ jsx(AlertDescription, { children: error }) }),
127
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
128
+ /* @__PURE__ */ jsx(Label, { htmlFor: "email", className: cn(customStyles.label), children: "Email" }),
129
+ /* @__PURE__ */ jsx(
130
+ Input,
131
+ {
132
+ id: "email",
133
+ type: "email",
134
+ placeholder: "m@example.com",
135
+ value: email,
136
+ onChange: (e) => setEmail(e.target.value),
137
+ disabled: loading,
138
+ className: cn(customStyles.input),
139
+ required: true
140
+ }
141
+ )
142
+ ] }),
143
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
144
+ /* @__PURE__ */ jsx(Label, { htmlFor: "password", className: cn(customStyles.label), children: "Password" }),
145
+ /* @__PURE__ */ jsx(
146
+ Input,
147
+ {
148
+ id: "password",
149
+ type: "password",
150
+ value: password,
151
+ onChange: (e) => setPassword(e.target.value),
152
+ disabled: loading,
153
+ className: cn(customStyles.input),
154
+ required: true
155
+ }
156
+ )
157
+ ] }),
158
+ /* @__PURE__ */ jsx(Button, { type: "submit", disabled: loading, className: cn("w-full", customStyles.button), children: loading ? /* @__PURE__ */ jsxs(Fragment, { children: [
159
+ /* @__PURE__ */ jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }),
160
+ "Signing in..."
161
+ ] }) : "Sign in" })
162
+ ] }),
163
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
164
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center", children: /* @__PURE__ */ jsx(Separator, { className: cn(customStyles.separator) }) }),
165
+ /* @__PURE__ */ jsx("div", { className: "relative flex justify-center text-xs uppercase", children: /* @__PURE__ */ jsx("span", { className: "bg-background px-2 text-muted-foreground", children: "Or continue with" }) })
166
+ ] }),
167
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-4", children: [
168
+ /* @__PURE__ */ jsxs(
169
+ Button,
170
+ {
171
+ variant: "outline",
172
+ disabled: loading,
173
+ onClick: () => handleSocialSignIn("google"),
174
+ className: cn("flex items-center justify-center", customStyles.socialButton),
175
+ children: [
176
+ /* @__PURE__ */ jsxs("svg", { className: "w-5 h-5 mr-2", viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: [
177
+ /* @__PURE__ */ jsx("path", { d: "M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z", fill: "#4285F4" }),
178
+ /* @__PURE__ */ jsx("path", { d: "M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z", fill: "#34A853" }),
179
+ /* @__PURE__ */ jsx("path", { d: "M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z", fill: "#FBBC05" }),
180
+ /* @__PURE__ */ jsx("path", { d: "M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z", fill: "#EA4335" })
181
+ ] }),
182
+ "Google"
183
+ ]
184
+ }
185
+ ),
186
+ /* @__PURE__ */ jsxs(
187
+ Button,
188
+ {
189
+ variant: "outline",
190
+ disabled: loading,
191
+ onClick: () => handleSocialSignIn("microsoft"),
192
+ className: cn("flex items-center justify-center", customStyles.socialButton),
193
+ children: [
194
+ /* @__PURE__ */ jsxs("svg", { className: "w-5 h-5 mr-2", viewBox: "0 0 23 23", xmlns: "http://www.w3.org/2000/svg", children: [
195
+ /* @__PURE__ */ jsx("path", { fill: "#f3f3f3", d: "M0 0h23v23H0z" }),
196
+ /* @__PURE__ */ jsx("path", { fill: "#f35325", d: "M1 1h10v10H1z" }),
197
+ /* @__PURE__ */ jsx("path", { fill: "#81bc06", d: "M12 1h10v10H12z" }),
198
+ /* @__PURE__ */ jsx("path", { fill: "#05a6f0", d: "M1 12h10v10H1z" }),
199
+ /* @__PURE__ */ jsx("path", { fill: "#ffba08", d: "M12 12h10v10H12z" })
200
+ ] }),
201
+ "Microsoft"
202
+ ]
203
+ }
204
+ )
205
+ ] })
206
+ ] }),
207
+ /* @__PURE__ */ jsx(CardFooter, { className: "flex justify-center", children: /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
208
+ "Don't have an account?",
209
+ " ",
210
+ /* @__PURE__ */ jsx("a", { href: "/sign-up", className: "text-primary hover:underline", children: "Sign up" })
211
+ ] }) })
212
+ ] })
213
+ ] });
214
+ }
215
+ export {
216
+ SignIn
217
+ };
218
+ //# sourceMappingURL=sign-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/sign-in.tsx"],"sourcesContent":["'use client'\n\nimport React, { useState, useCallback, useEffect } from 'react'\nimport { useSearchParams } from 'next/navigation'\nimport { signInWithEmail, signInWithRedirectGoogle, signInWithMicrosoft } from '../app-router/client/actions'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from \"./ui/card\"\nimport { Input } from \"./ui/input\"\nimport { Label } from \"./ui/label\"\nimport { Button } from \"./ui/button\"\nimport { Alert, AlertDescription } from \"./ui/alert\"\nimport { Separator } from \"./ui/separator\"\nimport { cn } from \"../lib/utils\"\nimport { Loader2 } from 'lucide-react'\nimport { getRedirectResult } from 'firebase/auth'\nimport { ternSecureAuth } from '../utils/client-init'\nimport { createSessionCookie } from '../app-router/server/sessionTernSecure'\nimport { AuthBackground } from './background'\nimport { getValidRedirectUrl } from '../utils/construct'\n\n\nconst authDomain = process.env.NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN;\nconst appName = process.env.NEXT_PUBLIC_FIREBASE_APP_NAME || 'TernSecure';\n\n\nexport interface SignInProps {\n redirectUrl?: string\n onError?: (error: Error) => void\n onSuccess?: () => void\n className?: string\n customStyles?: {\n card?: string\n input?: string\n button?: string\n label?: string\n separator?: string\n title?: string\n description?: string\n socialButton?: string\n }\n}\n\nexport function SignIn({\n redirectUrl,\n onError,\n onSuccess,\n className,\n customStyles = {}\n}: SignInProps) {\n const [loading, setLoading] = useState(false)\n const [checkingRedirect, setCheckingRedirect] = useState(true)\n const [error, setError] = useState('')\n const [email, setEmail] = useState('')\n const [password, setPassword] = useState('')\n const searchParams = useSearchParams()\n const isRedirectSignIn = searchParams.get('signInRedirect') === 'true'\n\n\n const handleRedirectResult = useCallback(async () => {\n if (!isRedirectSignIn) return false\n setCheckingRedirect(true)\n try {\n console.log('Checking redirect result...');\n console.log('Current hostname:', window.location.hostname);\n console.log('Auth domain hostname:', authDomain);\n\n const isOnAuth = authDomain && \n window.location.hostname === authDomain.replace(/https?:\\/\\//, '');\n console.log('Is on AuthDomain:', isOnAuth);\n\n\n const result = await getRedirectResult(ternSecureAuth)\n console.log('Redirect result:', result);\n if (result) {\n const idToken = await result.user.getIdToken()\n const sessionResult = await createSessionCookie(idToken)\n if (!sessionResult.success) {\n throw new Error('Failed to create session')\n }\n const storedRedirectUrl = sessionStorage.getItem('auth_return_url')\n sessionStorage.removeItem('auth_redirect_url') \n onSuccess?.()\n window.location.href = storedRedirectUrl || getValidRedirectUrl(redirectUrl, searchParams)\n return true\n }\n setCheckingRedirect(false)\n } catch (err) {\n console.error('Redirect result error:', err)\n const errorMessage = err instanceof Error ? err.message : 'Authentication failed'\n setError(errorMessage)\n onError?.(err instanceof Error ? err : new Error(errorMessage))\n sessionStorage.removeItem('auth_redirect_url')\n return false\n }\n }, [isRedirectSignIn, redirectUrl, searchParams, onSuccess, onError])\n\n ///const REDIRECT_TIMEOUT = 5000;\n\n useEffect(() => {\n //let timeoutId: NodeJS.Timeout;\n\n if (isRedirectSignIn) {\n handleRedirectResult();\n\n /*timeoutId = setTimeout(() => {\n console.warn('Redirect check timed out');\n setCheckingRedirect(false);\n setError('Sign in took too long. Please try again.');\n \n }, REDIRECT_TIMEOUT);\n }\n\n return () => {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }*/\n };\n }, [handleRedirectResult, isRedirectSignIn])\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault()\n setLoading(true)\n try {\n const user = await signInWithEmail(email, password)\n if (user.success) {\n onSuccess?.()\n window.location.href = getValidRedirectUrl(redirectUrl, searchParams)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to sign in'\n setError(errorMessage)\n onError?.(err instanceof Error ? err : new Error('Failed to sign in'))\n } finally {\n setLoading(false)\n }\n }\n\n const handleSocialSignIn = async (provider: 'google' | 'microsoft') => {\n setLoading(true)\n try {\n\n const validRedirectUrl = getValidRedirectUrl(redirectUrl, searchParams)\n sessionStorage.setItem('auth_redirect_url', validRedirectUrl)\n\n const currentUrl = new URL(window.location.href)\n currentUrl.searchParams.set('signInRedirect', 'true')\n window.history.replaceState({}, '', currentUrl.toString())\n\n const result = provider === 'google' ? await signInWithRedirectGoogle() : await signInWithMicrosoft()\n if (!result.success) {\n throw new Error(result.error)\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : `Failed to sign in with ${provider}`\n setError(errorMessage)\n onError?.(err instanceof Error ? err : new Error(`Failed to sign in with ${provider}`))\n setLoading(false)\n sessionStorage.removeItem('auth_redirect_url')\n }\n }\n\n if (checkingRedirect && isRedirectSignIn) {\n return (\n <div className=\"flex min-h-screen items-center justify-center\">\n <div className=\"text-center space-y-4\">\n <div className=\"animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto\" />\n \n </div>\n </div>\n )\n }\n\n return (\n <div className=\"relative flex items-center justify-center\">\n <AuthBackground />\n <Card className={cn(\"w-full max-w-md mx-auto mt-8\", className, customStyles.card)}>\n <CardHeader className=\"space-y-1 text-center\">\n <CardTitle className={cn(\"font-bold\", customStyles.title)}>Sign in to {`${appName}`}</CardTitle>\n <CardDescription className={cn(\"text-muted-foreground\", customStyles.description)}>\n Please sign in to continue\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n {error && (\n <Alert variant=\"destructive\">\n <AlertDescription>{error}</AlertDescription>\n </Alert>\n )}\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\" className={cn(customStyles.label)}>Email</Label>\n <Input\n id=\"email\"\n type=\"email\"\n placeholder=\"m@example.com\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n disabled={loading}\n className={cn(customStyles.input)}\n required\n />\n </div>\n <div className=\"space-y-2\">\n <Label htmlFor=\"password\" className={cn(customStyles.label)}>Password</Label>\n <Input\n id=\"password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n disabled={loading}\n className={cn(customStyles.input)}\n required\n />\n </div>\n <Button type=\"submit\" disabled={loading} className={cn(\"w-full\", customStyles.button)}>\n {loading ? (\n <>\n <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />\n Signing in...\n </>\n ) : (\n 'Sign in'\n )}\n </Button>\n </form>\n <div className=\"relative\">\n <div className=\"absolute inset-0 flex items-center\">\n <Separator className={cn(customStyles.separator)} />\n </div>\n <div className=\"relative flex justify-center text-xs uppercase\">\n <span className=\"bg-background px-2 text-muted-foreground\">Or continue with</span>\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <Button \n variant=\"outline\" \n disabled={loading} \n onClick={() => handleSocialSignIn('google')} \n className={cn(\"flex items-center justify-center\", customStyles.socialButton)}\n >\n <svg className=\"w-5 h-5 mr-2\" viewBox=\"0 0 24 24\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\" fill=\"#4285F4\"/>\n <path d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\" fill=\"#34A853\"/>\n <path d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\" fill=\"#FBBC05\"/>\n <path d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\" fill=\"#EA4335\"/>\n </svg>\n Google\n </Button>\n <Button \n variant=\"outline\" \n disabled={loading} \n onClick={() => handleSocialSignIn('microsoft')} \n className={cn(\"flex items-center justify-center\", customStyles.socialButton)}\n >\n <svg className=\"w-5 h-5 mr-2\" viewBox=\"0 0 23 23\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill=\"#f3f3f3\" d=\"M0 0h23v23H0z\"/>\n <path fill=\"#f35325\" d=\"M1 1h10v10H1z\"/>\n <path fill=\"#81bc06\" d=\"M12 1h10v10H12z\"/>\n <path fill=\"#05a6f0\" d=\"M1 12h10v10H1z\"/>\n <path fill=\"#ffba08\" d=\"M12 12h10v10H12z\"/>\n </svg>\n Microsoft\n </Button>\n </div>\n </CardContent>\n <CardFooter className=\"flex justify-center\">\n <p className=\"text-sm text-muted-foreground\">\n Don&apos;t have an account?{' '}\n <a href=\"/sign-up\" className=\"text-primary hover:underline\">\n Sign up\n </a>\n </p>\n </CardFooter>\n </Card>\n </div>\n )\n}\n\n"],"mappings":"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","names":[]}
@@ -0,0 +1,45 @@
1
+ "use client";
2
+ import { jsx } from "react/jsx-runtime";
3
+ import { useState } from "react";
4
+ import { useRouter } from "next/navigation";
5
+ import { signOut } from "firebase/auth";
6
+ import { Button } from "./ui/button";
7
+ import { ternSecureAuth } from "../utils/client-init";
8
+ import { clearSessionCookie } from "../app-router/server/sessionTernSecure";
9
+ function SignOut({
10
+ children = "Sign out",
11
+ onError,
12
+ onSignOutSuccess,
13
+ ...buttonProps
14
+ }) {
15
+ const router = useRouter();
16
+ const [isLoading, setIsLoading] = useState(false);
17
+ const handleSignOut = async () => {
18
+ setIsLoading(true);
19
+ try {
20
+ await signOut(ternSecureAuth);
21
+ await clearSessionCookie();
22
+ onSignOutSuccess == null ? void 0 : onSignOutSuccess();
23
+ router.push("/sign-in");
24
+ } catch (error) {
25
+ console.error("Sign out error:", error);
26
+ onError == null ? void 0 : onError(error instanceof Error ? error : new Error("Failed to sign out"));
27
+ } finally {
28
+ setIsLoading(false);
29
+ }
30
+ };
31
+ return /* @__PURE__ */ jsx(
32
+ Button,
33
+ {
34
+ variant: "outline",
35
+ onClick: handleSignOut,
36
+ disabled: isLoading,
37
+ ...buttonProps,
38
+ children: isLoading ? "Signing out..." : children
39
+ }
40
+ );
41
+ }
42
+ export {
43
+ SignOut
44
+ };
45
+ //# sourceMappingURL=sign-out.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/sign-out.tsx"],"sourcesContent":["'use client'\n\nimport { useState } from 'react'\nimport { useRouter } from 'next/navigation'\nimport { signOut } from 'firebase/auth'\nimport { Button, type ButtonProps } from './ui/button'\nimport { ternSecureAuth } from '../utils/client-init'\nimport { clearSessionCookie } from '../app-router/server/sessionTernSecure'\n\ntype SignOutCustomProps = {\n children?: React.ReactNode\n onError?: (error: Error) => void\n onSignOutSuccess?: () => void\n}\n\ntype SignOutProps = Omit<ButtonProps, 'onClick'> & SignOutCustomProps\n\nexport function SignOut({ \n children = 'Sign out', \n onError,\n onSignOutSuccess,\n ...buttonProps \n}: SignOutProps) {\n const router = useRouter()\n const [isLoading, setIsLoading] = useState(false)\n\n const handleSignOut = async () => {\n setIsLoading(true)\n try {\n // Sign out from Firebase\n await signOut(ternSecureAuth)\n \n await clearSessionCookie()\n \n // Call success callback if provided\n onSignOutSuccess?.()\n \n // Redirect to sign-in page\n router.push('/sign-in')\n } catch (error) {\n console.error('Sign out error:', error)\n onError?.(error instanceof Error ? error : new Error('Failed to sign out'))\n } finally {\n setIsLoading(false)\n }\n }\n\n return (\n <Button\n variant=\"outline\"\n onClick={handleSignOut}\n disabled={isLoading}\n {...buttonProps}\n >\n {isLoading ? 'Signing out...' : children}\n </Button>\n )\n}\n\n"],"mappings":";AAgDI;AA9CJ,SAAS,gBAAgB;AACzB,SAAS,iBAAiB;AAC1B,SAAS,eAAe;AACxB,SAAS,cAAgC;AACzC,SAAS,sBAAsB;AAC/B,SAAS,0BAA0B;AAU5B,SAAS,QAAQ;AAAA,EACtB,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAiB;AACf,QAAM,SAAS,UAAU;AACzB,QAAM,CAAC,WAAW,YAAY,IAAI,SAAS,KAAK;AAEhD,QAAM,gBAAgB,YAAY;AAChC,iBAAa,IAAI;AACjB,QAAI;AAEF,YAAM,QAAQ,cAAc;AAE5B,YAAM,mBAAmB;AAGzB;AAGA,aAAO,KAAK,UAAU;AAAA,IACxB,SAAS,OAAO;AACd,cAAQ,MAAM,mBAAmB,KAAK;AACtC,yCAAU,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,oBAAoB;AAAA,IAC3E,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACT,GAAG;AAAA,MAEH,sBAAY,mBAAmB;AAAA;AAAA,EAClC;AAEJ;","names":[]}