Skip to content

Commit 6c32675

Browse files
committed
fix: improve state management
1 parent b9d0c6f commit 6c32675

File tree

10 files changed

+41
-56
lines changed

10 files changed

+41
-56
lines changed

.eslintrc.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@ module.exports = {
1515
},
1616
},
1717
rules: {
18+
'no-unused-vars': 'off',
19+
'max-len': 'off',
20+
'@typescript-eslint/no-explicit-any': 'off',
21+
'@typescript-eslint/no-unused-vars': 'off',
22+
'no-console': 'off',
1823
'react/jsx-filename-extension': [1, { extensions: ['.tsx', '.jsx'] }],
19-
'import/extensions': [
20-
'error',
21-
'ignorePackages',
22-
{
23-
js: 'never',
24-
jsx: 'never',
25-
ts: 'never',
26-
tsx: 'never',
27-
},
28-
],
24+
'import/extensions': 'off',
2925
'import/no-extraneous-dependencies': ['error', { devDependencies: true }],
26+
'react/react-in-jsx-scope': 'off',
27+
'react/jsx-props-no-spreading': 'off',
28+
'import/no-unresolved': 'off',
29+
'import/prefer-default-export': 'off',
3030
},
3131
};

src/renderer/src/App.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,26 @@ import { Live2DModelProvider } from './context/live2d-model-context';
2323
import { InputSubtitle } from './components/electron/input-subtitle';
2424
import { ProactiveSpeakProvider } from './context/proactive-speak-context';
2525

26-
const App: React.FC = () => {
26+
function App(): JSX.Element {
2727
const [showSidebar, setShowSidebar] = useState(true);
2828
const [isFooterCollapsed, setIsFooterCollapsed] = useState(false);
2929
const [mode, setMode] = useState('window');
3030
const isElectron = window.api !== undefined;
3131

32-
if (isElectron) {
33-
useEffect(() => {
32+
useEffect(() => {
33+
if (isElectron) {
3434
window.electron.ipcRenderer.on('pre-mode-changed', (_event, newMode) => {
3535
requestAnimationFrame(() => {
3636
requestAnimationFrame(() => {
3737
window.electron.ipcRenderer.send('renderer-ready-for-mode-change', newMode);
3838
});
3939
});
4040
});
41-
}, []);
42-
}
41+
}
42+
}, [isElectron]);
4343

44-
if (isElectron) {
45-
useEffect(() => {
44+
useEffect(() => {
45+
if (isElectron) {
4646
window.electron.ipcRenderer.on('mode-changed', (_event, newMode) => {
4747
setMode(newMode);
4848
requestAnimationFrame(() => {
@@ -51,8 +51,8 @@ const App: React.FC = () => {
5151
});
5252
});
5353
});
54-
}, []);
55-
}
54+
}
55+
}, [isElectron]);
5656

5757
useEffect(() => {
5858
const handleResize = () => {
@@ -133,5 +133,5 @@ const App: React.FC = () => {
133133
</Live2DModelProvider>
134134
</ChakraProvider>
135135
);
136-
};
136+
}
137137
export default App;

src/renderer/src/hooks/utils/use-interrupt.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export const useInterrupt = () => {
1212
const { currentModel } = useLive2DModel();
1313
const { subtitleText, setSubtitleText } = useSubtitle();
1414
const interrupt = () => {
15-
if (aiState != 'thinking-speaking') return;
15+
if (aiState !== 'thinking-speaking') return;
1616
console.log('Interrupting conversation chain');
1717
sendMessage({
1818
type: 'interrupt-signal',
@@ -26,7 +26,7 @@ export const useInterrupt = () => {
2626
console.error('Live2D model is not initialized');
2727
}
2828
clearResponse();
29-
if (subtitleText == 'Thinking...') {
29+
if (subtitleText === 'Thinking...') {
3030
setSubtitleText('');
3131
}
3232
console.log('Interrupted!');

src/renderer/src/hooks/utils/use-mic-toggle.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import { useVAD } from '@/context/vad-context';
2+
import { useAiState } from '@/context/ai-state-context';
23

34
export function useMicToggle() {
45
const { startMic, stopMic, micOn } = useVAD();
6+
const { aiState, setAiState } = useAiState();
57

68
const handleMicToggle = async (): Promise<void> => {
79
if (micOn) {
810
stopMic();
11+
if (aiState === 'listening') {
12+
setAiState('idle');
13+
}
914
} else {
1015
await startMic();
1116
}

src/renderer/src/services/websocket-handler.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ function WebSocketHandler({ children }: { children: React.ReactNode }) {
5959
break;
6060
case 'conversation-chain-end':
6161
audioTaskQueue.addTask(() => new Promise<void>((resolve) => {
62-
setAiState('idle');
62+
if (aiState === 'thinking-speaking') setAiState('idle');
6363
startMic();
6464
resolve();
6565
}));

src/renderer/src/types/message.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/renderer/src/types/message.tsx

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/renderer/src/types/system-log.tsx

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/renderer/src/utils/task-queue.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ export class TaskQueue {
2121

2222
private async runNextTask() {
2323
if (this.running || this.queue.length === 0) {
24-
if (this.queue.length === 0) {
25-
console.log('Queue is empty');
26-
}
2724
return;
2825
}
2926

@@ -32,7 +29,7 @@ export class TaskQueue {
3229
try {
3330
await task?.();
3431
} catch (error) {
35-
console.error('Task failed', error);
32+
console.error('Task Queue Error', error);
3633
}
3734
this.running = false;
3835
setTimeout(() => this.runNextTask(), this.taskInterval);

tsconfig.node.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@
1616
"noEmit": true,
1717
/* Linting */
1818
"strict": false,
19-
"noUnusedLocals": false,
20-
"noUnusedParameters": false,
21-
"noFallthroughCasesInSwitch": false,
22-
"allowUnusedLabels": true,
23-
"allowUnreachableCode": true,
24-
"noImplicitAny": false,
25-
"noImplicitThis": false,
26-
"noImplicitReturns": false,
27-
"noPropertyAccessFromIndexSignature": false,
28-
"noUncheckedIndexedAccess": false,
29-
"exactOptionalPropertyTypes": false,
30-
"noImplicitOverride": false
19+
// "noUnusedLocals": false,
20+
// "noUnusedParameters": false,
21+
// "noFallthroughCasesInSwitch": false,
22+
// "allowUnusedLabels": true,
23+
// "allowUnreachableCode": true,
24+
// "noImplicitAny": false,
25+
// "noImplicitThis": false,
26+
// "noImplicitReturns": false,
27+
// "noPropertyAccessFromIndexSignature": false,
28+
// "noUncheckedIndexedAccess": false,
29+
// "exactOptionalPropertyTypes": false,
30+
// "noImplicitOverride": false
3131
},
3232
"include": [
3333
"vite.config.ts"

0 commit comments

Comments
 (0)