Skip to content

Commit 67ddc6d

Browse files
authored
Package Update and Code Refactoring (#248)
* Install new language server package * Update activeEditor on project updates * Prettify * Refactor model change synchronization * Update color of the status dots
1 parent d385f01 commit 67ddc6d

File tree

6 files changed

+51
-52
lines changed

6 files changed

+51
-52
lines changed

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"@apollo/react-hooks": "^3.1.3",
1414
"@emotion/core": "^10.0.35",
1515
"@emotion/styled": "^10.0.27",
16-
"@onflow/cadence-language-server": "^0.20.2",
16+
"@onflow/cadence-language-server": "^0.23.0",
1717
"@reach/router": "^1.3.4",
1818
"@types/file-saver": "^2.0.1",
1919
"apollo-cache-inmemory": "^1.6.6",

src/components/CadenceEditor/index.tsx

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
33

44
import { useProject } from 'providers/Project/projectHooks';
55
import { EntityType } from 'providers/Project';
6-
import debounce from 'util/debounce';
76
import configureCadence, { CADENCE_LANGUAGE_ID } from 'util/cadence';
7+
import debounce from 'util/debounce';
88

99
import Notifications from './Notifications';
1010
import ControlPanel from './ControlPanel';
@@ -86,18 +86,17 @@ const CadenceEditor = (props: any) => {
8686

8787
// Method to use, when model was changed
8888
const debouncedModelChange = debounce(() => {
89-
// we will ignore text line, cause onChange is different for readme and other scripts
90-
// @ts-ignore
91-
project.active.onChange(editor.getValue());
92-
}, 50);
89+
if (project.project?.accounts) {
90+
// we will ignore text line, cause onChange is based on active type
91+
// @ts-ignore
92+
project.active.onChange(editor.getValue());
93+
}
94+
}, 100);
9395

94-
useEffect(configureCadence, []);
95-
useEffect(() => {
96-
// TODO: save/restore view state with:
97-
// - use ref to track current active id
98-
// - const oldState = editor.saveViewState();
99-
if (editor) {
100-
// Remove tracking of model updates to prevent re-rendering
96+
//@ts-ignore
97+
const setupEditor = () => {
98+
const projectExist = project && project.project.accounts;
99+
if (editor && projectExist) {
101100
if (editorOnChange.current) {
102101
editorOnChange.current.dispose();
103102
}
@@ -116,6 +115,11 @@ const CadenceEditor = (props: any) => {
116115
editor.focus();
117116
} else {
118117
// - Add new line at the end of the model
118+
// Remove tracking of model updates to prevent re-rendering
119+
if (editorOnChange.current) {
120+
editorOnChange.current.dispose();
121+
}
122+
119123
newState.model.setValue(code + '\n');
120124
lastEdit.current = {
121125
type: project.active.type,
@@ -126,19 +130,27 @@ const CadenceEditor = (props: any) => {
126130
editor.setModel(newState.model);
127131
editor.restoreViewState(newState.viewState);
128132
editor.focus();
129-
130133
editor.layout();
131134

132-
setTimeout(()=>{
133-
console.log("Restore back!")
135+
setTimeout(() => {
134136
newState.model.setValue(code);
135-
}, 150)
137+
}, 150);
136138
}
139+
editorOnChange.current = editor.onDidChangeModelContent(
140+
debouncedModelChange,
141+
);
142+
}
143+
};
137144

138-
editorOnChange.current =
139-
editor.onDidChangeModelContent(debouncedModelChange);
145+
useEffect(() => {
146+
configureCadence();
147+
}, []);
148+
149+
useEffect(() => {
150+
if (editor) {
151+
setupEditor();
140152
}
141-
}, [project.active, project.project.accounts]);
153+
}, [editor, project.active.index, project.active.type]);
142154

143155
// "initEditor" will create new instance of Monaco Editor and set it up
144156
const initEditor = async () => {
@@ -168,6 +180,7 @@ const CadenceEditor = (props: any) => {
168180

169181
// Save editor in component state
170182
setEditor(editor);
183+
setupEditor();
171184
};
172185

173186
// "destroyEditor" is used to dispose of Monaco Editor instance, when the component is unmounted (for any reasons)

src/components/CadenceVersion.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const Dot = styled.div<DotType>`
2828
height: var(--size);
2929
border-radius: var(--size);
3030
background-color: ${({ active = false }) => {
31-
return active === 'OFF' ? '#ff006f' : '#00ff76';
31+
return active === 'OFF' ? '#ee431e' : '#00ff76';
3232
}};
3333
`;
3434

src/hooks/useLanguageServer.ts

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import {useEffect, useState, useMemo} from 'react';
1+
import { useEffect, useState } from 'react';
22
import { CadenceLanguageServer, Callbacks } from 'util/language-server';
33
import { MonacoServices } from 'monaco-languageclient/lib/monaco-services';
44
import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
55
import { createCadenceLanguageClient } from 'util/language-client';
66
import { useProject } from 'providers/Project/projectHooks';
7-
import debounce from "util/debounce";
87

98
let monacoServicesInstalled = false;
109

@@ -20,17 +19,13 @@ async function startLanguageServer(callbacks: any, getCode: any, ops) {
2019
callbacks.getAddressCode = getCode;
2120
setCallbacks(callbacks);
2221
setLanguageServer(server);
23-
console.log("%c LS: Is Up!",'color: #00FF00')
22+
console.log('%c LS: Is Up!', 'color: #00FF00');
2423
}
2524
}, 100);
2625
});
2726
}
2827

29-
const launchLanguageClient = async (
30-
callbacks,
31-
languageServer,
32-
setLanguageClient,
33-
) => {
28+
const launchLanguageClient = async (callbacks, languageServer, setLanguageClient) => {
3429
if (languageServer) {
3530
const newClient = createCadenceLanguageClient(callbacks);
3631
newClient.start();
@@ -84,28 +79,19 @@ export default function useLanguageServer() {
8479
};
8580

8681
const restartServer = () => {
87-
console.log("Restarting server...")
82+
console.log('Restarting server...');
8883

8984
startLanguageServer(callbacks, getCode, {
9085
setLanguageServer,
9186
setCallbacks,
9287
});
9388
};
9489

95-
const debouncedServerRestart = useMemo(
96-
() => debounce(restartServer, 150),
97-
[languageServer]
98-
)
99-
100-
useEffect(()=>{
101-
if(languageServer){
102-
languageServer.updateCodeGetter(getCode)
90+
useEffect(() => {
91+
if (languageServer) {
92+
languageServer.updateCodeGetter(getCode);
10393
}
104-
},[project.project.accounts])
105-
106-
// TODO: Disable this, once the cadence language server package is updated
107-
useEffect(debouncedServerRestart, [project.project.accounts, project.active]);
108-
94+
}, [project.project.accounts]);
10995

11096
useEffect(() => {
11197
// The Monaco Language Client services have to be installed globally, once.
@@ -122,7 +108,7 @@ export default function useLanguageServer() {
122108
}, []);
123109

124110
useEffect(() => {
125-
if(!languageClient){
111+
if (!languageClient) {
126112
launchLanguageClient(callbacks, languageServer, setLanguageClient).then();
127113
}
128114
}, [languageServer]);

src/providers/Project/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ export const ProjectProvider: React.FC<ProjectProviderProps> = ({
351351

352352
const activeEditor = useMemo(
353353
getActiveEditor,
354-
[active.type, active.index]
354+
[active.type, active.index, project]
355355
)
356356

357357
const location = useLocation();

0 commit comments

Comments
 (0)