diff --git a/packages/web/components/templates/OnboardingLayout.tsx b/packages/web/components/templates/OnboardingLayout.tsx index cdc067b12..7f69aeecd 100644 --- a/packages/web/components/templates/OnboardingLayout.tsx +++ b/packages/web/components/templates/OnboardingLayout.tsx @@ -4,7 +4,7 @@ import { VStack, HStack, Box } from '../elements/LayoutPrimitives' import { OmnivoreNameLogo } from '../elements/images/OmnivoreNameLogo' import { StyledText } from '../elements/StyledText' import { Button } from '../elements/Button' -import Link from 'next/link' +import { useRouter } from 'next/router' const TOTAL_ONBOARDING_PAGES = 6 @@ -17,6 +17,7 @@ type OnboardingLayoutProps = { image?: ReactNode nextPage?: string, reduceSpace?: boolean, + onNext?: () => void | Promise, } export const OnboardingLayout = ({ @@ -27,30 +28,36 @@ export const OnboardingLayout = ({ image, children, nextPage, - reduceSpace + reduceSpace, + onNext, }: OnboardingLayoutProps) => { - const NextButton = () => ( - - - - ) + const router = useRouter() + + const NextButton = () => { + const handleNext = async () => { + onNext && await onNext() + router.push(nextPage ?? `/onboarding/0${pageNumber+1}`) + } + + return ( + + )} return ( <> diff --git a/packages/web/components/templates/onboarding/OnboardingAddNewsletters.tsx b/packages/web/components/templates/onboarding/OnboardingAddNewsletters.tsx index b3c7917df..ea472bd40 100644 --- a/packages/web/components/templates/onboarding/OnboardingAddNewsletters.tsx +++ b/packages/web/components/templates/onboarding/OnboardingAddNewsletters.tsx @@ -1,28 +1,37 @@ -import React from 'react' +import React, { useState } from 'react' +import { subscribeMutation } from '../../../lib/networking/mutations/subscribeMutation' import { VStack } from '../../elements/LayoutPrimitives' import { OnboardingLayout } from '../OnboardingLayout' import { SelectOption } from './SelectOption' -const optionDetails = [ +const newsletterOptions = [ { icon: 'AxiosDaily.png', label: 'Axios Daily Essentials', - description: 'Start and end your day with the stories that matter in your inbox.' + description: 'Start and end your day with the stories that matter in your inbox.', + name: 'axios_essentials', + isChecked: false, }, { icon: 'MilkRoad.png', label: 'Milk Road', description: '5 minute daily newsletter. Used by 100,000+ people to be better crypto investors 💪', + name: 'morning_brew', + isChecked: false, }, { icon: 'MoneyStuff.png', label: 'Money Stuff by Matt Levine', description: 'A daily take on Wall Street, finance, companies and other stuff.', + name: 'milk_road', + isChecked: false, }, { icon: 'OmnivoreBlog.png', label: 'Omnivore', description: 'Tips and tricks, plus updates on new features in Omnivore.', + name: 'omnivore_blog', + isChecked: false, }, ] @@ -30,20 +39,48 @@ type OnboardingAddNewslettersProps = { pageNumber: number } +export type NewsLetterOption = { + icon: string, + label: string, + name: string, + description: string, + isChecked: boolean, +} + export const OnboardingAddNewsletters = (props: OnboardingAddNewslettersProps) => { + + const [newsletters, setNewsletters] = useState(newsletterOptions); + + const onCheck = (index: number) => { + const temp = [...newsletters] + temp[index].isChecked = !temp[index].isChecked + setNewsletters(temp) + } + + const onNext = () => { + newsletters.map((newsletter) => { + if (newsletter.isChecked) subscribeMutation(newsletter.name) + }) + } + return ( - {optionDetails.map(({ icon, label, description }, idx) => ( - + {newsletters.map(({ icon, label, description, isChecked }, idx) => ( + ))} diff --git a/packages/web/components/templates/onboarding/SelectOption.tsx b/packages/web/components/templates/onboarding/SelectOption.tsx index 3c9ff0d56..3bd794f44 100644 --- a/packages/web/components/templates/onboarding/SelectOption.tsx +++ b/packages/web/components/templates/onboarding/SelectOption.tsx @@ -12,15 +12,19 @@ export const SelectOption: React.FC<{ icon: string label: string description: string -}> = ({ icon, label, description }) => { - const [checked, setChecked] = React.useState(false) + onCheck: (idx: number) => void + indexNum: number + isChecked: boolean +}> = ({ icon, label, description, onCheck, indexNum, isChecked}) => { - const toggleChecked = () => setChecked(!checked) + const toggleChecked = () => { + onCheck(indexNum) + } return ( - + undefined} /> { + const mutation = gql` + mutation { + subscribe(name: "${subscribeName}") { + ... on SubscribeSuccess { + subscriptions { + id + } + } + ... on SubscribeError { + errorCodes + } + } + } + ` + try { + const data = (await gqlFetcher(mutation)) as SubscribeResult + return data.errorCodes ? undefined : data.subscribe + } catch (error) { + console.log('subscribeMutation error', error) + return undefined + } +}