Skip to content

Commit 5287f3a

Browse files
committed
feat(suite): display the left menu sidebar in welcome state
1 parent 9b8f7ab commit 5287f3a

File tree

13 files changed

+97
-125
lines changed

13 files changed

+97
-125
lines changed

Diff for: packages/suite-desktop-core/e2e/support/bridge.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ export const expectBridgeToBeStopped = async (request: APIRequestContext) => {
1414
}).rejects.toThrow('ECONNREFUSED');
1515
};
1616

17-
// We wait for `@welcome/title` or `@dashboard/graph` since
17+
// We wait for `@welcome-layout/body` or `@dashboard/graph` since
1818
// one or the other will be display depending on the state of the app
1919
// due to previously run tests. And both means the same for the porpoise of this test.
2020
// Bridge should be ready to check `/status` endpoint.
2121
export const waitForAppToBeInitialized = async (suite: any) =>
2222
await Promise.race([
23-
expect(suite.window.getByTestId('@welcome/title')).toBeVisible(),
23+
expect(suite.window.getByTestId('@welcome-layout/body')).toBeVisible(),
2424
expect(suite.window.getByTestId('@dashboard/graph')).toBeVisible(),
2525
]);

Diff for: packages/suite-desktop-core/e2e/support/pageActions/onboarding/onboardingActions.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export class OnboardingActions {
1818
readonly pin: PinActions;
1919
readonly tutorial: TutorialActions;
2020

21-
readonly welcomeTitle: Locator;
21+
readonly welcomeBody: Locator;
2222
readonly onboardingContinueButton: Locator;
2323
readonly onboardingViewOnlySkipButton: Locator;
2424
readonly onboardingViewOnlyEnableButton: Locator;
@@ -52,7 +52,7 @@ export class OnboardingActions {
5252
this.tutorial = new TutorialActions(page);
5353
this.pin = new PinActions(page);
5454

55-
this.welcomeTitle = this.page.getByTestId('@welcome/title');
55+
this.welcomeBody = this.page.getByTestId('@welcome-layout/body');
5656
this.onboardingContinueButton = this.page.getByTestId('@onboarding/exit-app-button');
5757
this.onboardingViewOnlySkipButton = this.page.getByTestId('@onboarding/viewOnly/skip');
5858
this.onboardingViewOnlyEnableButton = this.page.getByTestId('@onboarding/viewOnly/enable');
@@ -83,7 +83,7 @@ export class OnboardingActions {
8383

8484
@step()
8585
async optionallyDismissFwHashCheckError() {
86-
await expect(this.welcomeTitle).toBeVisible({ timeout: 10000 });
86+
await expect(this.welcomeBody).toBeVisible({ timeout: 10000 });
8787
// dismisses the error modal only if it appears (handle it async in parallel, not necessary to block the rest of the flow)
8888
this.page
8989
.$('[data-testid="@device-compromised/back-button"]')
@@ -114,7 +114,7 @@ export class OnboardingActions {
114114
return;
115115
}
116116

117-
await expect(this.welcomeTitle).toBeVisible({ timeout: 10000 });
117+
await expect(this.welcomeBody).toBeVisible({ timeout: 10000 });
118118
// eslint-disable-next-line @typescript-eslint/no-shadow
119119
await this.page.evaluate(SuiteActions => {
120120
window.store.dispatch({

Diff for: packages/suite-desktop-core/e2e/support/pageActions/settings/settingsActions.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export class SettingsActions {
8787
'@settings/early-access-confirm-button',
8888
);
8989
this.earlyAccessSkipButton = this.page.getByTestId('@settings/early-access-skip-button');
90-
this.settingsCloseButton = this.page.getByTestId('@settings/menu/close');
90+
this.settingsCloseButton = this.page.getByTestId('@suite/menu/suite-start');
9191
this.modal = this.page.getByTestId('@modal');
9292
this.modalCloseButton = this.page.getByTestId('@modal/close-button');
9393
this.deviceLabelInput = this.page.getByTestId('@settings/device/label-input');

Diff for: packages/suite-desktop-core/e2e/tests/bridge-tor/spawn-tor.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ test.describe.skip('Tor loading screen', { tag: ['@group=suite', '@desktopOnly']
5555
state: 'visible',
5656
});
5757

58-
await suite.window.waitForSelector('[data-testid="@welcome/title"]', { timeout });
58+
await suite.window.waitForSelector('[data-testid="@welcome-layout/body"]', { timeout });
5959

6060
suite.electronApp.close();
6161
});
@@ -83,7 +83,7 @@ test.describe.skip('Tor loading screen', { tag: ['@group=suite', '@desktopOnly']
8383
state: 'visible',
8484
});
8585

86-
await suite.window.waitForSelector('[data-testid="@welcome/title"]', { timeout });
86+
await suite.window.waitForSelector('[data-testid="@welcome-layout/body"]', { timeout });
8787
networkAnalyzer.stop();
8888
const requests = networkAnalyzer.getRequests();
8989
requests.forEach(request => {

Diff for: packages/suite-desktop-core/e2e/tests/browser/firefox.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { expect, test } from '../../support/fixtures';
55
test.use({ startEmulator: false, ...devices['Desktop Firefox'], channel: 'firefox' });
66
test.describe('Firefox', { tag: ['@group=other', '@webOnly'] }, () => {
77
test('Suite does support Firefox', async ({ page, onboardingPage }) => {
8-
await expect(onboardingPage.welcomeTitle).toBeVisible({ timeout: 20_000 });
8+
await expect(onboardingPage.welcomeBody).toBeVisible({ timeout: 20_000 });
99
await expect(page.getByText('Continue at my own risk')).not.toBeVisible();
1010
});
1111
});

Diff for: packages/suite-desktop-core/e2e/tests/browser/safari.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ test.describe('Safari', { tag: ['@group=other', '@webOnly', '@snapshot'] }, () =
2929
'Continue at my own risk',
3030
);
3131
await onboardingPage.continueAtYourOwnRiskButton.click({ force: true });
32-
await expect(onboardingPage.welcomeTitle).toBeVisible({ timeout: 20_000 });
32+
await expect(onboardingPage.welcomeBody).toBeVisible({ timeout: 20_000 });
3333
});
3434
});

Diff for: packages/suite/src/components/suite/Preloader/__tests__/Preloader.test.tsx

+3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as envUtils from '@trezor/env-utils';
22
import { DeepPartial } from '@trezor/type-utils';
33

4+
import { desktopUpdateInitialState } from 'src/reducers/suite/desktopUpdateReducer';
45
import { configureStore } from 'src/support/tests/configureStore';
56
import { findByTestId, renderWithProviders } from 'src/support/tests/hooksHelper';
67

@@ -85,7 +86,9 @@ const getInitialState = ({ suite, router, device }: any = {}) => ({
8586
discovery: [],
8687
accountSearch: {},
8788
settings: {},
89+
blockchain: {},
8890
},
91+
desktopUpdate: desktopUpdateInitialState,
8992
router: {
9093
app: 'suite-index',
9194
loaded: true,

Diff for: packages/suite/src/components/suite/layouts/LoggedOutLayout.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ReactNode, useRef, useState } from 'react';
22

3-
import { ElevationContext, ElevationUp, NewModal } from '@trezor/components';
3+
import { ElevationContext, ElevationDown, ElevationUp, NewModal } from '@trezor/components';
44

55
import { GuideButton, GuideRouter } from 'src/components/guide';
66
import { useLayoutSize } from 'src/hooks/suite';
@@ -19,6 +19,7 @@ import {
1919
PageWrapper,
2020
Wrapper,
2121
} from './SuiteLayout/SuiteLayout';
22+
import { LoggedOutSidebar } from './WelcomeLayout/WelcomeLayout';
2223
import { ModalSwitcher } from '../modals/ModalSwitcher/ModalSwitcher';
2324

2425
interface LoggedOutLayout {
@@ -47,6 +48,9 @@ export const LoggedOutLayout = ({ children }: LoggedOutLayout) => {
4748
<LayoutContext.Provider value={setLayoutPayload}>
4849
<Body data-testid="@suite-layout/body">
4950
<Columns>
51+
<ElevationDown>
52+
<LoggedOutSidebar />
53+
</ElevationDown>
5054
<AppWrapper
5155
data-testid="@app"
5256
ref={scrollRef}

Diff for: packages/suite/src/components/suite/layouts/SuiteLayout/Sidebar/Navigation.tsx

+10-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@ import { FC } from 'react';
22

33
import styled from 'styled-components';
44

5+
import { Route } from '@suite-common/suite-types';
56
import { spacingsPx } from '@trezor/theme';
67

78
import { NavigationItem, NavigationItemProps } from './NavigationItem';
89
import { NotificationDropdown } from './NotificationDropdown';
910
import { useResponsiveContext } from '../../../../../support/suite/ResponsiveContext';
1011

11-
const Nav = styled.nav<{ $isSidebarCollapsed: boolean }>`
12+
export const Nav = styled.nav<{ $isSidebarCollapsed: boolean }>`
1213
display: flex;
1314
flex-direction: column;
1415
gap: ${spacingsPx.xxs};
@@ -18,6 +19,13 @@ const Nav = styled.nav<{ $isSidebarCollapsed: boolean }>`
1819
${({ $isSidebarCollapsed }) => $isSidebarCollapsed && `align-items: center;`}
1920
`;
2021

22+
export const SETTINGS_ROUTES: Route['name'][] = [
23+
'settings-index',
24+
'settings-device',
25+
'settings-coins',
26+
'settings-debug',
27+
] as const;
28+
2129
const navItems: Array<NavigationItemProps & { CustomComponent?: FC<NavigationItemProps> }> = [
2230
{
2331
nameId: 'TR_DASHBOARD',
@@ -34,7 +42,7 @@ const navItems: Array<NavigationItemProps & { CustomComponent?: FC<NavigationIte
3442
nameId: 'TR_SETTINGS',
3543
icon: 'gearSix',
3644
goToRoute: 'settings-index',
37-
routes: ['settings-index', 'settings-device', 'settings-coins', 'settings-debug'],
45+
routes: SETTINGS_ROUTES,
3846
'data-testid': '@suite/menu/settings',
3947
},
4048
];

Diff for: packages/suite/src/components/suite/layouts/SuiteLayout/Sidebar/QuickActions/QuickActions.tsx

+16-17
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { DebugAndExperimental } from './DebugAndExperimental';
77
import { HideBalances } from './HideBalances';
88
import { Tor } from './Tor';
99
import { UpdateStatusActionBarIcon } from './Update/UpdateStatusActionBarIcon';
10-
import { useResponsiveContext } from '../../../../../../support/suite/ResponsiveContext';
1110

1211
const ActionsContainer = styled.div<{ $isSidebarCollapsed: boolean }>`
1312
display: flex;
@@ -25,21 +24,21 @@ const ActionsContainer = styled.div<{ $isSidebarCollapsed: boolean }>`
2524
`;
2625

2726
type QuickActionsProps = {
28-
showUpdateBannerNotification: boolean;
27+
isSidebarCollapsed: boolean;
28+
showUpdateBannerNotification?: boolean;
2929
};
3030

31-
export const QuickActions = ({ showUpdateBannerNotification }: QuickActionsProps) => {
32-
const { isSidebarCollapsed } = useResponsiveContext();
33-
34-
return (
35-
<ActionsContainer $isSidebarCollapsed={isSidebarCollapsed}>
36-
<UpdateStatusActionBarIcon
37-
showUpdateBannerNotification={showUpdateBannerNotification}
38-
/>
39-
<DebugAndExperimental />
40-
<CustomBackend />
41-
<Tor />
42-
<HideBalances />
43-
</ActionsContainer>
44-
);
45-
};
31+
export const QuickActions = ({
32+
isSidebarCollapsed,
33+
showUpdateBannerNotification,
34+
}: QuickActionsProps) => (
35+
<ActionsContainer $isSidebarCollapsed={isSidebarCollapsed}>
36+
<UpdateStatusActionBarIcon
37+
showUpdateBannerNotification={Boolean(showUpdateBannerNotification)}
38+
/>
39+
<DebugAndExperimental />
40+
<CustomBackend />
41+
<Tor />
42+
<HideBalances />
43+
</ActionsContainer>
44+
);

Diff for: packages/suite/src/components/suite/layouts/SuiteLayout/Sidebar/Sidebar.tsx

+4-1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ const Content = styled.div`
3737
flex-direction: column;
3838
`;
3939

40+
export const SIDEBAR_MIN_WIDTH = 84;
41+
4042
export const Sidebar = () => {
4143
const [closedNotificationDevice, setClosedNotificationDevice] = useState(false);
4244
const [closedNotificationSuite, setClosedNotificationSuite] = useState(false);
@@ -75,7 +77,7 @@ export const Sidebar = () => {
7577
<ResizableBox
7678
directions={['right']}
7779
width={sidebarWidth}
78-
minWidth={84}
80+
minWidth={SIDEBAR_MIN_WIDTH}
7981
maxWidth={600}
8082
zIndex={zIndices.draggableComponent}
8183
updateHeightOnWindowResize
@@ -100,6 +102,7 @@ export const Sidebar = () => {
100102
)}
101103

102104
<QuickActions
105+
isSidebarCollapsed={isSidebarCollapsed}
103106
showUpdateBannerNotification={showUpdateBannerNotification}
104107
/>
105108
</Content>

0 commit comments

Comments
 (0)