mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-10 04:30:25 +02:00
Swap tabler-icons for react-icons
This commit is contained in:
Generated
+15
-15
@@ -32,6 +32,7 @@
|
|||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-helmet-async": "^1.3.0",
|
"react-helmet-async": "^1.3.0",
|
||||||
"react-i18next": "^11.16.7",
|
"react-i18next": "^11.16.7",
|
||||||
|
"react-icons": "^4.4.0",
|
||||||
"react-lazy-load-image-component": "^1.5.4",
|
"react-lazy-load-image-component": "^1.5.4",
|
||||||
"react-player": "^2.10.0",
|
"react-player": "^2.10.0",
|
||||||
"react-query": "^4.0.0-beta.23",
|
"react-query": "^4.0.0-beta.23",
|
||||||
@@ -44,7 +45,6 @@
|
|||||||
"react-window": "^1.8.7",
|
"react-window": "^1.8.7",
|
||||||
"react-window-infinite-loader": "^1.0.8",
|
"react-window-infinite-loader": "^1.0.8",
|
||||||
"styled-components": "^5.3.5",
|
"styled-components": "^5.3.5",
|
||||||
"tabler-icons-react": "^1.46.0",
|
|
||||||
"zustand": "^4.0.0-rc.1"
|
"zustand": "^4.0.0-rc.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -17056,6 +17056,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/react-icons": {
|
||||||
|
"version": "4.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.4.0.tgz",
|
||||||
|
"integrity": "sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/react-is": {
|
"node_modules/react-is": {
|
||||||
"version": "17.0.2",
|
"version": "17.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
|
||||||
@@ -20970,14 +20978,6 @@
|
|||||||
"url": "https://github.com/chalk/slice-ansi?sponsor=1"
|
"url": "https://github.com/chalk/slice-ansi?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tabler-icons-react": {
|
|
||||||
"version": "1.46.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/tabler-icons-react/-/tabler-icons-react-1.46.0.tgz",
|
|
||||||
"integrity": "sha512-tQt686DPfGRXxdCMg63gEO7KP1mcmx0JvzgAq5HKkD3ts9HSL9AAaGAGpa/IJdD0tLaoviegdpv6MOp8DsAr9Q==",
|
|
||||||
"peerDependencies": {
|
|
||||||
"react": ">= 16.8.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/tapable": {
|
"node_modules/tapable": {
|
||||||
"version": "2.2.1",
|
"version": "2.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
||||||
@@ -36382,6 +36382,12 @@
|
|||||||
"html-parse-stringify": "^3.0.1"
|
"html-parse-stringify": "^3.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"react-icons": {
|
||||||
|
"version": "4.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.4.0.tgz",
|
||||||
|
"integrity": "sha512-fSbvHeVYo/B5/L4VhB7sBA1i2tS8MkT0Hb9t2H1AVPkwGfVHLJCqyr2Py9dKMxsyM63Eng1GkdZfbWj+Fmv8Rg==",
|
||||||
|
"requires": {}
|
||||||
|
},
|
||||||
"react-is": {
|
"react-is": {
|
||||||
"version": "17.0.2",
|
"version": "17.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
|
||||||
@@ -39457,12 +39463,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tabler-icons-react": {
|
|
||||||
"version": "1.46.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/tabler-icons-react/-/tabler-icons-react-1.46.0.tgz",
|
|
||||||
"integrity": "sha512-tQt686DPfGRXxdCMg63gEO7KP1mcmx0JvzgAq5HKkD3ts9HSL9AAaGAGpa/IJdD0tLaoviegdpv6MOp8DsAr9Q==",
|
|
||||||
"requires": {}
|
|
||||||
},
|
|
||||||
"tapable": {
|
"tapable": {
|
||||||
"version": "2.2.1",
|
"version": "2.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
|
||||||
|
|||||||
+1
-1
@@ -270,6 +270,7 @@
|
|||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-helmet-async": "^1.3.0",
|
"react-helmet-async": "^1.3.0",
|
||||||
"react-i18next": "^11.16.7",
|
"react-i18next": "^11.16.7",
|
||||||
|
"react-icons": "^4.4.0",
|
||||||
"react-lazy-load-image-component": "^1.5.4",
|
"react-lazy-load-image-component": "^1.5.4",
|
||||||
"react-player": "^2.10.0",
|
"react-player": "^2.10.0",
|
||||||
"react-query": "^4.0.0-beta.23",
|
"react-query": "^4.0.0-beta.23",
|
||||||
@@ -282,7 +283,6 @@
|
|||||||
"react-window": "^1.8.7",
|
"react-window": "^1.8.7",
|
||||||
"react-window-infinite-loader": "^1.0.8",
|
"react-window-infinite-loader": "^1.0.8",
|
||||||
"styled-components": "^5.3.5",
|
"styled-components": "^5.3.5",
|
||||||
"tabler-icons-react": "^1.46.0",
|
|
||||||
"zustand": "^4.0.0-rc.1"
|
"zustand": "^4.0.0-rc.1"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
|
|||||||
+11
-1
@@ -1,7 +1,8 @@
|
|||||||
import md5 from 'md5';
|
import md5 from 'md5';
|
||||||
import { nanoid } from 'nanoid';
|
import { nanoid } from 'nanoid';
|
||||||
import { useMutation } from 'react-query';
|
import { useMutation, useQuery } from 'react-query';
|
||||||
import { authApi } from 'renderer/api/authApi';
|
import { authApi } from 'renderer/api/authApi';
|
||||||
|
import { queryKeys } from 'renderer/api/queryKeys';
|
||||||
import { useAuthStore } from 'renderer/store';
|
import { useAuthStore } from 'renderer/store';
|
||||||
|
|
||||||
export const useLogin = (
|
export const useLogin = (
|
||||||
@@ -36,3 +37,12 @@ export const useLogin = (
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const usePingServer = (server: string) => {
|
||||||
|
return useQuery({
|
||||||
|
enabled: !!server,
|
||||||
|
queryFn: () => authApi.ping(server),
|
||||||
|
queryKey: queryKeys.ping(server),
|
||||||
|
retry: false,
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -10,11 +10,10 @@ import {
|
|||||||
} from '@mantine/core';
|
} from '@mantine/core';
|
||||||
import { useDebouncedValue } from '@mantine/hooks';
|
import { useDebouncedValue } from '@mantine/hooks';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { RiCheckboxCircleFill } from 'react-icons/ri';
|
||||||
import { useSearchParams } from 'react-router-dom';
|
import { useSearchParams } from 'react-router-dom';
|
||||||
import { AlertCircle, CircleCheck } from 'tabler-icons-react';
|
|
||||||
import { normalizeServerUrl } from 'renderer/utils';
|
import { normalizeServerUrl } from 'renderer/utils';
|
||||||
import { useLogin } from '../queries/useLogin';
|
import { useLogin, usePingServer } from '../queries/login';
|
||||||
import { usePingServer } from '../queries/usePingServer';
|
|
||||||
import styles from './LoginRoute.module.scss';
|
import styles from './LoginRoute.module.scss';
|
||||||
|
|
||||||
export const LoginRoute = () => {
|
export const LoginRoute = () => {
|
||||||
@@ -66,7 +65,7 @@ export const LoginRoute = () => {
|
|||||||
isCheckingServer ? (
|
isCheckingServer ? (
|
||||||
<Loader size="xs" />
|
<Loader size="xs" />
|
||||||
) : isValidServer ? (
|
) : isValidServer ? (
|
||||||
<CircleCheck />
|
<RiCheckboxCircleFill size={20} />
|
||||||
) : null
|
) : null
|
||||||
}
|
}
|
||||||
value={server}
|
value={server}
|
||||||
@@ -105,7 +104,7 @@ export const LoginRoute = () => {
|
|||||||
Login
|
Login
|
||||||
</Button>
|
</Button>
|
||||||
{isError && (
|
{isError && (
|
||||||
<Alert color="red" icon={<AlertCircle />} variant="outline">
|
<Alert color="red" variant="outline">
|
||||||
{t('Invalid username or password.')}
|
{t('Invalid username or password.')}
|
||||||
</Alert>
|
</Alert>
|
||||||
)}
|
)}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { Dispatch } from 'react';
|
import { Dispatch } from 'react';
|
||||||
import { ActionIcon, Menu, MenuProps } from '@mantine/core';
|
import { ActionIcon, Menu, MenuProps } from '@mantine/core';
|
||||||
import { LayoutGrid, LayoutList, Table } from 'tabler-icons-react';
|
import { RiLayoutGridFill, RiLayoutTopFill } from 'react-icons/ri';
|
||||||
|
|
||||||
export enum ViewType {
|
export enum ViewType {
|
||||||
Detail = 'detail',
|
Detail = 'detail',
|
||||||
@@ -23,30 +23,18 @@ export const ViewTypeButton = ({
|
|||||||
<Menu {...menuProps}>
|
<Menu {...menuProps}>
|
||||||
<Menu.Target>
|
<Menu.Target>
|
||||||
<ActionIcon variant="transparent">
|
<ActionIcon variant="transparent">
|
||||||
{type === ViewType.Grid ? (
|
{type === ViewType.Grid ? <RiLayoutGridFill /> : <RiLayoutTopFill />}
|
||||||
<LayoutGrid />
|
|
||||||
) : type === ViewType.Detail ? (
|
|
||||||
<LayoutList />
|
|
||||||
) : (
|
|
||||||
<Table />
|
|
||||||
)}
|
|
||||||
</ActionIcon>
|
</ActionIcon>
|
||||||
</Menu.Target>
|
</Menu.Target>
|
||||||
<Menu.Dropdown>
|
<Menu.Dropdown>
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
icon={<LayoutGrid size={14} />}
|
icon={<RiLayoutGridFill />}
|
||||||
onClick={() => handler(ViewType.Grid)}
|
onClick={() => handler(ViewType.Grid)}
|
||||||
>
|
>
|
||||||
Grid
|
Grid
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
icon={<LayoutList size={14} />}
|
icon={<RiLayoutTopFill />}
|
||||||
onClick={() => handler(ViewType.Detail)}
|
|
||||||
>
|
|
||||||
Detail
|
|
||||||
</Menu.Item>
|
|
||||||
<Menu.Item
|
|
||||||
icon={<Table size={14} />}
|
|
||||||
onClick={() => handler(ViewType.Table)}
|
onClick={() => handler(ViewType.Table)}
|
||||||
>
|
>
|
||||||
Table
|
Table
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ import { useState } from 'react';
|
|||||||
import { Button, Group, Menu } from '@mantine/core';
|
import { Button, Group, Menu } from '@mantine/core';
|
||||||
import { useSetState } from '@mantine/hooks';
|
import { useSetState } from '@mantine/hooks';
|
||||||
import AutoSizer from 'react-virtualized-auto-sizer';
|
import AutoSizer from 'react-virtualized-auto-sizer';
|
||||||
import { CaretDown } from 'tabler-icons-react';
|
|
||||||
import i18n from 'i18n/i18n';
|
import i18n from 'i18n/i18n';
|
||||||
import { albumsApi } from 'renderer/api/albumsApi';
|
import { albumsApi } from 'renderer/api/albumsApi';
|
||||||
import { VirtualInfiniteGrid } from 'renderer/components/virtual-grid/VirtualInfiniteGrid';
|
import { VirtualInfiniteGrid } from 'renderer/components/virtual-grid/VirtualInfiniteGrid';
|
||||||
@@ -66,37 +65,29 @@ export const LibraryAlbumsRoute = () => {
|
|||||||
</Menu.Target>
|
</Menu.Target>
|
||||||
<Menu.Dropdown>
|
<Menu.Dropdown>
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
rightSection={<CaretDown size={12} />}
|
|
||||||
onClick={() => setFilters({ sortBy: AlbumSort.TITLE })}
|
onClick={() => setFilters({ sortBy: AlbumSort.TITLE })}
|
||||||
>
|
>
|
||||||
Title
|
Title
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item
|
<Menu.Item onClick={() => setFilters({ sortBy: AlbumSort.YEAR })}>
|
||||||
rightSection={<CaretDown size={12} />}
|
|
||||||
onClick={() => setFilters({ sortBy: AlbumSort.YEAR })}
|
|
||||||
>
|
|
||||||
Year
|
Year
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
rightSection={<CaretDown size={12} />}
|
|
||||||
onClick={() => setFilters({ sortBy: AlbumSort.RATING })}
|
onClick={() => setFilters({ sortBy: AlbumSort.RATING })}
|
||||||
>
|
>
|
||||||
Rating
|
Rating
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
rightSection={<CaretDown size={12} />}
|
|
||||||
onClick={() => setFilters({ sortBy: AlbumSort.DATE_RELEASED })}
|
onClick={() => setFilters({ sortBy: AlbumSort.DATE_RELEASED })}
|
||||||
>
|
>
|
||||||
Date Released
|
Date Released
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
rightSection={<CaretDown size={12} />}
|
|
||||||
onClick={() => setFilters({ sortBy: AlbumSort.DATE_ADDED })}
|
onClick={() => setFilters({ sortBy: AlbumSort.DATE_ADDED })}
|
||||||
>
|
>
|
||||||
Date Added
|
Date Added
|
||||||
</Menu.Item>
|
</Menu.Item>
|
||||||
<Menu.Item
|
<Menu.Item
|
||||||
rightSection={<CaretDown size={12} />}
|
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
setFilters({ sortBy: AlbumSort.DATE_ADDED_REMOTE })
|
setFilters({ sortBy: AlbumSort.DATE_ADDED_REMOTE })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
import { useEffect, useMemo, useState } from 'react';
|
import { useEffect, useMemo, useState } from 'react';
|
||||||
import format from 'format-duration';
|
import format from 'format-duration';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import styled from 'styled-components';
|
|
||||||
import {
|
import {
|
||||||
PlayerPause,
|
RiPlayFill,
|
||||||
PlayerPlay,
|
RiSkipForwardFill,
|
||||||
PlayerSkipBack,
|
RiSkipBackFill,
|
||||||
PlayerSkipForward,
|
RiSpeedFill,
|
||||||
PlayerTrackNext,
|
RiRewindFill,
|
||||||
PlayerTrackPrev,
|
RiPauseFill,
|
||||||
} from 'tabler-icons-react';
|
} from 'react-icons/ri';
|
||||||
|
import styled from 'styled-components';
|
||||||
import { Text } from 'renderer/components';
|
import { Text } from 'renderer/components';
|
||||||
import { usePlayerStore } from 'renderer/store';
|
import { usePlayerStore } from 'renderer/store';
|
||||||
import { Font } from 'renderer/styles';
|
import { Font } from 'renderer/styles';
|
||||||
@@ -106,13 +106,13 @@ export const CenterControls = ({ playersRef }: CenterControlsProps) => {
|
|||||||
<ControlsContainer onScroll={(e) => console.log(e)}>
|
<ControlsContainer onScroll={(e) => console.log(e)}>
|
||||||
<ButtonsContainer>
|
<ButtonsContainer>
|
||||||
<PlayerButton
|
<PlayerButton
|
||||||
icon={<PlayerSkipBack size={15} />}
|
icon={<RiSkipBackFill size={15} />}
|
||||||
tooltip={{ label: `${t('player.prev')}` }}
|
tooltip={{ label: `${t('player.prev')}` }}
|
||||||
variant="secondary"
|
variant="secondary"
|
||||||
onClick={handlePrevTrack}
|
onClick={handlePrevTrack}
|
||||||
/>
|
/>
|
||||||
<PlayerButton
|
<PlayerButton
|
||||||
icon={<PlayerTrackPrev size={15} />}
|
icon={<RiRewindFill size={15} />}
|
||||||
tooltip={{ label: `${t('player.skipBack')}` }}
|
tooltip={{ label: `${t('player.skipBack')}` }}
|
||||||
variant="secondary"
|
variant="secondary"
|
||||||
onClick={handleSkipBackward}
|
onClick={handleSkipBackward}
|
||||||
@@ -120,9 +120,9 @@ export const CenterControls = ({ playersRef }: CenterControlsProps) => {
|
|||||||
<PlayerButton
|
<PlayerButton
|
||||||
icon={
|
icon={
|
||||||
status === PlayerStatus.Paused ? (
|
status === PlayerStatus.Paused ? (
|
||||||
<PlayerPlay size={20} />
|
<RiPlayFill size={20} />
|
||||||
) : (
|
) : (
|
||||||
<PlayerPause size={20} />
|
<RiPauseFill size={20} />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
tooltip={{
|
tooltip={{
|
||||||
@@ -135,13 +135,13 @@ export const CenterControls = ({ playersRef }: CenterControlsProps) => {
|
|||||||
onClick={handlePlayPause}
|
onClick={handlePlayPause}
|
||||||
/>
|
/>
|
||||||
<PlayerButton
|
<PlayerButton
|
||||||
icon={<PlayerTrackNext size={15} />}
|
icon={<RiSpeedFill size={15} />}
|
||||||
tooltip={{ label: `${t('player.skipForward')}` }}
|
tooltip={{ label: `${t('player.skipForward')}` }}
|
||||||
variant="secondary"
|
variant="secondary"
|
||||||
onClick={handleSkipForward}
|
onClick={handleSkipForward}
|
||||||
/>
|
/>
|
||||||
<PlayerButton
|
<PlayerButton
|
||||||
icon={<PlayerSkipForward size={15} />}
|
icon={<RiSkipForwardFill size={15} />}
|
||||||
tooltip={{ label: `${t('player.next')}` }}
|
tooltip={{ label: `${t('player.next')}` }}
|
||||||
variant="secondary"
|
variant="secondary"
|
||||||
onClick={handleNextTrack}
|
onClick={handleNextTrack}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
|
import { RiVolumeUpFill, RiVolumeMuteFill } from 'react-icons/ri';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import { Volume2, Volume3 } from 'tabler-icons-react';
|
|
||||||
import { IconButton } from 'renderer/components';
|
import { IconButton } from 'renderer/components';
|
||||||
import { usePlayerStore } from 'renderer/store';
|
import { usePlayerStore } from 'renderer/store';
|
||||||
import { useRightControls } from '../hooks/useRightControls';
|
import { useRightControls } from '../hooks/useRightControls';
|
||||||
@@ -42,9 +42,9 @@ export const RightControls = () => {
|
|||||||
<IconButton
|
<IconButton
|
||||||
icon={
|
icon={
|
||||||
muted ? (
|
muted ? (
|
||||||
<Volume3 size={20} strokeWidth={1.5} />
|
<RiVolumeMuteFill size={20} />
|
||||||
) : (
|
) : (
|
||||||
<Volume2 size={20} strokeWidth={1.5} />
|
<RiVolumeUpFill size={20} />
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
size={20}
|
size={20}
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import { Text } from '@mantine/core';
|
import { Text } from '@mantine/core';
|
||||||
import { useDisclosure } from '@mantine/hooks';
|
import { useDisclosure } from '@mantine/hooks';
|
||||||
import { EditCircle } from 'tabler-icons-react';
|
|
||||||
import { ServerResponse } from 'renderer/api/types';
|
import { ServerResponse } from 'renderer/api/types';
|
||||||
import { IconButton } from 'renderer/components';
|
import { IconButton } from 'renderer/components';
|
||||||
import { useServers } from '../queries/useServers';
|
import { useServers } from '../queries/useServers';
|
||||||
@@ -61,10 +60,7 @@ export const ServerList = () => {
|
|||||||
{server.name}
|
{server.name}
|
||||||
<Text>Hello</Text>
|
<Text>Hello</Text>
|
||||||
</div>
|
</div>
|
||||||
<IconButton
|
<IconButton onClick={() => editServerHandlers.toggle()}>
|
||||||
icon={<EditCircle />}
|
|
||||||
onClick={() => editServerHandlers.toggle()}
|
|
||||||
>
|
|
||||||
Edit
|
Edit
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,43 +1,35 @@
|
|||||||
|
import {
|
||||||
|
RiDashboardFill,
|
||||||
|
RiFileList2Fill,
|
||||||
|
RiSearch2Fill,
|
||||||
|
} from 'react-icons/ri';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import { Home, Notebook, Search } from 'tabler-icons-react';
|
|
||||||
import { UserMenu } from 'renderer/features/user-menu';
|
|
||||||
import { AppRoute } from 'renderer/router/utils/routes';
|
import { AppRoute } from 'renderer/router/utils/routes';
|
||||||
import { ListItem } from './ListItem';
|
import { ListItem } from './ListItem';
|
||||||
|
|
||||||
const SidebarContainer = styled.div`
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const ItemGroup = styled.ul``;
|
|
||||||
|
|
||||||
const Item = styled.li``;
|
|
||||||
|
|
||||||
const StyledSidebar = styled.div``;
|
const StyledSidebar = styled.div``;
|
||||||
|
|
||||||
export const Sidebar = () => {
|
export const Sidebar = () => {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<StyledSidebar>
|
<StyledSidebar>
|
||||||
<ListItem icon={<Home />}>
|
<ListItem>
|
||||||
<ListItem.Link to={AppRoute.HOME}>
|
<ListItem.Link to={AppRoute.HOME}>
|
||||||
<Home />
|
<RiDashboardFill size={20} />
|
||||||
Home
|
Home
|
||||||
</ListItem.Link>
|
</ListItem.Link>
|
||||||
</ListItem>
|
</ListItem>
|
||||||
<ListItem>
|
<ListItem>
|
||||||
<ListItem.Link to={AppRoute.SEARCH}>
|
<ListItem.Link to={AppRoute.SEARCH}>
|
||||||
<Search />
|
<RiSearch2Fill size={20} />
|
||||||
Search
|
Search
|
||||||
</ListItem.Link>
|
</ListItem.Link>
|
||||||
</ListItem>
|
</ListItem>
|
||||||
<ListItem>
|
<ListItem>
|
||||||
<ListItem.Link to={AppRoute.LIBRARY}>
|
<ListItem.Link to={AppRoute.LIBRARY}>
|
||||||
<Notebook />
|
<RiFileList2Fill size={20} />
|
||||||
Your Library
|
Your Library
|
||||||
</ListItem.Link>
|
</ListItem.Link>
|
||||||
</ListItem>
|
</ListItem>
|
||||||
<UserMenu />
|
|
||||||
</StyledSidebar>
|
</StyledSidebar>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
import { Group } from '@mantine/core';
|
import { Group } from '@mantine/core';
|
||||||
|
import { RiArrowLeftSLine, RiArrowRightSLine } from 'react-icons/ri';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import { ChevronLeft, ChevronRight } from 'tabler-icons-react';
|
|
||||||
import { IconButton } from 'renderer/components';
|
import { IconButton } from 'renderer/components';
|
||||||
import { WindowControls } from 'renderer/features/window-controls';
|
import { WindowControls } from 'renderer/features/window-controls';
|
||||||
|
|
||||||
@@ -47,12 +47,12 @@ export const Titlebar = ({ children }: TitlebarProps) => {
|
|||||||
<Left>
|
<Left>
|
||||||
<Group spacing="xs">
|
<Group spacing="xs">
|
||||||
<IconButton
|
<IconButton
|
||||||
icon={<ChevronLeft size={25} strokeWidth={1.5} />}
|
icon={<RiArrowLeftSLine size={25} />}
|
||||||
size={25}
|
size={25}
|
||||||
onClick={() => navigate(-1)}
|
onClick={() => navigate(-1)}
|
||||||
/>
|
/>
|
||||||
<IconButton
|
<IconButton
|
||||||
icon={<ChevronRight size={25} strokeWidth={1.5} />}
|
icon={<RiArrowRightSLine size={25} />}
|
||||||
size={25}
|
size={25}
|
||||||
onClick={() => navigate(1)}
|
onClick={() => navigate(1)}
|
||||||
/>
|
/>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import { Button, Menu } from '@mantine/core';
|
import { Button, Menu } from '@mantine/core';
|
||||||
import { useDisclosure } from '@mantine/hooks';
|
import { useDisclosure } from '@mantine/hooks';
|
||||||
|
import { RiLogoutBoxLine, RiServerFill, RiSettings3Fill } from 'react-icons/ri';
|
||||||
import { useNavigate } from 'react-router';
|
import { useNavigate } from 'react-router';
|
||||||
import { Logout, Server, Settings } from 'tabler-icons-react';
|
|
||||||
import { AddServerModal } from 'renderer/features/servers';
|
import { AddServerModal } from 'renderer/features/servers';
|
||||||
import { useAuthStore } from 'renderer/store';
|
import { useAuthStore } from 'renderer/store';
|
||||||
|
|
||||||
@@ -18,25 +18,24 @@ export const UserMenu = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Menu
|
<Menu position="bottom">
|
||||||
control={
|
<Menu.Target>
|
||||||
<Button radius="lg" size="xs" variant="default">
|
<Button radius="lg" size="xs" variant="default">
|
||||||
User
|
User
|
||||||
</Button>
|
</Button>
|
||||||
}
|
</Menu.Target>
|
||||||
position="bottom"
|
<Menu.Dropdown>
|
||||||
size="md"
|
<Menu.Item
|
||||||
>
|
icon={<RiServerFill />}
|
||||||
<Menu.Item
|
onClick={() => addServerHandlers.open()}
|
||||||
icon={<Server size={20} />}
|
>
|
||||||
onClick={() => addServerHandlers.open()}
|
Servers
|
||||||
>
|
</Menu.Item>
|
||||||
Servers
|
<Menu.Item icon={<RiSettings3Fill />}>Settings</Menu.Item>
|
||||||
</Menu.Item>
|
<Menu.Item icon={<RiLogoutBoxLine />} onClick={handleLogout}>
|
||||||
<Menu.Item icon={<Settings size={20} />}>Settings</Menu.Item>
|
Logout
|
||||||
<Menu.Item icon={<Logout size={20} />} onClick={handleLogout}>
|
</Menu.Item>
|
||||||
Logout
|
</Menu.Dropdown>
|
||||||
</Menu.Item>
|
|
||||||
</Menu>
|
</Menu>
|
||||||
<AddServerModal
|
<AddServerModal
|
||||||
opened={addServerModal}
|
opened={addServerModal}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
.root {
|
|
||||||
position: absolute;
|
|
||||||
top: 10px;
|
|
||||||
right: 150px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.icon {
|
|
||||||
margin-right: 1rem;
|
|
||||||
}
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
import { Button, Menu } from '@mantine/core';
|
|
||||||
import { useDisclosure } from '@mantine/hooks';
|
|
||||||
import { useNavigate } from 'react-router';
|
|
||||||
import { Logout, Server, Settings } from 'tabler-icons-react';
|
|
||||||
import { useAuthStore } from 'renderer/store';
|
|
||||||
import { AddServerModal } from '../servers/components/AddServerModal';
|
|
||||||
import styles from './UserMenu.module.scss';
|
|
||||||
|
|
||||||
export const UserMenu = () => {
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const [addServerModal, addServerHandlers] = useDisclosure(false);
|
|
||||||
const logout = useAuthStore((state) => state.logout);
|
|
||||||
|
|
||||||
const handleLogout = () => {
|
|
||||||
logout();
|
|
||||||
localStorage.removeItem('authentication');
|
|
||||||
navigate('/login');
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
<Menu
|
|
||||||
classNames={{ itemIcon: styles.icon, root: styles.root }}
|
|
||||||
control={
|
|
||||||
<Button radius="lg" size="xs" variant="default">
|
|
||||||
User
|
|
||||||
</Button>
|
|
||||||
}
|
|
||||||
position="bottom"
|
|
||||||
size="md"
|
|
||||||
>
|
|
||||||
<Menu.Item
|
|
||||||
icon={<Server size={20} />}
|
|
||||||
onClick={() => addServerHandlers.open()}
|
|
||||||
>
|
|
||||||
Servers
|
|
||||||
</Menu.Item>
|
|
||||||
<Menu.Item icon={<Settings size={20} />}>Settings</Menu.Item>
|
|
||||||
<Menu.Item icon={<Logout size={20} />} onClick={handleLogout}>
|
|
||||||
Logout
|
|
||||||
</Menu.Item>
|
|
||||||
</Menu>
|
|
||||||
<AddServerModal
|
|
||||||
opened={addServerModal}
|
|
||||||
onClose={() => addServerHandlers.close()}
|
|
||||||
/>
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user