@m5kdev/frontend 0.21.9 → 0.25.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 (132) hide show
  1. package/dist/_virtual/_rolldown/runtime.js +23 -0
  2. package/dist/src/index.d.mts +3 -1
  3. package/dist/src/index.d.ts +3 -1
  4. package/dist/src/index.js +4 -0
  5. package/dist/src/index.mjs +3 -1
  6. package/dist/src/modules/app/components/AppConfigProvider.d.mts +4 -0
  7. package/dist/src/modules/app/components/AppConfigProvider.d.mts.map +1 -1
  8. package/dist/src/modules/app/components/AppConfigProvider.d.ts +4 -0
  9. package/dist/src/modules/app/components/AppConfigProvider.d.ts.map +1 -1
  10. package/dist/src/modules/app/components/AppConfigProvider.js +1 -0
  11. package/dist/src/modules/app/components/AppConfigProvider.js.map +1 -1
  12. package/dist/src/modules/app/components/AppConfigProvider.mjs.map +1 -1
  13. package/dist/src/modules/app/components/AppTrpcQueryProvider.js +1 -0
  14. package/dist/src/modules/app/components/AppTrpcQueryProvider.js.map +1 -1
  15. package/dist/src/modules/app/hooks/useAppConfig.d.mts +5 -0
  16. package/dist/src/modules/app/hooks/useAppConfig.d.mts.map +1 -1
  17. package/dist/src/modules/app/hooks/useAppConfig.d.ts +5 -0
  18. package/dist/src/modules/app/hooks/useAppConfig.d.ts.map +1 -1
  19. package/dist/src/modules/app/hooks/useAppConfig.js +1 -0
  20. package/dist/src/modules/app/hooks/useAppConfig.js.map +1 -1
  21. package/dist/src/modules/app/hooks/useAppRoles.d.mts +8 -0
  22. package/dist/src/modules/app/hooks/useAppRoles.d.mts.map +1 -0
  23. package/dist/src/modules/app/hooks/useAppRoles.d.ts +8 -0
  24. package/dist/src/modules/app/hooks/useAppRoles.d.ts.map +1 -0
  25. package/dist/src/modules/app/hooks/useAppRoles.js +16 -0
  26. package/dist/src/modules/app/hooks/useAppRoles.js.map +1 -0
  27. package/dist/src/modules/app/hooks/useAppRoles.mjs +14 -0
  28. package/dist/src/modules/app/hooks/useAppRoles.mjs.map +1 -0
  29. package/dist/src/modules/app/hooks/useRoleLabel.d.mts +7 -0
  30. package/dist/src/modules/app/hooks/useRoleLabel.d.mts.map +1 -0
  31. package/dist/src/modules/app/hooks/useRoleLabel.d.ts +7 -0
  32. package/dist/src/modules/app/hooks/useRoleLabel.d.ts.map +1 -0
  33. package/dist/src/modules/app/hooks/useRoleLabel.js +23 -0
  34. package/dist/src/modules/app/hooks/useRoleLabel.js.map +1 -0
  35. package/dist/src/modules/app/hooks/useRoleLabel.mjs +21 -0
  36. package/dist/src/modules/app/hooks/useRoleLabel.mjs.map +1 -0
  37. package/dist/src/modules/app/utils/locale.d.mts +8 -0
  38. package/dist/src/modules/app/utils/locale.d.mts.map +1 -0
  39. package/dist/src/modules/app/utils/locale.d.ts +8 -0
  40. package/dist/src/modules/app/utils/locale.d.ts.map +1 -0
  41. package/dist/src/modules/app/utils/locale.js +20 -0
  42. package/dist/src/modules/app/utils/locale.js.map +1 -0
  43. package/dist/src/modules/app/utils/locale.mjs +16 -0
  44. package/dist/src/modules/app/utils/locale.mjs.map +1 -0
  45. package/dist/src/modules/auth/auth.client.d.mts +1643 -102
  46. package/dist/src/modules/auth/auth.client.d.mts.map +1 -1
  47. package/dist/src/modules/auth/auth.client.d.ts +1643 -102
  48. package/dist/src/modules/auth/auth.client.d.ts.map +1 -1
  49. package/dist/src/modules/auth/auth.client.js +7 -3
  50. package/dist/src/modules/auth/auth.client.js.map +1 -1
  51. package/dist/src/modules/auth/auth.client.mjs +6 -3
  52. package/dist/src/modules/auth/auth.client.mjs.map +1 -1
  53. package/dist/src/modules/auth/auth.context.js +1 -0
  54. package/dist/src/modules/auth/auth.context.js.map +1 -1
  55. package/dist/src/modules/auth/auth.lib.d.mts +4 -2103
  56. package/dist/src/modules/auth/auth.lib.d.mts.map +1 -1
  57. package/dist/src/modules/auth/auth.lib.d.ts +4 -2103
  58. package/dist/src/modules/auth/auth.lib.d.ts.map +1 -1
  59. package/dist/src/modules/auth/auth.lib.js.map +1 -1
  60. package/dist/src/modules/auth/auth.lib.mjs.map +1 -1
  61. package/dist/src/modules/auth/components/AuthProvider.d.mts +1 -1
  62. package/dist/src/modules/auth/components/AuthProvider.d.mts.map +1 -1
  63. package/dist/src/modules/auth/components/AuthProvider.d.ts +1 -1
  64. package/dist/src/modules/auth/components/AuthProvider.d.ts.map +1 -1
  65. package/dist/src/modules/auth/components/AuthProvider.js +4 -0
  66. package/dist/src/modules/auth/components/AuthProvider.js.map +1 -1
  67. package/dist/src/modules/auth/components/AuthProvider.mjs +3 -0
  68. package/dist/src/modules/auth/components/AuthProvider.mjs.map +1 -1
  69. package/dist/src/modules/auth/hooks/useAuth.js +1 -0
  70. package/dist/src/modules/auth/hooks/useAuth.js.map +1 -1
  71. package/dist/src/modules/auth/hooks/useAuthAdmin.d.mts +10 -1
  72. package/dist/src/modules/auth/hooks/useAuthAdmin.d.mts.map +1 -1
  73. package/dist/src/modules/auth/hooks/useAuthAdmin.d.ts +10 -1
  74. package/dist/src/modules/auth/hooks/useAuthAdmin.d.ts.map +1 -1
  75. package/dist/src/modules/auth/hooks/useAuthAdmin.js +1 -0
  76. package/dist/src/modules/auth/hooks/useAuthAdmin.js.map +1 -1
  77. package/dist/src/modules/auth/hooks/useAuthClient.d.mts +2 -702
  78. package/dist/src/modules/auth/hooks/useAuthClient.d.mts.map +1 -1
  79. package/dist/src/modules/auth/hooks/useAuthClient.d.ts +2 -702
  80. package/dist/src/modules/auth/hooks/useAuthClient.d.ts.map +1 -1
  81. package/dist/src/modules/auth/hooks/useAuthClient.js +1 -0
  82. package/dist/src/modules/auth/hooks/useAuthClient.js.map +1 -1
  83. package/dist/src/modules/auth/hooks/useAuthClient.mjs.map +1 -1
  84. package/dist/src/modules/auth/hooks/useAuthLocale.d.mts +23 -0
  85. package/dist/src/modules/auth/hooks/useAuthLocale.d.mts.map +1 -0
  86. package/dist/src/modules/auth/hooks/useAuthLocale.d.ts +23 -0
  87. package/dist/src/modules/auth/hooks/useAuthLocale.d.ts.map +1 -0
  88. package/dist/src/modules/auth/hooks/useAuthLocale.js +25 -0
  89. package/dist/src/modules/auth/hooks/useAuthLocale.js.map +1 -0
  90. package/dist/src/modules/auth/hooks/useAuthLocale.mjs +23 -0
  91. package/dist/src/modules/auth/hooks/useAuthLocale.mjs.map +1 -0
  92. package/dist/src/modules/auth/hooks/useMemberInvite.js +2 -5
  93. package/dist/src/modules/auth/hooks/useMemberInvite.js.map +1 -1
  94. package/dist/src/modules/auth/hooks/useMemberInvite.mjs +1 -5
  95. package/dist/src/modules/auth/hooks/useMemberInvite.mjs.map +1 -1
  96. package/dist/src/modules/auth/hooks/useOrganizationAccess.d.mts +4 -3
  97. package/dist/src/modules/auth/hooks/useOrganizationAccess.d.mts.map +1 -1
  98. package/dist/src/modules/auth/hooks/useOrganizationAccess.d.ts +4 -3
  99. package/dist/src/modules/auth/hooks/useOrganizationAccess.d.ts.map +1 -1
  100. package/dist/src/modules/auth/hooks/useOrganizationAccess.js +8 -2
  101. package/dist/src/modules/auth/hooks/useOrganizationAccess.js.map +1 -1
  102. package/dist/src/modules/auth/hooks/useOrganizationAccess.mjs +7 -2
  103. package/dist/src/modules/auth/hooks/useOrganizationAccess.mjs.map +1 -1
  104. package/dist/src/modules/auth/hooks/useSession.js +1 -0
  105. package/dist/src/modules/auth/hooks/useSession.js.map +1 -1
  106. package/dist/src/modules/auth/hooks/useUserOrganizations.d.mts +2 -1
  107. package/dist/src/modules/auth/hooks/useUserOrganizations.d.ts +2 -1
  108. package/dist/src/modules/auth/hooks/useUserOrganizations.js +1 -0
  109. package/dist/src/modules/auth/hooks/useUserOrganizations.js.map +1 -1
  110. package/dist/src/modules/billing/components/BillingProvider.d.mts +1 -1
  111. package/dist/src/modules/billing/components/BillingProvider.d.mts.map +1 -1
  112. package/dist/src/modules/billing/components/BillingProvider.d.ts +1 -1
  113. package/dist/src/modules/billing/components/BillingProvider.d.ts.map +1 -1
  114. package/dist/src/modules/billing/components/BillingProvider.js +1 -0
  115. package/dist/src/modules/billing/components/BillingProvider.js.map +1 -1
  116. package/dist/src/modules/billing/hooks/useSubscription.js +1 -0
  117. package/dist/src/modules/billing/hooks/useSubscription.js.map +1 -1
  118. package/dist/src/modules/file/hooks/useS3DownloadUrl.js +1 -0
  119. package/dist/src/modules/file/hooks/useS3DownloadUrl.js.map +1 -1
  120. package/dist/src/modules/file/hooks/useS3Upload.js +1 -0
  121. package/dist/src/modules/file/hooks/useS3Upload.js.map +1 -1
  122. package/dist/src/modules/file/hooks/useUpload.js +1 -0
  123. package/dist/src/modules/file/hooks/useUpload.js.map +1 -1
  124. package/dist/src/modules/table/hooks/useQueryWithParams.js +1 -0
  125. package/dist/src/modules/table/hooks/useQueryWithParams.js.map +1 -1
  126. package/dist/src/modules/table/hooks/useTableQueryParams.js +1 -0
  127. package/dist/src/modules/table/hooks/useTableQueryParams.js.map +1 -1
  128. package/dist/src/modules/table/queryParams.js +1 -0
  129. package/dist/src/modules/table/queryParams.js.map +1 -1
  130. package/dist/src/utils/date.js +1 -0
  131. package/dist/src/utils/date.js.map +1 -1
  132. package/package.json +19 -5
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthClient.d.ts","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"mappings":";;;;iBAIgB,aAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAGimD,kBAAA;IAAA;;;;;;;;;;;;;;;;;;;;;;;;;UAA+wG,qBAAA,CAAA,WAAA;;;;;;;;;;;;;;;;;YAAx5D,YAAA;;;eAA2F,WAAA,IAAA,WAAA;;;;;eAA+U,eAAA;kBAA+C,kBAAA;;;WAAwG,WAAA;eAAwC,eAAA;;qBAAqF,cAAA;cAAyC,WAAA;gBAAgD,QAAA,EAAhD,qBAAA,CAAgD,eAAA,KAAA,OAAA;;;;;qBAAA,qBAAA,CAAA,UAAA;;;;;;;;;;;;;;;;;;;;kCAA27B,YAAA;;cAAA,qBAAA,CAAmG,gBAAA,UAAA,IAAA,UAAA,IAAA;kBAAA,qBAAA,CAAmG,gBAAA;;;;;uBAAuM,IAAA"}
1
+ {"version":3,"file":"useAuthClient.d.ts","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"mappings":";;;iBAKgB,aAAA,CAAA,GAAiB,aAAA"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_auth_auth_lib = require("../auth.lib.js");
3
4
  const require_src_modules_auth_auth_context = require("../auth.context.js");
4
5
  let react = require("react");
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthClient.js","names":["authProviderContext","getAuthClient"],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\nimport { getAuthClient } from \"../auth.lib\";\r\n\r\nexport function useAuthClient() {\r\n return useContext(authProviderContext).authClient ?? getAuthClient();\r\n}\r\n"],"mappings":";;;;;AAIA,SAAgB,gBAAgB;AAC9B,SAAA,GAAA,MAAA,YAAkBA,sCAAAA,oBAAoB,CAAC,cAAcC,kCAAAA,eAAe"}
1
+ {"version":3,"file":"useAuthClient.js","names":["authProviderContext","getAuthClient"],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\nimport type { M5KAuthClient } from \"../auth.client\";\r\nimport { getAuthClient } from \"../auth.lib\";\r\n\r\nexport function useAuthClient(): M5KAuthClient {\r\n return useContext(authProviderContext).authClient ?? getAuthClient();\r\n}\r\n"],"mappings":";;;;;;AAKA,SAAgB,gBAA+B;AAC7C,SAAA,GAAA,MAAA,YAAkBA,sCAAAA,oBAAoB,CAAC,cAAcC,kCAAAA,eAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"useAuthClient.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\nimport { getAuthClient } from \"../auth.lib\";\r\n\r\nexport function useAuthClient() {\r\n return useContext(authProviderContext).authClient ?? getAuthClient();\r\n}\r\n"],"mappings":";;;;AAIA,SAAgB,gBAAgB;AAC9B,QAAO,WAAW,oBAAoB,CAAC,cAAc,eAAe"}
1
+ {"version":3,"file":"useAuthClient.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\nimport type { M5KAuthClient } from \"../auth.client\";\r\nimport { getAuthClient } from \"../auth.lib\";\r\n\r\nexport function useAuthClient(): M5KAuthClient {\r\n return useContext(authProviderContext).authClient ?? getAuthClient();\r\n}\r\n"],"mappings":";;;;AAKA,SAAgB,gBAA+B;AAC7C,QAAO,WAAW,oBAAoB,CAAC,cAAc,eAAe"}
@@ -0,0 +1,23 @@
1
+ import * as _$_tanstack_react_query0 from "@tanstack/react-query";
2
+ import * as _$_trpc_client0 from "@trpc/client";
3
+ import * as _$_trpc_server0 from "@trpc/server";
4
+
5
+ //#region src/modules/auth/hooks/useAuthLocale.d.ts
6
+ declare function useAuthLocale(): {
7
+ locale: string | undefined;
8
+ isLoading: boolean;
9
+ setLocale: _$_tanstack_react_query0.UseMutateFunction<string, _$_trpc_client0.TRPCClientErrorLike<{
10
+ input: {
11
+ locale: string;
12
+ };
13
+ output: string;
14
+ transformer: true;
15
+ errorShape: _$_trpc_server0.TRPCDefaultErrorShape;
16
+ }>, {
17
+ locale: string;
18
+ }, undefined>;
19
+ isSettingLocale: boolean;
20
+ };
21
+ //#endregion
22
+ export { useAuthLocale };
23
+ //# sourceMappingURL=useAuthLocale.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthLocale.d.mts","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthLocale.ts"],"mappings":";;;;;iBAKgB,aAAA,CAAA;;;;;;;;;gBAAa,eAAA,CAAA,qBAAA;EAAA"}
@@ -0,0 +1,23 @@
1
+ import * as _$_tanstack_react_query0 from "@tanstack/react-query";
2
+ import * as _$_trpc_client0 from "@trpc/client";
3
+ import * as _$_trpc_server0 from "@trpc/server";
4
+
5
+ //#region src/modules/auth/hooks/useAuthLocale.d.ts
6
+ declare function useAuthLocale(): {
7
+ locale: string | undefined;
8
+ isLoading: boolean;
9
+ setLocale: _$_tanstack_react_query0.UseMutateFunction<string, _$_trpc_client0.TRPCClientErrorLike<{
10
+ input: {
11
+ locale: string;
12
+ };
13
+ output: string;
14
+ transformer: true;
15
+ errorShape: _$_trpc_server0.TRPCDefaultErrorShape;
16
+ }>, {
17
+ locale: string;
18
+ }, undefined>;
19
+ isSettingLocale: boolean;
20
+ };
21
+ //#endregion
22
+ export { useAuthLocale };
23
+ //# sourceMappingURL=useAuthLocale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthLocale.d.ts","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthLocale.ts"],"mappings":";;;;;iBAKgB,aAAA,CAAA;;;;;;;;;gBAAa,eAAA,CAAA,qBAAA;EAAA"}
@@ -0,0 +1,25 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
3
+ const require_src_modules_app_hooks_useAppTrpc = require("../../app/hooks/useAppTrpc.js");
4
+ const require_src_modules_app_utils_locale = require("../../app/utils/locale.js");
5
+ let _tanstack_react_query = require("@tanstack/react-query");
6
+ //#region src/modules/auth/hooks/useAuthLocale.ts
7
+ function useAuthLocale() {
8
+ const trpc = require_src_modules_app_hooks_useAppTrpc.useAppTRPC();
9
+ const queryClient = (0, _tanstack_react_query.useQueryClient)();
10
+ const localeQuery = (0, _tanstack_react_query.useQuery)(trpc.auth.getLocale.queryOptions());
11
+ const setLocaleMutation = (0, _tanstack_react_query.useMutation)(trpc.auth.setLocale.mutationOptions({ onSuccess: async (locale) => {
12
+ await require_src_modules_app_utils_locale.syncI18nLocale(locale);
13
+ await queryClient.invalidateQueries({ queryKey: trpc.auth.getLocale.queryKey() });
14
+ } }));
15
+ return {
16
+ locale: localeQuery.data,
17
+ isLoading: localeQuery.isLoading,
18
+ setLocale: setLocaleMutation.mutate,
19
+ isSettingLocale: setLocaleMutation.isPending
20
+ };
21
+ }
22
+ //#endregion
23
+ exports.useAuthLocale = useAuthLocale;
24
+
25
+ //# sourceMappingURL=useAuthLocale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthLocale.js","names":["useAppTRPC","syncI18nLocale"],"sources":["../../../../../src/modules/auth/hooks/useAuthLocale.ts"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\nimport { syncI18nLocale } from \"../../app/utils/locale\";\r\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\r\n\r\nexport function useAuthLocale() {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n const queryClient = useQueryClient();\r\n\r\n const localeQuery = useQuery(trpc.auth.getLocale.queryOptions());\r\n const setLocaleMutation = useMutation(\r\n trpc.auth.setLocale.mutationOptions({\r\n onSuccess: async (locale) => {\r\n await syncI18nLocale(locale);\r\n await queryClient.invalidateQueries({\r\n queryKey: trpc.auth.getLocale.queryKey(),\r\n });\r\n },\r\n })\r\n );\r\n\r\n return {\r\n locale: localeQuery.data,\r\n isLoading: localeQuery.isLoading,\r\n setLocale: setLocaleMutation.mutate,\r\n isSettingLocale: setLocaleMutation.isPending,\r\n };\r\n}\r\n"],"mappings":";;;;;;AAKA,SAAgB,gBAAgB;CAC9B,MAAM,OAAOA,yCAAAA,YAA+B;CAC5C,MAAM,eAAA,GAAA,sBAAA,iBAA8B;CAEpC,MAAM,eAAA,GAAA,sBAAA,UAAuB,KAAK,KAAK,UAAU,cAAc,CAAC;CAChE,MAAM,qBAAA,GAAA,sBAAA,aACJ,KAAK,KAAK,UAAU,gBAAgB,EAClC,WAAW,OAAO,WAAW;AAC3B,QAAMC,qCAAAA,eAAe,OAAO;AAC5B,QAAM,YAAY,kBAAkB,EAClC,UAAU,KAAK,KAAK,UAAU,UAAU,EACzC,CAAC;IAEL,CAAC,CACH;AAED,QAAO;EACL,QAAQ,YAAY;EACpB,WAAW,YAAY;EACvB,WAAW,kBAAkB;EAC7B,iBAAiB,kBAAkB;EACpC"}
@@ -0,0 +1,23 @@
1
+ import { useAppTRPC } from "../../app/hooks/useAppTrpc.mjs";
2
+ import { syncI18nLocale } from "../../app/utils/locale.mjs";
3
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
4
+ //#region src/modules/auth/hooks/useAuthLocale.ts
5
+ function useAuthLocale() {
6
+ const trpc = useAppTRPC();
7
+ const queryClient = useQueryClient();
8
+ const localeQuery = useQuery(trpc.auth.getLocale.queryOptions());
9
+ const setLocaleMutation = useMutation(trpc.auth.setLocale.mutationOptions({ onSuccess: async (locale) => {
10
+ await syncI18nLocale(locale);
11
+ await queryClient.invalidateQueries({ queryKey: trpc.auth.getLocale.queryKey() });
12
+ } }));
13
+ return {
14
+ locale: localeQuery.data,
15
+ isLoading: localeQuery.isLoading,
16
+ setLocale: setLocaleMutation.mutate,
17
+ isSettingLocale: setLocaleMutation.isPending
18
+ };
19
+ }
20
+ //#endregion
21
+ export { useAuthLocale };
22
+
23
+ //# sourceMappingURL=useAuthLocale.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthLocale.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthLocale.ts"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\nimport { syncI18nLocale } from \"../../app/utils/locale\";\r\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\r\n\r\nexport function useAuthLocale() {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n const queryClient = useQueryClient();\r\n\r\n const localeQuery = useQuery(trpc.auth.getLocale.queryOptions());\r\n const setLocaleMutation = useMutation(\r\n trpc.auth.setLocale.mutationOptions({\r\n onSuccess: async (locale) => {\r\n await syncI18nLocale(locale);\r\n await queryClient.invalidateQueries({\r\n queryKey: trpc.auth.getLocale.queryKey(),\r\n });\r\n },\r\n })\r\n );\r\n\r\n return {\r\n locale: localeQuery.data,\r\n isLoading: localeQuery.isLoading,\r\n setLocale: setLocaleMutation.mutate,\r\n isSettingLocale: setLocaleMutation.isPending,\r\n };\r\n}\r\n"],"mappings":";;;;AAKA,SAAgB,gBAAgB;CAC9B,MAAM,OAAO,YAA+B;CAC5C,MAAM,cAAc,gBAAgB;CAEpC,MAAM,cAAc,SAAS,KAAK,KAAK,UAAU,cAAc,CAAC;CAChE,MAAM,oBAAoB,YACxB,KAAK,KAAK,UAAU,gBAAgB,EAClC,WAAW,OAAO,WAAW;AAC3B,QAAM,eAAe,OAAO;AAC5B,QAAM,YAAY,kBAAkB,EAClC,UAAU,KAAK,KAAK,UAAU,UAAU,EACzC,CAAC;IAEL,CAAC,CACH;AAED,QAAO;EACL,QAAQ,YAAY;EACpB,WAAW,YAAY;EACvB,WAAW,kBAAkB;EAC7B,iBAAiB,kBAAkB;EACpC"}
@@ -1,16 +1,13 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_auth_hooks_useAuthClient = require("./useAuthClient.js");
3
4
  const require_src_modules_auth_hooks_useOrganizationAccess = require("./useOrganizationAccess.js");
