diff --git a/shared/people/index.shared.tsx b/shared/people/index.shared.tsx index cc073fc8b7d1..7dee1109eef9 100644 --- a/shared/people/index.shared.tsx +++ b/shared/people/index.shared.tsx @@ -11,10 +11,7 @@ import {useSignupState} from '@/stores/signup' import {usePeopleState} from '@/stores/people' // import WotTask from './wot-task' -const itemToComponent: (item: T.Immutable, props: Props) => React.ReactNode = ( - item, - props -) => { +const renderPeopleItem = (item: T.Immutable, props: Props): React.ReactNode => { switch (item.type) { case 'todo': return ( @@ -60,6 +57,17 @@ const itemToComponent: (item: T.Immutable, props: Pro } } +const shouldRenderNewItem = (item: T.Immutable, signupEmail: string) => + item.type !== 'todo' || item.todoType !== 'verifyAllEmail' || !signupEmail + +const PeopleItems = ({ + items, + props, +}: { + items: ReadonlyArray> + props: Props +}) => items.map(item => renderPeopleItem(item, props)) + function EmailVerificationBanner() { const clearJustSignedUpEmail = useSignupState(s => s.dispatch.clearJustSignedUpEmail) const signupEmail = useSignupState(s => s.justSignedUpEmail) @@ -113,13 +121,13 @@ function ResentEmailVerificationBanner() { } export function PeoplePageList(props: Props) { + const visibleNewItems = props.newItems.filter(item => shouldRenderNewItem(item, props.signupEmail)) + return ( - {props.newItems - .filter(item => item.type !== 'todo' || item.todoType !== 'verifyAllEmail' || !props.signupEmail) - .map((item): React.ReactNode => itemToComponent(item, props))} + {/*Array.from(props.wotUpdates, ([key, item]) => ( - {props.oldItems.map((item): React.ReactNode => itemToComponent(item, props))} + ) } diff --git a/shared/people/todo.tsx b/shared/people/todo.tsx index eb5b05f36bf9..9d709ec55fed 100644 --- a/shared/people/todo.tsx +++ b/shared/people/todo.tsx @@ -9,6 +9,7 @@ import * as Kb from '@/common-adapters' import {useSettingsPhoneState} from '@/stores/settings-phone' import {useSettingsEmailState} from '@/stores/settings-email' import {settingsAccountTab, settingsGitTab} from '@/constants/settings' +import type {AppTab} from '@/constants/tabs' import {useTrackerState} from '@/stores/tracker' import {useProfileState} from '@/stores/profile' import {usePeopleState, todoTypes} from '@/stores/people' @@ -24,10 +25,10 @@ type TodoOwnProps = { } const installLinkURL = 'https://keybase.io/download' -const useOnSkipTodo = (type: T.People.TodoType) => { +const useOnSkipTodo = (type?: T.People.TodoType) => { const skipTodo = usePeopleState(s => s.dispatch.skipTodo) return () => { - skipTodo(type) + type && skipTodo(type) } } @@ -53,133 +54,133 @@ function makeDefaultButtons( return result } -const AddEmailConnector = (props: TodoOwnProps) => { - const {navigateAppend, switchTab} = C.useRouterState( +const useRouterNavigation = () => + C.useRouterState( C.useShallow(s => ({ navigateAppend: s.dispatch.navigateAppend, switchTab: s.dispatch.switchTab, })) ) - const onConfirm = () => { - switchTab(C.Tabs.settingsTab) - navigateAppend(settingsAccountTab) - navigateAppend('settingsAddEmail') - } - const onDismiss = useOnSkipTodo('addEmail') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return + +type BasicTaskProps = TodoOwnProps & { + dismissLabel?: string + dismissTodoType?: T.People.TodoType + onConfirm: () => void + subText?: string } -const AddPhoneNumberConnector = (props: TodoOwnProps) => { - const {navigateAppend, switchTab} = C.useRouterState( - C.useShallow(s => ({ - navigateAppend: s.dispatch.navigateAppend, - switchTab: s.dispatch.switchTab, - })) +const BasicTask = ({ + dismissLabel, + dismissTodoType, + onConfirm, + subText, + ...props +}: BasicTaskProps) => { + const onDismiss = useOnSkipTodo(dismissTodoType) + return ( + ) +} + +type SettingsAccountTaskProps = TodoOwnProps & { + destination?: 'settingsAddEmail' | 'settingsAddPhone' + dismissTodoType?: T.People.TodoType +} + +const SettingsAccountTask = ({ + destination, + dismissTodoType, + ...props +}: SettingsAccountTaskProps) => { + const {navigateAppend, switchTab} = useRouterNavigation() const onConfirm = () => { switchTab(C.Tabs.settingsTab) navigateAppend(settingsAccountTab) - navigateAppend('settingsAddPhone') + destination && navigateAppend(destination) } - const onDismiss = useOnSkipTodo('addPhoneNumber') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return + return } -const AvatarTeamConnector = (props: TodoOwnProps) => { +type SwitchTabTaskProps = TodoOwnProps & { + dismissTodoType?: T.People.TodoType + tab: AppTab +} + +const SwitchTabTask = ({dismissTodoType, tab, ...props}: SwitchTabTaskProps) => { const switchTab = C.useRouterState(s => s.dispatch.switchTab) - const onConfirm = () => switchTab(C.Tabs.teamsTab) - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel) - return + return switchTab(tab)} /> } -const AvatarUserConnector = (props: TodoOwnProps) => { +const AvatarUserTask = (props: TodoOwnProps) => { const editAvatar = useProfileState(s => s.dispatch.editAvatar) - const onConfirm = editAvatar - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel) - return + return } -const BioConnector = (props: TodoOwnProps) => { +const BioTask = (props: TodoOwnProps) => { const myUsername = useCurrentUserState(s => s.username) const showUser = useTrackerState(s => s.dispatch.showUser) - const onConfirm = (username: string) => { - // make sure we have tracker state & profile is up to date - showUser(username, false) + const onConfirm = () => { + // Ensure tracker state exists and the profile view is up to date. + showUser(myUsername, false) } - const buttons = makeDefaultButtons(() => onConfirm(myUsername), props.confirmLabel) - return + return } -const ProofConnector = (props: TodoOwnProps) => { +const ProofTask = (props: TodoOwnProps) => { const myUsername = useCurrentUserState(s => s.username) const showUserProfile = useProfileState(s => s.dispatch.showUserProfile) - const onConfirm = showUserProfile - const onDismiss = useOnSkipTodo('proof') - const buttons = makeDefaultButtons(() => onConfirm(myUsername), props.confirmLabel, onDismiss) - return + return showUserProfile(myUsername)} /> } -const DeviceConnector = (props: TodoOwnProps) => { - const onConfirm = () => openURL(installLinkURL) - const onDismiss = useOnSkipTodo('device') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return -} +const OpenURLTask = ({ + dismissTodoType, + url, + ...props +}: TodoOwnProps & {dismissTodoType?: T.People.TodoType; url: string}) => ( + openURL(url)} /> +) -const FollowConnector = (props: TodoOwnProps) => { +const FollowTask = (props: TodoOwnProps) => { const appendPeopleBuilder = C.useRouterState(s => s.appendPeopleBuilder) - const onConfirm = () => { - appendPeopleBuilder() - } - const onDismiss = useOnSkipTodo('follow') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return -} - -const ChatConnector = (props: TodoOwnProps) => { - const switchTab = C.useRouterState(s => s.dispatch.switchTab) - const onConfirm = () => switchTab(C.Tabs.chatTab) - const onDismiss = useOnSkipTodo('chat') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return + return } -const PaperKeyConnector = (props: TodoOwnProps) => { +const PaperKeyTask = (props: TodoOwnProps) => { const navigateAppend = C.useRouterState(s => s.dispatch.navigateAppend) - const onConfirm = () => navigateAppend({name: 'deviceAdd', params: {highlight: ['paper key']}}) - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel) - return + return ( + navigateAppend({name: 'deviceAdd', params: {highlight: ['paper key']}})} + /> + ) } -const TeamConnector = (props: TodoOwnProps) => { +const TeamTask = (props: TodoOwnProps) => { const switchTab = C.useRouterState(s => s.dispatch.switchTab) const launchNewTeamWizardOrModal = useTeamsState(s => s.dispatch.launchNewTeamWizardOrModal) - const onConfirm = () => { - switchTab(C.Tabs.teamsTab) - launchNewTeamWizardOrModal() - } - const onDismiss = useOnSkipTodo('team') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return -} - -const FolderConnector = (props: TodoOwnProps) => { - const switchTab = C.useRouterState(s => s.dispatch.switchTab) - const onConfirm = () => switchTab(C.Tabs.fsTab) - const onDismiss = useOnSkipTodo('folder') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return + return ( + { + switchTab(C.Tabs.teamsTab) + launchNewTeamWizardOrModal() + }} + /> + ) } -const GitRepoConnector = (props: TodoOwnProps) => { - const {navigateAppend, switchTab} = C.useRouterState( - C.useShallow(s => ({ - navigateAppend: s.dispatch.navigateAppend, - switchTab: s.dispatch.switchTab, - })) - ) +const GitRepoTask = (props: TodoOwnProps) => { + const {navigateAppend, switchTab} = useRouterNavigation() const onConfirm = (isTeam: boolean) => { if (C.isMobile) { navigateAppend(settingsGitTab) @@ -207,15 +208,7 @@ const GitRepoConnector = (props: TodoOwnProps) => { return } -const TeamShowcaseConnector = (props: TodoOwnProps) => { - const switchTab = C.useRouterState(s => s.dispatch.switchTab) - const onConfirm = () => switchTab(C.Tabs.teamsTab) - const onDismiss = useOnSkipTodo('teamShowcase') - const buttons = makeDefaultButtons(onConfirm, props.confirmLabel, onDismiss) - return -} - -const VerifyAllEmailConnector = (props: TodoOwnProps) => { +const VerifyAllEmailTask = (props: TodoOwnProps) => { const {addingEmail, editEmail} = useSettingsEmailState( C.useShallow(s => ({ addingEmail: s.addingEmail, @@ -227,12 +220,7 @@ const VerifyAllEmailConnector = (props: TodoOwnProps) => { editEmail({email, verify: true}) setResentEmail(email) } - const {navigateAppend, switchTab} = C.useRouterState( - C.useShallow(s => ({ - navigateAppend: s.dispatch.navigateAppend, - switchTab: s.dispatch.switchTab, - })) - ) + const {navigateAppend, switchTab} = useRouterNavigation() const onManage = () => { switchTab(C.Tabs.settingsTab) navigateAppend(settingsAccountTab) @@ -264,14 +252,9 @@ const VerifyAllEmailConnector = (props: TodoOwnProps) => { return } -const VerifyAllPhoneNumberConnector = (props: TodoOwnProps) => { +const VerifyAllPhoneNumberTask = (props: TodoOwnProps) => { const resendVerificationForPhone = useSettingsPhoneState(s => s.dispatch.resendVerificationForPhone) - const {navigateAppend, switchTab} = C.useRouterState( - C.useShallow(s => ({ - navigateAppend: s.dispatch.navigateAppend, - switchTab: s.dispatch.switchTab, - })) - ) + const {navigateAppend, switchTab} = useRouterNavigation() const onConfirm = (phoneNumber: string) => { resendVerificationForPhone(phoneNumber) navigateAppend('settingsVerifyPhone') @@ -302,14 +285,9 @@ const VerifyAllPhoneNumberConnector = (props: TodoOwnProps) => { return } -const LegacyEmailVisibilityConnector = (props: TodoOwnProps) => { +const LegacyEmailVisibilityTask = (props: TodoOwnProps) => { const editEmail = useSettingsEmailState(s => s.dispatch.editEmail) - const {navigateAppend, switchTab} = C.useRouterState( - C.useShallow(s => ({ - navigateAppend: s.dispatch.navigateAppend, - switchTab: s.dispatch.switchTab, - })) - ) + const {navigateAppend, switchTab} = useRouterNavigation() const onConfirm = (email: string) => { switchTab(C.Tabs.settingsTab) navigateAppend(settingsAccountTab) @@ -342,39 +320,41 @@ const LegacyEmailVisibilityConnector = (props: TodoOwnProps) => { const TaskChooser = (props: TodoOwnProps) => { switch (props.todoType) { case todoTypes.addEmail: - return + return case todoTypes.addPhoneNumber: - return + return ( + + ) case todoTypes.avatarTeam: - return + return case todoTypes.avatarUser: - return + return case todoTypes.bio: - return + return case todoTypes.proof: - return + return case todoTypes.device: - return + return case todoTypes.follow: - return + return case todoTypes.chat: - return + return case todoTypes.paperkey: - return + return case todoTypes.team: - return + return case todoTypes.folder: - return + return case todoTypes.gitRepo: - return + return case todoTypes.legacyEmailVisibility: - return + return case todoTypes.teamShowcase: - return + return case todoTypes.verifyAllEmail: - return + return case todoTypes.verifyAllPhoneNumber: - return + return default: return null }