import { useEffect } from 'react'; import { useFieldArray, useForm } from 'react-hook-form'; import { Alert, AlertDescription, AlertIcon, AlertTitle, Button, IconButton, Input, Switch } from '@chakra-ui/react'; import { IoOpenOutline } from '@react-icons/all-files/io5/IoOpenOutline'; import { IoRemove } from '@react-icons/all-files/io5/IoRemove'; import { Alias } from 'ontime-types'; import { logAxiosError } from '../../../common/api/apiUtils'; import { postAliases } from '../../../common/api/ontimeApi'; import TooltipActionBtn from '../../../common/components/buttons/TooltipActionBtn'; import useAliases from '../../../common/hooks-query/useAliases'; import { useEmitLog } from '../../../common/stores/logger'; import { handleLinks } from '../../../common/utils/linkUtils'; import ModalLoader from '../modal-loader/ModalLoader'; import { inputProps } from '../modalHelper'; import ModalLink from '../ModalLink'; import OntimeModalFooter from '../OntimeModalFooter'; import style from './SettingsModal.module.scss'; const aliasesDocsUrl = 'https://ontime.gitbook.io/v2/features/url-aliases'; // we wrap the array in an object to be simplify react-hook-form type Aliases = { aliases: Alias[]; }; export default function AliasesForm() { const { data, status, isFetching, refetch } = useAliases(); const { emitError } = useEmitLog(); const { control, handleSubmit, register, reset, formState: { isSubmitting, isDirty, isValid }, } = useForm({ defaultValues: { aliases: data }, values: { aliases: data || [] }, resetOptions: { keepDirtyValues: true, }, }); const { fields, append, remove } = useFieldArray({ name: 'aliases', control, }); useEffect(() => { if (data) { reset({ aliases: data }); } }, [data, reset]); const onSubmit = async (formData: Aliases) => { try { await postAliases(formData.aliases); } catch (error) { logAxiosError('Error saving aliases', error); } finally { await refetch(); } }; const onReset = () => { reset({ aliases: data }); }; const addNew = () => { if (fields.length > 20) { emitError('Maximum amount of aliases reached (20)'); return; } append({ enabled: false, alias: '', pathAndParams: '', }); }; const disableInputs = status === 'pending'; const hasTooManyOptions = fields.length >= 20; if (isFetching) { return ; } console.log({ fields }); return (
URL Aliases Custom aliases allow providing a short name for any ontime URL.
It serves two primary purposes:
- Providing dynamic URLs for automation or unattended screens
- Simplifying complex URLs For more information, see the docs
    {fields.map((alias, index) => { return (
  • remove(index)} aria-label='delete' size='xs' icon={} colorScheme='red' isDisabled={disableInputs} data-testid={`field__delete_${index}`} /> handleLinks(event, alias.alias)} tooltip='Test alias' aria-label='Test alias' size='xs' variant='ontime-ghost-on-light' icon={} colorScheme='red' isDisabled={disableInputs} data-testid={`field__test_${index}`} />
  • ); })}
); }