4
5
  let _tanstack_react_query = require("@tanstack/react-query");
5
6
  //#region src/modules/auth/hooks/useMemberInvite.ts
6
7
  function useAuthMemberInvite(options, props) {
7
- const { managerRoles = ["admin", "owner"], onInvalidateScopedQueries } = props ?? {};
8
8
  const { onSuccess, ...rest } = options;
9
9
  const authClient = require_src_modules_auth_hooks_useAuthClient.useAuthClient();
10
- const { refreshOrganizationQueries, activeOrganizationId } = require_src_modules_auth_hooks_useOrganizationAccess.useOrganizationAccess({
11
- managerRoles,
12
- onInvalidateScopedQueries
13
- });
10
+ const { refreshOrganizationQueries, activeOrganizationId } = require_src_modules_auth_hooks_useOrganizationAccess.useOrganizationAccess(props ?? {});
14
11
  return (0, _tanstack_react_query.useMutation)({
15
12
  mutationFn: async ({ email, role }) => {
16
13
  const { error } = await authClient.organization.inviteMember({
@@ -1 +1 @@
1
- {"version":3,"file":"useMemberInvite.js","names":["useAuthClient","useOrganizationAccess"],"sources":["../../../../../src/modules/auth/hooks/useMemberInvite.ts"],"sourcesContent":["import { type UseMutationOptions, useMutation } from \"@tanstack/react-query\";\r\nimport { useAuthClient } from \"./useAuthClient\";\r\nimport {\r\n type AuthOrganizationRole,\r\n type UseOrganizationAccessProps,\r\n useOrganizationAccess,\r\n} from \"./useOrganizationAccess\";\r\n\r\ntype Variables = { email: string; role: AuthOrganizationRole };\r\n\r\nexport function useAuthMemberInvite(\r\n options: Omit<UseMutationOptions<void, Error, Variables, unknown>, \"mutationFn\">,\r\n props?: UseOrganizationAccessProps\r\n): ReturnType<typeof useMutation<void, Error, Variables, unknown>> {\r\n const { managerRoles = [\"admin\", \"owner\"], onInvalidateScopedQueries } = props ?? {};\r\n const { onSuccess, ...rest } = options;\r\n const authClient = useAuthClient();\r\n const { refreshOrganizationQueries, activeOrganizationId } = useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n });\r\n return useMutation({\r\n mutationFn: async ({ email, role }: { email: string; role: AuthOrganizationRole }) => {\r\n const { error } = await authClient.organization.inviteMember({\r\n organizationId: activeOrganizationId,\r\n email: email.trim(),\r\n role,\r\n });\r\n if (error) throw new Error(error.message);\r\n },\r\n\r\n onSuccess: async (data, variables, context) => {\r\n await refreshOrganizationQueries();\r\n await onSuccess?.(data, variables, context);\r\n },\r\n ...rest,\r\n });\r\n}\r\n"],"mappings":";;;;;AAUA,SAAgB,oBACd,SACA,OACiE;CACjE,MAAM,EAAE,eAAe,CAAC,SAAS,QAAQ,EAAE,8BAA8B,SAAS,EAAE;CACpF,MAAM,EAAE,WAAW,GAAG,SAAS;CAC/B,MAAM,aAAaA,6CAAAA,eAAe;CAClC,MAAM,EAAE,4BAA4B,yBAAyBC,qDAAAA,sBAAsB;EACjF;EACA;EACD,CAAC;AACF,SAAA,GAAA,sBAAA,aAAmB;EACjB,YAAY,OAAO,EAAE,OAAO,WAA0D;GACpF,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,aAAa;IAC3D,gBAAgB;IAChB,OAAO,MAAM,MAAM;IACnB;IACD,CAAC;AACF,OAAI,MAAO,OAAM,IAAI,MAAM,MAAM,QAAQ;;EAG3C,WAAW,OAAO,MAAM,WAAW,YAAY;AAC7C,SAAM,4BAA4B;AAClC,SAAM,YAAY,MAAM,WAAW,QAAQ;;EAE7C,GAAG;EACJ,CAAC"}
1
+ {"version":3,"file":"useMemberInvite.js","names":["useAuthClient","useOrganizationAccess"],"sources":["../../../../../src/modules/auth/hooks/useMemberInvite.ts"],"sourcesContent":["import { type UseMutationOptions, useMutation } from \"@tanstack/react-query\";\r\nimport { useAuthClient } from \"./useAuthClient\";\r\nimport {\r\n type AuthOrganizationRole,\r\n type UseOrganizationAccessProps,\r\n useOrganizationAccess,\r\n} from \"./useOrganizationAccess\";\r\n\r\ntype Variables = { email: string; role: AuthOrganizationRole };\r\n\r\nexport function useAuthMemberInvite(\r\n options: Omit<UseMutationOptions<void, Error, Variables, unknown>, \"mutationFn\">,\r\n props?: UseOrganizationAccessProps\r\n): ReturnType<typeof useMutation<void, Error, Variables, unknown>> {\r\n const { onSuccess, ...rest } = options;\r\n const authClient = useAuthClient();\r\n const { refreshOrganizationQueries, activeOrganizationId } = useOrganizationAccess(props ?? {});\r\n return useMutation({\r\n mutationFn: async ({ email, role }: { email: string; role: AuthOrganizationRole }) => {\r\n const { error } = await authClient.organization.inviteMember({\r\n organizationId: activeOrganizationId,\r\n email: email.trim(),\r\n role,\r\n } as Parameters<typeof authClient.organization.inviteMember>[0]);\r\n if (error) throw new Error(error.message);\r\n },\r\n\r\n onSuccess: async (data, variables, context) => {\r\n await refreshOrganizationQueries();\r\n await onSuccess?.(data, variables, context);\r\n },\r\n ...rest,\r\n });\r\n}\r\n"],"mappings":";;;;;;AAUA,SAAgB,oBACd,SACA,OACiE;CACjE,MAAM,EAAE,WAAW,GAAG,SAAS;CAC/B,MAAM,aAAaA,6CAAAA,eAAe;CAClC,MAAM,EAAE,4BAA4B,yBAAyBC,qDAAAA,sBAAsB,SAAS,EAAE,CAAC;AAC/F,SAAA,GAAA,sBAAA,aAAmB;EACjB,YAAY,OAAO,EAAE,OAAO,WAA0D;GACpF,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,aAAa;IAC3D,gBAAgB;IAChB,OAAO,MAAM,MAAM;IACnB;IACD,CAA+D;AAChE,OAAI,MAAO,OAAM,IAAI,MAAM,MAAM,QAAQ;;EAG3C,WAAW,OAAO,MAAM,WAAW,YAAY;AAC7C,SAAM,4BAA4B;AAClC,SAAM,YAAY,MAAM,WAAW,QAAQ;;EAE7C,GAAG;EACJ,CAAC"}
@@ -3,13 +3,9 @@ import { useOrganizationAccess } from "./useOrganizationAccess.mjs";
3
3
  import { useMutation } from "@tanstack/react-query";
4
4
  //#region src/modules/auth/hooks/useMemberInvite.ts
5
5
  function useAuthMemberInvite(options, props) {
6
- const { managerRoles = ["admin", "owner"], onInvalidateScopedQueries } = props ?? {};
7
6
  const { onSuccess, ...rest } = options;
8
7
  const authClient = useAuthClient();
9
- const { refreshOrganizationQueries, activeOrganizationId } = useOrganizationAccess({
10
- managerRoles,
11
- onInvalidateScopedQueries
12
- });
8
+ const { refreshOrganizationQueries, activeOrganizationId } = useOrganizationAccess(props ?? {});
13
9
  return useMutation({
14
10
  mutationFn: async ({ email, role }) => {
15
11
  const { error } = await authClient.organization.inviteMember({
@@ -1 +1 @@
1
- {"version":3,"file":"useMemberInvite.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useMemberInvite.ts"],"sourcesContent":["import { type UseMutationOptions, useMutation } from \"@tanstack/react-query\";\r\nimport { useAuthClient } from \"./useAuthClient\";\r\nimport {\r\n type AuthOrganizationRole,\r\n type UseOrganizationAccessProps,\r\n useOrganizationAccess,\r\n} from \"./useOrganizationAccess\";\r\n\r\ntype Variables = { email: string; role: AuthOrganizationRole };\r\n\r\nexport function useAuthMemberInvite(\r\n options: Omit<UseMutationOptions<void, Error, Variables, unknown>, \"mutationFn\">,\r\n props?: UseOrganizationAccessProps\r\n): ReturnType<typeof useMutation<void, Error, Variables, unknown>> {\r\n const { managerRoles = [\"admin\", \"owner\"], onInvalidateScopedQueries } = props ?? {};\r\n const { onSuccess, ...rest } = options;\r\n const authClient = useAuthClient();\r\n const { refreshOrganizationQueries, activeOrganizationId } = useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n });\r\n return useMutation({\r\n mutationFn: async ({ email, role }: { email: string; role: AuthOrganizationRole }) => {\r\n const { error } = await authClient.organization.inviteMember({\r\n organizationId: activeOrganizationId,\r\n email: email.trim(),\r\n role,\r\n });\r\n if (error) throw new Error(error.message);\r\n },\r\n\r\n onSuccess: async (data, variables, context) => {\r\n await refreshOrganizationQueries();\r\n await onSuccess?.(data, variables, context);\r\n },\r\n ...rest,\r\n });\r\n}\r\n"],"mappings":";;;;AAUA,SAAgB,oBACd,SACA,OACiE;CACjE,MAAM,EAAE,eAAe,CAAC,SAAS,QAAQ,EAAE,8BAA8B,SAAS,EAAE;CACpF,MAAM,EAAE,WAAW,GAAG,SAAS;CAC/B,MAAM,aAAa,eAAe;CAClC,MAAM,EAAE,4BAA4B,yBAAyB,sBAAsB;EACjF;EACA;EACD,CAAC;AACF,QAAO,YAAY;EACjB,YAAY,OAAO,EAAE,OAAO,WAA0D;GACpF,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,aAAa;IAC3D,gBAAgB;IAChB,OAAO,MAAM,MAAM;IACnB;IACD,CAAC;AACF,OAAI,MAAO,OAAM,IAAI,MAAM,MAAM,QAAQ;;EAG3C,WAAW,OAAO,MAAM,WAAW,YAAY;AAC7C,SAAM,4BAA4B;AAClC,SAAM,YAAY,MAAM,WAAW,QAAQ;;EAE7C,GAAG;EACJ,CAAC"}
1
+ {"version":3,"file":"useMemberInvite.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useMemberInvite.ts"],"sourcesContent":["import { type UseMutationOptions, useMutation } from \"@tanstack/react-query\";\r\nimport { useAuthClient } from \"./useAuthClient\";\r\nimport {\r\n type AuthOrganizationRole,\r\n type UseOrganizationAccessProps,\r\n useOrganizationAccess,\r\n} from \"./useOrganizationAccess\";\r\n\r\ntype Variables = { email: string; role: AuthOrganizationRole };\r\n\r\nexport function useAuthMemberInvite(\r\n options: Omit<UseMutationOptions<void, Error, Variables, unknown>, \"mutationFn\">,\r\n props?: UseOrganizationAccessProps\r\n): ReturnType<typeof useMutation<void, Error, Variables, unknown>> {\r\n const { onSuccess, ...rest } = options;\r\n const authClient = useAuthClient();\r\n const { refreshOrganizationQueries, activeOrganizationId } = useOrganizationAccess(props ?? {});\r\n return useMutation({\r\n mutationFn: async ({ email, role }: { email: string; role: AuthOrganizationRole }) => {\r\n const { error } = await authClient.organization.inviteMember({\r\n organizationId: activeOrganizationId,\r\n email: email.trim(),\r\n role,\r\n } as Parameters<typeof authClient.organization.inviteMember>[0]);\r\n if (error) throw new Error(error.message);\r\n },\r\n\r\n onSuccess: async (data, variables, context) => {\r\n await refreshOrganizationQueries();\r\n await onSuccess?.(data, variables, context);\r\n },\r\n ...rest,\r\n });\r\n}\r\n"],"mappings":";;;;AAUA,SAAgB,oBACd,SACA,OACiE;CACjE,MAAM,EAAE,WAAW,GAAG,SAAS;CAC/B,MAAM,aAAa,eAAe;CAClC,MAAM,EAAE,4BAA4B,yBAAyB,sBAAsB,SAAS,EAAE,CAAC;AAC/F,QAAO,YAAY;EACjB,YAAY,OAAO,EAAE,OAAO,WAA0D;GACpF,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,aAAa;IAC3D,gBAAgB;IAChB,OAAO,MAAM,MAAM;IACnB;IACD,CAA+D;AAChE,OAAI,MAAO,OAAM,IAAI,MAAM,MAAM,QAAQ;;EAG3C,WAAW,OAAO,MAAM,WAAW,YAAY;AAC7C,SAAM,4BAA4B;AAClC,SAAM,YAAY,MAAM,WAAW,QAAQ;;EAE7C,GAAG;EACJ,CAAC"}
@@ -1,6 +1,5 @@
1
1
  //#region src/modules/auth/hooks/useOrganizationAccess.d.ts
2
- declare const ORGANIZATION_ROLES: readonly ["member", "admin", "owner"];
3
- type AuthOrganizationRole = (typeof ORGANIZATION_ROLES)[number];
2
+ type AuthOrganizationRole = string;
4
3
  interface UseOrganizationAccessProps {
5
4
  managerRoles?: string[];
6
5
  onInvalidateScopedQueries?: () => void | Promise<void>;
@@ -9,10 +8,12 @@ declare function useOrganizationAccess({
9
8
  managerRoles,
10
9
  onInvalidateScopedQueries
11
10
  }: UseOrganizationAccessProps): {
12
- activeOrganizationId: any;
11
+ activeOrganizationId: string;
13
12
  activeOrganizationRole: string;
14
13
  canManageOrganization: boolean;
15
14
  refreshOrganizationQueries: () => Promise<void>;
15
+ assignableRoles: readonly string[];
16
+ organizationRoles: readonly string[];
16
17
  };
17
18
  //#endregion
18
19
  export { AuthOrganizationRole, UseOrganizationAccessProps, useOrganizationAccess };
@@ -1 +1 @@
1
- {"version":3,"file":"useOrganizationAccess.d.mts","names":[],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"mappings":";cAMM,kBAAA;AAAA,KAEM,oBAAA,WAA+B,kBAAA;AAAA,UAE1B,0BAAA;EACf,YAAA;EACA,yBAAA,gBAAyC,OAAA;AAAA;AAAA,iBAG3B,qBAAA,CAAA;EACd,YAAA;EACA;AAAA,GACC,0BAAA"}
1
+ {"version":3,"file":"useOrganizationAccess.d.mts","names":[],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"mappings":";KAKY,oBAAA;AAAA,UAEK,0BAAA;EACf,YAAA;EACA,yBAAA,gBAAyC,OAAA;AAAA;AAAA,iBAG3B,qBAAA,CAAA;EACd,YAAA;EACA;AAAA,GACC,0BAAA"}
@@ -1,6 +1,5 @@
1
1
  //#region src/modules/auth/hooks/useOrganizationAccess.d.ts
2
- declare const ORGANIZATION_ROLES: readonly ["member", "admin", "owner"];
3
- type AuthOrganizationRole = (typeof ORGANIZATION_ROLES)[number];
2
+ type AuthOrganizationRole = string;
4
3
  interface UseOrganizationAccessProps {
5
4
  managerRoles?: string[];
6
5
  onInvalidateScopedQueries?: () => void | Promise<void>;
@@ -9,10 +8,12 @@ declare function useOrganizationAccess({
9
8
  managerRoles,
10
9
  onInvalidateScopedQueries
11
10
  }: UseOrganizationAccessProps): {
12
- activeOrganizationId: any;
11
+ activeOrganizationId: string;
13
12
  activeOrganizationRole: string;
14
13
  canManageOrganization: boolean;
15
14
  refreshOrganizationQueries: () => Promise<void>;
15
+ assignableRoles: readonly string[];
16
+ organizationRoles: readonly string[];
16
17
  };
17
18
  //#endregion
18
19
  export { AuthOrganizationRole, UseOrganizationAccessProps, useOrganizationAccess };
@@ -1 +1 @@
1
- {"version":3,"file":"useOrganizationAccess.d.ts","names":[],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"mappings":";cAMM,kBAAA;AAAA,KAEM,oBAAA,WAA+B,kBAAA;AAAA,UAE1B,0BAAA;EACf,YAAA;EACA,yBAAA,gBAAyC,OAAA;AAAA;AAAA,iBAG3B,qBAAA,CAAA;EACd,YAAA;EACA;AAAA,GACC,0BAAA"}
1
+ {"version":3,"file":"useOrganizationAccess.d.ts","names":[],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"mappings":";KAKY,oBAAA;AAAA,UAEK,0BAAA;EACf,YAAA;EACA,yBAAA,gBAAyC,OAAA;AAAA;AAAA,iBAG3B,qBAAA,CAAA;EACd,YAAA;EACA;AAAA,GACC,0BAAA"}
@@ -1,4 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
3
+ const require_src_modules_app_hooks_useAppRoles = require("../../app/hooks/useAppRoles.js");
2
4
  const require_src_modules_auth_hooks_useSession = require("./useSession.js");
3
5
  let react = require("react");
4
6
  let _tanstack_react_query = require("@tanstack/react-query");
@@ -6,12 +8,14 @@ let _tanstack_react_query = require("@tanstack/react-query");
6
8
  function useOrganizationAccess({ managerRoles, onInvalidateScopedQueries }) {
7
9
  const { data: session, registerSession } = require_src_modules_auth_hooks_useSession.useSession();
8
10
  const queryClient = (0, _tanstack_react_query.useQueryClient)();
11
+ const organizationRoles = require_src_modules_app_hooks_useAppRoles.useAppRoles("organization");
9
12
  const activeOrganizationId = session?.session.activeOrganizationId ?? "";
10
13
  const activeOrganizationRole = (session?.session)?.activeOrganizationRole ?? "";
14
+ const resolvedManagerRoles = managerRoles ?? organizationRoles.managerRoles;
11
15
  return {
12
16
  activeOrganizationId,
13
17
  activeOrganizationRole,
14
- canManageOrganization: (0, react.useMemo)(() => new Set(managerRoles ?? ["admin", "owner"]), [managerRoles]).has(activeOrganizationRole),
18
+ canManageOrganization: (0, react.useMemo)(() => new Set(resolvedManagerRoles), [resolvedManagerRoles]).has(activeOrganizationRole),
15
19
  refreshOrganizationQueries: (0, react.useCallback)(async () => {
16
20
  await Promise.allSettled([
17
21
  queryClient.invalidateQueries({ queryKey: ["auth-organization-list"] }),
@@ -27,7 +31,9 @@ function useOrganizationAccess({ managerRoles, onInvalidateScopedQueries }) {
27
31
  onInvalidateScopedQueries,
28
32
  queryClient,
29
33
  registerSession
30
- ])
34
+ ]),
35
+ assignableRoles: organizationRoles.assignableRoles,
36
+ organizationRoles: organizationRoles.roles
31
37
  };
32
38
  }
33
39
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useOrganizationAccess.js","names":["useSession"],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"sourcesContent":["import { useQueryClient } from \"@tanstack/react-query\";\r\nimport { useCallback, useMemo } from \"react\";\r\nimport { useSession } from \"./useSession\";\r\n\r\n// TODO: move to commons\r\n\r\nconst ORGANIZATION_ROLES = [\"member\", \"admin\", \"owner\"] as const;\r\n\r\nexport type AuthOrganizationRole = (typeof ORGANIZATION_ROLES)[number];\r\n\r\nexport interface UseOrganizationAccessProps {\r\n managerRoles?: string[];\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n}\r\n\r\nexport function useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: UseOrganizationAccessProps) {\r\n const { data: session, registerSession } = useSession();\r\n const queryClient = useQueryClient();\r\n\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? \"\";\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const managerRoleSet = useMemo(() => new Set(managerRoles ?? [\"admin\", \"owner\"]), [managerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const refreshOrganizationQueries = useCallback(async () => {\r\n await Promise.allSettled([\r\n queryClient.invalidateQueries({ queryKey: [\"auth-organization-list\"] }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-members\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-invitations\", activeOrganizationId],\r\n }),\r\n ]);\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n }, [activeOrganizationId, onInvalidateScopedQueries, queryClient, registerSession]);\r\n\r\n return {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n };\r\n}\r\n"],"mappings":";;;;;AAeA,SAAgB,sBAAsB,EACpC,cACA,6BAC6B;CAC7B,MAAM,EAAE,MAAM,SAAS,oBAAoBA,0CAAAA,YAAY;CACvD,MAAM,eAAA,GAAA,sBAAA,iBAA8B;CAEpC,MAAM,uBAAuB,SAAS,QAAQ,wBAAwB;CACtE,MAAM,0BACH,SAAS,UAA6D,0BACvE;AAuBF,QAAO;EACL;EACA;EACA,wBAAA,GAAA,MAAA,eAzBmC,IAAI,IAAI,gBAAgB,CAAC,SAAS,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,CACpD,IAAI,uBAAuB;EAyBtE,6BAAA,GAAA,MAAA,aAvB6C,YAAY;AACzD,SAAM,QAAQ,WAAW;IACvB,YAAY,kBAAkB,EAAE,UAAU,CAAC,yBAAyB,EAAE,CAAC;IACvE,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,iCAAiC,qBAAqB,EAClE,CAAC;IACH,CAAC;AAEF,yBAAsB;AACf,iCAA6B;KAClC;KACD;GAAC;GAAsB;GAA2B;GAAa;GAAgB,CAAC;EAOlF"}
1
+ {"version":3,"file":"useOrganizationAccess.js","names":["useSession","useAppRoles"],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"sourcesContent":["import { useQueryClient } from \"@tanstack/react-query\";\r\nimport { useCallback, useMemo } from \"react\";\r\nimport { useAppRoles } from \"../../app/hooks/useAppRoles\";\r\nimport { useSession } from \"./useSession\";\r\n\r\nexport type AuthOrganizationRole = string;\r\n\r\nexport interface UseOrganizationAccessProps {\r\n managerRoles?: string[];\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n}\r\n\r\nexport function useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: UseOrganizationAccessProps) {\r\n const { data: session, registerSession } = useSession();\r\n const queryClient = useQueryClient();\r\n const organizationRoles = useAppRoles(\"organization\");\r\n\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? \"\";\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const resolvedManagerRoles = managerRoles ?? organizationRoles.managerRoles;\r\n const managerRoleSet = useMemo(() => new Set(resolvedManagerRoles), [resolvedManagerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const refreshOrganizationQueries = useCallback(async () => {\r\n await Promise.allSettled([\r\n queryClient.invalidateQueries({ queryKey: [\"auth-organization-list\"] }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-members\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-invitations\", activeOrganizationId],\r\n }),\r\n ]);\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n }, [activeOrganizationId, onInvalidateScopedQueries, queryClient, registerSession]);\r\n\r\n return {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n assignableRoles: organizationRoles.assignableRoles,\r\n organizationRoles: organizationRoles.roles,\r\n };\r\n}\r\n"],"mappings":";;;;;;;AAYA,SAAgB,sBAAsB,EACpC,cACA,6BAC6B;CAC7B,MAAM,EAAE,MAAM,SAAS,oBAAoBA,0CAAAA,YAAY;CACvD,MAAM,eAAA,GAAA,sBAAA,iBAA8B;CACpC,MAAM,oBAAoBC,0CAAAA,YAAY,eAAe;CAErD,MAAM,uBAAuB,SAAS,QAAQ,wBAAwB;CACtE,MAAM,0BACH,SAAS,UAA6D,0BACvE;CACF,MAAM,uBAAuB,gBAAgB,kBAAkB;AAuB/D,QAAO;EACL;EACA;EACA,wBAAA,GAAA,MAAA,eAzBmC,IAAI,IAAI,qBAAqB,EAAE,CAAC,qBAAqB,CAAC,CAC9C,IAAI,uBAAuB;EAyBtE,6BAAA,GAAA,MAAA,aAvB6C,YAAY;AACzD,SAAM,QAAQ,WAAW;IACvB,YAAY,kBAAkB,EAAE,UAAU,CAAC,yBAAyB,EAAE,CAAC;IACvE,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,iCAAiC,qBAAqB,EAClE,CAAC;IACH,CAAC;AAEF,yBAAsB;AACf,iCAA6B;KAClC;KACD;GAAC;GAAsB;GAA2B;GAAa;GAAgB,CAAC;EAOjF,iBAAiB,kBAAkB;EACnC,mBAAmB,kBAAkB;EACtC"}
@@ -1,3 +1,4 @@
1
+ import { useAppRoles } from "../../app/hooks/useAppRoles.mjs";
1
2
  import { useSession } from "./useSession.mjs";
2
3
  import { useCallback, useMemo } from "react";
3
4
  import { useQueryClient } from "@tanstack/react-query";
@@ -5,12 +6,14 @@ import { useQueryClient } from "@tanstack/react-query";
5
6
  function useOrganizationAccess({ managerRoles, onInvalidateScopedQueries }) {
6
7
  const { data: session, registerSession } = useSession();
7
8
  const queryClient = useQueryClient();
9
+ const organizationRoles = useAppRoles("organization");
8
10
  const activeOrganizationId = session?.session.activeOrganizationId ?? "";
9
11
  const activeOrganizationRole = (session?.session)?.activeOrganizationRole ?? "";
12
+ const resolvedManagerRoles = managerRoles ?? organizationRoles.managerRoles;
10
13
  return {
11
14
  activeOrganizationId,
12
15
  activeOrganizationRole,
13
- canManageOrganization: useMemo(() => new Set(managerRoles ?? ["admin", "owner"]), [managerRoles]).has(activeOrganizationRole),
16
+ canManageOrganization: useMemo(() => new Set(resolvedManagerRoles), [resolvedManagerRoles]).has(activeOrganizationRole),
14
17
  refreshOrganizationQueries: useCallback(async () => {
15
18
  await Promise.allSettled([
16
19
  queryClient.invalidateQueries({ queryKey: ["auth-organization-list"] }),
@@ -26,7 +29,9 @@ function useOrganizationAccess({ managerRoles, onInvalidateScopedQueries }) {
26
29
  onInvalidateScopedQueries,
27
30
  queryClient,
28
31
  registerSession
29
- ])
32
+ ]),
33
+ assignableRoles: organizationRoles.assignableRoles,
34
+ organizationRoles: organizationRoles.roles
30
35
  };
31
36
  }
32
37
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useOrganizationAccess.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"sourcesContent":["import { useQueryClient } from \"@tanstack/react-query\";\r\nimport { useCallback, useMemo } from \"react\";\r\nimport { useSession } from \"./useSession\";\r\n\r\n// TODO: move to commons\r\n\r\nconst ORGANIZATION_ROLES = [\"member\", \"admin\", \"owner\"] as const;\r\n\r\nexport type AuthOrganizationRole = (typeof ORGANIZATION_ROLES)[number];\r\n\r\nexport interface UseOrganizationAccessProps {\r\n managerRoles?: string[];\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n}\r\n\r\nexport function useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: UseOrganizationAccessProps) {\r\n const { data: session, registerSession } = useSession();\r\n const queryClient = useQueryClient();\r\n\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? \"\";\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const managerRoleSet = useMemo(() => new Set(managerRoles ?? [\"admin\", \"owner\"]), [managerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const refreshOrganizationQueries = useCallback(async () => {\r\n await Promise.allSettled([\r\n queryClient.invalidateQueries({ queryKey: [\"auth-organization-list\"] }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-members\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-invitations\", activeOrganizationId],\r\n }),\r\n ]);\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n }, [activeOrganizationId, onInvalidateScopedQueries, queryClient, registerSession]);\r\n\r\n return {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n };\r\n}\r\n"],"mappings":";;;;AAeA,SAAgB,sBAAsB,EACpC,cACA,6BAC6B;CAC7B,MAAM,EAAE,MAAM,SAAS,oBAAoB,YAAY;CACvD,MAAM,cAAc,gBAAgB;CAEpC,MAAM,uBAAuB,SAAS,QAAQ,wBAAwB;CACtE,MAAM,0BACH,SAAS,UAA6D,0BACvE;AAuBF,QAAO;EACL;EACA;EACA,uBAzBqB,cAAc,IAAI,IAAI,gBAAgB,CAAC,SAAS,QAAQ,CAAC,EAAE,CAAC,aAAa,CAAC,CACpD,IAAI,uBAAuB;EAyBtE,4BAvBiC,YAAY,YAAY;AACzD,SAAM,QAAQ,WAAW;IACvB,YAAY,kBAAkB,EAAE,UAAU,CAAC,yBAAyB,EAAE,CAAC;IACvE,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,iCAAiC,qBAAqB,EAClE,CAAC;IACH,CAAC;AAEF,yBAAsB;AACf,iCAA6B;KAClC;KACD;GAAC;GAAsB;GAA2B;GAAa;GAAgB,CAAC;EAOlF"}
1
+ {"version":3,"file":"useOrganizationAccess.mjs","names":[],"sources":["../../../../../src/modules/auth/hooks/useOrganizationAccess.ts"],"sourcesContent":["import { useQueryClient } from \"@tanstack/react-query\";\r\nimport { useCallback, useMemo } from \"react\";\r\nimport { useAppRoles } from \"../../app/hooks/useAppRoles\";\r\nimport { useSession } from \"./useSession\";\r\n\r\nexport type AuthOrganizationRole = string;\r\n\r\nexport interface UseOrganizationAccessProps {\r\n managerRoles?: string[];\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n}\r\n\r\nexport function useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: UseOrganizationAccessProps) {\r\n const { data: session, registerSession } = useSession();\r\n const queryClient = useQueryClient();\r\n const organizationRoles = useAppRoles(\"organization\");\r\n\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? \"\";\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const resolvedManagerRoles = managerRoles ?? organizationRoles.managerRoles;\r\n const managerRoleSet = useMemo(() => new Set(resolvedManagerRoles), [resolvedManagerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const refreshOrganizationQueries = useCallback(async () => {\r\n await Promise.allSettled([\r\n queryClient.invalidateQueries({ queryKey: [\"auth-organization-list\"] }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-members\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-invitations\", activeOrganizationId],\r\n }),\r\n ]);\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n }, [activeOrganizationId, onInvalidateScopedQueries, queryClient, registerSession]);\r\n\r\n return {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n assignableRoles: organizationRoles.assignableRoles,\r\n organizationRoles: organizationRoles.roles,\r\n };\r\n}\r\n"],"mappings":";;;;;AAYA,SAAgB,sBAAsB,EACpC,cACA,6BAC6B;CAC7B,MAAM,EAAE,MAAM,SAAS,oBAAoB,YAAY;CACvD,MAAM,cAAc,gBAAgB;CACpC,MAAM,oBAAoB,YAAY,eAAe;CAErD,MAAM,uBAAuB,SAAS,QAAQ,wBAAwB;CACtE,MAAM,0BACH,SAAS,UAA6D,0BACvE;CACF,MAAM,uBAAuB,gBAAgB,kBAAkB;AAuB/D,QAAO;EACL;EACA;EACA,uBAzBqB,cAAc,IAAI,IAAI,qBAAqB,EAAE,CAAC,qBAAqB,CAAC,CAC9C,IAAI,uBAAuB;EAyBtE,4BAvBiC,YAAY,YAAY;AACzD,SAAM,QAAQ,WAAW;IACvB,YAAY,kBAAkB,EAAE,UAAU,CAAC,yBAAyB,EAAE,CAAC;IACvE,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,6BAA6B,qBAAqB,EAC9D,CAAC;IACF,YAAY,kBAAkB,EAC5B,UAAU,CAAC,iCAAiC,qBAAqB,EAClE,CAAC;IACH,CAAC;AAEF,yBAAsB;AACf,iCAA6B;KAClC;KACD;GAAC;GAAsB;GAA2B;GAAa;GAAgB,CAAC;EAOjF,iBAAiB,kBAAkB;EACnC,mBAAmB,kBAAkB;EACtC"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_auth_auth_context = require("../auth.context.js");
3
4
  let react = require("react");
4
5
  //#region src/modules/auth/hooks/useSession.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useSession.js","names":["authProviderContext"],"sources":["../../../../../src/modules/auth/hooks/useSession.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\n\r\nexport function useSession() {\r\n const { authClient: _authClient, ...session } = useContext(authProviderContext);\r\n return session;\r\n}\r\n"],"mappings":";;;;AAGA,SAAgB,aAAa;CAC3B,MAAM,EAAE,YAAY,aAAa,GAAG,aAAA,GAAA,MAAA,YAAuBA,sCAAAA,oBAAoB;AAC/E,QAAO"}
1
+ {"version":3,"file":"useSession.js","names":["authProviderContext"],"sources":["../../../../../src/modules/auth/hooks/useSession.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { authProviderContext } from \"../auth.context\";\r\n\r\nexport function useSession() {\r\n const { authClient: _authClient, ...session } = useContext(authProviderContext);\r\n return session;\r\n}\r\n"],"mappings":";;;;;AAGA,SAAgB,aAAa;CAC3B,MAAM,EAAE,YAAY,aAAa,GAAG,aAAA,GAAA,MAAA,YAAuBA,sCAAAA,oBAAoB;AAC/E,QAAO"}
@@ -6,9 +6,10 @@ import * as _$_trpc_server0 from "@trpc/server";
6
6
  declare const useUserOrganizations: () => _$_tanstack_react_query0.UseQueryResult<{
7
7
  id: string;
8
8
  name: string;
9
+ type: string | null;
9
10
  createdAt: Date;
10
11
  onboarding: number | null;
11
- type: string | null;
12
+ locale: string | null;
12
13
  slug: string | null;
13
14
  logo: string | null;
14
15
  parentId: string | null;
@@ -6,9 +6,10 @@ import * as _$_trpc_server0 from "@trpc/server";
6
6
  declare const useUserOrganizations: () => _$_tanstack_react_query0.UseQueryResult<{
7
7
  id: string;
8
8
  name: string;
9
+ type: string | null;
9
10
  createdAt: Date;
10
11
  onboarding: number | null;
11
- type: string | null;
12
+ locale: string | null;
12
13
  slug: string | null;
13
14
  logo: string | null;
14
15
  parentId: string | null;
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppTrpc = require("../../app/hooks/useAppTrpc.js");
3
4
  const require_src_modules_auth_hooks_useSession = require("./useSession.js");
4
5
  let _tanstack_react_query = require("@tanstack/react-query");
@@ -1 +1 @@
1
- {"version":3,"file":"useUserOrganizations.js","names":["useAppTRPC","useSession"],"sources":["../../../../../src/modules/auth/hooks/useUserOrganizations.ts"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport { useSession } from \"./useSession\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\n\r\nexport const useUserOrganizations = () => {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n const { data, isLoading } = useSession();\r\n return useQuery(\r\n trpc.auth.listUserOrganizations.queryOptions(undefined, {\r\n enabled: !isLoading && Boolean(data?.session.userId),\r\n })\r\n );\r\n};\r\n"],"mappings":";;;;;AAKA,MAAa,6BAA6B;CACxC,MAAM,OAAOA,yCAAAA,YAA+B;CAC5C,MAAM,EAAE,MAAM,cAAcC,0CAAAA,YAAY;AACxC,SAAA,GAAA,sBAAA,UACE,KAAK,KAAK,sBAAsB,aAAa,KAAA,GAAW,EACtD,SAAS,CAAC,aAAa,QAAQ,MAAM,QAAQ,OAAO,EACrD,CAAC,CACH"}
1
+ {"version":3,"file":"useUserOrganizations.js","names":["useAppTRPC","useSession"],"sources":["../../../../../src/modules/auth/hooks/useUserOrganizations.ts"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport { useSession } from \"./useSession\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\n\r\nexport const useUserOrganizations = () => {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n const { data, isLoading } = useSession();\r\n return useQuery(\r\n trpc.auth.listUserOrganizations.queryOptions(undefined, {\r\n enabled: !isLoading && Boolean(data?.session.userId),\r\n })\r\n );\r\n};\r\n"],"mappings":";;;;;;AAKA,MAAa,6BAA6B;CACxC,MAAM,OAAOA,yCAAAA,YAA+B;CAC5C,MAAM,EAAE,MAAM,cAAcC,0CAAAA,YAAY;AACxC,SAAA,GAAA,sBAAA,UACE,KAAK,KAAK,sBAAsB,aAAa,KAAA,GAAW,EACtD,SAAS,CAAC,aAAa,QAAQ,MAAM,QAAQ,OAAO,EACrD,CAAC,CACH"}
@@ -17,7 +17,7 @@ declare function BillingProvider({
17
17
  loader?: React.ReactNode;
18
18
  planPage: React.ReactNode;
19
19
  skipPlanCheck?: boolean;
20
- }): string | number | bigint | boolean | _$react_jsx_runtime0.JSX.Element | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | null | undefined;
20
+ }): string | number | bigint | boolean | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | _$react_jsx_runtime0.JSX.Element | null | undefined;
21
21
  //#endregion
22
22
  export { BillingProvider, billingProviderContext };
23
23
  //# sourceMappingURL=BillingProvider.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BillingProvider.d.mts","names":[],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"mappings":";;;;;cAMa,sBAAA,EAEQ,OAAA,CAFc,OAAA;;QAE3B,aAAA;AAAA;AAAA,iBAMQ,eAAA,CAAA;EACd,QAAA;EACA,MAAA;EACA,QAAA;EACA;AAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,aAAA;AAAA,yCACD,oBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,OAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"BillingProvider.d.mts","names":[],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"mappings":";;;;;cAMa,sBAAA,EAEQ,OAAA,CAFc,OAAA;;QAE3B,aAAA;AAAA;AAAA,iBAMQ,eAAA,CAAA;EACd,QAAA;EACA,MAAA;EACA,QAAA;EACA;AAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,aAAA;AAAA,yCACD,QAAA,CAF0B,OAAA,CAE1B,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA,wBAAA,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -17,7 +17,7 @@ declare function BillingProvider({
17
17
  loader?: React.ReactNode;
18
18
  planPage: React.ReactNode;
19
19
  skipPlanCheck?: boolean;
20
- }): string | number | bigint | boolean | _$react_jsx_runtime0.JSX.Element | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | null | undefined;
20
+ }): string | number | bigint | boolean | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> | _$react_jsx_runtime0.JSX.Element | null | undefined;
21
21
  //#endregion
22
22
  export { BillingProvider, billingProviderContext };
23
23
  //# sourceMappingURL=BillingProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BillingProvider.d.ts","names":[],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"mappings":";;;;;cAMa,sBAAA,EAEQ,OAAA,CAFc,OAAA;;QAE3B,aAAA;AAAA;AAAA,iBAMQ,eAAA,CAAA;EACd,QAAA;EACA,MAAA;EACA,QAAA;EACA;AAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,aAAA;AAAA,yCACD,oBAAA,CAAA,GAAA,CAAA,OAAA,GAAA,QAAA,CAAA,OAAA,CAAA,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA"}
1
+ {"version":3,"file":"BillingProvider.d.ts","names":[],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"mappings":";;;;;cAMa,sBAAA,EAEQ,OAAA,CAFc,OAAA;;QAE3B,aAAA;AAAA;AAAA,iBAMQ,eAAA,CAAA;EACd,QAAA;EACA,MAAA;EACA,QAAA;EACA;AAAA;EAEA,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,MAAA,GAAS,KAAA,CAAM,SAAA;EACf,QAAA,EAAU,KAAA,CAAM,SAAA;EAChB,aAAA;AAAA,yCACD,QAAA,CAF0B,OAAA,CAE1B,SAAA,IAAA,OAAA,sCAAA,OAAA,CAAA,WAAA,GAAA,OAAA,CAAA,YAAA,mBAAA,OAAA,CAAA,qBAAA,SAAA,QAAA,CAAA,OAAA,CAAA,SAAA,wBAAA,oBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppTrpc = require("../../app/hooks/useAppTrpc.js");
3
4
  let react = require("react");
4
5
  let react_jsx_runtime = require("react/jsx-runtime");
@@ -1 +1 @@
1
- {"version":3,"file":"BillingProvider.js","names":["useAppTRPC"],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport type { BillingSchema } from \"@m5kdev/commons/modules/billing/billing.schema\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { createContext } from \"react\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\n\r\nexport const billingProviderContext = createContext<{\r\n isLoading: boolean;\r\n data: BillingSchema | null;\r\n}>({\r\n isLoading: true,\r\n data: null,\r\n});\r\n\r\nexport function BillingProvider({\r\n children,\r\n loader,\r\n planPage,\r\n skipPlanCheck = false,\r\n}: {\r\n children: React.ReactNode;\r\n loader?: React.ReactNode;\r\n planPage: React.ReactNode;\r\n skipPlanCheck?: boolean;\r\n}) {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n\r\n const { data: activeSubscription, isLoading } = useQuery(\r\n trpc.billing.getActiveSubscription.queryOptions(undefined, {\r\n staleTime: 1000 * 60 * 60 * 4, // 4 hours\r\n enabled: !skipPlanCheck,\r\n })\r\n );\r\n\r\n if (skipPlanCheck) {\r\n return (\r\n <billingProviderContext.Provider value={{ isLoading: false, data: null }}>\r\n {children}\r\n </billingProviderContext.Provider>\r\n );\r\n }\r\n\r\n // Show loading screen while checking subscription status\r\n if (isLoading) {\r\n return loader ? loader : \"Loading...\";\r\n }\r\n\r\n if (!activeSubscription) {\r\n return planPage;\r\n }\r\n\r\n return (\r\n <billingProviderContext.Provider value={{ isLoading, data: activeSubscription ?? null }}>\r\n {children}\r\n </billingProviderContext.Provider>\r\n );\r\n}\r\n"],"mappings":";;;;;;AAMA,MAAa,0BAAA,GAAA,MAAA,eAGV;CACD,WAAW;CACX,MAAM;CACP,CAAC;AAEF,SAAgB,gBAAgB,EAC9B,UACA,QACA,UACA,gBAAgB,SAMf;CAGD,MAAM,EAAE,MAAM,oBAAoB,eAAA,GAAA,sBAAA,UAFrBA,yCAAAA,YAA+B,CAGrC,QAAQ,sBAAsB,aAAa,KAAA,GAAW;EACzD,WAAW,MAAO,KAAK,KAAK;EAC5B,SAAS,CAAC;EACX,CAAC,CACH;AAED,KAAI,cACF,QACE,iBAAA,GAAA,kBAAA,KAAC,uBAAuB,UAAxB;EAAiC,OAAO;GAAE,WAAW;GAAO,MAAM;GAAM;EACrE;EAC+B,CAAA;AAKtC,KAAI,UACF,QAAO,SAAS,SAAS;AAG3B,KAAI,CAAC,mBACH,QAAO;AAGT,QACE,iBAAA,GAAA,kBAAA,KAAC,uBAAuB,UAAxB;EAAiC,OAAO;GAAE;GAAW,MAAM,sBAAsB;GAAM;EACpF;EAC+B,CAAA"}
1
+ {"version":3,"file":"BillingProvider.js","names":["useAppTRPC"],"sources":["../../../../../src/modules/billing/components/BillingProvider.tsx"],"sourcesContent":["import type { BackendTRPCRouter } from \"@m5kdev/backend/types\";\r\nimport type { BillingSchema } from \"@m5kdev/commons/modules/billing/billing.schema\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { createContext } from \"react\";\r\nimport { useAppTRPC } from \"../../app/hooks/useAppTrpc\";\r\n\r\nexport const billingProviderContext = createContext<{\r\n isLoading: boolean;\r\n data: BillingSchema | null;\r\n}>({\r\n isLoading: true,\r\n data: null,\r\n});\r\n\r\nexport function BillingProvider({\r\n children,\r\n loader,\r\n planPage,\r\n skipPlanCheck = false,\r\n}: {\r\n children: React.ReactNode;\r\n loader?: React.ReactNode;\r\n planPage: React.ReactNode;\r\n skipPlanCheck?: boolean;\r\n}) {\r\n const trpc = useAppTRPC<BackendTRPCRouter>();\r\n\r\n const { data: activeSubscription, isLoading } = useQuery(\r\n trpc.billing.getActiveSubscription.queryOptions(undefined, {\r\n staleTime: 1000 * 60 * 60 * 4, // 4 hours\r\n enabled: !skipPlanCheck,\r\n })\r\n );\r\n\r\n if (skipPlanCheck) {\r\n return (\r\n <billingProviderContext.Provider value={{ isLoading: false, data: null }}>\r\n {children}\r\n </billingProviderContext.Provider>\r\n );\r\n }\r\n\r\n // Show loading screen while checking subscription status\r\n if (isLoading) {\r\n return loader ? loader : \"Loading...\";\r\n }\r\n\r\n if (!activeSubscription) {\r\n return planPage;\r\n }\r\n\r\n return (\r\n <billingProviderContext.Provider value={{ isLoading, data: activeSubscription ?? null }}>\r\n {children}\r\n </billingProviderContext.Provider>\r\n );\r\n}\r\n"],"mappings":";;;;;;;AAMA,MAAa,0BAAA,GAAA,MAAA,eAGV;CACD,WAAW;CACX,MAAM;CACP,CAAC;AAEF,SAAgB,gBAAgB,EAC9B,UACA,QACA,UACA,gBAAgB,SAMf;CAGD,MAAM,EAAE,MAAM,oBAAoB,eAAA,GAAA,sBAAA,UAFrBA,yCAAAA,YAA+B,CAGrC,QAAQ,sBAAsB,aAAa,KAAA,GAAW;EACzD,WAAW,MAAO,KAAK,KAAK;EAC5B,SAAS,CAAC;EACX,CAAC,CACH;AAED,KAAI,cACF,QACE,iBAAA,GAAA,kBAAA,KAAC,uBAAuB,UAAxB;EAAiC,OAAO;GAAE,WAAW;GAAO,MAAM;GAAM;EACrE;EAC+B,CAAA;AAKtC,KAAI,UACF,QAAO,SAAS,SAAS;AAG3B,KAAI,CAAC,mBACH,QAAO;AAGT,QACE,iBAAA,GAAA,kBAAA,KAAC,uBAAuB,UAAxB;EAAiC,OAAO;GAAE;GAAW,MAAM,sBAAsB;GAAM;EACpF;EAC+B,CAAA"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_billing_components_BillingProvider = require("../components/BillingProvider.js");
3
4
  let react = require("react");
4
5
  //#region src/modules/billing/hooks/useSubscription.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useSubscription.js","names":["billingProviderContext"],"sources":["../../../../../src/modules/billing/hooks/useSubscription.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { billingProviderContext } from \"../components/BillingProvider\";\r\n\r\nexport function useSubscription() {\r\n return useContext(billingProviderContext);\r\n}\r\n"],"mappings":";;;;AAGA,SAAgB,kBAAkB;AAChC,SAAA,GAAA,MAAA,YAAkBA,uDAAAA,uBAAuB"}
1
+ {"version":3,"file":"useSubscription.js","names":["billingProviderContext"],"sources":["../../../../../src/modules/billing/hooks/useSubscription.ts"],"sourcesContent":["import { useContext } from \"react\";\r\nimport { billingProviderContext } from \"../components/BillingProvider\";\r\n\r\nexport function useSubscription() {\r\n return useContext(billingProviderContext);\r\n}\r\n"],"mappings":";;;;;AAGA,SAAgB,kBAAkB;AAChC,SAAA,GAAA,MAAA,YAAkBA,uDAAAA,uBAAuB"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppConfig = require("../../app/hooks/useAppConfig.js");
3
4
  let _tanstack_react_query = require("@tanstack/react-query");
4
5
  //#region src/modules/file/hooks/useS3DownloadUrl.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useS3DownloadUrl.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useS3DownloadUrl.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\n\r\nexport async function fetchS3DownloadUrl(filePath: string, serverUrl?: string) {\r\n if (!serverUrl) {\r\n throw new Error(\"fetchS3DownloadUrl requires a serverUrl. In React, use useS3DownloadUrl.\");\r\n }\r\n\r\n const res = await fetch(`${serverUrl}/upload/files/${filePath}`);\r\n if (!res.ok) throw new Error(\"Failed to get download URL\");\r\n return (await res.json()).url as string;\r\n}\r\n\r\nexport function useS3DownloadUrl(filePath: string, serverUrlOverride?: string) {\r\n const { serverUrl } = useAppConfig();\r\n const resolvedServerUrl = serverUrlOverride ?? serverUrl;\r\n\r\n return useQuery<string, Error>({\r\n queryKey: [\"s3DownloadUrl\", resolvedServerUrl, filePath],\r\n queryFn: () => fetchS3DownloadUrl(filePath, resolvedServerUrl),\r\n enabled: Boolean(filePath),\r\n });\r\n}\r\n"],"mappings":";;;;AAGA,eAAsB,mBAAmB,UAAkB,WAAoB;AAC7E,KAAI,CAAC,UACH,OAAM,IAAI,MAAM,2EAA2E;CAG7F,MAAM,MAAM,MAAM,MAAM,GAAG,UAAU,gBAAgB,WAAW;AAChE,KAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,6BAA6B;AAC1D,SAAQ,MAAM,IAAI,MAAM,EAAE;;AAG5B,SAAgB,iBAAiB,UAAkB,mBAA4B;CAC7E,MAAM,EAAE,cAAcA,2CAAAA,cAAc;CACpC,MAAM,oBAAoB,qBAAqB;AAE/C,SAAA,GAAA,sBAAA,UAA+B;EAC7B,UAAU;GAAC;GAAiB;GAAmB;GAAS;EACxD,eAAe,mBAAmB,UAAU,kBAAkB;EAC9D,SAAS,QAAQ,SAAS;EAC3B,CAAC"}
1
+ {"version":3,"file":"useS3DownloadUrl.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useS3DownloadUrl.ts"],"sourcesContent":["import { useQuery } from \"@tanstack/react-query\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\n\r\nexport async function fetchS3DownloadUrl(filePath: string, serverUrl?: string) {\r\n if (!serverUrl) {\r\n throw new Error(\"fetchS3DownloadUrl requires a serverUrl. In React, use useS3DownloadUrl.\");\r\n }\r\n\r\n const res = await fetch(`${serverUrl}/upload/files/${filePath}`);\r\n if (!res.ok) throw new Error(\"Failed to get download URL\");\r\n return (await res.json()).url as string;\r\n}\r\n\r\nexport function useS3DownloadUrl(filePath: string, serverUrlOverride?: string) {\r\n const { serverUrl } = useAppConfig();\r\n const resolvedServerUrl = serverUrlOverride ?? serverUrl;\r\n\r\n return useQuery<string, Error>({\r\n queryKey: [\"s3DownloadUrl\", resolvedServerUrl, filePath],\r\n queryFn: () => fetchS3DownloadUrl(filePath, resolvedServerUrl),\r\n enabled: Boolean(filePath),\r\n });\r\n}\r\n"],"mappings":";;;;;AAGA,eAAsB,mBAAmB,UAAkB,WAAoB;AAC7E,KAAI,CAAC,UACH,OAAM,IAAI,MAAM,2EAA2E;CAG7F,MAAM,MAAM,MAAM,MAAM,GAAG,UAAU,gBAAgB,WAAW;AAChE,KAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,6BAA6B;AAC1D,SAAQ,MAAM,IAAI,MAAM,EAAE;;AAG5B,SAAgB,iBAAiB,UAAkB,mBAA4B;CAC7E,MAAM,EAAE,cAAcA,2CAAAA,cAAc;CACpC,MAAM,oBAAoB,qBAAqB;AAE/C,SAAA,GAAA,sBAAA,UAA+B;EAC7B,UAAU;GAAC;GAAiB;GAAmB;GAAS;EACxD,eAAe,mBAAmB,UAAU,kBAAkB;EAC9D,SAAS,QAAQ,SAAS;EAC3B,CAAC"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppConfig = require("../../app/hooks/useAppConfig.js");
3
4
  let react = require("react");
4
5
  //#region src/modules/file/hooks/useS3Upload.ts
@@ -1 +1 @@
1
- {"version":3,"file":"useS3Upload.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useS3Upload.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\n\r\nexport type S3UploadStatus = \"idle\" | \"uploading\" | \"success\" | \"error\";\r\n\r\nexport type UploadBlobInput =\r\n | Blob\r\n | {\r\n uri: string;\r\n name?: string;\r\n type?: string;\r\n size?: number;\r\n };\r\n\r\nexport type ResolvedUploadBlob = {\r\n blob: Blob;\r\n name: string;\r\n type: string;\r\n size: number;\r\n};\r\n\r\nasync function getPresignedUrl(\r\n filename: string,\r\n filetype: string,\r\n serverUrl: string\r\n): Promise<string> {\r\n const res = await fetch(`${serverUrl}/upload/s3-presigned-url`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ filename, filetype }),\r\n });\r\n if (!res.ok) throw new Error(\"Failed to get presigned URL\");\r\n const data = (await res.json()) as { url: string };\r\n return data.url;\r\n}\r\n\r\nfunction isBlobInput(file: UploadBlobInput): file is Blob {\r\n return typeof Blob !== \"undefined\" && file instanceof Blob;\r\n}\r\n\r\nfunction getInputName(file: UploadBlobInput) {\r\n if (!isBlobInput(file)) {\r\n return file.name ?? `upload-${Date.now()}`;\r\n }\r\n\r\n return \"name\" in file && typeof file.name === \"string\" ? file.name : `upload-${Date.now()}`;\r\n}\r\n\r\nfunction getInputType(file: UploadBlobInput, blob: Blob) {\r\n if (!isBlobInput(file)) {\r\n return file.type ?? blob.type ?? \"application/octet-stream\";\r\n }\r\n\r\n return file.type || \"application/octet-stream\";\r\n}\r\n\r\nexport async function resolveUploadBlob(file: UploadBlobInput): Promise<ResolvedUploadBlob> {\r\n const blob = isBlobInput(file) ? file : await fetch(file.uri).then((response) => response.blob());\r\n return {\r\n blob,\r\n name: getInputName(file),\r\n type: getInputType(file, blob),\r\n size: \"size\" in file && typeof file.size === \"number\" ? file.size : blob.size,\r\n };\r\n}\r\n\r\nfunction createUploadId() {\r\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2, 11);\r\n}\r\n\r\nexport function useS3Upload(serverUrlOverride?: string) {\r\n const { serverUrl } = useAppConfig();\r\n const resolvedServerUrl = serverUrlOverride ?? serverUrl;\r\n const [progress, setProgress] = useState<number>(0);\r\n const [status, setStatus] = useState<S3UploadStatus>(\"idle\");\r\n const [error, setError] = useState<string | null>(null);\r\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(null);\r\n\r\n const upload = useCallback(\r\n async (file: UploadBlobInput, prefix?: string) => {\r\n setProgress(0);\r\n setStatus(\"uploading\");\r\n setError(null);\r\n setUploadedUrl(null);\r\n try {\r\n const resolvedFile = await resolveUploadBlob(file);\r\n const originalFilename = resolvedFile.name;\r\n const extension = originalFilename.split(\".\").pop() || \"\";\r\n const uuid = createUploadId();\r\n const filename = prefix\r\n ? `${prefix}/${uuid}${extension ? `.${extension}` : \"\"}`\r\n : `${uuid}${extension ? `.${extension}` : \"\"}`;\r\n const filetype = resolvedFile.type;\r\n const presignedUrl = await getPresignedUrl(filename, filetype, resolvedServerUrl);\r\n\r\n return await new Promise<string>((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"PUT\", presignedUrl);\r\n xhr.setRequestHeader(\"Content-Type\", filetype);\r\n\r\n xhr.upload.onprogress = (event) => {\r\n if (event.lengthComputable) {\r\n setProgress(Math.round((event.loaded * 100) / event.total));\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n setProgress(100);\r\n setStatus(\"success\");\r\n // Remove query params to get the public URL\r\n setUploadedUrl(presignedUrl.split(\"?\")[0]);\r\n resolve(filename);\r\n } else {\r\n setStatus(\"error\");\r\n setError(`Upload failed with status ${xhr.status}`);\r\n reject(new Error(`Upload failed with status ${xhr.status}`));\r\n }\r\n };\r\n\r\n xhr.onerror = () => {\r\n setStatus(\"error\");\r\n setError(\"Network error during upload\");\r\n reject(new Error(\"Network error during upload\"));\r\n };\r\n\r\n xhr.send(resolvedFile.blob);\r\n });\r\n } catch (err: unknown) {\r\n setStatus(\"error\");\r\n setError(err instanceof Error ? err.message : \"Unknown error\");\r\n return Promise.reject(err);\r\n }\r\n },\r\n [resolvedServerUrl]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setProgress(0);\r\n setStatus(\"idle\");\r\n setError(null);\r\n setUploadedUrl(null);\r\n }, []);\r\n\r\n return { upload, progress, status, error, uploadedUrl, reset };\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"useS3Upload.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useS3Upload.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\n\r\nexport type S3UploadStatus = \"idle\" | \"uploading\" | \"success\" | \"error\";\r\n\r\nexport type UploadBlobInput =\r\n | Blob\r\n | {\r\n uri: string;\r\n name?: string;\r\n type?: string;\r\n size?: number;\r\n };\r\n\r\nexport type ResolvedUploadBlob = {\r\n blob: Blob;\r\n name: string;\r\n type: string;\r\n size: number;\r\n};\r\n\r\nasync function getPresignedUrl(\r\n filename: string,\r\n filetype: string,\r\n serverUrl: string\r\n): Promise<string> {\r\n const res = await fetch(`${serverUrl}/upload/s3-presigned-url`, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\" },\r\n body: JSON.stringify({ filename, filetype }),\r\n });\r\n if (!res.ok) throw new Error(\"Failed to get presigned URL\");\r\n const data = (await res.json()) as { url: string };\r\n return data.url;\r\n}\r\n\r\nfunction isBlobInput(file: UploadBlobInput): file is Blob {\r\n return typeof Blob !== \"undefined\" && file instanceof Blob;\r\n}\r\n\r\nfunction getInputName(file: UploadBlobInput) {\r\n if (!isBlobInput(file)) {\r\n return file.name ?? `upload-${Date.now()}`;\r\n }\r\n\r\n return \"name\" in file && typeof file.name === \"string\" ? file.name : `upload-${Date.now()}`;\r\n}\r\n\r\nfunction getInputType(file: UploadBlobInput, blob: Blob) {\r\n if (!isBlobInput(file)) {\r\n return file.type ?? blob.type ?? \"application/octet-stream\";\r\n }\r\n\r\n return file.type || \"application/octet-stream\";\r\n}\r\n\r\nexport async function resolveUploadBlob(file: UploadBlobInput): Promise<ResolvedUploadBlob> {\r\n const blob = isBlobInput(file) ? file : await fetch(file.uri).then((response) => response.blob());\r\n return {\r\n blob,\r\n name: getInputName(file),\r\n type: getInputType(file, blob),\r\n size: \"size\" in file && typeof file.size === \"number\" ? file.size : blob.size,\r\n };\r\n}\r\n\r\nfunction createUploadId() {\r\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2, 11);\r\n}\r\n\r\nexport function useS3Upload(serverUrlOverride?: string) {\r\n const { serverUrl } = useAppConfig();\r\n const resolvedServerUrl = serverUrlOverride ?? serverUrl;\r\n const [progress, setProgress] = useState<number>(0);\r\n const [status, setStatus] = useState<S3UploadStatus>(\"idle\");\r\n const [error, setError] = useState<string | null>(null);\r\n const [uploadedUrl, setUploadedUrl] = useState<string | null>(null);\r\n\r\n const upload = useCallback(\r\n async (file: UploadBlobInput, prefix?: string) => {\r\n setProgress(0);\r\n setStatus(\"uploading\");\r\n setError(null);\r\n setUploadedUrl(null);\r\n try {\r\n const resolvedFile = await resolveUploadBlob(file);\r\n const originalFilename = resolvedFile.name;\r\n const extension = originalFilename.split(\".\").pop() || \"\";\r\n const uuid = createUploadId();\r\n const filename = prefix\r\n ? `${prefix}/${uuid}${extension ? `.${extension}` : \"\"}`\r\n : `${uuid}${extension ? `.${extension}` : \"\"}`;\r\n const filetype = resolvedFile.type;\r\n const presignedUrl = await getPresignedUrl(filename, filetype, resolvedServerUrl);\r\n\r\n return await new Promise<string>((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(\"PUT\", presignedUrl);\r\n xhr.setRequestHeader(\"Content-Type\", filetype);\r\n\r\n xhr.upload.onprogress = (event) => {\r\n if (event.lengthComputable) {\r\n setProgress(Math.round((event.loaded * 100) / event.total));\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n setProgress(100);\r\n setStatus(\"success\");\r\n // Remove query params to get the public URL\r\n setUploadedUrl(presignedUrl.split(\"?\")[0]);\r\n resolve(filename);\r\n } else {\r\n setStatus(\"error\");\r\n setError(`Upload failed with status ${xhr.status}`);\r\n reject(new Error(`Upload failed with status ${xhr.status}`));\r\n }\r\n };\r\n\r\n xhr.onerror = () => {\r\n setStatus(\"error\");\r\n setError(\"Network error during upload\");\r\n reject(new Error(\"Network error during upload\"));\r\n };\r\n\r\n xhr.send(resolvedFile.blob);\r\n });\r\n } catch (err: unknown) {\r\n setStatus(\"error\");\r\n setError(err instanceof Error ? err.message : \"Unknown error\");\r\n return Promise.reject(err);\r\n }\r\n },\r\n [resolvedServerUrl]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setProgress(0);\r\n setStatus(\"idle\");\r\n setError(null);\r\n setUploadedUrl(null);\r\n }, []);\r\n\r\n return { upload, progress, status, error, uploadedUrl, reset };\r\n}\r\n"],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ require("../../../../_virtual/_rolldown/runtime.js");
2
3
  const require_src_modules_app_hooks_useAppConfig = require("../../app/hooks/useAppConfig.js");
3
4
  const require_src_modules_file_hooks_useS3Upload = require("./useS3Upload.js");
4
5
  let react = require("react");