Improve bulk migration render performance
This commit is contained in:
@@ -11,13 +11,14 @@ import type { ButtonProps } from '@mui/material/Button';
|
||||
import Button from '@mui/material/Button';
|
||||
import Collapse from '@mui/material/Collapse';
|
||||
import Stack from '@mui/material/Stack';
|
||||
import {} from 'react';
|
||||
import { memo } from 'react';
|
||||
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
|
||||
import ExpandLessIcon from '@mui/icons-material/ExpandLess';
|
||||
import { MigrationEntry } from '@/features/migration/components/migration-entry/MigrationEntry.tsx';
|
||||
import { MigrationManager } from '@/features/migration/MigrationManager.ts';
|
||||
|
||||
export const MigrationEntryGroup = ({
|
||||
export const MigrationEntryGroup = memo(
|
||||
({
|
||||
status,
|
||||
title,
|
||||
entries,
|
||||
@@ -65,4 +66,5 @@ export const MigrationEntryGroup = ({
|
||||
</Collapse>
|
||||
</Stack>
|
||||
);
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
@@ -21,8 +21,9 @@ import { Sources } from '@/features/source/services/Sources';
|
||||
import type { TMigratableSource } from '@/features/migration/Migration.types.ts';
|
||||
import { ReactRouter } from '@/lib/react-router/ReactRouter.ts';
|
||||
import { AppRoutes } from '@/base/AppRoute.constants.ts';
|
||||
import { memo } from 'react';
|
||||
|
||||
export const MigrationCard = (source: TMigratableSource) => {
|
||||
export const MigrationCard = memo((source: TMigratableSource) => {
|
||||
const { id, name, lang, iconUrl, mangaCount } = source;
|
||||
const { t } = useLingui();
|
||||
|
||||
@@ -66,4 +67,4 @@ export const MigrationCard = (source: TMigratableSource) => {
|
||||
</CardActionArea>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
});
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
||||
*/
|
||||
|
||||
import { useCallback, useMemo, useState } from 'react';
|
||||
import { memo, useCallback, useMemo, useState } from 'react';
|
||||
import Box from '@mui/material/Box';
|
||||
import Card from '@mui/material/Card';
|
||||
import Chip from '@mui/material/Chip';
|
||||
@@ -36,7 +36,8 @@ import { languageCodeToName } from '@/base/utils/Languages.ts';
|
||||
import { DEFAULT_FULL_FAB_HEIGHT } from '@/base/components/buttons/StyledFab.tsx';
|
||||
import Stack from '@mui/material/Stack';
|
||||
|
||||
const SourceCard = ({
|
||||
const SourceCard = memo(
|
||||
({
|
||||
source,
|
||||
onToggle,
|
||||
isCurrentSource,
|
||||
@@ -84,7 +85,8 @@ const SourceCard = ({
|
||||
</Card>
|
||||
</StyledGroupItemWrapper>
|
||||
);
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
export const MigrationSourceList = ({
|
||||
sources,
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import type { MigrationMatch, TMigrationEntry } from '@/features/migration/Migration.types.ts';
|
||||
import { MigrationManager } from '@/features/migration/MigrationManager.ts';
|
||||
import Paper from '@mui/material/Paper';
|
||||
import { useMemo } from 'react';
|
||||
import { memo, useMemo } from 'react';
|
||||
import { MediaQuery } from '@/base/utils/MediaQuery.tsx';
|
||||
import { applyStyles } from '@/base/utils/ApplyStyles.ts';
|
||||
import { MigrationSourceEntry } from '@/features/migration/components/migration-entry/MigrationSourceEntry.tsx';
|
||||
@@ -28,7 +28,8 @@ import Divider from '@mui/material/Divider';
|
||||
import { MigrationEntryStatusIndicator } from '@/features/migration/components/migration-entry/MigrationEntryStatusIndicator.tsx';
|
||||
import Box from '@mui/material/Box';
|
||||
|
||||
const MigrationEntryMobile = ({
|
||||
const MigrationEntryMobile = memo(
|
||||
({
|
||||
entry,
|
||||
entry: { mangaId, mangaTitle, status, error, isExcluded },
|
||||
destinationEntry,
|
||||
@@ -69,9 +70,12 @@ const MigrationEntryMobile = ({
|
||||
startIcon={<SearchIcon />}
|
||||
variant="text"
|
||||
onClick={() => {
|
||||
ReactRouter.navigate(AppRoutes.migrate.childRoutes.manualSearch.path(mangaId, mangaTitle), {
|
||||
ReactRouter.navigate(
|
||||
AppRoutes.migrate.childRoutes.manualSearch.path(mangaId, mangaTitle),
|
||||
{
|
||||
state: { mangaTitle: mangaTitle },
|
||||
});
|
||||
},
|
||||
);
|
||||
}}
|
||||
>{t`Manual search`}</Button>
|
||||
</Stack>
|
||||
@@ -82,7 +86,11 @@ const MigrationEntryMobile = ({
|
||||
}
|
||||
|
||||
return (
|
||||
<MigrationMatchedEntry key={searchMatch.id} sourceMangaId={mangaId} entry={searchMatch} />
|
||||
<MigrationMatchedEntry
|
||||
key={searchMatch.id}
|
||||
sourceMangaId={mangaId}
|
||||
entry={searchMatch}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</Stack>
|
||||
@@ -101,9 +109,11 @@ const MigrationEntryMobile = ({
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
export const MigrationEntryDesktop = ({
|
||||
export const MigrationEntryDesktop = memo(
|
||||
({
|
||||
entry,
|
||||
entry: { mangaId, mangaTitle, status, error },
|
||||
destinationEntry,
|
||||
@@ -183,9 +193,11 @@ export const MigrationEntryDesktop = ({
|
||||
</Collapse>
|
||||
</>
|
||||
);
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
export const MigrationEntry = ({ entry: propEntry, isMigrating }: { entry: TMigrationEntry; isMigrating: boolean }) => {
|
||||
export const MigrationEntry = memo(
|
||||
({ entry: propEntry, isMigrating }: { entry: TMigrationEntry; isMigrating: boolean }) => {
|
||||
const isTabletWidth = MediaQuery.useIsTabletWidth();
|
||||
|
||||
const entry = useMemo(() => MigrationManager.getUpToDateMigrationEntry(propEntry), [propEntry]);
|
||||
@@ -238,4 +250,5 @@ export const MigrationEntry = ({ entry: propEntry, isMigrating }: { entry: TMigr
|
||||
/>
|
||||
</Paper>
|
||||
);
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
@@ -24,14 +24,10 @@ import Button from '@mui/material/Button';
|
||||
import CardActionArea from '@mui/material/CardActionArea';
|
||||
import Link from '@mui/material/Link';
|
||||
import { Link as RouterLink } from 'react-router-dom';
|
||||
import { memo } from 'react';
|
||||
|
||||
export const MigrationMatchedEntry = ({
|
||||
sourceMangaId,
|
||||
entry,
|
||||
}: {
|
||||
sourceMangaId: MangaIdInfo['id'];
|
||||
entry: MigrationMatch;
|
||||
}) => {
|
||||
export const MigrationMatchedEntry = memo(
|
||||
({ sourceMangaId, entry }: { sourceMangaId: MangaIdInfo['id']; entry: MigrationMatch }) => {
|
||||
const { t } = useLingui();
|
||||
|
||||
return (
|
||||
@@ -81,7 +77,8 @@ export const MigrationMatchedEntry = ({
|
||||
<Button
|
||||
variant="outlined"
|
||||
{...MUIUtil.preventRippleProp({
|
||||
onClick: () => MigrationManager.selectMatch(sourceMangaId, entry.id, entry.sourceId),
|
||||
onClick: () =>
|
||||
MigrationManager.selectMatch(sourceMangaId, entry.id, entry.sourceId),
|
||||
})}
|
||||
>{t`Select`}</Button>
|
||||
))()}
|
||||
@@ -89,4 +86,5 @@ export const MigrationMatchedEntry = ({
|
||||
</CardActionArea>
|
||||
</MigrationEntryCard>
|
||||
);
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
@@ -20,8 +20,9 @@ import { useLingui } from '@lingui/react/macro';
|
||||
import Stack from '@mui/material/Stack';
|
||||
import Link from '@mui/material/Link';
|
||||
import { Link as RouterLink } from 'react-router-dom';
|
||||
import { memo } from 'react';
|
||||
|
||||
export const MigrationSourceEntry = (entry: TMigrationEntry) => {
|
||||
export const MigrationSourceEntry = memo((entry: TMigrationEntry) => {
|
||||
const {
|
||||
mangaId,
|
||||
mangaThumbnailUrl,
|
||||
@@ -94,4 +95,4 @@ export const MigrationSourceEntry = (entry: TMigrationEntry) => {
|
||||
</Stack>
|
||||
</Box>
|
||||
);
|
||||
};
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user