Skip to content

Commit e5c9712

Browse files
committed
Merge remote-tracking branch 'origin/LG-5129/ce-undo-redo' into LG-5464/ce-cleanup
2 parents bb9fc90 + 955394d commit e5c9712

28 files changed

+1489
-910
lines changed

packages/code-editor/README.md

Lines changed: 399 additions & 126 deletions
Large diffs are not rendered by default.

packages/code-editor/src/CodeEditor.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import CloudIcon from '@leafygreen-ui/icon/dist/Cloud';
1313

1414
import { CopyButtonAppearance } from './CodeEditor/CodeEditor.types';
1515
import { LanguageName } from './CodeEditor/hooks/extensions/useLanguageExtension';
16-
import { codeSnippets } from './CodeEditor/testing';
1716
import { IndentUnits } from './CodeEditor';
17+
import { codeSnippets } from './testing';
1818
import { CodeEditor, Panel } from '.';
1919

2020
const MyTooltip = ({

packages/code-editor/src/CodeEditor/CodeEditor.spec.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import { forceParsing } from '@codemirror/language';
22
import { EditorState } from '@codemirror/state';
33
import { act, waitFor } from '@testing-library/react';
44

5+
import { renderCodeEditor } from '../testing/testUtils';
6+
57
import { LanguageName } from './hooks/extensions/useLanguageExtension';
6-
import { renderCodeEditor } from './testing/testUtils';
78
import { CopyButtonAppearance } from './CodeEditor.types';
89
import { CodeEditorSelectors } from '.';
910

packages/code-editor/src/CodeEditor/CodeEditor.tsx

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ import React, {
66
useRef,
77
useState,
88
} from 'react';
9-
import { type EditorView } from '@codemirror/view';
9+
import { type EditorView, type ViewUpdate } from '@codemirror/view';
1010

1111
import { useDarkMode } from '@leafygreen-ui/leafygreen-provider';
1212
import { Body } from '@leafygreen-ui/typography';
1313

1414
import { CodeEditorCopyButton } from '../CodeEditorCopyButton';
1515
import { CopyButtonVariant } from '../CodeEditorCopyButton/CodeEditorCopyButton.types';
1616

17+
import { useFormattingModuleLoaders } from './hooks/formatting/useFormattingModuleLoaders';
1718
import {
1819
getCopyButtonStyles,
1920
getEditorStyles,
@@ -75,12 +76,21 @@ export const CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(
7576
const editorViewRef = useRef<EditorView | null>(null);
7677

7778
// Load core modules
78-
const moduleLoaders = useModuleLoaders(props);
79-
const { isLoading, modules } = useLazyModules(moduleLoaders);
79+
const coreModuleLoaders = useModuleLoaders(props);
80+
const { isLoading: isLoadingCoreModules, modules: coreModules } =
81+
useLazyModules(coreModuleLoaders);
82+
83+
// Load formatting modules
84+
const formattingModuleLoaders = useFormattingModuleLoaders(language);
85+
const {
86+
isLoading: isLoadingFormattingModules,
87+
modules: formattingModules,
88+
} = useLazyModules(formattingModuleLoaders);
8089

8190
// Get formatting functionality
8291
const { formatCode, isFormattingAvailable } = useCodeFormatter({
8392
props: { language, indentSize, indentUnit },
93+
modules: formattingModules,
8494
});
8595

8696
// Get custom extensions
@@ -95,7 +105,7 @@ export const CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(
95105
darkMode: darkModeProp,
96106
baseFontSize: baseFontSizeProp,
97107
},
98-
modules,
108+
modules: coreModules,
99109
});
100110

101111
// Get the current contents of the editor
@@ -127,12 +137,14 @@ export const CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(
127137
insert: formattedContent,
128138
},
129139
});
140+
130141
editorViewRef.current.dispatch(transaction);
131142

143+
onChangeProp?.(formattedContent);
144+
132145
// Update controlled value if in controlled mode
133146
if (isControlled) {
134147
setControlledValue(formattedContent);
135-
onChangeProp?.(formattedContent);
136148
}
137149
}
138150

@@ -180,9 +192,9 @@ export const CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(
180192
}, [modules]);
181193

