Untitled
unknown
plain_text
5 months ago
4.5 kB
7
Indexable
import * as React from 'react'; import { BrandsApi } from '@/apis/brandService'; import { Divider, InputAdornment, OutlinedInput } from '@mui/material'; import Box from '@mui/material/Box'; import Card from '@mui/material/Card'; import Link from '@mui/material/Link'; import Stack from '@mui/material/Stack'; import Typography from '@mui/material/Typography'; import Grid from '@mui/material/Unstable_Grid2'; import { MagnifyingGlass as MagnifyingGlassIcon } from '@phosphor-icons/react/dist/ssr/MagnifyingGlass'; import { Helmet } from 'react-helmet-async'; import { toast } from 'sonner'; import { BrandsListResponse, BrandType } from '@/types/brand'; import type { Metadata } from '@/types/metadata'; import { config } from '@/config'; import { BrandsPagination } from '@/components/dashboard/watch/brands-pagination'; const metadata = { title: `List | Brands | Dashboard | ${config.site.name}` } satisfies Metadata; export function Page(): React.JSX.Element { const [keyword, setKeyword] = React.useState<string>(''); const [debouncedKeyword, setDebouncedKeyword] = React.useState<string>(keyword); const [brands, setBrands] = React.useState<BrandsListResponse | null>(null); const token = localStorage.getItem('token'); React.useEffect(() => { const timeout = setTimeout(() => { setDebouncedKeyword(keyword); }, 500); return () => { clearTimeout(timeout); }; }, [keyword]); React.useEffect(() => { if (token) { BrandsApi(token, debouncedKeyword, handleBrandSearchSuccess, handleBrandSearchError); } }, [token, debouncedKeyword]); const handleBrandSearchSuccess = (response: BrandsListResponse) => { setBrands(response); }; const handleBrandSearchError = (msg: string) => { toast(msg); }; const handleChangePage = (page: number, perPage: number) => { if (token) { BrandsApi(token, keyword, handleBrandSearchSuccess, handleBrandSearchError, page, perPage); } }; const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => { setKeyword(event.target.value); }; return ( <React.Fragment> <Helmet> <title>{metadata.title}</title> </Helmet> <Box sx={{ maxWidth: 'var(--Content-maxWidth)', m: 'var(--Content-margin)', p: '16px', width: 'var(--Content-width)', }} > <Stack spacing={4}> <Stack direction={{ xs: 'column', sm: 'row' }} spacing={3} sx={{ alignItems: 'flex-start' }}> <Box sx={{ flex: '1 1 auto' }}> <Typography variant="h4">Brands</Typography> </Box> <Box sx={{ display: 'flex', justifyContent: 'flex-end' }}></Box> </Stack> <Card> <Stack direction="row" spacing={2} sx={{ alignItems: 'center', flexWrap: 'wrap', p: 3 }}> <OutlinedInput placeholder="Search Brands" onChange={handleInputChange} startAdornment={ <InputAdornment position="start"> <MagnifyingGlassIcon fontSize="var(--icon-fontSize-md)" /> </InputAdornment> } sx={{ flex: '1 1 auto' }} /> </Stack> </Card> </Stack> </Box> <Stack spacing={1}> <Box sx={{ maxWidth: 'var(--Content-maxWidth)', m: 'var(--Content-margin)', p: '16px', width: 'var(--Content-width)', }} > <Grid container sx={{ gap: '24px', justifyContent: 'space-between' }}> {brands.map((brand) => ( <Grid key={brand.id} xs={12} sm={8} md={2.2} lg={2.2} xl={2.2} sx={{ height: 'auto', aspectRatio: 1, borderRadius: '8px', backgroundColor: '#F9F9F9', }} > <Link href="#"> <img width="100%" alt={brand.name} src={brand.logo} /> </Link> </Grid> ))} </Grid> <Divider /> <BrandsPagination count={brands?.total ?? 0} page={brands?.current_page ?? 1} lastPage={brands?.last_page ?? 1} changePage={handleChangePage} /> </Box> </Stack> </React.Fragment> ); }
Editor is loading...
Leave a Comment