Skip to content

Commit 952313d

Browse files
author
Jon Tzeng
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 6c8193c commit 952313d

4 files changed

Lines changed: 38 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: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,15 +224,24 @@ export const GiftCardListScene: React.FC<Props> = (props: Props) => {
224224

225225
/**
226226
* Derive card status from order data:
227-
* - pending: Broadcasted but no voucher yet
227+
* - confirming: Payment tx sent, awaiting blockchain confirmations
228+
* - pending: Confirmations received, waiting for voucher
228229
* - available: Has voucher, not yet redeemed
230+
* - failed: Order failed or expired
229231
* - redeemed: User marked as redeemed
230232
*/
231233
const getCardStatus = React.useCallback(
232234
(order: PhazeDisplayOrder): GiftCardStatus => {
233235
if (order.redeemedDate != null) return 'redeemed'
234-
if (order.vouchers.length === 0) return 'pending'
235-
return 'available'
236+
if (order.status === 'failed' || order.status === 'expired')
237+
return 'failed'
238+
if (order.vouchers.length > 0) return 'available'
239+
// Phaze API status 'processing' means payment confirmed, generating
240+
// vouchers. Otherwise txid present means tx broadcast, awaiting
241+
// Phaze confirmation.
242+
if (order.status === 'processing') return 'pending'
243+
if (order.txid != null) return 'confirming'
244+
return 'pending'
236245
},
237246
[]
238247
)

src/locales/en_US.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1964,6 +1964,8 @@ const strings = {
19641964
gift_card_redeemed_cards: 'Redeemed Cards',
19651965
gift_card_unmark_as_redeemed: 'Unmark as Redeemed',
19661966
gift_card_active_cards: 'Active Cards',
1967+
gift_card_confirming: 'Awaiting Payment Confirmations...',
1968+
gift_card_failed: 'Failed',
19671969
gift_card_pending: 'Pending Delivery, Please Wait...',
19681970
gift_card_pending_toast:
19691971
'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
@@ -1526,6 +1526,8 @@
15261526
"gift_card_redeemed_cards": "Redeemed Cards",
15271527
"gift_card_unmark_as_redeemed": "Unmark as Redeemed",
15281528
"gift_card_active_cards": "Active Cards",
1529+
"gift_card_confirming": "Awaiting Payment Confirmations...",
1530+
"gift_card_failed": "Failed",
15291531
"gift_card_pending": "Pending Delivery, Please Wait...",
15301532
"gift_card_pending_toast": "Your gift card is being delivered. Please wait for a few minutes for it to arrive.",
15311533
"gift_card_quote_expired_toast": "Your quote has expired. Please try again.",

0 commit comments

Comments
 (0)