@@ -36,8 +36,12 @@ const Payment = ({
36
36
const isStripe = cart ?. payment_session ?. provider_id === "stripe"
37
37
const stripeReady = useContext ( StripeContext )
38
38
39
+ const paidByGiftcard =
40
+ cart ?. gift_cards && cart ?. gift_cards ?. length > 0 && cart ?. total === 0
41
+
39
42
const paymentReady =
40
- cart ?. payment_session && cart ?. shipping_methods . length !== 0
43
+ ( cart ?. payment_session && cart ?. shipping_methods . length !== 0 ) ||
44
+ paidByGiftcard
41
45
42
46
const useOptions : StripeCardElementOptions = useMemo ( ( ) => {
43
47
return {
@@ -128,77 +132,99 @@ const Payment = ({
128
132
) }
129
133
</ div >
130
134
< div >
131
- { cart ?. payment_sessions ?. length ? (
132
- < div className = { isOpen ? "block" : "hidden" } >
133
- < RadioGroup
134
- value = { cart . payment_session ?. provider_id || "" }
135
- onChange = { ( value : string ) => handleChange ( value ) }
136
- >
137
- { cart . payment_sessions
138
- . sort ( ( a , b ) => {
139
- return a . provider_id > b . provider_id ? 1 : - 1
140
- } )
141
- . map ( ( paymentSession ) => {
142
- return (
143
- < PaymentContainer
144
- paymentInfoMap = { paymentInfoMap }
145
- paymentSession = { paymentSession }
146
- key = { paymentSession . id }
147
- selectedPaymentOptionId = {
148
- cart . payment_session ?. provider_id || null
149
- }
150
- />
151
- )
152
- } ) }
153
- </ RadioGroup >
154
-
155
- { isStripe && stripeReady && (
156
- < div className = "mt-5 transition-all duration-150 ease-in-out" >
157
- < Text className = "txt-medium-plus text-ui-fg-base mb-1" >
158
- Enter your card details:
159
- </ Text >
160
-
161
- < CardElement
162
- options = { useOptions as StripeCardElementOptions }
163
- onChange = { ( e ) => {
164
- setCardBrand (
165
- e . brand &&
166
- e . brand . charAt ( 0 ) . toUpperCase ( ) + e . brand . slice ( 1 )
135
+ < div className = { isOpen ? "block" : "hidden" } >
136
+ { ! paidByGiftcard && cart ?. payment_sessions ?. length ? (
137
+ < >
138
+ < RadioGroup
139
+ value = { cart . payment_session ?. provider_id || "" }
140
+ onChange = { ( value : string ) => handleChange ( value ) }
141
+ >
142
+ { cart . payment_sessions
143
+ . sort ( ( a , b ) => {
144
+ return a . provider_id > b . provider_id ? 1 : - 1
145
+ } )
146
+ . map ( ( paymentSession ) => {
147
+ return (
148
+ < PaymentContainer
149
+ paymentInfoMap = { paymentInfoMap }
150
+ paymentSession = { paymentSession }
151
+ key = { paymentSession . id }
152
+ selectedPaymentOptionId = {
153
+ cart . payment_session ?. provider_id || null
154
+ }
155
+ />
167
156
)
168
- setError ( e . error ?. message || null )
169
- setCardComplete ( e . complete )
170
- } }
171
- />
172
- </ div >
173
- ) }
157
+ } ) }
158
+ </ RadioGroup >
159
+ { isStripe && stripeReady && (
160
+ < div className = "mt-5 transition-all duration-150 ease-in-out" >
161
+ < Text className = "txt-medium-plus text-ui-fg-base mb-1" >
162
+ Enter your card details:
163
+ </ Text >
164
+
165
+ < CardElement
166
+ options = { useOptions as StripeCardElementOptions }
167
+ onChange = { ( e ) => {
168
+ setCardBrand (
169
+ e . brand &&
170
+ e . brand . charAt ( 0 ) . toUpperCase ( ) + e . brand . slice ( 1 )
171
+ )
172
+ setError ( e . error ?. message || null )
173
+ setCardComplete ( e . complete )
174
+ } }
175
+ />
176
+ </ div >
177
+ ) }
178
+ </ >
179
+ ) : paidByGiftcard ? (
180
+ < div className = "flex flex-col w-1/3" >
181
+ < Text className = "txt-medium-plus text-ui-fg-base mb-1" >
182
+ Payment method
183
+ </ Text >
184
+ < Text
185
+ className = "txt-medium text-ui-fg-subtle"
186
+ data-testid = "payment-method-summary"
187
+ >
188
+ Gift card
189
+ </ Text >
190
+ </ div >
191
+ ) : (
192
+ < div className = "flex flex-col items-center justify-center px-4 py-16 text-ui-fg-base" >
193
+ < Spinner />
194
+ </ div >
195
+ ) }
174
196
175
- < ErrorMessage error = { error } data-testid = "payment-method-error-message" />
197
+ < ErrorMessage
198
+ error = { error }
199
+ data-testid = "payment-method-error-message"
200
+ />
176
201
177
- < Button
178
- size = "large"
179
- className = "mt-6"
180
- onClick = { handleSubmit }
181
- isLoading = { isLoading }
182
- disabled = { ( isStripe && ! cardComplete ) || ! cart . payment_session }
183
- data-testid = "submit-payment-button"
184
- >
185
- Continue to review
186
- </ Button >
187
- </ div >
188
- ) : (
189
- < div className = "flex flex-col items-center justify-center px-4 py-16 text-ui-fg-base" >
190
- < Spinner />
191
- </ div >
192
- ) }
202
+ < Button
203
+ size = "large"
204
+ className = "mt-6"
205
+ onClick = { handleSubmit }
206
+ isLoading = { isLoading }
207
+ disabled = {
208
+ ( isStripe && ! cardComplete ) ||
209
+ ( ! cart ?. payment_session && ! paidByGiftcard )
210
+ }
211
+ data-testid = "submit-payment-button"
212
+ >
213
+ Continue to review
214
+ </ Button >
215
+ </ div >
193
216
194
217
< div className = { isOpen ? "hidden" : "block" } >
195
- { cart && paymentReady && cart . payment_session && (
218
+ { cart && paymentReady && cart . payment_session ? (
196
219
< div className = "flex items-start gap-x-1 w-full" >
197
220
< div className = "flex flex-col w-1/3" >
198
221
< Text className = "txt-medium-plus text-ui-fg-base mb-1" >
199
222
Payment method
200
223
</ Text >
201
- < Text className = "txt-medium text-ui-fg-subtle" data-testid = "payment-method-summary" >
224
+ < Text
225
+ className = "txt-medium text-ui-fg-subtle"
226
+ data-testid = "payment-method-summary"
227
+ >
202
228
{ paymentInfoMap [ cart . payment_session . provider_id ] ?. title ||
203
229
cart . payment_session . provider_id }
204
230
</ Text >
@@ -214,7 +240,10 @@ const Payment = ({
214
240
< Text className = "txt-medium-plus text-ui-fg-base mb-1" >
215
241
Payment details
216
242
</ Text >
217
- < div className = "flex gap-2 txt-medium text-ui-fg-subtle items-center" data-testid = "payment-details-summary" >
243
+ < div
244
+ className = "flex gap-2 txt-medium text-ui-fg-subtle items-center"
245
+ data-testid = "payment-details-summary"
246
+ >
218
247
< Container className = "flex items-center h-7 w-fit p-2 bg-ui-button-neutral-hover" >
219
248
{ paymentInfoMap [ cart . payment_session . provider_id ] ?. icon || (
220
249
< CreditCard />
@@ -228,7 +257,19 @@ const Payment = ({
228
257
</ div >
229
258
</ div >
230
259
</ div >
231
- ) }
260
+ ) : paidByGiftcard ? (
261
+ < div className = "flex flex-col w-1/3" >
262
+ < Text className = "txt-medium-plus text-ui-fg-base mb-1" >
263
+ Payment method
264
+ </ Text >
265
+ < Text
266
+ className = "txt-medium text-ui-fg-subtle"
267
+ data-testid = "payment-method-summary"
268
+ >
269
+ Gift card
270
+ </ Text >
271
+ </ div >
272
+ ) : null }
232
273
</ div >
233
274
</ div >
234
275
< Divider className = "mt-8" />
0 commit comments