From 4c6d1e52497605280be5efb6efe867ac944eee2f Mon Sep 17 00:00:00 2001 From: Evgenii Date: Mon, 31 Jul 2023 17:49:27 +0400 Subject: [PATCH] feat: add ipfs info to description, add markdown support --- .../ui/DashboardGrid/DashboardGrid.tsx | 23 +- .../ui/DashboardVote/DashboardVote.tsx | 16 +- .../ui/DashboardVote/DashboardVoteStyle.ts | 2 +- modules/modal/ModalProvider.tsx | 39 +- modules/modal/useModal.ts | 7 +- modules/network/utils/fetcherIPFS.ts | 4 + .../ui/Common/ExternalLink/ExternalLink.tsx | 23 + .../Common/ExternalLink/ExternalLinkStyle.ts | 9 + .../shared/ui/Common/ExternalLink/index.ts | 1 + .../MarkdownWrapper/MarkdownWrapper.tsx | 32 + .../MarkdownWrapper/MarkdownWrapperStyles.tsx | 67 ++ .../shared/ui/Common/MarkdownWrapper/index.ts | 1 + .../NavigationModal/NavigationModal.tsx | 51 ++ .../NavigationModal/NavigationModalStyles.tsx | 6 + .../shared/ui/Common/NavigationModal/index.ts | 1 + modules/shared/utils/regexCID.ts | 36 +- modules/shared/utils/regexEthAddress.ts | 1 + .../utils/replaceCustomElementsInMD.tsx | 85 +++ .../utils/replaceLinksWithComponents.tsx | 8 +- .../ui/VoteDescription/VoteDescription.tsx | 29 + .../VoteDescriptionStyle.ts} | 0 modules/votes/ui/VoteDescription/index.ts | 1 + modules/votes/ui/VoteDetails/VoteDetails.tsx | 27 +- modules/votes/ui/VoteForm/VoteForm.tsx | 2 + modules/votes/ui/VoteForm/useFormVoteInfo.ts | 13 +- .../VoteMetadataDescription.tsx | 10 - .../votes/ui/VoteMetadataDescription/index.ts | 1 - .../VoteMetadataIPFSDescription.tsx | 24 - .../VoteMetadataIPFSDescriptionStyle.ts | 8 - .../ui/VoteMetadataIPFSDescription/index.ts | 1 - modules/votes/ui/VoteScript/VoteScript.tsx | 16 +- package.json | 4 + yarn.lock | 713 +++++++++++++++++- 33 files changed, 1155 insertions(+), 106 deletions(-) create mode 100644 modules/shared/ui/Common/ExternalLink/ExternalLink.tsx create mode 100644 modules/shared/ui/Common/ExternalLink/ExternalLinkStyle.ts create mode 100644 modules/shared/ui/Common/ExternalLink/index.ts create mode 100644 modules/shared/ui/Common/MarkdownWrapper/MarkdownWrapper.tsx create mode 100644 modules/shared/ui/Common/MarkdownWrapper/MarkdownWrapperStyles.tsx create mode 100644 modules/shared/ui/Common/MarkdownWrapper/index.ts create mode 100644 modules/shared/ui/Common/NavigationModal/NavigationModal.tsx create mode 100644 modules/shared/ui/Common/NavigationModal/NavigationModalStyles.tsx create mode 100644 modules/shared/ui/Common/NavigationModal/index.ts create mode 100644 modules/shared/utils/replaceCustomElementsInMD.tsx create mode 100644 modules/votes/ui/VoteDescription/VoteDescription.tsx rename modules/votes/ui/{VoteMetadataDescription/VoteMetadataDescriptionStyle.ts => VoteDescription/VoteDescriptionStyle.ts} (100%) create mode 100644 modules/votes/ui/VoteDescription/index.ts delete mode 100644 modules/votes/ui/VoteMetadataDescription/VoteMetadataDescription.tsx delete mode 100644 modules/votes/ui/VoteMetadataDescription/index.ts delete mode 100644 modules/votes/ui/VoteMetadataIPFSDescription/VoteMetadataIPFSDescription.tsx delete mode 100644 modules/votes/ui/VoteMetadataIPFSDescription/VoteMetadataIPFSDescriptionStyle.ts delete mode 100644 modules/votes/ui/VoteMetadataIPFSDescription/index.ts diff --git a/modules/dashboard/ui/DashboardGrid/DashboardGrid.tsx b/modules/dashboard/ui/DashboardGrid/DashboardGrid.tsx index 55889c43..265abe6f 100644 --- a/modules/dashboard/ui/DashboardGrid/DashboardGrid.tsx +++ b/modules/dashboard/ui/DashboardGrid/DashboardGrid.tsx @@ -12,6 +12,8 @@ import { ContractVoting } from 'modules/blockChain/contracts' import { getVoteStatus } from 'modules/votes/utils/getVoteStatus' import { getEventStartVote } from 'modules/votes/utils/getEventVoteStart' import * as urls from 'modules/network/utils/urls' +import { fetcherIPFS } from 'modules/network/utils/fetcherIPFS' +import { REGEX_LIDO_VOTE_CID } from 'modules/shared/utils/regexCID' const PAGE_SIZE = 20 @@ -87,7 +89,26 @@ export function DashboardGrid({ currentPage }: Props) { const votesWithEvents = await Promise.all(eventsPromises) - return votesWithEvents + const ipfsPromises = votesWithEvents.map(dataItem => { + const fetch = async () => { + const { metadata } = dataItem.eventStart + const cid = metadata.match(REGEX_LIDO_VOTE_CID)?.[1] + + // error with description should not block UI + const description = await (cid + ? fetcherIPFS(cid).catch(() => '') + : Promise.resolve('')) + return { + ...dataItem, + description, + } + } + return fetch() + }) + + const votesWithEventsAndDescription = await Promise.all(ipfsPromises) + + return votesWithEventsAndDescription }, ) diff --git a/modules/dashboard/ui/DashboardVote/DashboardVote.tsx b/modules/dashboard/ui/DashboardVote/DashboardVote.tsx index 58450a2e..502d55bd 100644 --- a/modules/dashboard/ui/DashboardVote/DashboardVote.tsx +++ b/modules/dashboard/ui/DashboardVote/DashboardVote.tsx @@ -5,16 +5,16 @@ import Link from 'next/link' import { VoteStatusBanner } from 'modules/votes/ui/VoteStatusBanner' import { VoteYesNoBar } from 'modules/votes/ui/VoteYesNoBar' import { InfoRowFull } from 'modules/shared/ui/Common/InfoRow' -import { VoteMetadataDescription } from 'modules/votes/ui/VoteMetadataDescription' +import { VoteDescription } from 'modules/votes/ui/VoteDescription' + import { Wrap, VoteBody, VoteTitle, - VoteDescription, + VoteDescriptionWrap, VotesBarWrap, Footer, } from './DashboardVoteStyle' - import type { StartVoteEventObject } from 'generated/AragonVotingAbi' import { Vote, VoteStatus } from 'modules/votes/types' import { weiToNum } from 'modules/blockChain/utils/parseWei' @@ -30,6 +30,7 @@ type Props = { voteTime: number objectionPhaseTime: number onPass: () => void + description: string } export function DashboardVote({ @@ -40,6 +41,7 @@ export function DashboardVote({ voteTime, objectionPhaseTime, onPass, + description, }: Props) { const { nayPct, @@ -97,11 +99,9 @@ export function DashboardVote({ Vote #{voteId} - {metadata && ( - - - - )} + + +