Skip to content

Commit dd87642

Browse files
Merge pull request #749 from 0xsequence/min-price-usd-for-opensea-offers
fix `useConvertPriceToUSD` always disabled
2 parents 3da0609 + f4c3ec6 commit dd87642

File tree

3 files changed

+38
-11
lines changed

3 files changed

+38
-11
lines changed

sdk/src/react/ui/modals/MakeOfferModal/internal/context.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
useCollectionMetadata,
1212
useConfig,
1313
useConnectorMetadata,
14+
useCurrencyConvertToUSD,
1415
useCurrencyList,
1516
useTokenCurrencyBalance,
1617
} from '../../../../hooks';
@@ -106,6 +107,18 @@ export function useMakeOfferModalContext() {
106107
},
107108
});
108109

110+
const { data: usdConversion } = useCurrencyConvertToUSD({
111+
chainId: state.chainId,
112+
currencyAddress: selectedCurrency?.contractAddress ?? zeroAddress,
113+
amountRaw: state.priceInput?.toString(),
114+
query: {
115+
enabled:
116+
state.orderbookKind === OrderbookKind.opensea &&
117+
!!selectedCurrency?.contractAddress &&
118+
!!state.priceInput,
119+
},
120+
});
121+
109122
const expiryDate = useMemo(
110123
() => new Date(Date.now() + state.expiryDays * 24 * 60 * 60 * 1000),
111124
[state.expiryDays],
@@ -139,6 +152,7 @@ export function useMakeOfferModalContext() {
139152
balance: balanceDnum,
140153
lowestListing: lowestListingDnum,
141154
orderbookKind: state.orderbookKind,
155+
usdAmount: usdConversion?.usdAmount,
142156
});
143157

144158
const formIsValid = isFormValid(validation);
@@ -359,6 +373,7 @@ export function useMakeOfferModalContext() {
359373
quantity: validation.quantity,
360374
balance: validation.balance,
361375
openseaCriteria: validation.openseaCriteria,
376+
openseaMinPrice: validation.openseaMinPrice,
362377
},
363378
errors: {
364379
price: state.isPriceTouched ? validation.price.error : undefined,
@@ -369,6 +384,9 @@ export function useMakeOfferModalContext() {
369384
openseaCriteria: state.isPriceTouched
370385
? validation.openseaCriteria?.error
371386
: undefined,
387+
openseaMinPrice: state.isPriceTouched
388+
? validation.openseaMinPrice?.error
389+
: undefined,
372390
},
373391
},
374392

@@ -415,7 +433,8 @@ export function useMakeOfferModalContext() {
415433
this.form.errors.price ||
416434
this.form.errors.quantity ||
417435
this.form.errors.balance ||
418-
this.form.errors.openseaCriteria
436+
this.form.errors.openseaCriteria ||
437+
this.form.errors.openseaMinPrice
419438
);
420439
},
421440

sdk/src/react/ui/modals/MakeOfferModal/internal/helpers/validation.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export type OfferValidation = {
1111
quantity: FieldValidation;
1212
balance: FieldValidation;
1313
openseaCriteria?: FieldValidation;
14+
openseaMinPrice?: FieldValidation;
1415
};
1516

1617
export function validateOfferForm({
@@ -19,12 +20,14 @@ export function validateOfferForm({
1920
balance,
2021
lowestListing,
2122
orderbookKind,
23+
usdAmount,
2224
}: {
2325
price: Dnum;
2426
quantity: Dnum;
2527
balance?: Dnum;
2628
lowestListing?: Dnum;
2729
orderbookKind?: string;
30+
usdAmount?: number;
2831
}): OfferValidation {
2932
const validation: OfferValidation = {
3033
price: { isValid: true, error: null },
@@ -67,6 +70,15 @@ export function validateOfferForm({
6770
};
6871
}
6972

73+
// OpenSea minimum price validation ($0.01 USD)
74+
if (orderbookKind === 'opensea' && usdAmount !== undefined) {
75+
const meetsMinPrice = usdAmount >= 0.01;
76+
validation.openseaMinPrice = {
77+
isValid: meetsMinPrice,
78+
error: meetsMinPrice ? null : 'Lowest price must be at least $0.01',
79+
};
80+
}
81+
7082
return validation;
7183
}
7284

@@ -75,7 +87,8 @@ export function isFormValid(validation: OfferValidation): boolean {
7587
validation.price.isValid &&
7688
validation.quantity.isValid &&
7789
validation.balance.isValid &&
78-
(validation.openseaCriteria?.isValid ?? true)
90+
(validation.openseaCriteria?.isValid ?? true) &&
91+
(validation.openseaMinPrice?.isValid ?? true)
7992
);
8093
}
8194

@@ -87,6 +100,8 @@ export function getValidationErrors(validation: OfferValidation): string[] {
87100
if (validation.balance.error) errors.push(validation.balance.error);
88101
if (validation.openseaCriteria?.error)
89102
errors.push(validation.openseaCriteria.error);
103+
if (validation.openseaMinPrice?.error)
104+
errors.push(validation.openseaMinPrice.error);
90105

91106
return errors;
92107
}

sdk/src/react/ui/modals/_internal/components/priceInput/index.tsx

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ type PriceInputProps = {
3636
};
3737
disabled?: boolean;
3838
orderbookKind?: OrderbookKind;
39-
setOpenseaLowestPriceCriteriaMet?: (state: boolean) => void;
4039
modalType?: 'listing' | 'offer';
4140
// Fee data for enhanced balance checking in offers
4241
feeData?: {
@@ -55,7 +54,6 @@ export default function PriceInput({
5554
includeNativeCurrency,
5655
disabled,
5756
orderbookKind,
58-
setOpenseaLowestPriceCriteriaMet,
5957
modalType,
6058
feeData,
6159
}: PriceInputProps) {
@@ -81,8 +79,7 @@ export default function PriceInput({
8179
enabled:
8280
orderbookKind === OrderbookKind.opensea &&
8381
!!currencyAddress &&
84-
!!priceAmountRaw &&
85-
!!setOpenseaLowestPriceCriteriaMet,
82+
!!priceAmountRaw,
8683
},
8784
});
8885

@@ -164,17 +161,13 @@ export default function PriceInput({
164161

165162
const openseaLowestPriceCriteriaMet =
166163
orderbookKind === OrderbookKind.opensea &&
167-
!!conversion?.usdAmount &&
164+
conversion?.usdAmount !== undefined &&
168165
conversion.usdAmount >= 0.01;
169166

170167
if (checkBalance?.enabled) {
171168
checkBalance.callback(balanceError);
172169
}
173170

174-
if (setOpenseaLowestPriceCriteriaMet) {
175-
setOpenseaLowestPriceCriteriaMet(openseaLowestPriceCriteriaMet);
176-
}
177-
178171
const [value, setValue] = useState('0');
179172
const prevCurrencyDecimals = useRef(currencyDecimals);
180173
const [openseaDecimalError, setOpenseaDecimalError] = useState<string | null>(

0 commit comments

Comments
 (0)