From fa5e1f745280fc86b28e35e69ebbed41b2790dee Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 28 Nov 2024 23:24:16 -0800 Subject: [PATCH] refac --- .../components/common/RichTextInput.svelte | 6 +- .../common/RichTextInput/AutoCompletion.js | 64 +++++++++++-------- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/src/lib/components/common/RichTextInput.svelte b/src/lib/components/common/RichTextInput.svelte index a0420d447..bf4a6238a 100644 --- a/src/lib/components/common/RichTextInput.svelte +++ b/src/lib/components/common/RichTextInput.svelte @@ -153,10 +153,10 @@ Placeholder.configure({ placeholder }), AIAutocompletion.configure({ generateCompletion: async (text) => { - // Implement your AI text generation logic here - // This should return a Promise that resolves to the suggested text + if (text.trim().length === 0) { + return null; + } - console.log(text); return 'AI-generated suggestion'; } }) diff --git a/src/lib/components/common/RichTextInput/AutoCompletion.js b/src/lib/components/common/RichTextInput/AutoCompletion.js index fbd6e18fd..2412865ee 100644 --- a/src/lib/components/common/RichTextInput/AutoCompletion.js +++ b/src/lib/components/common/RichTextInput/AutoCompletion.js @@ -50,8 +50,6 @@ export const AIAutocompletion = Extension.create({ key: new PluginKey('aiAutocompletion'), props: { handleKeyDown: (view, event) => { - if (event.key !== 'Tab') return false - const { state, dispatch } = view const { selection } = state const { $head } = selection @@ -59,35 +57,47 @@ export const AIAutocompletion = Extension.create({ if ($head.parent.type.name !== 'paragraph') return false const node = $head.parent - const prompt = node.textContent - if (!node.attrs['data-suggestion']) { - // Generate completion - this.options.generateCompletion(prompt).then(suggestion => { - if (suggestion && suggestion.trim() !== '') { - dispatch(state.tr.setNodeMarkup($head.before(), null, { - ...node.attrs, - class: 'ai-autocompletion', - 'data-prompt': prompt, - 'data-suggestion': suggestion, - })) - } - }) - } else { - // Accept suggestion - const suggestion = node.attrs['data-suggestion'] - dispatch(state.tr - .insertText(suggestion, $head.pos) - .setNodeMarkup($head.before(), null, { - ...node.attrs, - class: null, - 'data-prompt': null, - 'data-suggestion': null, + if (event.key === 'Tab') { + if (!node.attrs['data-suggestion']) { + // Generate completion + const prompt = node.textContent + this.options.generateCompletion(prompt).then(suggestion => { + if (suggestion && suggestion.trim() !== '') { + dispatch(state.tr.setNodeMarkup($head.before(), null, { + ...node.attrs, + class: 'ai-autocompletion', + 'data-prompt': prompt, + 'data-suggestion': suggestion, + })) + } + // If suggestion is empty or null, do nothing }) - ) + } else { + // Accept suggestion + const suggestion = node.attrs['data-suggestion'] + dispatch(state.tr + .insertText(suggestion, $head.pos) + .setNodeMarkup($head.before(), null, { + ...node.attrs, + class: null, + 'data-prompt': null, + 'data-suggestion': null, + }) + ) + } + return true + } else if (node.attrs['data-suggestion']) { + // Reset suggestion on any other key press + dispatch(state.tr.setNodeMarkup($head.before(), null, { + ...node.attrs, + class: null, + 'data-prompt': null, + 'data-suggestion': null, + })) } - return true + return false }, }, }),