/*! * Copyright (c) 2025 PLANKA Software GmbH * Licensed under the Fair Use License: https://github.com/plankanban/planka/blob/master/LICENSE.md */ import React, { useCallback, useMemo, useState } from 'react'; import PropTypes from 'prop-types'; import { useDispatch, useSelector } from 'react-redux'; import { useTranslation } from 'react-i18next'; import { Button, Icon, Input, Message } from 'semantic-ui-react'; import { Popup } from '../../../../lib/custom-ui'; import selectors from '../../../../selectors'; import entryActions from '../../../../entry-actions'; import { useSteps } from '../../../../hooks'; import ConfirmationStep from '../../ConfirmationStep'; import styles from './ApiKeyStep.module.scss'; const StepTypes = { REGENERATE: 'REGENERATE', DELETE: 'DELETE', }; const ApiKeyStep = React.memo(({ userId, onBack, onClose }) => { const selectUserById = useMemo(() => selectors.makeSelectUserById(), []); const user = useSelector((state) => selectUserById(state, userId)); const dispatch = useDispatch(); const [t] = useTranslation(); const [step, openStep, handleBack] = useSteps(); const [isCopied, setIsCopied] = useState(false); const handleGenerateClick = useCallback(() => { if (user.apiKeyPrefix) { openStep(StepTypes.REGENERATE); } else { dispatch(entryActions.createUserApiKey(userId)); } }, [userId, user.apiKeyPrefix, dispatch, openStep]); const handleRegenerateConfirm = useCallback(() => { dispatch(entryActions.createUserApiKey(userId)); handleBack(); }, [userId, dispatch, handleBack]); const handleDeleteConfirm = useCallback(() => { dispatch(entryActions.deleteUserApiKey(userId)); onClose(); }, [userId, onClose, dispatch]); const handleDeleteClick = useCallback(() => { openStep(StepTypes.DELETE); }, [openStep]); const handleCopyClick = useCallback(() => { if (isCopied) { return; } navigator.clipboard.writeText(user.apiKeyState.value); setIsCopied(true); setTimeout(() => { setIsCopied(false); }, 1000); }, [user.apiKeyState.value, isCopied]); if (step) { switch (step.type) { case StepTypes.REGENERATE: return ( ); case StepTypes.DELETE: return ( ); default: } } return ( <> {t('common.apiKey', { context: 'title', })} {user.apiKeyPrefix ? ( <> {!user.apiKeyState.isCreating && (user.apiKeyState.value ? ( <>
) : ( ))}