aboutsummaryrefslogtreecommitdiffstats
path: root/packages/renderer/src/components/sidebar
diff options
context:
space:
mode:
Diffstat (limited to 'packages/renderer/src/components/sidebar')
-rw-r--r--packages/renderer/src/components/sidebar/ServiceSwitcher.tsx13
-rw-r--r--packages/renderer/src/components/sidebar/Sidebar.tsx90
-rw-r--r--packages/renderer/src/components/sidebar/ToggleDarkModeButton.tsx16
-rw-r--r--packages/renderer/src/components/sidebar/ToggleLocationBarButton.tsx13
4 files changed, 72 insertions, 60 deletions
diff --git a/packages/renderer/src/components/sidebar/ServiceSwitcher.tsx b/packages/renderer/src/components/sidebar/ServiceSwitcher.tsx
index 24cfd0c..7aa9124 100644
--- a/packages/renderer/src/components/sidebar/ServiceSwitcher.tsx
+++ b/packages/renderer/src/components/sidebar/ServiceSwitcher.tsx
@@ -26,9 +26,9 @@ import { observer } from 'mobx-react-lite';
26import React from 'react'; 26import React from 'react';
27import { useTranslation } from 'react-i18next'; 27import { useTranslation } from 'react-i18next';
28 28
29import type RendererStore from '../../stores/RendererStore';
29import type Service from '../../stores/Service'; 30import type Service from '../../stores/Service';
30import { getServicePanelID } from '../ServicePanel'; 31import { getServicePanelID } from '../ServicePanel';
31import { useStore } from '../StoreProvider';
32 32
33import ServiceIcon from './ServiceIcon'; 33import ServiceIcon from './ServiceIcon';
34 34
@@ -88,14 +88,13 @@ function getServiceTitle(service: Service, t: TFunction) {
88 return t('service.title.nameWithMessages', { name, messages: messagesText }); 88 return t('service.title.nameWithMessages', { name, messages: messagesText });
89} 89}
90 90
91function ServiceSwitcher(): JSX.Element { 91function ServiceSwitcher({
92 // This needs to be here even if we don't use any translations in this component, 92 store: { settings, services },
93 // because the component must stay suspended until the translations are loaded. 93}: {
94 // See: https://github.com/mui/material-ui/issues/14077 94 store: RendererStore;
95 // TODO Try and remove this once mui and mobx-react-lite have updated to react 18. 95}): JSX.Element {
96 const { t } = useTranslation(); 96 const { t } = useTranslation();
97 97
98 const { settings, services } = useStore();
99 const { selectedService } = settings; 98 const { selectedService } = settings;
100 99
101 return ( 100 return (
diff --git a/packages/renderer/src/components/sidebar/Sidebar.tsx b/packages/renderer/src/components/sidebar/Sidebar.tsx
index fc57302..6c802ac 100644
--- a/packages/renderer/src/components/sidebar/Sidebar.tsx
+++ b/packages/renderer/src/components/sidebar/Sidebar.tsx
@@ -19,54 +19,60 @@
19 */ 19 */
20 20
21import Box from '@mui/material/Box'; 21import Box from '@mui/material/Box';
22import { styled } from '@mui/material/styles';
22import React from 'react'; 23import React from 'react';
23 24
25import RendererStore from '../../stores/RendererStore';
26
24import ServiceSwitcher from './ServiceSwitcher'; 27import ServiceSwitcher from './ServiceSwitcher';
25import ToggleDarkModeButton from './ToggleDarkModeButton'; 28import ToggleDarkModeButton from './ToggleDarkModeButton';
26import ToggleLocationBarButton from './ToggleLocationBarButton'; 29import ToggleLocationBarButton from './ToggleLocationBarButton';
27 30
28export default function Sidebar(): JSX.Element { 31const SidebarRoot = styled(Box)(({ theme }) => ({
32 flex: 0,
33 display: 'flex',
34 position: 'relative',
35 overflow: 'hidden',
36 flexDirection: 'column',
37 alignItems: 'center',
38 padding: `${theme.spacing(1)} 0`,
39 gap: theme.spacing(1),
40 backgroundColor:
41 theme.palette.mode === 'dark'
42 ? 'rgba(255, 255, 255, 0.09)'
43 : 'rgba(0, 0, 0, 0.06)',
44 minWidth: `calc(${theme.spacing(4)} + 36px)`,
45 '::after': {
46 content: '" "',
47 position: 'absolute',
48 top: '-20px',
49 bottom: '-20px',
50 right: '-20px',
51 zIndex: 100,
52 width: '20px',
53 boxShadow: theme.shadows[4],
54 },
55}));
56
57const SidebarFill = styled(Box)({
58 flex: 1,
59 display: 'flex',
60 flexDirection: 'column',
61 justifyContent: 'flex-start',
62});
63
64export default function Sidebar({
65 store,
66}: {
67 store: RendererStore;
68}): JSX.Element {
29 return ( 69 return (
30 <Box 70 <SidebarRoot component="aside">
31 component="aside" 71 <ToggleLocationBarButton store={store} />
32 sx={(theme) => ({ 72 <SidebarFill>
33 flex: 0, 73 <ServiceSwitcher store={store} />
34 display: 'flex', 74 </SidebarFill>
35 position: 'relative', 75 <ToggleDarkModeButton store={store} />
36 overflow: 'hidden', 76 </SidebarRoot>
37 flexDirection: 'column',
38 alignItems: 'center',
39 paddingY: 1,
40 gap: 1,
41 backgroundColor:
42 theme.palette.mode === 'dark'
43 ? 'rgba(255, 255, 255, 0.09)'
44 : 'rgba(0, 0, 0, 0.06)',
45 minWidth: `calc(${theme.spacing(4)} + 36px)`,
46 '::after': {
47 content: '" "',
48 position: 'absolute',
49 top: '-20px',
50 bottom: '-20px',
51 right: '-20px',
52 zIndex: 100,
53 width: '20px',
54 boxShadow: theme.shadows[4],
55 },
56 })}
57 >
58 <ToggleLocationBarButton />
59 <Box
60 sx={{
61 flex: 1,
62 display: 'flex',
63 flexDirection: 'column',
64 justifyContent: 'flex-start',
65 }}
66 >
67 <ServiceSwitcher />
68 </Box>
69 <ToggleDarkModeButton />
70 </Box>
71 ); 77 );
72} 78}
diff --git a/packages/renderer/src/components/sidebar/ToggleDarkModeButton.tsx b/packages/renderer/src/components/sidebar/ToggleDarkModeButton.tsx
index 51c3b18..a922389 100644
--- a/packages/renderer/src/components/sidebar/ToggleDarkModeButton.tsx
+++ b/packages/renderer/src/components/sidebar/ToggleDarkModeButton.tsx
@@ -25,19 +25,23 @@ import { observer } from 'mobx-react-lite';
25import React from 'react'; 25import React from 'react';
26import { useTranslation } from 'react-i18next'; 26import { useTranslation } from 'react-i18next';
27 27
28import { useStore } from '../StoreProvider'; 28import type RendererStore from '../../stores/RendererStore';
29 29
30export default observer(() => { 30function ToggleDarkModeButton({
31 store: { shared },
32}: {
33 store: RendererStore;
34}): JSX.Element {
31 const { t } = useTranslation(); 35 const { t } = useTranslation();
32 const { shared } = useStore();
33 const { shouldUseDarkColors } = shared;
34 36
35 return ( 37 return (
36 <IconButton 38 <IconButton
37 aria-label={t('toolbar.toggleDarkMode')} 39 aria-label={t('toolbar.toggleDarkMode')}
38 onClick={() => shared.toggleDarkMode()} 40 onClick={() => shared.toggleDarkMode()}
39 > 41 >
40 {shouldUseDarkColors ? <LightModeIcon /> : <DarkModeIcon />} 42 {shared.shouldUseDarkColors ? <LightModeIcon /> : <DarkModeIcon />}
41 </IconButton> 43 </IconButton>
42 ); 44 );
43}); 45}
46
47export default observer(ToggleDarkModeButton);
diff --git a/packages/renderer/src/components/sidebar/ToggleLocationBarButton.tsx b/packages/renderer/src/components/sidebar/ToggleLocationBarButton.tsx
index c697170..b6644a3 100644
--- a/packages/renderer/src/components/sidebar/ToggleLocationBarButton.tsx
+++ b/packages/renderer/src/components/sidebar/ToggleLocationBarButton.tsx
@@ -27,7 +27,7 @@ import { observer } from 'mobx-react-lite';
27import React from 'react'; 27import React from 'react';
28import { useTranslation } from 'react-i18next'; 28import { useTranslation } from 'react-i18next';
29 29
30import { useStore } from '../StoreProvider'; 30import type RendererStore from '../../stores/RendererStore';
31import { getLocaltionBarID } from '../locationBar/LocationBar'; 31import { getLocaltionBarID } from '../locationBar/LocationBar';
32 32
33function ToggleLocationBarIcon({ 33function ToggleLocationBarIcon({
@@ -45,12 +45,15 @@ function ToggleLocationBarIcon({
45 return left ? <IconChevronLeft /> : <IconChevronRight />; 45 return left ? <IconChevronLeft /> : <IconChevronRight />;
46} 46}
47 47
48function ToggleLocationBarButton(): JSX.Element { 48function ToggleLocationBarButton({
49 const { t } = useTranslation(); 49 store: {
50 const {
51 shared: { locationBarVisible, canToggleLocationBar }, 50 shared: { locationBarVisible, canToggleLocationBar },
52 settings, 51 settings,
53 } = useStore(); 52 },
53}: {
54 store: RendererStore;
55}): JSX.Element {
56 const { t } = useTranslation();
54 const { selectedService } = settings; 57 const { selectedService } = settings;
55 58
56 return ( 59 return (