@@ -12,13 +12,18 @@ import { PageHint } from "@/components/PageHint";
1212import { SIM_AUTH_ENABLED } from "@/lib/featureFlags" ;
1313import { useAuth } from "@/app/auth/AuthContext" ;
1414import { formatProposalSubmitError } from "@/lib/proposalSubmitErrors" ;
15+ import {
16+ requiredTierForProposalType ,
17+ isTierEligible ,
18+ } from "@/lib/proposalTypes" ;
1519import {
1620 apiChambers ,
21+ apiMyGovernance ,
1722 apiProposalDraftDelete ,
1823 apiProposalDraftSave ,
1924 apiProposalSubmitToPool ,
2025} from "@/lib/apiClient" ;
21- import type { ChamberDto } from "@/types/api" ;
26+ import type { ChamberDto , TierProgressDto } from "@/types/api" ;
2227import { BudgetStep } from "./proposalCreation/steps/BudgetStep" ;
2328import { EssentialsStep } from "./proposalCreation/steps/EssentialsStep" ;
2429import { PlanStep } from "./proposalCreation/steps/PlanStep" ;
@@ -63,6 +68,9 @@ const ProposalCreation: React.FC = () => {
6368 const [ submitting , setSubmitting ] = useState ( false ) ;
6469 const [ submitError , setSubmitError ] = useState < string | null > ( null ) ;
6570 const [ chambers , setChambers ] = useState < ChamberDto [ ] > ( [ ] ) ;
71+ const [ tierProgress , setTierProgress ] = useState < TierProgressDto | null > (
72+ null ,
73+ ) ;
6674
6775 useEffect ( ( ) => {
6876 const handle = window . setTimeout ( ( ) => {
@@ -133,6 +141,27 @@ const ProposalCreation: React.FC = () => {
133141 } ;
134142 } , [ ] ) ;
135143
144+ useEffect ( ( ) => {
145+ if ( ! auth . enabled || ! auth . authenticated ) {
146+ setTierProgress ( null ) ;
147+ return ;
148+ }
149+ let active = true ;
150+ ( async ( ) => {
151+ try {
152+ const res = await apiMyGovernance ( ) ;
153+ if ( ! active ) return ;
154+ setTierProgress ( res . tier ?? null ) ;
155+ } catch {
156+ if ( ! active ) return ;
157+ setTierProgress ( null ) ;
158+ }
159+ } ) ( ) ;
160+ return ( ) => {
161+ active = false ;
162+ } ;
163+ } , [ auth . authenticated , auth . enabled ] ) ;
164+
136165 useEffect ( ( ) => {
137166 if ( searchParams . get ( "step" ) === step ) return ;
138167 const next = new URLSearchParams ( searchParams ) ;
@@ -230,6 +259,11 @@ const ProposalCreation: React.FC = () => {
230259 const canAct = ! SIM_AUTH_ENABLED || ( auth . authenticated && auth . eligible ) ;
231260 const submitDisabled = ! computed . canSubmit || ! canAct ;
232261
262+ const requiredTier = requiredTierForProposalType ( draft . proposalType ) ;
263+ const currentTier = tierProgress ?. tier ?? null ;
264+ const tierEligible =
265+ currentTier && isTierEligible ( currentTier , requiredTier ) ? true : false ;
266+
233267 return (
234268 < div className = "flex flex-col gap-6" >
235269 < PageHint pageId = "proposals" />
@@ -309,6 +343,9 @@ const ProposalCreation: React.FC = () => {
309343 templateId = { template . id }
310344 setTemplateId = { setTemplateId }
311345 textareaClassName = { textareaClassName }
346+ requiredTier = { requiredTier }
347+ currentTier = { currentTier }
348+ tierEligible = { tierEligible }
312349 />
313350 ) : null }
314351
0 commit comments