hazo_auth 1.4.1 → 1.6.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 (478) hide show
  1. package/README.md +25 -38
  2. package/SETUP_CHECKLIST.md +708 -0
  3. package/dist/app/api/hazo_auth/change_password/route.d.ts +8 -0
  4. package/dist/app/api/hazo_auth/change_password/route.d.ts.map +1 -0
  5. package/dist/app/api/hazo_auth/change_password/route.js +98 -0
  6. package/dist/app/api/hazo_auth/forgot_password/route.d.ts +8 -0
  7. package/dist/app/api/hazo_auth/forgot_password/route.d.ts.map +1 -0
  8. package/dist/app/api/hazo_auth/forgot_password/route.js +78 -0
  9. package/dist/app/api/hazo_auth/get_auth/route.d.ts +10 -0
  10. package/dist/app/api/hazo_auth/get_auth/route.d.ts.map +1 -0
  11. package/dist/app/api/hazo_auth/get_auth/route.js +63 -0
  12. package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts +14 -0
  13. package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts.map +1 -0
  14. package/dist/app/api/hazo_auth/invalidate_cache/route.js +96 -0
  15. package/dist/app/api/hazo_auth/library_photos/route.d.ts +13 -0
  16. package/dist/app/api/hazo_auth/library_photos/route.d.ts.map +1 -0
  17. package/dist/app/api/hazo_auth/library_photos/route.js +55 -0
  18. package/dist/app/api/hazo_auth/login/route.d.ts +12 -0
  19. package/dist/app/api/hazo_auth/login/route.d.ts.map +1 -0
  20. package/dist/app/api/hazo_auth/login/route.js +140 -0
  21. package/dist/app/api/hazo_auth/logout/route.d.ts +8 -0
  22. package/dist/app/api/hazo_auth/logout/route.d.ts.map +1 -0
  23. package/dist/app/api/hazo_auth/logout/route.js +71 -0
  24. package/dist/app/api/hazo_auth/me/route.d.ts +3 -0
  25. package/dist/app/api/hazo_auth/me/route.d.ts.map +1 -0
  26. package/dist/app/api/hazo_auth/me/route.js +34 -0
  27. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts +7 -0
  28. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts.map +1 -0
  29. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.js +43 -0
  30. package/dist/app/api/hazo_auth/register/route.d.ts +9 -0
  31. package/dist/app/api/hazo_auth/register/route.d.ts.map +1 -0
  32. package/dist/app/api/hazo_auth/register/route.js +80 -0
  33. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts +8 -0
  34. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts.map +1 -0
  35. package/dist/app/api/hazo_auth/remove_profile_picture/route.js +64 -0
  36. package/dist/app/api/hazo_auth/resend_verification/route.d.ts +8 -0
  37. package/dist/app/api/hazo_auth/resend_verification/route.d.ts.map +1 -0
  38. package/dist/app/api/hazo_auth/resend_verification/route.js +79 -0
  39. package/dist/app/api/hazo_auth/reset_password/route.d.ts +8 -0
  40. package/dist/app/api/hazo_auth/reset_password/route.d.ts.map +1 -0
  41. package/dist/app/api/hazo_auth/reset_password/route.js +76 -0
  42. package/dist/app/api/hazo_auth/update_user/route.d.ts +9 -0
  43. package/dist/app/api/hazo_auth/update_user/route.d.ts.map +1 -0
  44. package/dist/app/api/hazo_auth/update_user/route.js +95 -0
  45. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts +9 -0
  46. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts.map +1 -0
  47. package/dist/app/api/hazo_auth/upload_profile_picture/route.js +204 -0
  48. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts +6 -0
  49. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts.map +1 -0
  50. package/dist/app/api/hazo_auth/validate_reset_token/route.js +58 -0
  51. package/dist/app/api/hazo_auth/verify_email/route.d.ts +11 -0
  52. package/dist/app/api/hazo_auth/verify_email/route.d.ts.map +1 -0
  53. package/dist/app/api/hazo_auth/verify_email/route.js +63 -0
  54. package/dist/cli/generate.d.ts +2 -0
  55. package/dist/cli/generate.d.ts.map +1 -0
  56. package/dist/cli/generate.js +117 -0
  57. package/dist/cli/index.d.ts +3 -0
  58. package/dist/cli/index.d.ts.map +1 -0
  59. package/dist/cli/index.js +120 -0
  60. package/dist/cli/validate.d.ts +15 -0
  61. package/dist/cli/validate.d.ts.map +1 -0
  62. package/dist/cli/validate.js +509 -0
  63. package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts +2 -2
  64. package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts.map +1 -1
  65. package/dist/components/layouts/email_verification/config/email_verification_field_config.js +1 -1
  66. package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts +2 -2
  67. package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts.map +1 -1
  68. package/dist/components/layouts/email_verification/hooks/use_email_verification.js +2 -2
  69. package/dist/components/layouts/email_verification/index.d.ts +3 -3
  70. package/dist/components/layouts/email_verification/index.d.ts.map +1 -1
  71. package/dist/components/layouts/email_verification/index.js +9 -9
  72. package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts +2 -2
  73. package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts.map +1 -1
  74. package/dist/components/layouts/forgot_password/config/forgot_password_field_config.js +1 -1
  75. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts +2 -2
  76. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts.map +1 -1
  77. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.js +2 -2
  78. package/dist/components/layouts/forgot_password/index.d.ts +2 -2
  79. package/dist/components/layouts/forgot_password/index.d.ts.map +1 -1
  80. package/dist/components/layouts/forgot_password/index.js +8 -8
  81. package/dist/components/layouts/login/config/login_field_config.d.ts +2 -2
  82. package/dist/components/layouts/login/config/login_field_config.d.ts.map +1 -1
  83. package/dist/components/layouts/login/config/login_field_config.js +1 -1
  84. package/dist/components/layouts/login/hooks/use_login_form.d.ts +2 -2
  85. package/dist/components/layouts/login/hooks/use_login_form.d.ts.map +1 -1
  86. package/dist/components/layouts/login/hooks/use_login_form.js +4 -4
  87. package/dist/components/layouts/login/index.d.ts +2 -2
  88. package/dist/components/layouts/login/index.d.ts.map +1 -1
  89. package/dist/components/layouts/login/index.js +9 -9
  90. package/dist/components/layouts/my_settings/components/editable_field.js +3 -3
  91. package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts +1 -1
  92. package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts.map +1 -1
  93. package/dist/components/layouts/my_settings/components/password_change_dialog.js +4 -4
  94. package/dist/components/layouts/my_settings/components/profile_picture_dialog.js +7 -7
  95. package/dist/components/layouts/my_settings/components/profile_picture_display.js +1 -1
  96. package/dist/components/layouts/my_settings/components/profile_picture_gravatar_tab.js +3 -3
  97. package/dist/components/layouts/my_settings/components/profile_picture_library_tab.js +5 -5
  98. package/dist/components/layouts/my_settings/components/profile_picture_upload_tab.js +4 -4
  99. package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts +1 -1
  100. package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts.map +1 -1
  101. package/dist/components/layouts/my_settings/config/my_settings_field_config.js +1 -1
  102. package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts +1 -1
  103. package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts.map +1 -1
  104. package/dist/components/layouts/my_settings/hooks/use_my_settings.js +1 -1
  105. package/dist/components/layouts/my_settings/index.d.ts +2 -2
  106. package/dist/components/layouts/my_settings/index.d.ts.map +1 -1
  107. package/dist/components/layouts/my_settings/index.js +9 -9
  108. package/dist/components/layouts/register/config/register_field_config.d.ts +2 -2
  109. package/dist/components/layouts/register/config/register_field_config.d.ts.map +1 -1
  110. package/dist/components/layouts/register/config/register_field_config.js +1 -1
  111. package/dist/components/layouts/register/hooks/use_register_form.d.ts +3 -3
  112. package/dist/components/layouts/register/hooks/use_register_form.d.ts.map +1 -1
  113. package/dist/components/layouts/register/hooks/use_register_form.js +2 -2
  114. package/dist/components/layouts/register/index.d.ts +2 -2
  115. package/dist/components/layouts/register/index.d.ts.map +1 -1
  116. package/dist/components/layouts/register/index.js +9 -9
  117. package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts +2 -2
  118. package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts.map +1 -1
  119. package/dist/components/layouts/reset_password/config/reset_password_field_config.js +1 -1
  120. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts +3 -3
  121. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts.map +1 -1
  122. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.js +2 -2
  123. package/dist/components/layouts/reset_password/index.d.ts +2 -2
  124. package/dist/components/layouts/reset_password/index.d.ts.map +1 -1
  125. package/dist/components/layouts/reset_password/index.js +8 -8
  126. package/dist/components/layouts/shared/components/already_logged_in_guard.js +4 -4
  127. package/dist/components/layouts/shared/components/auth_page_shell.js +3 -3
  128. package/dist/components/layouts/shared/components/form_action_buttons.d.ts +1 -1
  129. package/dist/components/layouts/shared/components/form_action_buttons.d.ts.map +1 -1
  130. package/dist/components/layouts/shared/components/form_action_buttons.js +1 -1
  131. package/dist/components/layouts/shared/components/form_field_wrapper.js +2 -2
  132. package/dist/components/layouts/shared/components/logout_button.js +2 -2
  133. package/dist/components/layouts/shared/components/password_field.js +3 -3
  134. package/dist/components/layouts/shared/components/profile_pic_menu.d.ts +1 -1
  135. package/dist/components/layouts/shared/components/profile_pic_menu.d.ts.map +1 -1
  136. package/dist/components/layouts/shared/components/profile_pic_menu.js +4 -4
  137. package/dist/components/layouts/shared/components/profile_pic_menu_wrapper.js +2 -2
  138. package/dist/components/layouts/shared/components/sidebar_layout_wrapper.js +3 -3
  139. package/dist/components/layouts/shared/components/standalone_layout_wrapper.js +1 -1
  140. package/dist/components/layouts/shared/components/two_column_auth_layout.js +1 -1
  141. package/dist/components/layouts/shared/components/unauthorized_guard.js +2 -2
  142. package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts +1 -1
  143. package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts.map +1 -1
  144. package/dist/components/layouts/shared/utils/validation.d.ts +1 -1
  145. package/dist/components/layouts/shared/utils/validation.d.ts.map +1 -1
  146. package/dist/components/layouts/user_management/components/roles_matrix.js +7 -7
  147. package/dist/components/layouts/user_management/index.js +11 -11
  148. package/dist/components/ui/alert-dialog.js +2 -2
  149. package/dist/components/ui/avatar.js +1 -1
  150. package/dist/components/ui/button.js +1 -1
  151. package/dist/components/ui/card.d.ts +9 -0
  152. package/dist/components/ui/card.d.ts.map +1 -0
  153. package/dist/components/ui/card.js +45 -0
  154. package/dist/components/ui/checkbox.js +1 -1
  155. package/dist/components/ui/dialog.js +1 -1
  156. package/dist/components/ui/dropdown-menu.js +1 -1
  157. package/dist/components/ui/hazo_ui_tooltip.js +1 -1
  158. package/dist/components/ui/input.js +1 -1
  159. package/dist/components/ui/label.js +1 -1
  160. package/dist/components/ui/separator.js +1 -1
  161. package/dist/components/ui/sheet.js +1 -1
  162. package/dist/components/ui/sidebar.d.ts +2 -2
  163. package/dist/components/ui/sidebar.d.ts.map +1 -1
  164. package/dist/components/ui/sidebar.js +8 -8
  165. package/dist/components/ui/skeleton.js +1 -1
  166. package/dist/components/ui/switch.js +1 -1
  167. package/dist/components/ui/table.js +1 -1
  168. package/dist/components/ui/tabs.js +1 -1
  169. package/dist/components/ui/tooltip.js +1 -1
  170. package/dist/components/ui/vertical-tabs.js +1 -1
  171. package/dist/hooks/use-mobile.d.ts.map +1 -1
  172. package/dist/hooks/use-mobile.js +17 -3
  173. package/dist/lib/already_logged_in_config.server.js +1 -1
  174. package/dist/lib/app_logger.js +1 -1
  175. package/dist/lib/auth/auth_cache.d.ts +1 -1
  176. package/dist/lib/auth/auth_cache.d.ts.map +1 -1
  177. package/dist/lib/auth/auth_utils.server.js +2 -2
  178. package/dist/lib/auth/hazo_get_auth.server.d.ts +1 -1
  179. package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -1
  180. package/dist/lib/auth/hazo_get_auth.server.js +7 -7
  181. package/dist/lib/auth/server_auth.js +2 -2
  182. package/dist/lib/auth_utility_config.server.js +1 -1
  183. package/dist/lib/config/config_loader.server.js +1 -1
  184. package/dist/lib/email_verification_config.server.js +1 -1
  185. package/dist/lib/file_types_config.server.js +1 -1
  186. package/dist/lib/forgot_password_config.server.js +1 -1
  187. package/dist/lib/hazo_connect_instance.server.js +2 -2
  188. package/dist/lib/hazo_connect_setup.server.js +2 -2
  189. package/dist/lib/login_config.server.js +2 -2
  190. package/dist/lib/messages_config.server.js +1 -1
  191. package/dist/lib/my_settings_config.server.js +7 -7
  192. package/dist/lib/password_requirements_config.server.js +1 -1
  193. package/dist/lib/profile_pic_menu_config.server.js +1 -1
  194. package/dist/lib/profile_picture_config.server.js +2 -2
  195. package/dist/lib/register_config.server.js +4 -4
  196. package/dist/lib/reset_password_config.server.js +3 -3
  197. package/dist/lib/services/email_service.js +2 -2
  198. package/dist/lib/services/email_verification_service.js +3 -3
  199. package/dist/lib/services/login_service.js +3 -3
  200. package/dist/lib/services/password_change_service.js +3 -3
  201. package/dist/lib/services/password_reset_service.js +3 -3
  202. package/dist/lib/services/profile_picture_remove_service.js +3 -3
  203. package/dist/lib/services/profile_picture_service.d.ts +1 -1
  204. package/dist/lib/services/profile_picture_service.d.ts.map +1 -1
  205. package/dist/lib/services/profile_picture_service.js +5 -5
  206. package/dist/lib/services/registration_service.js +8 -8
  207. package/dist/lib/services/token_service.js +2 -2
  208. package/dist/lib/services/user_profiles_service.js +2 -2
  209. package/dist/lib/services/user_update_service.d.ts +1 -1
  210. package/dist/lib/services/user_update_service.d.ts.map +1 -1
  211. package/dist/lib/services/user_update_service.js +4 -4
  212. package/dist/lib/ui_shell_config.server.js +1 -1
  213. package/dist/lib/ui_sizes_config.server.js +1 -1
  214. package/dist/lib/user_fields_config.server.js +1 -1
  215. package/dist/lib/user_management_config.server.js +1 -1
  216. package/dist/lib/utils/error_sanitizer.d.ts +1 -1
  217. package/dist/lib/utils/error_sanitizer.d.ts.map +1 -1
  218. package/dist/server/config/config_loader.d.ts +1 -1
  219. package/dist/server/config/config_loader.d.ts.map +1 -1
  220. package/dist/server/config/config_loader.js +1 -1
  221. package/dist/server/index.js +2 -2
  222. package/dist/server/logging/logger_service.d.ts +1 -1
  223. package/dist/server/logging/logger_service.d.ts.map +1 -1
  224. package/dist/server/routes/change_password.d.ts +2 -0
  225. package/dist/server/routes/change_password.d.ts.map +1 -0
  226. package/dist/server/routes/change_password.js +2 -0
  227. package/dist/server/routes/forgot_password.d.ts +2 -0
  228. package/dist/server/routes/forgot_password.d.ts.map +1 -0
  229. package/dist/server/routes/forgot_password.js +2 -0
  230. package/dist/server/routes/get_auth.d.ts +2 -0
  231. package/dist/server/routes/get_auth.d.ts.map +1 -0
  232. package/dist/server/routes/get_auth.js +2 -0
  233. package/dist/server/routes/index.d.ts +18 -0
  234. package/dist/server/routes/index.d.ts.map +1 -0
  235. package/dist/server/routes/index.js +24 -0
  236. package/dist/server/routes/invalidate_cache.d.ts +2 -0
  237. package/dist/server/routes/invalidate_cache.d.ts.map +1 -0
  238. package/dist/server/routes/invalidate_cache.js +2 -0
  239. package/dist/server/routes/library_photos.d.ts +2 -0
  240. package/dist/server/routes/library_photos.d.ts.map +1 -0
  241. package/dist/server/routes/library_photos.js +2 -0
  242. package/dist/server/routes/login.d.ts +2 -0
  243. package/dist/server/routes/login.d.ts.map +1 -0
  244. package/dist/server/routes/login.js +2 -0
  245. package/dist/server/routes/logout.d.ts +2 -0
  246. package/dist/server/routes/logout.d.ts.map +1 -0
  247. package/dist/server/routes/logout.js +2 -0
  248. package/dist/server/routes/me.d.ts +2 -0
  249. package/dist/server/routes/me.d.ts.map +1 -0
  250. package/dist/server/routes/me.js +2 -0
  251. package/dist/server/routes/profile_picture_filename.d.ts +2 -0
  252. package/dist/server/routes/profile_picture_filename.d.ts.map +1 -0
  253. package/dist/server/routes/profile_picture_filename.js +3 -0
  254. package/dist/server/routes/register.d.ts +2 -0
  255. package/dist/server/routes/register.d.ts.map +1 -0
  256. package/dist/server/routes/register.js +2 -0
  257. package/dist/server/routes/remove_profile_picture.d.ts +2 -0
  258. package/dist/server/routes/remove_profile_picture.d.ts.map +1 -0
  259. package/dist/server/routes/remove_profile_picture.js +2 -0
  260. package/dist/server/routes/resend_verification.d.ts +2 -0
  261. package/dist/server/routes/resend_verification.d.ts.map +1 -0
  262. package/dist/server/routes/resend_verification.js +2 -0
  263. package/dist/server/routes/reset_password.d.ts +2 -0
  264. package/dist/server/routes/reset_password.d.ts.map +1 -0
  265. package/dist/server/routes/reset_password.js +2 -0
  266. package/dist/server/routes/update_user.d.ts +2 -0
  267. package/dist/server/routes/update_user.d.ts.map +1 -0
  268. package/dist/server/routes/update_user.js +2 -0
  269. package/dist/server/routes/upload_profile_picture.d.ts +2 -0
  270. package/dist/server/routes/upload_profile_picture.d.ts.map +1 -0
  271. package/dist/server/routes/upload_profile_picture.js +2 -0
  272. package/dist/server/routes/validate_reset_token.d.ts +2 -0
  273. package/dist/server/routes/validate_reset_token.d.ts.map +1 -0
  274. package/dist/server/routes/validate_reset_token.js +2 -0
  275. package/dist/server/routes/verify_email.d.ts +2 -0
  276. package/dist/server/routes/verify_email.d.ts.map +1 -0
  277. package/dist/server/routes/verify_email.js +2 -0
  278. package/dist/server/server.js +2 -2
  279. package/package.json +14 -115
  280. package/components.json +0 -22
  281. package/instrumentation.ts +0 -32
  282. package/migrations/001_add_token_type_to_refresh_tokens.sql +0 -14
  283. package/migrations/002_add_name_to_hazo_users.sql +0 -7
  284. package/migrations/003_add_url_on_logon_to_hazo_users.sql +0 -8
  285. package/next.config.mjs +0 -67
  286. package/postcss.config.mjs +0 -8
  287. package/public/file.svg +0 -1
  288. package/public/globe.svg +0 -1
  289. package/public/next.svg +0 -1
  290. package/public/vercel.svg +0 -1
  291. package/public/window.svg +0 -1
  292. package/scripts/apply_migration.ts +0 -118
  293. package/scripts/init_users.ts +0 -378
  294. package/src/app/api/hazo_auth/auth/upload_profile_picture/route.ts +0 -268
  295. package/src/app/api/hazo_auth/change_password/route.ts +0 -132
  296. package/src/app/api/hazo_auth/forgot_password/route.ts +0 -107
  297. package/src/app/api/hazo_auth/get_auth/route.ts +0 -89
  298. package/src/app/api/hazo_auth/invalidate_cache/route.ts +0 -139
  299. package/src/app/api/hazo_auth/library_photos/route.ts +0 -73
  300. package/src/app/api/hazo_auth/login/route.ts +0 -181
  301. package/src/app/api/hazo_auth/logout/route.ts +0 -89
  302. package/src/app/api/hazo_auth/me/route.ts +0 -47
  303. package/src/app/api/hazo_auth/profile_picture/[filename]/route.ts +0 -67
  304. package/src/app/api/hazo_auth/register/route.ts +0 -109
  305. package/src/app/api/hazo_auth/remove_profile_picture/route.ts +0 -86
  306. package/src/app/api/hazo_auth/resend_verification/route.ts +0 -108
  307. package/src/app/api/hazo_auth/reset_password/route.ts +0 -107
  308. package/src/app/api/hazo_auth/update_user/route.ts +0 -126
  309. package/src/app/api/hazo_auth/upload_profile_picture/route.ts +0 -268
  310. package/src/app/api/hazo_auth/user_management/permissions/route.ts +0 -367
  311. package/src/app/api/hazo_auth/user_management/roles/route.ts +0 -442
  312. package/src/app/api/hazo_auth/user_management/users/roles/route.ts +0 -367
  313. package/src/app/api/hazo_auth/user_management/users/route.ts +0 -239
  314. package/src/app/api/hazo_auth/validate_reset_token/route.ts +0 -83
  315. package/src/app/api/hazo_auth/verify_email/route.ts +0 -88
  316. package/src/app/api/migrations/apply/route.ts +0 -91
  317. package/src/app/favicon.ico +0 -0
  318. package/src/app/fonts/GeistMonoVF.woff +0 -0
  319. package/src/app/fonts/GeistVF.woff +0 -0
  320. package/src/app/globals.css +0 -89
  321. package/src/app/hazo_auth/forgot_password/forgot_password_page_client.tsx +0 -60
  322. package/src/app/hazo_auth/forgot_password/page.tsx +0 -24
  323. package/src/app/hazo_auth/login/login_page_client.tsx +0 -86
  324. package/src/app/hazo_auth/login/page.tsx +0 -38
  325. package/src/app/hazo_auth/my_settings/my_settings_page_client.tsx +0 -120
  326. package/src/app/hazo_auth/my_settings/page.tsx +0 -40
  327. package/src/app/hazo_auth/register/page.tsx +0 -36
  328. package/src/app/hazo_auth/register/register_page_client.tsx +0 -81
  329. package/src/app/hazo_auth/reset_password/page.tsx +0 -29
  330. package/src/app/hazo_auth/reset_password/reset_password_page_client.tsx +0 -81
  331. package/src/app/hazo_auth/user_management/page.tsx +0 -14
  332. package/src/app/hazo_auth/user_management/user_management_page_client.tsx +0 -16
  333. package/src/app/hazo_auth/verify_email/page.tsx +0 -24
  334. package/src/app/hazo_auth/verify_email/verify_email_page_client.tsx +0 -60
  335. package/src/app/hazo_connect/api/sqlite/data/route.ts +0 -203
  336. package/src/app/hazo_connect/api/sqlite/schema/route.ts +0 -45
  337. package/src/app/hazo_connect/api/sqlite/tables/route.ts +0 -36
  338. package/src/app/hazo_connect/sqlite_admin/page.tsx +0 -51
  339. package/src/app/hazo_connect/sqlite_admin/sqlite-admin-client.tsx +0 -984
  340. package/src/app/layout.tsx +0 -43
  341. package/src/app/page.tsx +0 -170
  342. package/src/components/index.ts +0 -7
  343. package/src/components/layouts/email_verification/config/email_verification_field_config.ts +0 -86
  344. package/src/components/layouts/email_verification/hooks/use_email_verification.ts +0 -297
  345. package/src/components/layouts/email_verification/index.tsx +0 -297
  346. package/src/components/layouts/forgot_password/config/forgot_password_field_config.ts +0 -58
  347. package/src/components/layouts/forgot_password/hooks/use_forgot_password_form.ts +0 -179
  348. package/src/components/layouts/forgot_password/index.tsx +0 -168
  349. package/src/components/layouts/index.ts +0 -26
  350. package/src/components/layouts/login/config/login_field_config.ts +0 -67
  351. package/src/components/layouts/login/hooks/use_login_form.ts +0 -286
  352. package/src/components/layouts/login/index.tsx +0 -252
  353. package/src/components/layouts/my_settings/components/editable_field.tsx +0 -177
  354. package/src/components/layouts/my_settings/components/password_change_dialog.tsx +0 -301
  355. package/src/components/layouts/my_settings/components/profile_picture_dialog.tsx +0 -385
  356. package/src/components/layouts/my_settings/components/profile_picture_display.tsx +0 -66
  357. package/src/components/layouts/my_settings/components/profile_picture_gravatar_tab.tsx +0 -143
  358. package/src/components/layouts/my_settings/components/profile_picture_library_tab.tsx +0 -311
  359. package/src/components/layouts/my_settings/components/profile_picture_upload_tab.tsx +0 -341
  360. package/src/components/layouts/my_settings/config/my_settings_field_config.ts +0 -61
  361. package/src/components/layouts/my_settings/hooks/use_my_settings.ts +0 -458
  362. package/src/components/layouts/my_settings/index.tsx +0 -351
  363. package/src/components/layouts/register/config/register_field_config.ts +0 -101
  364. package/src/components/layouts/register/hooks/use_register_form.ts +0 -275
  365. package/src/components/layouts/register/index.tsx +0 -226
  366. package/src/components/layouts/reset_password/config/reset_password_field_config.ts +0 -86
  367. package/src/components/layouts/reset_password/hooks/use_reset_password_form.ts +0 -276
  368. package/src/components/layouts/reset_password/index.tsx +0 -294
  369. package/src/components/layouts/shared/components/already_logged_in_guard.tsx +0 -95
  370. package/src/components/layouts/shared/components/auth_page_shell.tsx +0 -36
  371. package/src/components/layouts/shared/components/field_error_message.tsx +0 -29
  372. package/src/components/layouts/shared/components/form_action_buttons.tsx +0 -64
  373. package/src/components/layouts/shared/components/form_field_wrapper.tsx +0 -44
  374. package/src/components/layouts/shared/components/form_header.tsx +0 -36
  375. package/src/components/layouts/shared/components/logout_button.tsx +0 -76
  376. package/src/components/layouts/shared/components/password_field.tsx +0 -72
  377. package/src/components/layouts/shared/components/profile_pic_menu.tsx +0 -321
  378. package/src/components/layouts/shared/components/profile_pic_menu_wrapper.tsx +0 -40
  379. package/src/components/layouts/shared/components/sidebar_layout_wrapper.tsx +0 -214
  380. package/src/components/layouts/shared/components/standalone_layout_wrapper.tsx +0 -53
  381. package/src/components/layouts/shared/components/two_column_auth_layout.tsx +0 -44
  382. package/src/components/layouts/shared/components/unauthorized_guard.tsx +0 -78
  383. package/src/components/layouts/shared/components/visual_panel.tsx +0 -41
  384. package/src/components/layouts/shared/config/layout_customization.ts +0 -95
  385. package/src/components/layouts/shared/data/layout_data_client.ts +0 -19
  386. package/src/components/layouts/shared/hooks/use_auth_status.ts +0 -103
  387. package/src/components/layouts/shared/hooks/use_hazo_auth.ts +0 -158
  388. package/src/components/layouts/shared/index.ts +0 -34
  389. package/src/components/layouts/shared/utils/ip_address.ts +0 -37
  390. package/src/components/layouts/shared/utils/validation.ts +0 -66
  391. package/src/components/layouts/user_management/components/roles_matrix.tsx +0 -607
  392. package/src/components/layouts/user_management/index.tsx +0 -1295
  393. package/src/components/ui/alert-dialog.tsx +0 -141
  394. package/src/components/ui/avatar.tsx +0 -50
  395. package/src/components/ui/button.tsx +0 -57
  396. package/src/components/ui/checkbox.tsx +0 -30
  397. package/src/components/ui/dialog.tsx +0 -122
  398. package/src/components/ui/dropdown-menu.tsx +0 -201
  399. package/src/components/ui/hazo_ui_tooltip.tsx +0 -67
  400. package/src/components/ui/index.ts +0 -22
  401. package/src/components/ui/input.tsx +0 -22
  402. package/src/components/ui/label.tsx +0 -26
  403. package/src/components/ui/separator.tsx +0 -31
  404. package/src/components/ui/sheet.tsx +0 -139
  405. package/src/components/ui/sidebar.tsx +0 -773
  406. package/src/components/ui/skeleton.tsx +0 -15
  407. package/src/components/ui/sonner.tsx +0 -31
  408. package/src/components/ui/switch.tsx +0 -29
  409. package/src/components/ui/table.tsx +0 -120
  410. package/src/components/ui/tabs.tsx +0 -55
  411. package/src/components/ui/tooltip.tsx +0 -32
  412. package/src/components/ui/vertical-tabs.tsx +0 -59
  413. package/src/hooks/use-mobile.tsx +0 -19
  414. package/src/index.ts +0 -7
  415. package/src/lib/already_logged_in_config.server.ts +0 -46
  416. package/src/lib/app_logger.ts +0 -24
  417. package/src/lib/auth/auth_cache.ts +0 -220
  418. package/src/lib/auth/auth_rate_limiter.ts +0 -121
  419. package/src/lib/auth/auth_types.ts +0 -65
  420. package/src/lib/auth/auth_utils.server.ts +0 -196
  421. package/src/lib/auth/hazo_get_auth.server.ts +0 -333
  422. package/src/lib/auth/index.ts +0 -23
  423. package/src/lib/auth/server_auth.ts +0 -88
  424. package/src/lib/auth_utility_config.server.ts +0 -136
  425. package/src/lib/config/config_loader.server.ts +0 -164
  426. package/src/lib/email_verification_config.server.ts +0 -32
  427. package/src/lib/file_types_config.server.ts +0 -25
  428. package/src/lib/forgot_password_config.server.ts +0 -32
  429. package/src/lib/hazo_connect_instance.server.ts +0 -101
  430. package/src/lib/hazo_connect_setup.server.ts +0 -194
  431. package/src/lib/hazo_connect_setup.ts +0 -54
  432. package/src/lib/index.ts +0 -44
  433. package/src/lib/login_config.server.ts +0 -71
  434. package/src/lib/messages_config.server.ts +0 -45
  435. package/src/lib/migrations/apply_migration.ts +0 -105
  436. package/src/lib/my_settings_config.server.ts +0 -135
  437. package/src/lib/password_requirements_config.server.ts +0 -39
  438. package/src/lib/profile_pic_menu_config.server.ts +0 -138
  439. package/src/lib/profile_picture_config.server.ts +0 -56
  440. package/src/lib/register_config.server.ts +0 -73
  441. package/src/lib/reset_password_config.server.ts +0 -75
  442. package/src/lib/services/email_service.ts +0 -581
  443. package/src/lib/services/email_verification_service.ts +0 -270
  444. package/src/lib/services/index.ts +0 -15
  445. package/src/lib/services/login_service.ts +0 -134
  446. package/src/lib/services/password_change_service.ts +0 -154
  447. package/src/lib/services/password_reset_service.ts +0 -405
  448. package/src/lib/services/profile_picture_remove_service.ts +0 -120
  449. package/src/lib/services/profile_picture_service.ts +0 -215
  450. package/src/lib/services/profile_picture_source_mapper.ts +0 -62
  451. package/src/lib/services/registration_service.ts +0 -184
  452. package/src/lib/services/token_service.ts +0 -240
  453. package/src/lib/services/user_profiles_service.ts +0 -143
  454. package/src/lib/services/user_update_service.ts +0 -141
  455. package/src/lib/ui_shell_config.server.ts +0 -73
  456. package/src/lib/ui_sizes_config.server.ts +0 -37
  457. package/src/lib/user_fields_config.server.ts +0 -31
  458. package/src/lib/user_management_config.server.ts +0 -39
  459. package/src/lib/utils/api_route_helpers.ts +0 -60
  460. package/src/lib/utils/error_sanitizer.ts +0 -75
  461. package/src/lib/utils.ts +0 -11
  462. package/src/middleware.ts +0 -94
  463. package/src/routes/index.ts +0 -34
  464. package/src/server/config/config_loader.ts +0 -496
  465. package/src/server/index.ts +0 -38
  466. package/src/server/logging/logger_service.ts +0 -56
  467. package/src/server/routes/root_router.ts +0 -16
  468. package/src/server/server.ts +0 -28
  469. package/src/server/types/app_types.ts +0 -74
  470. package/src/server/types/express.d.ts +0 -16
  471. package/src/stories/email_verification_layout.stories.tsx +0 -137
  472. package/src/stories/forgot_password_layout.stories.tsx +0 -85
  473. package/src/stories/login_layout.stories.tsx +0 -85
  474. package/src/stories/project_overview.stories.tsx +0 -33
  475. package/src/stories/register_layout.stories.tsx +0 -107
  476. package/tailwind.config.ts +0 -77
  477. package/tsconfig.build.json +0 -39
  478. package/tsconfig.json +0 -28
