Merge pull request #71 from yougotwill/feat/no-ref/debug_menu_user_access

Debug Menu updates
pull/3281/head
Audric Ackermann 2 months ago committed by GitHub
commit 8da778668c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -41,6 +41,7 @@ import { UserGroupsWrapperActions } from '../webworker/workers/browser/libsessio
import { NoticeBanner } from './NoticeBanner';
import { Flex } from './basic/Flex';
import { initialReleasedFeaturesState } from '../state/ducks/releasedFeatures';
import { initialDebugState } from '../state/ducks/debug';
function makeLookup<T>(items: Array<T>, key: string): { [key: string]: T } {
// Yep, we can't index into item without knowing what it is. True. But we want to.
@ -90,6 +91,7 @@ async function createSessionInboxStore() {
groups: initialGroupState,
userGroups: { userGroups },
releasedFeatures: initialReleasedFeaturesState,
debug: initialDebugState,
};
return createStore(initialState);

@ -3,6 +3,7 @@ import useUpdate from 'react-use/lib/useUpdate';
import useAsync from 'react-use/lib/useAsync';
import { shell } from 'electron';
import useBoolean from 'react-use/lib/useBoolean';
import { useDispatch } from 'react-redux';
import type { SessionFeatureFlagsKeys } from '../../../window';
import { Flex } from '../../basic/Flex';
import { SessionToggle } from '../../basic/SessionToggle';
@ -11,14 +12,18 @@ import { localize } from '../../../localization/localeTools';
import { CopyToClipboardIcon } from '../../buttons';
import { saveLogToDesktop } from '../../../util/logging';
import { Localizer } from '../../basic/Localizer';
import { SessionButton } from '../../basic/SessionButton';
import { SessionButton, SessionButtonColor } from '../../basic/SessionButton';
import { ToastUtils, UserUtils } from '../../../session/utils';
import { getLatestReleaseFromFileServer } from '../../../session/apis/file_server_api/FileServerApi';
import { SessionSpinner } from '../../loading';
import { setDebugMode } from '../../../state/ducks/debug';
import { updateDebugMenuModal } from '../../../state/ducks/modalDialog';
export const DebugActions = () => {
const [loadingLatestRelease, setLoadingLatestRelease] = useBoolean(false);
const dispatch = useDispatch();
return (
<>
<h2>Actions</h2>
@ -31,6 +36,16 @@ export const DebugActions = () => {
flexWrap="wrap"
flexGap="var(--margins-md) var(--margins-lg)"
>
<SessionButton
buttonColor={SessionButtonColor.Danger}
onClick={() => {
dispatch(setDebugMode(false));
dispatch(updateDebugMenuModal(null));
}}
>
Exit Debug Mode
</SessionButton>
<SessionButton
onClick={() => {
void saveLogToDesktop();

@ -54,6 +54,7 @@ import { getIsModalVisible } from '../../state/selectors/modal';
import { ReleasedFeatures } from '../../util/releaseFeature';
import { MessageQueue } from '../../session/sending';
import { useRefreshReleasedFeaturesTimestamp } from '../../hooks/useRefreshReleasedFeaturesTimestamp';
import { useDebugMode } from '../../state/selectors/debug';
const Section = (props: { type: SectionType }) => {
const ourNumber = useSelector(getOurNumber);
@ -259,7 +260,7 @@ function useUpdateBadgeCount() {
export const ActionsPanel = () => {
const [startCleanUpMedia, setStartCleanUpMedia] = useState(false);
const ourPrimaryConversation = useSelector(getOurPrimaryConversation);
const showDebugMenu = window?.sessionFeatureFlags?.debug?.debugLogging;
const showDebugMenu = useDebugMode();
// this maxi useEffect is called only once: when the component is mounted.
// For the action panel, it means this is called only one per app start/with a user logged in
@ -322,6 +323,7 @@ export const ActionsPanel = () => {
window?.log?.warn('ActionsPanel: ourPrimaryConversation is not set');
return null;
}
return (
<>
<LeftPaneSectionContainer data-testid="leftpane-section-container">

@ -20,6 +20,7 @@ import { SettingsCategoryHelp } from './section/CategoryHelp';
import { SettingsCategoryPermissions } from './section/CategoryPermissions';
import { SettingsCategoryPrivacy } from './section/CategoryPrivacy';
import { SettingsCategoryRecoveryPassword } from './section/CategoryRecoveryPassword';
import { setDebugMode } from '../../state/ducks/debug';
export function displayPasswordModal(
passwordAction: PasswordAction,
@ -68,6 +69,10 @@ const StyledSpanSessionInfo = styled.span`
`;
const SessionInfo = () => {
const [clickCount, setClickCount] = useState(0);
const dispatch = useDispatch();
return (
<StyledVersionInfo>
<StyledSpanSessionInfo
@ -88,7 +93,17 @@ const SessionInfo = () => {
}}
/>
</StyledSpanSessionInfo>
<StyledSpanSessionInfo>{window.versionInfo.commitHash}</StyledSpanSessionInfo>
<StyledSpanSessionInfo
onClick={() => {
setClickCount(clickCount + 1);
if (clickCount === 10) {
dispatch(setDebugMode(true));
setClickCount(0);
}
}}
>
{window.versionInfo.commitHash}
</StyledSpanSessionInfo>
</StyledVersionInfo>
);
};

@ -0,0 +1,25 @@
import { createSlice, type PayloadAction } from '@reduxjs/toolkit';
export interface DebugState {
debugMode: boolean;
}
export const initialDebugState = {
debugMode: false,
};
const debugSlice = createSlice({
name: 'debug',
initialState: initialDebugState,
reducers: {
setDebugMode: (state, action: PayloadAction<boolean>) => {
(window as Window).sessionFeatureFlags.debug.debugLogging = action.payload;
state.debugMode = action.payload;
return state;
},
},
});
const { actions, reducer } = debugSlice;
export const { setDebugMode } = actions;
export const debugReducer = reducer;

@ -22,6 +22,7 @@ import {
import { userConfigReducer as userConfig, UserConfigState } from './ducks/userConfig';
import { userGroupReducer, UserGroupState } from './ducks/userGroups';
import { releasedFeaturesReducer, ReleasedFeaturesState } from './ducks/releasedFeatures';
import { debugReducer, type DebugState } from './ducks/debug';
export type StateType = {
search: SearchStateType;
@ -41,6 +42,7 @@ export type StateType = {
groups: GroupState;
userGroups: UserGroupState;
releasedFeatures: ReleasedFeaturesState;
debug: DebugState;
};
const reducers = {
@ -61,6 +63,7 @@ const reducers = {
groups: groupReducer,
userGroups: userGroupReducer,
releasedFeatures: releasedFeaturesReducer,
debug: debugReducer,
};
// Making this work would require that our reducer signature supported AnyAction, not

@ -0,0 +1,10 @@
import { useSelector } from 'react-redux';
import type { StateType } from '../reducer';
const getDebugMode = (state: StateType): boolean => {
return window.sessionFeatureFlags?.debug?.debugLogging || state?.debug?.debugMode || false;
};
export const useDebugMode = (): boolean => {
return useSelector(getDebugMode);
};
Loading…
Cancel
Save