|
1 |
| -import { TabList as ActualTabList, TabContext, TabPanel } from '@mui/lab'; |
2 |
| -import { |
3 |
| - type Tabs as __Tabs, |
4 |
| - Divider, |
5 |
| - Grid, |
6 |
| - Skeleton, |
7 |
| - Tab, |
8 |
| - Typography, |
9 |
| -} from '@mui/material'; |
10 |
| -import { useRef } from 'react'; |
| 1 | +import { Paper, Stack, Typography } from '@mui/material'; |
11 | 2 | import { Helmet } from 'react-helmet-async';
|
12 |
| -import { makeStyles } from 'tss-react/mui'; |
13 |
| -import { useNumberFormatter } from '../../../components/Formatters'; |
14 |
| -import { ContentContainer } from '../../../components/Layout'; |
15 |
| -import { List, useListQuery } from '../../../components/List'; |
16 |
| -import { PartnerListItemCard as PartnerCard } from '../../../components/PartnerListItemCard'; |
17 |
| -import { SortButtonDialog, useSort } from '../../../components/Sort'; |
18 |
| -import { usePartnerFilters } from './PartnerFilterOptions'; |
19 |
| -import { PartnersDocument } from './PartnerList.graphql'; |
20 |
| -import { PartnerSort, PartnerSortOptions } from './PartnerSortOptions'; |
21 |
| - |
22 |
| -const TabList = ActualTabList as typeof __Tabs; |
23 |
| - |
24 |
| -const useStyles = makeStyles()(({ spacing, breakpoints }) => ({ |
25 |
| - options: { |
26 |
| - margin: spacing(3, 0), |
27 |
| - }, |
28 |
| - items: { |
29 |
| - maxWidth: breakpoints.values.sm, |
30 |
| - }, |
31 |
| - tabPanel: { |
32 |
| - overflowY: 'auto', |
33 |
| - // allow card shadow to bleed over instead of cutting it off |
34 |
| - padding: spacing(0, 0, 0, 2), |
35 |
| - margin: spacing(0, 0, 0, -2), |
36 |
| - }, |
37 |
| - total: { |
38 |
| - marginTop: spacing(2), |
39 |
| - }, |
40 |
| -})); |
| 3 | +import { PartnerGrid } from './PartnerGrid'; |
41 | 4 |
|
42 | 5 | export const PartnerList = () => {
|
43 |
| - const sort = useSort<PartnerSort>('name'); |
44 |
| - const [filters, setFilters] = usePartnerFilters(); |
45 |
| - const list = useListQuery(PartnersDocument, { |
46 |
| - listAt: (data) => data.partners, |
47 |
| - variables: { |
48 |
| - input: { |
49 |
| - ...sort.value, |
50 |
| - filter: filters.tab === 'pinned' ? { pinned: true } : {}, |
51 |
| - }, |
52 |
| - }, |
53 |
| - }); |
54 |
| - |
55 |
| - const { classes } = useStyles(); |
56 |
| - const formatNumber = useNumberFormatter(); |
57 |
| - const scrollRef = useRef<HTMLElement>(null); |
58 |
| - |
59 | 6 | return (
|
60 |
| - <ContentContainer> |
| 7 | + <Stack sx={{ flex: 1, padding: 4, pt: 2 }}> |
61 | 8 | <Helmet title="Partners" />
|
62 |
| - <Typography variant="h2" paragraph> |
63 |
| - Partners |
64 |
| - </Typography> |
65 |
| - <Grid container spacing={1} className={classes.options}> |
66 |
| - <Grid item> |
67 |
| - <SortButtonDialog {...sort}> |
68 |
| - <PartnerSortOptions /> |
69 |
| - </SortButtonDialog> |
70 |
| - </Grid> |
71 |
| - </Grid> |
72 |
| - |
73 |
| - <TabContext value={filters.tab}> |
74 |
| - <TabList |
75 |
| - onChange={(_e, tab) => setFilters({ ...filters, tab })} |
76 |
| - aria-label="partner navigation tabs" |
77 |
| - className={classes.items} |
78 |
| - > |
79 |
| - <Tab label="Pinned" value="pinned" /> |
80 |
| - <Tab label="All" value="all" /> |
81 |
| - </TabList> |
82 |
| - <Divider className={classes.items} /> |
83 |
| - <TabPanel |
84 |
| - value={filters.tab} |
85 |
| - className={classes.tabPanel} |
86 |
| - ref={scrollRef} |
87 |
| - > |
88 |
| - <Typography variant="h3" className={classes.total}> |
89 |
| - {list.data ? ( |
90 |
| - `${formatNumber(list.data.total)} Partners` |
91 |
| - ) : ( |
92 |
| - <Skeleton width="10ch" /> |
93 |
| - )} |
94 |
| - </Typography> |
95 |
| - <List |
96 |
| - {...list} |
97 |
| - classes={{ container: classes.items }} |
98 |
| - renderItem={(item) => <PartnerCard partner={item} />} |
99 |
| - renderSkeleton={<PartnerCard />} |
100 |
| - scrollRef={scrollRef} |
101 |
| - /> |
102 |
| - </TabPanel> |
103 |
| - </TabContext> |
104 |
| - </ContentContainer> |
| 9 | + <Stack component="main" sx={{ flex: 1 }}> |
| 10 | + <Typography variant="h2" paragraph> |
| 11 | + Partners |
| 12 | + </Typography> |
| 13 | + <Stack sx={{ flex: 1, containerType: 'size' }}> |
| 14 | + <Paper |
| 15 | + sx={{ |
| 16 | + flex: 1, |
| 17 | + minHeight: 375, |
| 18 | + maxHeight: '100cqh', |
| 19 | + width: 'min-content', |
| 20 | + maxWidth: '100cqw', |
| 21 | + }} |
| 22 | + > |
| 23 | + <PartnerGrid /> |
| 24 | + </Paper> |
| 25 | + </Stack> |
| 26 | + </Stack> |
| 27 | + </Stack> |
105 | 28 | );
|
106 | 29 | };
|
0 commit comments