@dyrected/react 2.6.0 → 2.6.2

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.
@@ -0,0 +1,10 @@
1
+ import { type UseMediaURLOptions } from "./useMediaURL";
2
+ export interface UseAddMediaFromUrlOptions extends UseMediaURLOptions {
3
+ }
4
+ /**
5
+ * Backwards-compatible alias for `useMediaURL`.
6
+ *
7
+ * Prefer `useMediaURL` for new code.
8
+ */
9
+ export declare function useAddMediaFromUrl(options: UseAddMediaFromUrlOptions): import("@dyrected/admin/public").MediaURLHookResult;
10
+ //# sourceMappingURL=useAddMediaFromUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAddMediaFromUrl.d.ts","sourceRoot":"","sources":["../../src/hooks/useAddMediaFromUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAErE,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;CAAG;AAExE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,yBAAyB,uDAEpE"}
@@ -0,0 +1,10 @@
1
+ import { useMediaURL } from "./useMediaURL";
2
+ /**
3
+ * Backwards-compatible alias for `useMediaURL`.
4
+ *
5
+ * Prefer `useMediaURL` for new code.
6
+ */
7
+ export function useAddMediaFromUrl(options) {
8
+ return useMediaURL(options);
9
+ }
10
+ //# sourceMappingURL=useAddMediaFromUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAddMediaFromUrl.js","sourceRoot":"","sources":["../../src/hooks/useAddMediaFromUrl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,eAAe,CAAC;AAIrE;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAkC;IACnE,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { AdminSchemasResult } from "@dyrected/admin/public";
2
+ /**
3
+ * Loads the admin schema registry for the current Dyrected client.
4
+ *
5
+ * This is primarily a low-level helper for higher-level admin hooks like
6
+ * `useMediaUpload` and `useMediaLibrary`. You usually won't call it directly
7
+ * unless you are building your own schema-aware UI.
8
+ */
9
+ export declare function useAdminSchemas(): AdminSchemasResult;
10
+ //# sourceMappingURL=useAdminSchemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAdminSchemas.d.ts","sourceRoot":"","sources":["../../src/hooks/useAdminSchemas.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAc/E;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,kBAAkB,CA0DpD"}
@@ -0,0 +1,68 @@
1
+ import * as React from "react";
2
+ import { useDyrected } from "./useDyrected";
3
+ const schemaCache = new WeakMap();
4
+ async function loadSchemas(client) {
5
+ const cached = schemaCache.get(client);
6
+ if (cached)
7
+ return cached;
8
+ const request = client.getSchemas();
9
+ schemaCache.set(client, request);
10
+ return request;
11
+ }
12
+ /**
13
+ * Loads the admin schema registry for the current Dyrected client.
14
+ *
15
+ * This is primarily a low-level helper for higher-level admin hooks like
16
+ * `useMediaUpload` and `useMediaLibrary`. You usually won't call it directly
17
+ * unless you are building your own schema-aware UI.
18
+ */
19
+ export function useAdminSchemas() {
20
+ const { client } = useDyrected();
21
+ const [schemas, setSchemas] = React.useState(null);
22
+ const [isLoading, setIsLoading] = React.useState(false);
23
+ const [error, setError] = React.useState(null);
24
+ const refresh = React.useCallback(async () => {
25
+ let nextSchemas;
26
+ setIsLoading(true);
27
+ setError(null);
28
+ try {
29
+ nextSchemas = await loadSchemas(client);
30
+ }
31
+ catch (nextError) {
32
+ const normalizedError = nextError instanceof Error ? nextError : new Error(String(nextError));
33
+ setError(normalizedError);
34
+ setIsLoading(false);
35
+ throw normalizedError;
36
+ }
37
+ setSchemas((currentSchemas) => (currentSchemas === nextSchemas ? currentSchemas : nextSchemas));
38
+ setIsLoading(false);
39
+ return nextSchemas;
40
+ }, [client]);
41
+ React.useEffect(() => {
42
+ let cancelled = false;
43
+ setIsLoading(true);
44
+ setError(null);
45
+ loadSchemas(client).then((nextSchemas) => {
46
+ if (cancelled)
47
+ return;
48
+ setSchemas((currentSchemas) => (currentSchemas === nextSchemas ? currentSchemas : nextSchemas));
49
+ setIsLoading(false);
50
+ }, (nextError) => {
51
+ if (cancelled)
52
+ return;
53
+ const normalizedError = nextError instanceof Error ? nextError : new Error(String(nextError));
54
+ setError(normalizedError);
55
+ setIsLoading(false);
56
+ });
57
+ return () => {
58
+ cancelled = true;
59
+ };
60
+ }, [client]);
61
+ return {
62
+ schemas,
63
+ isLoading,
64
+ error,
65
+ refresh,
66
+ };
67
+ }
68
+ //# sourceMappingURL=useAdminSchemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAdminSchemas.js","sourceRoot":"","sources":["../../src/hooks/useAdminSchemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type MediaLibraryHookOptions, type MediaLibraryHookResult } from "@dyrected/admin/public";
2
+ export type UseMediaLibraryOptions = MediaLibraryHookOptions;
3
+ /**
4
+ * React hook for browsing and selecting media records from the Dyrected media library.
5
+ *
6
+ * This hook powers custom pickers, thumbnail choosers, and media drawers
7
+ * without requiring consumers to implement pagination, search, or selection
8
+ * state themselves.
9
+ */
10
+ export declare function useMediaLibrary({ collection, pageSize, initialSearchQuery, initialSelectedIds, }: UseMediaLibraryOptions): MediaLibraryHookResult;
11
+ //# sourceMappingURL=useMediaLibrary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaLibrary.d.ts","sourceRoot":"","sources":["../../src/hooks/useMediaLibrary.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAE5B,MAAM,wBAAwB,CAAC;AAIhC,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAAA;AAE5D;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,EAC9B,UAAU,EACV,QAAa,EACb,kBAAuB,EACvB,kBAAuB,GACxB,EAAE,sBAAsB,GAAG,sBAAsB,CA2CjD"}
@@ -0,0 +1,42 @@
1
+ import * as React from "react";
2
+ import { createMediaLibraryController, } from "@dyrected/admin/public";
3
+ import { useDyrected } from "./useDyrected";
4
+ import { useAdminSchemas } from "./useAdminSchemas";
5
+ /**
6
+ * React hook for browsing and selecting media records from the Dyrected media library.
7
+ *
8
+ * This hook powers custom pickers, thumbnail choosers, and media drawers
9
+ * without requiring consumers to implement pagination, search, or selection
10
+ * state themselves.
11
+ */
12
+ export function useMediaLibrary({ collection, pageSize = 12, initialSearchQuery = "", initialSelectedIds = [], }) {
13
+ const { client } = useDyrected();
14
+ const { schemas } = useAdminSchemas();
15
+ const selectedIdsKey = React.useMemo(() => initialSelectedIds.join("|"), [initialSelectedIds]);
16
+ const controller = React.useMemo(() => {
17
+ return createMediaLibraryController({
18
+ client,
19
+ schemas,
20
+ collection,
21
+ pageSize,
22
+ initialSearchQuery,
23
+ initialSelectedIds,
24
+ });
25
+ }, [client, schemas, collection, pageSize, initialSearchQuery, selectedIdsKey]);
26
+ const state = React.useSyncExternalStore(controller.subscribe, controller.getState, controller.getState);
27
+ const selectedItems = React.useMemo(() => state.items.filter((item) => state.selectedIds.includes(item.id)), [state.items, state.selectedIds]);
28
+ return {
29
+ ...state,
30
+ load: controller.load,
31
+ search: controller.search,
32
+ loadNextPage: controller.loadNextPage,
33
+ setSelectedIds: controller.setSelectedIds,
34
+ select: controller.select,
35
+ deselect: controller.deselect,
36
+ toggle: controller.toggle,
37
+ clearSelection: controller.clearSelection,
38
+ selectedItems,
39
+ controller,
40
+ };
41
+ }
42
+ //# sourceMappingURL=useMediaLibrary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaLibrary.js","sourceRoot":"","sources":["../../src/hooks/useMediaLibrary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,4BAA4B,GAK7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,UAAU,EACV,QAAQ,GAAG,EAAE,EACb,kBAAkB,GAAG,EAAE,EACvB,kBAAkB,GAAG,EAAE,GACA;IACvB,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACjC,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,CAClC,GAAG,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAClC,CAAC,kBAAkB,CAAC,CACrB,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAyB,GAAG,EAAE;QAC5D,OAAO,4BAA4B,CAAC;YAClC,MAAM;YACN,OAAO;YACP,UAAU;YACV,QAAQ;YACR,kBAAkB;YAClB,kBAAkB;SACnB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,kBAAkB,EAAE,cAAc,CAAC,CAAC,CAAC;IAEhF,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CACtC,UAAU,CAAC,SAAS,EACpB,UAAU,CAAC,QAAQ,EACnB,UAAU,CAAC,QAAQ,CACpB,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CACjC,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EACvE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CACjC,CAAC;IAEF,OAAO;QACL,GAAG,KAAK;QACR,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,aAAa;QACb,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type MediaURLHookOptions, type MediaURLHookResult } from "@dyrected/admin/public";
2
+ export type UseMediaURLOptions = MediaURLHookOptions;
3
+ /**
4
+ * React hook for Dyrected's URL-based media ingestion flow.
5
+ *
6
+ * It classifies YouTube/Vimeo links, direct images, videos, and generic files,
7
+ * then routes each URL through the same shared ingestion behavior used by the
8
+ * admin app.
9
+ */
10
+ export declare function useMediaURL({ collection, compressImages, maxDimension, quality, onAdded, onError, }: UseMediaURLOptions): MediaURLHookResult;
11
+ //# sourceMappingURL=useMediaURL.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaURL.d.ts","sourceRoot":"","sources":["../../src/hooks/useMediaURL.ts"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACxB,MAAM,wBAAwB,CAAC;AAIhC,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,CAAA;AAEpD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,UAAU,EACV,cAAqB,EACrB,YAAmB,EACnB,OAAc,EACd,OAAO,EACP,OAAO,GACR,EAAE,kBAAkB,GAAG,kBAAkB,CA2DzC"}
@@ -0,0 +1,64 @@
1
+ import * as React from "react";
2
+ import { createMediaURLController, } from "@dyrected/admin/public";
3
+ import { useDyrected } from "./useDyrected";
4
+ import { useAdminSchemas } from "./useAdminSchemas";
5
+ /**
6
+ * React hook for Dyrected's URL-based media ingestion flow.
7
+ *
8
+ * It classifies YouTube/Vimeo links, direct images, videos, and generic files,
9
+ * then routes each URL through the same shared ingestion behavior used by the
10
+ * admin app.
11
+ */
12
+ export function useMediaURL({ collection, compressImages = true, maxDimension = 2048, quality = 0.85, onAdded, onError, }) {
13
+ const { client } = useDyrected();
14
+ const { schemas } = useAdminSchemas();
15
+ const [url, setUrl] = React.useState("");
16
+ const handlersRef = React.useRef({ onAdded, onError });
17
+ handlersRef.current = { onAdded, onError };
18
+ const controller = React.useMemo(() => {
19
+ return createMediaURLController({
20
+ client,
21
+ schemas,
22
+ collection,
23
+ compressImages,
24
+ maxDimension,
25
+ quality,
26
+ onAdded: async (item) => {
27
+ await handlersRef.current.onAdded?.(item);
28
+ },
29
+ onError: (error) => {
30
+ handlersRef.current.onError?.(error);
31
+ },
32
+ });
33
+ }, [client, schemas, collection, compressImages, maxDimension, quality]);
34
+ const state = React.useSyncExternalStore(controller.subscribe, controller.getState, controller.getState);
35
+ const submit = React.useCallback(async () => {
36
+ const trimmed = url.trim();
37
+ if (!trimmed)
38
+ return;
39
+ await controller.importURL(trimmed);
40
+ setUrl("");
41
+ }, [controller, url]);
42
+ const classifyURL = React.useCallback((nextUrl) => controller.classifyURL(nextUrl), [controller]);
43
+ return {
44
+ /** The URL to import. */
45
+ url,
46
+ /** Set the URL to import. */
47
+ setUrl,
48
+ /** Import the URL. */
49
+ submit,
50
+ /** Import the URL. */
51
+ importURL: controller.importURL,
52
+ /** Classify the URL. */
53
+ classifyURL,
54
+ /** Whether the URL is submitting. */
55
+ isSubmitting: state.isSubmitting,
56
+ /** Whether the URL can be submitted. */
57
+ canSubmit: !!url.trim() && !state.isSubmitting,
58
+ /** The active collection. */
59
+ activeCollection: state.activeCollection,
60
+ /** The controller instance. */
61
+ controller,
62
+ };
63
+ }
64
+ //# sourceMappingURL=useMediaURL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaURL.js","sourceRoot":"","sources":["../../src/hooks/useMediaURL.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,wBAAwB,GAKzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,UAAU,EACV,cAAc,GAAG,IAAI,EACrB,YAAY,GAAG,IAAI,EACnB,OAAO,GAAG,IAAI,EACd,OAAO,EACP,OAAO,GACY;IACnB,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACjC,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAEvD,WAAW,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IAE3C,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAqB,GAAG,EAAE;QACxD,OAAO,wBAAwB,CAAC;YAC9B,MAAM;YACN,OAAO;YACP,UAAU;YACV,cAAc;YACd,YAAY;YACZ,OAAO;YACP,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACtB,MAAM,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;SACF,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzE,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEzG,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,CAAC,CAAC;IACb,CAAC,EAAE,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC;IAEtB,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CACnC,CAAC,OAAe,EAA0B,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAC5E,CAAC,UAAU,CAAC,CACb,CAAC;IAEF,OAAO;QACL,yBAAyB;QACzB,GAAG;QACH,6BAA6B;QAC7B,MAAM;QACN,sBAAsB;QACtB,MAAM;QACN,sBAAsB;QACtB,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,wBAAwB;QACxB,WAAW;QACX,qCAAqC;QACrC,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,wCAAwC;QACxC,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY;QAC9C,6BAA6B;QAC7B,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,+BAA+B;QAC/B,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type MediaUploadHookOptions, type MediaUploadHookResult } from "@dyrected/admin/public";
2
+ export type UseMediaUploadOptions = MediaUploadHookOptions;
3
+ /**
4
+ * React hook for Dyrected's shared media upload pipeline.
5
+ *
6
+ * Use this when you want to build a custom upload UI in React while keeping the
7
+ * same queueing, image compression, progress tracking, and collection fallback
8
+ * behavior used by the admin app.
9
+ */
10
+ export declare function useMediaUpload({ collectionSlug, compressImages, maxDimension, quality, onCompletedItem, onAllCompleted, onError, }?: UseMediaUploadOptions): MediaUploadHookResult;
11
+ //# sourceMappingURL=useMediaUpload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaUpload.d.ts","sourceRoot":"","sources":["../../src/hooks/useMediaUpload.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,wBAAwB,CAAC;AAIhC,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,CAAA;AAE1D;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,EAC7B,cAAwB,EACxB,cAAqB,EACrB,YAAmB,EACnB,OAAc,EACd,eAAe,EACf,cAAc,EACd,OAAO,GACR,GAAE,qBAA0B,GAAG,qBAAqB,CAyDpD"}
@@ -0,0 +1,66 @@
1
+ import * as React from "react";
2
+ import { createMediaUploadController, } from "@dyrected/admin/public";
3
+ import { useDyrected } from "./useDyrected";
4
+ import { useAdminSchemas } from "./useAdminSchemas";
5
+ /**
6
+ * React hook for Dyrected's shared media upload pipeline.
7
+ *
8
+ * Use this when you want to build a custom upload UI in React while keeping the
9
+ * same queueing, image compression, progress tracking, and collection fallback
10
+ * behavior used by the admin app.
11
+ */
12
+ export function useMediaUpload({ collectionSlug = "media", compressImages = true, maxDimension = 2048, quality = 0.85, onCompletedItem, onAllCompleted, onError, } = {}) {
13
+ const { client } = useDyrected();
14
+ const { schemas } = useAdminSchemas();
15
+ const handlersRef = React.useRef({
16
+ onCompletedItem,
17
+ onAllCompleted,
18
+ onError,
19
+ });
20
+ handlersRef.current = {
21
+ onCompletedItem,
22
+ onAllCompleted,
23
+ onError,
24
+ };
25
+ const controller = React.useMemo(() => {
26
+ return createMediaUploadController({
27
+ client,
28
+ schemas,
29
+ collection: collectionSlug,
30
+ compressImages,
31
+ maxDimension,
32
+ quality,
33
+ onCompletedItem: async (item) => {
34
+ await handlersRef.current.onCompletedItem?.(item);
35
+ },
36
+ onAllCompleted: async (items) => {
37
+ await handlersRef.current.onAllCompleted?.(items);
38
+ },
39
+ onError: (error, file) => {
40
+ handlersRef.current.onError?.(error, file);
41
+ },
42
+ });
43
+ }, [client, schemas, collectionSlug, compressImages, maxDimension, quality]);
44
+ const state = React.useSyncExternalStore(controller.subscribe, controller.getState, controller.getState);
45
+ return {
46
+ /** The queue of files waiting to be uploaded. */
47
+ queue: state.queue,
48
+ /** Whether the queue is currently uploading. */
49
+ isUploading: state.isUploading,
50
+ /** The collection currently being uploaded to. */
51
+ activeCollection: state.activeCollection,
52
+ /** Upload files. */
53
+ uploadFiles: controller.uploadFiles,
54
+ /** Retry a failed upload. */
55
+ retryUpload: controller.retryUpload,
56
+ /** Remove an item from the queue. */
57
+ removeQueueItem: controller.removeQueueItem,
58
+ /** Clear completed items from the queue. */
59
+ clearCompleted: controller.clearCompleted,
60
+ /** Clear the entire queue. */
61
+ clearQueue: controller.clearCompleted,
62
+ /** The controller instance. */
63
+ controller,
64
+ };
65
+ }
66
+ //# sourceMappingURL=useMediaUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMediaUpload.js","sourceRoot":"","sources":["../../src/hooks/useMediaUpload.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EACL,2BAA2B,GAI5B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,EAC7B,cAAc,GAAG,OAAO,EACxB,cAAc,GAAG,IAAI,EACrB,YAAY,GAAG,IAAI,EACnB,OAAO,GAAG,IAAI,EACd,eAAe,EACf,cAAc,EACd,OAAO,MACkB,EAAE;IAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACjC,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,EAAE,CAAC;IACtC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC;QAC/B,eAAe;QACf,cAAc;QACd,OAAO;KACR,CAAC,CAAC;IAEH,WAAW,CAAC,OAAO,GAAG;QACpB,eAAe;QACf,cAAc;QACd,OAAO;KACR,CAAC;IAEF,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAwB,GAAG,EAAE;QAC3D,OAAO,2BAA2B,CAAC;YACjC,MAAM;YACN,OAAO;YACP,UAAU,EAAE,cAAc;YAC1B,cAAc;YACd,YAAY;YACZ,OAAO;YACP,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC9B,MAAM,WAAW,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC;YACpD,CAAC;YACD,cAAc,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC9B,MAAM,WAAW,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;YACD,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC7C,CAAC;SACF,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAE7E,MAAM,KAAK,GAAG,KAAK,CAAC,oBAAoB,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEzG,OAAO;QACL,iDAAiD;QACjD,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,gDAAgD;QAChD,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,kDAAkD;QAClD,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,oBAAoB;QACpB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,6BAA6B;QAC7B,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,qCAAqC;QACrC,eAAe,EAAE,UAAU,CAAC,eAAe;QAC3C,4CAA4C;QAC5C,cAAc,EAAE,UAAU,CAAC,cAAc;QACzC,8BAA8B;QAC9B,UAAU,EAAE,UAAU,CAAC,cAAc;QACrC,+BAA+B;QAC/B,UAAU;KACX,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,11 @@
1
1
  export * from './hooks/useLivePreview';
