Swap tabler-icons for react-icons

This commit is contained in:
jeffvli
2022-07-30 16:57:16 -07:00
parent 1eed976747
commit 95ff874702
14 changed files with 82 additions and 165 deletions
+15 -15
View File
@@ -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
View File
@@ -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": {
@@ -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 <Menu.Item
icon={<Server size={20} />} icon={<RiServerFill />}
onClick={() => addServerHandlers.open()} onClick={() => addServerHandlers.open()}
> >
Servers Servers
</Menu.Item> </Menu.Item>
<Menu.Item icon={<Settings size={20} />}>Settings</Menu.Item> <Menu.Item icon={<RiSettings3Fill />}>Settings</Menu.Item>
<Menu.Item icon={<Logout size={20} />} onClick={handleLogout}> <Menu.Item icon={<RiLogoutBoxLine />} onClick={handleLogout}>
Logout Logout
</Menu.Item> </Menu.Item>
</Menu.Dropdown>
</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()}
/>
</>
);
};