Add hook to get value based on themes "direction"

In case the component didn't rerender on a language change, the used value was never updated based on the new "direction"
This commit is contained in:
schroda
2024-09-30 02:27:10 +02:00
parent df420710ae
commit ff9f6b6207
11 changed files with 26 additions and 11 deletions

View File

@@ -17,7 +17,7 @@ import createCache from '@emotion/cache';
import { prefixer } from 'stylis'; import { prefixer } from 'stylis';
import rtlPlugin from 'stylis-plugin-rtl'; import rtlPlugin from 'stylis-plugin-rtl';
import { SnackbarProvider } from 'notistack'; import { SnackbarProvider } from 'notistack';
import { createAndSetTheme } from '@/theme'; import { createAndSetTheme } from '@/theme.tsx';
import { useLocalStorage } from '@/util/useStorage.tsx'; import { useLocalStorage } from '@/util/useStorage.tsx';
import { ThemeMode, ThemeModeContext } from '@/components/context/ThemeModeContext.tsx'; import { ThemeMode, ThemeModeContext } from '@/components/context/ThemeModeContext.tsx';
import { NavBarContextProvider } from '@/components/navbar/NavBarContextProvider'; import { NavBarContextProvider } from '@/components/navbar/NavBarContextProvider';

View File

@@ -35,7 +35,7 @@ import Box from '@mui/material/Box';
import { OverridableComponent } from '@mui/material/OverridableComponent'; import { OverridableComponent } from '@mui/material/OverridableComponent';
import { SvgIconTypeMap } from '@mui/material/SvgIcon'; import { SvgIconTypeMap } from '@mui/material/SvgIcon';
import { IconMenuItem } from '@/components/menu/IconMenuItem.tsx'; import { IconMenuItem } from '@/components/menu/IconMenuItem.tsx';
import { getOptionForDirection } from '@/theme.ts'; import { getOptionForDirection } from '@/theme.tsx';
import { MediaQuery } from '@/lib/ui/MediaQuery.tsx'; import { MediaQuery } from '@/lib/ui/MediaQuery.tsx';
export type NestedMenuItemProps = Omit<MuiMenuItemProps, 'button'> & { export type NestedMenuItemProps = Omit<MuiMenuItemProps, 'button'> & {

View File

@@ -29,7 +29,7 @@ import { useTheme } from '@mui/material/styles';
import { NavbarItem } from '@/typings'; import { NavbarItem } from '@/typings';
import { NavBarContext } from '@/components/context/NavbarContext'; import { NavBarContext } from '@/components/context/NavbarContext';
import { useBackButton } from '@/util/useBackButton.ts'; import { useBackButton } from '@/util/useBackButton.ts';
import { getOptionForDirection } from '@/theme.ts'; import { useGetOptionForDirection } from '@/theme.tsx';
import { MediaQuery } from '@/lib/ui/MediaQuery.tsx'; import { MediaQuery } from '@/lib/ui/MediaQuery.tsx';
import { DesktopSideBar } from '@/components/navbar/navigation/DesktopSideBar.tsx'; import { DesktopSideBar } from '@/components/navbar/navigation/DesktopSideBar.tsx';
import { useResizeObserver } from '@/util/useResizeObserver.tsx'; import { useResizeObserver } from '@/util/useResizeObserver.tsx';
@@ -78,6 +78,7 @@ export function DefaultNavBar() {
useContext(NavBarContext); useContext(NavBarContext);
const theme = useTheme(); const theme = useTheme();
const getOptionForDirection = useGetOptionForDirection();
const { pathname } = useLocation(); const { pathname } = useLocation();
const handleBack = useBackButton(); const handleBack = useBackButton();

View File

@@ -31,7 +31,7 @@ import { AllowedMetadataValueTypes, ChapterOffset, IReaderSettings } from '@/typ
import { ReaderSettingsOptions } from '@/components/reader/ReaderSettingsOptions'; import { ReaderSettingsOptions } from '@/components/reader/ReaderSettingsOptions';
import { useBackButton } from '@/util/useBackButton.ts'; import { useBackButton } from '@/util/useBackButton.ts';
import { Select } from '@/components/atoms/Select.tsx'; import { Select } from '@/components/atoms/Select.tsx';
import { getOptionForDirection } from '@/theme.ts'; import { useGetOptionForDirection } from '@/theme.tsx';
import { ChapterType } from '@/lib/graphql/generated/graphql.ts'; import { ChapterType } from '@/lib/graphql/generated/graphql.ts';
import { MangaChapterCountInfo, MangaIdInfo } from '@/lib/data/Mangas.ts'; import { MangaChapterCountInfo, MangaIdInfo } from '@/lib/data/Mangas.ts';
import { useNavBarContext } from '@/components/context/NavbarContext.tsx'; import { useNavBarContext } from '@/components/context/NavbarContext.tsx';
@@ -107,6 +107,7 @@ export function ReaderNavBar(props: IProps) {
const { t } = useTranslation(); const { t } = useTranslation();
const { setReaderNavBarWidth } = useNavBarContext(); const { setReaderNavBarWidth } = useNavBarContext();
const theme = useTheme(); const theme = useTheme();
const getOptionForDirection = useGetOptionForDirection();
const navigate = useNavigate(); const navigate = useNavigate();
const location = useLocation<{ const location = useLocation<{

View File

@@ -23,7 +23,7 @@ import ListItem from '@mui/material/ListItem';
import Tooltip from '@mui/material/Tooltip'; import Tooltip from '@mui/material/Tooltip';
import { NavbarItem } from '@/typings.ts'; import { NavbarItem } from '@/typings.ts';
import { ListItemLink } from '@/components/util/ListItemLink.tsx'; import { ListItemLink } from '@/components/util/ListItemLink.tsx';
import { getOptionForDirection } from '@/theme.ts'; import { useGetOptionForDirection } from '@/theme.tsx';
import { useNavBarContext } from '@/components/context/NavbarContext.tsx'; import { useNavBarContext } from '@/components/context/NavbarContext.tsx';
import { useResizeObserver } from '@/util/useResizeObserver.tsx'; import { useResizeObserver } from '@/util/useResizeObserver.tsx';
@@ -96,6 +96,7 @@ const MAX_WIDTH_EXTENDED = 400;
export const DesktopSideBar = ({ navBarItems }: { navBarItems: NavbarItem[] }) => { export const DesktopSideBar = ({ navBarItems }: { navBarItems: NavbarItem[] }) => {
const { isCollapsed, setIsCollapsed, navBarWidth, setNavBarWidth } = useNavBarContext(); const { isCollapsed, setIsCollapsed, navBarWidth, setNavBarWidth } = useNavBarContext();
const getOptionForDirection = useGetOptionForDirection();
const ref = useRef<HTMLDivElement | null>(null); const ref = useRef<HTMLDivElement | null>(null);
useResizeObserver( useResizeObserver(

View File

@@ -11,7 +11,7 @@ import Box from '@mui/material/Box';
import { IReaderSettings } from '@/typings'; import { IReaderSettings } from '@/typings';
import { SpinnerImage } from '@/components/util/SpinnerImage'; import { SpinnerImage } from '@/components/util/SpinnerImage';
import { imageStyle } from '@/components/reader/Page'; import { imageStyle } from '@/components/reader/Page';
import { getOptionForDirection } from '@/theme.ts'; import { getOptionForDirection } from '@/theme.tsx';
interface IProps { interface IProps {
index: number; index: number;

View File

@@ -29,7 +29,7 @@ import { SearchTextField } from '@/components/atoms/SearchTextField.tsx';
import { makeToast } from '@/components/util/Toast.tsx'; import { makeToast } from '@/components/util/Toast.tsx';
import { TrackerMangaCard } from '@/components/tracker/TrackerMangaCard.tsx'; import { TrackerMangaCard } from '@/components/tracker/TrackerMangaCard.tsx';
import { DIALOG_PADDING } from '@/components/tracker/constants.ts'; import { DIALOG_PADDING } from '@/components/tracker/constants.ts';
import { getOptionForDirection } from '@/theme.ts'; import { useGetOptionForDirection } from '@/theme.tsx';
import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts'; import { defaultPromiseErrorHandler } from '@/util/defaultPromiseErrorHandler.ts';
import { MangaType } from '@/lib/graphql/generated/graphql.ts'; import { MangaType } from '@/lib/graphql/generated/graphql.ts';
import { MangaIdInfo } from '@/lib/data/Mangas.ts'; import { MangaIdInfo } from '@/lib/data/Mangas.ts';
@@ -46,6 +46,7 @@ export const TrackerSearch = ({
trackedId?: string; trackedId?: string;
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const getOptionForDirection = useGetOptionForDirection();
const [searchString, setSearchString] = useState<string>(manga.title); const [searchString, setSearchString] = useState<string>(manga.title);
const [tmpSearchString, setTmpSearchString] = useState(searchString); const [tmpSearchString, setTmpSearchString] = useState(searchString);

View File

@@ -10,7 +10,7 @@ import { createRoot } from 'react-dom/client';
import { ThemeProvider } from '@mui/material/styles'; import { ThemeProvider } from '@mui/material/styles';
import { ConfirmDialog } from '@/components/molecules/ConfirmDialog.tsx'; import { ConfirmDialog } from '@/components/molecules/ConfirmDialog.tsx';
import { ControlledPromise } from '@/lib/ControlledPromise.ts'; import { ControlledPromise } from '@/lib/ControlledPromise.ts';
import { getCurrentTheme } from '@/theme.ts'; import { getCurrentTheme } from '@/theme.tsx';
export const awaitConfirmation = async ( export const awaitConfirmation = async (
dialogProps: Omit<React.ComponentProps<typeof ConfirmDialog>, 'onCancel' | 'onConfirm'>, dialogProps: Omit<React.ComponentProps<typeof ConfirmDialog>, 'onCancel' | 'onConfirm'>,

View File

@@ -9,7 +9,7 @@
import useMediaQuery from '@mui/material/useMediaQuery'; import useMediaQuery from '@mui/material/useMediaQuery';
import { Breakpoint } from '@mui/material/styles'; import { Breakpoint } from '@mui/material/styles';
import { useCallback, useState } from 'react'; import { useCallback, useState } from 'react';
import { getCurrentTheme } from '@/theme.ts'; import { getCurrentTheme } from '@/theme.tsx';
import { ThemeMode } from '@/components/context/ThemeModeContext.tsx'; import { ThemeMode } from '@/components/context/ThemeModeContext.tsx';
import { AppStorage } from '@/util/AppStorage.ts'; import { AppStorage } from '@/util/AppStorage.ts';
import { useResizeObserver } from '@/util/useResizeObserver.tsx'; import { useResizeObserver } from '@/util/useResizeObserver.tsx';

View File

@@ -21,7 +21,7 @@ import EditIcon from '@mui/icons-material/Edit';
import { bindDialog, usePopupState } from 'material-ui-popup-state/hooks'; import { bindDialog, usePopupState } from 'material-ui-popup-state/hooks';
import { ThemeModeContext } from '@/components/context/ThemeModeContext.tsx'; import { ThemeModeContext } from '@/components/context/ThemeModeContext.tsx';
import { AppTheme, hasMissingFonts, loadThemeFonts } from '@/lib/ui/AppThemes.ts'; import { AppTheme, hasMissingFonts, loadThemeFonts } from '@/lib/ui/AppThemes.ts';
import { createTheme } from '@/theme.ts'; import { createTheme } from '@/theme.tsx';
import { ThemeCreationDialog } from '@/screens/settings/appearance/theme/CreateThemeDialog.tsx'; import { ThemeCreationDialog } from '@/screens/settings/appearance/theme/CreateThemeDialog.tsx';
import { makeToast } from '@/components/util/Toast'; import { makeToast } from '@/components/util/Toast';
import { TypographyMaxLines } from '@/components/atoms/TypographyMaxLines.tsx'; import { TypographyMaxLines } from '@/components/atoms/TypographyMaxLines.tsx';

View File

@@ -14,7 +14,9 @@ import {
Palette, Palette,
responsiveFontSizes, responsiveFontSizes,
Theme, Theme,
useTheme,
} from '@mui/material/styles'; } from '@mui/material/styles';
import { useCallback } from 'react';
import { ThemeMode } from '@/components/context/ThemeModeContext.tsx'; import { ThemeMode } from '@/components/context/ThemeModeContext.tsx';
import { MediaQuery } from '@/lib/ui/MediaQuery.tsx'; import { MediaQuery } from '@/lib/ui/MediaQuery.tsx';
import { AppTheme, loadThemeFonts } from '@/lib/ui/AppThemes.ts'; import { AppTheme, loadThemeFonts } from '@/lib/ui/AppThemes.ts';
@@ -146,5 +148,14 @@ export const createAndSetTheme = (...args: Parameters<typeof createTheme>) => {
return theme; return theme;
}; };
export const getOptionForDirection = <T>(ltrOption: T, rtlOption: T): T => export const getOptionForDirection = <T,>(ltrOption: T, rtlOption: T): T =>
(theme?.direction ?? 'ltr') === 'ltr' ? ltrOption : rtlOption; (theme?.direction ?? 'ltr') === 'ltr' ? ltrOption : rtlOption;
export const useGetOptionForDirection = (): typeof getOptionForDirection => {
const muiTheme = useTheme();
return useCallback(
<T,>(...args: Parameters<typeof getOptionForDirection<T>>) => getOptionForDirection(...args),
[muiTheme.direction],
);
};