mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-04-17 23:34:14 +01:00
108 lines
2.5 KiB
TypeScript
108 lines
2.5 KiB
TypeScript
// Copyright 2023 Signal Messenger, LLC
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
import { createSelector } from 'reselect';
|
|
|
|
import { NavTab } from '../../types/Nav.std.js';
|
|
|
|
import type { PanelArgsType } from '../../types/Panels.std.js';
|
|
import type { Location, PanelInfo } from '../../types/Nav.std.js';
|
|
import type { StateType } from '../reducer.preload.js';
|
|
import type { NavStateType } from '../ducks/nav.std.js';
|
|
|
|
function getNav(state: StateType): NavStateType {
|
|
return state.nav;
|
|
}
|
|
|
|
export const getSelectedNavTab = createSelector(getNav, nav => {
|
|
return nav.selectedLocation.tab;
|
|
});
|
|
|
|
export const getSelectedLocation = createSelector(getNav, nav => {
|
|
return nav.selectedLocation;
|
|
});
|
|
|
|
export const getSelectedConversationId = createSelector(
|
|
getSelectedLocation,
|
|
(selectedLocation: Location): string | undefined => {
|
|
if (selectedLocation.tab !== NavTab.Chats) {
|
|
return;
|
|
}
|
|
|
|
return selectedLocation.details.conversationId;
|
|
}
|
|
);
|
|
|
|
export const getPanels = createSelector(
|
|
getSelectedLocation,
|
|
(selectedLocation: Location): PanelInfo | undefined => {
|
|
if (selectedLocation.tab !== NavTab.Chats) {
|
|
return;
|
|
}
|
|
|
|
return selectedLocation.details.panels;
|
|
}
|
|
);
|
|
export const getHasPanelOpen = createSelector(getPanels, (panels): boolean => {
|
|
return Boolean(panels && panels.watermark > 0);
|
|
});
|
|
|
|
export const getActivePanel = createSelector(
|
|
getPanels,
|
|
(panels: PanelInfo | undefined): PanelArgsType | undefined => {
|
|
if (!panels) {
|
|
return undefined;
|
|
}
|
|
|
|
return panels.stack[panels.watermark];
|
|
}
|
|
);
|
|
|
|
type PanelInformationType = {
|
|
currPanel: PanelArgsType | undefined;
|
|
leafPanelOnly?: boolean;
|
|
direction: 'push' | 'pop';
|
|
prevPanel: PanelArgsType | undefined;
|
|
};
|
|
|
|
export const getPanelInformation = createSelector(
|
|
getPanels,
|
|
getActivePanel,
|
|
(panels, currPanel): PanelInformationType | undefined => {
|
|
if (!panels) {
|
|
return;
|
|
}
|
|
|
|
const { direction, watermark, leafPanelOnly } = panels;
|
|
|
|
if (!direction) {
|
|
return;
|
|
}
|
|
|
|
const watermarkDirection =
|
|
direction === 'push' ? watermark - 1 : watermark + 1;
|
|
const prevPanel = panels.stack[watermarkDirection];
|
|
|
|
return {
|
|
currPanel,
|
|
direction,
|
|
prevPanel,
|
|
leafPanelOnly,
|
|
};
|
|
}
|
|
);
|
|
|
|
export const getIsPanelAnimating = createSelector(
|
|
getPanels,
|
|
(panels): boolean => {
|
|
return Boolean(panels?.isAnimating);
|
|
}
|
|
);
|
|
|
|
export const getWasPanelAnimated = createSelector(
|
|
getPanels,
|
|
(panels): boolean => {
|
|
return Boolean(panels?.wasAnimated);
|
|
}
|
|
);
|