From 7206b231f05e267291e28581ad36d8c6278ed46d Mon Sep 17 00:00:00 2001 From: iliya Date: Tue, 3 Mar 2026 00:11:31 +0200 Subject: [PATCH] refactor: update mention handling and improve role options - Refactored MentionableTextarea to use a getter for trigger index, enhancing performance and avoiding stale closures. - Updated PRESET_ROLES to include additional roles: architect, docs, auditor, and optimizer, expanding role selection options. - Adjusted package.json build scripts to remove automatic publishing flags for a more streamlined build process. --- package.json | 10 +++++----- src/renderer/components/ui/MentionableTextarea.tsx | 11 ++++++----- src/renderer/constants/teamRoles.ts | 11 ++++++++++- src/renderer/hooks/useMentionDetection.ts | 5 +++++ 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 125253e7..3160aa01 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,11 @@ "prebuild": "tsx scripts/fetch-pricing-data.ts", "build": "electron-vite build", "dist": "electron-builder --mac --win --linux", - "dist:mac": "electron-builder --mac --publish always", - "dist:mac:arm64": "electron-builder --mac --arm64 --publish always", - "dist:mac:x64": "electron-builder --mac --x64 --publish always", - "dist:win": "electron-builder --win --publish always", - "dist:linux": "electron-builder --linux --publish always", + "dist:mac": "electron-builder --mac", + "dist:mac:arm64": "electron-builder --mac --arm64", + "dist:mac:x64": "electron-builder --mac --x64", + "dist:win": "electron-builder --win", + "dist:linux": "electron-builder --linux", "preview": "electron-vite preview", "typecheck": "tsc --noEmit", "lint": "eslint src/", diff --git a/src/renderer/components/ui/MentionableTextarea.tsx b/src/renderer/components/ui/MentionableTextarea.tsx index 0b54f7f8..fcdd3f0b 100644 --- a/src/renderer/components/ui/MentionableTextarea.tsx +++ b/src/renderer/components/ui/MentionableTextarea.tsx @@ -254,7 +254,7 @@ export const MentionableTextarea = React.forwardRef { const textarea = internalRef.current; - if (!textarea || triggerIndex < 0 || !s.filePath) return; + const triggerIdx = getTriggerIndex(); + if (!textarea || triggerIdx < 0 || !s.filePath) return; - const replaceStart = triggerIndex; - const replaceEnd = triggerIndex + 1 + query.length; + const replaceStart = triggerIdx; + const replaceEnd = triggerIdx + 1 + query.length; const before = value.slice(0, replaceStart); const after = value.slice(replaceEnd); @@ -347,7 +348,7 @@ export const MentionableTextarea = React.forwardRef) => void; /** Current @-trigger character position in text (-1 if no active trigger) */ triggerIndex: number; + /** Getter for trigger index — use at call time to avoid stale closure */ + getTriggerIndex: () => number; } interface MentionTrigger { @@ -310,6 +312,8 @@ export function useMentionDetection({ [isOpen, filteredSuggestions, selectedIndex, selectSuggestion, dismiss] ); + const getTriggerIndex = useCallback(() => triggerIndexRef.current, []); + return { isOpen, query, @@ -323,5 +327,6 @@ export function useMentionDetection({ handleSelect, // eslint-disable-next-line react-hooks/refs -- expose current trigger position to caller triggerIndex: triggerIndexRef.current, + getTriggerIndex, }; }