refactor(desktop): IME composition 가드 helper 추출 + 8곳 Enter 핸들러 통합 (빅뱅 Phase 5 Part 5)
Bug 10 fix(MeetingModePage 인라인 가드)를 isImeComposingEvent helper로 추출하고, 한글 위험도 있는 나머지 7개 Enter 핸들러에 일괄 적용. 총 8곳이 이제 동일 helper 경유. 신규: - apps/desktop/src/renderer/utils/keyboard.ts — isImeComposingEvent(e) JSDoc에 Bug 10 원리(Chromium이 IME 조합 중 Enter를 2번 발화) + 권장 사용 패턴 포함 적용 8곳: - pages/MeetingModePage.tsx:164 회의 메모 (기존 인라인 가드 4줄 교체) - pages/KnowledgeBasePage.tsx:84 RAG 쿼리 - pages/VoiceConversationPage.tsx:113 텍스트 채팅 - pages/CommandsPage.tsx:336 키워드 추가 (Enter+Esc) - components/meeting/MeetingChatPanel.tsx:111 미팅 챗 - components/meeting/EditableSegment.tsx:70 전사 세그먼트 편집 (Enter+Esc) - components/meeting/MeetingDetailTabs.tsx:242 미팅 타이틀 (인라인 arrow → 블록) - components/shared/HistoryEntryCard.tsx:64 태그 추가 (Enter+Esc) /simplify 패스 품질 리뷰: - Phase 3.3 CloudSyncService.pushOne 훅 8곳은 이미 fire-and-forget 1줄로 일관. 내부 try-catch가 에러 삼켜 로컬 write 차단 금지 철학 준수 → 수정 없음, 현 상태가 최적. 검증: - desktop tsc --noEmit EXIT=0 - Vite HMR로 dev 프로세스 자동 반영 (재기동 없음) - 한글 Enter 시연은 사용자 실측 대기 (VoiceConversationPage / MeetingDetailTabs 대표 2곳)
This commit is contained in:
parent
c0c6206cbe
commit
3b77be01bc
10 changed files with 86 additions and 4 deletions
25
apps/desktop/src/renderer/utils/keyboard.ts
Normal file
25
apps/desktop/src/renderer/utils/keyboard.ts
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import type { KeyboardEvent } from 'react'
|
||||
|
||||
/**
|
||||
* 한글/일본어/중국어 IME 조합 중인 키 이벤트인지 검사한다.
|
||||
*
|
||||
* 한글 IME가 조합 중인 상태에서 Enter를 치면 Chromium이 `keydown`을
|
||||
* 두 번 발화한다:
|
||||
* 1) IME 조합 확정 이벤트 — `nativeEvent.isComposing === true`
|
||||
* (일부 플랫폼에선 `isComposing`이 이미 false로 내려온 채 `keyCode === 229`)
|
||||
* 2) 실제 Enter 액션 — `isComposing === false`
|
||||
*
|
||||
* Enter 핸들러에서 이 함수가 `true`인 이벤트를 조기 return 하지 않으면
|
||||
* 같은 입력이 두 번 처리되어 IPC/DB 쓰기가 중복된다 (Bug 10 재현).
|
||||
*
|
||||
* 패턴:
|
||||
* ```tsx
|
||||
* const handleKeyDown = (e: KeyboardEvent) => {
|
||||
* if (isImeComposingEvent(e)) return
|
||||
* if (e.key === 'Enter' && !e.shiftKey) { ... }
|
||||
* }
|
||||
* ```
|
||||
*/
|
||||
export function isImeComposingEvent(e: KeyboardEvent): boolean {
|
||||
return e.nativeEvent.isComposing || e.keyCode === 229
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue