import cloneDeep from 'lodash.clonedeep' import { useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import { CreateDaoContext, DaoInfoCard } from '@dao-dao/types' import { decodeJsonFromBase64, objectMatchesStructure, processError, } from '@dao-dao/utils' import { Checkbox } from '../../../inputs/Checkbox' import { RawJsonDisplay } from '../../../RawJsonDisplay' import { DaoInfoCards } from '../../DaoInfoCards' export const CreateDaoReview = ({ form: { watch }, commonVotingConfig, creator, proposalModuleDaoCreationAdapters, instantiateMsg, instantiateMsgError, }: CreateDaoContext) => { const { t } = useTranslation() const newDao = watch() const { creator: { data: creatorData }, proposalModuleAdapters, votingConfig, } = newDao const togglePreviewRef = useRef(null) const [decodeModuleMessages, setDecodeModuleMessages] = useState(true) const [showingPreview, setShowingPreview] = useState(false) let previewJson: string | undefined let previewError: string | undefined try { if (instantiateMsgError) { throw new Error(instantiateMsgError) } else if (!instantiateMsg) { throw new Error(t('error.daoCreationIncomplete')) } const msg: any = cloneDeep(instantiateMsg) // Convert encoded module instantiation messages back to readable JSON. if (decodeModuleMessages) { msg.proposal_modules_instantiate_info.forEach((info: any) => { const msg = decodeJsonFromBase64(info.msg) // Convert encoded pre_propose_info message back to readable JSON. if ( objectMatchesStructure(msg, { pre_propose_info: { module_may_propose: { info: { msg: {}, }, }, }, }) ) { msg.pre_propose_info.module_may_propose.info.msg = decodeJsonFromBase64( msg.pre_propose_info.module_may_propose.info.msg ) } info.msg = msg }) msg.voting_module_instantiate_info.msg = decodeJsonFromBase64( msg.voting_module_instantiate_info.msg ) // Convert encoded token_info.factory message back to readable JSON. if ( objectMatchesStructure(msg.voting_module_instantiate_info.msg, { token_info: { factory: {}, }, }) ) { msg.voting_module_instantiate_info.msg.token_info.factory = decodeJsonFromBase64( msg.voting_module_instantiate_info.msg.token_info.factory ) msg.voting_module_instantiate_info.msg.token_info.factory.execute.msg = decodeJsonFromBase64( msg.voting_module_instantiate_info.msg.token_info.factory.execute .msg ) } } // Pretty print output. previewJson = JSON.stringify(msg, undefined, 2) } catch (err) { console.error(err) previewError = processError(err, { forceCapture: false, }) } const togglePreview = () => setShowingPreview((s) => !s) const reviewCards: DaoInfoCard[] = [ ...creator.votingConfig.items .concat(creator.votingConfig.advancedItems ?? []) .flatMap( ({ onlyDisplayCondition, Icon, nameI18nKey, tooltipI18nKey, Review, }): DaoInfoCard | [] => // If has display condition, check it. Otherwise display. (onlyDisplayCondition?.(newDao) ?? true) ? { Icon, label: t(nameI18nKey), value: , tooltip: tooltipI18nKey && t( typeof tooltipI18nKey === 'string' ? tooltipI18nKey : tooltipI18nKey(creatorData) ), } : [] ), ...proposalModuleDaoCreationAdapters.flatMap( ({ extraVotingConfig: { items = [], advancedItems = [] } = {} }, index) => items .concat(advancedItems ?? []) .flatMap( ({ onlyDisplayCondition, Icon, nameI18nKey, tooltipI18nKey, Review, }): DaoInfoCard | [] => // If has display condition, check it. Otherwise display. (onlyDisplayCondition?.(newDao) ?? true) ? { Icon, label: t(nameI18nKey), value: ( ), tooltip: tooltipI18nKey && t( typeof tooltipI18nKey === 'string' ? tooltipI18nKey : tooltipI18nKey(proposalModuleAdapters[index].data) ), } : [] ) ), ...[ ...commonVotingConfig.items, ...commonVotingConfig.advancedItems, ].flatMap( ({ onlyDisplayCondition, Icon, nameI18nKey, tooltipI18nKey, Review }) => // If has display condition, check it. Otherwise display. (onlyDisplayCondition?.(newDao) ?? true) ? { Icon, label: t(nameI18nKey), value: , tooltip: tooltipI18nKey && t( typeof tooltipI18nKey === 'string' ? tooltipI18nKey : tooltipI18nKey(votingConfig) ), } : [] ), ] return ( <>

{t('title.governanceConfiguration')}

{t('title.votingConfiguration')}

{t('button.showInstantiateMessage')}

{showingPreview && (
setDecodeModuleMessages((d) => !d)} />

setDecodeModuleMessages((d) => !d)} > {t('button.withDecodedModuleMessages')}

)}
{showingPreview && !!previewJson && (
)} {!!previewError && (

{previewError}

)} ) }