main

mattermost/focalboard

Last updated at: 29/12/2023 09:46

sidebarCategories.tsx

TLDR

This file, sidebarCategories.tsx, is a component in the Demo Projects project. It renders a tour step for the sidebar categories feature. The component includes logic to handle user interactions and dispatch actions to update user preferences.

Methods

None

Classes

None

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {useEffect} from 'react'

import {right} from '@popperjs/core'

import {FormattedMessage} from 'react-intl'

import {useMeasurePunchouts} from '../../tutorial_tour_tip/hooks'
import TourTipRenderer from '../tourTipRenderer/tourTipRenderer'
import {TOUR_BOARD, TOUR_SIDEBAR, SidebarTourSteps, FINISHED} from '../index'
import {useAppDispatch, useAppSelector} from '../../../store/hooks'
import {
    getMe,
    getOnboardingTourCategory,
    getOnboardingTourStep,
    patchProps,
} from '../../../store/users'
import {IUser, UserConfigPatch} from '../../../user'
import mutator from '../../../mutator'
import {Constants} from '../../../constants'

import './sidebarCategories.scss'

const SidebarCategoriesTourStep = (): JSX.Element | null => {
    const title = (
        <FormattedMessage
            id='SidebarTour.SidebarCategories.Title'
            defaultMessage='Sidebar categories'
        />
    )
    const screen = (
        <div>
            <FormattedMessage
                id='SidebarTour.SidebarCategories.Body'
                defaultMessage='All your boards are now organized under your new sidebar. No more switching between workspaces. One-time custom categories based on your prior workspaces may have automatically been created for you as part of your v7.2 upgrade. These can be removed or edited to your preference. '
            />
            <a
                href='https://docs.mattermost.com/welcome/whats-new-in-v72.html'
                target='_blank'
                rel='noopener noreferrer'
            >
                <FormattedMessage
                    id='SidebarTour.SidebarCategories.Link'
                    defaultMessage='Learn more'
                />
            </a>
        </div>
    )

    const punchout = useMeasurePunchouts(['.SidebarCategory'], [])

    const me = useAppSelector<IUser|null>(getMe)
    const dispatch = useAppDispatch()
    const onboardingTourCategory = useAppSelector(getOnboardingTourCategory)
    const onboardingTourStep = useAppSelector(getOnboardingTourStep)

    useEffect(() => {
        async function task() {
            if (!me) {
                return
            }

            const should = onboardingTourCategory === TOUR_BOARD &&
                           onboardingTourStep === FINISHED.toString()

            if (!should) {
                return
            }

            const patch: UserConfigPatch = {}
            patch.updatedFields = {}
            patch.updatedFields.tourCategory = TOUR_SIDEBAR
            patch.updatedFields.onboardingTourStep = SidebarTourSteps.SIDE_BAR.toString()
            patch.updatedFields.lastWelcomeVersion = Constants.versionString

            const updatedProps = await mutator.patchUserConfig(me.id, patch)
            if (updatedProps) {
                dispatch(patchProps(updatedProps))
            }
        }

        // this hack is needed to allow performing async task in useEffect
        task()
    }, [])

    return (
        <TourTipRenderer
            key='SidebardCategoriesTourStep'
            requireCard={false}
            category={TOUR_SIDEBAR}
            step={SidebarTourSteps.SIDE_BAR}
            screen={screen}
            title={title}
            punchout={punchout}
            classname='SidebarCategories'
            telemetryTag='tourPoint4a'
            placement={right}
            hideBackdrop={false}
            showForce={true}
        />
    )
}

export default SidebarCategoriesTourStep