add beta blurb & WIP feedback form to homepage
This commit is contained in:
parent
3dc9a1d0ef
commit
cd42988a90
1 changed files with 196 additions and 0 deletions
|
@ -5,11 +5,14 @@ import {
|
||||||
Box,
|
Box,
|
||||||
Button,
|
Button,
|
||||||
Flex,
|
Flex,
|
||||||
|
IconButton,
|
||||||
Input,
|
Input,
|
||||||
|
Textarea,
|
||||||
useColorModeValue,
|
useColorModeValue,
|
||||||
useTheme,
|
useTheme,
|
||||||
useToast,
|
useToast,
|
||||||
} from "@chakra-ui/core";
|
} from "@chakra-ui/core";
|
||||||
|
import { CloseIcon } from "@chakra-ui/icons";
|
||||||
import { useHistory, useLocation } from "react-router-dom";
|
import { useHistory, useLocation } from "react-router-dom";
|
||||||
import { useLazyQuery } from "@apollo/client";
|
import { useLazyQuery } from "@apollo/client";
|
||||||
|
|
||||||
|
@ -64,6 +67,8 @@ function HomePage() {
|
||||||
</Box>
|
</Box>
|
||||||
<Box height="4" />
|
<Box height="4" />
|
||||||
<SubmitPetForm />
|
<SubmitPetForm />
|
||||||
|
<Box height="16" />
|
||||||
|
<FeedbackFormSection />
|
||||||
</Flex>
|
</Flex>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -241,6 +246,197 @@ function SubmitPetForm() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function FeedbackFormSection() {
|
||||||
|
const [isOpen, setIsOpen] = React.useState(false);
|
||||||
|
const borderColor = useColorModeValue("gray.300", "blue.400");
|
||||||
|
|
||||||
|
const openButtonRef = React.useRef(null);
|
||||||
|
const emailFieldRef = React.useRef(null);
|
||||||
|
|
||||||
|
React.useLayoutEffect(() => {
|
||||||
|
if (isOpen) {
|
||||||
|
if (emailFieldRef.current) {
|
||||||
|
emailFieldRef.current.focus();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (openButtonRef.current) {
|
||||||
|
openButtonRef.current.focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [isOpen]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Flex
|
||||||
|
as="section"
|
||||||
|
position="relative"
|
||||||
|
alignItems="center"
|
||||||
|
border="1px solid"
|
||||||
|
borderColor={borderColor}
|
||||||
|
borderRadius="lg"
|
||||||
|
boxShadow="lg"
|
||||||
|
maxWidth="500px"
|
||||||
|
paddingLeft="2"
|
||||||
|
paddingRight="4"
|
||||||
|
paddingY="2"
|
||||||
|
cursor={!isOpen && "pointer"}
|
||||||
|
onClick={!isOpen && (() => setIsOpen(true))}
|
||||||
|
>
|
||||||
|
<Box
|
||||||
|
padding="2"
|
||||||
|
background="white"
|
||||||
|
borderRadius="lg"
|
||||||
|
overflow="hidden"
|
||||||
|
flex="0 0 auto"
|
||||||
|
>
|
||||||
|
<Box
|
||||||
|
as="img"
|
||||||
|
// TODO: Bundle this after we're done prototyping!
|
||||||
|
src="http://images.neopets.com/new_shopkeepers/1524.gif"
|
||||||
|
height="90px"
|
||||||
|
width="90px"
|
||||||
|
opacity="0.9"
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Box
|
||||||
|
display="grid"
|
||||||
|
gridTemplateAreas="the-single-area"
|
||||||
|
alignItems="center"
|
||||||
|
marginLeft="2"
|
||||||
|
>
|
||||||
|
<Box
|
||||||
|
position="absolute"
|
||||||
|
left="1"
|
||||||
|
top="1"
|
||||||
|
aria-hidden={!isOpen}
|
||||||
|
isDisabled={!isOpen}
|
||||||
|
opacity={isOpen ? "0.5" : "0"}
|
||||||
|
pointerEvents={isOpen ? "all" : "none"}
|
||||||
|
transition="opacity 0.25s"
|
||||||
|
>
|
||||||
|
<IconButton
|
||||||
|
aria-label="Close"
|
||||||
|
icon={<CloseIcon />}
|
||||||
|
size="xs"
|
||||||
|
variant="ghost"
|
||||||
|
onClick={() => setIsOpen(false)}
|
||||||
|
isDisabled={!isOpen}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Box
|
||||||
|
gridArea="the-single-area"
|
||||||
|
aria-hidden={isOpen}
|
||||||
|
opacity={isOpen ? "0" : "1"}
|
||||||
|
pointerEvents={isOpen ? "none" : "all"}
|
||||||
|
transition="opacity 0.25s"
|
||||||
|
>
|
||||||
|
<FeedbackFormPitch
|
||||||
|
isDisabled={isOpen}
|
||||||
|
onClick={() => setIsOpen(true)}
|
||||||
|
openButtonRef={openButtonRef}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
<Box
|
||||||
|
gridArea="the-single-area"
|
||||||
|
aria-hidden={!isOpen}
|
||||||
|
opacity={isOpen ? "1" : "0"}
|
||||||
|
pointerEvents={isOpen ? "all" : "none"}
|
||||||
|
transition="opacity 0.25s"
|
||||||
|
>
|
||||||
|
<FeedbackForm
|
||||||
|
isDisabled={!isOpen}
|
||||||
|
onClose={() => setIsOpen(false)}
|
||||||
|
emailFieldRef={emailFieldRef}
|
||||||
|
/>
|
||||||
|
</Box>
|
||||||
|
</Box>
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function FeedbackFormPitch({ isDisabled, onClick, openButtonRef }) {
|
||||||
|
return (
|
||||||
|
<Flex direction="column" textAlign="left" opacity="0.9">
|
||||||
|
<Box as="header">Hi friends! Welcome to the beta!</Box>
|
||||||
|
<Box as="p" fontSize="sm">
|
||||||
|
This is the new Dress to Impress! It's ready for the future, and it even
|
||||||
|
works great on mobile! More coming soon!
|
||||||
|
</Box>
|
||||||
|
<Box
|
||||||
|
as="button"
|
||||||
|
alignSelf="flex-end"
|
||||||
|
fontSize="sm"
|
||||||
|
marginTop="1"
|
||||||
|
opacity="0.8"
|
||||||
|
textDecoration="underline"
|
||||||
|
disabled={isDisabled}
|
||||||
|
onClick={onClick}
|
||||||
|
ref={openButtonRef}
|
||||||
|
>
|
||||||
|
Tell us what you think →
|
||||||
|
</Box>
|
||||||
|
</Flex>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function FeedbackForm({ isDisabled, onClose, emailFieldRef }) {
|
||||||
|
const [content, setContent] = React.useState("");
|
||||||
|
const toast = useToast();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Box
|
||||||
|
as="form"
|
||||||
|
// We use Grid here rather than our usual Flex, mainly so the fields will
|
||||||
|
// tab in the correct order!
|
||||||
|
display="grid"
|
||||||
|
gridTemplateAreas={`"email send" "content content"`}
|
||||||
|
gridTemplateColumns="1fr auto"
|
||||||
|
gridGap="2"
|
||||||
|
onSubmit={(e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
toast({
|
||||||
|
title: "Ah, well, this form isn't hooked up yet!",
|
||||||
|
description:
|
||||||
|
"That's coming soon! 😅 For now, please send an email to matchu@openneo.net. Sorry and thanks!",
|
||||||
|
duration: null,
|
||||||
|
isClosable: true,
|
||||||
|
});
|
||||||
|
}}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
if (e.key === "Escape") {
|
||||||
|
onClose();
|
||||||
|
e.stopPropagation();
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Input
|
||||||
|
type="email"
|
||||||
|
placeholder="Email address (optional)"
|
||||||
|
size="sm"
|
||||||
|
gridArea="email"
|
||||||
|
ref={emailFieldRef}
|
||||||
|
isDisabled={isDisabled}
|
||||||
|
/>
|
||||||
|
<Textarea
|
||||||
|
size="sm"
|
||||||
|
placeholder={"I love…\nI wish…\nNext, you should add…"}
|
||||||
|
gridArea="content"
|
||||||
|
value={content}
|
||||||
|
onChange={(e) => setContent(e.target.value)}
|
||||||
|
isDisabled={isDisabled}
|
||||||
|
/>
|
||||||
|
<Button
|
||||||
|
type="submit"
|
||||||
|
size="sm"
|
||||||
|
colorScheme="blue"
|
||||||
|
gridArea="send"
|
||||||
|
isDisabled={isDisabled || content.trim().length === 0}
|
||||||
|
>
|
||||||
|
Send
|
||||||
|
</Button>
|
||||||
|
</Box>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* useSupportSetup helps our support staff get set up with special access.
|
* useSupportSetup helps our support staff get set up with special access.
|
||||||
* If you provide ?supportSecret=... in the URL, we'll save it in a cookie and
|
* If you provide ?supportSecret=... in the URL, we'll save it in a cookie and
|
||||||
|
|
Loading…
Reference in a new issue