182194
useLayoutEffect(() => {
183-
const EditorView = modules?.['@codemirror/view'];
184-
const commands = modules?.['@codemirror/commands'];
185-
const Prec = modules?.['@codemirror/state']?.Prec;
195+
const EditorView = coreModules?.['@codemirror/view'];
196+
const commands = coreModules?.['@codemirror/commands'];
197+
const Prec = coreModules?.['@codemirror/state']?.Prec;
186198

187199
if (!editorContainerRef?.current || !EditorView || !Prec || !commands) {
188200
return;
@@ -198,7 +210,7 @@ export const CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(
198210

199211
commands.history(),
200212

201-
EditorView.EditorView.updateListener.of(update => {
213+
EditorView.EditorView.updateListener.of((update: ViewUpdate) => {
202214
if (isControlled && update.docChanged) {
203215
const editorText = getContents();
204216
onChangeProp?.(editorText);
@@ -216,7 +228,7 @@ export const CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(
216228
});
217229

218230
if (forceParsingProp) {
219-
const Language = modules?.['@codemirror/language'];
231+
const Language = coreModules?.['@codemirror/language'];
220232
const docLength = editorViewRef.current?.state.doc.length;
221233

222234
if (Language && Language.forceParsing && docLength > 0) {
@@ -231,7 +243,7 @@ export const CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(
231243
};
232244
}, [
233245
value,
234-
modules,
246+
coreModules,
235247
controlledValue,
236248
defaultValue,
237249
isControlled,
@@ -285,11 +297,13 @@ export const CodeEditor = forwardRef<CodeEditorHandle, CodeEditorProps>(
285297
getContentsToCopy={getContents}
286298
className={getCopyButtonStyles(copyButtonAppearance)}
287299
variant={CopyButtonVariant.Button}
288-
disabled={isLoadingProp || isLoading}
300+
disabled={isLoadingProp || isLoadingCoreModules}
289301
data-lgid={CopyButtonLgId}
290302
/>
291303
)}
292-
{(isLoadingProp || isLoading) && (
304+
{(isLoadingProp ||
305+
isLoadingCoreModules ||
306+
isLoadingFormattingModules) && (
293307
<div
294308
className={getLoaderStyles({
295309
theme,

packages/code-editor/src/CodeEditor/hooks/extensions/useAutoCompleteExtension.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { renderHook } from '@testing-library/react';
33
import {
44
createMockAutoCompleteModule,
55
createMockStateModule,
6-
} from '../../testing';
6+
} from '../../../testing';
77

88
import { useAutoCompleteExtension } from './useAutoCompleteExtension';
99

packages/code-editor/src/CodeEditor/hooks/extensions/useCodeFoldingExtension.spec.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import { renderHook } from '@testing-library/react';
22

3-
import { createMockLanguageModule, createMockStateModule } from '../../testing';
3+
import {
4+
createMockLanguageModule,
5+
createMockStateModule,
6+
} from '../../../testing';
47

58
import { useCodeFoldingExtension } from './useCodeFoldingExtension';
69

packages/code-editor/src/CodeEditor/hooks/extensions/useExtension.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { renderHook, waitFor } from '@testing-library/react';
22

3-
import { createMockExtension, createMockStateModule } from '../../testing';
3+
import { createMockExtension, createMockStateModule } from '../../../testing';
44

55
import { useExtension } from './useExtension';
66

packages/code-editor/src/CodeEditor/hooks/extensions/useExtensions.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { renderHook } from '@testing-library/react';
22

3-
import { createComprehensiveFakeModules } from '../../testing';
3+
import { createComprehensiveFakeModules } from '../../../testing';
44

55
import { useExtensions } from './useExtensions';
66

packages/code-editor/src/CodeEditor/hooks/extensions/useHighlightExtension.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
createMockLanguageModule,
55
createMockLezerHighlightModule,
66
createMockStateModule,
7-
} from '../../testing';
7+
} from '../../../testing';
88

99
import { useHighlightExtension } from './useHighlightExtension';
1010

packages/code-editor/src/CodeEditor/hooks/extensions/useHyperLinkExtension.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { renderHook } from '@testing-library/react';
33
import {
44
createMockHyperLinkModule,
55
createMockStateModule,
6-
} from '../../testing';
6+
} from '../../../testing';
77

88
import { useHyperLinkExtension } from './useHyperLinkExtension';
99

0 commit comments

Comments
 (0)