diff options
| author | Pinapelz <yukais@pinapelz.com> | 2025-06-21 22:09:02 -0700 |
|---|---|---|
| committer | Pinapelz <yukais@pinapelz.com> | 2025-06-21 22:09:20 -0700 |
| commit | 1257a0f83190527725c595c0d872c332ecfdf3a8 (patch) | |
| tree | 849a4f61eeb9927d3771856eb7d146a25855a204 | |
| parent | a9eadcc3a53c96657963e1d3a17dba87c0e02739 (diff) | |
make max messages kept configurable
| -rw-r--r-- | src/main/index.ts | 11 | ||||
| -rw-r--r-- | src/preload/index.d.ts | 2 | ||||
| -rw-r--r-- | src/preload/index.ts | 5 | ||||
| -rw-r--r-- | src/renderer/src/App.tsx | 17 | ||||
| -rw-r--r-- | src/renderer/src/components/ConfigModal.tsx | 45 |
5 files changed, 73 insertions, 7 deletions
diff --git a/src/main/index.ts b/src/main/index.ts index 76c508a..344465f 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -102,6 +102,17 @@ function setupIpcHandlers(): void { return true }) + // Get max messages + ipcMain.handle('config:get-max-messages', () => { + return store.get('maxMessages', 300) // Default to 100 if not set + }) + + // Set max messages + ipcMain.handle('config:set-max-messages', (_, maxMessagesKept: number) => { + store.set('maxMessages', maxMessagesKept) + return true + }) + // Get all channel nicknames as array ipcMain.handle('config:get-channel-list', () => { const nicknames = store.get('channelNicknames') diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts index dd64a3f..99f64a5 100644 --- a/src/preload/index.d.ts +++ b/src/preload/index.d.ts @@ -11,6 +11,8 @@ declare global { setChannelNickname: (channelId: string, nickname: string) => Promise<boolean> removeChannelNickname: (channelId: string) => Promise<boolean> getChannelList: () => Promise<Array<{ id: string; nickname: string }>> + getMaxMessages: () => Promise<number> + setMaxMessages: (maxMessageNum: number) => Promise<boolean> } } } diff --git a/src/preload/index.ts b/src/preload/index.ts index 84ff03c..793aa56 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -14,6 +14,9 @@ contextBridge.exposeInMainWorld('electron', { ipcRenderer.invoke('config:set-channel-nickname', channelId, nickname), removeChannelNickname: (channelId: string) => ipcRenderer.invoke('config:remove-channel-nickname', channelId), - getChannelList: () => ipcRenderer.invoke('config:get-channel-list') + getChannelList: () => ipcRenderer.invoke('config:get-channel-list'), + getMaxMessages: () => ipcRenderer.invoke('config:get-max-messages'), + setMaxMessages: (maxMessageNum: number) => + ipcRenderer.invoke('config:set-max-messages', maxMessageNum) } }) diff --git a/src/renderer/src/App.tsx b/src/renderer/src/App.tsx index bbd949d..2297060 100644 --- a/src/renderer/src/App.tsx +++ b/src/renderer/src/App.tsx @@ -8,19 +8,23 @@ function App(): React.JSX.Element { const [channelNicknames, setChannelNicknames] = useState<Record<string, string>>({}) const [isConfigOpen, setIsConfigOpen] = useState(false) const [isMouseInWindow, setIsMouseInWindow] = useState(true) + const [maxMessages, setMaxMessages] = useState<number>(300) - // Load channel nicknames on mount + // Load channel nicknames and max messages on mount useEffect(() => { - const loadChannelNicknames = async (): Promise<void> => { + const loadConfig = async (): Promise<void> => { try { const nicknames = await window.electron.config.getChannelNicknames() setChannelNicknames(nicknames) + + const maxMsgs = await window.electron.config.getMaxMessages() + setMaxMessages(maxMsgs) } catch (error) { - console.error('Failed to load channel nicknames:', error) + console.error('Failed to load config:', error) } } - loadChannelNicknames() + loadConfig() }, []) useEffect(() => { @@ -33,7 +37,7 @@ function App(): React.JSX.Element { if (existingMessage) { return prev } - return [data, ...prev.slice(0, 300)] + return [data, ...prev.slice(0, maxMessages - 1)] }) } } @@ -125,8 +129,9 @@ function App(): React.JSX.Element { isOpen={isConfigOpen} onClose={() => { setIsConfigOpen(false) - // Reload channel nicknames after config changes + // Reload config after changes window.electron.config.getChannelNicknames().then(setChannelNicknames) + window.electron.config.getMaxMessages().then(setMaxMessages) }} /> </div> diff --git a/src/renderer/src/components/ConfigModal.tsx b/src/renderer/src/components/ConfigModal.tsx index f927045..7f5e3e8 100644 --- a/src/renderer/src/components/ConfigModal.tsx +++ b/src/renderer/src/components/ConfigModal.tsx @@ -18,10 +18,13 @@ export default function ConfigModal({ const [newChannelId, setNewChannelId] = useState('') const [newNickname, setNewNickname] = useState('') const [isLoading, setIsLoading] = useState(false) + const [maxMessages, setMaxMessages] = useState<number>(300) + const [tempMaxMessages, setTempMaxMessages] = useState<number>(300) useEffect(() => { if (isOpen) { loadChannels() + loadMaxMessages() } }, [isOpen]) @@ -34,6 +37,25 @@ export default function ConfigModal({ } } + const loadMaxMessages = async (): Promise<void> => { + try { + const maxMsgs = await window.electron.config.getMaxMessages() + setMaxMessages(maxMsgs) + setTempMaxMessages(maxMsgs) + } catch (error) { + console.error('Failed to load max messages:', error) + } + } + + const handleSaveMaxMessages = async (): Promise<void> => { + try { + await window.electron.config.setMaxMessages(tempMaxMessages) + setMaxMessages(tempMaxMessages) + } catch (error) { + console.error('Failed to save max messages:', error) + } + } + const handleAddChannel = async (): Promise<void> => { if (!newChannelId.trim() || !newNickname.trim()) { return @@ -82,6 +104,29 @@ export default function ConfigModal({ </div> <div className="modal-body"> + <div className="max-messages-section"> + <h3>Message Limit</h3> + <div className="input-group"> + <label>Maximum messages to keep in memory:</label> + <input + type="number" + min="10" + max="1000" + value={tempMaxMessages} + onChange={(e) => setTempMaxMessages(parseInt(e.target.value) || 300)} + /> + <button + onClick={handleSaveMaxMessages} + disabled={tempMaxMessages === maxMessages} + > + Save + </button> + </div> + <p className="help-text"> + Current: {maxMessages} messages. Higher values use more memory but keep more message history. + </p> + </div> + <div className="add-channel-section"> <h3>Add Channel</h3> <div className="input-group"> |
