import { PushRuleAction, PushRuleActionName, TweakName } from 'matrix-js-sdk'; import { useCallback, useMemo } from 'react'; export enum NotificationMode { OFF = 'OFF', Notify = 'Notify', NotifyLoud = 'NotifyLoud', } export const getNotificationMode = (actions: PushRuleAction[]): NotificationMode => { const soundTweak = actions.find( (action) => typeof action === 'object' && action.set_tweak === TweakName.Sound ); const notify = actions.find( (action) => typeof action === 'string' && action === PushRuleActionName.Notify ); if (notify && soundTweak) return NotificationMode.NotifyLoud; if (notify) return NotificationMode.Notify; return NotificationMode.OFF; }; export type NotificationModeOptions = { soundValue?: string; highlight?: boolean; }; export const getNotificationModeActions = ( mode: NotificationMode, options?: NotificationModeOptions ): PushRuleAction[] => { if (mode === NotificationMode.OFF) return []; const actions: PushRuleAction[] = [PushRuleActionName.Notify]; if (mode === NotificationMode.NotifyLoud) { actions.push({ set_tweak: TweakName.Sound, value: options?.soundValue ?? 'default', }); } if (options?.highlight) { actions.push({ set_tweak: TweakName.Highlight, value: true, }); } return actions; }; export type GetNotificationModeCallback = (mode: NotificationMode) => PushRuleAction[]; export const useNotificationModeActions = ( options?: NotificationModeOptions ): GetNotificationModeCallback => { const getAction: GetNotificationModeCallback = useCallback( (mode) => getNotificationModeActions(mode, options), [options] ); return getAction; }; export const useNotificationActionsMode = (actions: PushRuleAction[]): NotificationMode => { const mode: NotificationMode = useMemo(() => getNotificationMode(actions), [actions]); return mode; };