@@ -72,8 +72,8 @@ function ProgramRow({ programId, filterMine, wallet, isAdmin }: { programId: num
7272
7373/* -- Reward Types Management (inline) -- */
7474
75- function RewardTypesSection ( { isAdmin } : { isAdmin : boolean } ) {
76- const { data : rewardTypesData } = useRewardTypes ( ) ;
75+ function RewardTypesSection ( { programId , isAdmin } : { programId : number ; isAdmin : boolean } ) {
76+ const { data : rewardTypesData } = useRewardTypes ( programId ) ;
7777 const { addRewardType, isPending : isAddingRT , isConfirming : isConfirmingRT , isSuccess : addRTSuccess , error : addRTError } = useAddRewardType ( ) ;
7878 const { removeRewardType, isPending : isRemovingRT , isConfirming : isConfirmingRemRT } = useRemoveRewardType ( ) ;
7979 const [ rtId , setRtId ] = useState ( "" ) ;
@@ -107,7 +107,7 @@ function RewardTypesSection({ isAdmin }: { isAdmin: boolean }) {
107107 < TableCell > { fromBytes16 ( names [ idx ] ) } </ TableCell >
108108 { isAdmin && (
109109 < TableCell >
110- < IconButton size = "small" color = "error" onClick = { ( ) => removeRewardType ( id ) }
110+ < IconButton size = "small" color = "error" onClick = { ( ) => removeRewardType ( programId , id ) }
111111 disabled = { isRemovingRT || isConfirmingRemRT } >
112112 < DeleteIcon fontSize = "small" />
113113 </ IconButton >
@@ -127,7 +127,7 @@ function RewardTypesSection({ isAdmin }: { isAdmin: boolean }) {
127127 < TextField label = "Name" value = { rtName } onChange = { ( e ) => setRtName ( e . target . value ) }
128128 size = "small" sx = { { flexGrow : 1 , minWidth : 120 } } inputProps = { { maxLength : 16 } } />
129129 < Button variant = "outlined" size = "small"
130- onClick = { ( ) => addRewardType ( parseInt ( rtId ) , rtName ) }
130+ onClick = { ( ) => addRewardType ( programId , parseInt ( rtId ) , rtName ) }
131131 disabled = { isAddingRT || isConfirmingRT || ! rtId || ! rtName } >
132132 { isAddingRT || isConfirmingRT ? < CircularProgress size = { 16 } /> : "Add" }
133133 </ Button >
@@ -143,7 +143,7 @@ function RewardTypesSection({ isAdmin }: { isAdmin: boolean }) {
143143/* -- Sub-Types Management (inline) -- */
144144
145145function SubTypesSection ( { programId, canManage } : { programId : number ; canManage : boolean } ) {
146- const { data : rewardTypesData } = useRewardTypes ( ) ;
146+ const { data : rewardTypesData } = useRewardTypes ( programId ) ;
147147 const [ selectedRT , setSelectedRT ] = useState ( 0 ) ;
148148 const { data : subTypesData } = useSubTypes ( programId , selectedRT ) ;
149149 const { addSubType, isPending : isAddingST , isConfirming : isConfirmingST , isSuccess : addSTSuccess , error : addSTError } = useAddSubType ( ) ;
@@ -307,13 +307,17 @@ function ProgramDetail({ programId }: { programId: number }) {
307307 const [ depNote , setDepNote ] = useState ( "" ) ;
308308 const [ depDisclaimer , setDepDisclaimer ] = useState ( false ) ;
309309 const [ depRewardType , setDepRewardType ] = useState ( 0 ) ;
310- const { data : rewardTypesForDep } = useRewardTypes ( ) ;
310+ const { data : rewardTypesForDep } = useRewardTypes ( programId ) ;
311311 const [ transMemberCode , setTransMemberCode ] = useState ( "" ) ;
312312 const [ transTo , setTransTo ] = useState ( "" ) ;
313313 const [ transAmount , setTransAmount ] = useState ( "" ) ;
314314 const [ transLocked , setTransLocked ] = useState ( true ) ;
315315 const [ transLockDays , setTransLockDays ] = useState ( "0" ) ;
316316 const [ transNote , setTransNote ] = useState ( "" ) ;
317+ const [ transRewardType , setTransRewardType ] = useState ( 0 ) ;
318+ const [ transSubType , setTransSubType ] = useState ( 0 ) ;
319+ const { data : rewardTypesForTrans } = useRewardTypes ( programId ) ;
320+ const { data : subTypesForTrans } = useSubTypes ( programId , transRewardType ) ;
317321 const [ transDisclaimer , setTransDisclaimer ] = useState ( false ) ;
318322 const [ parentTo , setParentTo ] = useState ( "" ) ;
319323 const [ parentAmount , setParentAmount ] = useState ( "" ) ;
@@ -620,13 +624,39 @@ function ProgramDetail({ programId }: { programId: number }) {
620624 < InfoOutlinedIcon sx = { { fontSize : 16 , color : "text.secondary" , cursor : "help" } } />
621625 </ Tooltip >
622626 </ Box >
627+ { rewardTypesForTrans && ( rewardTypesForTrans as [ number [ ] , `0x${string } `[ ] ] ) [ 0 ] ?. length > 0 && (
628+ < FormControl fullWidth size = "small" sx = { { mt : 1 } } >
629+ < InputLabel > Reward Type</ InputLabel >
630+ < Select value = { transRewardType } onChange = { ( e ) => { setTransRewardType ( Number ( e . target . value ) ) ; setTransSubType ( 0 ) ; } } label = "Reward Type" >
631+ < MenuItem value = { 0 } > None</ MenuItem >
632+ { ( rewardTypesForTrans as [ number [ ] , `0x${string } `[ ] ] ) [ 0 ] . map ( ( id : number , idx : number ) => (
633+ < MenuItem key = { id } value = { id } >
634+ { fromBytes16 ( ( rewardTypesForTrans as [ number [ ] , `0x${string } `[ ] ] ) [ 1 ] [ idx ] ) || `Type ${ id } ` }
635+ </ MenuItem >
636+ ) ) }
637+ </ Select >
638+ </ FormControl >
639+ ) }
640+ { transRewardType > 0 && subTypesForTrans && ( subTypesForTrans as [ number [ ] , `0x${string } `[ ] ] ) [ 0 ] ?. length > 0 && (
641+ < FormControl fullWidth size = "small" sx = { { mt : 1 } } >
642+ < InputLabel > Sub-Type</ InputLabel >
643+ < Select value = { transSubType } onChange = { ( e ) => setTransSubType ( Number ( e . target . value ) ) } label = "Sub-Type" >
644+ < MenuItem value = { 0 } > None</ MenuItem >
645+ { ( subTypesForTrans as [ number [ ] , `0x${string } `[ ] ] ) [ 0 ] . map ( ( id : number , idx : number ) => (
646+ < MenuItem key = { id } value = { id } >
647+ { fromBytes16 ( ( subTypesForTrans as [ number [ ] , `0x${string } `[ ] ] ) [ 1 ] [ idx ] ) || `Sub-Type ${ id } ` }
648+ </ MenuItem >
649+ ) ) }
650+ </ Select >
651+ </ FormControl >
652+ ) }
623653 < TextField label = "Note (optional, max 128)" value = { transNote }
624654 onChange = { ( e ) => setTransNote ( e . target . value . slice ( 0 , 128 ) ) }
625655 fullWidth size = "small" sx = { { mt : 1 } } inputProps = { { maxLength : 128 } }
626656 helperText = { `${ transNote . length } /128` } />
627657 < OnChainDisclaimer accepted = { transDisclaimer } onChange = { setTransDisclaimer } />
628658 < Button variant = "contained" fullWidth sx = { { mt : 1 } }
629- onClick = { ( ) => transfer ( programId , transTarget as `0x${string } `, transAmount , transLocked , parseInt ( transLockDays ) || 0 , transNote ) }
659+ onClick = { ( ) => transfer ( programId , transTarget as `0x${string } `, transAmount , transLocked , parseInt ( transLockDays ) || 0 , transRewardType , transSubType , transNote ) }
630660 disabled = { isTransPending || isTransConf || ! transTarget || ! transAmount || ( ! transResolvedAddr && ! ! transTo && ! isValidAddress ( transTo ) ) || ! transDisclaimer } >
631661 { isTransPending || isTransConf ? < CircularProgress size = { 16 } /> : "Transfer" }
632662 </ Button >
@@ -689,7 +719,7 @@ function ProgramDetail({ programId }: { programId: number }) {
689719 { ( isAdmin || canManageSubTypes ) && program . active && (
690720 < Paper sx = { { p : 2 , mb : 3 } } >
691721 < Typography variant = "h6" gutterBottom > Reward Configuration</ Typography >
692- < RewardTypesSection isAdmin = { isAdmin || isPA } />
722+ < RewardTypesSection programId = { programId } isAdmin = { isAdmin || isPA } />
693723 < SubTypesSection programId = { programId } canManage = { canManageSubTypes } />
694724 </ Paper >
695725 ) }
0 commit comments