eddyter 1.3.30

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 (223) hide show
  1. package/README.md +444 -0
  2. package/dist/App.d.ts +3 -0
  3. package/dist/Provider/EditorProvider.d.ts +27 -0
  4. package/dist/Provider/LexicalProvider.d.ts +6 -0
  5. package/dist/api/ai/index.d.ts +31 -0
  6. package/dist/api/auth.d.ts +108 -0
  7. package/dist/api/config/axios.d.ts +2 -0
  8. package/dist/api/config/endpoints.d.ts +21 -0
  9. package/dist/api/featureSuggestion.d.ts +23 -0
  10. package/dist/api/linkPreview.d.ts +15 -0
  11. package/dist/api/transcript/index.d.ts +1 -0
  12. package/dist/assets/style.css +7990 -0
  13. package/dist/babel-d3085146.js +7776 -0
  14. package/dist/babel-d3085146.js.map +1 -0
  15. package/dist/components/AiPlugin/index.d.ts +6 -0
  16. package/dist/components/AlignMenu/AlignMenu.d.ts +9 -0
  17. package/dist/components/AlignMenu/AlignMenuDrop.d.ts +3 -0
  18. package/dist/components/AlignMenu/index.d.ts +1 -0
  19. package/dist/components/AutoExpandingDemo.d.ts +6 -0
  20. package/dist/components/BlockFormatMenu/BlockFormatMenu.d.ts +4 -0
  21. package/dist/components/BlockFormatMenu/constants.d.ts +14 -0
  22. package/dist/components/BlockFormatMenu/index.d.ts +1 -0
  23. package/dist/components/ChartEditDialog.d.ts +9 -0
  24. package/dist/components/ChartInsertDialog.d.ts +8 -0
  25. package/dist/components/CodeActionMenuPlugin/components/CopyButton/index.d.ts +7 -0
  26. package/dist/components/CodeActionMenuPlugin/components/PrettierButton/index.d.ts +9 -0
  27. package/dist/components/CodeActionMenuPlugin/index.d.ts +4 -0
  28. package/dist/components/CodeActionMenuPlugin/utils.d.ts +1 -0
  29. package/dist/components/ColorPicker/ColorPicker.d.ts +4 -0
  30. package/dist/components/ColorPicker/index.d.ts +1 -0
  31. package/dist/components/CommentSidebar/CommentSidebar.d.ts +8 -0
  32. package/dist/components/CommentSidebar/index.d.ts +1 -0
  33. package/dist/components/CommentToggle/CommentToggle.d.ts +8 -0
  34. package/dist/components/CommentToggle/index.d.ts +1 -0
  35. package/dist/components/CommentView/CommentView.d.ts +9 -0
  36. package/dist/components/CommentView/index.d.ts +1 -0
  37. package/dist/components/ConfigurableEditorWithAuth.d.ts +24 -0
  38. package/dist/components/DatePicker/DatePickerWidget.d.ts +8 -0
  39. package/dist/components/EmojiPickerWidget/EmojiPickerWidget.d.ts +4 -0
  40. package/dist/components/EmojiPickerWidget/index.d.ts +1 -0
  41. package/dist/components/FeatureSuggestionDialog/index.d.ts +6 -0
  42. package/dist/components/FileUpload/InsertFileDialog.d.ts +7 -0
  43. package/dist/components/FileUpload/InsertFileUploadedDialogBody.d.ts +5 -0
  44. package/dist/components/FileView/index.d.ts +9 -0
  45. package/dist/components/FontFamilySelect/FontFamilyMenu.d.ts +8 -0
  46. package/dist/components/FontSizePicker/FontSizeControl.d.ts +3 -0
  47. package/dist/components/FormatTextMenu/FormatTextMenu.d.ts +4 -0
  48. package/dist/components/FormatTextMenu/FormatTextMenuDrop.d.ts +4 -0
  49. package/dist/components/FormatTextMenu/index.d.ts +1 -0
  50. package/dist/components/HighlightColorPicker/HighlightColorPicker.d.ts +7 -0
  51. package/dist/components/HtmlViewDisplay.d.ts +3 -0
  52. package/dist/components/ImageComparisonDialog/index.d.ts +11 -0
  53. package/dist/components/ImageGenerationDialog/ImageGenerationManager.d.ts +11 -0
  54. package/dist/components/ImageGenerationDialog/index.d.ts +11 -0
  55. package/dist/components/ImageInsertTest.d.ts +3 -0
  56. package/dist/components/ImageView/ImageDialog/ImageUploadDialogBody.d.ts +9 -0
  57. package/dist/components/ImageView/ImageDialog/index.d.ts +6 -0
  58. package/dist/components/ImageView/ImageResizer.d.ts +16 -0
  59. package/dist/components/ImageView/index.d.ts +18 -0
  60. package/dist/components/InsertMenu/InsertMenu.d.ts +9 -0
  61. package/dist/components/InsertMenu/InsertMenuDrop.d.ts +9 -0
  62. package/dist/components/InsertMenu/index.d.ts +1 -0
  63. package/dist/components/LanguageSelectorDialog/index.d.ts +8 -0
  64. package/dist/components/NotePanelMenu/NotePanelMenu.d.ts +6 -0
  65. package/dist/components/NotePanelMenu/index.d.ts +1 -0
  66. package/dist/components/NotePanelView/NotePanelView.d.ts +10 -0
  67. package/dist/components/NotePanelView/index.d.ts +1 -0
  68. package/dist/components/Placeholder/Placeholder.d.ts +4 -0
  69. package/dist/components/Placeholder/index.d.ts +1 -0
  70. package/dist/components/Placeholder/styles.d.ts +1 -0
  71. package/dist/components/ScopedEditor.d.ts +8 -0
  72. package/dist/components/SignatureCaption/index.d.ts +6 -0
  73. package/dist/components/TableColorPicker/index.d.ts +8 -0
  74. package/dist/components/TableModal/TableModal.d.ts +10 -0
  75. package/dist/components/TextEnhanceDialog/index.d.ts +10 -0
  76. package/dist/components/ToneAdjustDialog/index.d.ts +8 -0
  77. package/dist/components/Toolbar/Toolbar.d.ts +4 -0
  78. package/dist/components/Toolbar/index.d.ts +1 -0
  79. package/dist/components/Toolbar/styles.d.ts +6 -0
  80. package/dist/components/VoiceTranscriptIcon/VoiceTranscriptIcon.d.ts +2 -0
  81. package/dist/components/VoiceTranscriptIcon/index.d.ts +1 -0
  82. package/dist/components/ui/avatar.d.ts +6 -0
  83. package/dist/components/ui/badge.d.ts +9 -0
  84. package/dist/components/ui/button.d.ts +11 -0
  85. package/dist/components/ui/calendar.d.ts +8 -0
  86. package/dist/components/ui/card.d.ts +8 -0
  87. package/dist/components/ui/checkbox.d.ts +4 -0
  88. package/dist/components/ui/dialog.d.ts +19 -0
  89. package/dist/components/ui/dropdown-menu.d.ts +27 -0
  90. package/dist/components/ui/input.d.ts +3 -0
  91. package/dist/components/ui/label.d.ts +5 -0
  92. package/dist/components/ui/popover.d.ts +7 -0
  93. package/dist/components/ui/select.d.ts +13 -0
  94. package/dist/components/ui/separator.d.ts +4 -0
  95. package/dist/components/ui/sheet.d.ts +25 -0
  96. package/dist/components/ui/skeleton.d.ts +3 -0
  97. package/dist/components/ui/tabs.d.ts +7 -0
  98. package/dist/components/ui/textarea.d.ts +3 -0
  99. package/dist/components/ui/tooltip.d.ts +7 -0
  100. package/dist/constants.d.ts +40 -0
  101. package/dist/context/CommentContext.d.ts +43 -0
  102. package/dist/context/HtmlViewContext.d.ts +17 -0
  103. package/dist/context/ToolbarContext.d.ts +57 -0
  104. package/dist/editorConfig.d.ts +48 -0
  105. package/dist/estree-164983f6.js +4691 -0
  106. package/dist/estree-164983f6.js.map +1 -0
  107. package/dist/hooks/useAutoExpandingHeight.d.ts +15 -0
  108. package/dist/hooks/useBlockFormat.d.ts +20 -0
  109. package/dist/hooks/useColorPicker.d.ts +6 -0
  110. package/dist/hooks/useCustomCommands.d.ts +3 -0
  111. package/dist/hooks/useDebounce.d.ts +1 -0
  112. package/dist/hooks/useEditorToolbar.d.ts +10 -0
  113. package/dist/hooks/useInsertMenu.d.ts +9 -0
  114. package/dist/hooks/useModal.d.ts +5 -0
  115. package/dist/hooks/useReactNativeBridge.d.ts +54 -0
  116. package/dist/hooks/useS3Uploader.d.ts +11 -0
  117. package/dist/hooks/useVoiceToText.d.ts +15 -0
  118. package/dist/html-5586dbf6.js +2930 -0
  119. package/dist/html-5586dbf6.js.map +1 -0
  120. package/dist/html2pdf.bundle-8d3a50b2.js +46128 -0
  121. package/dist/html2pdf.bundle-8d3a50b2.js.map +1 -0
  122. package/dist/html2pdf.bundle.min-d80d5aa7.js +21987 -0
  123. package/dist/html2pdf.bundle.min-d80d5aa7.js.map +1 -0
  124. package/dist/index-68349a2f.js +1286 -0
  125. package/dist/index-68349a2f.js.map +1 -0
  126. package/dist/index-e6dfde84.js +41188 -0
  127. package/dist/index-e6dfde84.js.map +1 -0
  128. package/dist/index-e7705f79.js +190 -0
  129. package/dist/index-e7705f79.js.map +1 -0
  130. package/dist/index.d.ts +10 -0
  131. package/dist/index.js +50 -0
  132. package/dist/index.js.map +1 -0
  133. package/dist/lib/utils.d.ts +2 -0
  134. package/dist/main.d.ts +0 -0
  135. package/dist/markdown-d513479b.js +3806 -0
  136. package/dist/markdown-d513479b.js.map +1 -0
  137. package/dist/nodes/ChartNode.d.ts +41 -0
  138. package/dist/nodes/CommentNode.d.ts +34 -0
  139. package/dist/nodes/CommentedTextNode.d.ts +29 -0
  140. package/dist/nodes/EmbedNode.d.ts +32 -0
  141. package/dist/nodes/FileNode.d.ts +32 -0
  142. package/dist/nodes/ImageNode.d.ts +65 -0
  143. package/dist/nodes/MentionNode.d.ts +75 -0
  144. package/dist/nodes/NotePanelNode.d.ts +31 -0
  145. package/dist/pages/ConfigurableEditor/ConfigurableEditor.d.ts +26 -0
  146. package/dist/pages/ConfigurableEditor/index.d.ts +2 -0
  147. package/dist/pages/NotFound.d.ts +2 -0
  148. package/dist/pages/RichTextEditor.d.ts +6 -0
  149. package/dist/pages/TextareaEditor.d.ts +6 -0
  150. package/dist/pages/styles.d.ts +5 -0
  151. package/dist/pcm-processor.js +50 -0
  152. package/dist/plugins/AIChatPlugin.d.ts +11 -0
  153. package/dist/plugins/AndroidKeyboardFixPlugin.d.ts +16 -0
  154. package/dist/plugins/AutocompletePlugin.d.ts +22 -0
  155. package/dist/plugins/CodeBlockNormalizerPlugin.d.ts +8 -0
  156. package/dist/plugins/CodeBlockSelectAllPlugin.d.ts +8 -0
  157. package/dist/plugins/CodeHighlightPlugin.d.ts +3 -0
  158. package/dist/plugins/CombinedAutocompletGrammarPlugin.d.ts +20 -0
  159. package/dist/plugins/CommentBubblePlugin.d.ts +3 -0
  160. package/dist/plugins/CommentPlugin.d.ts +8 -0
  161. package/dist/plugins/CustomHorizontalRulePlugin/CustomHorizontalRuleNode.d.ts +30 -0
  162. package/dist/plugins/CustomHorizontalRulePlugin/CustomHorizontalRulePlugin.d.ts +3 -0
  163. package/dist/plugins/CustomHorizontalRulePlugin/HorizontalRuleCustomizationDialog.d.ts +8 -0
  164. package/dist/plugins/CustomHorizontalRulePlugin/index.d.ts +3 -0
  165. package/dist/plugins/DragDropPastePlugin/index.d.ts +8 -0
  166. package/dist/plugins/EmbedPreviewPlugin/FloatingEmbedMenuPlugin.d.ts +3 -0
  167. package/dist/plugins/EmbedPreviewPlugin/index.d.ts +6 -0
  168. package/dist/plugins/FilePlugin.d.ts +8 -0
  169. package/dist/plugins/FloatingEnhanceButton/index.d.ts +4 -0
  170. package/dist/plugins/FloatingLinkEditorPlugin/index.d.ts +6 -0
  171. package/dist/plugins/FloatingTextFormatToolbarPlugin/index.d.ts +27 -0
  172. package/dist/plugins/GrammarCheckPlugin.d.ts +1 -0
  173. package/dist/plugins/HtmlCodeViewPlugin/index.d.ts +2 -0
  174. package/dist/plugins/HtmlImportPlugin.d.ts +5 -0
  175. package/dist/plugins/HtmlSyncPlugin.d.ts +3 -0
  176. package/dist/plugins/ImagePlugin.d.ts +9 -0
  177. package/dist/plugins/LinkPlugin/index.d.ts +6 -0
  178. package/dist/plugins/LinkPreviewPlugin/index.d.ts +4 -0
  179. package/dist/plugins/LocalStoragePlugin.d.ts +8 -0
  180. package/dist/plugins/MarkdownShortcutsPlugin/index.d.ts +20 -0
  181. package/dist/plugins/MentionsPlugin/index.d.ts +7 -0
  182. package/dist/plugins/NotePanelPlugin.d.ts +7 -0
  183. package/dist/plugins/PasteOptionsPlugin/index.d.ts +17 -0
  184. package/dist/plugins/RichTextPastePlugin/index.d.ts +6 -0
  185. package/dist/plugins/SignatureCanvasPlugin/SignatureCanvasDialog.d.ts +6 -0
  186. package/dist/plugins/SignatureCanvasPlugin/SignatureCanvasPlugin.d.ts +9 -0
  187. package/dist/plugins/SignatureCanvasPlugin/index.d.ts +2 -0
  188. package/dist/plugins/SlashCommandPlugin/index.d.ts +2 -0
  189. package/dist/plugins/TableActionMenuPlugin/index.d.ts +6 -0
  190. package/dist/plugins/TableCellResizer/index.d.ts +2 -0
  191. package/dist/plugins/TableHoverActionsPlugin/index.d.ts +4 -0
  192. package/dist/plugins/TablePlugin.d.ts +5 -0
  193. package/dist/plugins/Tableimageautoresizeplugin.d.ts +1 -0
  194. package/dist/plugins/TextEnhancePlugin.d.ts +6 -0
  195. package/dist/plugins/TreeViewPlugin.d.ts +3 -0
  196. package/dist/plugins/UsageTrackingPlugin.d.ts +15 -0
  197. package/dist/plugins/VoiceTranscriptPlugin.d.ts +21 -0
  198. package/dist/plugins/WordCountPlugin.d.ts +3 -0
  199. package/dist/postcss-f084f74d.js +5420 -0
  200. package/dist/postcss-f084f74d.js.map +1 -0
  201. package/dist/standalone-5a8c6b7e.js +2518 -0
  202. package/dist/standalone-5a8c6b7e.js.map +1 -0
  203. package/dist/styles/PlaygroundEditorTheme.d.ts +3 -0
  204. package/dist/types.d.ts +155 -0
  205. package/dist/typescript-b1005db4.js +13705 -0
  206. package/dist/typescript-b1005db4.js.map +1 -0
  207. package/dist/ui/ColorPicker.d.ts +14 -0
  208. package/dist/ui/Icons.d.ts +48 -0
  209. package/dist/ui/TextInput.d.ts +11 -0
  210. package/dist/utils/dateFormats.d.ts +33 -0
  211. package/dist/utils/debounce.d.ts +6 -0
  212. package/dist/utils/editorStyleConverter.d.ts +17 -0
  213. package/dist/utils/export.d.ts +2 -0
  214. package/dist/utils/getDOMRangeRect.d.ts +13 -0
  215. package/dist/utils/getSelectedNode.d.ts +3 -0
  216. package/dist/utils/helper.d.ts +3 -0
  217. package/dist/utils/index.d.ts +5 -0
  218. package/dist/utils/invarient.d.ts +1 -0
  219. package/dist/utils/setFloatingElemPosition.d.ts +8 -0
  220. package/dist/utils/setFloatingElemPositionForLinkEditor.d.ts +1 -0
  221. package/dist/utils/url.d.ts +9 -0
  222. package/dist/vite.svg +1 -0
  223. package/package.json +127 -0
