Share ClosetListContents between pages
Extracted this into a shared component for both the lists page and the single list page!
This commit is contained in:
parent
edb4ad7a3c
commit
482d710fd1
2 changed files with 6 additions and 50 deletions
|
@ -123,7 +123,7 @@ function UserItemListPage() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function ClosetListContents({ closetList, isCurrentUser }) {
|
export function ClosetListContents({ closetList, isCurrentUser }) {
|
||||||
const isTradeMatch = (item) =>
|
const isTradeMatch = (item) =>
|
||||||
!isCurrentUser &&
|
!isCurrentUser &&
|
||||||
((closetList.ownsOrWantsItems === "OWNS" && item.currentUserWantsThis) ||
|
((closetList.ownsOrWantsItems === "OWNS" && item.currentUserWantsThis) ||
|
||||||
|
|
|
@ -37,12 +37,12 @@ import { useQuery, useLazyQuery, useMutation } from "@apollo/client";
|
||||||
|
|
||||||
import HangerSpinner from "./components/HangerSpinner";
|
import HangerSpinner from "./components/HangerSpinner";
|
||||||
import { Heading1, Heading2, Heading3 } from "./util";
|
import { Heading1, Heading2, Heading3 } from "./util";
|
||||||
import ItemCard from "./components/ItemCard";
|
|
||||||
import MarkdownAndSafeHTML from "./components/MarkdownAndSafeHTML";
|
import MarkdownAndSafeHTML from "./components/MarkdownAndSafeHTML";
|
||||||
import SupportOnly from "./WardrobePage/support/SupportOnly";
|
import SupportOnly from "./WardrobePage/support/SupportOnly";
|
||||||
import useSupport from "./WardrobePage/support/useSupport";
|
import useSupport from "./WardrobePage/support/useSupport";
|
||||||
import useCurrentUser from "./components/useCurrentUser";
|
import useCurrentUser from "./components/useCurrentUser";
|
||||||
import WIPCallout from "./components/WIPCallout";
|
import WIPCallout from "./components/WIPCallout";
|
||||||
|
import { ClosetListContents } from "./UserItemListPage";
|
||||||
|
|
||||||
const BadgeButton = React.forwardRef((props, ref) => (
|
const BadgeButton = React.forwardRef((props, ref) => (
|
||||||
<Badge as="button" ref={ref} {...props} />
|
<Badge as="button" ref={ref} {...props} />
|
||||||
|
@ -416,25 +416,6 @@ function ClosetList({ closetList, isCurrentUser, showHeading }) {
|
||||||
const { isSupportUser, supportSecret } = useSupport();
|
const { isSupportUser, supportSecret } = useSupport();
|
||||||
const toast = useToast();
|
const toast = useToast();
|
||||||
|
|
||||||
const hasYouWantThisBadge = (item) =>
|
|
||||||
!isCurrentUser &&
|
|
||||||
closetList.ownsOrWantsItems === "OWNS" &&
|
|
||||||
item.currentUserWantsThis;
|
|
||||||
const hasYouOwnThisBadge = (item) =>
|
|
||||||
!isCurrentUser &&
|
|
||||||
closetList.ownsOrWantsItems === "WANTS" &&
|
|
||||||
item.currentUserOwnsThis;
|
|
||||||
const hasAnyTradeBadge = (item) =>
|
|
||||||
hasYouOwnThisBadge(item) || hasYouWantThisBadge(item);
|
|
||||||
|
|
||||||
const sortedItems = [...closetList.items].sort((a, b) => {
|
|
||||||
// This is a cute sort hack. We sort first by, bringing "You own/want
|
|
||||||
// this!" to the top, and then sorting by name _within_ those two groups.
|
|
||||||
const aName = `${hasAnyTradeBadge(a) ? "000" : "999"} ${a.name}`;
|
|
||||||
const bName = `${hasAnyTradeBadge(b) ? "000" : "999"} ${b.name}`;
|
|
||||||
return aName.localeCompare(bName);
|
|
||||||
});
|
|
||||||
|
|
||||||
// When this mounts, scroll it into view if it matches the location hash.
|
// When this mounts, scroll it into view if it matches the location hash.
|
||||||
// This works around the fact that, while the browser tries to do this
|
// This works around the fact that, while the browser tries to do this
|
||||||
// natively on page load, the list might not be mounted yet!
|
// natively on page load, the list might not be mounted yet!
|
||||||
|
@ -512,20 +493,6 @@ function ClosetList({ closetList, isCurrentUser, showHeading }) {
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
let tradeMatchingMode;
|
|
||||||
if (isCurrentUser) {
|
|
||||||
// On your own item list, it's not helpful to show your own trade matches!
|
|
||||||
tradeMatchingMode = "hide-all";
|
|
||||||
} else if (closetList.ownsOrWantsItems === "OWNS") {
|
|
||||||
tradeMatchingMode = "offering";
|
|
||||||
} else if (closetList.ownsOrWantsItems === "WANTS") {
|
|
||||||
tradeMatchingMode = "seeking";
|
|
||||||
} else {
|
|
||||||
throw new Error(
|
|
||||||
`unexpected ownsOrWantsItems value: ${closetList.ownsOrWantsItems}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box id={anchorId}>
|
<Box id={anchorId}>
|
||||||
<Flex align="center" wrap="wrap" marginBottom="2">
|
<Flex align="center" wrap="wrap" marginBottom="2">
|
||||||
|
@ -620,21 +587,10 @@ function ClosetList({ closetList, isCurrentUser, showHeading }) {
|
||||||
)}
|
)}
|
||||||
</Box>
|
</Box>
|
||||||
)}
|
)}
|
||||||
{sortedItems.length > 0 ? (
|
<ClosetListContents
|
||||||
<Wrap spacing="4" justify="center">
|
closetList={closetList}
|
||||||
{sortedItems.map((item) => (
|
isCurrentUser={isCurrentUser}
|
||||||
<WrapItem key={item.id}>
|
/>
|
||||||
<ItemCard
|
|
||||||
item={item}
|
|
||||||
variant="grid"
|
|
||||||
tradeMatchingMode={tradeMatchingMode}
|
|
||||||
/>
|
|
||||||
</WrapItem>
|
|
||||||
))}
|
|
||||||
</Wrap>
|
|
||||||
) : (
|
|
||||||
<Box fontStyle="italic">This list is empty!</Box>
|
|
||||||
)}
|
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue