@embedpdf/plugin-view-manager 2.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.cjs +2 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.js +549 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/actions.d.ts +61 -0
  8. package/dist/lib/index.d.ts +9 -0
  9. package/dist/lib/manifest.d.ts +4 -0
  10. package/dist/lib/reducer.d.ts +5 -0
  11. package/dist/lib/types.d.ts +66 -0
  12. package/dist/lib/view-manager-plugin.d.ts +43 -0
  13. package/dist/preact/adapter.d.ts +5 -0
  14. package/dist/preact/core.d.ts +1 -0
  15. package/dist/preact/index.cjs +2 -0
  16. package/dist/preact/index.cjs.map +1 -0
  17. package/dist/preact/index.d.ts +1 -0
  18. package/dist/preact/index.js +141 -0
  19. package/dist/preact/index.js.map +1 -0
  20. package/dist/react/adapter.d.ts +2 -0
  21. package/dist/react/core.d.ts +1 -0
  22. package/dist/react/index.cjs +2 -0
  23. package/dist/react/index.cjs.map +1 -0
  24. package/dist/react/index.d.ts +1 -0
  25. package/dist/react/index.js +140 -0
  26. package/dist/react/index.js.map +1 -0
  27. package/dist/shared/components/index.d.ts +1 -0
  28. package/dist/shared/components/view-context.d.ts +23 -0
  29. package/dist/shared/hooks/index.d.ts +1 -0
  30. package/dist/shared/hooks/use-view-manager.d.ts +25 -0
  31. package/dist/shared/index.d.ts +3 -0
  32. package/dist/shared-preact/components/index.d.ts +1 -0
  33. package/dist/shared-preact/components/view-context.d.ts +23 -0
  34. package/dist/shared-preact/hooks/index.d.ts +1 -0
  35. package/dist/shared-preact/hooks/use-view-manager.d.ts +25 -0
  36. package/dist/shared-preact/index.d.ts +3 -0
  37. package/dist/shared-react/components/index.d.ts +1 -0
  38. package/dist/shared-react/components/view-context.d.ts +23 -0
  39. package/dist/shared-react/hooks/index.d.ts +1 -0
  40. package/dist/shared-react/hooks/use-view-manager.d.ts +25 -0
  41. package/dist/shared-react/index.d.ts +3 -0
  42. package/dist/svelte/components/ViewContext.svelte.d.ts +10 -0
  43. package/dist/svelte/components/index.d.ts +2 -0
  44. package/dist/svelte/components/types.d.ts +12 -0
  45. package/dist/svelte/hooks/index.d.ts +1 -0
  46. package/dist/svelte/hooks/use-view-manager.svelte.d.ts +30 -0
  47. package/dist/svelte/index.cjs +2 -0
  48. package/dist/svelte/index.cjs.map +1 -0
  49. package/dist/svelte/index.d.ts +3 -0
  50. package/dist/svelte/index.js +202 -0
  51. package/dist/svelte/index.js.map +1 -0
  52. package/dist/vue/components/index.d.ts +2 -0
  53. package/dist/vue/components/view-context.vue.d.ts +31 -0
  54. package/dist/vue/hooks/index.d.ts +1 -0
  55. package/dist/vue/hooks/use-view-manager.d.ts +39 -0
  56. package/dist/vue/index.cjs +2 -0
  57. package/dist/vue/index.cjs.map +1 -0
  58. package/dist/vue/index.d.ts +3 -0
  59. package/dist/vue/index.js +197 -0
  60. package/dist/vue/index.js.map +1 -0
  61. package/package.json +82 -0
