main

mattermost/focalboard

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

createCategory.tsx

TLDR

This file (createCategory.tsx) is a React component that renders a dialog to create or update a category.

Methods

There are no methods in this file.

Classes

There are no classes in this file.

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.

import React, {useState, KeyboardEvent} from 'react'

import {useIntl} from 'react-intl'

import {IUser} from '../../user'
import {Category} from '../../store/sidebar'
import {getCurrentTeam} from '../../store/teams'
import mutator from '../../mutator'
import {useAppSelector} from '../../store/hooks'
import {
    getMe,
} from '../../store/users'

import {Utils} from '../../utils'

import Dialog from '../dialog'
import Button from '../../widgets/buttons/button'

import './createCategory.scss'
import CloseCircle from '../../widgets/icons/closeCircle'

type Props = {
    boardCategoryId?: string
    renameModal?: boolean
    initialValue?: string
    onClose: () => void
    title: JSX.Element
}

const CreateCategory = (props: Props): JSX.Element => {
    const intl = useIntl()
    const me = useAppSelector<IUser|null>(getMe)
    const team = useAppSelector(getCurrentTeam)
    const teamID = team?.id || ''
    const placeholder = intl.formatMessage({id: 'Categories.CreateCategoryDialog.Placeholder', defaultMessage: 'Name your category'})
    const cancelText = intl.formatMessage({id: 'Categories.CreateCategoryDialog.CancelText', defaultMessage: 'Cancel'})
    const createText = intl.formatMessage({id: 'Categories.CreateCategoryDialog.CreateText', defaultMessage: 'Create'})
    const updateText = intl.formatMessage({id: 'Categories.CreateCategoryDialog.UpdateText', defaultMessage: 'Update'})

    const [name, setName] = useState(props.initialValue || '')

    const handleKeypress = (e: KeyboardEvent) => {
        if (e.key === 'Enter') {
            onCreate(name)
        }
    }

    const onCreate = async (categoryName: string) => {
        if (!me) {
            Utils.logError('me not initialized')
            return
        }

        if (props.renameModal) {
            const category: Category = {
                name: categoryName,
                id: props.boardCategoryId,
                userID: me.id,
                teamID,
            } as Category

            await mutator.updateCategory(category)
        } else {
            const category: Category = {
                name: categoryName,
                userID: me.id,
                teamID,
            } as Category

            await mutator.createCategory(category)
        }

        props.onClose()
    }

    return (
        <Dialog
            title={props.title}
            className='CreateCategoryModal'
            onClose={props.onClose}
        >
            <div className='CreateCategory'>
                <div className='inputWrapper'>
                    <input
                        className='categoryNameInput'
                        type='text'
                        placeholder={placeholder}
                        value={name}
                        onChange={(e) => setName(e.target.value)}
                        autoFocus={true}
                        maxLength={100}
                        onKeyUp={handleKeypress}
                    />
                    {
                        Boolean(name) &&
                        <div
                            className='clearBtn inputWrapper__close-wrapper'
                            onClick={() => setName('')}
                        >
                            <CloseCircle/>
                        </div>
                    }
                </div>
                <div className='createCategoryActions'>
                    <Button
                        size={'medium'}
                        danger={true}
                        onClick={props.onClose}
                    >
                        {cancelText}
                    </Button>
                    <Button
                        size={'medium'}
                        filled={Boolean(name.trim())}
                        onClick={() => onCreate(name.trim())}
                        disabled={!(name.trim())}
                    >
                        {props.initialValue ? updateText : createText}
                    </Button>
                </div>
            </div>
        </Dialog>
    )
}

export default CreateCategory