import * as React from "react"; import * as Strings from "~/common/strings"; import * as Styles from "~/common/styles"; import * as Actions from "~/common/actions"; import * as Events from "~/common/custom-events"; import * as Constants from "~/common/constants"; import WebsitePrototypeWrapper from "~/components/core/WebsitePrototypeWrapper"; import { SignUpPopover } from "~/components/core/Auth/components"; import { H5, P3 } from "~/components/system/components/Typography"; import { css } from "@emotion/react"; import { ButtonPrimary } from "~/components/system/components/Buttons"; import { useForm } from "~/common/hooks"; import { Input } from "~/components/system"; import { AuthWrapper } from "~/components/core/Auth/components"; const TOOLS_OPTIONS = { "Browser Bookmarks": "prevToolsBrowserBookmarks", Pinterest: "prevToolsPinterest", "Are.na": "prevToolsArena", "Notes platform (Notion, Evernote, etc.)": "prevToolsNotesPlatform", }; const SLATE_USECASES_OPTIONS = { "Bookmarking important pages": "useCasesBookmarkingImportantPages", "Saving links to read later": "useCasesSavingLinksToReadLater", "Searching your browsed pages": "useCasesSearchingYourBrowsedPages", "Sharing collections of links": "useCasesSharingCollectionsOfLinks", }; const REFERRAL_OPTIONS = { Twitter: "referralTwitter", "IPFS/Filecoin Community": "referralIpfsFilecoinCommunity", "From a friend": "referralFriend", }; // NOTE(amine): form styles const STYLES_FORM_WRAPPER = css` display: flex; flex-direction: column; justify-content: center; align-items: center; `; // NOTE(amine): input styles const STYLES_SURVEY_INPUT = (theme) => css` box-sizing: border-box; position: relative; display: flex; align-items: center; justify-content: center; width: 100%; height: 45px; border-radius: 8px; box-shadow: 0 0 0 1px ${theme.system.gray}; background-color: transparent; & > input::placeholder { ${Styles.H5}; color: ${theme.semantic.textGray}; text-align: center; opacity: 1; } `; // NOTE(amine): checkbox styles const STYLES_CHECKBOX_WRAPPER = (theme) => css` position: relative; display: flex; align-items: center; justify-content: center; width: 100%; height: 45px; border-radius: 8px; border: 1px solid ${theme.system.gray}; background-color: transparent; transition: all 0.3s; `; const STYLES_CHECKBOX_SELECTED = (theme) => css` border: 1px solid ${theme.system.blue}; background-color: ${theme.system.grayLight4}; `; const STYLES_CHECKBOX_INPUT = css` position: absolute; z-index: 1; opacity: 0; top: 0%; left: 0%; width: 100%; height: 100%; font-size: 16px; ${Styles.HOVERABLE}; `; function SceneSurvey({ onAction }) { const [step, setStep] = React.useState(1); const defaultTools = Object.entries(TOOLS_OPTIONS).reduce( (acc, [, key]) => ({ ...acc, [key]: false }), {} ); const defaultUseCases = Object.entries(SLATE_USECASES_OPTIONS).reduce( (acc, [, key]) => ({ ...acc, [key]: false }), {} ); const defaultReferrals = Object.entries(REFERRAL_OPTIONS).reduce( (acc, [, key]) => ({ ...acc, [key]: false }), {} ); const surveyResults = React.useRef({ ...defaultTools, ...defaultUseCases, ...defaultReferrals }); if (step === 1) { return ( { const tools = value.reduce((acc, item) => { const key = TOOLS_OPTIONS[item]; if (key) acc[key] = true; else acc["prevToolsOther"] = item; return acc; }, {}); surveyResults.current = { ...surveyResults.current, ...tools, }; setStep(2); }} /> ); } if (step === 2) { return ( { const useCases = value.reduce((acc, item) => { const key = SLATE_USECASES_OPTIONS[item]; if (key) acc[key] = true; else acc["useCasesOther"] = item; return acc; }, {}); surveyResults.current = { ...surveyResults.current, ...useCases, }; setStep(3); }} /> ); } return ( { const referrals = value.reduce((acc, item) => { const key = REFERRAL_OPTIONS[item]; if (key) acc[key] = true; else acc["referralOther"] = item; return acc; }, {}); const surveyAnswers = { ...surveyResults.current, ...referrals }; const response = await Actions.createSurvey(surveyAnswers); if (Events.hasError(response)) { return; } onAction({ type: "UPDATE_VIEWER", viewer: { hasCompletedSurvey: true }, }); }} /> ); } const useSurveyValidations = () => { const [isSurveyValid, setSurveyValidity] = React.useState(true); const checkSurveyValidity = ({ options, other }) => { const isValid = options.some((answer) => answer) || !!other; setSurveyValidity(isValid); return isValid; }; const resetSurveyValidity = () => setSurveyValidity(true); return { isSurveyValid, checkSurveyValidity, resetSurveyValidity }; }; const ToolsForm = ({ onSubmit }) => { const { isSurveyValid, checkSurveyValidity, resetSurveyValidity } = useSurveyValidations(); const { getFieldProps, getFormProps, values } = useForm({ initialValues: { tools: [], other: "" }, onSubmit: ({ tools, other }) => { if (!checkSurveyValidity({ options: tools, other })) return; const value = [...tools]; if (!Strings.isEmpty(other)) { value.push(other); } onSubmit(value); }, }); React.useEffect(() => { resetSurveyValidity(); }, [values]); const isCheckBoxSelected = (fieldValue) => values.tools.some((item) => item === fieldValue); return (
css({ color: isSurveyValid ? theme.semantic.textGrayDark : theme.system.red }) } > {isSurveyValid ? "Select all that apply" : "Please select at least 1 option"}
{Object.keys(TOOLS_OPTIONS).map((item, i) => ( ))} Next 1/
3
); }; const UsecasesForm = ({ onSubmit }) => { const { isSurveyValid, checkSurveyValidity, resetSurveyValidity } = useSurveyValidations(); const { getFieldProps, getFormProps, values } = useForm({ initialValues: { tools: [], other: "" }, onSubmit: ({ tools, other }) => { if (!checkSurveyValidity({ options: tools, other })) return; const value = [...tools]; if (!Strings.isEmpty(other)) { value.push(other); } onSubmit(value); }, }); React.useEffect(() => { resetSurveyValidity(); }, [values]); const isCheckBoxSelected = (fieldValue) => values.tools.some((item) => item === fieldValue); return (
css({ color: isSurveyValid ? theme.semantic.textGrayDark : theme.system.red }) } > {isSurveyValid ? "Select all that apply" : "Please select at least 1 option"}
{Object.keys(SLATE_USECASES_OPTIONS).map((item, i) => ( ))} Next 2/
3
); }; const ReferralForm = ({ onSubmit }) => { const { isSurveyValid, checkSurveyValidity, resetSurveyValidity } = useSurveyValidations(); const { getFieldProps, getFormProps, isSubmitting, values } = useForm({ initialValues: { referrals: [], other: "" }, onSubmit: async ({ referrals, other }) => { if (!checkSurveyValidity({ options: referrals, other })) return; const value = [...referrals]; if (!Strings.isEmpty(other)) { value.push(other); } await onSubmit(value); }, }); React.useEffect(() => { resetSurveyValidity(); }, [values]); const isCheckBoxSelected = (fieldValue) => values.referrals.some((item) => item === fieldValue); return (
css({ color: isSurveyValid ? theme.semantic.textGrayDark : theme.system.red }) } > {isSurveyValid ? "Select all that apply" : "Please select at least 1 option"}
{Object.keys(REFERRAL_OPTIONS).map((item, i) => ( ))} Submit 3/
3
); }; // eslint-disable-next-line no-unused-vars const Checkbox = ({ touched, value, style, isSelected, ...props }) => { return (
{value}
); }; const background_image = `${Constants.gateways.ipfs}/bafybeiddgkvf5ta6y5b7wamrxl33mtst4detegleblw4gfduhwm3sdwdra`; const STYLES_ROOT = css` display: flex; flex-direction: column; align-items: center; justify-content: space-between; text-align: center; font-size: 1rem; min-height: 100vh; width: 100vw; position: absolute; overflow: hidden; background-image: url(${background_image}); background-repeat: no-repeat; background-size: cover; `; const STYLES_MIDDLE = (theme) => css` position: relative; min-height: 10%; flex-grow: 1; display: flex; align-items: center; justify-content: center; flex-direction: column; text-align: left; padding: 24px; @media (max-width: ${theme.sizes.mobile}px) { padding: 24px 16px; //NOTE(amine): additional scroll space for mobile padding-bottom: 64px; } `; const WithCustomWrapper = (Component) => (props) => { return (
); }; export default WithCustomWrapper(SceneSurvey);