diff --git a/src/clients/Governance.ts b/src/clients/Governance.ts index 694baa453..6a0712469 100644 --- a/src/clients/Governance.ts +++ b/src/clients/Governance.ts @@ -28,7 +28,7 @@ import { import { QuarterBudgetAttributes } from '../entities/QuarterBudget/types' import { SubscriptionAttributes } from '../entities/Subscription/types' import { Topic } from '../entities/SurveyTopic/types' -import { ProjectHealth, UpdateAttributes } from '../entities/Updates/types' +import { ProjectHealth, UpdateAttributes, UpdateResponse } from '../entities/Updates/types' import { Vote, VotedProposal } from '../entities/Votes/types' import Time from '../utils/date/Time' @@ -229,14 +229,7 @@ export class Governance extends API { } async getProposalUpdates(proposal_id: string) { - const result = await this.fetch< - ApiResponse<{ - publicUpdates: UpdateAttributes[] - pendingUpdates: UpdateAttributes[] - nextUpdate: UpdateAttributes - currentUpdate: UpdateAttributes | null - }> - >(`/proposals/${proposal_id}/updates`) + const result = await this.fetch>(`/proposals/${proposal_id}/updates`) return result.data } diff --git a/src/entities/Updates/types.ts b/src/entities/Updates/types.ts index ed75324a3..01362aaf6 100644 --- a/src/entities/Updates/types.ts +++ b/src/entities/Updates/types.ts @@ -30,3 +30,10 @@ export enum ProjectHealth { AtRisk = 'atRisk', OffTrack = 'offTrack', } + +export type UpdateResponse = { + publicUpdates: UpdateAttributes[] + pendingUpdates: UpdateAttributes[] + nextUpdate: UpdateAttributes + currentUpdate: UpdateAttributes | null +} diff --git a/src/hooks/useProposalUpdate.ts b/src/hooks/useProposalUpdate.ts index 3626a89bb..ac5b7ee35 100644 --- a/src/hooks/useProposalUpdate.ts +++ b/src/hooks/useProposalUpdate.ts @@ -9,11 +9,12 @@ export default function useProposalUpdate(updateId?: string | null) { data: update, isLoading: isLoadingUpdate, isError: isErrorOnUpdate, + refetch: refetchUpdate, } = useQuery({ queryKey: [`proposalUpdate#${updateId}`], queryFn: async () => { if (!updateId) { - return undefined + return null } return Governance.get().getProposalUpdate(updateId) }, @@ -24,5 +25,6 @@ export default function useProposalUpdate(updateId?: string | null) { update, isLoadingUpdate, isErrorOnUpdate, + refetchUpdate, } } diff --git a/src/hooks/useProposalUpdates.ts b/src/hooks/useProposalUpdates.ts index 011d2b159..a42a5fe8b 100644 --- a/src/hooks/useProposalUpdates.ts +++ b/src/hooks/useProposalUpdates.ts @@ -1,6 +1,7 @@ import { useQuery } from '@tanstack/react-query' import { Governance } from '../clients/Governance' +import { UpdateResponse } from '../entities/Updates/types' import { DEFAULT_QUERY_STALE_TIME } from './constants' @@ -14,7 +15,7 @@ export default function useProposalUpdates(proposalId?: string | null) { queryKey: [`proposalUpdates#${proposalId}`], queryFn: async () => { if (!proposalId) { - return undefined + return {} as UpdateResponse } return Governance.get().getProposalUpdates(proposalId) }, diff --git a/src/hooks/useProposalVotes.ts b/src/hooks/useProposalVotes.ts index c6d92c953..fa9af17c5 100644 --- a/src/hooks/useProposalVotes.ts +++ b/src/hooks/useProposalVotes.ts @@ -14,7 +14,7 @@ const useProposalVotes = (proposalId?: ProposalAttributes['id']) => { queryKey: [`proposalVotes#${proposalId}`], queryFn: async () => { if (!proposalId) { - return undefined + return null } return Governance.get().getProposalVotes(proposalId) }, diff --git a/src/pages/proposal.tsx b/src/pages/proposal.tsx index 3ae04106d..b30506f0c 100644 --- a/src/pages/proposal.tsx +++ b/src/pages/proposal.tsx @@ -160,7 +160,12 @@ export default function ProposalPage() { const subscriptionsQueryKey = `subscriptions#${proposal?.id || ''}` const { data: subscriptions, isLoading: isSubscriptionsLoading } = useQuery({ queryKey: [subscriptionsQueryKey], - queryFn: () => Governance.get().getSubscriptions(proposal!.id), + queryFn: () => { + if (proposal) { + return Governance.get().getSubscriptions(proposal.id) + } + return [] + }, staleTime: DEFAULT_QUERY_STALE_TIME, }) const { budgetWithContestants, isLoadingBudgetWithContestants } = useBudgetWithContestants(proposal?.id) @@ -224,6 +229,7 @@ export default function ProposalPage() { } }, onSuccess: (updatedSubscriptions) => { + updatePageState({ confirmSubscription: false }) if (!proposal) return queryClient.setQueryData([subscriptionsQueryKey], updatedSubscriptions) }, @@ -263,8 +269,12 @@ export default function ProposalPage() { }, [params]) useEffect(() => { - updatePageStateRef.current({ showUpdateSuccessModal: params.get('newUpdate') === 'true' }) - }, [params]) + const isNewUpdate = params.get('newUpdate') === 'true' + if (isNewUpdate) { + refetchUpdates() + } + updatePageStateRef.current({ showUpdateSuccessModal: isNewUpdate }) + }, [params, refetchUpdates]) useEffect(() => { if (proposalPageState.showVotingError) { diff --git a/src/pages/submit/grant.tsx b/src/pages/submit/grant.tsx index 22f212d90..e5572cff4 100644 --- a/src/pages/submit/grant.tsx +++ b/src/pages/submit/grant.tsx @@ -107,7 +107,10 @@ export default function SubmitGrant() { const params = new URLSearchParams(location.search) let category: NewGrantCategory | null = null try { - category = toNewGrantCategory(params.get('category')) + const categoryParam = params.get('category') + if (categoryParam) { + category = toNewGrantCategory(categoryParam) + } } catch (error) { console.error(error) } finally { diff --git a/src/pages/submit/update.tsx b/src/pages/submit/update.tsx index 460c8b217..1b88f7250 100644 --- a/src/pages/submit/update.tsx +++ b/src/pages/submit/update.tsx @@ -143,7 +143,7 @@ export default function Update({ isEdit }: Props) { const updateId = params.get('id') || '' const [isPreviewMode, setPreviewMode] = useState(false) const [projectHealth, setProjectHealth] = useState(initialState.health) - const { update, isLoadingUpdate, isErrorOnUpdate } = useProposalUpdate(updateId) + const { update, isLoadingUpdate, isErrorOnUpdate, refetchUpdate } = useProposalUpdate(updateId) const proposalId = useMemo(() => params.get('proposalId') || update?.proposal_id || '', [update]) const [isEditModalOpen, setIsEditModalOpen] = useState(false) const [isEditAccepted, setIsEditAccepted] = useState(false) @@ -217,7 +217,7 @@ export default function Update({ isEdit }: Props) { } else { await Governance.get().createProposalUpdate(newUpdate) } - + await refetchUpdate() navigate(locations.proposal(proposalId, { newUpdate: 'true' }), { replace: true }) } catch (err) { if (err instanceof Error) {