import { ArrowOutwardRounded, DeleteRounded } from '@mui/icons-material' import clsx from 'clsx' import { ComponentType, useState } from 'react' import { useForm } from 'react-hook-form' import { useTranslation } from 'react-i18next' import { DiscordNotifierRegistration, ModalProps } from '@dao-dao/types' import { useDao } from '../../contexts' import { Button, ButtonLink } from '../buttons' import { CopyToClipboard } from '../CopyToClipboard' import { IconButton, IconButtonLink } from '../icon_buttons' import { InputErrorMessage, InputLabel, TextInput } from '../inputs' import { Loader } from '../logo' import { Modal } from './Modal' export type DiscordNotifierRegistrationForm = { clientId: string clientSecret: string botToken: string } export type DiscordNotifierConfigureModalProps = Pick< ModalProps, 'visible' | 'onClose' > & { setup: (data: DiscordNotifierRegistrationForm) => void doRegister: () => void registrations: DiscordNotifierRegistration[] formDefaults?: DiscordNotifierRegistrationForm loadingRegistration: boolean finishingRegistration: boolean onDelete: (id: string) => Promise connected: boolean redirectUri: string refreshing: boolean ConnectWallet: ComponentType } export const DiscordNotifierConfigureModal = ({ setup, doRegister, registrations, formDefaults, loadingRegistration, finishingRegistration, onDelete, connected, redirectUri, refreshing, ConnectWallet, onClose, ...props }: DiscordNotifierConfigureModalProps) => { const { t } = useTranslation() const { name: daoName } = useDao() const [registering, setRegistering] = useState(false) const { watch, register, handleSubmit, formState: { errors }, } = useForm({ defaultValues: formDefaults, }) const canAddBot = !!( watch('clientId') && watch('clientSecret') && watch('botToken') ) return ( { setRegistering(false) onClose?.() }} > {connected ? ( registering ? (

{t('info.discordNotifierSetupExplanation')}

{t('button.goToDiscordDeveloperPortal')}

{t('info.addDiscordNotifierRedirectInstructions')}

) : finishingRegistration ? ( <>

{t('info.discordNotifierFinishSetupExplanation')}

) : ( <>

{t('info.discordNotifierBeginSetupExplanation')}

) ) : ( )} {!registering && !finishingRegistration && (registrations.length > 0 || refreshing) && ( <>

{t('title.yourNotifiers')}

{t('info.otherNotifiersNotShown')}

{registrations.map(({ id, guild, channel }) => (
{!!guild.iconHash && (
)}

{/* eslint-disable-next-line i18next/no-literal-string */} {guild.name} • #{channel.name}

onDelete(id)} variant="ghost" />
))}
{refreshing && } )}
) }