import React, { useState, useEffect, useCallback } from 'react';
import {
View,
Text,
StyleSheet,
TouchableOpacity,
ActivityIndicator,
Alert,
Platform,
} from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { router, useLocalSearchParams } from 'expo-router';
import { Ionicons } from '@expo/vector-icons';
// import { usePaymentSheet } from '@stripe/stripe-react-native'; // Removed for web
import { AppColors, Spacing, BorderRadius, FontSizes, FontWeights, Shadows } from '@/constants/theme';
import { useAuth } from '@/contexts/AuthContext';
import { api } from '@/services/api';
import { LoadingSpinner } from '@/components/ui/LoadingSpinner';
import { hasBeneficiaryDevices } from '@/services/BeneficiaryDetailController';
// const STRIPE_API_URL = 'https://wellnuo.smartlaunchhub.com/api/stripe';
const STARTER_KIT = {
name: 'WellNuo Starter Kit',
price: '$249',
priceValue: 249,
};
export default function PurchaseScreen() {
const params = useLocalSearchParams<{ lovedOneName?: string; beneficiaryId?: string }>();
const lovedOneName = params.lovedOneName || '';
const beneficiaryId = params.beneficiaryId;
const [isProcessing, setIsProcessing] = useState(false);
const [isLoading, setIsLoading] = useState(true);
const [step, setStep] = useState<'purchase' | 'order_placed'>('purchase');
const { user } = useAuth();
// const { initPaymentSheet, presentPaymentSheet } = usePaymentSheet(); // Removed for web
// Check if equipment is already ordered - redirect to equipment-status
const checkEquipmentStatus = useCallback(async () => {
if (!beneficiaryId) {
setIsLoading(false);
return;
}
try {
const response = await api.getWellNuoBeneficiary(parseInt(beneficiaryId, 10));
if (response.ok && response.data) {
// If user already has devices - go to main screen
if (hasBeneficiaryDevices(response.data)) {
router.replace(`/(tabs)/beneficiaries/${beneficiaryId}`);
return;
}
// If equipment is ordered/shipped/delivered - go to equipment-status
const status = response.data.equipmentStatus;
if (status && ['ordered', 'shipped', 'delivered'].includes(status)) {
router.replace(`/(tabs)/beneficiaries/${beneficiaryId}/equipment-status`);
return;
}
}
} catch (error) {
console.warn('[Purchase] Failed to check equipment status:', error);
}
setIsLoading(false);
}, [beneficiaryId]);
useEffect(() => {
checkEquipmentStatus();
}, [checkEquipmentStatus]);
const handlePurchase = async () => {
alert('Purchases are currently only available in the mobile app.');
};
const handleAlreadyHaveSensors = () => {
router.replace({
pathname: '/(auth)/activate',
params: { beneficiaryId, lovedOneName },
});
};
const handleGoToEquipmentStatus = () => {
if (beneficiaryId) {
router.replace(`/(tabs)/beneficiaries/${beneficiaryId}/equipment-status`);
} else {
router.replace('/(tabs)');
}
};
// Loading state - checking equipment status
if (isLoading) {
return ;
}
// Order Placed Screen
if (step === 'order_placed') {
return (
Order Placed!
Thank you for your purchase
Item
{STARTER_KIT.name}
For
{lovedOneName || 'Your loved one'}
Total
{STARTER_KIT.price}
Track My Order
);
}
return (
{/* Header */}
router.canGoBack() ? router.back() : router.replace('/(tabs)')}
>
Get Started
{/* Product Card */}
{STARTER_KIT.name}
{STARTER_KIT.price}
4 smart sensors that easily plug into any outlet and set up through the app in minutes
{/* Security Badge */}
Secure payment powered by Stripe
{/* Bottom Actions */}
{isProcessing ? (
) : (
<>
Buy Now - {STARTER_KIT.price}
>
)}
I already have sensors
Web version: Please use mobile app for purchases.
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: AppColors.background,
},
content: {
flex: 1,
padding: Spacing.lg,
justifyContent: 'space-between',
},
header: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
},
backButton: {
padding: Spacing.sm,
marginLeft: -Spacing.sm,
},
title: {
fontSize: FontSizes.xl,
fontWeight: FontWeights.bold,
color: AppColors.textPrimary,
},
placeholder: {
width: 40,
},
productCard: {
backgroundColor: AppColors.white,
borderRadius: BorderRadius.xl,
padding: Spacing.xl,
alignItems: 'center',
borderWidth: 2,
borderColor: AppColors.primary,
...Shadows.md,
},
productIcon: {
width: 80,
height: 80,
borderRadius: 40,
backgroundColor: `${AppColors.primary}15`,
alignItems: 'center',
justifyContent: 'center',
marginBottom: Spacing.lg,
},
productName: {
fontSize: FontSizes.xl,
fontWeight: FontWeights.bold,
color: AppColors.textPrimary,
textAlign: 'center',
marginBottom: Spacing.xs,
},
productPrice: {
fontSize: FontSizes['3xl'],
fontWeight: FontWeights.bold,
color: AppColors.primary,
marginBottom: Spacing.lg,
},
productDescription: {
fontSize: FontSizes.base,
color: AppColors.textSecondary,
textAlign: 'center',
lineHeight: 22,
marginBottom: Spacing.lg,
},
securityBadge: {
flexDirection: 'row',
alignItems: 'center',
gap: Spacing.xs,
paddingVertical: Spacing.sm,
paddingHorizontal: Spacing.md,
backgroundColor: `${AppColors.success}10`,
borderRadius: BorderRadius.lg,
},
securityText: {
fontSize: FontSizes.sm,
color: AppColors.success,
},
bottomActions: {
gap: Spacing.md,
},
purchaseButton: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center',
gap: Spacing.sm,
backgroundColor: AppColors.primary,
paddingVertical: Spacing.lg,
borderRadius: BorderRadius.lg,
...Shadows.primary,
},
buttonDisabled: {
opacity: 0.7,
},
purchaseButtonText: {
fontSize: FontSizes.lg,
fontWeight: FontWeights.semibold,
color: AppColors.white,
},
skipButton: {
alignItems: 'center',
paddingVertical: Spacing.sm,
},
skipButtonText: {
fontSize: FontSizes.base,
color: AppColors.textSecondary,
textDecorationLine: 'underline',
},
// Order Placed Screen
orderPlacedContainer: {
flex: 1,
padding: Spacing.lg,
alignItems: 'center',
justifyContent: 'center',
},
successIcon: {
width: 100,
height: 100,
borderRadius: 50,
backgroundColor: AppColors.success,
alignItems: 'center',
justifyContent: 'center',
marginBottom: Spacing.xl,
...Shadows.lg,
},
orderPlacedTitle: {
fontSize: FontSizes['2xl'],
fontWeight: FontWeights.bold,
color: AppColors.textPrimary,
marginBottom: Spacing.xs,
},
orderPlacedSubtitle: {
fontSize: FontSizes.base,
color: AppColors.textSecondary,
marginBottom: Spacing.xl,
},
orderInfoCard: {
width: '100%',
backgroundColor: AppColors.surface,
borderRadius: BorderRadius.lg,
padding: Spacing.lg,
marginBottom: Spacing.xl,
...Shadows.sm,
},
orderInfoRow: {
flexDirection: 'row',
justifyContent: 'space-between',
alignItems: 'center',
paddingVertical: Spacing.sm,
borderBottomWidth: 1,
borderBottomColor: AppColors.border,
},
orderInfoLabel: {
fontSize: FontSizes.sm,
color: AppColors.textSecondary,
},
orderInfoValue: {
fontSize: FontSizes.base,
fontWeight: FontWeights.medium,
color: AppColors.textPrimary,
},
orderInfoPrice: {
color: AppColors.primary,
fontWeight: FontWeights.bold,
},
primaryButton: {
width: '100%',
backgroundColor: AppColors.primary,
paddingVertical: Spacing.lg,
borderRadius: BorderRadius.lg,
alignItems: 'center',
...Shadows.primary,
},
primaryButtonText: {
fontSize: FontSizes.base,
fontWeight: FontWeights.semibold,
color: AppColors.white,
},
});