1- import { EditCycleTxArgs , transformEditCycleFormFieldsToTxArgs } from 'packages/v4/utils/editRuleset'
2- import { JBChainId , NATIVE_TOKEN } from 'juice-sdk-core'
31import { Trans , t } from '@lingui/macro'
4- import { useEffect , useState } from 'react '
2+ import { JBChainId , NATIVE_TOKEN } from 'juice-sdk-core '
53import { useJBChainId , useJBContractContext , useJBProjectId , useJBRuleset , useSuckers } from 'juice-sdk-react'
4+ import { EditCycleTxArgs , transformEditCycleFormFieldsToTxArgs } from 'packages/v4/utils/editRuleset'
5+ import { useEffect , useState } from 'react'
66
77import { BigNumber } from '@ethersproject/bignumber'
8+ import { Form } from 'antd'
89import { Callout } from 'components/Callout/Callout'
9- import { ChainSelect } from 'packages/v4/components/ChainSelect'
10- import { CreateCollapse } from 'packages/v4/components/Create/components/CreateCollapse/CreateCollapse'
11- import { DetailsSectionDiff } from './DetailsSectionDiff'
1210import ETHAmount from 'components/currency/ETHAmount'
13- import { Form } from 'antd'
1411import { JuiceDatePicker } from 'components/inputs/JuiceDatePicker'
1512import { JuiceTextArea } from 'components/inputs/JuiceTextArea'
16- import { PayoutsSectionDiff } from './PayoutsSectionDiff'
17- import QueueSafeEditRulesetTxsModal from 'packages/v4/components/QueueSafeEditRulesetTxsModal'
18- import type { RelayrPostBundleResponse } from 'juice-sdk-react'
19- import { SectionCollapseHeader } from './SectionCollapseHeader'
20- import { TokensSectionDiff } from './TokensSectionDiff'
2113import TransactionModal from 'components/modals/TransactionModal'
22- import { TransactionSuccessModal } from '../TransactionSuccessModal'
23- import { emitErrorNotification } from 'utils/notifications'
14+ import { useGnosisSafe } from 'hooks/safe/useGnosisSafe'
15+ import { useWallet } from 'hooks/Wallet'
16+ import type { RelayrPostBundleResponse } from 'juice-sdk-react'
2417import moment from 'moment'
18+ import { ChainSelect } from 'packages/v4/components/ChainSelect'
19+ import { CreateCollapse } from 'packages/v4/components/Create/components/CreateCollapse/CreateCollapse'
20+ import QueueSafeEditRulesetTxsModal from 'packages/v4/components/QueueSafeEditRulesetTxsModal'
21+ import { useEditRulesetTx } from 'packages/v4/hooks/useEditRulesetTx'
22+ import useV4ProjectOwnerOf from 'packages/v4/hooks/useV4ProjectOwnerOf'
23+ import { emitErrorNotification } from 'utils/notifications'
2524import { useChainId } from 'wagmi'
26- import { useDetailsSectionValues } from './hooks/useDetailsSectionValues'
2725import { useEditCycleFormContext } from '../EditCycleFormContext'
28- import { useGnosisSafe } from 'hooks/safe/useGnosisSafe'
2926import { useOmnichainEditCycle } from '../hooks/useOmnichainEditCycle'
27+ import { TransactionSuccessModal } from '../TransactionSuccessModal'
28+ import { DetailsSectionDiff } from './DetailsSectionDiff'
29+ import { useDetailsSectionValues } from './hooks/useDetailsSectionValues'
3030import { usePayoutsSectionValues } from './hooks/usePayoutsSectionValues'
3131import { useTokensSectionValues } from './hooks/useTokensSectionValues'
32- import useV4ProjectOwnerOf from 'packages/v4/hooks/useV4ProjectOwnerOf'
33- import { useWallet } from 'hooks/Wallet'
32+ import { PayoutsSectionDiff } from './PayoutsSectionDiff'
33+ import { SectionCollapseHeader } from './SectionCollapseHeader'
34+ import { TokensSectionDiff } from './TokensSectionDiff'
3435
3536export function ReviewConfirmModal ( {
3637 open,
@@ -65,9 +66,12 @@ export function ReviewConfirmModal({
6566
6667 // Omnichain edit state
6768 const { getEditQuote, sendRelayrTx, relayrBundle } = useOmnichainEditCycle ( )
69+ // Direct single-chain tx hook
70+ const editRulesetTx = useEditRulesetTx ( )
6871 const [ selectedGasChain , setSelectedGasChain ] = useState < JBChainId | undefined > ( chainId )
6972 const [ txQuote , setTxQuote ] = useState < RelayrPostBundleResponse > ( )
7073 const [ txQuoteLoading , setTxQuoteLoading ] = useState ( false )
74+ const [ txPending , setTxPending ] = useState ( false ) // single-chain pending state
7175
7276 const { data : suckers } = useSuckers ( )
7377
@@ -162,6 +166,45 @@ export function ReviewConfirmModal({
162166 }
163167 }
164168
169+ // Direct single-chain confirm (no relayr)
170+ const handleConfirmSingle = async ( ) => {
171+ if ( isOmnichainProject ) return // safety guard
172+ if ( walletConnectedToWrongChain ) {
173+ try {
174+ await changeNetworks ( chainId as JBChainId )
175+ } catch ( error ) {
176+ emitErrorNotification ( `Error changing networks: ${ error } ` )
177+ return
178+ }
179+ }
180+ const formVals = editCycleForm ! . getFieldsValue ( true )
181+ setConfirmLoading ( true )
182+ setTxPending ( false )
183+ try {
184+ await editRulesetTx ( formVals , {
185+ onTransactionPending : ( ) => {
186+ setTxPending ( true )
187+ } ,
188+ onTransactionConfirmed : ( ) => {
189+ setTxPending ( false )
190+ setConfirmLoading ( false )
191+ editCycleForm ! . resetFields ( )
192+ setEditCycleSuccessModalOpen ( true )
193+ onClose ( )
194+ } ,
195+ onTransactionError : ( e ) => {
196+ setTxPending ( false )
197+ setConfirmLoading ( false )
198+ emitErrorNotification ( e . message )
199+ } ,
200+ } )
201+ } catch ( e ) {
202+ setTxPending ( false )
203+ setConfirmLoading ( false )
204+ emitErrorNotification ( ( e as Error ) . message )
205+ }
206+ }
207+
165208 // Poll and handle completion
166209 useEffect ( ( ) => {
167210 if ( relayrBundle . isComplete ) {
@@ -181,7 +224,9 @@ export function ReviewConfirmModal({
181224 const panelProps = { className : 'text-lg' }
182225
183226 const txSigning = Boolean ( relayrBundle . uuid ) && ! relayrBundle . isComplete
184- const okText = isProjectOwnerGnosisSafe ? < Trans > Queue on Safe</ Trans > : ! txQuote ? < Trans > Get edit quote</ Trans > : < Trans > Deploy changes</ Trans >
227+ const okText = isOmnichainProject
228+ ? ( isProjectOwnerGnosisSafe ? < Trans > Queue on Safe</ Trans > : ! txQuote ? < Trans > Get edit quote</ Trans > : < Trans > Deploy changes</ Trans > )
229+ : < Trans > Queue ruleset</ Trans >
185230 const mustStartAtOrAfterField = (
186231 < div className = "mt-1" >
187232 < Form . Item
@@ -221,13 +266,13 @@ export function ReviewConfirmModal({
221266 < TransactionModal
222267 open = { open }
223268 title = { < Trans > Review & confirm </ Trans > }
224- onOk = { handleConfirmOmni }
269+ onOk = { isOmnichainProject ? handleConfirmOmni : handleConfirmSingle }
225270 okText = { okText }
226271 okButtonProps = { { disabled : ! formHasChanges } }
227272 confirmLoading = { confirmLoading || txQuoteLoading || txSigning }
228- transactionPending = { txSigning }
229- chainIds = { projectChains }
230- relayrResponse = { relayrBundle . response }
273+ transactionPending = { isOmnichainProject ? txSigning : txPending }
274+ chainIds = { isOmnichainProject ? projectChains : undefined }
275+ relayrResponse = { isOmnichainProject ? relayrBundle . response : undefined }
231276 cancelButtonProps = { { hidden : true } }
232277 onCancel = { onClose }
233278 >
@@ -293,7 +338,16 @@ export function ReviewConfirmModal({
293338 { mustStartAtOrAfterField }
294339 </ div >
295340 ) : null }
296- { ! txQuote && (
341+ { ! isOmnichainProject && (
342+ < div className = "mt-10 py-4 text-sm stroke-tertiary border-t rounded-none" >
343+ < Callout . Info >
344+ < Trans >
345+ You'll be prompted a wallet signature to queue the updated ruleset.
346+ </ Trans >
347+ </ Callout . Info >
348+ </ div >
349+ ) }
350+ { isOmnichainProject && ! txQuote && (
297351 < div className = "mt-10 py-4 text-sm stroke-tertiary border-t rounded-none" >
298352 < Callout . Info >
299353 { isProjectOwnerGnosisSafe && isOmnichainProject ? (
@@ -308,7 +362,7 @@ export function ReviewConfirmModal({
308362 </ Callout . Info >
309363 </ div >
310364 ) }
311- { txQuote ? (
365+ { isOmnichainProject && txQuote ? (
312366 < div className = "mb-4 mt-10" >
313367 < div className = "flex items-center justify-between" >
314368 < span > < Trans > Gas quote</ Trans > :</ span >
0 commit comments