@@ -1,29 +0,0 @@
1
- // file_description: reusable error message component for form field validation errors
2
- // section: types
3
- type FieldErrorMessageProps = {
4
- message: string | string[];
5
- className?: string;
6
- };
7
-
8
- // section: component
9
- export function FieldErrorMessage({
10
- message,
11
- className,
12
- }: FieldErrorMessageProps) {
13
- const messages = Array.isArray(message) ? message : [message];
14
-
15
- return (
16
- <div
17
- className={`cls_field_error_message flex flex-col gap-1 text-sm text-red-600 ${className ?? ""}`}
18
- role="alert"
19
- aria-live="polite"
20
- >
21
- {messages.map((msg, index) => (
22
- <p key={index} className="break-words leading-relaxed">
23
- {msg}
24
- </p>
25
- ))}
26
- </div>
27
- );
28
- }
29
-
@@ -1,64 +0,0 @@
1
- // file_description: reusable form action buttons component with submit (positive, left) and cancel (negative, right) buttons
2
- // section: imports
3
- import { CircleCheckBig, CircleX } from "lucide-react";
4
- import { Button } from "hazo_auth/components/ui/button";
5
- import type { ButtonPaletteDefaults } from "hazo_auth/components/layouts/shared/config/layout_customization";
6
-
7
- // section: types
8
- type FormActionButtonsProps = {
9
- submitLabel: string;
10
- cancelLabel: string;
11
- buttonPalette: ButtonPaletteDefaults;
12
- isSubmitDisabled: boolean;
13
- onCancel: () => void;
14
- submitAriaLabel?: string;
15
- cancelAriaLabel?: string;
16
- className?: string;
17
- };
18
-
19
- // section: component
20
- export function FormActionButtons({
21
- submitLabel,
22
- cancelLabel,
23
- buttonPalette,
24
- isSubmitDisabled,
25
- onCancel,
26
- submitAriaLabel = "Submit form",
27
- cancelAriaLabel = "Cancel form",
28
- className,
29
- }: FormActionButtonsProps) {
30
- return (
31
- <div
32
- className={`cls_form_action_buttons mt-2 flex items-center justify-end gap-4 ${className ?? ""}`}
33
- >
34
- <Button
35
- type="submit"
36
- disabled={isSubmitDisabled}
37
- className="cls_form_action_submit_button flex items-center gap-2"
38
- aria-label={submitAriaLabel}
39
- style={{
40
- backgroundColor: buttonPalette.submitBackground,
41
- color: buttonPalette.submitText,
42
- }}
43
- >
44
- <CircleCheckBig className="h-4 w-4" aria-hidden="true" />
45
- <span>{submitLabel}</span>
46
- </Button>
47
- <Button
48
- type="button"
49
- variant="outline"
50
- onClick={onCancel}
51
- className="cls_form_action_cancel_button flex items-center gap-2"
52
- aria-label={cancelAriaLabel}
53
- style={{
54
- borderColor: buttonPalette.cancelBorder,
55
- color: buttonPalette.cancelText,
56
- }}
57
- >
58
- <CircleX className="h-4 w-4" aria-hidden="true" />
59
- <span>{cancelLabel}</span>
60
- </Button>
61
- </div>
62
- );
63
- }
64
-
@@ -1,44 +0,0 @@
1
- // file_description: reusable wrapper component for form fields that standardizes label, input, and error message structure
2
- // section: imports
3
- import { Label } from "hazo_auth/components/ui/label";
4
- import { FieldErrorMessage } from "hazo_auth/components/layouts/shared/components/field_error_message";
5
-
6
- // section: types
7
- type FormFieldWrapperProps = {
8
- fieldId: string;
9
- label: string;
10
- input: React.ReactNode;
11
- errorMessage?: string | string[];
12
- className?: string;
13
- labelClassName?: string;
14
- };
15
-
16
- // section: component
17
- export function FormFieldWrapper({
18
- fieldId,
19
- label,
20
- input,
21
- errorMessage,
22
- className,
23
- labelClassName,
24
- }: FormFieldWrapperProps) {
25
- return (
26
- <div
27
- className={`cls_form_field_wrapper flex flex-col gap-2 ${className ?? ""}`}
28
- >
29
- <Label
30
- htmlFor={fieldId}
31
- className={`cls_form_field_label text-sm font-medium text-slate-800 ${labelClassName ?? ""}`}
32
- >
33
- {label}
34
- </Label>
35
- {input}
36
- {errorMessage ? (
37
- <div className="mt-1 min-h-0">
38
- <FieldErrorMessage message={errorMessage} />
39
- </div>
40
- ) : null}
41
- </div>
42
- );
43
- }
44
-
@@ -1,36 +0,0 @@
1
- // file_description: reusable form header component for displaying heading and subheading in authentication layouts
2
- // section: types
3
- type FormHeaderProps = {
4
- heading: string;
5
- subHeading: string;
6
- className?: string;
7
- headingClassName?: string;
8
- subHeadingClassName?: string;
9
- };
10
-
11
- // section: component
12
- export function FormHeader({
13
- heading,
14
- subHeading,
15
- className,
16
- headingClassName,
17
- subHeadingClassName,
18
- }: FormHeaderProps) {
19
- return (
20
- <header
21
- className={`cls_form_header flex flex-col gap-2 text-center md:text-left ${className ?? ""}`}
22
- >
23
- <h1
24
- className={`cls_form_header_title text-2xl font-semibold text-slate-900 ${headingClassName ?? ""}`}
25
- >
26
- {heading}
27
- </h1>
28
- <p
29
- className={`cls_form_header_subtitle text-sm text-slate-600 ${subHeadingClassName ?? ""}`}
30
- >
31
- {subHeading}
32
- </p>
33
- </header>
34
- );
35
- }
36
-
@@ -1,76 +0,0 @@
1
- // file_description: logout button component for user logout functionality
2
- // section: client_directive
3
- "use client";
4
-
5
- // section: imports
6
- import { useState } from "react";
7
- import { useRouter } from "next/navigation";
8
- import { Button } from "hazo_auth/components/ui/button";
9
- import { LogOut } from "lucide-react";
10
- import { toast } from "sonner";
11
- import { trigger_auth_status_refresh } from "hazo_auth/components/layouts/shared/hooks/use_auth_status";
12
-
13
- // section: types
14
- export type LogoutButtonProps = {
15
- className?: string;
16
- variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link";
17
- size?: "default" | "sm" | "lg" | "icon";
18
- };
19
-
20
- // section: component
21
- export function LogoutButton({
22
- className,
23
- variant = "outline",
24
- size = "default",
25
- }: LogoutButtonProps) {
26
- const router = useRouter();
27
- const [isLoggingOut, setIsLoggingOut] = useState(false);
28
-
29
- const handleLogout = async () => {
30
- setIsLoggingOut(true);
31
-
32
- try {
33
- const response = await fetch("/api/hazo_auth/logout", {
34
- method: "POST",
35
- headers: {
36
- "Content-Type": "application/json",
37
- },
38
- });
39
-
40
- const data = await response.json();
41
-
42
- if (!response.ok || !data.success) {
43
- throw new Error(data.error || "Logout failed");
44
- }
45
-
46
- toast.success("Logged out successfully");
47
-
48
- // Trigger auth status refresh in all components (navbar, sidebar, etc.)
49
- trigger_auth_status_refresh();
50
-
51
- // Refresh the page to update authentication state (cookies are cleared server-side)
52
- router.refresh();
53
- } catch (error) {
54
- const errorMessage =
55
- error instanceof Error ? error.message : "Logout failed. Please try again.";
56
- toast.error(errorMessage);
57
- } finally {
58
- setIsLoggingOut(false);
59
- }
60
- };
61
-
62
- return (
63
- <Button
64
- onClick={handleLogout}
65
- disabled={isLoggingOut}
66
- variant={variant}
67
- size={size}
68
- className={className}
69
- aria-label="Logout"
70
- >
71
- <LogOut className="h-4 w-4 mr-2" aria-hidden="true" />
72
- {isLoggingOut ? "Logging out..." : "Logout"}
73
- </Button>
74
- );
75
- }
76
-
@@ -1,72 +0,0 @@
1
- // file_description: reusable password input with visibility toggle and error messaging
2
- // section: client_directive
3
- "use client";
4
-
5
- // section: imports
6
- import { Eye, EyeOff } from "lucide-react";
7
- import { Button } from "hazo_auth/components/ui/button";
8
- import { Input } from "hazo_auth/components/ui/input";
9
- import { FieldErrorMessage } from "hazo_auth/components/layouts/shared/components/field_error_message";
10
-
11
- // section: types
12
- export type PasswordFieldProps = {
13
- inputId: string;
14
- ariaLabel: string;
15
- value: string;
16
- placeholder: string;
17
- autoComplete?: string;
18
- isVisible: boolean;
19
- onChange: (value: string) => void;
20
- onToggleVisibility: () => void;
21
- errorMessage?: string | string[];
22
- };
23
-
24
- // section: component
25
- export function PasswordField({
26
- inputId,
27
- ariaLabel,
28
- value,
29
- placeholder,
30
- autoComplete,
31
- isVisible,
32
- onChange,
33
- onToggleVisibility,
34
- errorMessage,
35
- }: PasswordFieldProps) {
36
- return (
37
- <div className="cls_password_field_wrapper">
38
- <div className="relative">
39
- <Input
40
- id={inputId}
41
- type={isVisible ? "text" : "password"}
42
- value={value}
43
- onChange={(event) => onChange(event.target.value)}
44
- autoComplete={autoComplete}
45
- placeholder={placeholder}
46
- aria-label={ariaLabel}
47
- className="cls_password_field_input pr-11"
48
- />
49
- <Button
50
- type="button"
51
- variant="ghost"
52
- size="icon"
53
- aria-label={`${isVisible ? "Hide" : "Show"} ${ariaLabel.toLowerCase()}`}
54
- onClick={onToggleVisibility}
55
- className="cls_password_field_toggle absolute right-1 top-1/2 -translate-y-1/2 text-slate-600 hover:text-slate-900"
56
- >
57
- {isVisible ? (
58
- <EyeOff className="h-4 w-4" aria-hidden="true" />
59
- ) : (
60
- <Eye className="h-4 w-4" aria-hidden="true" />
61
- )}
62
- </Button>
63
- </div>
64
- {errorMessage ? (
65
- <div className="mt-1 min-h-0">
66
- <FieldErrorMessage message={errorMessage} />
67
- </div>
68
- ) : null}
69
- </div>
70
- );
71
- }
72
-
@@ -1,321 +0,0 @@
1
- // file_description: profile picture menu component for navbar or sidebar - shows profile picture when logged in, or sign up/sign in buttons when not logged in
2
- // section: client_directive
3
- "use client";
4
-
5
- // section: imports
6
- import { useState, useMemo } from "react";
7
- import { useRouter } from "next/navigation";
8
- import Link from "next/link";
9
- import { Avatar, AvatarImage, AvatarFallback } from "hazo_auth/components/ui/avatar";
10
- import { Button } from "hazo_auth/components/ui/button";
11
- import {
12
- DropdownMenu,
13
- DropdownMenuContent,
14
- DropdownMenuItem,
15
- DropdownMenuSeparator,
16
- DropdownMenuTrigger,
17
- } from "hazo_auth/components/ui/dropdown-menu";
18
- import { Settings, LogOut } from "lucide-react";
19
- import { toast } from "sonner";
20
- import { use_auth_status, trigger_auth_status_refresh } from "hazo_auth/components/layouts/shared/hooks/use_auth_status";
21
- // Type-only import from server file is safe (types are erased at runtime)
22
- import type { ProfilePicMenuMenuItem } from "hazo_auth/lib/profile_pic_menu_config.server";
23
-
24
- // section: types
25
- export type ProfilePicMenuProps = {
26
- show_single_button?: boolean;
27
- sign_up_label?: string;
28
- sign_in_label?: string;
29
- register_path?: string;
30
- login_path?: string;
31
- settings_path?: string;
32
- logout_path?: string;
33
- custom_menu_items?: ProfilePicMenuMenuItem[];
34
- className?: string;
35
- avatar_size?: "default" | "sm" | "lg";
36
- };
37
-
38
- // section: component
39
- /**
40
- * Profile picture menu component
41
- * Shows user profile picture when authenticated, or sign up/sign in buttons when not authenticated
42
- * Clicking profile picture opens dropdown menu with user info and actions
43
- * @param props - Component props including configuration options
44
- * @returns Profile picture menu component
45
- */
46
- export function ProfilePicMenu({
47
- show_single_button = false,
48
- sign_up_label = "Sign Up",
49
- sign_in_label = "Sign In",
50
- register_path = "/hazo_auth/register",
51
- login_path = "/hazo_auth/login",
52
- settings_path = "/hazo_auth/my_settings",
53
- logout_path = "/api/hazo_auth/logout",
54
- custom_menu_items = [],
55
- className,
56
- avatar_size = "default",
57
- }: ProfilePicMenuProps) {
58
- const router = useRouter();
59
- const authStatus = use_auth_status();
60
- const [isLoggingOut, setIsLoggingOut] = useState(false);
61
-
62
- // Get initials from name or email
63
- const getInitials = (): string => {
64
- if (authStatus.name) {
65
- const parts = authStatus.name.trim().split(" ");
66
- if (parts.length >= 2) {
67
- return `${parts[0][0]}${parts[parts.length - 1][0]}`.toUpperCase();
68
- }
69
- return authStatus.name[0]?.toUpperCase() || "";
70
- }
71
- if (authStatus.email) {
72
- return authStatus.email[0]?.toUpperCase() || "";
73
- }
74
- return "?";
75
- };
76
-
77
- // Handle logout
78
- const handleLogout = async () => {
79
- setIsLoggingOut(true);
80
-
81
- try {
82
- const response = await fetch(logout_path, {
83
- method: "POST",
84
- headers: {
85
- "Content-Type": "application/json",
86
- },
87
- });
88
-
89
- const data = await response.json();
90
-
91
- if (!response.ok || !data.success) {
92
- throw new Error(data.error || "Logout failed");
93
- }
94
-
95
- toast.success("Logged out successfully");
96
-
97
- // Trigger auth status refresh in all components
98
- trigger_auth_status_refresh();
99
-
100
- // Refresh the page to update authentication state
101
- router.refresh();
102
- } catch (error) {
103
- const errorMessage =
104
- error instanceof Error ? error.message : "Logout failed. Please try again.";
105
- toast.error(errorMessage);
106
- } finally {
107
- setIsLoggingOut(false);
108
- }
109
- };
110
-
111
- // Build menu items with default items and custom items
112
- const menuItems = useMemo(() => {
113
- const items: ProfilePicMenuMenuItem[] = [];
114
-
115
- // Add default info items (only if authenticated)
116
- if (authStatus.authenticated) {
117
- // User name (info, order: 1)
118
- if (authStatus.name) {
119
- items.push({
120
- type: "info",
121
- value: authStatus.name,
122
- order: 1,
123
- id: "default_name",
124
- });
125
- }
126
-
127
- // Email address (info, order: 2)
128
- if (authStatus.email) {
129
- items.push({
130
- type: "info",
131
- value: authStatus.email,
132
- order: 2,
133
- id: "default_email",
134
- });
135
- }
136
-
137
- // Separator (order: 1)
138
- items.push({
139
- type: "separator",
140
- order: 1,
141
- id: "default_separator",
142
- });
143
-
144
- // Settings (link, order: 1)
145
- items.push({
146
- type: "link",
147
- label: "Settings",
148
- href: settings_path,
149
- order: 1,
150
- id: "default_settings",
151
- });
152
-
153
- // Logout (link, order: 2)
154
- items.push({
155
- type: "link",
156
- label: "Logout",
157
- href: logout_path,
158
- order: 2,
159
- id: "default_logout",
160
- });
161
- }
162
-
163
- // Add custom menu items
164
- items.push(...custom_menu_items);
165
-
166
- // Sort items by type group and order
167
- // Order: info items first, then separators, then links
168
- items.sort((a, b) => {
169
- // Define type priority: info = 0, separator = 1, link = 2
170
- const typePriority = { info: 0, separator: 1, link: 2 };
171
- const aPriority = typePriority[a.type];
172
- const bPriority = typePriority[b.type];
173
-
174
- if (aPriority !== bPriority) {
175
- return aPriority - bPriority;
176
- }
177
-
178
- // Within same type, sort by order
179
- return a.order - b.order;
180
- });
181
-
182
- return items;
183
- }, [authStatus.authenticated, authStatus.name, authStatus.email, settings_path, logout_path, custom_menu_items]);
184
-
185
- // Avatar size classes
186
- const avatarSizeClasses = {
187
- sm: "h-8 w-8",
188
- default: "h-10 w-10",
189
- lg: "h-12 w-12",
190
- };
191
-
192
- // Show loading state
193
- if (authStatus.loading) {
194
- return (
195
- <div className={`cls_profile_pic_menu ${className || ""}`}>
196
- <div className="h-10 w-10 rounded-full bg-slate-200 animate-pulse" />
197
- </div>
198
- );
199
- }
200
-
201
- // Not authenticated - show sign up/sign in buttons
202
- if (!authStatus.authenticated) {
203
- return (
204
- <div className={`cls_profile_pic_menu flex items-center gap-2 ${className || ""}`}>
205
- {show_single_button ? (
206
- <Button asChild variant="default" size="sm">
207
- <Link href={register_path} className="cls_profile_pic_menu_sign_up">
208
- {sign_up_label}
209
- </Link>
210
- </Button>
211
- ) : (
212
- <>
213
- <Button asChild variant="outline" size="sm">
214
- <Link href={register_path} className="cls_profile_pic_menu_sign_up">
215
- {sign_up_label}
216
- </Link>
217
- </Button>
218
- <Button asChild variant="default" size="sm">
219
- <Link href={login_path} className="cls_profile_pic_menu_sign_in">
220
- {sign_in_label}
221
- </Link>
222
- </Button>
223
- </>
224
- )}
225
- </div>
226
- );
227
- }
228
-
229
- // Authenticated - show profile picture with dropdown menu
230
- return (
231
- <div className={`cls_profile_pic_menu ${className || ""}`}>
232
- <DropdownMenu>
233
- <DropdownMenuTrigger asChild>
234
- <button
235
- className="cls_profile_pic_menu_trigger focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-primary rounded-full"
236
- aria-label="Profile menu"
237
- >
238
- <Avatar className={`cls_profile_pic_menu_avatar ${avatarSizeClasses[avatar_size]} cursor-pointer`}>
239
- <AvatarImage
240
- src={authStatus.profile_picture_url}
241
- alt={authStatus.name ? `Profile picture of ${authStatus.name}` : "Profile picture"}
242
- className="cls_profile_pic_menu_image"
243
- />
244
- <AvatarFallback className="cls_profile_pic_menu_fallback bg-slate-200 text-slate-600">
245
- {getInitials()}
246
- </AvatarFallback>
247
- </Avatar>
248
- </button>
249
- </DropdownMenuTrigger>
250
- <DropdownMenuContent align="end" className="cls_profile_pic_menu_dropdown w-56">
251
- {menuItems.map((item) => {
252
- if (item.type === "separator") {
253
- return <DropdownMenuSeparator key={item.id} className="cls_profile_pic_menu_separator" />;
254
- }
255
-
256
- if (item.type === "info") {
257
- return (
258
- <div key={item.id} className="cls_profile_pic_menu_info">
259
- {item.value && (
260
- <div className="cls_profile_pic_menu_info_value px-2 py-1.5 text-sm text-foreground">
261
- {item.value}
262
- </div>
263
- )}
264
- </div>
265
- );
266
- }
267
-
268
- if (item.type === "link") {
269
- // Special handling for logout
270
- if (item.id === "default_logout") {
271
- return (
272
- <DropdownMenuItem
273
- key={item.id}
274
- onClick={handleLogout}
275
- disabled={isLoggingOut}
276
- className="cls_profile_pic_menu_logout cursor-pointer text-destructive focus:text-destructive"
277
- >
278
- <LogOut className="mr-2 h-4 w-4" />
279
- {isLoggingOut ? "Logging out..." : item.label}
280
- </DropdownMenuItem>
281
- );
282
- }
283
-
284
- // Special handling for settings
285
- if (item.id === "default_settings") {
286
- return (
287
- <DropdownMenuItem
288
- key={item.id}
289
- asChild
290
- className="cls_profile_pic_menu_settings cursor-pointer"
291
- >
292
- <Link href={item.href || settings_path}>
293
- <Settings className="mr-2 h-4 w-4" />
294
- {item.label}
295
- </Link>
296
- </DropdownMenuItem>
297
- );
298
- }
299
-
300
- // Generic link handling
301
- return (
302
- <DropdownMenuItem
303
- key={item.id}
304
- asChild
305
- className="cls_profile_pic_menu_link cursor-pointer"
306
- >
307
- <Link href={item.href || "#"}>
308
- {item.label}
309
- </Link>
310
- </DropdownMenuItem>
311
- );
312
- }
313
-
314
- return null;
315
- })}
316
- </DropdownMenuContent>
317
- </DropdownMenu>
318
- </div>
319
- );
320
- }
321
-
@@ -1,40 +0,0 @@
1
- // file_description: server wrapper component that loads profile picture menu configuration and passes to client component
2
- // section: imports
3
- import { ProfilePicMenu } from "hazo_auth/components/layouts/shared/components/profile_pic_menu";
4
- import { get_profile_pic_menu_config } from "hazo_auth/lib/profile_pic_menu_config.server";
5
-
6
- // section: types
7
- export type ProfilePicMenuWrapperProps = {
8
- className?: string;
9
- avatar_size?: "default" | "sm" | "lg";
10
- };
11
-
12
- // section: component
13
- /**
14
- * Server wrapper component that loads profile picture menu configuration from hazo_auth_config.ini
15
- * and passes it to the client ProfilePicMenu component
16
- * @param props - Component props including className and avatar_size
17
- * @returns ProfilePicMenu component with loaded configuration
18
- */
19
- export function ProfilePicMenuWrapper({
20
- className,
21
- avatar_size,
22
- }: ProfilePicMenuWrapperProps) {
23
- const config = get_profile_pic_menu_config();
24
-
25
- return (
26
- <ProfilePicMenu
27
- show_single_button={config.show_single_button}
28
- sign_up_label={config.sign_up_label}
29
- sign_in_label={config.sign_in_label}
30
- register_path={config.register_path}
31
- login_path={config.login_path}
32
- settings_path={config.settings_path}
33
- logout_path={config.logout_path}
34
- custom_menu_items={config.custom_menu_items}
35
- className={className}
36
- avatar_size={avatar_size}
37
- />
38
- );
39
- }
40
-