@mano8/astro-media-m8 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +203 -0
  3. package/dist/src/integration.d.ts +57 -0
  4. package/dist/src/integration.d.ts.map +1 -0
  5. package/dist/src/integration.js +87 -0
  6. package/dist/src/integration.js.map +1 -0
  7. package/dist/src/lib/csp.d.ts +27 -0
  8. package/dist/src/lib/csp.d.ts.map +1 -0
  9. package/dist/src/lib/csp.js +54 -0
  10. package/dist/src/lib/csp.js.map +1 -0
  11. package/dist/src/middleware.d.ts +4 -0
  12. package/dist/src/middleware.d.ts.map +1 -0
  13. package/dist/src/middleware.js +24 -0
  14. package/dist/src/middleware.js.map +1 -0
  15. package/dist/src/runtime/api/admin.d.ts +22 -0
  16. package/dist/src/runtime/api/admin.d.ts.map +1 -0
  17. package/dist/src/runtime/api/admin.js +115 -0
  18. package/dist/src/runtime/api/admin.js.map +1 -0
  19. package/dist/src/runtime/api/categories.d.ts +12 -0
  20. package/dist/src/runtime/api/categories.d.ts.map +1 -0
  21. package/dist/src/runtime/api/categories.js +56 -0
  22. package/dist/src/runtime/api/categories.js.map +1 -0
  23. package/dist/src/runtime/api/dashboard.d.ts +5 -0
  24. package/dist/src/runtime/api/dashboard.d.ts.map +1 -0
  25. package/dist/src/runtime/api/dashboard.js +22 -0
  26. package/dist/src/runtime/api/dashboard.js.map +1 -0
  27. package/dist/src/runtime/api/index.d.ts +72 -0
  28. package/dist/src/runtime/api/index.d.ts.map +1 -0
  29. package/dist/src/runtime/api/index.js +74 -0
  30. package/dist/src/runtime/api/index.js.map +1 -0
  31. package/dist/src/runtime/api/internal.server.d.ts +19 -0
  32. package/dist/src/runtime/api/internal.server.d.ts.map +1 -0
  33. package/dist/src/runtime/api/internal.server.js +64 -0
  34. package/dist/src/runtime/api/internal.server.js.map +1 -0
  35. package/dist/src/runtime/api/objects.d.ts +7 -0
  36. package/dist/src/runtime/api/objects.d.ts.map +1 -0
  37. package/dist/src/runtime/api/objects.js +71 -0
  38. package/dist/src/runtime/api/objects.js.map +1 -0
  39. package/dist/src/runtime/api/presets.d.ts +6 -0
  40. package/dist/src/runtime/api/presets.d.ts.map +1 -0
  41. package/dist/src/runtime/api/presets.js +31 -0
  42. package/dist/src/runtime/api/presets.js.map +1 -0
  43. package/dist/src/runtime/api/shares.d.ts +10 -0
  44. package/dist/src/runtime/api/shares.d.ts.map +1 -0
  45. package/dist/src/runtime/api/shares.js +38 -0
  46. package/dist/src/runtime/api/shares.js.map +1 -0
  47. package/dist/src/runtime/api/uploads.d.ts +5 -0
  48. package/dist/src/runtime/api/uploads.d.ts.map +1 -0
  49. package/dist/src/runtime/api/uploads.js +28 -0
  50. package/dist/src/runtime/api/uploads.js.map +1 -0
  51. package/dist/src/runtime/api/variants.d.ts +18 -0
  52. package/dist/src/runtime/api/variants.d.ts.map +1 -0
  53. package/dist/src/runtime/api/variants.js +61 -0
  54. package/dist/src/runtime/api/variants.js.map +1 -0
  55. package/dist/src/runtime/authAdapter.d.ts +48 -0
  56. package/dist/src/runtime/authAdapter.d.ts.map +1 -0
  57. package/dist/src/runtime/authAdapter.js +62 -0
  58. package/dist/src/runtime/authAdapter.js.map +1 -0
  59. package/dist/src/runtime/client.d.ts +24 -0
  60. package/dist/src/runtime/client.d.ts.map +1 -0
  61. package/dist/src/runtime/client.js +87 -0
  62. package/dist/src/runtime/client.js.map +1 -0
  63. package/dist/src/runtime/compatibility.d.ts +32 -0
  64. package/dist/src/runtime/compatibility.d.ts.map +1 -0
  65. package/dist/src/runtime/compatibility.js +101 -0
  66. package/dist/src/runtime/compatibility.js.map +1 -0
  67. package/dist/src/runtime/config.d.ts +27 -0
  68. package/dist/src/runtime/config.d.ts.map +1 -0
  69. package/dist/src/runtime/config.js +32 -0
  70. package/dist/src/runtime/config.js.map +1 -0
  71. package/dist/src/runtime/errors.d.ts +23 -0
  72. package/dist/src/runtime/errors.d.ts.map +1 -0
  73. package/dist/src/runtime/errors.js +50 -0
  74. package/dist/src/runtime/errors.js.map +1 -0
  75. package/dist/src/runtime/hooks/index.d.ts +8 -0
  76. package/dist/src/runtime/hooks/index.d.ts.map +1 -0
  77. package/dist/src/runtime/hooks/index.js +8 -0
  78. package/dist/src/runtime/hooks/index.js.map +1 -0
  79. package/dist/src/runtime/hooks/useDownloadUrl.d.ts +12 -0
  80. package/dist/src/runtime/hooks/useDownloadUrl.d.ts.map +1 -0
  81. package/dist/src/runtime/hooks/useDownloadUrl.js +40 -0
  82. package/dist/src/runtime/hooks/useDownloadUrl.js.map +1 -0
  83. package/dist/src/runtime/hooks/useMediaAdmin.d.ts +30 -0
  84. package/dist/src/runtime/hooks/useMediaAdmin.d.ts.map +1 -0
  85. package/dist/src/runtime/hooks/useMediaAdmin.js +145 -0
  86. package/dist/src/runtime/hooks/useMediaAdmin.js.map +1 -0
  87. package/dist/src/runtime/hooks/useMediaObject.d.ts +17 -0
  88. package/dist/src/runtime/hooks/useMediaObject.d.ts.map +1 -0
  89. package/dist/src/runtime/hooks/useMediaObject.js +62 -0
  90. package/dist/src/runtime/hooks/useMediaObject.js.map +1 -0
  91. package/dist/src/runtime/hooks/useMediaObjects.d.ts +12 -0
  92. package/dist/src/runtime/hooks/useMediaObjects.d.ts.map +1 -0
  93. package/dist/src/runtime/hooks/useMediaObjects.js +76 -0
  94. package/dist/src/runtime/hooks/useMediaObjects.js.map +1 -0
  95. package/dist/src/runtime/hooks/useMediaPresets.d.ts +24 -0
  96. package/dist/src/runtime/hooks/useMediaPresets.d.ts.map +1 -0
  97. package/dist/src/runtime/hooks/useMediaPresets.js +55 -0
  98. package/dist/src/runtime/hooks/useMediaPresets.js.map +1 -0
  99. package/dist/src/runtime/hooks/useMediaUpload.d.ts +11 -0
  100. package/dist/src/runtime/hooks/useMediaUpload.d.ts.map +1 -0
  101. package/dist/src/runtime/hooks/useMediaUpload.js +34 -0
  102. package/dist/src/runtime/hooks/useMediaUpload.js.map +1 -0
  103. package/dist/src/runtime/hooks/useMediaVariants.d.ts +18 -0
  104. package/dist/src/runtime/hooks/useMediaVariants.d.ts.map +1 -0
  105. package/dist/src/runtime/hooks/useMediaVariants.js +78 -0
  106. package/dist/src/runtime/hooks/useMediaVariants.js.map +1 -0
  107. package/dist/src/runtime/listParams.d.ts +27 -0
  108. package/dist/src/runtime/listParams.d.ts.map +1 -0
  109. package/dist/src/runtime/listParams.js +66 -0
  110. package/dist/src/runtime/listParams.js.map +1 -0
  111. package/dist/src/runtime/queryKeys.d.ts +18 -0
  112. package/dist/src/runtime/queryKeys.d.ts.map +1 -0
  113. package/dist/src/runtime/queryKeys.js +23 -0
  114. package/dist/src/runtime/queryKeys.js.map +1 -0
  115. package/dist/src/runtime/react/AdminMediaPanel.d.ts +2 -0
  116. package/dist/src/runtime/react/AdminMediaPanel.d.ts.map +1 -0
  117. package/dist/src/runtime/react/AdminMediaPanel.js +14 -0
  118. package/dist/src/runtime/react/AdminMediaPanel.js.map +1 -0
  119. package/dist/src/runtime/react/MediaLibrary.d.ts +6 -0
  120. package/dist/src/runtime/react/MediaLibrary.d.ts.map +1 -0
  121. package/dist/src/runtime/react/MediaLibrary.js +138 -0
  122. package/dist/src/runtime/react/MediaLibrary.js.map +1 -0
  123. package/dist/src/runtime/react/MediaProvider.d.ts +18 -0
  124. package/dist/src/runtime/react/MediaProvider.d.ts.map +1 -0
  125. package/dist/src/runtime/react/MediaProvider.js +79 -0
  126. package/dist/src/runtime/react/MediaProvider.js.map +1 -0
  127. package/dist/src/runtime/react/MediaQueryProvider.d.ts +8 -0
  128. package/dist/src/runtime/react/MediaQueryProvider.d.ts.map +1 -0
  129. package/dist/src/runtime/react/MediaQueryProvider.js +11 -0
  130. package/dist/src/runtime/react/MediaQueryProvider.js.map +1 -0
  131. package/dist/src/runtime/react/MediaUploadDropzone.d.ts +8 -0
  132. package/dist/src/runtime/react/MediaUploadDropzone.d.ts.map +1 -0
  133. package/dist/src/runtime/react/MediaUploadDropzone.js +34 -0
  134. package/dist/src/runtime/react/MediaUploadDropzone.js.map +1 -0
  135. package/dist/src/runtime/react/ObjectDetail.d.ts +5 -0
  136. package/dist/src/runtime/react/ObjectDetail.d.ts.map +1 -0
  137. package/dist/src/runtime/react/ObjectDetail.js +34 -0
  138. package/dist/src/runtime/react/ObjectDetail.js.map +1 -0
  139. package/dist/src/runtime/react/PresetEditor.d.ts +3 -0
  140. package/dist/src/runtime/react/PresetEditor.d.ts.map +1 -0
  141. package/dist/src/runtime/react/PresetEditor.js +36 -0
  142. package/dist/src/runtime/react/PresetEditor.js.map +1 -0
  143. package/dist/src/runtime/react/RequireSuperuser.d.ts +7 -0
  144. package/dist/src/runtime/react/RequireSuperuser.d.ts.map +1 -0
  145. package/dist/src/runtime/react/RequireSuperuser.js +10 -0
  146. package/dist/src/runtime/react/RequireSuperuser.js.map +1 -0
  147. package/dist/src/runtime/react/VariantPicker.d.ts +5 -0
  148. package/dist/src/runtime/react/VariantPicker.d.ts.map +1 -0
  149. package/dist/src/runtime/react/VariantPicker.js +28 -0
  150. package/dist/src/runtime/react/VariantPicker.js.map +1 -0
  151. package/dist/src/runtime/react/default-ui/index.d.ts +25 -0
  152. package/dist/src/runtime/react/default-ui/index.d.ts.map +1 -0
  153. package/dist/src/runtime/react/default-ui/index.js +33 -0
  154. package/dist/src/runtime/react/default-ui/index.js.map +1 -0
  155. package/dist/src/runtime/react/index.d.ts +10 -0
  156. package/dist/src/runtime/react/index.d.ts.map +1 -0
  157. package/dist/src/runtime/react/index.js +10 -0
  158. package/dist/src/runtime/react/index.js.map +1 -0
  159. package/dist/src/runtime/routes.d.ts +19 -0
  160. package/dist/src/runtime/routes.d.ts.map +1 -0
  161. package/dist/src/runtime/routes.js +35 -0
  162. package/dist/src/runtime/routes.js.map +1 -0
  163. package/dist/src/runtime/schemas.d.ts +812 -0
  164. package/dist/src/runtime/schemas.d.ts.map +1 -0
  165. package/dist/src/runtime/schemas.js +427 -0
  166. package/dist/src/runtime/schemas.js.map +1 -0
  167. package/dist/src/runtime/upload/index.d.ts +2 -0
  168. package/dist/src/runtime/upload/index.d.ts.map +1 -0
  169. package/dist/src/runtime/upload/index.js +2 -0
  170. package/dist/src/runtime/upload/index.js.map +1 -0
  171. package/dist/src/runtime/upload/uploadController.d.ts +71 -0
  172. package/dist/src/runtime/upload/uploadController.d.ts.map +1 -0
  173. package/dist/src/runtime/upload/uploadController.js +217 -0
  174. package/dist/src/runtime/upload/uploadController.js.map +1 -0
  175. package/package.json +97 -0
  176. package/registry/r/admin-media-dashboard.json +23 -0
  177. package/registry/r/data-table.json +23 -0
  178. package/registry/r/media-dashboard-overview.json +26 -0
  179. package/registry/r/media-maintenance-panel.json +23 -0
  180. package/registry/r/media-storage-chart.json +21 -0
  181. package/registry/r/registry.json +37 -0
  182. package/registry.json +92 -0
  183. package/src/routes/admin/media.astro +12 -0
  184. package/src/routes/library.astro +12 -0
  185. package/src/routes/object/[id].astro +14 -0
  186. package/src/routes/presets.astro +12 -0
  187. package/src/routes/upload.astro +12 -0
  188. package/src/scaffold/styles/media.css +208 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility.js","sourceRoot":"","sources":["../../../src/runtime/compatibility.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export type MediaPollingConfig = {
2
+ /** Interval between variant-job status polls, in milliseconds. */
3
+ variantJobMs: number;
4
+ /** Interval between object scan-status polls, in milliseconds. */
5
+ uploadScanMs: number;
6
+ /** Hard ceiling for any polling helper, in milliseconds. */
7
+ timeoutMs: number;
8
+ };
9
+ export type MediaRuntimeConfig = {
10
+ /** Service mount, e.g. "/media" — prepended to every request path. */
11
+ apiBase: string;
12
+ /** Sub-prefix for the versioned resource routes (uploads/objects/...). */
13
+ v1Base: string;
14
+ /** Sub-prefix for legacy routes (dashboard/category); usually empty. */
15
+ legacyBase: string;
16
+ /** Header sent on every request so a same-origin stack can pin CSRF. */
17
+ csrfHeader: string;
18
+ /** Role string that grants admin access through the auth adapter. */
19
+ adminRole: string;
20
+ polling: MediaPollingConfig;
21
+ };
22
+ export declare function configureMedia(config?: Partial<Omit<MediaRuntimeConfig, "polling">> & {
23
+ polling?: Partial<MediaPollingConfig>;
24
+ }): MediaRuntimeConfig;
25
+ export declare function getMediaConfig(): MediaRuntimeConfig;
26
+ export declare function resetMediaConfig(): void;
27
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/runtime/config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,kBAAkB,CAAC;CAC7B,CAAC;AAqBF,wBAAgB,cAAc,CAAC,MAAM,GAAE,OAAO,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,GAAG;IACpF,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAClC,GAAG,kBAAkB,CAQ1B;AAED,wBAAgB,cAAc,IAAI,kBAAkB,CAEnD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC"}
@@ -0,0 +1,32 @@
1
+ const DEFAULT_CONFIG = {
2
+ apiBase: "/media",
3
+ v1Base: "/v1",
4
+ legacyBase: "",
5
+ csrfHeader: "X-Requested-With",
6
+ adminRole: "is_superuser",
7
+ polling: {
8
+ variantJobMs: 1500,
9
+ uploadScanMs: 2000,
10
+ timeoutMs: 120000
11
+ }
12
+ };
13
+ let runtimeConfig = cloneConfig(DEFAULT_CONFIG);
14
+ function cloneConfig(config) {
15
+ return { ...config, polling: { ...config.polling } };
16
+ }
17
+ export function configureMedia(config = {}) {
18
+ const { polling, ...rest } = config;
19
+ runtimeConfig = {
20
+ ...runtimeConfig,
21
+ ...rest,
22
+ polling: { ...runtimeConfig.polling, ...polling }
23
+ };
24
+ return runtimeConfig;
25
+ }
26
+ export function getMediaConfig() {
27
+ return runtimeConfig;
28
+ }
29
+ export function resetMediaConfig() {
30
+ runtimeConfig = cloneConfig(DEFAULT_CONFIG);
31
+ }
32
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/runtime/config.ts"],"names":[],"mappings":"AAuBA,MAAM,cAAc,GAAuB;IACzC,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,KAAK;IACb,UAAU,EAAE,EAAE;IACd,UAAU,EAAE,kBAAkB;IAC9B,SAAS,EAAE,cAAc;IACzB,OAAO,EAAE;QACP,YAAY,EAAE,IAAI;QAClB,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,MAAM;KAClB;CACF,CAAC;AAEF,IAAI,aAAa,GAAuB,WAAW,CAAC,cAAc,CAAC,CAAC;AAEpE,SAAS,WAAW,CAAC,MAA0B;IAC7C,OAAO,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAE3B,EAAE;IACJ,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM,CAAC;IACpC,aAAa,GAAG;QACd,GAAG,aAAa;QAChB,GAAG,IAAI;QACP,OAAO,EAAE,EAAE,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,OAAO,EAAE;KAClD,CAAC;IACF,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,aAAa,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ export declare const ApiErrorBody: z.ZodObject<{
3
+ detail: z.ZodUnknown;
4
+ }, z.core.$strip>;
5
+ /**
6
+ * Derive a human-readable message from a normalized FastAPI error detail.
7
+ * Strings are surfaced as-is; validation arrays ({ msg }) are joined; anything
8
+ * else yields `undefined` so callers fall back to a generic message.
9
+ */
10
+ export declare function messageFromDetail(detail: unknown): string | undefined;
11
+ export declare class ApiError extends Error {
12
+ readonly status: number;
13
+ readonly detail: unknown;
14
+ constructor(status: number, detail: unknown, message?: string);
15
+ }
16
+ export declare class UnauthenticatedError extends ApiError {
17
+ constructor(message?: string);
18
+ }
19
+ export declare class ForbiddenError extends ApiError {
20
+ constructor(message?: string);
21
+ }
22
+ export declare function normalizeFastApiError(payload: unknown): unknown;
23
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/runtime/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;iBAEvB,CAAC;AAEH;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAarE;AAED,qBAAa,QAAS,SAAQ,KAAK;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;gBAEb,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM;CAM9D;AAED,qBAAa,oBAAqB,SAAQ,QAAQ;gBACpC,OAAO,SAA4B;CAIhD;AAED,qBAAa,cAAe,SAAQ,QAAQ;gBAC9B,OAAO,SAAsD;CAI1E;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAG/D"}
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ export const ApiErrorBody = z.object({
3
+ detail: z.unknown()
4
+ });
5
+ /**
6
+ * Derive a human-readable message from a normalized FastAPI error detail.
7
+ * Strings are surfaced as-is; validation arrays ({ msg }) are joined; anything
8
+ * else yields `undefined` so callers fall back to a generic message.
9
+ */
10
+ export function messageFromDetail(detail) {
11
+ if (typeof detail === "string" && detail.trim())
12
+ return detail;
13
+ if (Array.isArray(detail)) {
14
+ const parts = detail
15
+ .map((item) => item && typeof item === "object" && "msg" in item && item.msg
16
+ ? String(item.msg)
17
+ : null)
18
+ .filter((part) => part !== null);
19
+ if (parts.length)
20
+ return parts.join("; ");
21
+ }
22
+ return undefined;
23
+ }
24
+ export class ApiError extends Error {
25
+ status;
26
+ detail;
27
+ constructor(status, detail, message) {
28
+ super(message ?? messageFromDetail(detail) ?? "Media API request failed");
29
+ this.name = "ApiError";
30
+ this.status = status;
31
+ this.detail = detail;
32
+ }
33
+ }
34
+ export class UnauthenticatedError extends ApiError {
35
+ constructor(message = "Authentication required") {
36
+ super(401, message, message);
37
+ this.name = "UnauthenticatedError";
38
+ }
39
+ }
40
+ export class ForbiddenError extends ApiError {
41
+ constructor(message = "You do not have permission to perform this action") {
42
+ super(403, message, message);
43
+ this.name = "ForbiddenError";
44
+ }
45
+ }
46
+ export function normalizeFastApiError(payload) {
47
+ const parsed = ApiErrorBody.safeParse(payload);
48
+ return parsed.success ? parsed.data.detail : payload;
49
+ }
50
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/runtime/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;CACpB,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAe;IAC/C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,MAAM,CAAC;IAC/D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM;aACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CACZ,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,IAAI,IAAI,IAAK,IAAyB,CAAC,GAAG;YACjF,CAAC,CAAC,MAAM,CAAE,IAAyB,CAAC,GAAG,CAAC;YACxC,CAAC,CAAC,IAAI,CACT;aACA,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,OAAO,QAAS,SAAQ,KAAK;IACxB,MAAM,CAAS;IACf,MAAM,CAAU;IAEzB,YAAY,MAAc,EAAE,MAAe,EAAE,OAAgB;QAC3D,KAAK,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,IAAI,0BAA0B,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,QAAQ;IAChD,YAAY,OAAO,GAAG,yBAAyB;QAC7C,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,QAAQ;IAC1C,YAAY,OAAO,GAAG,mDAAmD;QACvE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AACvD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./useMediaObjects.js";
2
+ export * from "./useMediaObject.js";
3
+ export * from "./useMediaUpload.js";
4
+ export * from "./useMediaVariants.js";
5
+ export * from "./useMediaPresets.js";
6
+ export * from "./useMediaAdmin.js";
7
+ export * from "./useDownloadUrl.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from "./useMediaObjects.js";
2
+ export * from "./useMediaObject.js";
3
+ export * from "./useMediaUpload.js";
4
+ export * from "./useMediaVariants.js";
5
+ export * from "./useMediaPresets.js";
6
+ export * from "./useMediaAdmin.js";
7
+ export * from "./useDownloadUrl.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/runtime/hooks/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { DownloadUrlResponse } from "../schemas.js";
2
+ export type UseDownloadUrl = {
3
+ data: DownloadUrlResponse | null;
4
+ loading: boolean;
5
+ error: unknown;
6
+ /** Generate a fresh presigned URL for an owned object. */
7
+ request: () => Promise<DownloadUrlResponse>;
8
+ /** Resolve a public share token to a presigned URL. */
9
+ resolve: (token: string) => Promise<DownloadUrlResponse>;
10
+ };
11
+ export declare function useDownloadUrl(objectId: string | null): UseDownloadUrl;
12
+ //# sourceMappingURL=useDownloadUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDownloadUrl.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/useDownloadUrl.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,0DAA0D;IAC1D,OAAO,EAAE,MAAM,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC5C,uDAAuD;IACvD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAC1D,CAAC;AAEF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CAmCtE"}
@@ -0,0 +1,40 @@
1
+ import { useCallback } from "react";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { getDownloadUrl } from "../api/objects.js";
4
+ import { resolveShare } from "../api/shares.js";
5
+ import { mediaKeys } from "../queryKeys.js";
6
+ export function useDownloadUrl(objectId) {
7
+ const queryClient = useQueryClient();
8
+ const requestMutation = useMutation({
9
+ mutationKey: objectId ? mediaKeys.downloadUrl(objectId) : ["media", "download-url", ""],
10
+ mutationFn: async () => {
11
+ if (!objectId)
12
+ throw new Error("No object selected");
13
+ const result = await getDownloadUrl(objectId);
14
+ queryClient.setQueryData(mediaKeys.downloadUrl(objectId), result);
15
+ return result;
16
+ }
17
+ });
18
+ const resolveMutation = useMutation({
19
+ mutationFn: (token) => resolveShare(token)
20
+ });
21
+ const { mutateAsync: requestDownloadUrlAsync } = requestMutation;
22
+ const { mutateAsync: resolveShareAsync } = resolveMutation;
23
+ const request = useCallback(() => {
24
+ if (!objectId)
25
+ throw new Error("No object selected");
26
+ return requestDownloadUrlAsync();
27
+ }, [objectId, requestDownloadUrlAsync]);
28
+ const resolve = useCallback((token) => resolveShareAsync(token), [resolveShareAsync]);
29
+ const requestIsLatest = requestMutation.submittedAt >= resolveMutation.submittedAt;
30
+ const latestData = requestIsLatest ? requestMutation.data : resolveMutation.data;
31
+ const latestError = requestIsLatest ? requestMutation.error : resolveMutation.error;
32
+ return {
33
+ data: latestData ?? null,
34
+ loading: requestMutation.isPending || resolveMutation.isPending,
35
+ error: latestError ?? null,
36
+ request,
37
+ resolve
38
+ };
39
+ }
40
+ //# sourceMappingURL=useDownloadUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDownloadUrl.js","sourceRoot":"","sources":["../../../../src/runtime/hooks/useDownloadUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAa5C,MAAM,UAAU,cAAc,CAAC,QAAuB;IACpD,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,eAAe,GAAG,WAAW,CAAqC;QACtE,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC;QACvF,UAAU,EAAE,KAAK,IAAI,EAAE;YACrB,IAAI,CAAC,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,QAAQ,CAAC,CAAC;YAC9C,WAAW,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;YAClE,OAAO,MAAM,CAAC;QAChB,CAAC;KACF,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,WAAW,CAAuC;QACxE,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC;KAC3C,CAAC,CAAC;IACH,MAAM,EAAE,WAAW,EAAE,uBAAuB,EAAE,GAAG,eAAe,CAAC;IACjE,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,eAAe,CAAC;IAE3D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE;QAC/B,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACrD,OAAO,uBAAuB,EAAE,CAAC;IACnC,CAAC,EAAE,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC,CAAC;IAExC,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;IAE9F,MAAM,eAAe,GAAG,eAAe,CAAC,WAAW,IAAI,eAAe,CAAC,WAAW,CAAC;IACnF,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC;IACjF,MAAM,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC;IAEpF,OAAO;QACL,IAAI,EAAE,UAAU,IAAI,IAAI;QACxB,OAAO,EAAE,eAAe,CAAC,SAAS,IAAI,eAAe,CAAC,SAAS;QAC/D,KAAK,EAAE,WAAW,IAAI,IAAI;QAC1B,OAAO;QACP,OAAO;KACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { type UseMutationResult } from "@tanstack/react-query";
2
+ import type { HardPurgeResponse, OrphanReport, PurgeStaleResponse, StaleUploadsResponse, StorageStatsResponse, SubscriptionListResponse } from "../schemas.js";
3
+ type PurgeStaleMutation = UseMutationResult<PurgeStaleResponse, unknown, void>;
4
+ type RepairMutation = UseMutationResult<OrphanReport, unknown, boolean>;
5
+ type PurgeExpiredMutation = UseMutationResult<HardPurgeResponse, unknown, void>;
6
+ type RemoveSubscriptionMutation = UseMutationResult<void, unknown, string>;
7
+ export type UseMediaAdmin = {
8
+ allowed: boolean;
9
+ stats: StorageStatsResponse | null;
10
+ stale: StaleUploadsResponse | null;
11
+ orphans: OrphanReport | null;
12
+ subscriptions: SubscriptionListResponse | null;
13
+ loading: boolean;
14
+ error: unknown;
15
+ loadStats: () => Promise<void>;
16
+ loadStale: () => Promise<void>;
17
+ purgeStale: () => Promise<PurgeStaleResponse>;
18
+ loadOrphans: () => Promise<void>;
19
+ repair: (confirm: boolean) => Promise<OrphanReport>;
20
+ purgeExpiredObjects: () => Promise<HardPurgeResponse>;
21
+ loadSubscriptions: () => Promise<void>;
22
+ removeSubscription: (id: string) => Promise<void>;
23
+ purgeStaleMutation: PurgeStaleMutation;
24
+ repairMutation: RepairMutation;
25
+ purgeExpiredMutation: PurgeExpiredMutation;
26
+ removeSubscriptionMutation: RemoveSubscriptionMutation;
27
+ };
28
+ export declare function useMediaAdmin(): UseMediaAdmin;
29
+ export {};
30
+ //# sourceMappingURL=useMediaAdmin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaAdmin.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaAdmin.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAc/B,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,eAAe,CAAC;AAEvB,KAAK,kBAAkB,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAC/E,KAAK,cAAc,GAAG,iBAAiB,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACxE,KAAK,oBAAoB,GAAG,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAChF,KAAK,0BAA0B,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAE3E,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnC,KAAK,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACnC,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,wBAAwB,GAAG,IAAI,CAAC;IAC/C,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,UAAU,EAAE,MAAM,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9C,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;IACpD,mBAAmB,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACtD,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,kBAAkB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,cAAc,EAAE,cAAc,CAAC;IAC/B,oBAAoB,EAAE,oBAAoB,CAAC;IAC3C,0BAA0B,EAAE,0BAA0B,CAAC;CACxD,CAAC;AAeF,wBAAgB,aAAa,IAAI,aAAa,CA2I7C"}
@@ -0,0 +1,145 @@
1
+ import { useCallback } from "react";
2
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { deleteSubscription, getOrphans, getStaleUploads, getStorageStats, listSubscriptions, purgeExpired, purgeStaleUploads, repairOrphans } from "../api/admin.js";
4
+ import { ForbiddenError } from "../errors.js";
5
+ import { mediaKeys } from "../queryKeys.js";
6
+ import { useMediaContext } from "../react/MediaProvider.js";
7
+ /**
8
+ * Admin operations gated client-side: when the auth adapter already reports a
9
+ * non-superuser, every action rejects with `ForbiddenError` before any request.
10
+ */
11
+ async function refetchOrThrow(refetch) {
12
+ const result = await refetch();
13
+ if (result.error)
14
+ throw result.error;
15
+ if (result.data === undefined)
16
+ throw new Error("No data returned");
17
+ return result.data;
18
+ }
19
+ export function useMediaAdmin() {
20
+ const { isSuperuser } = useMediaContext();
21
+ const queryClient = useQueryClient();
22
+ const guard = useCallback((task) => {
23
+ if (!isSuperuser)
24
+ return Promise.reject(new ForbiddenError());
25
+ return task();
26
+ }, [isSuperuser]);
27
+ const statsQuery = useQuery({
28
+ queryKey: mediaKeys.adminStats(),
29
+ queryFn: () => guard(getStorageStats),
30
+ enabled: false
31
+ });
32
+ const staleQuery = useQuery({
33
+ queryKey: mediaKeys.adminStaleUploads(),
34
+ queryFn: () => guard(getStaleUploads),
35
+ enabled: false
36
+ });
37
+ const orphansQuery = useQuery({
38
+ queryKey: mediaKeys.adminOrphans(),
39
+ queryFn: () => guard(getOrphans),
40
+ enabled: false
41
+ });
42
+ const subscriptionsQuery = useQuery({
43
+ queryKey: mediaKeys.adminSubscriptions(),
44
+ queryFn: () => guard(listSubscriptions),
45
+ enabled: false
46
+ });
47
+ const purgeStaleMutation = useMutation({
48
+ mutationFn: () => guard(purgeStaleUploads),
49
+ onSuccess: async () => {
50
+ await Promise.all([
51
+ queryClient.invalidateQueries({ queryKey: mediaKeys.adminStaleUploads(), exact: true }),
52
+ queryClient.invalidateQueries({ queryKey: mediaKeys.adminStats(), exact: true })
53
+ ]);
54
+ }
55
+ });
56
+ const repairMutation = useMutation({
57
+ mutationFn: (confirm) => guard(() => repairOrphans(confirm)),
58
+ onSuccess: async (report) => {
59
+ queryClient.setQueryData(mediaKeys.adminOrphans(), report);
60
+ await queryClient.invalidateQueries({ queryKey: mediaKeys.adminStats(), exact: true });
61
+ }
62
+ });
63
+ const purgeExpiredMutation = useMutation({
64
+ mutationFn: () => guard(purgeExpired),
65
+ onSuccess: async () => {
66
+ await Promise.all([
67
+ queryClient.invalidateQueries({ queryKey: mediaKeys.adminStats(), exact: true }),
68
+ queryClient.invalidateQueries({ queryKey: mediaKeys.adminOrphans(), exact: true }),
69
+ queryClient.invalidateQueries({ queryKey: mediaKeys.objectLists() })
70
+ ]);
71
+ }
72
+ });
73
+ const removeSubscriptionMutation = useMutation({
74
+ mutationFn: (id) => guard(() => deleteSubscription(id)),
75
+ onSuccess: (_result, id) => {
76
+ queryClient.setQueryData(mediaKeys.adminSubscriptions(), (current) => current
77
+ ? {
78
+ count: Math.max(0, current.count - 1),
79
+ items: current.items.filter((item) => item.id !== id)
80
+ }
81
+ : current);
82
+ }
83
+ });
84
+ const { refetch: refetchStats } = statsQuery;
85
+ const { refetch: refetchStale } = staleQuery;
86
+ const { refetch: refetchOrphans } = orphansQuery;
87
+ const { refetch: refetchSubscriptions } = subscriptionsQuery;
88
+ const { mutateAsync: purgeStaleAsync } = purgeStaleMutation;
89
+ const { mutateAsync: repairAsync } = repairMutation;
90
+ const { mutateAsync: purgeExpiredAsync } = purgeExpiredMutation;
91
+ const { mutateAsync: removeSubscriptionAsync } = removeSubscriptionMutation;
92
+ const loadStats = useCallback(async () => {
93
+ await refetchOrThrow(refetchStats);
94
+ }, [refetchStats]);
95
+ const loadStale = useCallback(async () => {
96
+ await refetchOrThrow(refetchStale);
97
+ }, [refetchStale]);
98
+ const loadOrphans = useCallback(async () => {
99
+ await refetchOrThrow(refetchOrphans);
100
+ }, [refetchOrphans]);
101
+ const loadSubscriptions = useCallback(async () => {
102
+ await refetchOrThrow(refetchSubscriptions);
103
+ }, [refetchSubscriptions]);
104
+ const purgeStale = useCallback(() => purgeStaleAsync(), [purgeStaleAsync]);
105
+ const repair = useCallback((confirm) => repairAsync(confirm), [repairAsync]);
106
+ const purgeExpiredObjects = useCallback(() => purgeExpiredAsync(), [purgeExpiredAsync]);
107
+ const removeSubscription = useCallback((id) => removeSubscriptionAsync(id), [removeSubscriptionAsync]);
108
+ return {
109
+ allowed: isSuperuser,
110
+ stats: statsQuery.data ?? null,
111
+ stale: staleQuery.data ?? null,
112
+ orphans: orphansQuery.data ?? null,
113
+ subscriptions: subscriptionsQuery.data ?? null,
114
+ loading: statsQuery.isFetching ||
115
+ staleQuery.isFetching ||
116
+ orphansQuery.isFetching ||
117
+ subscriptionsQuery.isFetching ||
118
+ purgeStaleMutation.isPending ||
119
+ repairMutation.isPending ||
120
+ purgeExpiredMutation.isPending ||
121
+ removeSubscriptionMutation.isPending,
122
+ error: statsQuery.error ??
123
+ staleQuery.error ??
124
+ orphansQuery.error ??
125
+ subscriptionsQuery.error ??
126
+ purgeStaleMutation.error ??
127
+ repairMutation.error ??
128
+ purgeExpiredMutation.error ??
129
+ removeSubscriptionMutation.error ??
130
+ null,
131
+ loadStats,
132
+ loadStale,
133
+ purgeStale,
134
+ loadOrphans,
135
+ repair,
136
+ purgeExpiredObjects,
137
+ loadSubscriptions,
138
+ removeSubscription,
139
+ purgeStaleMutation,
140
+ repairMutation,
141
+ purgeExpiredMutation,
142
+ removeSubscriptionMutation
143
+ };
144
+ }
145
+ //# sourceMappingURL=useMediaAdmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaAdmin.js","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaAdmin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { type UseMutationResult } from "@tanstack/react-query";
2
+ import type { MediaObjectPublic, MediaObjectUpdate } from "../schemas.js";
3
+ type UpdateObjectMutation = UseMutationResult<MediaObjectPublic, unknown, MediaObjectUpdate>;
4
+ type RemoveObjectMutation = UseMutationResult<void, unknown, void>;
5
+ export type UseMediaObject = {
6
+ object: MediaObjectPublic | null;
7
+ loading: boolean;
8
+ error: unknown;
9
+ reload: () => Promise<void>;
10
+ update: (patch: MediaObjectUpdate) => Promise<MediaObjectPublic>;
11
+ remove: () => Promise<void>;
12
+ updateMutation: UpdateObjectMutation;
13
+ removeMutation: RemoveObjectMutation;
14
+ };
15
+ export declare function useMediaObject(objectId: string | null): UseMediaObject;
16
+ export {};
17
+ //# sourceMappingURL=useMediaObject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaObject.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaObject.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAGtG,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAE1E,KAAK,oBAAoB,GAAG,iBAAiB,CAAC,iBAAiB,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAC7F,KAAK,oBAAoB,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEnE,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACjE,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,cAAc,EAAE,oBAAoB,CAAC;IACrC,cAAc,EAAE,oBAAoB,CAAC;CACtC,CAAC;AAEF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,cAAc,CA0DtE"}
@@ -0,0 +1,62 @@
1
+ import { useCallback } from "react";
2
+ import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
3
+ import { deleteObject, getObject, updateObject } from "../api/objects.js";
4
+ import { mediaKeys } from "../queryKeys.js";
5
+ export function useMediaObject(objectId) {
6
+ const queryClient = useQueryClient();
7
+ const queryKey = mediaKeys.object(objectId ?? "");
8
+ const query = useQuery({
9
+ queryKey,
10
+ queryFn: () => (objectId ? getObject(objectId) : null),
11
+ enabled: Boolean(objectId)
12
+ });
13
+ const updateMutation = useMutation({
14
+ mutationFn: async (patch) => {
15
+ if (!objectId)
16
+ throw new Error("No object selected");
17
+ return updateObject(objectId, patch);
18
+ },
19
+ onSuccess: async (next) => {
20
+ queryClient.setQueryData(queryKey, next);
21
+ await Promise.all([
22
+ queryClient.invalidateQueries({ queryKey, exact: true, refetchType: "none" }),
23
+ queryClient.invalidateQueries({ queryKey: mediaKeys.objectLists() })
24
+ ]);
25
+ }
26
+ });
27
+ const removeMutation = useMutation({
28
+ mutationFn: async () => {
29
+ if (!objectId)
30
+ throw new Error("No object selected");
31
+ await deleteObject(objectId);
32
+ },
33
+ onSuccess: async () => {
34
+ queryClient.setQueryData(queryKey, null);
35
+ await Promise.all([
36
+ queryClient.invalidateQueries({ queryKey, exact: true, refetchType: "none" }),
37
+ queryClient.invalidateQueries({ queryKey: mediaKeys.objectLists() })
38
+ ]);
39
+ }
40
+ });
41
+ const { refetch } = query;
42
+ const { mutateAsync: updateObjectAsync } = updateMutation;
43
+ const { mutateAsync: removeObjectAsync } = removeMutation;
44
+ const reload = useCallback(async () => {
45
+ if (!objectId)
46
+ return;
47
+ await refetch();
48
+ }, [objectId, refetch]);
49
+ const update = useCallback((patch) => updateObjectAsync(patch), [updateObjectAsync]);
50
+ const remove = useCallback(() => removeObjectAsync(), [removeObjectAsync]);
51
+ return {
52
+ object: query.data ?? null,
53
+ loading: query.isFetching,
54
+ error: query.error ?? null,
55
+ reload,
56
+ update,
57
+ remove,
58
+ updateMutation,
59
+ removeMutation
60
+ };
61
+ }
62
+ //# sourceMappingURL=useMediaObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaObject.js","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaObject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { MediaObjectPublic, ObjectListParams } from "../schemas.js";
2
+ export type UseMediaObjects = {
3
+ items: MediaObjectPublic[];
4
+ count: number;
5
+ loading: boolean;
6
+ error: unknown;
7
+ hasMore: boolean;
8
+ refresh: () => Promise<void>;
9
+ loadMore: () => Promise<void>;
10
+ };
11
+ export declare function useMediaObjects(params?: ObjectListParams): UseMediaObjects;
12
+ //# sourceMappingURL=useMediaObjects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaObjects.d.ts","sourceRoot":"","sources":["../../../../src/runtime/hooks/useMediaObjects.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAsB,MAAM,eAAe,CAAC;AAE7F,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B,CAAC;AAkBF,wBAAgB,eAAe,CAAC,MAAM,GAAE,gBAAqB,GAAG,eAAe,CAqF9E"}
@@ -0,0 +1,76 @@
1
+ import { useInfiniteQuery, useQueryClient } from "@tanstack/react-query";
2
+ import { useCallback, useMemo, useRef } from "react";
3
+ import { listObjects } from "../api/objects.js";
4
+ import { mediaKeys } from "../queryKeys.js";
5
+ function listParamsWithoutCursor(params) {
6
+ const next = { ...params };
7
+ delete next.cursor;
8
+ return next;
9
+ }
10
+ function flattenPages(data) {
11
+ return data?.pages.flatMap((page) => page.items) ?? [];
12
+ }
13
+ function latestCount(data) {
14
+ return data?.pages.at(-1)?.count ?? 0;
15
+ }
16
+ export function useMediaObjects(params = {}) {
17
+ const queryClient = useQueryClient();
18
+ const { category, visibility, status, mime_prefix, created_from, created_to, q, sort_by, order, limit, owner_user_id, include_deleted } = params;
19
+ const listParams = useMemo(() => listParamsWithoutCursor({
20
+ category,
21
+ visibility,
22
+ status,
23
+ mime_prefix,
24
+ created_from,
25
+ created_to,
26
+ q,
27
+ sort_by,
28
+ order,
29
+ limit,
30
+ owner_user_id,
31
+ include_deleted
32
+ }), [
33
+ category,
34
+ created_from,
35
+ created_to,
36
+ include_deleted,
37
+ limit,
38
+ mime_prefix,
39
+ order,
40
+ owner_user_id,
41
+ q,
42
+ sort_by,
43
+ status,
44
+ visibility
45
+ ]);
46
+ const queryKey = useMemo(() => mediaKeys.objects(listParams), [listParams]);
47
+ const query = useInfiniteQuery({
48
+ queryKey,
49
+ initialPageParam: null,
50
+ queryFn: ({ pageParam }) => listObjects({ ...listParams, cursor: pageParam ?? undefined }),
51
+ getNextPageParam: (lastPage) => lastPage.next_cursor ?? undefined
52
+ });
53
+ const { fetchNextPage } = query;
54
+ const hasNextPageRef = useRef(query.hasNextPage);
55
+ const isFetchingNextPageRef = useRef(query.isFetchingNextPage);
56
+ hasNextPageRef.current = query.hasNextPage;
57
+ isFetchingNextPageRef.current = query.isFetchingNextPage;
58
+ const refresh = useCallback(async () => {
59
+ await queryClient.resetQueries({ queryKey, exact: true });
60
+ }, [queryClient, queryKey]);
61
+ const loadMore = useCallback(async () => {
62
+ if (!hasNextPageRef.current || isFetchingNextPageRef.current)
63
+ return;
64
+ await fetchNextPage();
65
+ }, [fetchNextPage]);
66
+ return {
67
+ items: flattenPages(query.data),
68
+ count: latestCount(query.data),
69
+ loading: query.isFetching,
70
+ error: query.error ?? null,
71
+ hasMore: query.hasNextPage,
72
+ refresh,
73
+ loadMore
74
+ };
75
+ }
76
+ //# sourceMappingURL=useMediaObjects.js.map