From 2c17aeade7998756382fb2a08d7e311b2fa998eb Mon Sep 17 00:00:00 2001 From: eightrice Date: Sun, 29 Mar 2026 13:59:09 +0300 Subject: [PATCH 1/3] fix: deduplicate lite DAO cards when full DAO exists Filter out lite DAOs from the explorer list when they have a daoContract field matching a full (on-chain) DAO address, since the full DAO page already shows off-chain polls. --- src/services/services/dao/hooks/useAllDAOs.ts | 7 ++++++- src/services/services/lite/lite-services.ts | 1 + src/services/services/types.ts | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/services/services/dao/hooks/useAllDAOs.ts b/src/services/services/dao/hooks/useAllDAOs.ts index 70f5a8820..57e3f708e 100644 --- a/src/services/services/dao/hooks/useAllDAOs.ts +++ b/src/services/services/dao/hooks/useAllDAOs.ts @@ -65,7 +65,12 @@ export const useAllDAOs = (network: Network) => { lite_daos = [] } - return [...homebase_daos, ...lite_daos] + // Filter out lite DAOs that already have a corresponding full (on-chain) DAO, + // since the full DAO page already displays their off-chain polls. + const fullDaoAddresses = new Set(homebase_daos.map((dao: any) => dao.address)) + const dedupedLiteDaos = lite_daos.filter((dao: any) => !dao.daoContract || !fullDaoAddresses.has(dao.daoContract)) + + return [...homebase_daos, ...dedupedLiteDaos] }, { // Always create the hook; let the fetcher short-circuit for Etherlink networks. diff --git a/src/services/services/lite/lite-services.ts b/src/services/services/lite/lite-services.ts index b8242558f..0cf0697d8 100644 --- a/src/services/services/lite/lite-services.ts +++ b/src/services/services/lite/lite-services.ts @@ -68,6 +68,7 @@ export const getLiteDAOs = async (network: string) => { }, votingAddressesCount: dao.votingAddressesCount, allowPublicAccess: dao.allowPublicAccess, + daoContract: dao.daoContract, ledgers: dao.members.map(member => { return { holder: { diff --git a/src/services/services/types.ts b/src/services/services/types.ts index 42d2f67df..02789b488 100644 --- a/src/services/services/types.ts +++ b/src/services/services/types.ts @@ -203,6 +203,7 @@ export interface DAOListItem { token: TokenDTO votingAddressesCount: number allowPublicAccess: boolean + daoContract?: string } export type FetchedDAO = DAODTO & { @@ -251,4 +252,5 @@ export interface Community { decimals: string network: Network votingAddressesCount: number + daoContract?: string } From 21609019d01fcde9f4bbc7d9dfd642d623797b05 Mon Sep 17 00:00:00 2001 From: eightrice Date: Sun, 29 Mar 2026 15:00:43 +0300 Subject: [PATCH 2/3] fix: navigate back to full DAO from off-chain poll detail When a user reaches an off-chain poll from a full DAO page, the "back to community" button now returns to the full DAO instead of the lite DAO community page. --- src/modules/lite/explorer/pages/ProposalDetails/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/modules/lite/explorer/pages/ProposalDetails/index.tsx b/src/modules/lite/explorer/pages/ProposalDetails/index.tsx index 04f08a7fd..1cab9b6b9 100644 --- a/src/modules/lite/explorer/pages/ProposalDetails/index.tsx +++ b/src/modules/lite/explorer/pages/ProposalDetails/index.tsx @@ -91,7 +91,9 @@ export const ProposalDetails: React.FC<{ id: string }> = ({ id }) => { const [isLoading, setIsLoading] = useState(false) const navigateToDao = () => { - if (historyLength > 1) { + if (state?.daoId) { + navigate.push(`/explorer/dao/${state.daoId}`) + } else if (historyLength > 1) { navigate.goBack() } else { const daoUrl = pathname?.replace(`proposal/${proposalId}`, "") From 58fe63acdb529a924524d1d7b8d38f544b135627 Mon Sep 17 00:00:00 2001 From: eightrice Date: Sun, 29 Mar 2026 15:14:01 +0300 Subject: [PATCH 3/3] fix: thread daoId through ProposalsList to ProposalTableRow The previous navigation fix didn't work because daoId was never passed from the full DAO proposals page through ProposalsList to ProposalTableRow, so route state.daoId was always undefined. --- src/modules/explorer/components/ProposalsList.tsx | 6 ++++-- src/modules/explorer/pages/Proposals/index.tsx | 1 + .../explorer/pages/User/components/UserMovements.tsx | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/modules/explorer/components/ProposalsList.tsx b/src/modules/explorer/components/ProposalsList.tsx index 18c0280e8..5048e71b6 100644 --- a/src/modules/explorer/components/ProposalsList.tsx +++ b/src/modules/explorer/components/ProposalsList.tsx @@ -40,6 +40,7 @@ interface Props { proposalStyle?: any showFullList?: boolean filters: undefined | Filters + daoId?: string } interface ProposalObj { @@ -53,7 +54,8 @@ export const ProposalsList: React.FC = ({ liteProposals, proposalStyle, showFullList = true, - filters = undefined + filters = undefined, + daoId }) => { const [currentPage, setCurrentPage] = useState(0) const [offset, setOffset] = useState(0) @@ -196,7 +198,7 @@ export const ProposalsList: React.FC = ({ ) : (
- +
) )} diff --git a/src/modules/explorer/pages/Proposals/index.tsx b/src/modules/explorer/pages/Proposals/index.tsx index 0b03174e3..eb567f6c1 100644 --- a/src/modules/explorer/pages/Proposals/index.tsx +++ b/src/modules/explorer/pages/Proposals/index.tsx @@ -307,6 +307,7 @@ const TezosProposals = () => { proposals={undefined} liteProposals={polls} filters={filters} + daoId={daoId} /> )} {!(polls && polls.length > 0) ? ( diff --git a/src/modules/explorer/pages/User/components/UserMovements.tsx b/src/modules/explorer/pages/User/components/UserMovements.tsx index 69141f6eb..0d6c07ad2 100644 --- a/src/modules/explorer/pages/User/components/UserMovements.tsx +++ b/src/modules/explorer/pages/User/components/UserMovements.tsx @@ -280,6 +280,7 @@ export const UserMovements: React.FC<{ liteProposals={showActivity ? pollsPosted : pollsPosted?.slice(0, 2)} showFullList={showActivity} filters={filters} + daoId={daoId} /> )} {!(proposalsCreated && proposalsCreated.length > 0) && !(pollsPosted && pollsPosted.length > 0) ? ( @@ -304,6 +305,7 @@ export const UserMovements: React.FC<{ liteProposals={showActivity ? votedPolls : votedPolls.slice(0, 2)} showFullList={showActivity} filters={filters} + daoId={daoId} /> )} {!(proposalsVoted && proposalsVoted.length > 0) && !(votedPolls && votedPolls.length > 0) ? (