Skip to content

Commit a9e7564

Browse files
authored
fix: fix global virtual clipboard (#598)
1 parent 0f6b9c5 commit a9e7564

5 files changed

Lines changed: 103 additions & 86 deletions

File tree

.changeset/fast-terms-judge.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@blinkk/root-cms': patch
3+
---
4+
5+
fix: fix virtual clipboard

packages/root-cms/ui/components/DocEditor/DocEditor.tsx

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import './DocEditor.css';
2+
13
import {
24
ActionIcon,
35
Button,
@@ -42,6 +44,7 @@ import {
4244
SaveState,
4345
UseDraftHook,
4446
} from '../../hooks/useDraft.js';
47+
import {useVirtualClipboard, VirtualClipboard} from '../../hooks/useVirtualClipboard.js';
4548
import {joinClassNames} from '../../utils/classes.js';
4649
import {
4750
CMSDoc,
@@ -54,10 +57,6 @@ import {flattenNestedKeys} from '../../utils/objects.js';
5457
import {autokey} from '../../utils/rand.js';
5558
import {getPlaceholderKeys, strFormat} from '../../utils/str-format.js';
5659
import {formatDateTime} from '../../utils/time.js';
57-
import {
58-
useVirtualClipboard,
59-
VirtualClipboard,
60-
} from '../../utils/virtual-clipboard.js';
6160
import {
6261
DocActionEvent,
6362
DocActionsMenu,
@@ -67,7 +66,6 @@ import {useEditJsonModal} from '../EditJsonModal/EditJsonModal.js';
6766
import {useEditTranslationsModal} from '../EditTranslationsModal/EditTranslationsModal.js';
6867
import {useLocalizationModal} from '../LocalizationModal/LocalizationModal.js';
6968
import {usePublishDocModal} from '../PublishDocModal/PublishDocModal.js';
70-
import './DocEditor.css';
7169
import {Viewers} from '../Viewers/Viewers.js';
7270
import {BooleanField} from './fields/BooleanField.js';
7371
import {DateTimeField} from './fields/DateTimeField.js';
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import {ComponentChildren, createContext} from 'preact';
2+
import {useContext, useState} from 'preact/hooks';
3+
4+
export interface VirtualClipboard {
5+
value: string;
6+
set: (value: string) => void;
7+
}
8+
9+
const VirtualClipboardContext = createContext<VirtualClipboard | null>(null);
10+
11+
export function VirtualClipboardProvider(props: {children?: ComponentChildren}) {
12+
const [clipboardValue, setClipboardValue] = useState('');
13+
const virtualClipboard: VirtualClipboard = {
14+
value: clipboardValue,
15+
set: (value) => setClipboardValue(value),
16+
};
17+
return (
18+
<VirtualClipboardContext.Provider value={virtualClipboard}>
19+
{props.children}
20+
</VirtualClipboardContext.Provider>
21+
);
22+
}
23+
24+
export function useVirtualClipboard(): VirtualClipboard {
25+
const virtualClipboard = useContext(VirtualClipboardContext);
26+
if (!virtualClipboard) {
27+
throw new Error(`virtualClipboard is null, make sure to add <VirtualClipboardProvider>`);
28+
}
29+
return virtualClipboard;
30+
}

packages/root-cms/ui/ui.tsx

Lines changed: 65 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import './styles/global.css';
2+
import './styles/theme.css';
3+
14
import {MantineProvider} from '@mantine/core';
25
import {ModalsProvider} from '@mantine/modals';
36
import {NotificationsProvider} from '@mantine/notifications';
@@ -21,6 +24,7 @@ import {PublishDocModal} from './components/PublishDocModal/PublishDocModal.js';
2124
import {ScheduleReleaseModal} from './components/ScheduleReleaseModal/ScheduleReleaseModal.js';
2225
import {VersionHistoryModal} from './components/VersionHistoryModal/VersionHistoryModal.js';
2326
import {FirebaseContext, FirebaseContextObject} from './hooks/useFirebase.js';
27+
import {VirtualClipboardProvider} from './hooks/useVirtualClipboard.js';
2428
import {AIPage} from './pages/AIPage/AIPage.js';
2529
import {AssetsPage} from './pages/AssetsPage/AssetsPage.js';
2630
import {CollectionPage} from './pages/CollectionPage/CollectionPage.js';
@@ -43,8 +47,6 @@ import {SidebarToolsPage} from './pages/SidebarToolsPage/SidebarToolsPage.js';
4347
import {TranslationsArbPage} from './pages/TranslationsArbPage/TranslationsArbPage.js';
4448
import {TranslationsEditPage} from './pages/TranslationsEditPage/TranslationsEditPage.js';
4549
import {TranslationsPage} from './pages/TranslationsPage/TranslationsPage.js';
46-
import './styles/global.css';
47-
import './styles/theme.css';
4850

4951
type CollectionMeta = Omit<Collection, 'fields'>;
5052

@@ -96,65 +98,67 @@ function App() {
9698
>
9799
<NotificationsProvider>
98100
<FirebaseContext.Provider value={window.firebase}>
99-
<ModalsProvider
100-
modals={{
101-
[CopyDocModal.id]: CopyDocModal,
102-
[DocPickerModal.id]: DocPickerModal,
103-
[DocSelectModal.id]: DocSelectModal,
104-
[DataSourceSelectModal.id]: DataSourceSelectModal,
105-
[EditJsonModal.id]: EditJsonModal,
106-
[EditTranslationsModal.id]: EditTranslationsModal,
107-
[ExportSheetModal.id]: ExportSheetModal,
108-
[LocalizationModal.id]: LocalizationModal,
109-
[LockPublishingModal.id]: LockPublishingModal,
110-
[PublishDocModal.id]: PublishDocModal,
111-
[ScheduleReleaseModal.id]: ScheduleReleaseModal,
112-
[VersionHistoryModal.id]: VersionHistoryModal,
113-
}}
114-
>
115-
<Router>
116-
<Route path="/cms" component={ProjectPage} />
117-
<Route path="/cms/ai" component={AIPage} />
118-
<Route path="/cms/assets" component={AssetsPage} />
119-
<Route path="/cms/compare" component={ComparePage} />
120-
<Route
121-
path="/cms/content/:collection?"
122-
component={CollectionPage}
123-
/>
124-
<Route
125-
path="/cms/content/:collection/:slug"
126-
component={DocumentPage}
127-
/>
128-
<Route path="/cms/data" component={DataPage} />
129-
<Route path="/cms/data/new" component={NewDataSourcePage} />
130-
<Route path="/cms/data/:id" component={DataSourcePage} />
131-
<Route path="/cms/data/:id/edit" component={EditDataSourcePage} />
132-
<Route path="/cms/logs" component={LogsPage} />
133-
<Route path="/cms/releases" component={ReleasesPage} />
134-
<Route path="/cms/releases/new" component={NewReleasePage} />
135-
<Route path="/cms/releases/:id" component={ReleasePage} />
136-
<Route
137-
path="/cms/releases/:id/edit"
138-
component={EditReleasePage}
139-
/>
140-
<Route path="/cms/settings" component={SettingsPage} />
141-
<Route path="/cms/tools/:id" component={SidebarToolsPage} />
142-
<Route path="/cms/translations" component={TranslationsPage} />
143-
<Route
144-
path="/cms/translations/arb"
145-
component={TranslationsArbPage}
146-
/>
147-
<Route
148-
path="/cms/translations/:hash"
149-
component={TranslationsEditPage}
150-
/>
151-
<Route
152-
path="/cms/translations/:collection/:slug"
153-
component={DocTranslationsPage}
154-
/>
155-
<Route default component={NotFoundPage} />
156-
</Router>
157-
</ModalsProvider>
101+
<VirtualClipboardProvider>
102+
<ModalsProvider
103+
modals={{
104+
[CopyDocModal.id]: CopyDocModal,
105+
[DocPickerModal.id]: DocPickerModal,
106+
[DocSelectModal.id]: DocSelectModal,
107+
[DataSourceSelectModal.id]: DataSourceSelectModal,
108+
[EditJsonModal.id]: EditJsonModal,
109+
[EditTranslationsModal.id]: EditTranslationsModal,
110+
[ExportSheetModal.id]: ExportSheetModal,
111+
[LocalizationModal.id]: LocalizationModal,
112+
[LockPublishingModal.id]: LockPublishingModal,
113+
[PublishDocModal.id]: PublishDocModal,
114+
[ScheduleReleaseModal.id]: ScheduleReleaseModal,
115+
[VersionHistoryModal.id]: VersionHistoryModal,
116+
}}
117+
>
118+
<Router>
119+
<Route path="/cms" component={ProjectPage} />
120+
<Route path="/cms/ai" component={AIPage} />
121+
<Route path="/cms/assets" component={AssetsPage} />
122+
<Route path="/cms/compare" component={ComparePage} />
123+
<Route
124+
path="/cms/content/:collection?"
125+
component={CollectionPage}
126+
/>
127+
<Route
128+
path="/cms/content/:collection/:slug"
129+
component={DocumentPage}
130+
/>
131+
<Route path="/cms/data" component={DataPage} />
132+
<Route path="/cms/data/new" component={NewDataSourcePage} />
133+
<Route path="/cms/data/:id" component={DataSourcePage} />
134+
<Route path="/cms/data/:id/edit" component={EditDataSourcePage} />
135+
<Route path="/cms/logs" component={LogsPage} />
136+
<Route path="/cms/releases" component={ReleasesPage} />
137+
<Route path="/cms/releases/new" component={NewReleasePage} />
138+
<Route path="/cms/releases/:id" component={ReleasePage} />
139+
<Route
140+
path="/cms/releases/:id/edit"
141+
component={EditReleasePage}
142+
/>
143+
<Route path="/cms/settings" component={SettingsPage} />
144+
<Route path="/cms/tools/:id" component={SidebarToolsPage} />
145+
<Route path="/cms/translations" component={TranslationsPage} />
146+
<Route
147+
path="/cms/translations/arb"
148+
component={TranslationsArbPage}
149+
/>
150+
<Route
151+
path="/cms/translations/:hash"
152+
component={TranslationsEditPage}
153+
/>
154+
<Route
155+
path="/cms/translations/:collection/:slug"
156+
component={DocTranslationsPage}
157+
/>
158+
<Route default component={NotFoundPage} />
159+
</Router>
160+
</ModalsProvider>
161+
</VirtualClipboardProvider>
158162
</FirebaseContext.Provider>
159163
</NotificationsProvider>
160164
</MantineProvider>

packages/root-cms/ui/utils/virtual-clipboard.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)