placeholder Your Outfits page
it requires login, and runs a GQL query that will fail 😅
This commit is contained in:
parent
eb22290a64
commit
778eefbdd5
4 changed files with 97 additions and 0 deletions
|
@ -27,6 +27,7 @@ const ItemTradesSeekingPage = loadable(() =>
|
||||||
const ModelingPage = loadable(() => import("./ModelingPage"));
|
const ModelingPage = loadable(() => import("./ModelingPage"));
|
||||||
const PrivacyPolicyPage = loadable(() => import("./PrivacyPolicyPage"));
|
const PrivacyPolicyPage = loadable(() => import("./PrivacyPolicyPage"));
|
||||||
const UserItemsPage = loadable(() => import("./UserItemsPage"));
|
const UserItemsPage = loadable(() => import("./UserItemsPage"));
|
||||||
|
const UserOutfitsPage = loadable(() => import("./UserOutfitsPage"));
|
||||||
const WardrobePage = loadable(() => import("./WardrobePage"), {
|
const WardrobePage = loadable(() => import("./WardrobePage"), {
|
||||||
fallback: <WardrobePageLayout />,
|
fallback: <WardrobePageLayout />,
|
||||||
});
|
});
|
||||||
|
@ -92,6 +93,11 @@ function App() {
|
||||||
<UserItemsPage />
|
<UserItemsPage />
|
||||||
</PageLayout>
|
</PageLayout>
|
||||||
</Route>
|
</Route>
|
||||||
|
<Route path="/your-outfits">
|
||||||
|
<PageLayout>
|
||||||
|
<UserOutfitsPage />
|
||||||
|
</PageLayout>
|
||||||
|
</Route>
|
||||||
<Route path="/modeling">
|
<Route path="/modeling">
|
||||||
<PageLayout>
|
<PageLayout>
|
||||||
<ModelingPage />
|
<ModelingPage />
|
||||||
|
|
54
src/app/UserOutfitsPage.js
Normal file
54
src/app/UserOutfitsPage.js
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
import React from "react";
|
||||||
|
import { Box, Center } from "@chakra-ui/react";
|
||||||
|
import gql from "graphql-tag";
|
||||||
|
import { useQuery } from "@apollo/client";
|
||||||
|
|
||||||
|
import { ErrorMessage, Heading1 } from "./util";
|
||||||
|
import HangerSpinner from "./components/HangerSpinner";
|
||||||
|
import useRequireLogin from "./components/useRequireLogin";
|
||||||
|
|
||||||
|
function UserOutfitsPage() {
|
||||||
|
return (
|
||||||
|
<Box>
|
||||||
|
<Heading1>Your outfits</Heading1>
|
||||||
|
<UserOutfitsPageContent />
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function UserOutfitsPageContent() {
|
||||||
|
const { isLoading: userLoading } = useRequireLogin();
|
||||||
|
|
||||||
|
const { loading: queryLoading, error, data } = useQuery(
|
||||||
|
gql`
|
||||||
|
query UserOutfitsPageContent {
|
||||||
|
currentUser {
|
||||||
|
outfits {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,
|
||||||
|
{ skip: userLoading }
|
||||||
|
);
|
||||||
|
|
||||||
|
if (userLoading || queryLoading) {
|
||||||
|
return (
|
||||||
|
<Center>
|
||||||
|
<HangerSpinner />
|
||||||
|
</Center>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
return <ErrorMessage>Error loading outfits: {error.message}</ErrorMessage>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<code>
|
||||||
|
<pre>Data: {JSON.stringify(data)}</pre>
|
||||||
|
</code>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default UserOutfitsPage;
|
30
src/app/components/useRequireLogin.js
Normal file
30
src/app/components/useRequireLogin.js
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
import React from "react";
|
||||||
|
import { useAuth0 } from "@auth0/auth0-react";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* useRequireLogin redirects to a login page, if the user is not already logged
|
||||||
|
* in.
|
||||||
|
*
|
||||||
|
* Returns an object {isLoading: Boolean}, which is true if we're loading or
|
||||||
|
* redirecting, or false if the user is logged in and we can proceed.
|
||||||
|
*/
|
||||||
|
function useRequireLogin() {
|
||||||
|
const { isLoading, isAuthenticated, loginWithRedirect } = useAuth0();
|
||||||
|
|
||||||
|
const isRedirecting = !isLoading && !isAuthenticated;
|
||||||
|
|
||||||
|
React.useEffect(() => {
|
||||||
|
if (isRedirecting) {
|
||||||
|
loginWithRedirect({
|
||||||
|
redirectUri: window.location.href,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [isRedirecting, loginWithRedirect]);
|
||||||
|
|
||||||
|
// We tell the caller that we're "loading" even in the authenticated case,
|
||||||
|
// because we want them to continue to show their loading state while we
|
||||||
|
// redirect.
|
||||||
|
return { isLoading: isLoading || isRedirecting };
|
||||||
|
}
|
||||||
|
|
||||||
|
export default useRequireLogin;
|
|
@ -81,6 +81,13 @@ export function Heading3({ children, ...props }) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ErrorMessage is a simple error message for simple errors!
|
||||||
|
*/
|
||||||
|
export function ErrorMessage({ children }) {
|
||||||
|
return <Box color="red.400">{children}</Box>;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* safeImageUrl returns an HTTPS-safe image URL for Neopets assets!
|
* safeImageUrl returns an HTTPS-safe image URL for Neopets assets!
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in a new issue