2
2
  export * from './hooks/useDyrected';
3
3
  export * from './hooks/useDyPath';
4
+ export * from './hooks/useAdminSchemas';
5
+ export * from './hooks/useMediaUpload';
6
+ export * from './hooks/useMediaLibrary';
7
+ export * from './hooks/useMediaURL';
8
+ export * from './hooks/useAddMediaFromUrl';
4
9
  export * from './providers/DyrectedProvider';
5
10
  export * from './providers/DyPathProvider';
6
11
  export * from './components/DyrectedImage';
@@ -8,6 +13,8 @@ export * from './components/DyrectedMedia';
8
13
  export * from './components/DyrectedIcon';
9
14
  export * from './components/DyrectedRichText';
10
15
  export * from './components/Blocks';
16
+ export { AdminThemeProvider, AdminThemedRoot, DyrectedFieldPathProvider, DyrectedFormProvider, useAdminTheme, useDyrectedForm, useField, } from '@dyrected/admin/public';
17
+ export type { AdminThemePreference, ResolvedAdminTheme, DyrectedFieldPathProviderProps, DyrectedFormProviderProps, } from '@dyrected/admin/public';
11
18
  export { DyrectedClient, DyrectedError, getPreviewToken, PREVIEW_TOKEN_PARAM } from '@dyrected/sdk';
