@m5kdev/frontend 0.21.7 → 0.23.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.
- package/dist/_virtual/_rolldown/runtime.js +23 -0
- package/dist/src/modules/app/components/AppConfigProvider.d.mts +2 -0
- package/dist/src/modules/app/components/AppConfigProvider.d.mts.map +1 -1
- package/dist/src/modules/app/components/AppConfigProvider.d.ts +2 -0
- package/dist/src/modules/app/components/AppConfigProvider.d.ts.map +1 -1
- package/dist/src/modules/app/components/AppConfigProvider.js +1 -0
- package/dist/src/modules/app/components/AppConfigProvider.js.map +1 -1
- package/dist/src/modules/app/components/AppConfigProvider.mjs.map +1 -1
- package/dist/src/modules/app/components/AppTrpcQueryProvider.js +1 -0
- package/dist/src/modules/app/components/AppTrpcQueryProvider.js.map +1 -1
- package/dist/src/modules/app/hooks/useAppConfig.d.mts +3 -0
- package/dist/src/modules/app/hooks/useAppConfig.d.mts.map +1 -1
- package/dist/src/modules/app/hooks/useAppConfig.d.ts +3 -0
- package/dist/src/modules/app/hooks/useAppConfig.d.ts.map +1 -1
- package/dist/src/modules/app/hooks/useAppConfig.js +1 -0
- package/dist/src/modules/app/hooks/useAppConfig.js.map +1 -1
- package/dist/src/modules/app/utils/locale.d.mts +8 -0
- package/dist/src/modules/app/utils/locale.d.mts.map +1 -0
- package/dist/src/modules/app/utils/locale.d.ts +8 -0
- package/dist/src/modules/app/utils/locale.d.ts.map +1 -0
- package/dist/src/modules/app/utils/locale.js +20 -0
- package/dist/src/modules/app/utils/locale.js.map +1 -0
- package/dist/src/modules/app/utils/locale.mjs +16 -0
- package/dist/src/modules/app/utils/locale.mjs.map +1 -0
- package/dist/src/modules/auth/auth.client.d.mts +1643 -102
- package/dist/src/modules/auth/auth.client.d.mts.map +1 -1
- package/dist/src/modules/auth/auth.client.d.ts +1643 -102
- package/dist/src/modules/auth/auth.client.d.ts.map +1 -1
- package/dist/src/modules/auth/auth.client.js +7 -3
- package/dist/src/modules/auth/auth.client.js.map +1 -1
- package/dist/src/modules/auth/auth.client.mjs +6 -3
- package/dist/src/modules/auth/auth.client.mjs.map +1 -1
- package/dist/src/modules/auth/auth.context.js +1 -0
- package/dist/src/modules/auth/auth.context.js.map +1 -1
- package/dist/src/modules/auth/auth.lib.d.mts +4 -2103
- package/dist/src/modules/auth/auth.lib.d.mts.map +1 -1
- package/dist/src/modules/auth/auth.lib.d.ts +4 -2103
- package/dist/src/modules/auth/auth.lib.d.ts.map +1 -1
- package/dist/src/modules/auth/auth.lib.js.map +1 -1
- package/dist/src/modules/auth/auth.lib.mjs.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.d.mts +1 -1
- package/dist/src/modules/auth/components/AuthProvider.d.mts.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.d.ts +1 -1
- package/dist/src/modules/auth/components/AuthProvider.d.ts.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.js +4 -0
- package/dist/src/modules/auth/components/AuthProvider.js.map +1 -1
- package/dist/src/modules/auth/components/AuthProvider.mjs +3 -0
- package/dist/src/modules/auth/components/AuthProvider.mjs.map +1 -1
- package/dist/src/modules/auth/hooks/useAuth.js +1 -0
- package/dist/src/modules/auth/hooks/useAuth.js.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthAdmin.d.mts +10 -1
- package/dist/src/modules/auth/hooks/useAuthAdmin.d.mts.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthAdmin.d.ts +10 -1
- package/dist/src/modules/auth/hooks/useAuthAdmin.d.ts.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthAdmin.js +1 -0
- package/dist/src/modules/auth/hooks/useAuthAdmin.js.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthClient.d.mts +2 -702
- package/dist/src/modules/auth/hooks/useAuthClient.d.mts.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthClient.d.ts +2 -702
- package/dist/src/modules/auth/hooks/useAuthClient.d.ts.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthClient.js +1 -0
- package/dist/src/modules/auth/hooks/useAuthClient.js.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthClient.mjs.map +1 -1
- package/dist/src/modules/auth/hooks/useAuthLocale.d.mts +23 -0
- package/dist/src/modules/auth/hooks/useAuthLocale.d.mts.map +1 -0
- package/dist/src/modules/auth/hooks/useAuthLocale.d.ts +23 -0
- package/dist/src/modules/auth/hooks/useAuthLocale.d.ts.map +1 -0
- package/dist/src/modules/auth/hooks/useAuthLocale.js +25 -0
- package/dist/src/modules/auth/hooks/useAuthLocale.js.map +1 -0
- package/dist/src/modules/auth/hooks/useAuthLocale.mjs +23 -0
- package/dist/src/modules/auth/hooks/useAuthLocale.mjs.map +1 -0
- package/dist/src/modules/auth/hooks/useMemberInvite.js +1 -0
- package/dist/src/modules/auth/hooks/useMemberInvite.js.map +1 -1
- package/dist/src/modules/auth/hooks/useOrganizationAccess.d.mts +1 -1
- package/dist/src/modules/auth/hooks/useOrganizationAccess.d.ts +1 -1
- package/dist/src/modules/auth/hooks/useOrganizationAccess.js +1 -0
- package/dist/src/modules/auth/hooks/useOrganizationAccess.js.map +1 -1
- package/dist/src/modules/auth/hooks/useSession.js +1 -0
- package/dist/src/modules/auth/hooks/useSession.js.map +1 -1
- package/dist/src/modules/auth/hooks/useUserOrganizations.d.mts +1 -0
- package/dist/src/modules/auth/hooks/useUserOrganizations.d.ts +1 -0
- package/dist/src/modules/auth/hooks/useUserOrganizations.js +1 -0
- package/dist/src/modules/auth/hooks/useUserOrganizations.js.map +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.mts +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.mts.map +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.ts +1 -1
- package/dist/src/modules/billing/components/BillingProvider.d.ts.map +1 -1
- package/dist/src/modules/billing/components/BillingProvider.js +1 -0
- package/dist/src/modules/billing/components/BillingProvider.js.map +1 -1
- package/dist/src/modules/billing/hooks/useSubscription.js +1 -0
- package/dist/src/modules/billing/hooks/useSubscription.js.map +1 -1
- package/dist/src/modules/file/hooks/useS3DownloadUrl.js +1 -0
- package/dist/src/modules/file/hooks/useS3DownloadUrl.js.map +1 -1
- package/dist/src/modules/file/hooks/useS3Upload.js +1 -0
- package/dist/src/modules/file/hooks/useS3Upload.js.map +1 -1
- package/dist/src/modules/file/hooks/useUpload.js +1 -0
- package/dist/src/modules/file/hooks/useUpload.js.map +1 -1
- package/dist/src/modules/table/hooks/useQueryWithParams.js +1 -0
- package/dist/src/modules/table/hooks/useQueryWithParams.js.map +1 -1
- package/dist/src/modules/table/hooks/useTableQueryParams.js +1 -0
- package/dist/src/modules/table/hooks/useTableQueryParams.js.map +1 -1
- package/dist/src/modules/table/queryParams.js +1 -0
- package/dist/src/modules/table/queryParams.js.map +1 -1
- package/dist/src/utils/date.js +1 -0
- package/dist/src/utils/date.js.map +1 -1
- package/package.json +17 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useAuthClient.d.ts","names":[],"sources":["../../../../../src/modules/auth/hooks/useAuthClient.ts"],"mappings":"
|
|
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":"
|
|
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":";;;;
|
|
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,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_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");
|
|
@@ -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":"
|
|
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"}
|
|
@@ -9,7 +9,7 @@ declare function useOrganizationAccess({
|
|
|
9
9
|
managerRoles,
|
|
10
10
|
onInvalidateScopedQueries
|
|
11
11
|
}: UseOrganizationAccessProps): {
|
|
12
|
-
activeOrganizationId:
|
|
12
|
+
activeOrganizationId: string;
|
|
13
13
|
activeOrganizationRole: string;
|
|
14
14
|
canManageOrganization: boolean;
|
|
15
15
|
refreshOrganizationQueries: () => Promise<void>;
|
|
@@ -9,7 +9,7 @@ declare function useOrganizationAccess({
|
|
|
9
9
|
managerRoles,
|
|
10
10
|
onInvalidateScopedQueries
|
|
11
11
|
}: UseOrganizationAccessProps): {
|
|
12
|
-
activeOrganizationId:
|
|
12
|
+
activeOrganizationId: string;
|
|
13
13
|
activeOrganizationRole: string;
|
|
14
14
|
canManageOrganization: boolean;
|
|
15
15
|
refreshOrganizationQueries: () => Promise<void>;
|
|
@@ -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_hooks_useSession = require("./useSession.js");
|
|
3
4
|
let react = require("react");
|
|
4
5
|
let _tanstack_react_query = require("@tanstack/react-query");
|
|
@@ -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":"
|
|
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,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":"
|
|
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,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":"
|
|
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 | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> |
|
|
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;
|
|
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,QAAA,
|
|
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"}
|
|
@@ -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 | Iterable<_$react.ReactNode> | Promise<string | number | bigint | boolean | _$react.ReactPortal | _$react.ReactElement<unknown, string | _$react.JSXElementConstructor<any>> | Iterable<_$react.ReactNode> | null | undefined> |
|
|
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;
|
|
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,QAAA,
|
|
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,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":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUpload.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useUpload.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\nimport { resolveUploadBlob, type UploadBlobInput } from \"./useS3Upload\";\r\n\r\nexport type UploadStatus = \"pending\" | \"uploading\" | \"completed\" | \"error\";\r\n\r\nexport interface UploadFileTask {\r\n id: string;\r\n file: UploadBlobInput;\r\n progress: number;\r\n status: UploadStatus;\r\n errorMessage?: string;\r\n bytesUploaded: number;\r\n totalBytes: number;\r\n}\r\n\r\ninterface UploadCallbacks {\r\n onProgress: (progress: number, bytesUploaded: number) => void;\r\n onComplete: () => void;\r\n onError: (error: string) => void;\r\n}\r\n\r\n// Shared utility function to create upload promise\r\nconst createUploadPromise = <T>(\r\n type: string,\r\n file: UploadBlobInput,\r\n callbacks: UploadCallbacks,\r\n serverUrl: string\r\n): Promise<T> => {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n\r\n xhr.upload.onprogress = (event: ProgressEvent<EventTarget>) => {\r\n if (event.lengthComputable) {\r\n const progress = Math.round((event.loaded * 100) / event.total);\r\n callbacks.onProgress(progress, event.loaded);\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status === 200) {\r\n callbacks.onComplete();\r\n // if response has json header, parse it\r\n if (xhr.getResponseHeader(\"Content-Type\")?.includes(\"application/json\")) {\r\n resolve(JSON.parse(xhr.response) as T);\r\n } else {\r\n resolve(xhr.response as T);\r\n }\r\n } else {\r\n const errorMessage = `Upload failed with status ${xhr.status}`;\r\n callbacks.onError(errorMessage);\r\n reject(new Error(errorMessage));\r\n }\r\n };\r\n\r\n xhr.onerror = () => {\r\n const errorMessage = \"Network error during upload\";\r\n callbacks.onError(errorMessage);\r\n reject(new Error(errorMessage));\r\n };\r\n\r\n xhr.open(\"POST\", `${serverUrl}/upload/file/${type}`);\r\n const formData = new FormData();\r\n resolveUploadBlob(file)\r\n .then(({ blob, name }) => {\r\n formData.append(\"file\", blob, name);\r\n xhr.send(formData);\r\n })\r\n .catch(reject);\r\n });\r\n};\r\n\r\n// Shared utility to create a task\r\nconst createUploadTask = (file: UploadBlobInput): UploadFileTask => ({\r\n id:\r\n typeof crypto !== \"undefined\" && crypto.randomUUID\r\n ? crypto.randomUUID()\r\n : Math.random().toString(36).substr(2, 9),\r\n file,\r\n progress: 0,\r\n status: \"pending\",\r\n bytesUploaded: 0,\r\n totalBytes: \"size\" in file && typeof file.size === \"number\" ? file.size : 0,\r\n});\r\n\r\n// Hook for single file upload\r\nexport function useFileUpload() {\r\n const { serverUrl } = useAppConfig();\r\n const [uploadTask, setUploadTask] = useState<UploadFileTask | null>(null);\r\n\r\n const upload = useCallback(\r\n async <T>(type: string, file: UploadBlobInput): Promise<T> => {\r\n const task = createUploadTask(file);\r\n setUploadTask(task);\r\n\r\n const callbacks: UploadCallbacks = {\r\n onProgress: (progress, bytesUploaded) => {\r\n setUploadTask((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n progress,\r\n bytesUploaded,\r\n status: \"uploading\",\r\n }\r\n : null\r\n );\r\n },\r\n onComplete: () => {\r\n setUploadTask((prev) => (prev ? { ...prev, status: \"completed\", progress: 100 } : null));\r\n },\r\n onError: (errorMessage) => {\r\n setUploadTask((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n status: \"error\",\r\n errorMessage,\r\n progress: 0,\r\n }\r\n : null\r\n );\r\n },\r\n };\r\n\r\n return createUploadPromise<T>(type, file, callbacks, serverUrl);\r\n },\r\n [serverUrl]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setUploadTask(null);\r\n }, []);\r\n\r\n return {\r\n ...uploadTask,\r\n upload,\r\n reset,\r\n };\r\n}\r\n\r\n// Hook for multiple file uploads\r\nexport function useMultipartUpload() {\r\n const { serverUrl } = useAppConfig();\r\n const [uploadQueue, setUploadQueue] = useState<UploadFileTask[]>([]);\r\n const [overallProgress, setOverallProgress] = useState<number>(0);\r\n\r\n const updateTask = useCallback((id: string, changes: Partial<UploadFileTask>) => {\r\n setUploadQueue((prev) => prev.map((task) => (task.id === id ? { ...task, ...changes } : task)));\r\n }, []);\r\n\r\n const updateOverallProgress = useCallback((queue: UploadFileTask[]) => {\r\n if (queue.length === 0) {\r\n setOverallProgress(100);\r\n return;\r\n }\r\n const totalBytes = queue.reduce((sum, task) => sum + task.totalBytes, 0);\r\n const uploadedBytes = queue.reduce((sum, task) => {\r\n if (task.status === \"completed\") {\r\n return sum + task.totalBytes;\r\n }\r\n if (task.status === \"uploading\") {\r\n return sum + (task.progress / 100) * task.totalBytes;\r\n }\r\n return sum;\r\n }, 0);\r\n setOverallProgress(totalBytes > 0 ? Math.floor((uploadedBytes / totalBytes) * 100) : 0);\r\n }, []);\r\n\r\n const uploadSingleFile = useCallback(\r\n async <T>(type: string, task: UploadFileTask): Promise<T> => {\r\n const callbacks: UploadCallbacks = {\r\n onProgress: (progress, bytesUploaded) => {\r\n updateTask(task.id, {\r\n progress,\r\n bytesUploaded,\r\n status: \"uploading\",\r\n });\r\n setUploadQueue((currentQueue) => {\r\n const updatedQueue = currentQueue.map((q) =>\r\n q.id === task.id ? { ...q, progress, bytesUploaded } : q\r\n );\r\n updateOverallProgress(updatedQueue);\r\n return updatedQueue;\r\n });\r\n },\r\n onComplete: () => {\r\n updateTask(task.id, { status: \"completed\", progress: 100 });\r\n },\r\n onError: (errorMessage) => {\r\n updateTask(task.id, {\r\n status: \"error\",\r\n errorMessage,\r\n progress: 0,\r\n });\r\n },\r\n };\r\n\r\n return createUploadPromise<T>(type, task.file, callbacks, serverUrl);\r\n },\r\n [serverUrl, updateTask, updateOverallProgress]\r\n );\r\n\r\n const uploadFiles = useCallback(\r\n async (type: string, files: UploadBlobInput[]) => {\r\n const initialQueue = files.map(createUploadTask);\r\n setUploadQueue(initialQueue);\r\n updateOverallProgress(initialQueue);\r\n\r\n for (const task of initialQueue) {\r\n try {\r\n await uploadSingleFile(type, task);\r\n } catch (_error) {}\r\n }\r\n },\r\n [uploadSingleFile, updateOverallProgress]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setUploadQueue([]);\r\n setOverallProgress(0);\r\n }, []);\r\n\r\n return {\r\n uploadQueue,\r\n overallProgress,\r\n uploadFiles,\r\n reset,\r\n getTotalBytes: () => uploadQueue.reduce((sum, task) => sum + task.totalBytes, 0),\r\n getTotalBytesUploaded: () => uploadQueue.reduce((sum, task) => sum + task.bytesUploaded, 0),\r\n };\r\n}\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useUpload.js","names":["useAppConfig"],"sources":["../../../../../src/modules/file/hooks/useUpload.ts"],"sourcesContent":["import { useCallback, useState } from \"react\";\r\nimport { useAppConfig } from \"../../app/hooks/useAppConfig\";\r\nimport { resolveUploadBlob, type UploadBlobInput } from \"./useS3Upload\";\r\n\r\nexport type UploadStatus = \"pending\" | \"uploading\" | \"completed\" | \"error\";\r\n\r\nexport interface UploadFileTask {\r\n id: string;\r\n file: UploadBlobInput;\r\n progress: number;\r\n status: UploadStatus;\r\n errorMessage?: string;\r\n bytesUploaded: number;\r\n totalBytes: number;\r\n}\r\n\r\ninterface UploadCallbacks {\r\n onProgress: (progress: number, bytesUploaded: number) => void;\r\n onComplete: () => void;\r\n onError: (error: string) => void;\r\n}\r\n\r\n// Shared utility function to create upload promise\r\nconst createUploadPromise = <T>(\r\n type: string,\r\n file: UploadBlobInput,\r\n callbacks: UploadCallbacks,\r\n serverUrl: string\r\n): Promise<T> => {\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n\r\n xhr.upload.onprogress = (event: ProgressEvent<EventTarget>) => {\r\n if (event.lengthComputable) {\r\n const progress = Math.round((event.loaded * 100) / event.total);\r\n callbacks.onProgress(progress, event.loaded);\r\n }\r\n };\r\n\r\n xhr.onload = () => {\r\n if (xhr.status === 200) {\r\n callbacks.onComplete();\r\n // if response has json header, parse it\r\n if (xhr.getResponseHeader(\"Content-Type\")?.includes(\"application/json\")) {\r\n resolve(JSON.parse(xhr.response) as T);\r\n } else {\r\n resolve(xhr.response as T);\r\n }\r\n } else {\r\n const errorMessage = `Upload failed with status ${xhr.status}`;\r\n callbacks.onError(errorMessage);\r\n reject(new Error(errorMessage));\r\n }\r\n };\r\n\r\n xhr.onerror = () => {\r\n const errorMessage = \"Network error during upload\";\r\n callbacks.onError(errorMessage);\r\n reject(new Error(errorMessage));\r\n };\r\n\r\n xhr.open(\"POST\", `${serverUrl}/upload/file/${type}`);\r\n const formData = new FormData();\r\n resolveUploadBlob(file)\r\n .then(({ blob, name }) => {\r\n formData.append(\"file\", blob, name);\r\n xhr.send(formData);\r\n })\r\n .catch(reject);\r\n });\r\n};\r\n\r\n// Shared utility to create a task\r\nconst createUploadTask = (file: UploadBlobInput): UploadFileTask => ({\r\n id:\r\n typeof crypto !== \"undefined\" && crypto.randomUUID\r\n ? crypto.randomUUID()\r\n : Math.random().toString(36).substr(2, 9),\r\n file,\r\n progress: 0,\r\n status: \"pending\",\r\n bytesUploaded: 0,\r\n totalBytes: \"size\" in file && typeof file.size === \"number\" ? file.size : 0,\r\n});\r\n\r\n// Hook for single file upload\r\nexport function useFileUpload() {\r\n const { serverUrl } = useAppConfig();\r\n const [uploadTask, setUploadTask] = useState<UploadFileTask | null>(null);\r\n\r\n const upload = useCallback(\r\n async <T>(type: string, file: UploadBlobInput): Promise<T> => {\r\n const task = createUploadTask(file);\r\n setUploadTask(task);\r\n\r\n const callbacks: UploadCallbacks = {\r\n onProgress: (progress, bytesUploaded) => {\r\n setUploadTask((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n progress,\r\n bytesUploaded,\r\n status: \"uploading\",\r\n }\r\n : null\r\n );\r\n },\r\n onComplete: () => {\r\n setUploadTask((prev) => (prev ? { ...prev, status: \"completed\", progress: 100 } : null));\r\n },\r\n onError: (errorMessage) => {\r\n setUploadTask((prev) =>\r\n prev\r\n ? {\r\n ...prev,\r\n status: \"error\",\r\n errorMessage,\r\n progress: 0,\r\n }\r\n : null\r\n );\r\n },\r\n };\r\n\r\n return createUploadPromise<T>(type, file, callbacks, serverUrl);\r\n },\r\n [serverUrl]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setUploadTask(null);\r\n }, []);\r\n\r\n return {\r\n ...uploadTask,\r\n upload,\r\n reset,\r\n };\r\n}\r\n\r\n// Hook for multiple file uploads\r\nexport function useMultipartUpload() {\r\n const { serverUrl } = useAppConfig();\r\n const [uploadQueue, setUploadQueue] = useState<UploadFileTask[]>([]);\r\n const [overallProgress, setOverallProgress] = useState<number>(0);\r\n\r\n const updateTask = useCallback((id: string, changes: Partial<UploadFileTask>) => {\r\n setUploadQueue((prev) => prev.map((task) => (task.id === id ? { ...task, ...changes } : task)));\r\n }, []);\r\n\r\n const updateOverallProgress = useCallback((queue: UploadFileTask[]) => {\r\n if (queue.length === 0) {\r\n setOverallProgress(100);\r\n return;\r\n }\r\n const totalBytes = queue.reduce((sum, task) => sum + task.totalBytes, 0);\r\n const uploadedBytes = queue.reduce((sum, task) => {\r\n if (task.status === \"completed\") {\r\n return sum + task.totalBytes;\r\n }\r\n if (task.status === \"uploading\") {\r\n return sum + (task.progress / 100) * task.totalBytes;\r\n }\r\n return sum;\r\n }, 0);\r\n setOverallProgress(totalBytes > 0 ? Math.floor((uploadedBytes / totalBytes) * 100) : 0);\r\n }, []);\r\n\r\n const uploadSingleFile = useCallback(\r\n async <T>(type: string, task: UploadFileTask): Promise<T> => {\r\n const callbacks: UploadCallbacks = {\r\n onProgress: (progress, bytesUploaded) => {\r\n updateTask(task.id, {\r\n progress,\r\n bytesUploaded,\r\n status: \"uploading\",\r\n });\r\n setUploadQueue((currentQueue) => {\r\n const updatedQueue = currentQueue.map((q) =>\r\n q.id === task.id ? { ...q, progress, bytesUploaded } : q\r\n );\r\n updateOverallProgress(updatedQueue);\r\n return updatedQueue;\r\n });\r\n },\r\n onComplete: () => {\r\n updateTask(task.id, { status: \"completed\", progress: 100 });\r\n },\r\n onError: (errorMessage) => {\r\n updateTask(task.id, {\r\n status: \"error\",\r\n errorMessage,\r\n progress: 0,\r\n });\r\n },\r\n };\r\n\r\n return createUploadPromise<T>(type, task.file, callbacks, serverUrl);\r\n },\r\n [serverUrl, updateTask, updateOverallProgress]\r\n );\r\n\r\n const uploadFiles = useCallback(\r\n async (type: string, files: UploadBlobInput[]) => {\r\n const initialQueue = files.map(createUploadTask);\r\n setUploadQueue(initialQueue);\r\n updateOverallProgress(initialQueue);\r\n\r\n for (const task of initialQueue) {\r\n try {\r\n await uploadSingleFile(type, task);\r\n } catch (_error) {}\r\n }\r\n },\r\n [uploadSingleFile, updateOverallProgress]\r\n );\r\n\r\n const reset = useCallback(() => {\r\n setUploadQueue([]);\r\n setOverallProgress(0);\r\n }, []);\r\n\r\n return {\r\n uploadQueue,\r\n overallProgress,\r\n uploadFiles,\r\n reset,\r\n getTotalBytes: () => uploadQueue.reduce((sum, task) => sum + task.totalBytes, 0),\r\n getTotalBytesUploaded: () => uploadQueue.reduce((sum, task) => sum + task.bytesUploaded, 0),\r\n };\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
|
let react = require("react");
|
|
3
4
|
let _tanstack_react_query = require("@tanstack/react-query");
|
|
4
5
|
//#region src/modules/table/hooks/useQueryWithParams.ts
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQueryWithParams.js","names":[],"sources":["../../../../../src/modules/table/hooks/useQueryWithParams.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport { type UseQueryOptions, type UseQueryResult, useQuery } from \"@tanstack/react-query\";\r\nimport type { GroupingState } from \"@tanstack/react-table\";\r\nimport { useEffect, useMemo, useRef } from \"react\";\r\nimport type { QueryParamsState } from \"../queryParams\";\r\n\r\n/**\r\n * Flexible query options type that accepts both standard TanStack Query options\r\n * and tRPC's queryOptions function return type.\r\n * Uses permissive generics to handle type differences between TanStack Query and tRPC.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype QueryOptionsLike<TData> = UseQueryOptions<TData, any, TData, any>;\r\n\r\n/**\r\n * Function type that accepts both standard query options functions and tRPC's queryOptions.\r\n * tRPC's queryOptions accepts (input, opts?) while standard functions may only accept (input).\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype GetQueryOptionsFn<TInput, TData> = (input: TInput, ...args: any[]) => QueryOptionsLike<TData>;\r\n\r\nconst FETCH_ALL_LIMIT = 99999;\r\n\r\nexport interface QueryWithParamsOptions<TInput, TData> {\r\n getQueryOptions: GetQueryOptionsFn<TInput, TData>;\r\n queryParams?: TInput;\r\n queryState: Pick<QueryParamsState, \"filters\" | \"sort\" | \"order\" | \"page\" | \"limit\" | \"q\">;\r\n grouping?: GroupingState;\r\n additionalFilters?: QueryFilters;\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Hook to integrate query state with React Query\r\n * Combines queryParams with queryState and manages data fetching\r\n */\r\nexport const useQueryWithParams = <TInput, TData>({\r\n getQueryOptions,\r\n queryParams = {} as TInput,\r\n queryState,\r\n grouping = [],\r\n additionalFilters,\r\n enabled = true,\r\n}: QueryWithParamsOptions<TInput, TData>): UseQueryResult<TData> => {\r\n const { filters, sort, order, page, limit, q } = queryState;\r\n const isGrouped = grouping.length > 0;\r\n\r\n const input = useMemo(() => {\r\n let mergedFilters: QueryFilters | undefined;\r\n if (additionalFilters?.length) {\r\n const additionalColumnIds = new Set(additionalFilters.map((f) => f.columnId));\r\n const ownFiltersOnly = (filters ?? []).filter((f) => !additionalColumnIds.has(f.columnId));\r\n mergedFilters = [...additionalFilters, ...ownFiltersOnly];\r\n } else {\r\n mergedFilters = filters;\r\n }\r\n\r\n const qTrimmed = q?.trim();\r\n const qPayload = qTrimmed && qTrimmed.length > 0 ? qTrimmed : undefined;\r\n\r\n return {\r\n ...queryParams,\r\n page: isGrouped ? 1 : page,\r\n limit: isGrouped ? FETCH_ALL_LIMIT : limit,\r\n sort,\r\n order: order ?? undefined,\r\n filters: mergedFilters,\r\n ...(qPayload !== undefined ? { q: qPayload } : {}),\r\n };\r\n }, [queryParams, page, limit, sort, order, filters, isGrouped, additionalFilters, q]);\r\n\r\n const prevIsGroupedRef = useRef(isGrouped);\r\n\r\n const groupingTransitioned = prevIsGroupedRef.current !== isGrouped;\r\n\r\n useEffect(() => {\r\n prevIsGroupedRef.current = isGrouped;\r\n }, [isGrouped]);\r\n\r\n const queryOptions = useMemo(\r\n () => ({\r\n ...getQueryOptions(input),\r\n placeholderData: groupingTransitioned\r\n ? undefined\r\n : (previousData: TData | undefined) => previousData,\r\n enabled,\r\n }),\r\n [getQueryOptions, input, enabled, groupingTransitioned]\r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return useQuery(queryOptions as any) as UseQueryResult<TData>;\r\n};\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"useQueryWithParams.js","names":[],"sources":["../../../../../src/modules/table/hooks/useQueryWithParams.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport { type UseQueryOptions, type UseQueryResult, useQuery } from \"@tanstack/react-query\";\r\nimport type { GroupingState } from \"@tanstack/react-table\";\r\nimport { useEffect, useMemo, useRef } from \"react\";\r\nimport type { QueryParamsState } from \"../queryParams\";\r\n\r\n/**\r\n * Flexible query options type that accepts both standard TanStack Query options\r\n * and tRPC's queryOptions function return type.\r\n * Uses permissive generics to handle type differences between TanStack Query and tRPC.\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype QueryOptionsLike<TData> = UseQueryOptions<TData, any, TData, any>;\r\n\r\n/**\r\n * Function type that accepts both standard query options functions and tRPC's queryOptions.\r\n * tRPC's queryOptions accepts (input, opts?) while standard functions may only accept (input).\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\ntype GetQueryOptionsFn<TInput, TData> = (input: TInput, ...args: any[]) => QueryOptionsLike<TData>;\r\n\r\nconst FETCH_ALL_LIMIT = 99999;\r\n\r\nexport interface QueryWithParamsOptions<TInput, TData> {\r\n getQueryOptions: GetQueryOptionsFn<TInput, TData>;\r\n queryParams?: TInput;\r\n queryState: Pick<QueryParamsState, \"filters\" | \"sort\" | \"order\" | \"page\" | \"limit\" | \"q\">;\r\n grouping?: GroupingState;\r\n additionalFilters?: QueryFilters;\r\n enabled?: boolean;\r\n}\r\n\r\n/**\r\n * Hook to integrate query state with React Query\r\n * Combines queryParams with queryState and manages data fetching\r\n */\r\nexport const useQueryWithParams = <TInput, TData>({\r\n getQueryOptions,\r\n queryParams = {} as TInput,\r\n queryState,\r\n grouping = [],\r\n additionalFilters,\r\n enabled = true,\r\n}: QueryWithParamsOptions<TInput, TData>): UseQueryResult<TData> => {\r\n const { filters, sort, order, page, limit, q } = queryState;\r\n const isGrouped = grouping.length > 0;\r\n\r\n const input = useMemo(() => {\r\n let mergedFilters: QueryFilters | undefined;\r\n if (additionalFilters?.length) {\r\n const additionalColumnIds = new Set(additionalFilters.map((f) => f.columnId));\r\n const ownFiltersOnly = (filters ?? []).filter((f) => !additionalColumnIds.has(f.columnId));\r\n mergedFilters = [...additionalFilters, ...ownFiltersOnly];\r\n } else {\r\n mergedFilters = filters;\r\n }\r\n\r\n const qTrimmed = q?.trim();\r\n const qPayload = qTrimmed && qTrimmed.length > 0 ? qTrimmed : undefined;\r\n\r\n return {\r\n ...queryParams,\r\n page: isGrouped ? 1 : page,\r\n limit: isGrouped ? FETCH_ALL_LIMIT : limit,\r\n sort,\r\n order: order ?? undefined,\r\n filters: mergedFilters,\r\n ...(qPayload !== undefined ? { q: qPayload } : {}),\r\n };\r\n }, [queryParams, page, limit, sort, order, filters, isGrouped, additionalFilters, q]);\r\n\r\n const prevIsGroupedRef = useRef(isGrouped);\r\n\r\n const groupingTransitioned = prevIsGroupedRef.current !== isGrouped;\r\n\r\n useEffect(() => {\r\n prevIsGroupedRef.current = isGrouped;\r\n }, [isGrouped]);\r\n\r\n const queryOptions = useMemo(\r\n () => ({\r\n ...getQueryOptions(input),\r\n placeholderData: groupingTransitioned\r\n ? undefined\r\n : (previousData: TData | undefined) => previousData,\r\n enabled,\r\n }),\r\n [getQueryOptions, input, enabled, groupingTransitioned]\r\n );\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n return useQuery(queryOptions as any) as UseQueryResult<TData>;\r\n};\r\n"],"mappings":";;;;;AAqBA,MAAM,kBAAkB;;;;;AAexB,MAAa,sBAAqC,EAChD,iBACA,cAAc,EAAE,EAChB,YACA,WAAW,EAAE,EACb,mBACA,UAAU,WACwD;CAClE,MAAM,EAAE,SAAS,MAAM,OAAO,MAAM,OAAO,MAAM;CACjD,MAAM,YAAY,SAAS,SAAS;CAEpC,MAAM,SAAA,GAAA,MAAA,eAAsB;EAC1B,IAAI;AACJ,MAAI,mBAAmB,QAAQ;GAC7B,MAAM,sBAAsB,IAAI,IAAI,kBAAkB,KAAK,MAAM,EAAE,SAAS,CAAC;GAC7E,MAAM,kBAAkB,WAAW,EAAE,EAAE,QAAQ,MAAM,CAAC,oBAAoB,IAAI,EAAE,SAAS,CAAC;AAC1F,mBAAgB,CAAC,GAAG,mBAAmB,GAAG,eAAe;QAEzD,iBAAgB;EAGlB,MAAM,WAAW,GAAG,MAAM;EAC1B,MAAM,WAAW,YAAY,SAAS,SAAS,IAAI,WAAW,KAAA;AAE9D,SAAO;GACL,GAAG;GACH,MAAM,YAAY,IAAI;GACtB,OAAO,YAAY,kBAAkB;GACrC;GACA,OAAO,SAAS,KAAA;GAChB,SAAS;GACT,GAAI,aAAa,KAAA,IAAY,EAAE,GAAG,UAAU,GAAG,EAAE;GAClD;IACA;EAAC;EAAa;EAAM;EAAO;EAAM;EAAO;EAAS;EAAW;EAAmB;EAAE,CAAC;CAErF,MAAM,oBAAA,GAAA,MAAA,QAA0B,UAAU;CAE1C,MAAM,uBAAuB,iBAAiB,YAAY;AAE1D,EAAA,GAAA,MAAA,iBAAgB;AACd,mBAAiB,UAAU;IAC1B,CAAC,UAAU,CAAC;AAcf,SAAA,GAAA,sBAAA,WAAA,GAAA,MAAA,gBAXS;EACL,GAAG,gBAAgB,MAAM;EACzB,iBAAiB,uBACb,KAAA,KACC,iBAAoC;EACzC;EACD,GACD;EAAC;EAAiB;EAAO;EAAS;EAAqB,CACxD,CAGmC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTableQueryParams.js","names":[],"sources":["../../../../../src/modules/table/hooks/useTableQueryParams.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { GroupingState, PaginationState, SortingState, Updater } from \"@tanstack/react-table\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport type { Granularity, Order, QueryParamsState } from \"../queryParams\";\r\n\r\nexport const useTableQueryParams = (): QueryParamsState => {\r\n const [sort, setSort] = useState(\"\");\r\n const [order, setOrder] = useState<Order | null>(null);\r\n const [page, setPage] = useState(1);\r\n const [limit, setLimit] = useState(10);\r\n const [qRaw, setQRaw] = useState<string | null>(null);\r\n const [filters, setFiltersRaw] = useState<QueryFilters>([]);\r\n const [granularity, setGranularity] = useState<Granularity>(\"daily\");\r\n const [grouping, setGroupingRaw] = useState<GroupingState>([]);\r\n\r\n const setFilters = useCallback((next: QueryFilters) => {\r\n setFiltersRaw(next);\r\n }, []);\r\n\r\n const setQ = useCallback((value: string | null) => {\r\n setQRaw(value === \"\" || value == null ? null : value);\r\n }, []);\r\n\r\n const setGrouping = useCallback((updater: Updater<GroupingState>) => {\r\n setGroupingRaw((current) => (typeof updater === \"function\" ? updater(current) : updater));\r\n }, []);\r\n\r\n const sorting = useMemo(() => {\r\n if (!sort) {\r\n return [];\r\n }\r\n const effectiveOrder = order ?? \"asc\";\r\n return [{ id: sort, desc: effectiveOrder === \"desc\" }];\r\n }, [sort, order]);\r\n\r\n const pagination = useMemo(() => ({ pageIndex: page - 1, pageSize: limit }), [page, limit]);\r\n\r\n const setSorting = useCallback(\r\n (updater: Updater<SortingState>) => {\r\n const currentSorting: SortingState = sort\r\n ? [{ id: sort, desc: (order ?? \"asc\") === \"desc\" }]\r\n : [];\r\n\r\n const next = typeof updater === \"function\" ? updater(currentSorting) : updater;\r\n const first = next[0];\r\n\r\n if (!first || !first.id) {\r\n setSort(\"\");\r\n setOrder(null);\r\n return;\r\n }\r\n\r\n setSort(first.id);\r\n setOrder(first.desc ? \"desc\" : \"asc\");\r\n },\r\n [sort, order]\r\n );\r\n\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n setPage((currentPage) => {\r\n const currentState = { pageIndex: currentPage - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setLimit(next.pageSize ?? 10);\r\n return (next.pageIndex ?? 0) + 1;\r\n });\r\n },\r\n [limit]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n q: qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n setGranularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n }),\r\n [\r\n qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n ]\r\n );\r\n};\r\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"useTableQueryParams.js","names":[],"sources":["../../../../../src/modules/table/hooks/useTableQueryParams.ts"],"sourcesContent":["import type { QueryFilters } from \"@m5kdev/commons/modules/schemas/query.schema\";\r\nimport type { GroupingState, PaginationState, SortingState, Updater } from \"@tanstack/react-table\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport type { Granularity, Order, QueryParamsState } from \"../queryParams\";\r\n\r\nexport const useTableQueryParams = (): QueryParamsState => {\r\n const [sort, setSort] = useState(\"\");\r\n const [order, setOrder] = useState<Order | null>(null);\r\n const [page, setPage] = useState(1);\r\n const [limit, setLimit] = useState(10);\r\n const [qRaw, setQRaw] = useState<string | null>(null);\r\n const [filters, setFiltersRaw] = useState<QueryFilters>([]);\r\n const [granularity, setGranularity] = useState<Granularity>(\"daily\");\r\n const [grouping, setGroupingRaw] = useState<GroupingState>([]);\r\n\r\n const setFilters = useCallback((next: QueryFilters) => {\r\n setFiltersRaw(next);\r\n }, []);\r\n\r\n const setQ = useCallback((value: string | null) => {\r\n setQRaw(value === \"\" || value == null ? null : value);\r\n }, []);\r\n\r\n const setGrouping = useCallback((updater: Updater<GroupingState>) => {\r\n setGroupingRaw((current) => (typeof updater === \"function\" ? updater(current) : updater));\r\n }, []);\r\n\r\n const sorting = useMemo(() => {\r\n if (!sort) {\r\n return [];\r\n }\r\n const effectiveOrder = order ?? \"asc\";\r\n return [{ id: sort, desc: effectiveOrder === \"desc\" }];\r\n }, [sort, order]);\r\n\r\n const pagination = useMemo(() => ({ pageIndex: page - 1, pageSize: limit }), [page, limit]);\r\n\r\n const setSorting = useCallback(\r\n (updater: Updater<SortingState>) => {\r\n const currentSorting: SortingState = sort\r\n ? [{ id: sort, desc: (order ?? \"asc\") === \"desc\" }]\r\n : [];\r\n\r\n const next = typeof updater === \"function\" ? updater(currentSorting) : updater;\r\n const first = next[0];\r\n\r\n if (!first || !first.id) {\r\n setSort(\"\");\r\n setOrder(null);\r\n return;\r\n }\r\n\r\n setSort(first.id);\r\n setOrder(first.desc ? \"desc\" : \"asc\");\r\n },\r\n [sort, order]\r\n );\r\n\r\n const setPagination = useCallback(\r\n (updater: Updater<PaginationState>) => {\r\n setPage((currentPage) => {\r\n const currentState = { pageIndex: currentPage - 1, pageSize: limit };\r\n const next = typeof updater === \"function\" ? updater(currentState) : updater;\r\n setLimit(next.pageSize ?? 10);\r\n return (next.pageIndex ?? 0) + 1;\r\n });\r\n },\r\n [limit]\r\n );\r\n\r\n return useMemo(\r\n () => ({\r\n q: qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n setGranularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n }),\r\n [\r\n qRaw,\r\n setQ,\r\n filters,\r\n setFilters,\r\n granularity,\r\n sort,\r\n order,\r\n setSorting,\r\n sorting,\r\n page,\r\n limit,\r\n setPagination,\r\n pagination,\r\n grouping,\r\n setGrouping,\r\n ]\r\n );\r\n};\r\n"],"mappings":";;;;AAKA,MAAa,4BAA8C;CACzD,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAoB,GAAG;CACpC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAmC,KAAK;CACtD,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAoB,EAAE;CACnC,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,UAAqB,GAAG;CACtC,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,UAAmC,KAAK;CACrD,MAAM,CAAC,SAAS,kBAAA,GAAA,MAAA,UAAwC,EAAE,CAAC;CAC3D,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,UAAwC,QAAQ;CACpE,MAAM,CAAC,UAAU,mBAAA,GAAA,MAAA,UAA0C,EAAE,CAAC;CAE9D,MAAM,cAAA,GAAA,MAAA,cAA0B,SAAuB;AACrD,gBAAc,KAAK;IAClB,EAAE,CAAC;CAEN,MAAM,QAAA,GAAA,MAAA,cAAoB,UAAyB;AACjD,UAAQ,UAAU,MAAM,SAAS,OAAO,OAAO,MAAM;IACpD,EAAE,CAAC;CAEN,MAAM,eAAA,GAAA,MAAA,cAA2B,YAAoC;AACnE,kBAAgB,YAAa,OAAO,YAAY,aAAa,QAAQ,QAAQ,GAAG,QAAS;IACxF,EAAE,CAAC;CAEN,MAAM,WAAA,GAAA,MAAA,eAAwB;AAC5B,MAAI,CAAC,KACH,QAAO,EAAE;AAGX,SAAO,CAAC;GAAE,IAAI;GAAM,OADG,SAAS,WACa;GAAQ,CAAC;IACrD,CAAC,MAAM,MAAM,CAAC;CAEjB,MAAM,cAAA,GAAA,MAAA,gBAA4B;EAAE,WAAW,OAAO;EAAG,UAAU;EAAO,GAAG,CAAC,MAAM,MAAM,CAAC;CAE3F,MAAM,cAAA,GAAA,MAAA,cACH,YAAmC;EAMlC,MAAM,SADO,OAAO,YAAY,aAAa,QAJR,OACjC,CAAC;GAAE,IAAI;GAAM,OAAO,SAAS,WAAW;GAAQ,CAAC,GACjD,EAAE,CAE8D,GAAG,SACpD;AAEnB,MAAI,CAAC,SAAS,CAAC,MAAM,IAAI;AACvB,WAAQ,GAAG;AACX,YAAS,KAAK;AACd;;AAGF,UAAQ,MAAM,GAAG;AACjB,WAAS,MAAM,OAAO,SAAS,MAAM;IAEvC,CAAC,MAAM,MAAM,CACd;CAED,MAAM,iBAAA,GAAA,MAAA,cACH,YAAsC;AACrC,WAAS,gBAAgB;GACvB,MAAM,eAAe;IAAE,WAAW,cAAc;IAAG,UAAU;IAAO;GACpE,MAAM,OAAO,OAAO,YAAY,aAAa,QAAQ,aAAa,GAAG;AACrE,YAAS,KAAK,YAAY,GAAG;AAC7B,WAAQ,KAAK,aAAa,KAAK;IAC/B;IAEJ,CAAC,MAAM,CACR;AAED,SAAA,GAAA,MAAA,gBACS;EACL,GAAG;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
require("../../../_virtual/_rolldown/runtime.js");
|
|
2
3
|
let _m5kdev_commons_modules_schemas_query_schema = require("@m5kdev/commons/modules/schemas/query.schema");
|
|
3
4
|
let zod = require("zod");
|
|
4
5
|
//#region src/modules/table/queryParams.ts
|