diff --git a/ts/components/leftpane/ActionsPanel.tsx b/ts/components/leftpane/ActionsPanel.tsx index 1186699ef..4a67bc81b 100644 --- a/ts/components/leftpane/ActionsPanel.tsx +++ b/ts/components/leftpane/ActionsPanel.tsx @@ -1,9 +1,11 @@ +import { ipcRenderer } from 'electron'; import { debounce } from 'lodash'; import { useEffect, useRef, useState } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import useInterval from 'react-use/lib/useInterval'; import useTimeoutFn from 'react-use/lib/useTimeoutFn'; +import useThrottleFn from 'react-use/lib/useThrottleFn'; import { Data } from '../../data/data'; import { getConversationController } from '../../session/conversations'; @@ -37,18 +39,18 @@ import { LeftPaneSectionContainer } from './LeftPaneSectionContainer'; import { SettingsKey } from '../../data/settings-key'; import { useFetchLatestReleaseFromFileServer } from '../../hooks/useFetchLatestReleaseFromFileServer'; +import { useHotkey } from '../../hooks/useHotkey'; import { forceRefreshRandomSnodePool, getFreshSwarmFor, } from '../../session/apis/snode_api/snodePool'; import { ConfigurationSync } from '../../session/utils/job_runners/jobs/ConfigurationSyncJob'; +import { getIsModalVisble } from '../../state/selectors/modal'; import { useIsDarkTheme } from '../../state/selectors/theme'; import { switchThemeTo } from '../../themes/switchTheme'; import { ReleasedFeatures } from '../../util/releaseFeature'; import { getOppositeTheme } from '../../util/theme'; import { SessionNotificationCount } from '../icon/SessionNotificationCount'; -import { useHotkey } from '../../hooks/useHotkey'; -import { getIsModalVisble } from '../../state/selectors/modal'; const Section = (props: { type: SectionType }) => { const ourNumber = useSelector(getOurNumber); @@ -238,6 +240,19 @@ export const ActionsPanel = () => { return () => clearTimeout(timeout); }, []); + const globalUnreadMessageCount = useSelector(getGlobalUnreadMessageCount); + + // Reuse the unreadToShow from the global state to update the badge count + useThrottleFn( + (unreadCount: number) => { + if (globalUnreadMessageCount !== undefined) { + ipcRenderer.send('update-badge-count', unreadCount); + } + }, + 2000, + [globalUnreadMessageCount] + ); + useInterval(cleanUpOldDecryptedMedias, startCleanUpMedia ? cleanUpMediasInterval : null); useFetchLatestReleaseFromFileServer(); diff --git a/ts/mains/main_node.ts b/ts/mains/main_node.ts index 3de057251..cd4ba2a3f 100644 --- a/ts/mains/main_node.ts +++ b/ts/mains/main_node.ts @@ -10,6 +10,7 @@ import { dialog, protocol as electronProtocol, ipcMain as ipc, + ipcMain, IpcMainEvent, Menu, nativeTheme, @@ -27,7 +28,7 @@ import { platform as osPlatform } from 'process'; import url from 'url'; import Logger from 'bunyan'; -import _, { isEmpty } from 'lodash'; +import _, { isEmpty, isNumber, isFinite } from 'lodash'; import pify from 'pify'; import { setupGlobalErrorHandler } from '../node/global_errors'; // checked - only node @@ -1019,6 +1020,14 @@ ipc.on('get-start-in-tray', event => { } }); +ipcMain.on('update-badge-count', (_event, count) => { + if (app.isReady()) { + app.setBadgeCount( + isNumber(count) && isFinite(count) && count >= 0 ? count : 0 + ); + } +}); + ipc.on('get-opengroup-pruning', event => { try { const val = userConfig.get('opengroupPruning');