Skip to content

Commit aafff94

Browse files
committed
fix: use instance instead of hook
1 parent 97af66f commit aafff94

File tree

4 files changed

+76
-57
lines changed

4 files changed

+76
-57
lines changed

package-lock.json

Lines changed: 4 additions & 4 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
@@ -28,7 +28,7 @@
2828
"@hookform/resolvers": "^3.10.0",
2929
"@reduxjs/toolkit": "^2.5.0",
3030
"@tanstack/react-table": "^8.20.6",
31-
"@ydb-platform/monaco-ghost": "^0.4.0",
31+
"@ydb-platform/monaco-ghost": "^0.6.1",
3232
"axios": "^1.7.9",
3333
"axios-retry": "^4.5.0",
3434
"colord": "^2.9.3",

src/containers/Tenant/Query/QueryEditor/YqlEditor.tsx

Lines changed: 23 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import React from 'react';
2+
13
import NiceModal from '@ebay/nice-modal-react';
2-
import {useMonacoGhost} from '@ydb-platform/monaco-ghost';
4+
import {createMonacoGhostInstance} from '@ydb-platform/monaco-ghost';
35
import throttle from 'lodash/throttle';
46
import type Monaco from 'monaco-editor';
57

@@ -23,9 +25,8 @@ import {useUpdateErrorsHighlighting} from '../../../../utils/monaco/highlightErr
2325
import {QUERY_ACTIONS} from '../../../../utils/query';
2426
import {SAVE_QUERY_DIALOG} from '../SaveQuery/SaveQuery';
2527
import i18n from '../i18n';
26-
import {useSavedQueries} from '../utils/useSavedQueries';
2728

28-
import {useCodeAssist, useEditorOptions} from './helpers';
29+
import {useCodeAssistHelpers, useEditorOptions} from './helpers';
2930
import {getKeyBindings} from './keybindings';
3031