package/README.md ADDED
@@ -0,0 +1,444 @@
1
+ # Eddyter
2
+
3
+ A configurable rich text editor component with API key authentication.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install eddyter
9
+ # or
10
+ yarn add eddyter
11
+ ```
12
+
13
+ ## Features
14
+
15
+ - Rich text editor with extensive formatting options
16
+ - API key authentication
17
+ - Configurable UI components (toolbar, floating menu)
18
+ - HTML view option
19
+ - Support for tables, images, links, and more
20
+ - AI chat integration (for premium plans)
21
+ - Environment-based API configuration
22
+
23
+ ## React Native Integration
24
+
25
+ You can use Eddyter in React Native applications via WebView by loading a deployed version of the editor.
26
+
27
+ ### Prerequisites
28
+
29
+ ```bash
30
+ npm install react-native-webview
31
+ # or
32
+ yarn add react-native-webview
33
+ ```
34
+
35
+ ### RichTextEditor Component
36
+
37
+ Create a reusable `RichTextEditor` component that wraps the WebView:
38
+
39
+ ```tsx
40
+ import React, { useRef, useState, useCallback } from 'react';
41
+ import { View, ActivityIndicator, Text, StyleSheet } from 'react-native';
42
+ import { WebView, WebViewMessageEvent } from 'react-native-webview';
43
+
44
+ interface RichTextEditorProps {
45
+ editorBaseUrl: string;
46
+ apiKey: string;
47
+ initialContent?: string;
48
+ theme?: 'light' | 'dark';
49
+ style?: object;
50
+ onChange?: (content: string) => void;
51
+ onReady?: () => void;
52
+ onAuthSuccess?: () => void;
53
+ onAuthError?: (error: string) => void;
54
+ }
55
+
56
+ interface WebViewMessage {
57
+ type: string;
58
+ payload?: Record<string, unknown>;
59
+ }
60
+
61
+ export const RichTextEditor: React.FC<RichTextEditorProps> = ({
62
+ editorBaseUrl,
63
+ apiKey,
64
+ initialContent,
65
+ theme = 'light',
66
+ style,
67
+ onChange,
68
+ onReady,
69
+ onAuthSuccess,
70
+ onAuthError,
71
+ }) => {
72
+ const webViewRef = useRef<WebView>(null);
73
+ const [isLoading, setIsLoading] = useState(true);
74
+ const [error, setError] = useState<string | null>(null);
75
+
76
+ const buildEditorUrl = () => {
77
+ const baseUrl = editorBaseUrl.replace(/\/$/, '');
78
+ const params = new URLSearchParams();
79
+ if (apiKey) params.append('apiKey', apiKey);
80
+ if (theme) params.append('theme', theme);
81
+ return `${baseUrl}?${params.toString()}`;
82
+ };
83
+
84
+ const handleMessage = useCallback((event: WebViewMessageEvent) => {
85
+ try {
86
+ const message: WebViewMessage = JSON.parse(event.nativeEvent.data);
87
+
88
+ switch (message.type) {
89
+ case 'EDITOR_READY':
90
+ setIsLoading(false);
91
+ onReady?.();
92
+ // Send initial content after editor is ready
93
+ if (initialContent && webViewRef.current) {
94
+ webViewRef.current.postMessage(
95
+ JSON.stringify({
96
+ type: 'SET_CONTENT',
97
+ payload: { content: initialContent },
98
+ })
99
+ );
100
+ }
101
+ break;
102
+
103
+ case 'CONTENT_CHANGE':
104
+ onChange?.(message.payload?.content as string || '');
105
+ break;
106
+
107
+ case 'AUTH_SUCCESS':
108
+ onAuthSuccess?.();
109
+ break;
110
+
111
+ case 'AUTH_ERROR':
112
+ onAuthError?.(message.payload?.error as string);
113
+ break;
114
+ }
115
+ } catch (e) {
116
+ console.warn('[RichTextEditor] Failed to parse message:', e);
117
+ }
118
+ }, [onChange, onReady, onAuthSuccess, onAuthError, initialContent]);
119
+
120
+ const handleError = useCallback((syntheticEvent: any) => {
121
+ const { nativeEvent } = syntheticEvent;
122
+ setError(nativeEvent.description || 'Failed to load editor');
123
+ setIsLoading(false);
124
+ }, []);
125
+
126
+ if (error) {
127
+ return (
128
+ <View style={styles.errorContainer}>
129
+ <Text style={styles.errorText}>Failed to load editor</Text>
130
+ <Text style={styles.errorDetail}>{error}</Text>
131
+ </View>
132
+ );
133
+ }
134
+
135
+ return (
136
+ <View style={[styles.container, style]}>
137
+ <WebView
138
+ ref={webViewRef}
139
+ source={{ uri: buildEditorUrl() }}
140
+ style={styles.webview}
141
+ onMessage={handleMessage}
142
+ onError={handleError}
143
+ javaScriptEnabled={true}
144
+ domStorageEnabled={true}
145
+ startInLoadingState={false}
146
+ scalesPageToFit={true}
147
+ allowsInlineMediaPlayback={true}
148
+ keyboardDisplayRequiresUserAction={false}
149
+ />
150
+ {isLoading && (
151
+ <View style={styles.loadingOverlay}>
152
+ <ActivityIndicator size="large" color="#007AFF" />
153
+ </View>
154
+ )}
155
+ </View>
156
+ );
157
+ };
158
+
159
+ const styles = StyleSheet.create({
160
+ container: { flex: 1 },
161
+ webview: { flex: 1, backgroundColor: 'transparent' },
162
+ loadingOverlay: {
163
+ ...StyleSheet.absoluteFillObject,
164
+ justifyContent: 'center',
165
+ alignItems: 'center',
166
+ backgroundColor: 'rgba(255, 255, 255, 0.9)',
167
+ },
168
+ errorContainer: { flex: 1, justifyContent: 'center', alignItems: 'center', padding: 20 },
169
+ errorText: { fontSize: 18, fontWeight: 'bold', color: '#FF3B30' },
170
+ errorDetail: { fontSize: 14, color: '#666', marginTop: 8, textAlign: 'center' },
171
+ });
172
+ ```
173
+
174
+ ### Usage Example
175
+
176
+ ```tsx
177
+ import React, { useState } from 'react';
178
+ import { View, KeyboardAvoidingView, Platform } from 'react-native';
179
+ import { RichTextEditor } from './components/RichTextEditor';
180
+
181
+ const EDITOR_CONFIG = {
182
+ editorBaseUrl: 'https://your-deployed-editor-url.com',
183
+ apiKey: 'your-api-key',
184
+ };
185
+
186
+ function NoteEditorScreen() {
187
+ const [content, setContent] = useState('');
188
+
189
+ return (
190
+ <KeyboardAvoidingView
191
+ style={{ flex: 1 }}
192
+ behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
193
+ >
194
+ <RichTextEditor
195
+ editorBaseUrl={EDITOR_CONFIG.editorBaseUrl}
196
+ apiKey={EDITOR_CONFIG.apiKey}
197
+ theme="light"
198
+ initialContent="<p>Start writing...</p>"
199
+ onChange={setContent}
200
+ onReady={() => console.log('Editor ready')}
201
+ onAuthSuccess={() => console.log('Authenticated')}
202
+ onAuthError={(error) => console.error('Auth failed:', error)}
203
+ />
204
+ </KeyboardAvoidingView>
205
+ );
206
+ }
207
+ ```
208
+
209
+ ### Message Protocol
210
+
211
+ The editor and React Native communicate via `postMessage`. Here are the supported message types:
212
+
213
+ | Message Type | Direction | Description |
214
+ |--------------|-----------|-------------|
215
+ | `EDITOR_READY` | Editor → RN | Editor has finished loading |
216
+ | `CONTENT_CHANGE` | Editor → RN | Content was modified (payload: `{ content: string }`) |
217
+ | `AUTH_SUCCESS` | Editor → RN | API key authentication succeeded |
218
+ | `AUTH_ERROR` | Editor → RN | Authentication failed (payload: `{ error: string }`) |
219
+ | `SET_CONTENT` | RN → Editor | Set editor content (payload: `{ content: string }`) |
220
+
221
+ ### Sending Content to Editor
222
+
223
+ After receiving the `EDITOR_READY` message, you can programmatically set content:
224
+
225
+ ```tsx
226
+ webViewRef.current?.postMessage(
227
+ JSON.stringify({
228
+ type: 'SET_CONTENT',
229
+ payload: { content: '<p>New content here</p>' },
230
+ })
231
+ );
232
+ ```
233
+
234
+ ## Usage
235
+
236
+ ### Important: Importing Styles
237
+ To ensure proper styling of the editor components including tables, you must import the package's CSS:
238
+
239
+ ```jsx
240
+ // Import the styles in your application
241
+ import 'eddyter/style.css';
242
+ ```
243
+
244
+ ### Basic Setup
245
+
246
+ ```jsx
247
+ import React from 'react';
248
+ import {
249
+ ConfigurableEditorWithAuth,
250
+ EditorProvider,
251
+ defaultEditorConfig
252
+ } from 'eddyter';
253
+ // Import required styles
254
+ import 'eddyter/style.css';
255
+
256
+ function App() {
257
+ const apiKey = 'your-api-key'; // Replace with your actual API key
258
+
259
+ // Current logged-in user for comments
260
+ const currentUser = {
261
+ id: 'user-123',
262
+ name: 'John Doe',
263
+ email: 'john@example.com',
264
+ avatar: 'https://example.com/avatar.jpg' // optional
265
+ };
266
+
267
+ const handleContentChange = (html) => {
268
+ console.log('Editor HTML content:', html);
269
+ // Handle the HTML content (save to state, send to server, etc.)
270
+ };
271
+
272
+ return (
273
+ <EditorProvider
274
+ defaultFontFamilies={defaultEditorConfig.defaultFontFamilies}
275
+ currentUser={currentUser}
276
+ >
277
+ <ConfigurableEditorWithAuth
278
+ apiKey={apiKey}
279
+ onChange={handleContentChange}
280
+ initialContent="<p>Welcome to the editor!</p>"
281
+ mentionUserList={["Alice", "Bob", "Charlie"]}
282
+ onAuthSuccess={() => console.log('Authentication successful')}
283
+ onAuthError={(error) => console.error('Authentication error:', error)}
284
+ />
285
+ </EditorProvider>
286
+ );
287
+ }
288
+ ```
289
+
290
+ ## API Reference
291
+
292
+ ### EditorProvider
293
+
294
+ Provides authentication and configuration context for the editor.
295
+
296
+ #### Props
297
+
298
+ - `children`: React nodes to render
299
+ - `defaultFontFamilies`: Array of font names (optional)
300
+ - `currentUser`: Current logged-in user for comments (optional) - Object with `id`, `name`, `email`, and optional `avatar`
301
+
302
+ ### ConfigurableEditorWithAuth
303
+
304
+ The main editor component with authentication.
305
+
306
+ #### Props
307
+
308
+ - `apiKey`: Your API key for authentication (required)
309
+ - `initialContent`: Initial HTML content for the editor (optional) - string
310
+ - `onChange`: Callback function when editor content changes (optional) - receives HTML string
311
+ - `defaultFontFamilies`: Array of font names for the font selector (optional)
312
+ - `mentionUserList`: Array of usernames for mention functionality (optional) - Array of strings like `["Alice", "Bob", "Charlie"]`
313
+ - `onAuthSuccess`: Callback function when authentication is successful (optional)
314
+ - `onAuthError`: Callback function when authentication fails (optional)
315
+ - `customVerifyKey`: Custom function to verify API key (optional)
316
+
317
+ ## Examples
318
+
319
+ ### Basic Editor with Authentication
320
+
321
+ ```jsx
322
+ import React from 'react';
323
+ import { ConfigurableEditorWithAuth, EditorProvider } from 'eddyter';
324
+ import 'eddyter/style.css';
325
+
326
+ function App() {
327
+ return (
328
+ <EditorProvider>
329
+ <ConfigurableEditorWithAuth
330
+ apiKey="your-api-key"
331
+ onAuthSuccess={() => console.log('Authenticated')}
332
+ onAuthError={(error) => console.error(error)}
333
+ />
334
+ </EditorProvider>
335
+ );
336
+ }
337
+ ```
338
+
339
+ ### Editor with Content Handling
340
+
341
+ ```jsx
342
+ import React, { useState } from 'react';
343
+ import { ConfigurableEditorWithAuth, EditorProvider } from 'eddyter';
344
+ import 'eddyter/style.css';
345
+
346
+ function App() {
347
+ const [editorContent, setEditorContent] = useState('');
348
+
349
+ // Current user (typically from your auth system)
350
+ const currentUser = {
351
+ id: 'user-456',
352
+ name: 'Jane Smith',
353
+ email: 'jane@example.com'
354
+ };
355
+
356
+ const handleContentChange = (html) => {
357
+ setEditorContent(html);
358
+ console.log('Current content:', html);
359
+ // You can also save to localStorage, send to API, etc.
360
+ };
361
+
362
+ const handleSave = () => {
363
+ // Save the HTML content to your backend or localStorage
364
+ localStorage.setItem('saved-content', editorContent);
365
+ console.log('Content saved!');
366
+ };
367
+
368
+ const loadSavedContent = () => {
369
+ const saved = '<p>Start writing your content here...</p>';
370
+ return saved;
371
+ };
372
+
373
+ return (
374
+ <div>
375
+ <EditorProvider currentUser={currentUser}>
376
+ <ConfigurableEditorWithAuth
377
+ apiKey="your-api-key"
378
+ initialContent={loadSavedContent()}
379
+ onChange={handleContentChange}
380
+ defaultFontFamilies={['Arial', 'Helvetica', 'Times New Roman']}
381
+ mentionUserList={['Alice', 'Bob', 'Charlie']}
382
+ onAuthSuccess={() => console.log('Ready to edit!')}
383
+ onAuthError={(error) => console.error('Auth failed:', error)}
384
+ />
385
+ </EditorProvider>
386
+
387
+ <button onClick={handleSave} style={{ marginTop: '10px', padding: '10px' }}>
388
+ Save Content
389
+ </button>
390
+
391
+ <div style={{ marginTop: '20px', padding: '10px', background: '#f5f5f5' }}>
392
+ <h3>Current HTML Content:</h3>
393
+ <pre>{editorContent}</pre>
394
+ </div>
395
+ </div>
396
+ );
397
+ }
398
+ ```
399
+
400
+ ### Custom API Key Verification
401
+
402
+ ```jsx
403
+ import React from 'react';
404
+ import { ConfigurableEditorWithAuth, EditorProvider } from 'eddyter';
405
+ import 'eddyter/style.css';
406
+
407
+ function App() {
408
+ const customVerifyKey = async (apiKey) => {
409
+ try {
410
+ const response = await fetch('/api/verify-key', {
411
+ method: 'POST',
412
+ headers: { 'Content-Type': 'application/json' },
413
+ body: JSON.stringify({ apiKey })
414
+ });
415
+
416
+ const data = await response.json();
417
+
418
+ return {
419
+ success: data.valid,
420
+ message: data.message || 'API key verified'
421
+ };
422
+ } catch (error) {
423
+ return {
424
+ success: false,
425
+ message: 'Failed to verify API key'
426
+ };
427
+ }
428
+ };
429
+
430
+ return (
431
+ <EditorProvider>
432
+ <ConfigurableEditorWithAuth
433
+ apiKey="your-api-key"
434
+ customVerifyKey={customVerifyKey}
435
+ onChange={(html) => console.log('Content changed:', html)}
436
+ />
437
+ </EditorProvider>
438
+ );
439
+ }
440
+ ```
441
+
442
+ ## License
443
+
444
+ This project is licensed under the MIT License - see the LICENSE file for details.
package/dist/App.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { FC } from 'react';
2
+ declare const App: FC;
3
+ export default App;
@@ -0,0 +1,27 @@
1
+ import { EditorConfigTypes } from '../types';
2
+ export interface CurrentUser {
3
+ id: string;
4
+ name: string;
5
+ email?: string;
6
+ avatar?: string;
7
+ }
8
+ interface EditorContextType {
9
+ isAuthenticated: boolean;
10
+ isLoading: boolean;
11
+ error: string | null;
12
+ editorConfig: EditorConfigTypes | null;
13
+ projectName: string | null;
14
+ isPaidPlan: boolean;
15
+ apiKey: string | null;
16
+ currentUser: CurrentUser | null;
17
+ verifyKey: (apiKey: string) => Promise<void>;
18
+ }
19
+ export declare const useEditor: () => EditorContextType;
20
+ interface EditorProviderProps {
21
+ children: React.ReactNode;
22
+ defaultFontFamilies?: string[];
23
+ mentionUserList?: string[];
24
+ currentUser?: CurrentUser;
25
+ }
26
+ export declare const EditorProvider: React.FC<EditorProviderProps>;
27
+ export {};
@@ -0,0 +1,6 @@
1
+ import { ReactNode } from 'react';
2
+ interface LexicalProviderProps {
3
+ children: ReactNode;
4
+ }
5
+ declare const LexicalProvider: ({ children }: LexicalProviderProps) => import("react/jsx-runtime").JSX.Element;
6
+ export default LexicalProvider;
@@ -0,0 +1,31 @@
1
+ type AiStreamType = {
2
+ content: string;
3
+ onMessage: (message: string) => void;
4
+ };
5
+ export declare const AiStream: ({ content, onMessage }: AiStreamType) => Promise<void>;
6
+ export declare const AiJsonResponse: ({ content }: {
7
+ content: string;
8
+ }) => Promise<any>;
9
+ export declare const AiImageResponse: ({ content }: {
10
+ content: string;
11
+ }) => Promise<any>;
12
+ export declare const AiEditorAction: ({ content, provider, apiKey, }: {
13
+ content: string;
14
+ provider?: string | undefined;
15
+ apiKey?: string | undefined;
16
+ }) => Promise<any>;
17
+ export declare const AiTextEnhance: ({ content, apiKey }: {
18
+ content: string;
19
+ apiKey?: string | undefined;
20
+ }) => Promise<any>;
21
+ export declare const GetCreditsInfo: ({ apiKey }: {
22
+ apiKey?: string | undefined;
23
+ }) => Promise<any>;
24
+ export declare const GetUserInfo: ({ apiKey }: {
25
+ apiKey?: string | undefined;
26
+ }) => Promise<any>;
27
+ export declare const AiTextTransform: ({ content, apiKey }: {
28
+ content: string;
29
+ apiKey?: string | undefined;
30
+ }) => Promise<any>;
31
+ export {};
@@ -0,0 +1,108 @@
1
+ export interface EditorConfig {
2
+ customizations: {
3
+ enableToolbar: boolean;
4
+ toolbarOptions: {
5
+ enableUndoRedo: boolean;
6
+ enableTextFormatting: boolean;
7
+ enableAlignment: boolean;
8
+ enableFontControls: boolean;
9
+ enableTableOptions: boolean;
10
+ enableInsertMenu: boolean;
11
+ enableColorPicker: boolean;
12
+ enableClearOptions: boolean;
13
+ enableEmojiPicker: boolean;
14
+ enableLinks: boolean;
15
+ enableFormatTextMenu: boolean;
16
+ enableCodeFormat: boolean;
17
+ enableAIChat: boolean;
18
+ enableTodoList: boolean;
19
+ enableHtmlViewToggle: boolean;
20
+ enableAutocompleteToggle: boolean;
21
+ };
22
+ enableFloatingMenu: boolean;
23
+ htmlViewOption: boolean;
24
+ floatingMenuOptions: {
25
+ bold: boolean;
26
+ italic: boolean;
27
+ underline: boolean;
28
+ uppercase: boolean;
29
+ lowercase: boolean;
30
+ capitalize: boolean;
31
+ strikethrough: boolean;
32
+ subscript: boolean;
33
+ superscript: boolean;
34
+ code: boolean;
35
+ link: boolean;
36
+ aiChat: boolean;
37
+ comment: boolean;
38
+ improve: boolean;
39
+ };
40
+ };
41
+ expiresAt: string;
42
+ isValid: boolean;
43
+ paidPlan: boolean;
44
+ status: string;
45
+ }
46
+ export interface ProjectData {
47
+ id: string;
48
+ name: string;
49
+ paidPlan: boolean;
50
+ customizations: {
51
+ enableToolbar: boolean;
52
+ toolbarOptions: {
53
+ enableUndoRedo: boolean;
54
+ enableTextFormatting: boolean;
55
+ enableAlignment: boolean;
56
+ enableFontControls: boolean;
57
+ enableTableOptions: boolean;
58
+ enableInsertMenu: boolean;
59
+ enableColorPicker: boolean;
60
+ enableClearOptions: boolean;
61
+ enableEmojiPicker: boolean;
62
+ enableLinks: boolean;
63
+ enableFormatTextMenu: boolean;
64
+ enableCodeFormat: boolean;
65
+ enableAIChat: boolean;
66
+ enableTodoList: boolean;
67
+ enableAutocompleteToggle: boolean;
68
+ };
69
+ enableFloatingMenu: boolean;
70
+ htmlViewOption: boolean;
71
+ floatingMenuOptions: {
72
+ bold: boolean;
73
+ italic: boolean;
74
+ underline: boolean;
75
+ uppercase: boolean;
76
+ lowercase: boolean;
77
+ capitalize: boolean;
78
+ strikethrough: boolean;
79
+ subscript: boolean;
80
+ superscript: boolean;
81
+ code: boolean;
82
+ link: boolean;
83
+ aiChat: boolean;
84
+ comment: boolean;
85
+ improve: boolean;
86
+ };
87
+ };
88
+ expiresAt: string;
89
+ isValid: boolean;
90
+ status: string;
91
+ createdAt: string;
92
+ updatedAt: string;
93
+ }
94
+ export interface ApiResponse {
95
+ success: boolean;
96
+ message: string;
97
+ data: ProjectData;
98
+ }
99
+ /**
100
+ * Internal function to get the API endpoint
101
+ * This encapsulates the endpoint logic within the package
102
+ */
103
+ export declare const getApiEndpoint: () => string;
104
+ /**
105
+ * Verify the API key by making a request to the API endpoint
106
+ * @param apiKey The API key to verify
107
+ */
108
+ export declare const verifyApiKey: (apiKey: string) => Promise<ApiResponse>;
@@ -0,0 +1,2 @@
1
+ import { AxiosInstance } from 'axios';
2
+ export declare const backendAPI: AxiosInstance;
@@ -0,0 +1,21 @@
1
+ export declare const apiEndpoints: {
2
+ chat: {
3
+ stream: string;
4
+ json: string;
5
+ textEnhance: string;
6
+ textTransform: string;
7
+ imageCreation: string;
8
+ editorAction: string;
9
+ credits: string;
10
+ userInfo: string;
11
+ };
12
+ project: {
13
+ fileUpload: string;
14
+ };
15
+ transcript: {
16
+ voiceTranscript: string;
17
+ };
18
+ linkPreview: {
19
+ getPreview: string;
20
+ };
21
+ };
@@ -0,0 +1,23 @@
1
+ export interface FeatureSuggestion {
2
+ id: string;
3
+ title: string;
4
+ description: string;
5
+ link?: string;
6
+ status: string;
7
+ createdAt: string;
8
+ upvotes: number;
9
+ adminResponse?: string;
10
+ isImplemented: boolean;
11
+ reviewedAt?: string;
12
+ reviewedBy?: string;
13
+ tags?: string[];
14
+ }
15
+ export interface CreateSuggestionData {
16
+ title: string;
17
+ description: string;
18
+ link?: string | null;
19
+ tags?: string[];
20
+ }
21
+ export declare class FeatureSuggestionAPI {
22
+ static createSuggestion(data: CreateSuggestionData, apiKey?: string): Promise<FeatureSuggestion>;
23
+ }
@@ -0,0 +1,15 @@
1
+ export interface LinkPreviewData {
2
+ url: string;
3
+ title: string | null;
4
+ description: string | null;
5
+ image: string | null;
6
+ favicon: string | null;
7
+ siteName: string | null;
8
+ type: 'website' | 'image' | 'video' | 'pdf' | 'other';
9
+ contentType?: string;
10
+ }
11
+ export declare function fetchLinkPreview({ url, apiKey, }: {
12
+ url: string;
13
+ apiKey?: string;
14
+ }): Promise<LinkPreviewData | null>;
15
+ export declare function clearLinkPreviewCache(): void;
@@ -0,0 +1 @@
1
+ export declare const getAssemblyAIToken: () => Promise<any>;