import { useCallback, useEffect, useMemo } from 'react'; import { Controller, useForm, SubmitHandler } from 'react-hook-form'; import { Domain } from 'gql-client'; import { Typography, Select, Option, } from '@snowballtools/material-tailwind-react-fork'; import { useGQLClient } from 'context/GQLClientContext'; import { Modal } from 'components/shared/Modal'; import { Button } from 'components/shared/Button'; import { Input } from 'components/shared/Input'; import { useToast } from 'components/shared/Toast'; const DEFAULT_REDIRECT_OPTIONS = ['none']; interface EditDomainDialogProp { domains: Domain[]; open: boolean; handleOpen: () => void; domain: Domain; branches: string[]; onUpdate: () => Promise; } type EditDomainValues = { name: string; branch: string; redirectedTo: string; }; const EditDomainDialog = ({ domains, open, handleOpen, domain, branches, onUpdate, }: EditDomainDialogProp) => { const client = useGQLClient(); const { toast, dismiss } = useToast(); const getRedirectUrl = (domain: Domain) => { const redirectDomain = domain.redirectTo; if (redirectDomain !== null) { return redirectDomain?.name; } else { return 'none'; } }; const redirectOptions = useMemo(() => { const domainNames = domains .filter((domainData) => domainData.id !== domain.id) .map((domain) => domain.name); return ['none', ...domainNames]; }, [domain, domains]); const domainRedirectedFrom = useMemo(() => { return domains.find( (domainData) => domainData.redirectTo?.id === domain.id, ); }, [domains, domain]); const isDisableDropdown = useMemo(() => { return domainRedirectedFrom !== undefined; }, [domain, domains]); const { handleSubmit, register, control, watch, reset, formState: { isValid, isDirty }, } = useForm({ defaultValues: { name: domain.name, branch: domain.branch, redirectedTo: getRedirectUrl(domain), }, }); const updateDomainHandler: SubmitHandler = useCallback( async (data) => { const domainRedirectTo = domains.find( (domainData) => data.redirectedTo === domainData.name, ); const updates = { name: data.name ? data.name : domain.name, branch: data.branch ? data.branch : domain.branch, redirectToId: domainRedirectTo ? domainRedirectTo.id : null, }; const { updateDomain } = await client.updateDomain(domain.id, updates); if (updateDomain) { await onUpdate(); toast({ id: 'domain_id_updated', title: `Domain ${domain.name} has been updated`, variant: 'success', onDismiss: dismiss, }); } else { reset(); toast({ id: 'domain_id_error_update', title: `Error updating domain ${domain.name}`, variant: 'error', onDismiss: dismiss, }); } handleOpen(); }, [client, domains, domain], ); useEffect(() => { reset({ name: domain.name, branch: domain.branch, redirectedTo: getRedirectUrl(domain), }); }, [domain]); return ( Edit domain
Domain name Redirect to ( )} /> {isDisableDropdown && (
^
Domain “ {domainRedirectedFrom ? domainRedirectedFrom.name : ''}” redirects to this domain so you can not redirect this doman further.
)} Git branch Boolean(branches.length) ? branches.includes(value) : true, })} disabled={ !Boolean(branches.length) || watch('redirectedTo') !== DEFAULT_REDIRECT_OPTIONS[0] } /> {!isValid && ( We couldn't find this branch in the connected Git repository. )}
); }; export default EditDomainDialog;