add featureBridge func for listenservice
This commit is contained in:
		
							parent
							
								
									3bece73f78
								
							
						
					
					
						commit
						a951d02a59
					
				
							
								
								
									
										2
									
								
								aec
									
									
									
									
									
								
							
							
								
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								aec
									
									
									
									
									
								
							@ -1 +1 @@
 | 
			
		||||
Subproject commit f00bb1fb948053c752b916adfee19f90644a0b2f
 | 
			
		||||
Subproject commit 9e11f4f95707714464194bdfc9db0222ec5c6163
 | 
			
		||||
@ -29,6 +29,21 @@ module.exports = {
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    console.log('[FeatureBridge] Initialized with settings handlers.');
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    ipcMain.handle('listen:changeSession', async (event, listenButtonText) => {
 | 
			
		||||
      console.log('[FeatureBridge] listen:changeSession from mainheader', listenButtonText);
 | 
			
		||||
      try {
 | 
			
		||||
        await listenService.handleListenRequest(listenButtonText);
 | 
			
		||||
        return { success: true };
 | 
			
		||||
      } catch (error) {
 | 
			
		||||
        console.error('[FeatureBridge] listen:changeSession failed', error.message);
 | 
			
		||||
        return { success: false, error: error.message };
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  // Renderer로 상태를 전송
 | 
			
		||||
 | 
			
		||||
@ -51,6 +51,47 @@ class ListenService {
 | 
			
		||||
        console.log('[ListenService] Initialized and ready.');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async handleListenRequest(listenButtonText) {
 | 
			
		||||
        const { windowPool, updateLayout } = require('../../window/windowManager');
 | 
			
		||||
        const listenWindow = windowPool.get('listen');
 | 
			
		||||
        const header = windowPool.get('header');
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            switch (listenButtonText) {
 | 
			
		||||
                case 'Listen':
 | 
			
		||||
                    console.log('[ListenService] changeSession to "Listen"');
 | 
			
		||||
                    listenWindow.show();
 | 
			
		||||
                    updateLayout();
 | 
			
		||||
                    listenWindow.webContents.send('window-show-animation');
 | 
			
		||||
                    await this.initializeSession();
 | 
			
		||||
                    listenWindow.webContents.send('session-state-changed', { isActive: true });
 | 
			
		||||
                    break;
 | 
			
		||||
        
 | 
			
		||||
                case 'Stop':
 | 
			
		||||
                    console.log('[ListenService] changeSession to "Stop"');
 | 
			
		||||
                    await this.closeSession();
 | 
			
		||||
                    listenWindow.webContents.send('session-state-changed', { isActive: false });
 | 
			
		||||
                    break;
 | 
			
		||||
        
 | 
			
		||||
                case 'Done':
 | 
			
		||||
                    console.log('[ListenService] changeSession to "Done"');
 | 
			
		||||
                    listenWindow.webContents.send('window-hide-animation');
 | 
			
		||||
                    listenWindow.webContents.send('session-state-changed', { isActive: false });
 | 
			
		||||
                    break;
 | 
			
		||||
        
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new Error(`[ListenService] unknown listenButtonText: ${listenButtonText}`);
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            header.webContents.send('listen:changeSessionResult', { success: true });
 | 
			
		||||
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.error('[ListenService] error in handleListenRequest:', error);
 | 
			
		||||
            header.webContents.send('listen:changeSessionResult', { success: false });
 | 
			
		||||
            throw error; 
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async handleTranscriptionComplete(speaker, text) {
 | 
			
		||||
        console.log(`[ListenService] Transcription complete: ${speaker} - ${text}`);
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
@ -4,8 +4,8 @@ export class MainHeader extends LitElement {
 | 
			
		||||
    static properties = {
 | 
			
		||||
        // isSessionActive: { type: Boolean, state: true },
 | 
			
		||||
        isTogglingSession: { type: Boolean, state: true },
 | 
			
		||||
        actionText: { type: String, state: true },
 | 
			
		||||
        shortcuts: { type: Object, state: true },
 | 
			
		||||
        listenSessionStatus: { type: String, state: true },
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    static styles = css`
 | 
			
		||||
@ -348,9 +348,8 @@ export class MainHeader extends LitElement {
 | 
			
		||||
        this.isAnimating = false;
 | 
			
		||||
        this.hasSlidIn = false;
 | 
			
		||||
        this.settingsHideTimer = null;
 | 
			
		||||
        // this.isSessionActive = false;
 | 
			
		||||
        this.isTogglingSession = false;
 | 
			
		||||
        this.actionText = 'Listen';
 | 
			
		||||
        this.listenSessionStatus = 'beforeSession';
 | 
			
		||||
        this.animationEndTimer = null;
 | 
			
		||||
        this.handleAnimationEnd = this.handleAnimationEnd.bind(this);
 | 
			
		||||
        this.handleMouseMove = this.handleMouseMove.bind(this);
 | 
			
		||||
@ -359,6 +358,15 @@ export class MainHeader extends LitElement {
 | 
			
		||||
        this.wasJustDragged = false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    _getListenButtonText(status) {
 | 
			
		||||
        switch (status) {
 | 
			
		||||
            case 'beforeSession': return 'Listen';
 | 
			
		||||
            case 'inSession'   : return 'Stop';
 | 
			
		||||
            case 'afterSession': return 'Done';
 | 
			
		||||
            default            : return 'Listen';
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async handleMouseDown(e) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
 | 
			
		||||
@ -469,18 +477,20 @@ export class MainHeader extends LitElement {
 | 
			
		||||
        if (window.require) {
 | 
			
		||||
            const { ipcRenderer } = window.require('electron');
 | 
			
		||||
 | 
			
		||||
            this._sessionStateTextListener = (event, text) => {
 | 
			
		||||
                this.actionText = text;
 | 
			
		||||
                this.isTogglingSession = false;
 | 
			
		||||
            this._sessionStateTextListener = (event, { success }) => {
 | 
			
		||||
                if (success) {
 | 
			
		||||
                    this.listenSessionStatus = ({
 | 
			
		||||
                        beforeSession: 'inSession',
 | 
			
		||||
                        inSession: 'afterSession',
 | 
			
		||||
                        afterSession: 'beforeSession',
 | 
			
		||||
                    })[this.listenSessionStatus] || 'beforeSession';
 | 
			
		||||
                } else {
 | 
			
		||||
                    this.listenSessionStatus = 'beforeSession';
 | 
			
		||||
                }
 | 
			
		||||
                this.isTogglingSession = false; // ✨ 로딩 상태만 해제
 | 
			
		||||
            };
 | 
			
		||||
            ipcRenderer.on('session-state-text', this._sessionStateTextListener);
 | 
			
		||||
            ipcRenderer.on('listen:changeSessionResult', this._sessionStateTextListener);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            // this._sessionStateListener = (event, { isActive }) => {
 | 
			
		||||
            //     this.isSessionActive = isActive;
 | 
			
		||||
            //     this.isTogglingSession = false;
 | 
			
		||||
            // };
 | 
			
		||||
            // ipcRenderer.on('session-state-changed', this._sessionStateListener);
 | 
			
		||||
            this._shortcutListener = (event, keybinds) => {
 | 
			
		||||
                console.log('[MainHeader] Received updated shortcuts:', keybinds);
 | 
			
		||||
                this.shortcuts = keybinds;
 | 
			
		||||
@ -501,11 +511,8 @@ export class MainHeader extends LitElement {
 | 
			
		||||
        if (window.require) {
 | 
			
		||||
            const { ipcRenderer } = window.require('electron');
 | 
			
		||||
            if (this._sessionStateTextListener) {
 | 
			
		||||
                ipcRenderer.removeListener('session-state-text', this._sessionStateTextListener);
 | 
			
		||||
                ipcRenderer.removeListener('listen:changeSessionResult', this._sessionStateTextListener);
 | 
			
		||||
            }
 | 
			
		||||
            // if (this._sessionStateListener) {
 | 
			
		||||
            //     ipcRenderer.removeListener('session-state-changed', this._sessionStateListener);
 | 
			
		||||
            // }
 | 
			
		||||
            if (this._shortcutListener) {
 | 
			
		||||
                ipcRenderer.removeListener('shortcuts-updated', this._shortcutListener);
 | 
			
		||||
            }
 | 
			
		||||
@ -557,11 +564,11 @@ export class MainHeader extends LitElement {
 | 
			
		||||
        this.isTogglingSession = true;
 | 
			
		||||
 | 
			
		||||
        try {
 | 
			
		||||
            const channel = 'toggle-feature';
 | 
			
		||||
            const args = ['listen'];
 | 
			
		||||
            await this.invoke(channel, ...args);
 | 
			
		||||
            const channel = 'listen:changeSession';
 | 
			
		||||
            const listenButtonText = this._getListenButtonText(this.listenSessionStatus);
 | 
			
		||||
            await this.invoke(channel, listenButtonText);
 | 
			
		||||
        } catch (error) {
 | 
			
		||||
            console.error('IPC invoke for session toggle failed:', error);
 | 
			
		||||
            console.error('IPC invoke for session change failed:', error);
 | 
			
		||||
            this.isTogglingSession = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@ -591,11 +598,13 @@ export class MainHeader extends LitElement {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
        const listenButtonText = this._getListenButtonText(this.listenSessionStatus);
 | 
			
		||||
    
 | 
			
		||||
        const buttonClasses = {
 | 
			
		||||
            active: this.actionText === 'Stop',
 | 
			
		||||
            done: this.actionText === 'Done',
 | 
			
		||||
            active: listenButtonText === 'Stop',
 | 
			
		||||
            done: listenButtonText === 'Done',
 | 
			
		||||
        };
 | 
			
		||||
        const showStopIcon = this.actionText === 'Stop' || this.actionText === 'Done';
 | 
			
		||||
        const showStopIcon = listenButtonText === 'Stop' || listenButtonText === 'Done';
 | 
			
		||||
 | 
			
		||||
        return html`
 | 
			
		||||
            <div class="header" @mousedown=${this.handleMouseDown}>
 | 
			
		||||
@ -612,7 +621,7 @@ export class MainHeader extends LitElement {
 | 
			
		||||
                        `
 | 
			
		||||
                        : html`
 | 
			
		||||
                            <div class="action-text">
 | 
			
		||||
                                <div class="action-text-content">${this.actionText}</div>
 | 
			
		||||
                                <div class="action-text-content">${listenButtonText}</div>
 | 
			
		||||
                            </div>
 | 
			
		||||
                            <div class="listen-icon">
 | 
			
		||||
                                ${showStopIcon
 | 
			
		||||
 | 
			
		||||
@ -1025,6 +1025,47 @@ function setupIpcHandlers(movementManager) {
 | 
			
		||||
        toggleFeature('ask', {ask: { questionText: question }});
 | 
			
		||||
        return { success: true };
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    // ipcMain.handle('listen:changeSession', async (event, actionText) => {
 | 
			
		||||
    //     console.log('📨 Main process: Received actionText', actionText);
 | 
			
		||||
    //     const header = windowPool.get('header');
 | 
			
		||||
    //     const listenWindow = windowPool.get('listen');
 | 
			
		||||
 | 
			
		||||
    //     try {
 | 
			
		||||
    //         if (listenService && listenService.isSessionActive()) {
 | 
			
		||||
    //             console.log('[WindowManager] Listen session is active, closing it.');
 | 
			
		||||
    //             // ✨ closeSession도 비동기일 수 있으므로 await 처리 (만약 동기 함수라면 await는 무시됨)
 | 
			
		||||
    //             await listenService.closeSession();
 | 
			
		||||
    //             listenWindow.webContents.send('session-state-changed', { isActive: false });
 | 
			
		||||
    //         } else {
 | 
			
		||||
    //             if (listenWindow.isVisible()) {
 | 
			
		||||
    //                 listenWindow.webContents.send('window-hide-animation');
 | 
			
		||||
    //                 listenWindow.webContents.send('session-state-changed', { isActive: false });
 | 
			
		||||
    //             } else {
 | 
			
		||||
    //                 listenWindow.show();
 | 
			
		||||
    //                 updateLayout();
 | 
			
		||||
    //                 listenWindow.webContents.send('window-show-animation');
 | 
			
		||||
                    
 | 
			
		||||
    //                 // ✨ 핵심: initializeSession 작업이 끝날 때까지 기다림
 | 
			
		||||
    //                 await listenService.initializeSession(); 
 | 
			
		||||
                    
 | 
			
		||||
    //                 listenWindow.webContents.send('session-state-changed', { isActive: true });
 | 
			
		||||
    //             }
 | 
			
		||||
    //         }
 | 
			
		||||
 | 
			
		||||
    //         // ✨ 모든 비동기 작업이 성공적으로 끝난 후 결과 전송
 | 
			
		||||
    //         header.webContents.send('listen:changeSessionResult', { success: true });
 | 
			
		||||
    //         return { success: true };
 | 
			
		||||
 | 
			
		||||
    //     } catch (error) {
 | 
			
		||||
    //         console.error('[WindowManager] Failed to change listen session:', error);
 | 
			
		||||
            
 | 
			
		||||
    //         // ✨ 작업 실패 시 UI에 실패 결과를 알려 로딩 상태를 해제하도록 함
 | 
			
		||||
    //         header.webContents.send('listen:changeSessionResult', { success: false });
 | 
			
		||||
    //         return { success: false, error: error.message };
 | 
			
		||||
    //     }
 | 
			
		||||
    // });
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1043,31 +1084,31 @@ async function toggleFeature(featureName, options = {}) {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const header = windowPool.get('header');
 | 
			
		||||
    if (featureName === 'listen') {
 | 
			
		||||
        console.log(`[WindowManager] Toggling feature: ${featureName}`);
 | 
			
		||||
        const listenWindow = windowPool.get(featureName);
 | 
			
		||||
        // const listenService = global.listenService;
 | 
			
		||||
        if (listenService && listenService.isSessionActive()) {
 | 
			
		||||
            console.log('[WindowManager] Listen session is active, closing it via toggle.');
 | 
			
		||||
            await listenService.closeSession();
 | 
			
		||||
            listenWindow.webContents.send('session-state-changed', { isActive: false });
 | 
			
		||||
            header.webContents.send('session-state-text', 'Done');
 | 
			
		||||
            // return;
 | 
			
		||||
        } else {
 | 
			
		||||
            if (listenWindow.isVisible()) {
 | 
			
		||||
                listenWindow.webContents.send('window-hide-animation');
 | 
			
		||||
                listenWindow.webContents.send('session-state-changed', { isActive: false });
 | 
			
		||||
                header.webContents.send('session-state-text', 'Listen');
 | 
			
		||||
            } else {
 | 
			
		||||
                listenWindow.show();
 | 
			
		||||
                updateLayout();
 | 
			
		||||
                listenWindow.webContents.send('window-show-animation');
 | 
			
		||||
                await listenService.initializeSession();
 | 
			
		||||
                listenWindow.webContents.send('session-state-changed', { isActive: true });
 | 
			
		||||
                header.webContents.send('session-state-text', 'Stop');
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    // if (featureName === 'listen') {
 | 
			
		||||
    //     console.log(`[WindowManager] Toggling feature: ${featureName}`);
 | 
			
		||||
    //     const listenWindow = windowPool.get(featureName);
 | 
			
		||||
    //     // const listenService = global.listenService;
 | 
			
		||||
    //     if (listenService && listenService.isSessionActive()) {
 | 
			
		||||
    //         console.log('[WindowManager] Listen session is active, closing it via toggle.');
 | 
			
		||||
    //         await listenService.closeSession();
 | 
			
		||||
    //         listenWindow.webContents.send('session-state-changed', { isActive: false });
 | 
			
		||||
    //         header.webContents.send('session-state-text', 'Done');
 | 
			
		||||
    //         // return;
 | 
			
		||||
    //     } else {
 | 
			
		||||
    //         if (listenWindow.isVisible()) {
 | 
			
		||||
    //             listenWindow.webContents.send('window-hide-animation');
 | 
			
		||||
    //             listenWindow.webContents.send('session-state-changed', { isActive: false });
 | 
			
		||||
    //             header.webContents.send('session-state-text', 'Listen');
 | 
			
		||||
    //         } else {
 | 
			
		||||
    //             listenWindow.show();
 | 
			
		||||
    //             updateLayout();
 | 
			
		||||
    //             listenWindow.webContents.send('window-show-animation');
 | 
			
		||||
    //             await listenService.initializeSession();
 | 
			
		||||
    //             listenWindow.webContents.send('session-state-changed', { isActive: true });
 | 
			
		||||
    //             header.webContents.send('session-state-text', 'Stop');
 | 
			
		||||
    //         }
 | 
			
		||||
    //     }
 | 
			
		||||
    // }
 | 
			
		||||
 | 
			
		||||
    if (featureName === 'ask') {
 | 
			
		||||
        let askWindow = windowPool.get('ask');
 | 
			
		||||
@ -1428,6 +1469,7 @@ async function captureScreenshot(options = {}) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
    updateLayout,
 | 
			
		||||
    createWindows,
 | 
			
		||||
    windowPool,
 | 
			
		||||
    fixedYPosition,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user