2020-09-04 05:59:35 -07:00
|
|
|
import React from "react";
|
2020-09-11 23:27:23 -07:00
|
|
|
import { Box, Center } from "@chakra-ui/core";
|
2020-09-04 05:59:35 -07:00
|
|
|
import gql from "graphql-tag";
|
|
|
|
import { useParams } from "react-router-dom";
|
|
|
|
import { useQuery } from "@apollo/client";
|
|
|
|
|
|
|
|
import HangerSpinner from "./components/HangerSpinner";
|
|
|
|
import { Heading1 } from "./util";
|
2020-09-11 20:41:39 -07:00
|
|
|
import ItemCard, {
|
|
|
|
ItemBadgeList,
|
2020-09-11 21:53:57 -07:00
|
|
|
ItemCardList,
|
2020-09-11 20:41:39 -07:00
|
|
|
NcBadge,
|
|
|
|
NpBadge,
|
2020-09-11 21:45:38 -07:00
|
|
|
YouOwnThisBadge,
|
|
|
|
YouWantThisBadge,
|
2020-09-11 20:41:39 -07:00
|
|
|
} from "./components/ItemCard";
|
2020-09-04 05:59:35 -07:00
|
|
|
import useCurrentUser from "./components/useCurrentUser";
|
2020-10-10 02:07:49 -07:00
|
|
|
import WIPCallout from "./components/WIPCallout";
|
2020-09-04 05:59:35 -07:00
|
|
|
|
2020-09-11 23:20:06 -07:00
|
|
|
function UserItemsPage() {
|
2020-09-04 05:59:35 -07:00
|
|
|
const { userId } = useParams();
|
|
|
|
const currentUser = useCurrentUser();
|
|
|
|
const isCurrentUser = currentUser.id === userId;
|
|
|
|
|
|
|
|
const { loading, error, data } = useQuery(
|
|
|
|
gql`
|
|
|
|
query ItemsPage($userId: ID!) {
|
|
|
|
user(id: $userId) {
|
|
|
|
id
|
|
|
|
username
|
2020-09-11 21:34:28 -07:00
|
|
|
|
2020-09-04 05:59:35 -07:00
|
|
|
itemsTheyOwn {
|
|
|
|
id
|
2020-09-11 20:41:39 -07:00
|
|
|
isNc
|
2020-09-04 05:59:35 -07:00
|
|
|
name
|
|
|
|
thumbnailUrl
|
|
|
|
}
|
2020-09-11 21:34:28 -07:00
|
|
|
|
|
|
|
itemsTheyWant {
|
|
|
|
id
|
|
|
|
isNc
|
|
|
|
name
|
|
|
|
thumbnailUrl
|
|
|
|
}
|
2020-09-04 05:59:35 -07:00
|
|
|
}
|
2020-09-11 21:45:38 -07:00
|
|
|
|
|
|
|
currentUser {
|
|
|
|
itemsTheyOwn {
|
|
|
|
id
|
|
|
|
}
|
|
|
|
|
|
|
|
itemsTheyWant {
|
|
|
|
id
|
|
|
|
}
|
|
|
|
}
|
2020-09-04 05:59:35 -07:00
|
|
|
}
|
|
|
|
`,
|
|
|
|
{ variables: { userId } }
|
|
|
|
);
|
|
|
|
|
|
|
|
if (loading) {
|
|
|
|
return (
|
2020-09-11 23:27:23 -07:00
|
|
|
<Center>
|
2020-09-10 03:06:44 -07:00
|
|
|
<HangerSpinner />
|
2020-09-11 23:27:23 -07:00
|
|
|
</Center>
|
2020-09-04 05:59:35 -07:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (error) {
|
2020-09-06 18:12:34 -07:00
|
|
|
return <Box color="red.400">{error.message}</Box>;
|
2020-09-04 05:59:35 -07:00
|
|
|
}
|
|
|
|
|
2020-10-23 22:19:54 -07:00
|
|
|
const itemIdsYouOwn = new Set(
|
|
|
|
data.currentUser?.itemsTheyOwn.map((i) => i.id) || []
|
|
|
|
);
|
2020-09-11 21:45:38 -07:00
|
|
|
const itemIdsYouWant = new Set(
|
2020-10-23 22:19:54 -07:00
|
|
|
data.currentUser?.itemsTheyWant.map((i) => i.id) || []
|
2020-09-11 21:45:38 -07:00
|
|
|
);
|
|
|
|
|
2020-09-11 22:04:37 -07:00
|
|
|
// This helps you compare your owns/wants to other users! If they own
|
2020-09-11 22:36:38 -07:00
|
|
|
// something, and you want it, we say "You want this!". And if they want
|
|
|
|
// something, and you own it, we say "You own this!".
|
2020-09-11 22:04:37 -07:00
|
|
|
const showYouOwnThisBadge = (item) =>
|
|
|
|
!isCurrentUser && itemIdsYouOwn.has(item.id);
|
|
|
|
const showYouWantThisBadge = (item) =>
|
|
|
|
!isCurrentUser && itemIdsYouWant.has(item.id);
|
|
|
|
|
|
|
|
const sortedItemsTheyOwn = [...data.user.itemsTheyOwn].sort((a, b) => {
|
|
|
|
// This is a cute sort hack. We sort first by, bringing "You want this!" to
|
|
|
|
// the top, and then sorting by name _within_ those two groups.
|
|
|
|
const aName = `${showYouWantThisBadge(a) ? "000" : "999"} ${a.name}`;
|
|
|
|
const bName = `${showYouWantThisBadge(b) ? "000" : "999"} ${b.name}`;
|
|
|
|
return aName.localeCompare(bName);
|
|
|
|
});
|
|
|
|
|
|
|
|
const sortedItemsTheyWant = [...data.user.itemsTheyWant].sort((a, b) => {
|
|
|
|
// This is a cute sort hack. We sort first by, bringing "You own this!" to
|
|
|
|
// the top, and then sorting by name _within_ those two groups.
|
|
|
|
const aName = `${showYouOwnThisBadge(a) ? "000" : "999"} ${a.name}`;
|
|
|
|
const bName = `${showYouOwnThisBadge(b) ? "000" : "999"} ${b.name}`;
|
|
|
|
return aName.localeCompare(bName);
|
|
|
|
});
|
|
|
|
|
2020-09-04 05:59:35 -07:00
|
|
|
return (
|
2020-09-06 18:45:20 -07:00
|
|
|
<Box>
|
2020-10-10 02:07:49 -07:00
|
|
|
<Box float="right">
|
|
|
|
<WIPCallout details="These lists are simplified and read-only for now. Full power coming soon!" />
|
|
|
|
</Box>
|
2020-09-11 22:13:38 -07:00
|
|
|
<Heading1 marginBottom="6">
|
2020-09-04 05:59:35 -07:00
|
|
|
{isCurrentUser ? "Items you own" : `Items ${data.user.username} owns`}
|
|
|
|
</Heading1>
|
2020-09-11 21:53:57 -07:00
|
|
|
<ItemCardList>
|
2020-09-11 22:04:37 -07:00
|
|
|
{sortedItemsTheyOwn.map((item) => (
|
2020-09-11 20:41:39 -07:00
|
|
|
<ItemCard
|
|
|
|
key={item.id}
|
|
|
|
item={item}
|
|
|
|
badges={
|
|
|
|
<ItemBadgeList>
|
|
|
|
{item.isNc ? <NcBadge /> : <NpBadge />}
|
2020-09-11 22:04:37 -07:00
|
|
|
{showYouWantThisBadge(item) && <YouWantThisBadge />}
|
2020-09-11 20:41:39 -07:00
|
|
|
</ItemBadgeList>
|
|
|
|
}
|
|
|
|
/>
|
2020-09-04 05:59:35 -07:00
|
|
|
))}
|
2020-09-11 21:53:57 -07:00
|
|
|
</ItemCardList>
|
2020-09-11 21:34:28 -07:00
|
|
|
|
2020-09-11 22:13:38 -07:00
|
|
|
<Heading1 marginBottom="6" marginTop="8">
|
2020-09-11 21:34:28 -07:00
|
|
|
{isCurrentUser ? "Items you want" : `Items ${data.user.username} wants`}
|
|
|
|
</Heading1>
|
2020-09-11 21:53:57 -07:00
|
|
|
<ItemCardList>
|
2020-09-11 22:04:37 -07:00
|
|
|
{sortedItemsTheyWant.map((item) => (
|
2020-09-11 21:34:28 -07:00
|
|
|
<ItemCard
|
|
|
|
key={item.id}
|
|
|
|
item={item}
|
|
|
|
badges={
|
|
|
|
<ItemBadgeList>
|
|
|
|
{item.isNc ? <NcBadge /> : <NpBadge />}
|
2020-09-11 22:04:37 -07:00
|
|
|
{showYouOwnThisBadge(item) && <YouOwnThisBadge />}
|
2020-09-11 21:34:28 -07:00
|
|
|
</ItemBadgeList>
|
|
|
|
}
|
|
|
|
/>
|
|
|
|
))}
|
2020-09-11 21:53:57 -07:00
|
|
|
</ItemCardList>
|
2020-09-04 05:59:35 -07:00
|
|
|
</Box>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2020-09-11 23:20:06 -07:00
|
|
|
export default UserItemsPage;
|