Skip to content

Commit aee22ee

Browse files
committed
Add confirming and failed states to gift card display card
Distinguish between awaiting blockchain confirmations (txid exists but no voucher yet), pending voucher delivery, and failed/expired orders. Failed cards are dimmed like redeemed cards.
1 parent 82d7cd0 commit aee22ee

4 files changed

Lines changed: 34 additions & 10 deletions

File tree

src/components/cards/GiftCardDisplayCard.tsx

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,18 @@ const ZOOM_FACTOR = 1.025
2525

2626
/**
2727
* Card display states:
28-
* - pending: Order broadcasted but voucher not yet received
28+
* - confirming: Payment tx broadcasted, awaiting blockchain confirmations
29+
* - pending: Confirmations received, waiting for voucher from Phaze
2930
* - available: Voucher received, ready to redeem
31+
* - failed: Order failed or expired
3032
* - redeemed: User has marked as redeemed
3133
*/
32-
export type GiftCardStatus = 'pending' | 'available' | 'redeemed'
34+
export type GiftCardStatus =
35+
| 'confirming'
36+
| 'pending'
37+
| 'available'
38+
| 'failed'
39+
| 'redeemed'
3340

3441
interface Props {
3542
order: PhazeDisplayOrder
@@ -53,9 +60,9 @@ export const GiftCardDisplayCard: React.FC<Props> = props => {
5360
const code = order.vouchers?.[0]?.code
5461
const redemptionUrl = order.vouchers?.[0]?.url
5562

56-
// Redeemed cards are dimmed; pending cards use shimmer overlay instead
63+
// Redeemed and failed cards are dimmed; pending/confirming use shimmer
5764
const cardContainerStyle =
58-
status === 'redeemed'
65+
status === 'redeemed' || status === 'failed'
5966
? [styles.cardContainer, styles.dimmedCard]
6067
: styles.cardContainer
6168

@@ -136,10 +143,18 @@ export const GiftCardDisplayCard: React.FC<Props> = props => {
136143
<View />
137144
)}
138145

139-
{status === 'pending' ? (
146+
{status === 'confirming' ? (
147+
<EdgeText style={styles.pendingText}>
148+
{lstrings.gift_card_confirming}
149+
</EdgeText>
150+
) : status === 'pending' ? (
140151
<EdgeText style={styles.pendingText}>
141152
{lstrings.gift_card_pending}
142153
</EdgeText>
154+
) : status === 'failed' ? (
155+
<EdgeText style={styles.pendingText}>
156+
{lstrings.gift_card_failed}
157+
</EdgeText>
143158
) : status === 'available' && redemptionUrl != null ? (
144159
<EdgeTouchableOpacity
145160
onPress={handleRedeem}
@@ -158,8 +173,8 @@ export const GiftCardDisplayCard: React.FC<Props> = props => {
158173
</View>
159174
</LinearGradient>
160175

161-
{/* Shimmer overlay for pending state */}
162-
<Shimmer isShown={status === 'pending'} />
176+
{/* Shimmer overlay for confirming/pending states */}
177+
<Shimmer isShown={status === 'confirming' || status === 'pending'} />
163178
</View>
164179
)
165180
}

src/components/scenes/GiftCardListScene.tsx

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -406,15 +406,20 @@ export const GiftCardListScene: React.FC<Props> = (props: Props) => {
406406

407407
/**
408408
* Derive card status from order data:
409-
* - pending: Broadcasted but no voucher yet
409+
* - confirming: Payment tx sent, awaiting blockchain confirmations
410+
* - pending: Confirmations received, waiting for voucher
410411
* - available: Has voucher, not yet redeemed
412+
* - failed: Order failed or expired
411413
* - redeemed: User marked as redeemed
412414
*/
413415
const getCardStatus = React.useCallback(
414416
(order: PhazeDisplayOrder): GiftCardStatus => {
415417
if (order.redeemedDate != null) return 'redeemed'
416-
if (order.vouchers.length === 0) return 'pending'
417-
return 'available'
418+
if (order.status === 'failed' || order.status === 'expired')
419+
return 'failed'
420+
if (order.vouchers.length > 0) return 'available'
421+
if (order.txid != null) return 'confirming'
422+
return 'pending'
418423
},
419424
[]
420425
)

src/locales/en_US.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1953,6 +1953,8 @@ const strings = {
19531953
gift_card_redeemed_cards: 'Redeemed Cards',
19541954
gift_card_unmark_as_redeemed: 'Unmark as Redeemed',
19551955
gift_card_active_cards: 'Active Cards',
1956+
gift_card_confirming: 'Awaiting Payment Confirmations...',
1957+
gift_card_failed: 'Failed',
19561958
gift_card_pending: 'Pending Delivery, Please Wait...',
19571959
gift_card_pending_toast:
19581960
'Your gift card is being delivered. Please wait for a few minutes for it to arrive.',

src/locales/strings/enUS.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1519,6 +1519,8 @@
15191519
"gift_card_redeemed_cards": "Redeemed Cards",
15201520
"gift_card_unmark_as_redeemed": "Unmark as Redeemed",
15211521
"gift_card_active_cards": "Active Cards",
1522+
"gift_card_confirming": "Awaiting Payment Confirmations...",
1523+
"gift_card_failed": "Failed",
15221524
"gift_card_pending": "Pending Delivery, Please Wait...",
15231525
"gift_card_pending_toast": "Your gift card is being delivered. Please wait for a few minutes for it to arrive.",
15241526
"gift_card_quote_expired_toast": "Your quote has expired. Please try again.",

0 commit comments

Comments
 (0)