12
19
  export type { CollectionConfig, GlobalConfig } from '@dyrected/sdk';
13
20
  export type { Register, RegisteredSchema, BaseSchema, InferSchema } from '@dyrected/sdk';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AAGpC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpG,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIpE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,QAAQ,GACT,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACpG,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIpE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,11 @@
1
1
  export * from './hooks/useLivePreview';
2
2
  export * from './hooks/useDyrected';
3
3
  export * from './hooks/useDyPath';
4
+ export * from './hooks/useAdminSchemas';
5
+ export * from './hooks/useMediaUpload';
6
+ export * from './hooks/useMediaLibrary';
7
+ export * from './hooks/useMediaURL';
8
+ export * from './hooks/useAddMediaFromUrl';
4
9
  export * from './providers/DyrectedProvider';
5
10
  export * from './providers/DyPathProvider';
6
11
  export * from './components/DyrectedImage';
@@ -8,6 +13,7 @@ export * from './components/DyrectedMedia';
8
13
  export * from './components/DyrectedIcon';
9
14
  export * from './components/DyrectedRichText';
10
15
  export * from './components/Blocks';
16
+ export { AdminThemeProvider, AdminThemedRoot, DyrectedFieldPathProvider, DyrectedFormProvider, useAdminTheme, useDyrectedForm, useField, } from '@dyrected/admin/public';
11
17
  // Re-export core types and errors from SDK for convenience
12
18
  export { DyrectedClient, DyrectedError, getPreviewToken, PREVIEW_TOKEN_PARAM } from '@dyrected/sdk';
13
19
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AAEpC,2DAA2D;AAC3D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qBAAqB,CAAC;AACpC,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,oBAAoB,EACpB,aAAa,EACb,eAAe,EACf,QAAQ,GACT,MAAM,wBAAwB,CAAC;AAQhC,2DAA2D;AAC3D,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dyrected/react",
3
- "version": "2.6.0",
3
+ "version": "2.6.2",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -23,9 +23,9 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "lucide-react": "^1.14.0",
26
- "@dyrected/admin": "2.6.0",
27
- "@dyrected/core": "2.6.0",
28
- "@dyrected/sdk": "2.6.0"
26
+ "@dyrected/admin": "2.6.2",
27
+ "@dyrected/core": "2.6.2",
28
+ "@dyrected/sdk": "2.6.2"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/node": "^20.12.12",