Feat: Vite + React (#991)

* remove test_web

* integrate reactjs-vite

* update lint-staged

* simple cors proxy server which handles cookies and redirections

* overrider global fetch with proxy call

* simple examples for set cookies and fetch request

* app bar

* add redux

* loadPlugins.
error: cant load urlencode module

* add ts-node for transforming

* plugin search & select

* plugin slice

* accordion components

* path item & popular novel

* optional for filters

* search novel

* parse novel

* parseChapter

* update cookies

* default filters

* fix: import path

* bundler module resolution

* new json_plugins

* fix: generate multisrc (missing filters)

* fix: host scripts

* fix: plugin code path

* remove typechecking action
This commit is contained in:
nyagami
2024-06-16 18:13:41 +07:00
committed by GitHub
parent a4cb781f32
commit d36e8ec85f
333 changed files with 5857 additions and 28579 deletions
@@ -0,0 +1,112 @@
import React, { ReactNode } from 'react';
import { Plugin } from '@typings/plugin';
import {
Box,
Button,
Card,
CardContent,
CardMedia,
Chip,
ListItem,
Stack,
Tooltip,
Typography,
} from '@mui/material';
import CopiableItem from '@components/CopiableItem';
import PathItem from '@components/PathItem';
import Textarea from '@components/Textarea';
const FlexRow = ({ children }: { children: ReactNode }) => (
<Stack direction="row" gap={1} sx={{ alignItems: 'center' }}>
{children}
</Stack>
);
export default function SourceNovelCard({
sourceNovel,
}: {
sourceNovel: Plugin.SourceNovel;
}) {
return (
<Card sx={{ display: 'flex', p: 1, width: '100%', textAlign: 'left' }}>
<CopiableItem content={sourceNovel.cover}>
<Tooltip title={sourceNovel.cover}>
<CardMedia
component="img"
sx={{ width: 200, height: '100%' }}
image={sourceNovel.cover}
/>
</Tooltip>
</CopiableItem>
<Box sx={{ display: 'flex', flexDirection: 'column', flex: 1 }}>
<CardContent>
<Tooltip title={sourceNovel.name}>
<Box>
<CopiableItem content={sourceNovel.name}>
<Button variant="outlined">
<Typography
sx={{
overflow: 'hidden',
textOverflow: 'ellipsis',
display: '-webkit-box',
WebkitLineClamp: '5',
WebkitBoxOrient: 'vertical',
fontSize: 14,
}}
>
{sourceNovel.name}
</Typography>
</Button>
</CopiableItem>
</Box>
</Tooltip>
</CardContent>
<CardContent>
<FlexRow>
<Typography sx={{ width: 50 }}>Status:</Typography>
<Chip variant="outlined" label={sourceNovel.status} color="info" />
</FlexRow>
<FlexRow>
<Typography sx={{ width: 50 }}>Author:</Typography>
<Chip variant="outlined" label={sourceNovel.author} color="info" />
</FlexRow>
<FlexRow>
<Typography sx={{ width: 50 }}>Artist: </Typography>
<Chip variant="outlined" label={sourceNovel.artist} color="info" />
</FlexRow>
</CardContent>
<CardContent sx={{ width: '50%' }}>
<PathItem path={sourceNovel.path} />
</CardContent>
</Box>
<Box sx={{ display: 'flex', flexDirection: 'column' }}>
<CardContent>
<Typography>Genres</Typography>
<Box
sx={{
width: 600,
overflowX: 'auto',
}}
>
<Stack sx={{ width: 'max-content' }} direction={'row'}>
{sourceNovel.genres?.split(/,\s*/).map((genre, index) => (
<ListItem key={'genre_' + index}>
<Chip label={genre} />
</ListItem>
))}
</Stack>
</Box>
</CardContent>
<CardContent>
<Typography>Summary</Typography>
<Textarea
sx={{ width: '100%' }}
maxRows={5}
defaultValue={sourceNovel.summary}
disabled
/>
</CardContent>
</Box>
</Card>
);
}