From 4bdc01e84b3673cf429961935f29a5eddebb0d40 Mon Sep 17 00:00:00 2001 From: automated-signal <37887102+automated-signal@users.noreply.github.com> Date: Fri, 21 Aug 2026 13:24:16 -0500 Subject: [PATCH] Fix composer keyboard shortcuts in default no modal state Co-authored-by: ayumi-signal <143036029+ayumi-signal@users.noreply.github.com> --- ts/state/selectors/globalModals.std.ts | 9 +++- .../selectors/globalModals_test.preload.ts | 45 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 ts/test-node/state/selectors/globalModals_test.preload.ts diff --git a/ts/state/selectors/globalModals.std.ts b/ts/state/selectors/globalModals.std.ts index 8ba6202719..9306a8ff27 100644 --- a/ts/state/selectors/globalModals.std.ts +++ b/ts/state/selectors/globalModals.std.ts @@ -5,7 +5,10 @@ import { createSelector } from 'reselect'; import type { StateType } from '../reducer.preload.ts'; import type { GlobalModalsStateType } from '../ducks/globalModals.preload.ts'; -import { UsernameOnboardingState } from '../../types/globalModals.std.ts'; +import { + PinReminderState, + UsernameOnboardingState, +} from '../../types/globalModals.std.ts'; import type { StateSelector } from '../types.std.ts'; import type { PinMessageDialogData } from '../smart/PinMessageDialog.preload.tsx'; @@ -20,6 +23,10 @@ export const isShowingAnyModal = createSelector( return value === UsernameOnboardingState.Open; } + if (key === 'pinReminderState') { + return value === PinReminderState.Modal; + } + return Boolean(value); }) ); diff --git a/ts/test-node/state/selectors/globalModals_test.preload.ts b/ts/test-node/state/selectors/globalModals_test.preload.ts new file mode 100644 index 0000000000..7748e49c4f --- /dev/null +++ b/ts/test-node/state/selectors/globalModals_test.preload.ts @@ -0,0 +1,45 @@ +// Copyright 2026 Signal Messenger, LLC +// SPDX-License-Identifier: AGPL-3.0-only + +import { assert } from 'chai'; + +import type { StateType } from '../../../state/reducer.preload.ts'; +import type { GlobalModalsStateType } from '../../../state/ducks/globalModals.preload.ts'; +import { getEmptyState } from '../../../state/ducks/globalModals.preload.ts'; + +import { isShowingAnyModal } from '../../../state/selectors/globalModals.std.ts'; +import { UsernameOnboardingState } from '../../../types/globalModals.std.ts'; + +describe('both/state/selectors/globalModals', () => { + function getRootState( + overrides: Readonly> + ): StateType { + return { + globalModals: { + ...getEmptyState(), + ...overrides, + }, + } as StateType; + } + + describe('#isShowingAnyModal', () => { + it('returns false in default state', () => { + const state = getRootState({}); + assert.isFalse(isShowingAnyModal(state)); + }); + + it('returns true when showing a modal', () => { + const state = getRootState({ + errorModalProps: { title: 'hi', description: 'im a cat' }, + }); + assert.isTrue(isShowingAnyModal(state)); + }); + + it('returns true when showing username megaphone', () => { + const state = getRootState({ + usernameOnboardingState: UsernameOnboardingState.Open, + }); + assert.isTrue(isShowingAnyModal(state)); + }); + }); +});