@@ -0,0 +1,61 @@
1
+ import { Action } from '@embedpdf/core';
2
+ export declare const CREATE_VIEW = "CREATE_VIEW";
3
+ export declare const REMOVE_VIEW = "REMOVE_VIEW";
4
+ export declare const ADD_DOCUMENT_TO_VIEW = "ADD_DOCUMENT_TO_VIEW";
5
+ export declare const REMOVE_DOCUMENT_FROM_VIEW = "REMOVE_DOCUMENT_FROM_VIEW";
6
+ export declare const MOVE_DOCUMENT_WITHIN_VIEW = "MOVE_DOCUMENT_WITHIN_VIEW";
7
+ export declare const SET_VIEW_ACTIVE_DOCUMENT = "SET_VIEW_ACTIVE_DOCUMENT";
8
+ export declare const SET_FOCUSED_VIEW = "SET_FOCUSED_VIEW";
9
+ export interface CreateViewAction extends Action {
10
+ type: typeof CREATE_VIEW;
11
+ payload: {
12
+ viewId: string;
13
+ createdAt: number;
14
+ };
15
+ }
16
+ export interface RemoveViewAction extends Action {
17
+ type: typeof REMOVE_VIEW;
18
+ payload: string;
19
+ }
20
+ export interface AddDocumentToViewAction extends Action {
21
+ type: typeof ADD_DOCUMENT_TO_VIEW;
22
+ payload: {
23
+ viewId: string;
24
+ documentId: string;
25
+ index?: number;
26
+ };
27
+ }
28
+ export interface RemoveDocumentFromViewAction extends Action {
29
+ type: typeof REMOVE_DOCUMENT_FROM_VIEW;
30
+ payload: {
31
+ viewId: string;
32
+ documentId: string;
33
+ };
34
+ }
35
+ export interface MoveDocumentWithinViewAction extends Action {
36
+ type: typeof MOVE_DOCUMENT_WITHIN_VIEW;
37
+ payload: {
38
+ viewId: string;
39
+ documentId: string;
40
+ toIndex: number;
41
+ };
42
+ }
43
+ export interface SetViewActiveDocumentAction extends Action {
44
+ type: typeof SET_VIEW_ACTIVE_DOCUMENT;
45
+ payload: {
46
+ viewId: string;
47
+ documentId: string | null;
48
+ };
49
+ }
50
+ export interface SetFocusedViewAction extends Action {
51
+ type: typeof SET_FOCUSED_VIEW;
52
+ payload: string | null;
53
+ }
54
+ export type ViewManagerAction = CreateViewAction | RemoveViewAction | AddDocumentToViewAction | RemoveDocumentFromViewAction | MoveDocumentWithinViewAction | SetViewActiveDocumentAction | SetFocusedViewAction;
55
+ export declare function createView(viewId: string, createdAt: number): CreateViewAction;
56
+ export declare function removeView(viewId: string): RemoveViewAction;
57
+ export declare function addDocumentToView(viewId: string, documentId: string, index?: number): AddDocumentToViewAction;
58
+ export declare function removeDocumentFromView(viewId: string, documentId: string): RemoveDocumentFromViewAction;
59
+ export declare function moveDocumentWithinView(viewId: string, documentId: string, toIndex: number): MoveDocumentWithinViewAction;
60
+ export declare function setViewActiveDocument(viewId: string, documentId: string | null): SetViewActiveDocumentAction;
61
+ export declare function setFocusedView(viewId: string | null): SetFocusedViewAction;
@@ -0,0 +1,9 @@
1
+ import { PluginPackage } from '@embedpdf/core';
2
+ import { ViewManagerPlugin } from './view-manager-plugin';
3
+ import { ViewManagerPluginConfig, ViewManagerState } from './types';
4
+ import { ViewManagerAction } from './actions';
5
+ export declare const ViewManagerPluginPackage: PluginPackage<ViewManagerPlugin, ViewManagerPluginConfig, ViewManagerState, ViewManagerAction>;
6
+ export * from './view-manager-plugin';
7
+ export * from './types';
8
+ export * from './manifest';
9
+ export * from './actions';
@@ -0,0 +1,4 @@
1
+ import { PluginManifest } from '@embedpdf/core';
2
+ import { ViewManagerPluginConfig } from './types';
3
+ export declare const VIEW_MANAGER_PLUGIN_ID = "view-manager";
4
+ export declare const manifest: PluginManifest<ViewManagerPluginConfig>;
@@ -0,0 +1,5 @@
1
+ import { Reducer } from '@embedpdf/core';
2
+ import { ViewManagerState } from './types';
3
+ import { ViewManagerAction } from './actions';
4
+ export declare const initialState: ViewManagerState;
5
+ export declare const viewManagerReducer: Reducer<ViewManagerState, ViewManagerAction>;
@@ -0,0 +1,66 @@
1
+ import { BasePluginConfig, EventHook, DocumentState } from '@embedpdf/core';
2
+ export interface ViewManagerPluginConfig extends BasePluginConfig {
3
+ defaultViewCount?: number;
4
+ }
5
+ export interface View {
6
+ id: string;
7
+ documentIds: string[];
8
+ activeDocumentId: string | null;
9
+ createdAt: number;
10
+ }
11
+ export interface ViewManagerState {
12
+ views: Record<string, View>;
13
+ viewOrder: string[];
14
+ focusedViewId: string | null;
15
+ }
16
+ export interface ViewChangeEvent {
17
+ previousViewId: string | null;
18
+ currentViewId: string | null;
19
+ }
20
+ export interface ViewDocumentAddedEvent {
21
+ viewId: string;
22
+ documentId: string;
23
+ index: number;
24
+ }
25
+ export interface ViewDocumentRemovedEvent {
26
+ viewId: string;
27
+ documentId: string;
28
+ }
29
+ export interface ViewDocumentReorderedEvent {
30
+ viewId: string;
31
+ documentId: string;
32
+ fromIndex: number;
33
+ toIndex: number;
34
+ }
35
+ export interface ViewActiveDocumentChangedEvent {
36
+ viewId: string;
37
+ previousDocumentId: string | null;
38
+ currentDocumentId: string | null;
39
+ }
40
+ export interface ViewManagerCapability {
41
+ createView(viewId?: string): string;
42
+ removeView(viewId: string): void;
43
+ getAllViews(): View[];
44
+ getViewCount(): number;
45
+ addDocumentToView(viewId: string, documentId: string, index?: number): void;
46
+ removeDocumentFromView(viewId: string, documentId: string): void;
47
+ moveDocumentWithinView(viewId: string, documentId: string, toIndex: number): void;
48
+ moveDocumentBetweenViews(fromViewId: string, toViewId: string, documentId: string, toIndex?: number): void;
49
+ setViewActiveDocument(viewId: string, documentId: string | null): void;
50
+ setFocusedView(viewId: string): void;
51
+ getFocusedViewId(): string | null;
52
+ getFocusedView(): View | null;
53
+ getView(viewId: string): View | null;
54
+ getViewDocuments(viewId: string): string[];
55
+ getViewActiveDocument(viewId: string): string | null;
56
+ getDocumentView(documentId: string): string | null;
57
+ isDocumentInAnyView(documentId: string): boolean;
58
+ getUnassignedDocuments(documentStates: DocumentState[]): DocumentState[];
59
+ onViewCreated: EventHook<string>;
60
+ onViewRemoved: EventHook<string>;
61
+ onViewFocusChanged: EventHook<ViewChangeEvent>;
62
+ onDocumentAddedToView: EventHook<ViewDocumentAddedEvent>;
63
+ onDocumentRemovedFromView: EventHook<ViewDocumentRemovedEvent>;
64
+ onDocumentReordered: EventHook<ViewDocumentReorderedEvent>;
65
+ onViewActiveDocumentChanged: EventHook<ViewActiveDocumentChangedEvent>;
66
+ }
@@ -0,0 +1,43 @@
1
+ import { BasePlugin, PluginRegistry } from '@embedpdf/core';
2
+ import { ViewManagerPluginConfig, ViewManagerState, ViewManagerCapability } from './types';
3
+ import { ViewManagerAction } from './actions';
4
+ export declare class ViewManagerPlugin extends BasePlugin<ViewManagerPluginConfig, ViewManagerCapability, ViewManagerState, ViewManagerAction> {
5
+ readonly id: string;
6
+ static readonly id: "view-manager";
7
+ private readonly viewCreated$;
8
+ private readonly viewRemoved$;
9
+ private readonly viewFocusChanged$;
10
+ private readonly documentAddedToView$;
11
+ private readonly documentRemovedFromView$;
12
+ private readonly documentReordered$;
13
+ private readonly viewActiveDocumentChanged$;
14
+ private docManagerCapability?;
15
+ constructor(id: string, registry: PluginRegistry, config?: ViewManagerPluginConfig);
16
+ protected buildCapability(): ViewManagerCapability;
17
+ initialize(config: ViewManagerPluginConfig): Promise<void>;
18
+ destroy(): Promise<void>;
19
+ private createView;
20
+ private removeView;
21
+ private addDocumentToView;
22
+ private removeDocumentFromView;
23
+ private moveDocumentWithinView;
24
+ private moveDocumentBetweenViews;
25
+ private setViewActiveDocument;
26
+ private getViewDocuments;
27
+ private getViewActiveDocument;
28
+ private getDocumentView;
29
+ private isDocumentInAnyView;
30
+ private getUnassignedDocuments;
31
+ private setFocusedView;
32
+ private getView;
33
+ private getFocusedView;
34
+ private getAllViews;
35
+ private getViewCount;
36
+ /**
37
+ * Calculate the next active document when removing a document from a view
38
+ * Returns undefined if the document being removed is not the active document
39
+ * Returns the next document ID (left first, then right) or null if no documents remain
40
+ */
41
+ private calculateNextActiveDocumentInView;
42
+ private generateViewId;
43
+ }
@@ -0,0 +1,5 @@
1
+ export { Fragment } from 'preact';
2
+ export { useEffect, useRef, useState, useCallback, useMemo, useLayoutEffect } from 'preact/hooks';
3
+ export type { ComponentChildren as ReactNode } from 'preact';
4
+ export type CSSProperties = import('preact').JSX.CSSProperties;
5
+ export type HTMLAttributes<T = any> = import('preact').JSX.HTMLAttributes<T extends EventTarget ? T : never>;
@@ -0,0 +1 @@
1
+ export * from '@embedpdf/core/preact';
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("preact/jsx-runtime");require("preact");const t=require("preact/hooks"),o=require("@embedpdf/core/preact"),i=require("@embedpdf/plugin-view-manager"),n=()=>o.useCapability(i.ViewManagerPlugin.id);exports.ViewContext=function({viewId:o,autoCreate:i=!0,children:u}){const{provides:r}=n(),[d,c]=t.useState(null),[s,w]=t.useState(!1);return t.useEffect(()=>{if(!r)return;let e=r.getView(o);!e&&i&&(r.createView(o),e=r.getView(o)),c(e),w(r.getFocusedViewId()===o);const t=r.onViewFocusChanged(e=>{w(e.currentViewId===o)}),n=r.onDocumentAddedToView(e=>{e.viewId===o&&c(r.getView(o))}),u=r.onDocumentRemovedFromView(e=>{e.viewId===o&&c(r.getView(o))}),d=r.onViewActiveDocumentChanged(e=>{e.viewId===o&&c(r.getView(o))});return()=>{t(),n(),u(),d()}},[o,i,r]),d?e.jsx(e.Fragment,{children:u({view:d,documentIds:d.documentIds,activeDocumentId:d.activeDocumentId,isFocused:s,addDocument:(e,t)=>null==r?void 0:r.addDocumentToView(o,e,t),removeDocument:e=>null==r?void 0:r.removeDocumentFromView(o,e),setActiveDocument:e=>null==r?void 0:r.setViewActiveDocument(o,e),moveDocumentWithinView:(e,t)=>null==r?void 0:r.moveDocumentWithinView(o,e,t),focus:()=>null==r?void 0:r.setFocusedView(o)})}):null},exports.useAllViews=()=>{const{provides:e}=n(),[o,i]=t.useState([]);return t.useEffect(()=>{if(!e)return;const t=()=>{i(e.getAllViews())};t();const o=e.onViewCreated(t),n=e.onViewRemoved(t),u=e.onDocumentAddedToView(t),r=e.onDocumentRemovedFromView(t),d=e.onDocumentReordered(t),c=e.onViewActiveDocumentChanged(t);return()=>{o(),n(),u(),r(),d(),c()}},[e]),o},exports.useFocusedView=()=>{const{provides:e}=n(),[o,i]=t.useState(null);return t.useEffect(()=>{if(e)return i(e.getFocusedViewId()),e.onViewFocusChanged(e=>{i(e.currentViewId)})},[e]),{focusedViewId:o}},exports.useView=e=>{const{provides:o}=n(),[i,u]=t.useState(null);return t.useEffect(()=>{if(!o)return;u(o.getView(e));const t=o.onDocumentAddedToView(t=>{t.viewId===e&&u(o.getView(e))}),i=o.onDocumentRemovedFromView(t=>{t.viewId===e&&u(o.getView(e))}),n=o.onDocumentReordered(t=>{t.viewId===e&&u(o.getView(e))}),r=o.onViewActiveDocumentChanged(t=>{t.viewId===e&&u(o.getView(e))});return()=>{t(),i(),n(),r()}},[e,o]),i},exports.useViewManagerCapability=n,exports.useViewManagerPlugin=()=>o.usePlugin(i.ViewManagerPlugin.id),Object.keys(i).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>i[e]})});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-view-manager.ts","../../src/shared/components/view-context.tsx"],"sourcesContent":["import { useEffect, useState } from '@framework';\nimport { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { ViewManagerPlugin } from '@embedpdf/plugin-view-manager';\nimport { View } from '@embedpdf/plugin-view-manager';\n\nexport const useViewManagerPlugin = () => usePlugin<ViewManagerPlugin>(ViewManagerPlugin.id);\nexport const useViewManagerCapability = () =>\n useCapability<ViewManagerPlugin>(ViewManagerPlugin.id);\n\n/**\n * Hook for a specific view's state\n */\nexport const useView = (viewId: string) => {\n const { provides } = useViewManagerCapability();\n const [view, setView] = useState<View | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n\n // Get initial view\n setView(provides.getView(viewId));\n\n // Subscribe to all document events for this view\n const unsubAdded = provides.onDocumentAddedToView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubRemoved = provides.onDocumentRemovedFromView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubReordered = provides.onDocumentReordered((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n return () => {\n unsubAdded();\n unsubRemoved();\n unsubReordered();\n unsubActiveChanged();\n };\n }, [viewId, provides]);\n\n return view;\n};\n\n/**\n * Hook for focused view state\n */\nexport const useFocusedView = () => {\n const { provides } = useViewManagerCapability();\n const [focusedViewId, setFocusedViewId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n\n setFocusedViewId(provides.getFocusedViewId());\n\n return provides.onViewFocusChanged((event) => {\n setFocusedViewId(event.currentViewId);\n });\n }, [provides]);\n\n return { focusedViewId };\n};\n\n/**\n * Hook for all views\n */\nexport const useAllViews = () => {\n const { provides } = useViewManagerCapability();\n const [views, setViews] = useState<View[]>([]);\n\n useEffect(() => {\n if (!provides) return;\n\n const updateViews = () => {\n setViews(provides.getAllViews());\n };\n\n updateViews();\n\n const unsubCreated = provides.onViewCreated(updateViews);\n const unsubRemoved = provides.onViewRemoved(updateViews);\n const unsubAdded = provides.onDocumentAddedToView(updateViews);\n const unsubRemovedDoc = provides.onDocumentRemovedFromView(updateViews);\n const unsubReordered = provides.onDocumentReordered(updateViews);\n const unsubActiveChanged = provides.onViewActiveDocumentChanged(updateViews);\n\n return () => {\n unsubCreated();\n unsubRemoved();\n unsubAdded();\n unsubRemovedDoc();\n unsubReordered();\n unsubActiveChanged();\n };\n }, [provides]);\n\n return views;\n};\n","import { ReactNode, useEffect, useState } from '@framework';\nimport { useViewManagerCapability } from '../hooks';\nimport { View } from '@embedpdf/plugin-view-manager';\n\nexport interface ViewContextRenderProps {\n view: View;\n documentIds: string[];\n activeDocumentId: string | null;\n isFocused: boolean;\n addDocument: (documentId: string, index?: number) => void;\n removeDocument: (documentId: string) => void;\n setActiveDocument: (documentId: string | null) => void;\n moveDocumentWithinView: (documentId: string, index: number) => void;\n focus: () => void;\n}\n\ninterface ViewContextProps {\n viewId: string;\n autoCreate?: boolean;\n children: (props: ViewContextRenderProps) => ReactNode;\n}\n\n/**\n * Headless component for managing a single view with multiple documents\n */\nexport function ViewContext({ viewId, autoCreate = true, children }: ViewContextProps) {\n const { provides } = useViewManagerCapability();\n const [view, setView] = useState<View | null>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (!provides) return;\n\n // Get or create view\n let v = provides.getView(viewId);\n if (!v && autoCreate) {\n provides.createView(viewId);\n v = provides.getView(viewId);\n }\n setView(v);\n setIsFocused(provides.getFocusedViewId() === viewId);\n\n const unsubFocus = provides.onViewFocusChanged((event) => {\n setIsFocused(event.currentViewId === viewId);\n });\n\n const unsubAdded = provides.onDocumentAddedToView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubRemoved = provides.onDocumentRemovedFromView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n return () => {\n unsubFocus();\n unsubAdded();\n unsubRemoved();\n unsubActiveChanged();\n };\n }, [viewId, autoCreate, provides]);\n\n if (!view) return null;\n\n return (\n <>\n {children({\n view,\n documentIds: view.documentIds,\n activeDocumentId: view.activeDocumentId,\n isFocused,\n addDocument: (docId, index) => provides?.addDocumentToView(viewId, docId, index),\n removeDocument: (docId) => provides?.removeDocumentFromView(viewId, docId),\n setActiveDocument: (docId) => provides?.setViewActiveDocument(viewId, docId),\n moveDocumentWithinView: (docId, index) =>\n provides?.moveDocumentWithinView(viewId, docId, index),\n focus: () => provides?.setFocusedView(viewId),\n })}\n </>\n );\n}\n"],"names":["useViewManagerCapability","useCapability","ViewManagerPlugin","id","viewId","autoCreate","children","provides","view","setView","useState","isFocused","setIsFocused","useEffect","v","getView","createView","getFocusedViewId","unsubFocus","onViewFocusChanged","event","currentViewId","unsubAdded","onDocumentAddedToView","unsubRemoved","onDocumentRemovedFromView","unsubActiveChanged","onViewActiveDocumentChanged","documentIds","activeDocumentId","addDocument","docId","index","addDocumentToView","removeDocument","removeDocumentFromView","setActiveDocument","setViewActiveDocument","moveDocumentWithinView","focus","setFocusedView","views","setViews","updateViews","getAllViews","unsubCreated","onViewCreated","onViewRemoved","unsubRemovedDoc","unsubReordered","onDocumentReordered","focusedViewId","setFocusedViewId","usePlugin"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from '../shared-preact';
@@ -0,0 +1,141 @@
1
+ import { jsx, Fragment } from "preact/jsx-runtime";
2
+ import "preact";
3
+ import { useState, useEffect } from "preact/hooks";
4
+ import { usePlugin, useCapability } from "@embedpdf/core/preact";
5
+ import { ViewManagerPlugin } from "@embedpdf/plugin-view-manager";
6
+ export * from "@embedpdf/plugin-view-manager";
7
+ const useViewManagerPlugin = () => usePlugin(ViewManagerPlugin.id);
8
+ const useViewManagerCapability = () => useCapability(ViewManagerPlugin.id);
9
+ const useView = (viewId) => {
10
+ const { provides } = useViewManagerCapability();
11
+ const [view, setView] = useState(null);
12
+ useEffect(() => {
13
+ if (!provides) return;
14
+ setView(provides.getView(viewId));
15
+ const unsubAdded = provides.onDocumentAddedToView((event) => {
16
+ if (event.viewId === viewId) {
17
+ setView(provides.getView(viewId));
18
+ }
19
+ });
20
+ const unsubRemoved = provides.onDocumentRemovedFromView((event) => {
21
+ if (event.viewId === viewId) {
22
+ setView(provides.getView(viewId));
23
+ }
24
+ });
25
+ const unsubReordered = provides.onDocumentReordered((event) => {
26
+ if (event.viewId === viewId) {
27
+ setView(provides.getView(viewId));
28
+ }
29
+ });
30
+ const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {
31
+ if (event.viewId === viewId) {
32
+ setView(provides.getView(viewId));
33
+ }
34
+ });
35
+ return () => {
36
+ unsubAdded();
37
+ unsubRemoved();
38
+ unsubReordered();
39
+ unsubActiveChanged();
40
+ };
41
+ }, [viewId, provides]);
42
+ return view;
43
+ };
44
+ const useFocusedView = () => {
45
+ const { provides } = useViewManagerCapability();
46
+ const [focusedViewId, setFocusedViewId] = useState(null);
47
+ useEffect(() => {
48
+ if (!provides) return;
49
+ setFocusedViewId(provides.getFocusedViewId());
50
+ return provides.onViewFocusChanged((event) => {
51
+ setFocusedViewId(event.currentViewId);
52
+ });
53
+ }, [provides]);
54
+ return { focusedViewId };
55
+ };
56
+ const useAllViews = () => {
57
+ const { provides } = useViewManagerCapability();
58
+ const [views, setViews] = useState([]);
59
+ useEffect(() => {
60
+ if (!provides) return;
61
+ const updateViews = () => {
62
+ setViews(provides.getAllViews());
63
+ };
64
+ updateViews();
65
+ const unsubCreated = provides.onViewCreated(updateViews);
66
+ const unsubRemoved = provides.onViewRemoved(updateViews);
67
+ const unsubAdded = provides.onDocumentAddedToView(updateViews);
68
+ const unsubRemovedDoc = provides.onDocumentRemovedFromView(updateViews);
69
+ const unsubReordered = provides.onDocumentReordered(updateViews);
70
+ const unsubActiveChanged = provides.onViewActiveDocumentChanged(updateViews);
71
+ return () => {
72
+ unsubCreated();
73
+ unsubRemoved();
74
+ unsubAdded();
75
+ unsubRemovedDoc();
76
+ unsubReordered();
77
+ unsubActiveChanged();
78
+ };
79
+ }, [provides]);
80
+ return views;
81
+ };
82
+ function ViewContext({ viewId, autoCreate = true, children }) {
83
+ const { provides } = useViewManagerCapability();
84
+ const [view, setView] = useState(null);
85
+ const [isFocused, setIsFocused] = useState(false);
86
+ useEffect(() => {
87
+ if (!provides) return;
88
+ let v = provides.getView(viewId);
89
+ if (!v && autoCreate) {
90
+ provides.createView(viewId);
91
+ v = provides.getView(viewId);
92
+ }
93
+ setView(v);
94
+ setIsFocused(provides.getFocusedViewId() === viewId);
95
+ const unsubFocus = provides.onViewFocusChanged((event) => {
96
+ setIsFocused(event.currentViewId === viewId);
97
+ });
98
+ const unsubAdded = provides.onDocumentAddedToView((event) => {
99
+ if (event.viewId === viewId) {
100
+ setView(provides.getView(viewId));
101
+ }
102
+ });
103
+ const unsubRemoved = provides.onDocumentRemovedFromView((event) => {
104
+ if (event.viewId === viewId) {
105
+ setView(provides.getView(viewId));
106
+ }
107
+ });
108
+ const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {
109
+ if (event.viewId === viewId) {
110
+ setView(provides.getView(viewId));
111
+ }
112
+ });
113
+ return () => {
114
+ unsubFocus();
115
+ unsubAdded();
116
+ unsubRemoved();
117
+ unsubActiveChanged();
118
+ };
119
+ }, [viewId, autoCreate, provides]);
120
+ if (!view) return null;
121
+ return /* @__PURE__ */ jsx(Fragment, { children: children({
122
+ view,
123
+ documentIds: view.documentIds,
124
+ activeDocumentId: view.activeDocumentId,
125
+ isFocused,
126
+ addDocument: (docId, index) => provides == null ? void 0 : provides.addDocumentToView(viewId, docId, index),
127
+ removeDocument: (docId) => provides == null ? void 0 : provides.removeDocumentFromView(viewId, docId),
128
+ setActiveDocument: (docId) => provides == null ? void 0 : provides.setViewActiveDocument(viewId, docId),
129
+ moveDocumentWithinView: (docId, index) => provides == null ? void 0 : provides.moveDocumentWithinView(viewId, docId, index),
130
+ focus: () => provides == null ? void 0 : provides.setFocusedView(viewId)
131
+ }) });
132
+ }
133
+ export {
134
+ ViewContext,
135
+ useAllViews,
136
+ useFocusedView,
137
+ useView,
138
+ useViewManagerCapability,
139
+ useViewManagerPlugin
140
+ };
141
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-view-manager.ts","../../src/shared/components/view-context.tsx"],"sourcesContent":["import { useEffect, useState } from '@framework';\nimport { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { ViewManagerPlugin } from '@embedpdf/plugin-view-manager';\nimport { View } from '@embedpdf/plugin-view-manager';\n\nexport const useViewManagerPlugin = () => usePlugin<ViewManagerPlugin>(ViewManagerPlugin.id);\nexport const useViewManagerCapability = () =>\n useCapability<ViewManagerPlugin>(ViewManagerPlugin.id);\n\n/**\n * Hook for a specific view's state\n */\nexport const useView = (viewId: string) => {\n const { provides } = useViewManagerCapability();\n const [view, setView] = useState<View | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n\n // Get initial view\n setView(provides.getView(viewId));\n\n // Subscribe to all document events for this view\n const unsubAdded = provides.onDocumentAddedToView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubRemoved = provides.onDocumentRemovedFromView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubReordered = provides.onDocumentReordered((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n return () => {\n unsubAdded();\n unsubRemoved();\n unsubReordered();\n unsubActiveChanged();\n };\n }, [viewId, provides]);\n\n return view;\n};\n\n/**\n * Hook for focused view state\n */\nexport const useFocusedView = () => {\n const { provides } = useViewManagerCapability();\n const [focusedViewId, setFocusedViewId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n\n setFocusedViewId(provides.getFocusedViewId());\n\n return provides.onViewFocusChanged((event) => {\n setFocusedViewId(event.currentViewId);\n });\n }, [provides]);\n\n return { focusedViewId };\n};\n\n/**\n * Hook for all views\n */\nexport const useAllViews = () => {\n const { provides } = useViewManagerCapability();\n const [views, setViews] = useState<View[]>([]);\n\n useEffect(() => {\n if (!provides) return;\n\n const updateViews = () => {\n setViews(provides.getAllViews());\n };\n\n updateViews();\n\n const unsubCreated = provides.onViewCreated(updateViews);\n const unsubRemoved = provides.onViewRemoved(updateViews);\n const unsubAdded = provides.onDocumentAddedToView(updateViews);\n const unsubRemovedDoc = provides.onDocumentRemovedFromView(updateViews);\n const unsubReordered = provides.onDocumentReordered(updateViews);\n const unsubActiveChanged = provides.onViewActiveDocumentChanged(updateViews);\n\n return () => {\n unsubCreated();\n unsubRemoved();\n unsubAdded();\n unsubRemovedDoc();\n unsubReordered();\n unsubActiveChanged();\n };\n }, [provides]);\n\n return views;\n};\n","import { ReactNode, useEffect, useState } from '@framework';\nimport { useViewManagerCapability } from '../hooks';\nimport { View } from '@embedpdf/plugin-view-manager';\n\nexport interface ViewContextRenderProps {\n view: View;\n documentIds: string[];\n activeDocumentId: string | null;\n isFocused: boolean;\n addDocument: (documentId: string, index?: number) => void;\n removeDocument: (documentId: string) => void;\n setActiveDocument: (documentId: string | null) => void;\n moveDocumentWithinView: (documentId: string, index: number) => void;\n focus: () => void;\n}\n\ninterface ViewContextProps {\n viewId: string;\n autoCreate?: boolean;\n children: (props: ViewContextRenderProps) => ReactNode;\n}\n\n/**\n * Headless component for managing a single view with multiple documents\n */\nexport function ViewContext({ viewId, autoCreate = true, children }: ViewContextProps) {\n const { provides } = useViewManagerCapability();\n const [view, setView] = useState<View | null>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (!provides) return;\n\n // Get or create view\n let v = provides.getView(viewId);\n if (!v && autoCreate) {\n provides.createView(viewId);\n v = provides.getView(viewId);\n }\n setView(v);\n setIsFocused(provides.getFocusedViewId() === viewId);\n\n const unsubFocus = provides.onViewFocusChanged((event) => {\n setIsFocused(event.currentViewId === viewId);\n });\n\n const unsubAdded = provides.onDocumentAddedToView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubRemoved = provides.onDocumentRemovedFromView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n return () => {\n unsubFocus();\n unsubAdded();\n unsubRemoved();\n unsubActiveChanged();\n };\n }, [viewId, autoCreate, provides]);\n\n if (!view) return null;\n\n return (\n <>\n {children({\n view,\n documentIds: view.documentIds,\n activeDocumentId: view.activeDocumentId,\n isFocused,\n addDocument: (docId, index) => provides?.addDocumentToView(viewId, docId, index),\n removeDocument: (docId) => provides?.removeDocumentFromView(viewId, docId),\n setActiveDocument: (docId) => provides?.setViewActiveDocument(viewId, docId),\n moveDocumentWithinView: (docId, index) =>\n provides?.moveDocumentWithinView(viewId, docId, index),\n focus: () => provides?.setFocusedView(viewId),\n })}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { Fragment, useEffect, useRef, useState, useCallback, useMemo, useLayoutEffect, } from 'react';
2
+ export type { ReactNode, HTMLAttributes, CSSProperties } from 'react';
@@ -0,0 +1 @@
1
+ export * from '@embedpdf/core/react';
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),t=require("react"),o=require("@embedpdf/core/react"),i=require("@embedpdf/plugin-view-manager"),n=()=>o.useCapability(i.ViewManagerPlugin.id);exports.ViewContext=function({viewId:o,autoCreate:i=!0,children:u}){const{provides:r}=n(),[d,c]=t.useState(null),[s,w]=t.useState(!1);return t.useEffect(()=>{if(!r)return;let e=r.getView(o);!e&&i&&(r.createView(o),e=r.getView(o)),c(e),w(r.getFocusedViewId()===o);const t=r.onViewFocusChanged(e=>{w(e.currentViewId===o)}),n=r.onDocumentAddedToView(e=>{e.viewId===o&&c(r.getView(o))}),u=r.onDocumentRemovedFromView(e=>{e.viewId===o&&c(r.getView(o))}),d=r.onViewActiveDocumentChanged(e=>{e.viewId===o&&c(r.getView(o))});return()=>{t(),n(),u(),d()}},[o,i,r]),d?e.jsx(e.Fragment,{children:u({view:d,documentIds:d.documentIds,activeDocumentId:d.activeDocumentId,isFocused:s,addDocument:(e,t)=>null==r?void 0:r.addDocumentToView(o,e,t),removeDocument:e=>null==r?void 0:r.removeDocumentFromView(o,e),setActiveDocument:e=>null==r?void 0:r.setViewActiveDocument(o,e),moveDocumentWithinView:(e,t)=>null==r?void 0:r.moveDocumentWithinView(o,e,t),focus:()=>null==r?void 0:r.setFocusedView(o)})}):null},exports.useAllViews=()=>{const{provides:e}=n(),[o,i]=t.useState([]);return t.useEffect(()=>{if(!e)return;const t=()=>{i(e.getAllViews())};t();const o=e.onViewCreated(t),n=e.onViewRemoved(t),u=e.onDocumentAddedToView(t),r=e.onDocumentRemovedFromView(t),d=e.onDocumentReordered(t),c=e.onViewActiveDocumentChanged(t);return()=>{o(),n(),u(),r(),d(),c()}},[e]),o},exports.useFocusedView=()=>{const{provides:e}=n(),[o,i]=t.useState(null);return t.useEffect(()=>{if(e)return i(e.getFocusedViewId()),e.onViewFocusChanged(e=>{i(e.currentViewId)})},[e]),{focusedViewId:o}},exports.useView=e=>{const{provides:o}=n(),[i,u]=t.useState(null);return t.useEffect(()=>{if(!o)return;u(o.getView(e));const t=o.onDocumentAddedToView(t=>{t.viewId===e&&u(o.getView(e))}),i=o.onDocumentRemovedFromView(t=>{t.viewId===e&&u(o.getView(e))}),n=o.onDocumentReordered(t=>{t.viewId===e&&u(o.getView(e))}),r=o.onViewActiveDocumentChanged(t=>{t.viewId===e&&u(o.getView(e))});return()=>{t(),i(),n(),r()}},[e,o]),i},exports.useViewManagerCapability=n,exports.useViewManagerPlugin=()=>o.usePlugin(i.ViewManagerPlugin.id),Object.keys(i).forEach(e=>{"default"===e||Object.prototype.hasOwnProperty.call(exports,e)||Object.defineProperty(exports,e,{enumerable:!0,get:()=>i[e]})});
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../src/shared/hooks/use-view-manager.ts","../../src/shared/components/view-context.tsx"],"sourcesContent":["import { useEffect, useState } from '@framework';\nimport { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { ViewManagerPlugin } from '@embedpdf/plugin-view-manager';\nimport { View } from '@embedpdf/plugin-view-manager';\n\nexport const useViewManagerPlugin = () => usePlugin<ViewManagerPlugin>(ViewManagerPlugin.id);\nexport const useViewManagerCapability = () =>\n useCapability<ViewManagerPlugin>(ViewManagerPlugin.id);\n\n/**\n * Hook for a specific view's state\n */\nexport const useView = (viewId: string) => {\n const { provides } = useViewManagerCapability();\n const [view, setView] = useState<View | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n\n // Get initial view\n setView(provides.getView(viewId));\n\n // Subscribe to all document events for this view\n const unsubAdded = provides.onDocumentAddedToView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubRemoved = provides.onDocumentRemovedFromView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubReordered = provides.onDocumentReordered((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n return () => {\n unsubAdded();\n unsubRemoved();\n unsubReordered();\n unsubActiveChanged();\n };\n }, [viewId, provides]);\n\n return view;\n};\n\n/**\n * Hook for focused view state\n */\nexport const useFocusedView = () => {\n const { provides } = useViewManagerCapability();\n const [focusedViewId, setFocusedViewId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n\n setFocusedViewId(provides.getFocusedViewId());\n\n return provides.onViewFocusChanged((event) => {\n setFocusedViewId(event.currentViewId);\n });\n }, [provides]);\n\n return { focusedViewId };\n};\n\n/**\n * Hook for all views\n */\nexport const useAllViews = () => {\n const { provides } = useViewManagerCapability();\n const [views, setViews] = useState<View[]>([]);\n\n useEffect(() => {\n if (!provides) return;\n\n const updateViews = () => {\n setViews(provides.getAllViews());\n };\n\n updateViews();\n\n const unsubCreated = provides.onViewCreated(updateViews);\n const unsubRemoved = provides.onViewRemoved(updateViews);\n const unsubAdded = provides.onDocumentAddedToView(updateViews);\n const unsubRemovedDoc = provides.onDocumentRemovedFromView(updateViews);\n const unsubReordered = provides.onDocumentReordered(updateViews);\n const unsubActiveChanged = provides.onViewActiveDocumentChanged(updateViews);\n\n return () => {\n unsubCreated();\n unsubRemoved();\n unsubAdded();\n unsubRemovedDoc();\n unsubReordered();\n unsubActiveChanged();\n };\n }, [provides]);\n\n return views;\n};\n","import { ReactNode, useEffect, useState } from '@framework';\nimport { useViewManagerCapability } from '../hooks';\nimport { View } from '@embedpdf/plugin-view-manager';\n\nexport interface ViewContextRenderProps {\n view: View;\n documentIds: string[];\n activeDocumentId: string | null;\n isFocused: boolean;\n addDocument: (documentId: string, index?: number) => void;\n removeDocument: (documentId: string) => void;\n setActiveDocument: (documentId: string | null) => void;\n moveDocumentWithinView: (documentId: string, index: number) => void;\n focus: () => void;\n}\n\ninterface ViewContextProps {\n viewId: string;\n autoCreate?: boolean;\n children: (props: ViewContextRenderProps) => ReactNode;\n}\n\n/**\n * Headless component for managing a single view with multiple documents\n */\nexport function ViewContext({ viewId, autoCreate = true, children }: ViewContextProps) {\n const { provides } = useViewManagerCapability();\n const [view, setView] = useState<View | null>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (!provides) return;\n\n // Get or create view\n let v = provides.getView(viewId);\n if (!v && autoCreate) {\n provides.createView(viewId);\n v = provides.getView(viewId);\n }\n setView(v);\n setIsFocused(provides.getFocusedViewId() === viewId);\n\n const unsubFocus = provides.onViewFocusChanged((event) => {\n setIsFocused(event.currentViewId === viewId);\n });\n\n const unsubAdded = provides.onDocumentAddedToView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubRemoved = provides.onDocumentRemovedFromView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n return () => {\n unsubFocus();\n unsubAdded();\n unsubRemoved();\n unsubActiveChanged();\n };\n }, [viewId, autoCreate, provides]);\n\n if (!view) return null;\n\n return (\n <>\n {children({\n view,\n documentIds: view.documentIds,\n activeDocumentId: view.activeDocumentId,\n isFocused,\n addDocument: (docId, index) => provides?.addDocumentToView(viewId, docId, index),\n removeDocument: (docId) => provides?.removeDocumentFromView(viewId, docId),\n setActiveDocument: (docId) => provides?.setViewActiveDocument(viewId, docId),\n moveDocumentWithinView: (docId, index) =>\n provides?.moveDocumentWithinView(viewId, docId, index),\n focus: () => provides?.setFocusedView(viewId),\n })}\n </>\n );\n}\n"],"names":["useViewManagerCapability","useCapability","ViewManagerPlugin","id","viewId","autoCreate","children","provides","view","setView","useState","isFocused","setIsFocused","useEffect","v","getView","createView","getFocusedViewId","unsubFocus","onViewFocusChanged","event","currentViewId","unsubAdded","onDocumentAddedToView","unsubRemoved","onDocumentRemovedFromView","unsubActiveChanged","onViewActiveDocumentChanged","documentIds","activeDocumentId","addDocument","docId","index","addDocumentToView","removeDocument","removeDocumentFromView","setActiveDocument","setViewActiveDocument","moveDocumentWithinView","focus","setFocusedView","views","setViews","updateViews","getAllViews","unsubCreated","onViewCreated","onViewRemoved","unsubRemovedDoc","unsubReordered","onDocumentReordered","focusedViewId","setFocusedViewId","usePlugin"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from '../shared-react';
@@ -0,0 +1,140 @@
1
+ import { jsx, Fragment } from "react/jsx-runtime";
2
+ import { useState, useEffect } from "react";
3
+ import { usePlugin, useCapability } from "@embedpdf/core/react";
4
+ import { ViewManagerPlugin } from "@embedpdf/plugin-view-manager";
5
+ export * from "@embedpdf/plugin-view-manager";
6
+ const useViewManagerPlugin = () => usePlugin(ViewManagerPlugin.id);
7
+ const useViewManagerCapability = () => useCapability(ViewManagerPlugin.id);
8
+ const useView = (viewId) => {
9
+ const { provides } = useViewManagerCapability();
10
+ const [view, setView] = useState(null);
11
+ useEffect(() => {
12
+ if (!provides) return;
13
+ setView(provides.getView(viewId));
14
+ const unsubAdded = provides.onDocumentAddedToView((event) => {
15
+ if (event.viewId === viewId) {
16
+ setView(provides.getView(viewId));
17
+ }
18
+ });
19
+ const unsubRemoved = provides.onDocumentRemovedFromView((event) => {
20
+ if (event.viewId === viewId) {
21
+ setView(provides.getView(viewId));
22
+ }
23
+ });
24
+ const unsubReordered = provides.onDocumentReordered((event) => {
25
+ if (event.viewId === viewId) {
26
+ setView(provides.getView(viewId));
27
+ }
28
+ });
29
+ const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {
30
+ if (event.viewId === viewId) {
31
+ setView(provides.getView(viewId));
32
+ }
33
+ });
34
+ return () => {
35
+ unsubAdded();
36
+ unsubRemoved();
37
+ unsubReordered();
38
+ unsubActiveChanged();
39
+ };
40
+ }, [viewId, provides]);
41
+ return view;
42
+ };
43
+ const useFocusedView = () => {
44
+ const { provides } = useViewManagerCapability();
45
+ const [focusedViewId, setFocusedViewId] = useState(null);
46
+ useEffect(() => {
47
+ if (!provides) return;
48
+ setFocusedViewId(provides.getFocusedViewId());
49
+ return provides.onViewFocusChanged((event) => {
50
+ setFocusedViewId(event.currentViewId);
51
+ });
52
+ }, [provides]);
53
+ return { focusedViewId };
54
+ };
55
+ const useAllViews = () => {
56
+ const { provides } = useViewManagerCapability();
57
+ const [views, setViews] = useState([]);
58
+ useEffect(() => {
59
+ if (!provides) return;
60
+ const updateViews = () => {
61
+ setViews(provides.getAllViews());
62
+ };
63
+ updateViews();
64
+ const unsubCreated = provides.onViewCreated(updateViews);
65
+ const unsubRemoved = provides.onViewRemoved(updateViews);
66
+ const unsubAdded = provides.onDocumentAddedToView(updateViews);
67
+ const unsubRemovedDoc = provides.onDocumentRemovedFromView(updateViews);
68
+ const unsubReordered = provides.onDocumentReordered(updateViews);
69
+ const unsubActiveChanged = provides.onViewActiveDocumentChanged(updateViews);
70
+ return () => {
71
+ unsubCreated();
72
+ unsubRemoved();
73
+ unsubAdded();
74
+ unsubRemovedDoc();
75
+ unsubReordered();
76
+ unsubActiveChanged();
77
+ };
78
+ }, [provides]);
79
+ return views;
80
+ };
81
+ function ViewContext({ viewId, autoCreate = true, children }) {
82
+ const { provides } = useViewManagerCapability();
83
+ const [view, setView] = useState(null);
84
+ const [isFocused, setIsFocused] = useState(false);
85
+ useEffect(() => {
86
+ if (!provides) return;
87
+ let v = provides.getView(viewId);
88
+ if (!v && autoCreate) {
89
+ provides.createView(viewId);
90
+ v = provides.getView(viewId);
91
+ }
92
+ setView(v);
93
+ setIsFocused(provides.getFocusedViewId() === viewId);
94
+ const unsubFocus = provides.onViewFocusChanged((event) => {
95
+ setIsFocused(event.currentViewId === viewId);
96
+ });
97
+ const unsubAdded = provides.onDocumentAddedToView((event) => {
98
+ if (event.viewId === viewId) {
99
+ setView(provides.getView(viewId));
100
+ }
101
+ });
102
+ const unsubRemoved = provides.onDocumentRemovedFromView((event) => {
103
+ if (event.viewId === viewId) {
104
+ setView(provides.getView(viewId));
105
+ }
106
+ });
107
+ const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {
108
+ if (event.viewId === viewId) {
109
+ setView(provides.getView(viewId));
110
+ }
111
+ });
112
+ return () => {
113
+ unsubFocus();
114
+ unsubAdded();
115
+ unsubRemoved();
116
+ unsubActiveChanged();
117
+ };
118
+ }, [viewId, autoCreate, provides]);
119
+ if (!view) return null;
120
+ return /* @__PURE__ */ jsx(Fragment, { children: children({
121
+ view,
122
+ documentIds: view.documentIds,
123
+ activeDocumentId: view.activeDocumentId,
124
+ isFocused,
125
+ addDocument: (docId, index) => provides == null ? void 0 : provides.addDocumentToView(viewId, docId, index),
126
+ removeDocument: (docId) => provides == null ? void 0 : provides.removeDocumentFromView(viewId, docId),
127
+ setActiveDocument: (docId) => provides == null ? void 0 : provides.setViewActiveDocument(viewId, docId),
128
+ moveDocumentWithinView: (docId, index) => provides == null ? void 0 : provides.moveDocumentWithinView(viewId, docId, index),
129
+ focus: () => provides == null ? void 0 : provides.setFocusedView(viewId)
130
+ }) });
131
+ }
132
+ export {
133
+ ViewContext,
134
+ useAllViews,
135
+ useFocusedView,
136
+ useView,
137
+ useViewManagerCapability,
138
+ useViewManagerPlugin
139
+ };
140
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/shared/hooks/use-view-manager.ts","../../src/shared/components/view-context.tsx"],"sourcesContent":["import { useEffect, useState } from '@framework';\nimport { useCapability, usePlugin } from '@embedpdf/core/@framework';\nimport { ViewManagerPlugin } from '@embedpdf/plugin-view-manager';\nimport { View } from '@embedpdf/plugin-view-manager';\n\nexport const useViewManagerPlugin = () => usePlugin<ViewManagerPlugin>(ViewManagerPlugin.id);\nexport const useViewManagerCapability = () =>\n useCapability<ViewManagerPlugin>(ViewManagerPlugin.id);\n\n/**\n * Hook for a specific view's state\n */\nexport const useView = (viewId: string) => {\n const { provides } = useViewManagerCapability();\n const [view, setView] = useState<View | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n\n // Get initial view\n setView(provides.getView(viewId));\n\n // Subscribe to all document events for this view\n const unsubAdded = provides.onDocumentAddedToView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubRemoved = provides.onDocumentRemovedFromView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubReordered = provides.onDocumentReordered((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n return () => {\n unsubAdded();\n unsubRemoved();\n unsubReordered();\n unsubActiveChanged();\n };\n }, [viewId, provides]);\n\n return view;\n};\n\n/**\n * Hook for focused view state\n */\nexport const useFocusedView = () => {\n const { provides } = useViewManagerCapability();\n const [focusedViewId, setFocusedViewId] = useState<string | null>(null);\n\n useEffect(() => {\n if (!provides) return;\n\n setFocusedViewId(provides.getFocusedViewId());\n\n return provides.onViewFocusChanged((event) => {\n setFocusedViewId(event.currentViewId);\n });\n }, [provides]);\n\n return { focusedViewId };\n};\n\n/**\n * Hook for all views\n */\nexport const useAllViews = () => {\n const { provides } = useViewManagerCapability();\n const [views, setViews] = useState<View[]>([]);\n\n useEffect(() => {\n if (!provides) return;\n\n const updateViews = () => {\n setViews(provides.getAllViews());\n };\n\n updateViews();\n\n const unsubCreated = provides.onViewCreated(updateViews);\n const unsubRemoved = provides.onViewRemoved(updateViews);\n const unsubAdded = provides.onDocumentAddedToView(updateViews);\n const unsubRemovedDoc = provides.onDocumentRemovedFromView(updateViews);\n const unsubReordered = provides.onDocumentReordered(updateViews);\n const unsubActiveChanged = provides.onViewActiveDocumentChanged(updateViews);\n\n return () => {\n unsubCreated();\n unsubRemoved();\n unsubAdded();\n unsubRemovedDoc();\n unsubReordered();\n unsubActiveChanged();\n };\n }, [provides]);\n\n return views;\n};\n","import { ReactNode, useEffect, useState } from '@framework';\nimport { useViewManagerCapability } from '../hooks';\nimport { View } from '@embedpdf/plugin-view-manager';\n\nexport interface ViewContextRenderProps {\n view: View;\n documentIds: string[];\n activeDocumentId: string | null;\n isFocused: boolean;\n addDocument: (documentId: string, index?: number) => void;\n removeDocument: (documentId: string) => void;\n setActiveDocument: (documentId: string | null) => void;\n moveDocumentWithinView: (documentId: string, index: number) => void;\n focus: () => void;\n}\n\ninterface ViewContextProps {\n viewId: string;\n autoCreate?: boolean;\n children: (props: ViewContextRenderProps) => ReactNode;\n}\n\n/**\n * Headless component for managing a single view with multiple documents\n */\nexport function ViewContext({ viewId, autoCreate = true, children }: ViewContextProps) {\n const { provides } = useViewManagerCapability();\n const [view, setView] = useState<View | null>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (!provides) return;\n\n // Get or create view\n let v = provides.getView(viewId);\n if (!v && autoCreate) {\n provides.createView(viewId);\n v = provides.getView(viewId);\n }\n setView(v);\n setIsFocused(provides.getFocusedViewId() === viewId);\n\n const unsubFocus = provides.onViewFocusChanged((event) => {\n setIsFocused(event.currentViewId === viewId);\n });\n\n const unsubAdded = provides.onDocumentAddedToView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubRemoved = provides.onDocumentRemovedFromView((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n const unsubActiveChanged = provides.onViewActiveDocumentChanged((event) => {\n if (event.viewId === viewId) {\n setView(provides.getView(viewId));\n }\n });\n\n return () => {\n unsubFocus();\n unsubAdded();\n unsubRemoved();\n unsubActiveChanged();\n };\n }, [viewId, autoCreate, provides]);\n\n if (!view) return null;\n\n return (\n <>\n {children({\n view,\n documentIds: view.documentIds,\n activeDocumentId: view.activeDocumentId,\n isFocused,\n addDocument: (docId, index) => provides?.addDocumentToView(viewId, docId, index),\n removeDocument: (docId) => provides?.removeDocumentFromView(viewId, docId),\n setActiveDocument: (docId) => provides?.setViewActiveDocument(viewId, docId),\n moveDocumentWithinView: (docId, index) =>\n provides?.moveDocumentWithinView(viewId, docId, index),\n focus: () => provides?.setFocusedView(viewId),\n })}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './view-context';
@@ -0,0 +1,23 @@
1
+ import { ReactNode } from '../../react/adapter.ts';
2
+ import { View } from '../../index.ts';
3
+ export interface ViewContextRenderProps {
4
+ view: View;
5
+ documentIds: string[];
6
+ activeDocumentId: string | null;
7
+ isFocused: boolean;
8
+ addDocument: (documentId: string, index?: number) => void;
9
+ removeDocument: (documentId: string) => void;
10
+ setActiveDocument: (documentId: string | null) => void;
11
+ moveDocumentWithinView: (documentId: string, index: number) => void;
12
+ focus: () => void;
13
+ }
14
+ interface ViewContextProps {
15
+ viewId: string;
16
+ autoCreate?: boolean;
17
+ children: (props: ViewContextRenderProps) => ReactNode;
18
+ }
19
+ /**
20
+ * Headless component for managing a single view with multiple documents
21
+ */
22
+ export declare function ViewContext({ viewId, autoCreate, children }: ViewContextProps): import("react/jsx-runtime").JSX.Element | null;
23
+ export {};
@@ -0,0 +1 @@
1
+ export * from './use-view-manager';