3132
const CONTEXT_MENU_GROUP_ID = 'navigation';
@@ -44,10 +45,11 @@ export function YqlEditor({
4445
handleGetExplainQueryClick,
4546
}: YqlEditorProps) {
4647
const input = useTypedSelector(selectUserInput);
47-
const isCodeAssistEnabled = useSetting(ENABLE_CODE_ASSISTANT);
4848
const dispatch = useTypedDispatch();
49+
const monacoGhostInstanceRef = React.useRef<ReturnType<typeof createMonacoGhostInstance>>();
4950
const historyQueries = useTypedSelector(selectQueriesHistory);
50-
const savedQueries = useSavedQueries();
51+
const [isCodeAssistEnabled] = useSetting(ENABLE_CODE_ASSISTANT);
52+
5153
const editorOptions = useEditorOptions();
5254
const updateErrorsHighlighting = useUpdateErrorsHighlighting();
5355

@@ -72,20 +74,21 @@ export function YqlEditor({
7274
window.ydbEditor = undefined;
7375
};
7476

75-
const codeAssist = useCodeAssist();
76-
const {registerMonacoGhost} = useMonacoGhost({
77-
api: {
78-
getCodeAssistSuggestions: codeAssist.getCodeAssistSuggestions,
79-
},
80-
eventHandlers: {
81-
onCompletionAccept: codeAssist.onCompletionAccept,
82-
onCompletionDecline: codeAssist.onCompletionDecline,
83-
onCompletionIgnore: codeAssist.onCompletionIgnore,
84-
},
85-
config: {
86-
language: YQL_LANGUAGE_ID,
87-
},
88-
});
77+
const {monacoGhostConfig, prepareUserQueriesCache} = useCodeAssistHelpers();
78+
79+
React.useEffect(() => {
80+
if (monacoGhostInstanceRef.current && window.api.codeAssist) {
81+
if (isCodeAssistEnabled) {
82+
monacoGhostInstanceRef.current.register(monacoGhostConfig);
83+
prepareUserQueriesCache();
84+
} else {
85+
monacoGhostInstanceRef.current.unregister();
86+
}
87+
}
88+
return () => {
89+
monacoGhostInstanceRef.current?.unregister();
90+
};
91+
}, [isCodeAssistEnabled, monacoGhostConfig, prepareUserQueriesCache]);
8992

9093
const editorDidMount = (editor: Monaco.editor.IStandaloneCodeEditor, monaco: typeof Monaco) => {
9194
window.ydbEditor = editor;
@@ -100,19 +103,7 @@ export function YqlEditor({
100103
}
101104
});
102105

103-
if (window.api.codeAssist && isCodeAssistEnabled) {
104-
registerMonacoGhost(editor);
105-
codeAssist.prepareUserQueriesCache([
106-
...historyQueries.map((query, index) => ({
107-
name: `query${index}.yql`,
108-
text: query.queryText,
109-
})),
110-
...savedQueries.map((query) => ({
111-
name: query.name,
112-
text: query.body,
113-
})),
114-
]);
115-
}
106+
monacoGhostInstanceRef.current = createMonacoGhostInstance(editor);
116107
initResizeHandler(editor);
117108
initUserPrompt(editor, getLastQueryText);
118109
editor.focus();

src/containers/Tenant/Query/QueryEditor/helpers.ts

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,12 @@ import type {AcceptEvent, DeclineEvent, IgnoreEvent, PromptFile} from '@ydb-plat
44
import type Monaco from 'monaco-editor';
55

66
import {codeAssistApi} from '../../../../store/reducers/codeAssist/codeAssist';
7+
import {selectQueriesHistory} from '../../../../store/reducers/query/query';
78
import type {TelemetryOpenTabs} from '../../../../types/api/codeAssist';
89
import {AUTOCOMPLETE_ON_ENTER, ENABLE_AUTOCOMPLETE} from '../../../../utils/constants';
9-
import {useSetting} from '../../../../utils/hooks';
10+
import {useSetting, useTypedSelector} from '../../../../utils/hooks';
11+
import {YQL_LANGUAGE_ID} from '../../../../utils/monaco/constats';
12+
import {useSavedQueries} from '../utils/useSavedQueries';
1013

1114
export type EditorOptions = Monaco.editor.IEditorOptions & Monaco.editor.IGlobalEditorOptions;
1215

@@ -36,12 +39,14 @@ export function useEditorOptions() {
3639
return options;
3740
}
3841

39-
export function useCodeAssist() {
42+
export function useCodeAssistHelpers() {
4043
const [sendCodeAssistPrompt] = codeAssistApi.useLazyGetCodeAssistSuggestionsQuery();
4144
const [acceptSuggestion] = codeAssistApi.useAcceptSuggestionMutation();
4245
const [discardSuggestion] = codeAssistApi.useDiscardSuggestionMutation();
4346
const [ignoreSuggestion] = codeAssistApi.useIgnoreSuggestionMutation();
4447
const [sendUserQueriesData] = codeAssistApi.useSendUserQueriesDataMutation();
48+
const historyQueries = useTypedSelector(selectQueriesHistory);
49+
const savedQueries = useSavedQueries();
4550

4651
const getCodeAssistSuggestions = React.useCallback(
4752
async (promptFiles: PromptFile[]) => sendCodeAssistPrompt(promptFiles).unwrap(),
@@ -63,26 +68,49 @@ export function useCodeAssist() {
6368
[ignoreSuggestion],
6469
);
6570

66-
const prepareUserQueriesCache = React.useCallback(
67-
async (queries: {text: string; name?: string}[]) => {
68-
const preparedData: TelemetryOpenTabs = queries.map((query, index) => ({
69-
FileName: query.name || `query${index}.yql`,
70-
Text: query.text,
71-
}));
72-
try {
73-
return sendUserQueriesData(preparedData).unwrap();
74-
} catch {
75-
return {items: []};
76-
}
77-
},
78-
[sendUserQueriesData],
79-
);
71+
const userQueries = React.useMemo(() => {
72+
return [
73+
...historyQueries.map((query, index) => ({
74+
name: `query${index}.yql`,
75+
text: query.queryText,
76+
})),
77+
...savedQueries.map((query) => ({
78+
name: query.name,
79+
text: query.body,
80+
})),
81+
];
82+
}, [historyQueries, savedQueries]);
83+
84+
const prepareUserQueriesCache = React.useCallback(async () => {
85+
const preparedData: TelemetryOpenTabs = userQueries.map((query, index) => ({
86+
FileName: query.name || `query${index}.yql`,
87+
Text: query.text,
88+
}));
89+
try {
90+
return await sendUserQueriesData(preparedData).unwrap();
91+
} catch {
92+
return {items: []};
93+
}
94+
}, [sendUserQueriesData, userQueries]);
95+
96+
const monacoGhostConfig = React.useMemo(() => {
97+
return {
98+
api: {
99+
getCodeAssistSuggestions,
100+
},
101+
eventHandlers: {
102+
onCompletionAccept,
103+
onCompletionDecline,
104+
onCompletionIgnore,
105+
},
106+
config: {
107+
language: YQL_LANGUAGE_ID,
108+
},
109+
};
110+
}, [getCodeAssistSuggestions, onCompletionAccept, onCompletionDecline, onCompletionIgnore]);
80111

81112
return {
82-
getCodeAssistSuggestions,
83-
onCompletionAccept,
84-
onCompletionDecline,
85-
onCompletionIgnore,
86113
prepareUserQueriesCache,
114+
monacoGhostConfig,
87115
};
88116
}

0 commit comments

Comments
 (0)