2021-01-03 23:31:02 -08:00
|
|
|
import React from "react";
|
2021-01-04 00:10:35 -08:00
|
|
|
import { Box, Center, Flex, Wrap, WrapItem } from "@chakra-ui/react";
|
2021-01-03 23:31:02 -08:00
|
|
|
import gql from "graphql-tag";
|
|
|
|
import { useQuery } from "@apollo/client";
|
|
|
|
|
|
|
|
import { ErrorMessage, Heading1 } from "./util";
|
2021-01-04 00:10:35 -08:00
|
|
|
import {
|
|
|
|
getVisibleLayers,
|
|
|
|
petAppearanceFragmentForGetVisibleLayers,
|
|
|
|
} from "./components/useOutfitAppearance";
|
2021-01-03 23:31:02 -08:00
|
|
|
import HangerSpinner from "./components/HangerSpinner";
|
|
|
|
import useRequireLogin from "./components/useRequireLogin";
|
2021-01-04 00:12:25 -08:00
|
|
|
import WIPCallout from "./components/WIPCallout";
|
2021-01-03 23:31:02 -08:00
|
|
|
|
|
|
|
function UserOutfitsPage() {
|
|
|
|
return (
|
|
|
|
<Box>
|
2021-01-04 00:12:25 -08:00
|
|
|
<Flex justifyContent="space-between" marginBottom="4">
|
|
|
|
<Heading1>Your outfits</Heading1>
|
|
|
|
<WIPCallout />
|
|
|
|
</Flex>
|
2021-01-03 23:31:02 -08:00
|
|
|
<UserOutfitsPageContent />
|
|
|
|
</Box>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function UserOutfitsPageContent() {
|
|
|
|
const { isLoading: userLoading } = useRequireLogin();
|
|
|
|
|
|
|
|
const { loading: queryLoading, error, data } = useQuery(
|
|
|
|
gql`
|
2021-01-04 00:10:35 -08:00
|
|
|
query UserOutfitsPageContent($size: LayerImageSize) {
|
2021-01-03 23:31:02 -08:00
|
|
|
currentUser {
|
|
|
|
outfits {
|
|
|
|
id
|
2021-01-03 23:36:00 -08:00
|
|
|
name
|
|
|
|
petAppearance {
|
|
|
|
id
|
2021-01-04 00:10:35 -08:00
|
|
|
layers {
|
|
|
|
id
|
|
|
|
svgUrl
|
|
|
|
imageUrl(size: $size)
|
|
|
|
}
|
|
|
|
...PetAppearanceForGetVisibleLayers
|
2021-01-03 23:36:00 -08:00
|
|
|
}
|
2021-01-03 23:31:02 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-01-04 00:10:35 -08:00
|
|
|
${petAppearanceFragmentForGetVisibleLayers}
|
2021-01-03 23:31:02 -08:00
|
|
|
`,
|
2021-01-04 00:10:35 -08:00
|
|
|
{ variables: { size: "SIZE_" + getBestImageSize() }, skip: userLoading }
|
2021-01-03 23:31:02 -08:00
|
|
|
);
|
|
|
|
|
|
|
|
if (userLoading || queryLoading) {
|
|
|
|
return (
|
|
|
|
<Center>
|
|
|
|
<HangerSpinner />
|
|
|
|
</Center>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (error) {
|
|
|
|
return <ErrorMessage>Error loading outfits: {error.message}</ErrorMessage>;
|
|
|
|
}
|
|
|
|
|
2021-01-04 00:10:35 -08:00
|
|
|
const outfits = data.currentUser.outfits;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Wrap spacing="4">
|
|
|
|
{outfits.map((outfit) => (
|
|
|
|
<WrapItem key={outfit.id}>
|
|
|
|
<OutfitCard outfit={outfit} />
|
|
|
|
</WrapItem>
|
|
|
|
))}
|
|
|
|
</Wrap>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function OutfitCard({ outfit }) {
|
|
|
|
const thumbnailUrl = buildOutfitThumbnailUrl(outfit.petAppearance, []);
|
|
|
|
|
2021-01-03 23:31:02 -08:00
|
|
|
return (
|
2021-01-04 00:10:35 -08:00
|
|
|
<Flex
|
|
|
|
direction="column"
|
|
|
|
alignItems="center"
|
|
|
|
textAlign="center"
|
|
|
|
boxShadow="md"
|
|
|
|
borderRadius="md"
|
|
|
|
padding="3"
|
|
|
|
width="calc(150px + 2em)"
|
|
|
|
>
|
|
|
|
<Box as="img" src={thumbnailUrl} width={150} height={150} />
|
|
|
|
<Box>{outfit.name}</Box>
|
|
|
|
</Flex>
|
2021-01-03 23:31:02 -08:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2021-01-04 00:10:35 -08:00
|
|
|
function buildOutfitThumbnailUrl(petAppearance, itemAppearances) {
|
|
|
|
const size = getBestImageSize();
|
|
|
|
const visibleLayers = getVisibleLayers(petAppearance, itemAppearances);
|
|
|
|
const layerUrls = visibleLayers.map(
|
|
|
|
(layer) => layer.svgUrl || layer.imageUrl
|
|
|
|
);
|
|
|
|
|
|
|
|
return `/api/outfitImage?size=${size}&layerUrls=${layerUrls.join(",")}`;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getBestImageSize() {
|
|
|
|
if (window.devicePixelRatio > 1) {
|
|
|
|
return 300;
|
|
|
|
} else {
|
|
|
|
return 150;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-03 23:31:02 -08:00
|
|
|
export default UserOutfitsPage;
|