Skip to content

Commit

Permalink
fix: remove item duplicates
Browse files Browse the repository at this point in the history
  • Loading branch information
asabotovich committed Jun 24, 2024
1 parent c62ce93 commit e22ad12
Showing 1 changed file with 81 additions and 68 deletions.
149 changes: 81 additions & 68 deletions src/components/FormControlEditor/FormControlEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,81 +17,94 @@ editorLoader.config({
const triggerCharacter = '@';
const emptySuggestions = { suggestions: [] };

const initAutocomlete = (() => {
let isInited = false;

return (initFn: () => void) => {
if (!isInited) {
initFn();
isInited = true;
}
};
})();

export const FormControlEditor = React.forwardRef<HTMLDivElement, React.ComponentProps<typeof FormEditor>>(
({ onMount, ...props }, ref) => {
const utils = trpc.useContext();

const onMountCallback = useCallback<NonNullable<React.ComponentProps<typeof FormEditor>['onMount']>>(
(editor, monaco) => {
monaco.languages.registerCompletionItemProvider('markdown', {
provideCompletionItems: async (model, position) => {
const line = model.getValueInRange({
startColumn: 0,
endColumn: position.column,
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
});

if (line.indexOf(triggerCharacter) < 0) {
return emptySuggestions;
}

const query = line.slice(line.lastIndexOf(triggerCharacter) + 1, position.column);

if (!query.length) {
return emptySuggestions;
}

const users = await utils.crew.getUsers.fetch({
query,
});

return {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
suggestions: users.reduce<any[]>((acum, user) => {
if (!user.login) {
return acum;
}

const { login } = user;
const label = getUserName(user);

const startColumn = position.column - query.length;
const endColumn = startColumn + login.length;

acum.push({
label,
range: {
startColumn,
endColumn,
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
},
insertText: `[${login}](${routes.crewUser(user.login)} "${user.name}")`,
kind: monaco.languages.CompletionItemKind.User,
additionalTextEdits: [
{
range: {
startColumn: startColumn - 1,
endColumn: startColumn,
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
},
text: null,
initAutocomlete(() =>
monaco.languages.registerCompletionItemProvider('markdown', {
provideCompletionItems: async (model, position) => {
const line = model.getValueInRange({
startColumn: 0,
endColumn: position.column,
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
});

if (line.indexOf(triggerCharacter) < 0) {
return emptySuggestions;
}

const query = line.slice(line.lastIndexOf(triggerCharacter) + 1, position.column);

if (!query.length) {
return emptySuggestions;
}

const users = await utils.crew.getUsers.fetch({
query,
});

return {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
suggestions: users.reduce<any[]>((acum, user) => {
if (!user.login) {
return acum;
}

const { login } = user;
const label = getUserName(user);

const startColumn = position.column - query.length;
const endColumn = startColumn + login.length;

acum.push({
label,
range: {
startColumn,
endColumn,
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
},
],
filterText: query,
});

return acum;
}, []),
};
},
resolveCompletionItem: (item) => {
return item;
},
triggerCharacters: [triggerCharacter],
});
insertText: `[${login}](${routes.crewUser(user.login)} "${user.name}")`,
kind: monaco.languages.CompletionItemKind.User,
additionalTextEdits: [
{
range: {
startColumn: startColumn - 1,
endColumn: startColumn,
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
},
text: null,
},
],
filterText: query,
});

return acum;
}, []),
};
},
resolveCompletionItem: (item) => {
return item;
},
triggerCharacters: [triggerCharacter],
}),
);

onMount?.(editor, monaco);
},
Expand Down

0 comments on commit e22ad12

Please sign in to comment.