hazo_auth 1.6.6 → 3.0.0

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 (167) hide show
  1. package/README.md +212 -12
  2. package/SETUP_CHECKLIST.md +81 -1
  3. package/dist/app/api/hazo_auth/login/route.d.ts.map +1 -1
  4. package/dist/app/api/hazo_auth/login/route.js +25 -0
  5. package/dist/app/api/hazo_auth/logout/route.d.ts.map +1 -1
  6. package/dist/app/api/hazo_auth/logout/route.js +5 -0
  7. package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts.map +1 -1
  8. package/dist/components/layouts/email_verification/hooks/use_email_verification.js +5 -3
  9. package/dist/components/layouts/email_verification/index.d.ts +2 -1
  10. package/dist/components/layouts/email_verification/index.d.ts.map +1 -1
  11. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts.map +1 -1
  12. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.js +3 -1
  13. package/dist/components/layouts/forgot_password/index.d.ts +2 -1
  14. package/dist/components/layouts/forgot_password/index.d.ts.map +1 -1
  15. package/dist/components/layouts/login/hooks/use_login_form.d.ts.map +1 -1
  16. package/dist/components/layouts/login/hooks/use_login_form.js +3 -1
  17. package/dist/components/layouts/login/index.d.ts +2 -1
  18. package/dist/components/layouts/login/index.d.ts.map +1 -1
  19. package/dist/components/layouts/my_settings/components/profile_picture_dialog.d.ts.map +1 -1
  20. package/dist/components/layouts/my_settings/components/profile_picture_dialog.js +3 -1
  21. package/dist/components/layouts/my_settings/components/profile_picture_library_tab.d.ts.map +1 -1
  22. package/dist/components/layouts/my_settings/components/profile_picture_library_tab.js +4 -2
  23. package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts.map +1 -1
  24. package/dist/components/layouts/my_settings/hooks/use_my_settings.js +7 -5
  25. package/dist/components/layouts/my_settings/index.d.ts +2 -1
  26. package/dist/components/layouts/my_settings/index.d.ts.map +1 -1
  27. package/dist/components/layouts/my_settings/index.js +3 -2
  28. package/dist/components/layouts/register/hooks/use_register_form.d.ts.map +1 -1
  29. package/dist/components/layouts/register/hooks/use_register_form.js +37 -7
  30. package/dist/components/layouts/register/index.d.ts +2 -1
  31. package/dist/components/layouts/register/index.d.ts.map +1 -1
  32. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts.map +1 -1
  33. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.js +4 -2
  34. package/dist/components/layouts/reset_password/index.d.ts +2 -1
  35. package/dist/components/layouts/reset_password/index.d.ts.map +1 -1
  36. package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts +2 -1
  37. package/dist/components/layouts/shared/components/already_logged_in_guard.d.ts.map +1 -1
  38. package/dist/components/layouts/shared/components/logout_button.d.ts.map +1 -1
  39. package/dist/components/layouts/shared/components/logout_button.js +3 -1
  40. package/dist/components/layouts/shared/components/profile_pic_menu.d.ts.map +1 -1
  41. package/dist/components/layouts/shared/components/profile_pic_menu.js +8 -4
  42. package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts +2 -1
  43. package/dist/components/layouts/shared/components/two_column_auth_layout.d.ts.map +1 -1
  44. package/dist/components/layouts/shared/components/visual_panel.d.ts +2 -1
  45. package/dist/components/layouts/shared/components/visual_panel.d.ts.map +1 -1
  46. package/dist/components/layouts/shared/components/visual_panel.js +2 -1
  47. package/dist/components/layouts/shared/hooks/use_auth_status.d.ts.map +1 -1
  48. package/dist/components/layouts/shared/hooks/use_auth_status.js +4 -2
  49. package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts.map +1 -1
  50. package/dist/components/layouts/shared/hooks/use_hazo_auth.js +4 -2
  51. package/dist/components/layouts/shared/index.d.ts +0 -2
  52. package/dist/components/layouts/shared/index.d.ts.map +1 -1
  53. package/dist/components/layouts/shared/index.js +2 -2
  54. package/dist/components/layouts/user_management/components/roles_matrix.d.ts.map +1 -1
  55. package/dist/components/layouts/user_management/components/roles_matrix.js +8 -6
  56. package/dist/components/layouts/user_management/index.d.ts.map +1 -1
  57. package/dist/components/layouts/user_management/index.js +15 -13
  58. package/dist/contexts/hazo_auth_config.d.ts +18 -0
  59. package/dist/contexts/hazo_auth_config.d.ts.map +1 -0
  60. package/dist/contexts/hazo_auth_config.js +10 -0
  61. package/dist/contexts/hazo_auth_provider.d.ts +73 -0
  62. package/dist/contexts/hazo_auth_provider.d.ts.map +1 -0
  63. package/dist/contexts/hazo_auth_provider.js +82 -0
  64. package/dist/index.d.ts +2 -0
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +3 -0
  67. package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -1
  68. package/dist/lib/auth/hazo_get_auth.server.js +31 -3
  69. package/dist/lib/auth/session_token_validator.edge.d.ts +15 -0
  70. package/dist/lib/auth/session_token_validator.edge.d.ts.map +1 -0
  71. package/dist/lib/auth/session_token_validator.edge.js +64 -0
  72. package/dist/lib/config/default_config.d.ts +237 -0
  73. package/dist/lib/config/default_config.d.ts.map +1 -0
  74. package/dist/lib/config/default_config.js +159 -0
  75. package/dist/lib/email_verification_config.server.d.ts +4 -0
  76. package/dist/lib/email_verification_config.server.d.ts.map +1 -1
  77. package/dist/lib/email_verification_config.server.js +12 -0
  78. package/dist/lib/forgot_password_config.server.d.ts +4 -0
  79. package/dist/lib/forgot_password_config.server.d.ts.map +1 -1
  80. package/dist/lib/forgot_password_config.server.js +12 -0
  81. package/dist/lib/login_config.server.d.ts +4 -0
  82. package/dist/lib/login_config.server.d.ts.map +1 -1
  83. package/dist/lib/login_config.server.js +10 -0
  84. package/dist/lib/password_requirements_config.server.d.ts +1 -1
  85. package/dist/lib/password_requirements_config.server.d.ts.map +1 -1
  86. package/dist/lib/password_requirements_config.server.js +8 -7
  87. package/dist/lib/register_config.server.d.ts +4 -0
  88. package/dist/lib/register_config.server.d.ts.map +1 -1
  89. package/dist/lib/register_config.server.js +10 -0
  90. package/dist/lib/reset_password_config.server.d.ts +4 -0
  91. package/dist/lib/reset_password_config.server.d.ts.map +1 -1
  92. package/dist/lib/reset_password_config.server.js +10 -0
  93. package/dist/lib/services/session_token_service.d.ts +27 -0
  94. package/dist/lib/services/session_token_service.d.ts.map +1 -0
  95. package/dist/lib/services/session_token_service.js +130 -0
  96. package/dist/page_components/forgot_password.d.ts.map +1 -1
  97. package/dist/page_components/forgot_password.js +14 -0
  98. package/dist/page_components/login.d.ts +4 -0
  99. package/dist/page_components/login.d.ts.map +1 -1
  100. package/dist/page_components/login.js +14 -0
  101. package/dist/page_components/register.d.ts.map +1 -1
  102. package/dist/page_components/register.js +14 -0
  103. package/dist/page_components/reset_password.d.ts.map +1 -1
  104. package/dist/page_components/reset_password.js +14 -0
  105. package/dist/page_components/verify_email.d.ts.map +1 -1
  106. package/dist/page_components/verify_email.js +14 -0
  107. package/dist/pages/forgot_password.d.ts +52 -0
  108. package/dist/pages/forgot_password.d.ts.map +1 -0
  109. package/dist/pages/forgot_password.js +41 -0
  110. package/dist/pages/index.d.ts +33 -0
  111. package/dist/pages/index.d.ts.map +1 -0
  112. package/dist/pages/index.js +28 -0
  113. package/dist/pages/login.d.ts +43 -0
  114. package/dist/pages/login.d.ts.map +1 -0
  115. package/dist/pages/login.js +45 -0
  116. package/dist/pages/my_settings.d.ts +54 -0
  117. package/dist/pages/my_settings.d.ts.map +1 -0
  118. package/dist/pages/my_settings.js +57 -0
  119. package/dist/pages/register.d.ts +44 -0
  120. package/dist/pages/register.d.ts.map +1 -0
  121. package/dist/pages/register.js +46 -0
  122. package/dist/pages/reset_password.d.ts +43 -0
  123. package/dist/pages/reset_password.d.ts.map +1 -0
  124. package/dist/pages/reset_password.js +42 -0
  125. package/dist/pages/verify_email.d.ts +52 -0
  126. package/dist/pages/verify_email.d.ts.map +1 -0
  127. package/dist/pages/verify_email.js +41 -0
  128. package/dist/server/middleware.d.ts +3 -0
  129. package/dist/server/middleware.d.ts.map +1 -0
  130. package/dist/server/middleware.js +5 -0
  131. package/dist/server_pages/forgot_password.d.ts +53 -0
  132. package/dist/server_pages/forgot_password.d.ts.map +1 -0
  133. package/dist/server_pages/forgot_password.js +40 -0
  134. package/dist/server_pages/forgot_password_client_wrapper.d.ts +15 -0
  135. package/dist/server_pages/forgot_password_client_wrapper.d.ts.map +1 -0
  136. package/dist/server_pages/forgot_password_client_wrapper.js +27 -0
  137. package/dist/server_pages/index.d.ts +13 -0
  138. package/dist/server_pages/index.d.ts.map +1 -0
  139. package/dist/server_pages/index.js +7 -0
  140. package/dist/server_pages/login.d.ts +43 -0
  141. package/dist/server_pages/login.d.ts.map +1 -0
  142. package/dist/server_pages/login.js +39 -0
  143. package/dist/server_pages/login_client_wrapper.d.ts +13 -0
  144. package/dist/server_pages/login_client_wrapper.d.ts.map +1 -0
  145. package/dist/server_pages/login_client_wrapper.js +29 -0
  146. package/dist/server_pages/my_settings.d.ts +53 -0
  147. package/dist/server_pages/my_settings.d.ts.map +1 -0
  148. package/dist/server_pages/my_settings.js +57 -0
  149. package/dist/server_pages/register.d.ts +45 -0
  150. package/dist/server_pages/register.d.ts.map +1 -0
  151. package/dist/server_pages/register.js +41 -0
  152. package/dist/server_pages/register_client_wrapper.d.ts +13 -0
  153. package/dist/server_pages/register_client_wrapper.d.ts.map +1 -0
  154. package/dist/server_pages/register_client_wrapper.js +27 -0
  155. package/dist/server_pages/reset_password.d.ts +44 -0
  156. package/dist/server_pages/reset_password.d.ts.map +1 -0
  157. package/dist/server_pages/reset_password.js +40 -0
  158. package/dist/server_pages/reset_password_client_wrapper.d.ts +13 -0
  159. package/dist/server_pages/reset_password_client_wrapper.d.ts.map +1 -0
  160. package/dist/server_pages/reset_password_client_wrapper.js +27 -0
  161. package/dist/server_pages/verify_email.d.ts +53 -0
  162. package/dist/server_pages/verify_email.d.ts.map +1 -0
  163. package/dist/server_pages/verify_email.js +40 -0
  164. package/dist/server_pages/verify_email_client_wrapper.d.ts +15 -0
  165. package/dist/server_pages/verify_email_client_wrapper.d.ts.map +1 -0
  166. package/dist/server_pages/verify_email_client_wrapper.js +27 -0
  167. package/package.json +39 -10
