import React, { Fragment, useState, useEffect, Dispatch, SetStateAction } from 'react' import { useTranslation } from 'react-i18next' import { Container, Grid } from 'aws-northstar/layouts' import { Button, Input, Heading, Modal, Text } from 'aws-northstar/components' import type { FlashbarMessage } from 'aws-northstar/components/Flashbar' import { Cancel, SaveAlt } from '@material-ui/icons' import RepositoryFactory from '../repositories/RepositoryFactory' import type { Vocabulary } from '../repositories/VocabulariesRepository' type VocabularyAddProps = { handleNotification: (message: FlashbarMessage) => void handleIsLoading: Dispatch> } const VocabularyAdd: React.FC = ({ handleNotification, handleIsLoading }: VocabularyAddProps) => { const { t: transCommon } = useTranslation('common') const { t: transVocabularies } = useTranslation('vocabularies') const [isMounted, setIsMounted] = useState(false) const [isModalOpen, setIsModalOpen] = useState(false) const [inputList, setInputList] = useState([ { phrase: '', display: '' } ]) const [inputErrorList, setInputErrorList] = useState([ { phrase: '', display: '' } ]) const vocabularies = RepositoryFactory.get('vocabularies') useEffect(() => { setIsMounted(true) }, []) const validateInputs = (): boolean => { const errors: Vocabulary[] = [] inputList.map((input, index) => { errors.push({ phrase: '', display: '' }) if (input['phrase'].length > 256) { errors[index]['phrase'] = transVocabularies('invalidPhraseOver256Chars') } else if (input['phrase'].length === 0) { errors[index]['phrase'] = transVocabularies('invalidPhraseRequired') } else if (/^[ぁ-んー]*$/.test(input['phrase']) === false) { errors[index]['phrase'] = transVocabularies('invalidPhraseNotKana') } if (input['display'].length > 256) { errors[index]['display'] = transVocabularies( 'invalidDisplayOver256Chars' ) } else if (input['display'].length === 0) { errors[index]['display'] = transVocabularies('invalidDisplayRequired') } }) setInputErrorList(errors) return ( errors.some( (error) => error['phrase'] !== '' || error['display'] !== '' ) === false ) } useEffect(() => { if (isMounted) validateInputs() }, [inputList]) const handleChangeInput =

( name: P, value: Vocabulary[P], index: number ) => { const list = [...inputList] list[index][name] = value setInputList(list) } const handleClickAddButton = () => { setInputErrorList([...inputErrorList, { phrase: '', display: '' }]) setInputList([...inputList, { phrase: '', display: '' }]) } const handleClickRemoveButton = (index: number) => { let list = [...inputList] list.splice(index, 1) setInputList(list) list = [...inputErrorList] list.splice(index, 1) setInputErrorList(list) } const handleClickModalOpenButton = () => { const isValid = validateInputs() if (isValid) setIsModalOpen(true) } const handleClickSaveButton = async () => { handleIsLoading(true) await vocabularies.add(inputList) setInputList([]) setIsModalOpen(false) handleIsLoading(false) handleNotification({ header: transVocabularies('addRequestSucceeded'), content: transVocabularies('addRequestSucceededDescription'), type: 'success', dismissible: true }) } return ( setIsModalOpen(false)} > {transVocabularies('addConfirm')}


{inputList.length === 0 ? (
{transVocabularies('notExists')}
) : ( <> {transVocabularies('phrase')} {transVocabularies('display')} )} {inputList.map((value, index) => ( { handleChangeInput('phrase', value, index) }} placeholder="えーだぶりゅーえす" type="text" value={value.phrase} invalid={inputErrorList[index]['phrase'] !== ''} /> {inputErrorList[index]['phrase']} { handleChangeInput('display', value, index) }} placeholder="AWS" type="text" value={value.display} invalid={inputErrorList[index]['display'] !== ''} /> {inputErrorList[index]['display']} ))}
) } export default VocabularyAdd