/* SPDX-FileCopyrightText: 2021 The HedgeDoc developers (see AUTHORS file) SPDX-License-Identifier: AGPL-3.0-only */ import { DateTime } from 'luxon' import React, { ChangeEvent, FormEvent, Fragment, useCallback, useEffect, useMemo, useState } from 'react' import { Button, Card, Col, Form, ListGroup, Modal, Row } from 'react-bootstrap' import { Trans, useTranslation } from 'react-i18next' import { deleteAccessToken, getAccessTokenList, postNewAccessToken } from '../../../api/tokens' import { AccessToken } from '../../../api/tokens/types' import { CopyableField } from '../../common/copyable/copyable-field/copyable-field' import { IconButton } from '../../common/icon-button/icon-button' import { CommonModal } from '../../common/modals/common-modal' import { DeletionModal } from '../../common/modals/deletion-modal' import { ShowIf } from '../../common/show-if/show-if' export const ProfileAccessTokens: React.FC = () => { const { t } = useTranslation() const [error, setError] = useState(false) const [showAddedModal, setShowAddedModal] = useState(false) const [showDeleteModal, setShowDeleteModal] = useState(false) const [accessTokens, setAccessTokens] = useState([]) const [newTokenLabel, setNewTokenLabel] = useState('') const [newTokenSecret, setNewTokenSecret] = useState('') const [selectedForDeletion, setSelectedForDeletion] = useState(0) const addToken = useCallback((event: FormEvent) => { event.preventDefault() postNewAccessToken(newTokenLabel) .then(token => { setNewTokenSecret(token.secret) setShowAddedModal(true) setNewTokenLabel('') }) .catch(error => { console.error(error) setError(true) }) }, [newTokenLabel]) const deleteToken = useCallback(() => { deleteAccessToken(selectedForDeletion) .then(() => { setSelectedForDeletion(0) }) .catch(error => { console.error(error) setError(true) }) .finally(() => { setShowDeleteModal(false) }) }, [selectedForDeletion, setError]) const selectForDeletion = useCallback((timestamp: number) => { setSelectedForDeletion(timestamp) setShowDeleteModal(true) }, []) const newTokenSubmittable = useMemo(() => { return newTokenLabel.trim().length > 0 }, [newTokenLabel]) useEffect(() => { getAccessTokenList() .then(tokens => { setError(false) setAccessTokens(tokens) }) .catch(err => { console.error(err) setError(true) }) }, [showAddedModal]) return (


{ accessTokens.map((token) => { return ( { token.label } selectForDeletion(token.created)}/> ) }) }
) => setNewTokenLabel(event.target.value)} isValid={newTokenSubmittable} required />
setShowAddedModal(false)} titleI18nKey='profile.modal.addedAccessToken.title'>
setShowDeleteModal(false)} titleI18nKey={'profile.modal.deleteAccessToken.title'}>
) }