import { DeleteOutlined } from '@ant-design/icons'; import { Button, Checkbox, Input, Modal, Space, Table, Typography } from 'antd'; import React, { useContext, useEffect, useState } from 'react'; import FormStatusIndicator from '../components/config/form-status-indicator'; import { API_EXTERNAL_ACTIONS, postConfigUpdateToAPI, RESET_TIMEOUT, } from '../utils/config-constants'; import { createInputStatus, STATUS_ERROR, STATUS_SUCCESS } from '../utils/input-statuses'; import { ServerStatusContext } from '../utils/server-status-context'; import isValidUrl, { DEFAULT_TEXTFIELD_URL_PATTERN } from '../utils/urls'; const { Title, Paragraph } = Typography; let resetTimer = null; interface Props { onCancel: () => void; onOk: any; // todo: make better type visible: boolean; } function NewActionModal(props: Props) { const { onOk, onCancel, visible } = props; const [actionUrl, setActionUrl] = useState(''); const [actionTitle, setActionTitle] = useState(''); const [actionDescription, setActionDescription] = useState(''); const [actionIcon, setActionIcon] = useState(''); const [actionColor, setActionColor] = useState(''); const [openExternally, setOpenExternally] = useState(false); function save() { onOk(actionUrl, actionTitle, actionDescription, actionIcon, actionColor, openExternally); setActionUrl(''); setActionTitle(''); setActionDescription(''); setActionIcon(''); setActionColor(''); setOpenExternally(false); } function canSave(): Boolean { try { const validationObject = new URL(actionUrl); if (validationObject.protocol !== 'https:') { return false; } } catch { return false; } return isValidUrl(actionUrl) && actionTitle !== ''; } const okButtonProps = { disabled: !canSave(), }; const onOpenExternallyChanged = checkbox => { setOpenExternally(checkbox.target.checked); }; return (
Add the URL for the external action you want to present.{' '} Only HTTPS urls are supported.

Read more about external actions.

setActionUrl(input.currentTarget.value.trim())} type="url" pattern={DEFAULT_TEXTFIELD_URL_PATTERN} />

setActionTitle(input.currentTarget.value)} />

setActionDescription(input.currentTarget.value)} />

setActionIcon(input.currentTarget.value)} />

setActionColor(input.currentTarget.value)} /> Optional background color of the action button.

Open in a new tab instead of within your page.
); } export default function Actions() { const serverStatusData = useContext(ServerStatusContext); const { serverConfig, setFieldInConfigState } = serverStatusData || {}; const { externalActions } = serverConfig; const [actions, setActions] = useState([]); const [isModalVisible, setIsModalVisible] = useState(false); const [submitStatus, setSubmitStatus] = useState(null); const resetStates = () => { setSubmitStatus(null); resetTimer = null; clearTimeout(resetTimer); }; useEffect(() => { setActions(externalActions || []); }, [externalActions]); async function save(actionsData) { await postConfigUpdateToAPI({ apiPath: API_EXTERNAL_ACTIONS, data: { value: actionsData }, onSuccess: () => { setFieldInConfigState({ fieldName: 'externalActions', value: actionsData, path: '' }); setSubmitStatus(createInputStatus(STATUS_SUCCESS, 'Updated.')); resetTimer = setTimeout(resetStates, RESET_TIMEOUT); }, onError: (message: string) => { console.log(message); setSubmitStatus(createInputStatus(STATUS_ERROR, message)); resetTimer = setTimeout(resetStates, RESET_TIMEOUT); }, }); } async function handleDelete(action) { const actionsData = [...actions]; const index = actions.findIndex(item => item.url === action.url); actionsData.splice(index, 1); try { setActions(actionsData); save(actionsData); } catch (error) { console.error(error); } } async function handleSave( url: string, title: string, description: string, icon: string, color: string, openExternally: boolean, ) { try { const actionsData = [...actions]; const updatedActions = actionsData.concat({ url, title, description, icon, color, openExternally, }); setActions(updatedActions); await save(updatedActions); } catch (error) { console.error(error); } } const showCreateModal = () => { setIsModalVisible(true); }; const handleModalSaveButton = ( actionUrl: string, actionTitle: string, actionDescription: string, actionIcon: string, actionColor: string, openExternally: boolean, ) => { setIsModalVisible(false); handleSave(actionUrl, actionTitle, actionDescription, actionIcon, actionColor, openExternally); }; const handleModalCancelButton = () => { setIsModalVisible(false); }; const columns = [ { title: '', key: 'delete', render: (text, record) => (