import { WarningRounded } from '@mui/icons-material' import clsx from 'clsx' import { useEffect, useMemo, useRef } from 'react' import { useTranslation } from 'react-i18next' import { CreateDaoContext } from '@dao-dao/types' import { FormCheckbox } from '../../../inputs/Checkbox' import { DaoCreateConfigInputCard } from '../DaoCreateConfigInputCard' export const CreateDaoVoting = ({ form: { formState: { errors }, register, watch, setValue, getValues, }, commonVotingConfig: { items: commonVotingConfigItems, advancedItems: commonVotingConfigAdvancedItems, }, creator, proposalModuleDaoCreationAdapters, SuspenseLoader, }: CreateDaoContext) => { const { t } = useTranslation() const newDao = watch() const { creator: { data: creatorData }, proposalModuleAdapters, advancedVotingConfigEnabled, votingConfig, } = newDao // Combine all advanced warnings i18n keys into single array. const advancedWarningI18nKeys = useMemo( () => [ // General warning. 'info.advancedVotingConfigWarning', // Specific adapter warnings. ...(creator.votingConfig.advancedWarningI18nKeys ?? []), ...proposalModuleDaoCreationAdapters.flatMap( ({ extraVotingConfig: { advancedWarningI18nKeys = [] } = {} }) => advancedWarningI18nKeys ), ], [ proposalModuleDaoCreationAdapters, creator.votingConfig.advancedWarningI18nKeys, ] ) const advancedConfigurationContainerRef = useRef(null) // When enabling advanced configuration, scroll to container. useEffect(() => { if (advancedVotingConfigEnabled) { advancedConfigurationContainerRef.current?.scrollIntoView({ behavior: 'smooth', }) } }, [advancedVotingConfigEnabled]) return ( <>

{t('title.votingConfiguration')}

{creator.votingConfig.items.map( ( { onlyDisplayCondition, Icon, nameI18nKey, descriptionI18nKey, Input, getInputError, }, index ) => // If has display condition, check it. Otherwise display. (onlyDisplayCondition?.(newDao) ?? true) && ( fieldNameOrNames === undefined ? getValues() : typeof fieldNameOrNames === 'string' ? getValues( ('creator.data.' + fieldNameOrNames) as `creator.data.${string}` ) : getValues( fieldNameOrNames.map( (fieldName) => ('creator.data.' + fieldName) as `creator.data.${string}` ) ) } newDao={newDao} register={(fieldName, options) => register( ('creator.data.' + fieldName) as `creator.data.${string}`, options ) } setValue={(fieldName, value, options) => setValue( ('creator.data.' + fieldName) as `creator.data.${string}`, value, { // Validate by default. shouldValidate: true, ...options, } ) } watch={(fieldName) => watch( ('creator.data.' + fieldName) as `creator.data.${string}` ) } /> } name={t(nameI18nKey)} /> ) )} {proposalModuleDaoCreationAdapters.flatMap( ({ extraVotingConfig: { items = [] } = {} }, index) => items.map( ( { onlyDisplayCondition, Icon, nameI18nKey, descriptionI18nKey, Input, getInputError, }, itemIndex ) => // If has display condition, check it. Otherwise display. (onlyDisplayCondition?.(newDao) ?? true) && ( fieldNameOrNames === undefined ? getValues() : typeof fieldNameOrNames === 'string' ? getValues( (`proposalModuleAdapters.${index}.data.` + fieldNameOrNames) as `proposalModuleAdapters.${number}.data.${string}` ) : getValues( fieldNameOrNames.map( (fieldName) => (`proposalModuleAdapters.${index}.data.` + fieldName) as `proposalModuleAdapters.${number}.data.${string}` ) ) } newDao={newDao} register={(fieldName, options) => register( (`proposalModuleAdapters.${index}.data.` + fieldName) as `proposalModuleAdapters.${number}.data.${string}`, options ) } setValue={(fieldName, value, options) => setValue( (`proposalModuleAdapters.${index}.data.` + fieldName) as `proposalModuleAdapters.${number}.data.${string}`, value, { // Validate by default. shouldValidate: true, ...options, } ) } watch={(fieldName) => watch( (`proposalModuleAdapters.${index}.data.` + fieldName) as `proposalModuleAdapters.${number}.data.${string}` ) } /> } name={t(nameI18nKey)} /> ) ) )} {commonVotingConfigItems.map( ( { onlyDisplayCondition, Icon, nameI18nKey, descriptionI18nKey, Input, getInputError, }, index ) => // If has display condition, check it. Otherwise display. (onlyDisplayCondition?.(newDao) ?? true) && ( fieldNameOrNames === undefined ? getValues() : typeof fieldNameOrNames === 'string' ? getValues( ('votingConfig.' + fieldNameOrNames) as `votingConfig.${string}` ) : getValues( fieldNameOrNames.map( (fieldName) => ('votingConfig.' + fieldName) as `votingConfig.${string}` ) ) } newDao={newDao} register={(fieldName, options) => register(('votingConfig.' + fieldName) as any, options) } setValue={(fieldName, value, options) => setValue(('votingConfig.' + fieldName) as any, value, { // Validate by default. shouldValidate: true, ...options, }) } watch={(fieldName) => watch(('votingConfig.' + fieldName) as any) } /> } name={t(nameI18nKey)} /> ) )}

{t('title.advancedConfiguration')}

setValue( 'advancedVotingConfigEnabled', !advancedVotingConfigEnabled ) } > {t('form.showAdvancedSettings')}

{advancedWarningI18nKeys.length > 0 && (
{advancedWarningI18nKeys.map((advancedWarningI18nKey, index) => (

{t('title.watchOut')}

{t(advancedWarningI18nKey)}

))}
)}
{creator.votingConfig.advancedItems?.map( ( { onlyDisplayCondition, Icon, nameI18nKey, descriptionI18nKey, Input, getInputError, }, index ) => // If has display condition, check it. Otherwise display. (onlyDisplayCondition?.(newDao) ?? true) && ( fieldNameOrNames === undefined ? getValues() : typeof fieldNameOrNames === 'string' ? getValues( ('creator.data.' + fieldNameOrNames) as `creator.data.${string}` ) : getValues( fieldNameOrNames.map( (fieldName) => ('creator.data.' + fieldName) as `creator.data.${string}` ) ) } newDao={newDao} register={(fieldName, options) => register( ('creator.data.' + fieldName) as `creator.data.${string}`, options ) } setValue={(fieldName, value, options) => setValue( ('creator.data.' + fieldName) as `creator.data.${string}`, value, { // Validate by default. shouldValidate: true, ...options, } ) } watch={(fieldName) => watch( ('creator.data.' + fieldName) as `creator.data.${string}` ) } /> } name={t(nameI18nKey)} /> ) )} {proposalModuleDaoCreationAdapters.flatMap( ({ extraVotingConfig: { advancedItems = [] } = {} }, index) => advancedItems.map( ( { onlyDisplayCondition, Icon, nameI18nKey, descriptionI18nKey, Input, getInputError, }, itemIndex ) => // If has display condition, check it. Otherwise display. (onlyDisplayCondition?.(newDao) ?? true) && ( fieldNameOrNames === undefined ? getValues() : typeof fieldNameOrNames === 'string' ? getValues( (`proposalModuleAdapters.${index}.data.` + fieldNameOrNames) as `proposalModuleAdapters.${number}.data.${string}` ) : getValues( fieldNameOrNames.map( (fieldName) => (`proposalModuleAdapters.${index}.data.` + fieldName) as `proposalModuleAdapters.${number}.data.${string}` ) ) } newDao={newDao} register={(fieldName, options) => register( (`proposalModuleAdapters.${index}.data.` + fieldName) as `proposalModuleAdapters.${number}.data.${string}`, options ) } setValue={(fieldName, value, options) => setValue( (`proposalModuleAdapters.${index}.data.` + fieldName) as `proposalModuleAdapters.${number}.data.${string}`, value, { // Validate by default. shouldValidate: true, ...options, } ) } watch={(fieldName) => watch( (`proposalModuleAdapters.${index}.data.` + fieldName) as `proposalModuleAdapters.${number}.data.${string}` ) } /> } name={t(nameI18nKey)} /> ) ) )} {commonVotingConfigAdvancedItems.map( ( { onlyDisplayCondition, Icon, nameI18nKey, descriptionI18nKey, Input, getInputError, }, index ) => // If has display condition, check it. Otherwise display. (onlyDisplayCondition?.(newDao) ?? true) && ( fieldNameOrNames === undefined ? getValues() : typeof fieldNameOrNames === 'string' ? getValues( ('votingConfig.' + fieldNameOrNames) as `votingConfig.${string}` ) : getValues( fieldNameOrNames.map( (fieldName) => ('votingConfig.' + fieldName) as `votingConfig.${string}` ) ) } newDao={newDao} register={(fieldName, options) => register( ('votingConfig.' + fieldName) as any, options ) } setValue={(fieldName, value, options) => setValue( ('votingConfig.' + fieldName) as any, value, { // Validate by default. shouldValidate: true, ...options, } ) } watch={(fieldName) => watch(('votingConfig.' + fieldName) as any) } /> } name={t(nameI18nKey)} /> ) )}
) }