@@ -12,6 +12,7 @@ import { ProfilePictureLibraryTab } from "./profile_picture_library_tab";
12
12
  import { ProfilePictureGravatarTab } from "./profile_picture_gravatar_tab";
13
13
  import { toast } from "sonner";
14
14
  import { cn } from "../../../../lib/utils";
15
+ import { useHazoAuthConfig } from "../../../../contexts/hazo_auth_provider";
15
16
  // section: component
16
17
  /**
17
18
  * Profile picture dialog component with tabs for Upload, Library, and Gravatar
@@ -20,6 +21,7 @@ import { cn } from "../../../../lib/utils";
20
21
  * @returns Profile picture dialog component
21
22
  */
22
23
  export function ProfilePictureDialog({ open, onOpenChange, onSave, email, allowPhotoUpload, maxPhotoSize, libraryPhotoPath, currentProfilePictureUrl, currentProfileSource, saveButtonLabel = "Save", cancelButtonLabel = "Cancel", disabled = false, messages, uiSizes, fileTypes, }) {
24
+ const { apiBasePath } = useHazoAuthConfig();
23
25
  const [useUpload, setUseUpload] = useState(false);
24
26
  const [useLibrary, setUseLibrary] = useState(false);
25
27
  const [useGravatar, setUseGravatar] = useState(false);
@@ -126,7 +128,7 @@ export function ProfilePictureDialog({ open, onOpenChange, onSave, email, allowP
126
128
  try {
127
129
  const formData = new FormData();
128
130
  formData.append("file", file);
129
- const response = await fetch("/api/hazo_auth/upload_profile_picture", {
131
+ const response = await fetch(`${apiBasePath}/upload_profile_picture`, {
130
132
  method: "POST",
131
133
  credentials: "include",
132
134
  body: formData,
@@ -1 +1 @@
1
- {"version":3,"file":"profile_picture_library_tab.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/my_settings/components/profile_picture_library_tab.tsx"],"names":[],"mappings":"AAcA,MAAM,MAAM,6BAA6B,GAAG;IAC1C,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC;CACjC,CAAC;AAGF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,QAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,GACxB,EAAE,6BAA6B,2CAuQ/B"}
1
+ {"version":3,"file":"profile_picture_library_tab.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/my_settings/components/profile_picture_library_tab.tsx"],"names":[],"mappings":"AAeA,MAAM,MAAM,6BAA6B,GAAG;IAC1C,UAAU,EAAE,OAAO,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,uBAAuB,EAAE,MAAM,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC;CACjC,CAAC;AAGF;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,EACvC,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,QAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,EACvB,uBAAuB,GACxB,EAAE,6BAA6B,2CAwQ/B"}
@@ -10,6 +10,7 @@ import { Avatar, AvatarFallback } from "../../../ui/avatar";
10
10
  import { VerticalTabs, VerticalTabsList, VerticalTabsTrigger } from "../../../ui/vertical-tabs";
11
11
  import { Loader2 } from "lucide-react";
12
12
  import { HazoUITooltip } from "../../../ui/hazo_ui_tooltip";
13
+ import { useHazoAuthConfig } from "../../../../contexts/hazo_auth_provider";
13
14
  // section: component
14
15
  /**
15
16
  * Library tab component for profile picture dialog
@@ -19,6 +20,7 @@ import { HazoUITooltip } from "../../../ui/hazo_ui_tooltip";
19
20
  * @returns Library tab component
20
21
  */
21
22
  export function ProfilePictureLibraryTab({ useLibrary, onUseLibraryChange, onPhotoSelect, disabled = false, libraryPhotoPath, currentPhotoUrl, libraryTooltipMessage, tooltipIconSizeSmall, libraryPhotoGridColumns, libraryPhotoPreviewSize, }) {
23
+ const { apiBasePath } = useHazoAuthConfig();
22
24
  const [categories, setCategories] = useState([]);
23
25
  const [selectedCategory, setSelectedCategory] = useState(null);
24
26
  const [photos, setPhotos] = useState([]);
@@ -30,7 +32,7 @@ export function ProfilePictureLibraryTab({ useLibrary, onUseLibraryChange, onPho
30
32
  const loadCategories = async () => {
31
33
  setLoadingCategories(true);
32
34
  try {
33
- const response = await fetch("/api/hazo_auth/library_photos");
35
+ const response = await fetch(`${apiBasePath}/library_photos`);
34
36
  const data = await response.json();
35
37
  if (data.success && data.categories) {
36
38
  setCategories(data.categories);
@@ -70,7 +72,7 @@ export function ProfilePictureLibraryTab({ useLibrary, onUseLibraryChange, onPho
70
72
  const loadPhotos = async () => {
71
73
  setLoadingPhotos(true);
72
74
  try {
73
- const response = await fetch(`/api/hazo_auth/library_photos?category=${encodeURIComponent(selectedCategory)}`);
75
+ const response = await fetch(`${apiBasePath}/library_photos?category=${encodeURIComponent(selectedCategory)}`);
74
76
  const data = await response.json();
75
77
  if (data.success && data.photos) {
76
78
  setPhotos(data.photos);
@@ -1 +1 @@
1
- {"version":3,"file":"use_my_settings.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/my_settings/hooks/use_my_settings.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAG3F,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,OAAO,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,MAAM,EAAE;QACN,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAChC,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAEhC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IAGjB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,yBAAyB,EAAE,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,GAAG,iBAAiB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjH,wBAAwB,EAAE,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,GAAG,iBAAiB,KAAK,IAAI,CAAC;IACjG,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,sBAAsB,EAAE,OAAO,CAAC;IAGhC,wBAAwB,EAAE,OAAO,CAAC;IAClC,wBAAwB,EAAE,MAAM,IAAI,CAAC;IACrC,+BAA+B,EAAE,MAAM,IAAI,CAAC;IAC5C,wBAAwB,EAAE,CAAC,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzH,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGhD,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAGlD,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,oBAAoB,EAAE,0BAA0B,CAAC;CAClD,CAAC;AA4BF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAC9B,oBAAoB,GACrB,EAAE,mBAAmB,GAAG,mBAAmB,CA0W3C"}
1
+ {"version":3,"file":"use_my_settings.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/my_settings/hooks/use_my_settings.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAI3F,MAAM,MAAM,cAAc,GAAG;IAC3B,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,OAAO,CAAC;IAChC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,sBAAsB,EAAE,OAAO,CAAC;IAChC,MAAM,EAAE;QACN,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAChC,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAEhC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IAGjB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,yBAAyB,EAAE,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,GAAG,iBAAiB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjH,wBAAwB,EAAE,CAAC,KAAK,EAAE,iBAAiB,GAAG,aAAa,GAAG,iBAAiB,KAAK,IAAI,CAAC;IACjG,kBAAkB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,sBAAsB,EAAE,OAAO,CAAC;IAGhC,wBAAwB,EAAE,OAAO,CAAC;IAClC,wBAAwB,EAAE,MAAM,IAAI,CAAC;IACrC,+BAA+B,EAAE,MAAM,IAAI,CAAC;IAC5C,wBAAwB,EAAE,CAAC,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzH,0BAA0B,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAGhD,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAGlD,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,oBAAoB,EAAE,0BAA0B,CAAC;CAClD,CAAC;AA4BF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAC9B,oBAAoB,GACrB,EAAE,mBAAmB,GAAG,mBAAmB,CA2W3C"}
@@ -5,6 +5,7 @@
5
5
  import { useState, useCallback } from "react";
6
6
  import { use_auth_status, trigger_auth_status_refresh } from "../../shared/hooks/use_auth_status";
7
7
  import { toast } from "sonner";
8
+ import { useHazoAuthConfig } from "../../../../contexts/hazo_auth_provider";
8
9
  // section: helpers
9
10
  /**
10
11
  * Validates email format
@@ -36,6 +37,7 @@ const validateName = (name) => {
36
37
  * @returns My settings hook result with state and actions
37
38
  */
38
39
  export function use_my_settings({ passwordRequirements, }) {
40
+ const { apiBasePath } = useHazoAuthConfig();
39
41
  const authStatus = use_auth_status();
40
42
  // Password fields state
41
43
  const [passwordFields, setPasswordFields] = useState({
@@ -72,7 +74,7 @@ export function use_my_settings({ passwordRequirements, }) {
72
74
  throw new Error(validationError);
73
75
  }
74
76
  try {
75
- const response = await fetch("/api/hazo_auth/update_user", {
77
+ const response = await fetch(`${apiBasePath}/update_user`, {
76
78
  method: "PATCH",
77
79
  headers: {
78
80
  "Content-Type": "application/json",
@@ -105,7 +107,7 @@ export function use_my_settings({ passwordRequirements, }) {
105
107
  throw new Error(validationError);
106
108
  }
107
109
  try {
108
- const response = await fetch("/api/hazo_auth/update_user", {
110
+ const response = await fetch(`${apiBasePath}/update_user`, {
109
111
  method: "PATCH",
110
112
  headers: {
111
113
  "Content-Type": "application/json",
@@ -216,7 +218,7 @@ export function use_my_settings({ passwordRequirements, }) {
216
218
  return;
217
219
  }
218
220
  try {
219
- const response = await fetch("/api/hazo_auth/change_password", {
221
+ const response = await fetch(`${apiBasePath}/change_password`, {
220
222
  method: "POST",
221
223
  headers: {
222
224
  "Content-Type": "application/json",
@@ -274,7 +276,7 @@ export function use_my_settings({ passwordRequirements, }) {
274
276
  */
275
277
  const handleProfilePictureSave = useCallback(async (profilePictureUrl, profileSource) => {
276
278
  try {
277
- const response = await fetch("/api/hazo_auth/update_user", {
279
+ const response = await fetch(`${apiBasePath}/update_user`, {
278
280
  method: "PATCH",
279
281
  headers: {
280
282
  "Content-Type": "application/json",
@@ -308,7 +310,7 @@ export function use_my_settings({ passwordRequirements, }) {
308
310
  */
309
311
  const handleProfilePictureRemove = useCallback(async () => {
310
312
  try {
311
- const response = await fetch("/api/hazo_auth/remove_profile_picture", {
313
+ const response = await fetch(`${apiBasePath}/remove_profile_picture`, {
312
314
  method: "DELETE",
313
315
  headers: {
314
316
  "Content-Type": "application/json",
@@ -1,6 +1,7 @@
1
1
  import { type MySettingsLabelOverrides } from "./config/my_settings_field_config";
2
2
  import type { PasswordRequirementOptions, ButtonPaletteOverrides } from "../shared/config/layout_customization";
3
3
  export type MySettingsLayoutProps = {
4
+ className?: string;
4
5
  labels?: MySettingsLabelOverrides;
5
6
  button_colors?: ButtonPaletteOverrides;
6
7
  password_requirements: PasswordRequirementOptions;
@@ -60,5 +61,5 @@ export type MySettingsLayoutProps = {
60
61
  * @param props - Component props including labels, button colors, password requirements, etc.
61
62
  * @returns My settings layout component
62
63
  */
63
- export default function my_settings_layout({ labels, button_colors, password_requirements, profilePicture, userFields, unauthorizedMessage, loginButtonLabel, loginPath, heading, subHeading, profilePhotoLabel, profilePhotoRecommendation, uploadPhotoButtonLabel, removePhotoButtonLabel, profileInformationLabel, passwordLabel, currentPasswordLabel, newPasswordLabel, confirmPasswordLabel, messages, uiSizes, fileTypes, }: MySettingsLayoutProps): import("react/jsx-runtime").JSX.Element;
64
+ export default function my_settings_layout({ className, labels, button_colors, password_requirements, profilePicture, userFields, unauthorizedMessage, loginButtonLabel, loginPath, heading, subHeading, profilePhotoLabel, profilePhotoRecommendation, uploadPhotoButtonLabel, removePhotoButtonLabel, profileInformationLabel, passwordLabel, currentPasswordLabel, newPasswordLabel, confirmPasswordLabel, messages, uiSizes, fileTypes, }: MySettingsLayoutProps): import("react/jsx-runtime").JSX.Element;
64
65
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/my_settings/index.tsx"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,uCAAuC,CAAC;AAO/C,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,qBAAqB,EAAE,0BAA0B,CAAC;IAClD,cAAc,EAAE;QACd,kBAAkB,EAAE,OAAO,CAAC;QAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,4BAA4B,EAAE,UAAU,GAAG,SAAS,CAAC;QACrD,4BAA4B,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;QACtD,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,UAAU,EAAE;QACV,eAAe,EAAE,OAAO,CAAC;QACzB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE;QACR,6BAA6B,EAAE,MAAM,CAAC;QACtC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,2BAA2B,EAAE,MAAM,CAAC;QACpC,uBAAuB,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,yBAAyB,EAAE,MAAM,CAAC;QAClC,uBAAuB,EAAE,MAAM,CAAC;QAChC,0BAA0B,EAAE,MAAM,CAAC;QACnC,0BAA0B,EAAE,MAAM,CAAC;QACnC,+BAA+B,EAAE,MAAM,CAAC;QACxC,4BAA4B,EAAE,MAAM,CAAC;KACtC,CAAC;IACF,SAAS,EAAE;QACT,wBAAwB,EAAE,MAAM,EAAE,CAAC;QACnC,wBAAwB,EAAE,MAAM,EAAE,CAAC;KACpC,CAAC;CACH,CAAC;AAGF;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EACzC,MAAM,EACN,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,UAAU,EACV,mBAAkE,EAClE,gBAAgC,EAChC,SAA8B,EAC9B,OAA4B,EAC5B,UAAoE,EACpE,iBAAmC,EACnC,0BAAqE,EACrE,sBAA2C,EAC3C,sBAAiC,EACjC,uBAA+C,EAC/C,aAA0B,EAC1B,oBAAyC,EACzC,gBAAiC,EACjC,oBAAyC,EACzC,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,qBAAqB,2CAqNvB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/my_settings/index.tsx"],"names":[],"mappings":"AAWA,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EACV,0BAA0B,EAC1B,sBAAsB,EACvB,MAAM,uCAAuC,CAAC;AAQ/C,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAClC,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,qBAAqB,EAAE,0BAA0B,CAAC;IAClD,cAAc,EAAE;QACd,kBAAkB,EAAE,OAAO,CAAC;QAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,4BAA4B,EAAE,UAAU,GAAG,SAAS,CAAC;QACrD,4BAA4B,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;QACtD,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,UAAU,EAAE;QACV,eAAe,EAAE,OAAO,CAAC;QACzB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,mBAAmB,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,EAAE;QACR,6BAA6B,EAAE,MAAM,CAAC;QACtC,sBAAsB,EAAE,MAAM,CAAC;QAC/B,2BAA2B,EAAE,MAAM,CAAC;QACpC,uBAAuB,EAAE,MAAM,CAAC;KACjC,CAAC;IACF,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,yBAAyB,EAAE,MAAM,CAAC;QAClC,uBAAuB,EAAE,MAAM,CAAC;QAChC,0BAA0B,EAAE,MAAM,CAAC;QACnC,0BAA0B,EAAE,MAAM,CAAC;QACnC,+BAA+B,EAAE,MAAM,CAAC;QACxC,4BAA4B,EAAE,MAAM,CAAC;KACtC,CAAC;IACF,SAAS,EAAE;QACT,wBAAwB,EAAE,MAAM,EAAE,CAAC;QACnC,wBAAwB,EAAE,MAAM,EAAE,CAAC;KACpC,CAAC;CACH,CAAC;AAGF;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,kBAAkB,CAAC,EACzC,SAAS,EACT,MAAM,EACN,aAAa,EACb,qBAAqB,EACrB,cAAc,EACd,UAAU,EACV,mBAAkE,EAClE,gBAAgC,EAChC,SAA8B,EAC9B,OAA4B,EAC5B,UAAoE,EACpE,iBAAmC,EACnC,0BAAqE,EACrE,sBAA2C,EAC3C,sBAAiC,EACjC,uBAA+C,EAC/C,aAA0B,EAC1B,oBAAyC,EACzC,gBAAiC,EACjC,oBAAyC,EACzC,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,qBAAqB,2CAqNvB"}
@@ -13,6 +13,7 @@ import { resolveMySettingsLabels, resolveMySettingsButtonPalette, } from "./conf
13
13
  import { PasswordField } from "../shared/components/password_field";
14
14
  import { FormFieldWrapper } from "../shared/components/form_field_wrapper";
15
15
  import { Pencil, Trash2 } from "lucide-react";
16
+ import { cn } from "../../../lib/utils";
16
17
  // section: component
17
18
  /**
18
19
  * My Settings layout component with tabs for profile and security settings
@@ -21,14 +22,14 @@ import { Pencil, Trash2 } from "lucide-react";
21
22
  * @param props - Component props including labels, button colors, password requirements, etc.
22
23
  * @returns My settings layout component
23
24
  */
24
- export default function my_settings_layout({ labels, button_colors, password_requirements, profilePicture, userFields, unauthorizedMessage = "You must be logged in to access this page.", loginButtonLabel = "Go to login", loginPath = "/hazo_auth/login", heading = "Account Settings", subHeading = "Manage your profile, password, and email preferences.", profilePhotoLabel = "Profile Photo", profilePhotoRecommendation = "Recommended size: 200x200px. JPG, PNG.", uploadPhotoButtonLabel = "Upload New Photo", removePhotoButtonLabel = "Remove", profileInformationLabel = "Profile Information", passwordLabel = "Password", currentPasswordLabel = "Current Password", newPasswordLabel = "New Password", confirmPasswordLabel = "Confirm Password", messages, uiSizes, fileTypes, }) {
25
+ export default function my_settings_layout({ className, labels, button_colors, password_requirements, profilePicture, userFields, unauthorizedMessage = "You must be logged in to access this page.", loginButtonLabel = "Go to login", loginPath = "/hazo_auth/login", heading = "Account Settings", subHeading = "Manage your profile, password, and email preferences.", profilePhotoLabel = "Profile Photo", profilePhotoRecommendation = "Recommended size: 200x200px. JPG, PNG.", uploadPhotoButtonLabel = "Upload New Photo", removePhotoButtonLabel = "Remove", profileInformationLabel = "Profile Information", passwordLabel = "Password", currentPasswordLabel = "Current Password", newPasswordLabel = "New Password", confirmPasswordLabel = "Confirm Password", messages, uiSizes, fileTypes, }) {
25
26
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
26
27
  const resolvedLabels = resolveMySettingsLabels(labels);
27
28
  const resolvedButtonPalette = resolveMySettingsButtonPalette(button_colors);
28
29
  const settings = use_my_settings({
29
30
  passwordRequirements: password_requirements,
30
31
  });
31
- return (_jsx(UnauthorizedGuard, { message: unauthorizedMessage, loginButtonLabel: loginButtonLabel, loginPath: loginPath, children: _jsxs("div", { className: "cls_my_settings_layout flex flex-col gap-6 p-6 max-w-4xl mx-auto min-h-screen bg-[var(--hazo-bg-subtle)]", children: [_jsxs("div", { className: "cls_my_settings_layout_header flex flex-col gap-2", children: [_jsx("h1", { className: "cls_my_settings_layout_heading text-3xl font-bold text-[var(--hazo-text-primary)]", children: heading }), _jsx("p", { className: "cls_my_settings_layout_subheading text-[var(--hazo-text-muted)]", children: subHeading })] }), _jsxs("div", { className: "cls_my_settings_layout_profile_photo_section bg-white rounded-lg border border-[var(--hazo-border)] p-6", children: [_jsx("h2", { className: "cls_my_settings_layout_section_heading text-lg font-semibold text-[var(--hazo-text-primary)] mb-4", children: profilePhotoLabel }), _jsx("div", { className: "cls_my_settings_layout_profile_photo_content flex flex-col items-center", children: _jsxs("div", { className: "cls_my_settings_layout_profile_photo_display relative", children: [_jsx(ProfilePictureDisplay, { profilePictureUrl: settings.profilePictureUrl, name: settings.name, email: settings.email, onEdit: settings.handleProfilePictureEdit }), _jsxs("div", { className: "cls_my_settings_layout_profile_photo_actions absolute left-0 right-0 flex items-center justify-between px-2", style: { bottom: '-20px' }, children: [_jsx(Button, { type: "button", onClick: settings.handleProfilePictureEdit, disabled: settings.loading, variant: "ghost", size: "icon", className: "cls_my_settings_layout_upload_photo_button", "aria-label": uploadPhotoButtonLabel, children: _jsx(Pencil, { className: "h-4 w-4", "aria-hidden": "true" }) }), _jsx(Button, { type: "button", onClick: settings.handleProfilePictureRemove, disabled: settings.loading || !settings.profilePictureUrl, variant: "ghost", size: "icon", className: "cls_my_settings_layout_remove_photo_button text-red-600 hover:text-red-700 hover:bg-red-50", "aria-label": removePhotoButtonLabel, children: _jsx(Trash2, { className: "h-4 w-4", "aria-hidden": "true" }) })] })] }) })] }), _jsxs("div", { className: "cls_my_settings_layout_profile_information_section bg-white rounded-lg border border-[var(--hazo-border)] p-6", children: [_jsx("h2", { className: "cls_my_settings_layout_section_heading text-lg font-semibold text-[var(--hazo-text-primary)] mb-4", children: profileInformationLabel }), _jsxs("div", { className: "cls_my_settings_layout_profile_information_fields grid grid-cols-1 md:grid-cols-2 gap-6", children: [userFields.show_name_field && (_jsx(EditableField, { label: "Full Name", value: settings.name, type: "text", placeholder: "Enter your full name", onSave: settings.handleNameSave, validation: validateName, disabled: settings.loading, ariaLabel: "Full name input field" })), userFields.show_email_field && (_jsx(EditableField, { label: "Email Address", value: settings.email, type: "email", placeholder: "Enter your email address", onSave: settings.handleEmailSave, validation: validateEmail, disabled: settings.loading, ariaLabel: "Email address input field" }))] })] }), userFields.show_password_field && (_jsxs("div", { className: "cls_my_settings_layout_password_section bg-white rounded-lg border border-[var(--hazo-border)] p-6", children: [_jsx("h2", { className: "cls_my_settings_layout_section_heading text-lg font-semibold text-[var(--hazo-text-primary)] mb-4", children: passwordLabel }), _jsxs("div", { className: "cls_my_settings_layout_password_fields flex flex-col gap-6", children: [_jsx(FormFieldWrapper, { fieldId: "current-password", label: currentPasswordLabel, input: _jsx(PasswordField, { inputId: "current-password", ariaLabel: currentPasswordLabel, value: ((_a = settings.passwordFields) === null || _a === void 0 ? void 0 : _a.currentPassword) || "", placeholder: "Enter your current password", autoComplete: "current-password", isVisible: ((_b = settings.passwordFields) === null || _b === void 0 ? void 0 : _b.currentPasswordVisible) || false, onChange: (value) => settings.handlePasswordFieldChange("currentPassword", value), onToggleVisibility: () => settings.togglePasswordVisibility("currentPassword"), errorMessage: (_d = (_c = settings.passwordFields) === null || _c === void 0 ? void 0 : _c.errors) === null || _d === void 0 ? void 0 : _d.currentPassword }) }), _jsxs("div", { className: "cls_my_settings_layout_password_fields_row grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsx(FormFieldWrapper, { fieldId: "new-password", label: newPasswordLabel, input: _jsx(PasswordField, { inputId: "new-password", ariaLabel: newPasswordLabel, value: ((_e = settings.passwordFields) === null || _e === void 0 ? void 0 : _e.newPassword) || "", placeholder: "Enter your new password", autoComplete: "new-password", isVisible: ((_f = settings.passwordFields) === null || _f === void 0 ? void 0 : _f.newPasswordVisible) || false, onChange: (value) => settings.handlePasswordFieldChange("newPassword", value), onToggleVisibility: () => settings.togglePasswordVisibility("newPassword"), errorMessage: (_h = (_g = settings.passwordFields) === null || _g === void 0 ? void 0 : _g.errors) === null || _h === void 0 ? void 0 : _h.newPassword }) }), _jsx(FormFieldWrapper, { fieldId: "confirm-password", label: confirmPasswordLabel, input: _jsx(PasswordField, { inputId: "confirm-password", ariaLabel: confirmPasswordLabel, value: ((_j = settings.passwordFields) === null || _j === void 0 ? void 0 : _j.confirmPassword) || "", placeholder: "Confirm your new password", autoComplete: "new-password", isVisible: ((_k = settings.passwordFields) === null || _k === void 0 ? void 0 : _k.confirmPasswordVisible) || false, onChange: (value) => settings.handlePasswordFieldChange("confirmPassword", value), onToggleVisibility: () => settings.togglePasswordVisibility("confirmPassword"), errorMessage: (_m = (_l = settings.passwordFields) === null || _l === void 0 ? void 0 : _l.errors) === null || _m === void 0 ? void 0 : _m.confirmPassword }) })] })] }), _jsx("div", { className: "cls_my_settings_layout_password_actions flex justify-end mt-4", children: _jsx(Button, { type: "button", onClick: settings.handlePasswordSave, disabled: settings.loading || settings.isPasswordSaveDisabled, className: "cls_my_settings_layout_save_password_button", style: {
32
+ return (_jsx(UnauthorizedGuard, { message: unauthorizedMessage, loginButtonLabel: loginButtonLabel, loginPath: loginPath, children: _jsxs("div", { className: cn("cls_my_settings_layout flex flex-col gap-6 p-6 w-full", className), children: [_jsxs("div", { className: "cls_my_settings_layout_header flex flex-col gap-2", children: [_jsx("h1", { className: "cls_my_settings_layout_heading text-3xl font-bold text-[var(--hazo-text-primary)]", children: heading }), _jsx("p", { className: "cls_my_settings_layout_subheading text-[var(--hazo-text-muted)]", children: subHeading })] }), _jsxs("div", { className: "cls_my_settings_layout_profile_photo_section bg-white rounded-lg border border-[var(--hazo-border)] p-6", children: [_jsx("h2", { className: "cls_my_settings_layout_section_heading text-lg font-semibold text-[var(--hazo-text-primary)] mb-4", children: profilePhotoLabel }), _jsx("div", { className: "cls_my_settings_layout_profile_photo_content flex flex-col items-center", children: _jsxs("div", { className: "cls_my_settings_layout_profile_photo_display relative", children: [_jsx(ProfilePictureDisplay, { profilePictureUrl: settings.profilePictureUrl, name: settings.name, email: settings.email, onEdit: settings.handleProfilePictureEdit }), _jsxs("div", { className: "cls_my_settings_layout_profile_photo_actions absolute left-0 right-0 flex items-center justify-between px-2", style: { bottom: '-20px' }, children: [_jsx(Button, { type: "button", onClick: settings.handleProfilePictureEdit, disabled: settings.loading, variant: "ghost", size: "icon", className: "cls_my_settings_layout_upload_photo_button", "aria-label": uploadPhotoButtonLabel, children: _jsx(Pencil, { className: "h-4 w-4", "aria-hidden": "true" }) }), _jsx(Button, { type: "button", onClick: settings.handleProfilePictureRemove, disabled: settings.loading || !settings.profilePictureUrl, variant: "ghost", size: "icon", className: "cls_my_settings_layout_remove_photo_button text-red-600 hover:text-red-700 hover:bg-red-50", "aria-label": removePhotoButtonLabel, children: _jsx(Trash2, { className: "h-4 w-4", "aria-hidden": "true" }) })] })] }) })] }), _jsxs("div", { className: "cls_my_settings_layout_profile_information_section bg-white rounded-lg border border-[var(--hazo-border)] p-6", children: [_jsx("h2", { className: "cls_my_settings_layout_section_heading text-lg font-semibold text-[var(--hazo-text-primary)] mb-4", children: profileInformationLabel }), _jsxs("div", { className: "cls_my_settings_layout_profile_information_fields grid grid-cols-1 md:grid-cols-2 gap-6", children: [userFields.show_name_field && (_jsx(EditableField, { label: "Full Name", value: settings.name, type: "text", placeholder: "Enter your full name", onSave: settings.handleNameSave, validation: validateName, disabled: settings.loading, ariaLabel: "Full name input field" })), userFields.show_email_field && (_jsx(EditableField, { label: "Email Address", value: settings.email, type: "email", placeholder: "Enter your email address", onSave: settings.handleEmailSave, validation: validateEmail, disabled: settings.loading, ariaLabel: "Email address input field" }))] })] }), userFields.show_password_field && (_jsxs("div", { className: "cls_my_settings_layout_password_section bg-white rounded-lg border border-[var(--hazo-border)] p-6", children: [_jsx("h2", { className: "cls_my_settings_layout_section_heading text-lg font-semibold text-[var(--hazo-text-primary)] mb-4", children: passwordLabel }), _jsxs("div", { className: "cls_my_settings_layout_password_fields flex flex-col gap-6", children: [_jsx(FormFieldWrapper, { fieldId: "current-password", label: currentPasswordLabel, input: _jsx(PasswordField, { inputId: "current-password", ariaLabel: currentPasswordLabel, value: ((_a = settings.passwordFields) === null || _a === void 0 ? void 0 : _a.currentPassword) || "", placeholder: "Enter your current password", autoComplete: "current-password", isVisible: ((_b = settings.passwordFields) === null || _b === void 0 ? void 0 : _b.currentPasswordVisible) || false, onChange: (value) => settings.handlePasswordFieldChange("currentPassword", value), onToggleVisibility: () => settings.togglePasswordVisibility("currentPassword"), errorMessage: (_d = (_c = settings.passwordFields) === null || _c === void 0 ? void 0 : _c.errors) === null || _d === void 0 ? void 0 : _d.currentPassword }) }), _jsxs("div", { className: "cls_my_settings_layout_password_fields_row grid grid-cols-1 md:grid-cols-2 gap-6", children: [_jsx(FormFieldWrapper, { fieldId: "new-password", label: newPasswordLabel, input: _jsx(PasswordField, { inputId: "new-password", ariaLabel: newPasswordLabel, value: ((_e = settings.passwordFields) === null || _e === void 0 ? void 0 : _e.newPassword) || "", placeholder: "Enter your new password", autoComplete: "new-password", isVisible: ((_f = settings.passwordFields) === null || _f === void 0 ? void 0 : _f.newPasswordVisible) || false, onChange: (value) => settings.handlePasswordFieldChange("newPassword", value), onToggleVisibility: () => settings.togglePasswordVisibility("newPassword"), errorMessage: (_h = (_g = settings.passwordFields) === null || _g === void 0 ? void 0 : _g.errors) === null || _h === void 0 ? void 0 : _h.newPassword }) }), _jsx(FormFieldWrapper, { fieldId: "confirm-password", label: confirmPasswordLabel, input: _jsx(PasswordField, { inputId: "confirm-password", ariaLabel: confirmPasswordLabel, value: ((_j = settings.passwordFields) === null || _j === void 0 ? void 0 : _j.confirmPassword) || "", placeholder: "Confirm your new password", autoComplete: "new-password", isVisible: ((_k = settings.passwordFields) === null || _k === void 0 ? void 0 : _k.confirmPasswordVisible) || false, onChange: (value) => settings.handlePasswordFieldChange("confirmPassword", value), onToggleVisibility: () => settings.togglePasswordVisibility("confirmPassword"), errorMessage: (_m = (_l = settings.passwordFields) === null || _l === void 0 ? void 0 : _l.errors) === null || _m === void 0 ? void 0 : _m.confirmPassword }) })] })] }), _jsx("div", { className: "cls_my_settings_layout_password_actions flex justify-end mt-4", children: _jsx(Button, { type: "button", onClick: settings.handlePasswordSave, disabled: settings.loading || settings.isPasswordSaveDisabled, className: "cls_my_settings_layout_save_password_button", style: {
32
33
  backgroundColor: resolvedButtonPalette.submitBackground,
33
34
  color: resolvedButtonPalette.submitText,
34
35
  }, "aria-label": "Save password", children: "Save Password" }) })] })), _jsx(ProfilePictureDialog, { open: settings.profilePictureDialogOpen, onOpenChange: (open) => {
@@ -1 +1 @@
1
- {"version":3,"file":"use_register_form.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/register/hooks/use_register_form.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AACzH,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAU3F,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAC1C,OAAO,CAAC,eAAe,EAAE,UAAU,GAAG,kBAAkB,CAAC,EACzD,OAAO,CACR,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,OAAO,GAAG,OAAO,IAAI;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,oBAAoB,EAAE,0BAA0B,CAAC;IACjD,4BAA4B,CAAC,EAAE,4BAA4B,CAAC;IAC5D,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,wBAAwB,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,KAAK,IAAI,CAAC;IAC7E,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAYF,eAAO,MAAM,iBAAiB,GAAI,OAAO,EAAG,kEAKzC,qBAAqB,CAAC,OAAO,CAAC,KAAG,qBAmNnC,CAAC"}
1
+ {"version":3,"file":"use_register_form.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/register/hooks/use_register_form.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AACzH,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAW3F,MAAM,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG;IACrF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAC1C,OAAO,CAAC,eAAe,EAAE,UAAU,GAAG,kBAAkB,CAAC,EACzD,OAAO,CACR,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,OAAO,GAAG,OAAO,IAAI;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,oBAAoB,EAAE,0BAA0B,CAAC;IACjD,4BAA4B,CAAC,EAAE,4BAA4B,CAAC;IAC5D,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,wBAAwB,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,KAAK,IAAI,CAAC;IAC7E,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAYF,eAAO,MAAM,iBAAiB,GAAI,OAAO,EAAG,kEAKzC,qBAAqB,CAAC,OAAO,CAAC,KAAG,qBAmPnC,CAAC"}
@@ -4,6 +4,7 @@ import { useCallback, useMemo, useState } from "react";
4
4
  import { toast } from "sonner";
5
5
  import { REGISTER_FIELD_IDS } from "../config/register_field_config";
6
6
  import { validateEmail, validatePassword } from "../../shared/utils/validation";
7
+ import { useHazoAuthConfig } from "../../../../contexts/hazo_auth_provider";
7
8
  // section: constants
8
9
  const PASSWORD_FIELDS = [
9
10
  REGISTER_FIELD_IDS.PASSWORD,
@@ -18,7 +19,9 @@ const buildInitialValues = () => ({
18
19
  });
19
20
  // section: hook
20
21
  export const use_register_form = ({ showNameField, passwordRequirements, dataClient, urlOnLogon, }) => {
21
- const [values, setValues] = useState(buildInitialValues);
22
+ const { apiBasePath } = useHazoAuthConfig();
23
+ const initialValues = useMemo(() => buildInitialValues(), []);
24
+ const [values, setValues] = useState(initialValues);
22
25
  const [errors, setErrors] = useState({});
23
26
  const [passwordVisibility, setPasswordVisibility] = useState({
24
27
  password: false,
@@ -26,19 +29,44 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
26
29
  });
27
30
  const [emailTouched, setEmailTouched] = useState(false);
28
31
  const [isSubmitting, setIsSubmitting] = useState(false);
32
+ // Check if form has been edited (changed from initial state)
33
+ const isFormEdited = useMemo(() => {
34
+ return Object.entries(values).some(([fieldId, fieldValue]) => {
35
+ if (fieldId === REGISTER_FIELD_IDS.NAME && !showNameField) {
36
+ return false;
37
+ }
38
+ return fieldValue.trim() !== initialValues[fieldId].trim();
39
+ });
40
+ }, [values, initialValues, showNameField]);
29
41
  const isSubmitDisabled = useMemo(() => {
42
+ // Disable if submitting
30
43
  if (isSubmitting) {
31
44
  return true;
32
45
  }
46
+ // Disable if form hasn't been edited
47
+ if (!isFormEdited) {
48
+ return true;
49
+ }
50
+ // Disable if there are validation errors (excluding submit errors)
51
+ const validationErrors = Object.assign({}, errors);
52
+ delete validationErrors.submit;
53
+ const hasErrors = Object.keys(validationErrors).length > 0;
54
+ if (hasErrors) {
55
+ return true;
56
+ }
57
+ // Disable if required fields are empty
33
58
  const hasEmptyField = Object.entries(values).some(([fieldId, fieldValue]) => {
34
59
  if (fieldId === REGISTER_FIELD_IDS.NAME && !showNameField) {
35
60
  return false;
36
61
  }
37
62
  return fieldValue.trim() === "";
38
63
  });
39
- const hasErrors = Object.keys(errors).length > 0;
40
- return hasEmptyField || hasErrors;
41
- }, [errors, showNameField, values, isSubmitting]);
64
+ if (hasEmptyField) {
65
+ return true;
66
+ }
67
+ // Enable if form is edited, has no errors, and all required fields are filled
68
+ return false;
69
+ }, [errors, showNameField, values, isSubmitting, isFormEdited]);
42
70
  const togglePasswordVisibility = useCallback((fieldId) => {
43
71
  setPasswordVisibility((previous) => (Object.assign(Object.assign({}, previous), { [fieldId]: !previous[fieldId] })));
44
72
  }, []);
@@ -115,7 +143,7 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
115
143
  setIsSubmitting(true);
116
144
  setErrors({});
117
145
  try {
118
- const response = await fetch("/api/hazo_auth/register", {
146
+ const response = await fetch(`${apiBasePath}/register`, {
119
147
  method: "POST",
120
148
  headers: {
121
149
  "Content-Type": "application/json",
@@ -136,7 +164,8 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
136
164
  description: "Your account has been created successfully.",
137
165
  });
138
166
  // Reset form on success
139
- setValues(buildInitialValues());
167
+ const resetValues = buildInitialValues();
168
+ setValues(resetValues);
140
169
  setErrors({});
141
170
  setPasswordVisibility({
142
171
  password: false,
@@ -160,7 +189,8 @@ export const use_register_form = ({ showNameField, passwordRequirements, dataCli
160
189
  }
161
190
  }, [values, passwordRequirements, dataClient, urlOnLogon]);
162
191
  const handleCancel = useCallback(() => {
163
- setValues(buildInitialValues());
192
+ const resetValues = buildInitialValues();
193
+ setValues(resetValues);
164
194
  setErrors({});
165
195
  setPasswordVisibility({
166
196
  password: false,
@@ -1,7 +1,8 @@
1
1
  import { type ButtonPaletteOverrides, type LayoutFieldMapOverrides, type LayoutLabelOverrides, type PasswordRequirementOverrides } from "../shared/config/layout_customization";
2
2
  import { type LayoutDataClient } from "../shared/data/layout_data_client";
3
+ import type { StaticImageData } from "next/image";
3
4
  export type RegisterLayoutProps<TClient = unknown> = {
4
- image_src: string;
5
+ image_src: string | StaticImageData;
5
6
  image_alt: string;
6
7
  image_background_color?: string;
7
8
  field_overrides?: LayoutFieldMapOverrides;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/register/index.tsx"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EAClC,MAAM,uCAAuC,CAAC;AAY/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,MAAM,MAAM,mBAAmB,CAAC,OAAO,GAAG,OAAO,IAAI;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,qBAAqB,CAAC,EAAE,4BAA4B,CAAC;IACrD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAYF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,OAAO,EAAE,EAC/C,SAAS,EACT,SAAS,EACT,sBAAkC,EAClC,eAAe,EACf,MAAM,EACN,aAAa,EACb,qBAAqB,EACrB,eAAsB,EACtB,WAAW,EACX,sBAAoD,EACpD,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,UAA+B,EAC/B,WAAuB,EACvB,UAAU,GACX,EAAE,mBAAmB,CAAC,OAAO,CAAC,2CA+I9B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/register/index.tsx"],"names":[],"mappings":"AAaA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EAClC,MAAM,uCAAuC,CAAC;AAY/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,MAAM,mBAAmB,CAAC,OAAO,GAAG,OAAO,IAAI;IACnD,SAAS,EAAE,MAAM,GAAG,eAAe,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,qBAAqB,CAAC,EAAE,4BAA4B,CAAC;IACrD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAYF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,OAAO,EAAE,EAC/C,SAAS,EACT,SAAS,EACT,sBAAkC,EAClC,eAAe,EACf,MAAM,EACN,aAAa,EACb,qBAAqB,EACrB,eAAsB,EACtB,WAAW,EACX,sBAAoD,EACpD,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,UAA+B,EAC/B,WAAuB,EACvB,UAAU,GACX,EAAE,mBAAmB,CAAC,OAAO,CAAC,2CA+I9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"use_reset_password_form.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/reset_password/hooks/use_reset_password_form.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAA4B,KAAK,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAU5G,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AAC3E,MAAM,MAAM,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/F,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAC1C,OAAO,CAAC,oBAAoB,EAAE,UAAU,GAAG,kBAAkB,CAAC,EAC9D,OAAO,CACR,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,OAAO,GAAG,OAAO,IAAI;IAC1D,oBAAoB,EAAE,0BAA0B,CAAC;IACjD,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,uBAAuB,CAAC;IAChC,MAAM,EAAE,uBAAuB,CAAC;IAChC,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,wBAAwB,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,KAAK,IAAI,CAAC;IAC7E,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AASF,eAAO,MAAM,uBAAuB,GAAI,OAAO,EAAG,kDAI/C,0BAA0B,CAAC,OAAO,CAAC,KAAG,0BAyNxC,CAAC"}
1
+ {"version":3,"file":"use_reset_password_form.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/reset_password/hooks/use_reset_password_form.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AAC3F,OAAO,EAA4B,KAAK,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAW5G,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;AAC3E,MAAM,MAAM,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;AAC/F,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAC1C,OAAO,CAAC,oBAAoB,EAAE,UAAU,GAAG,kBAAkB,CAAC,EAC9D,OAAO,CACR,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,OAAO,GAAG,OAAO,IAAI;IAC1D,oBAAoB,EAAE,0BAA0B,CAAC;IACjD,UAAU,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,uBAAuB,CAAC;IAChC,MAAM,EAAE,uBAAuB,CAAC;IAChC,kBAAkB,EAAE,uBAAuB,CAAC;IAC5C,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E,wBAAwB,EAAE,CAAC,OAAO,EAAE,UAAU,GAAG,kBAAkB,KAAK,IAAI,CAAC;IAC7E,YAAY,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AASF,eAAO,MAAM,uBAAuB,GAAI,OAAO,EAAG,kDAI/C,0BAA0B,CAAC,OAAO,CAAC,KAAG,0BA0NxC,CAAC"}
@@ -5,6 +5,7 @@ import { useSearchParams, useRouter } from "next/navigation";
5
5
  import { toast } from "sonner";
6
6
  import { RESET_PASSWORD_FIELD_IDS } from "../config/reset_password_field_config";
7
7
  import { validatePassword } from "../../shared/utils/validation";
8
+ import { useHazoAuthConfig } from "../../../../contexts/hazo_auth_provider";
8
9
  // section: constants
9
10
  const PASSWORD_FIELDS = [
10
11
  RESET_PASSWORD_FIELD_IDS.PASSWORD,
@@ -17,6 +18,7 @@ const buildInitialValues = () => ({
17
18
  });
18
19
  // section: hook
19
20
  export const use_reset_password_form = ({ passwordRequirements, dataClient, loginPath = "/hazo_auth/login", }) => {
21
+ const { apiBasePath } = useHazoAuthConfig();
20
22
  const router = useRouter();
21
23
  const searchParams = useSearchParams();
22
24
  const tokenParam = searchParams.get("token");
@@ -42,7 +44,7 @@ export const use_reset_password_form = ({ passwordRequirements, dataClient, logi
42
44
  setIsValidatingToken(true);
43
45
  setTokenError(null);
44
46
  try {
45
- const response = await fetch(`/api/hazo_auth/validate_reset_token?token=${encodeURIComponent(tokenParam)}`, {
47
+ const response = await fetch(`${apiBasePath}/validate_reset_token?token=${encodeURIComponent(tokenParam)}`, {
46
48
  method: "GET",
47
49
  });
48
50
  const data = await response.json();
@@ -148,7 +150,7 @@ export const use_reset_password_form = ({ passwordRequirements, dataClient, logi
148
150
  }
149
151
  setIsSubmitting(true);
150
152
  try {
151
- const response = await fetch("/api/hazo_auth/reset_password", {
153
+ const response = await fetch(`${apiBasePath}/reset_password`, {
152
154
  method: "POST",
153
155
  headers: {
154
156
  "Content-Type": "application/json",
@@ -1,7 +1,8 @@
1
+ import type { StaticImageData } from "next/image";
1
2
  import { type ButtonPaletteOverrides, type LayoutFieldMapOverrides, type LayoutLabelOverrides, type PasswordRequirementOverrides } from "../shared/config/layout_customization";
2
3
  import { type LayoutDataClient } from "../shared/data/layout_data_client";
3
4
  export type ResetPasswordLayoutProps<TClient = unknown> = {
4
- image_src: string;
5
+ image_src: string | StaticImageData;
5
6
  image_alt: string;
6
7
  image_background_color?: string;
7
8
  field_overrides?: LayoutFieldMapOverrides;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/reset_password/index.tsx"],"names":[],"mappings":"AAYA,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EAClC,MAAM,uCAAuC,CAAC;AAY/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAI1E,MAAM,MAAM,wBAAwB,CAAC,OAAO,GAAG,OAAO,IAAI;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,qBAAqB,CAAC,EAAE,4BAA4B,CAAC;IACrD,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAUF,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,OAAO,EAAE,EACrD,SAAS,EACT,SAAS,EACT,sBAAkC,EAClC,eAAe,EACf,MAAM,EACN,aAAa,EACb,qBAAqB,EACrB,WAAW,EACX,sBAAsB,EACtB,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,YAAgH,EAChH,cAAuE,EACvE,SAA8B,EAC9B,kBAAiD,GAClD,EAAE,wBAAwB,CAAC,OAAO,CAAC,2CAqNnC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/layouts/reset_password/index.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAOlD,OAAO,EACL,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EAClC,MAAM,uCAAuC,CAAC;AAY/C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAI1E,MAAM,MAAM,wBAAwB,CAAC,OAAO,GAAG,OAAO,IAAI;IACxD,SAAS,EAAE,MAAM,GAAG,eAAe,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,eAAe,CAAC,EAAE,uBAAuB,CAAC;IAC1C,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,qBAAqB,CAAC,EAAE,4BAA4B,CAAC;IACrD,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACvC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAUF,MAAM,CAAC,OAAO,UAAU,qBAAqB,CAAC,OAAO,EAAE,EACrD,SAAS,EACT,SAAS,EACT,sBAAkC,EAClC,eAAe,EACf,MAAM,EACN,aAAa,EACb,qBAAqB,EACrB,WAAW,EACX,sBAAsB,EACtB,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,YAAgH,EAChH,cAAuE,EACvE,SAA8B,EAC9B,kBAAiD,GAClD,EAAE,wBAAwB,CAAC,OAAO,CAAC,2CAqNnC"}
@@ -1,5 +1,6 @@
1
+ import type { StaticImageData } from "next/image";
1
2
  export type AlreadyLoggedInGuardProps = {
2
- image_src: string;
3
+ image_src: string | StaticImageData;
3
4
  image_alt: string;
4
5
  image_background_color?: string;
5
6
  message?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"already_logged_in_guard.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/already_logged_in_guard.tsx"],"names":[],"mappings":"AAaA,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAGF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,SAAS,EACT,sBAAkC,EAClC,OAAqC,EACrC,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,oBAA4B,EAC5B,QAAQ,GACT,EAAE,yBAAyB,2CAiD3B"}
1
+ {"version":3,"file":"already_logged_in_guard.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/already_logged_in_guard.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,GAAG,eAAe,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC;AAGF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,SAAS,EACT,SAAS,EACT,sBAAkC,EAClC,OAAqC,EACrC,gBAAuB,EACvB,oBAA4B,EAC5B,qBAAqC,EACrC,cAAoB,EACpB,oBAA4B,EAC5B,QAAQ,GACT,EAAE,yBAAyB,2CAiD3B"}
@@ -1 +1 @@
1
- {"version":3,"file":"logout_button.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/logout_button.tsx"],"names":[],"mappings":"AAaA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IACjF,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;CACzC,CAAC;AAGF,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,OAAmB,EACnB,IAAgB,GACjB,EAAE,iBAAiB,2CAkDnB"}
1
+ {"version":3,"file":"logout_button.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/logout_button.tsx"],"names":[],"mappings":"AAcA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IACjF,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;CACzC,CAAC;AAGF,wBAAgB,YAAY,CAAC,EAC3B,SAAS,EACT,OAAmB,EACnB,IAAgB,GACjB,EAAE,iBAAiB,2CAmDnB"}
@@ -9,14 +9,16 @@ import { Button } from "../../../ui/button";
9
9
  import { LogOut } from "lucide-react";
10
10
  import { toast } from "sonner";
11
11
  import { trigger_auth_status_refresh } from "../hooks/use_auth_status";
12
+ import { useHazoAuthConfig } from "../../../../contexts/hazo_auth_provider";
12
13
  // section: component
13
14
  export function LogoutButton({ className, variant = "outline", size = "default", }) {
15
+ const { apiBasePath } = useHazoAuthConfig();
14
16
  const router = useRouter();
15
17
  const [isLoggingOut, setIsLoggingOut] = useState(false);
16
18
  const handleLogout = async () => {
17
19
  setIsLoggingOut(true);
18
20
  try {
19
- const response = await fetch("/api/hazo_auth/logout", {
21
+ const response = await fetch(`${apiBasePath}/logout`, {
20
22
  method: "POST",
21
23
  headers: {
22
24
  "Content-Type": "application/json",
@@ -1 +1 @@
1
- {"version":3,"file":"profile_pic_menu.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/profile_pic_menu.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAG7F,MAAM,MAAM,mBAAmB,GAAG;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAGF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAC7B,kBAA0B,EAC1B,aAAyB,EACzB,aAAyB,EACzB,aAAqC,EACrC,UAA+B,EAC/B,aAAwC,EACxC,WAAqC,EACrC,iBAAsB,EACtB,SAAS,EACT,WAAuB,EACvB,OAAoB,EACpB,mBAA+B,GAChC,EAAE,mBAAmB,2CAmarB"}
1
+ {"version":3,"file":"profile_pic_menu.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/profile_pic_menu.tsx"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AAI7F,MAAM,MAAM,mBAAmB,GAAG;IAChC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC;IACtC,OAAO,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IACjC,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAGF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,EAC7B,kBAA0B,EAC1B,aAAyB,EACzB,aAAyB,EACzB,aAAqC,EACrC,UAA+B,EAC/B,aAAwC,EACxC,WAAW,EACX,iBAAsB,EACtB,SAAS,EACT,WAAuB,EACvB,OAAoB,EACpB,mBAA+B,GAChC,EAAE,mBAAmB,2CAuarB"}
@@ -14,6 +14,7 @@ import { SidebarGroup, SidebarGroupLabel, SidebarMenu, SidebarMenuItem, SidebarM
14
14
  import { Settings, LogOut } from "lucide-react";
15
15
  import { toast } from "sonner";
16
16
  import { use_auth_status, trigger_auth_status_refresh } from "../hooks/use_auth_status";
17
+ import { useHazoAuthConfig } from "../../../../contexts/hazo_auth_provider";
17
18
  // section: component
18
19
  /**
19
20
  * Profile picture menu component
@@ -24,10 +25,13 @@ import { use_auth_status, trigger_auth_status_refresh } from "../hooks/use_auth_
24
25
  * @param props - Component props including configuration options
25
26
  * @returns Profile picture menu component
26
27
  */
27
- export function ProfilePicMenu({ show_single_button = false, sign_up_label = "Sign Up", sign_in_label = "Sign In", register_path = "/hazo_auth/register", login_path = "/hazo_auth/login", settings_path = "/hazo_auth/my_settings", logout_path = "/api/hazo_auth/logout", custom_menu_items = [], className, avatar_size = "default", variant = "dropdown", sidebar_group_label = "Account", }) {
28
+ export function ProfilePicMenu({ show_single_button = false, sign_up_label = "Sign Up", sign_in_label = "Sign In", register_path = "/hazo_auth/register", login_path = "/hazo_auth/login", settings_path = "/hazo_auth/my_settings", logout_path, custom_menu_items = [], className, avatar_size = "default", variant = "dropdown", sidebar_group_label = "Account", }) {
29
+ const { apiBasePath } = useHazoAuthConfig();
28
30
  const router = useRouter();
29
31
  const authStatus = use_auth_status();
30
32
  const [isLoggingOut, setIsLoggingOut] = useState(false);
33
+ // Use provided logout_path or default to context-based path
34
+ const effectiveLogoutPath = logout_path || `${apiBasePath}/logout`;
31
35
  // Get initials from name or email
32
36
  const getInitials = () => {
33
37
  var _a, _b;
@@ -47,7 +51,7 @@ export function ProfilePicMenu({ show_single_button = false, sign_up_label = "Si
47
51
  const handleLogout = async () => {
48
52
  setIsLoggingOut(true);
49
53
  try {
50
- const response = await fetch(logout_path, {
54
+ const response = await fetch(effectiveLogoutPath, {
51
55
  method: "POST",
52
56
  headers: {
53
57
  "Content-Type": "application/json",
@@ -112,7 +116,7 @@ export function ProfilePicMenu({ show_single_button = false, sign_up_label = "Si
112
116
  items.push({
113
117
  type: "link",
114
118
  label: "Logout",
115
- href: logout_path,
119
+ href: effectiveLogoutPath,
116
120
  order: 2,
117
121
  id: "default_logout",
118
122
  });
@@ -133,7 +137,7 @@ export function ProfilePicMenu({ show_single_button = false, sign_up_label = "Si
133
137
  return a.order - b.order;
134
138
  });
135
139
  return items;
136
- }, [authStatus.authenticated, authStatus.name, authStatus.email, settings_path, logout_path, custom_menu_items]);
140
+ }, [authStatus.authenticated, authStatus.name, authStatus.email, settings_path, effectiveLogoutPath, custom_menu_items]);
137
141
  // Avatar size classes
138
142
  const avatarSizeClasses = {
139
143
  sm: "h-8 w-8",
@@ -1,5 +1,6 @@
1
+ import type { StaticImageData } from "next/image";
1
2
  type TwoColumnAuthLayoutProps = {
2
- imageSrc: string;
3
+ imageSrc: string | StaticImageData;
3
4
  imageAlt: string;
4
5
  imageBackgroundColor?: string;
5
6
  formContent: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"two_column_auth_layout.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/two_column_auth_layout.tsx"],"names":[],"mappings":"AAKA,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAGF,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,sBAAsB,GACvB,EAAE,wBAAwB,2CAkB1B"}
1
+ {"version":3,"file":"two_column_auth_layout.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/two_column_auth_layout.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,MAAM,GAAG,eAAe,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAGF,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,QAAQ,EACR,oBAAoB,EACpB,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,sBAAsB,GACvB,EAAE,wBAAwB,2CAkB1B"}
@@ -1,5 +1,6 @@
1
+ import { type StaticImageData } from "next/image";
1
2
  type VisualPanelProps = {
2
- imageSrc: string;
3
+ imageSrc: string | StaticImageData;
3
4
  imageAlt: string;
4
5
  backgroundColor?: string;
5
6
  className?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"visual_panel.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/visual_panel.tsx"],"names":[],"mappings":"AAQA,KAAK,gBAAgB,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAGF,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,QAAQ,EACR,eAA2B,EAC3B,SAAS,GACV,EAAE,gBAAgB,2CAkBlB"}
1
+ {"version":3,"file":"visual_panel.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/components/visual_panel.tsx"],"names":[],"mappings":"AAKA,OAAc,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAGzD,KAAK,gBAAgB,GAAG;IACtB,QAAQ,EAAE,MAAM,GAAG,eAAe,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAGF,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,QAAQ,EACR,eAA2B,EAC3B,SAAS,GACV,EAAE,gBAAgB,2CAqBlB"}
@@ -6,5 +6,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
6
6
  import Image from "next/image";
7
7
  // section: component
8
8
  export function VisualPanel({ imageSrc, imageAlt, backgroundColor = "#f1f5f9", className, }) {
9
- return (_jsx("div", { className: `cls_visual_panel relative hidden h-full w-full items-center justify-center md:flex ${className !== null && className !== void 0 ? className : ""}`, style: { backgroundColor }, children: _jsx("div", { className: "cls_visual_panel_image_wrapper relative h-full w-full", children: _jsx(Image, { src: imageSrc, alt: imageAlt, fill: true, sizes: "(min-width: 768px) 50vw, 100vw", className: "cls_visual_panel_image object-cover", priority: true }) }) }));
9
+ const isJpgString = typeof imageSrc === 'string' && (imageSrc.toLowerCase().endsWith('.jpg') || imageSrc.toLowerCase().endsWith('.jpeg'));
10
+ return (_jsx("div", { className: `cls_visual_panel relative hidden h-full w-full items-center justify-center md:flex ${className !== null && className !== void 0 ? className : ""}`, style: { backgroundColor }, children: _jsx("div", { className: "cls_visual_panel_image_wrapper relative h-full w-full", children: _jsx(Image, { src: imageSrc, alt: imageAlt, fill: true, sizes: "(min-width: 768px) 50vw, 100vw", className: "cls_visual_panel_image object-cover", priority: true, unoptimized: isJpgString }) }) }));
10
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"use_auth_status.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/hooks/use_auth_status.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC9D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAMF;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAGD,wBAAgB,eAAe,IAAI,UAAU,CAkE5C"}
1
+ {"version":3,"file":"use_auth_status.d.ts","sourceRoot":"","sources":["../../../../../src/components/layouts/shared/hooks/use_auth_status.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,cAAc,GAAG;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,CAAC;IAC9D,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG;IACxC,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAMF;;GAEG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAIlD;AAGD,wBAAgB,eAAe,IAAI,UAAU,CAmE5C"}
@@ -3,6 +3,7 @@
3
3
  "use client";
4
4
  // section: imports
5
5
  import { useState, useEffect, useCallback } from "react";
6
+ import { useHazoAuthConfig } from "../../../../contexts/hazo_auth_provider";
6
7
  // section: constants
7
8
  const AUTH_STATUS_CHANGE_EVENT = "hazo_auth_status_change";
8
9
  // section: helpers
@@ -16,6 +17,7 @@ export function trigger_auth_status_refresh() {
16
17
  }
17
18
  // section: hook
18
19
  export function use_auth_status() {
20
+ const { apiBasePath } = useHazoAuthConfig();
19
21
  const [authStatus, setAuthStatus] = useState({
20
22
  authenticated: false,
21
23
  loading: true,
@@ -24,7 +26,7 @@ export function use_auth_status() {
24
26
  var _a;
25
27
  setAuthStatus((prev) => (Object.assign(Object.assign({}, prev), { loading: true })));
26
28
  try {
27
- const response = await fetch("/api/hazo_auth/me", {
29
+ const response = await fetch(`${apiBasePath}/me`, {
28
30
  method: "GET",
29
31
  credentials: "include",
30
32
  });
@@ -58,7 +60,7 @@ export function use_auth_status() {
58
60
  loading: false,
59
61
  });
60
62
  }
61
- }, []);
63
+ }, [apiBasePath]);
62
64
  useEffect(() => {
63
65
  // Check auth status on mount
64
66
  void checkAuth();