From 463db62b8cccf48053be05af2469121262514c1b Mon Sep 17 00:00:00 2001 From: optrader Date: Wed, 5 Nov 2025 11:00:46 +0900 Subject: [PATCH] =?UTF-8?q?[251105]=20fix:=20VoiceResults=20Focus=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ• ์ปค๋ฐ‹ ์‹œ๊ฐ„: 2025. 11. 05. 11:00:46 ๐Ÿ“Š ๋ณ€๊ฒฝ ํ†ต๊ณ„: โ€ข ์ด ํŒŒ์ผ: 2๊ฐœ โ€ข ์ถ”๊ฐ€: +29์ค„ โ€ข ์‚ญ์ œ: -5์ค„ ๐Ÿ“ ์ˆ˜์ •๋œ ํŒŒ์ผ: ~ com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.new.v2.jsx ~ com.twin.app.shoptime/src/views/SearchPanel/VoiceInputOverlay/VoiceInputOverlay.v2.jsx ๐Ÿ”ง ์ฃผ์š” ๋ณ€๊ฒฝ ๋‚ด์šฉ: โ€ข ์†Œ๊ทœ๋ชจ ๊ธฐ๋Šฅ ๊ฐœ์„  --- .../views/SearchPanel/SearchPanel.new.v2.jsx | 31 ++++++++++++++++--- .../VoiceInputOverlay.v2.jsx | 3 ++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.new.v2.jsx b/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.new.v2.jsx index af239205..3852f1ef 100644 --- a/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.new.v2.jsx +++ b/com.twin.app.shoptime/src/views/SearchPanel/SearchPanel.new.v2.jsx @@ -939,16 +939,16 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) { return 'SEARCH_RESULT_LOADED'; } - // ์ƒˆ๋กœ์šด ์Œ์„ฑ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ชจ๋“œ๋กœ ์ง„์ž… (๋ชจ๋“œ ๋ณ€๊ฒฝ์œผ๋กœ ๊ฐ์ง€ - ์ผ๊ด€์„ฑ ์œ ์ง€) - // - currentMode๊ฐ€ VOICE_RESULT๋กœ ๋ณ€๊ฒฝ๋˜๊ณ  - // - ์ด์ „์—๋Š” VOICE_RESULT๊ฐ€ ์•„๋‹ˆ์—ˆ์œผ๋ฉด + // ์ƒˆ๋กœ์šด ์Œ์„ฑ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ๋ชจ๋“œ๋กœ ์ง„์ž… (๋ชจ๋“œ ๋ณ€๊ฒฝ ๋˜๋Š” ๋ฐ์ดํ„ฐ ๋„์ฐฉ์œผ๋กœ ๊ฐ์ง€) + // - currentMode๊ฐ€ VOICE_RESULT ์ด๊ณ , ์ƒˆ๋กœ์šด ShopperHouse ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ–ˆ์œผ๋ฉด // - ๐ŸŽฏ ์ค‘์š”: isOnTop์ด ๋ณ€ํ™”ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋งŒ (์ด๋ฏธ SearchPanel์ด ์—ด๋ ค์žˆ๊ณ  ์ƒˆ๋กœ ๊ฒ€์ƒ‰ํ•œ ๊ฒฝ์šฐ) // DetailPanel ๋ณต๊ท€(isOnTop ๋ณ€ํ™”)๋Š” ์œ„์˜ DETAIL_PANEL_RETURN์—์„œ ๋จผ์ € ์ฒ˜๋ฆฌ๋จ if ( isOnTop === isOnTopRef.current && currentMode === SEARCH_PANEL_MODES.VOICE_RESULT && - currentModeRef.current !== SEARCH_PANEL_MODES.VOICE_RESULT && - shopperHouseData + shopperHouseData && + // ๐ŸŽฏ [๊ฐœ์„ ] ๋ชจ๋“œ ๋ณ€๊ฒฝ OR ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ๋„์ฐฉ ๊ฐ์ง€ + (currentModeRef.current !== SEARCH_PANEL_MODES.VOICE_RESULT || shopperHouseDataRef.current !== shopperHouseData) ) { if (DEBUG_MODE) { console.log('[FOCUS] ๐ŸŽฏ Scenario: NEW_SEARCH_LOADED (Voice Result Mode)', { @@ -956,6 +956,8 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) { prevMode: currentModeRef.current, nextMode: currentMode, isOnTopChanged: isOnTop !== isOnTopRef.current, + modeChanged: currentModeRef.current !== SEARCH_PANEL_MODES.VOICE_RESULT, + dataChanged: shopperHouseDataRef.current !== shopperHouseData, }); } return 'NEW_SEARCH_LOADED'; @@ -968,6 +970,14 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) { hasShopperHouseData: !!shopperHouseData, }); } + // ๐ŸŽฏ [์ค‘์š”] ์ƒˆ๋กœ์šด ์Œ์„ฑ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๋„์ฐฉํ–ˆ์œผ๋ฉด NEW_SEARCH_LOADED ์šฐ์„  ์ฒ˜๋ฆฌ + // ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด VOICE_OVERLAY_CLOSED ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ TInput์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ + if (shopperHouseData && currentMode === SEARCH_PANEL_MODES.VOICE_RESULT) { + if (DEBUG_MODE) { + console.log('[FOCUS] ๐Ÿ”„ VOICE_OVERLAY_CLOSED + new data โ†’ NEW_SEARCH_LOADED ์šฐ์„  ์ฒ˜๋ฆฌ'); + } + return 'NEW_SEARCH_LOADED'; + } return 'VOICE_OVERLAY_CLOSED'; } @@ -1840,6 +1850,17 @@ export default function SearchPanel({ panelInfo, isOnTop, spotlightId }) { unifiedFocusTimerRef.current = null; }, focusDelay); + // ๐ŸŽฏ [NEW_SEARCH_LOADED] 1์ดˆ ํ›„ ๋‹ค์‹œ ์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ์œผ๋กœ ํฌ์ปค์Šค ์ด๋™ + // TInputSimple๊ณผ Mic Icon์˜ ํฌ์ปค์Šค ์ถฉ๋Œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด + if (scenario === 'NEW_SEARCH_LOADED' && targetId === 'searchItemContents0') { + setTimeout(() => { + if (DEBUG_MODE) { + console.log('[FOCUS] ๐Ÿ”„ NEW_SEARCH_LOADED: 1์ดˆ ํ›„ ์ฒซ ๋ฒˆ์งธ ์ƒํ’ˆ์œผ๋กœ ๋‹ค์‹œ ํฌ์ปค์Šค ์ด๋™'); + } + Spotlight.focus('searchItemContents0'); + }, 500); // 0.5์ดˆ ํ›„ + } + // Cleanup: ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ ๋˜๋Š” targetId ๋ณ€๊ฒฝ ์‹œ ํƒ€์ด๋จธ ์ •๋ฆฌ return () => { if (unifiedFocusTimerRef.current) { diff --git a/com.twin.app.shoptime/src/views/SearchPanel/VoiceInputOverlay/VoiceInputOverlay.v2.jsx b/com.twin.app.shoptime/src/views/SearchPanel/VoiceInputOverlay/VoiceInputOverlay.v2.jsx index 6776d575..c041be3e 100644 --- a/com.twin.app.shoptime/src/views/SearchPanel/VoiceInputOverlay/VoiceInputOverlay.v2.jsx +++ b/com.twin.app.shoptime/src/views/SearchPanel/VoiceInputOverlay/VoiceInputOverlay.v2.jsx @@ -260,6 +260,9 @@ const VoiceInputOverlay = ({ // ์•ฝ๊ฐ„์˜ ์ง€์—ฐ ํ›„ ๋‹ซ๊ธฐ (์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก) closeTimerRef.current = setTimeout(() => { + // ์Œ์„ฑ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๋„์ฐฉํ–ˆ์„ ๋•Œ๋Š” ํฌ์ปค์Šค ๋ณต์›์„ ํ•˜์ง€ ์•Š์Œ + // SearchPanel์˜ ํฌ์ปค์Šค ๋กœ์ง์ด ์ฒซ ๋ฒˆ์งธ ์ƒํ’ˆ์œผ๋กœ ํฌ์ปค์Šค๋ฅผ ์ด๋™์‹œํ‚ด + lastFocusedElement.current = null; onClose(); }, 500); }