src/react-native-app/components/CheckoutForm/CheckoutForm.tsx (187 lines of code) (raw):
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
/**
* Copied with modification from src/frontend/components/CheckoutForm/CheckoutForm.tsx
*/
import { ThemedScrollView } from "@/components/ThemedScrollView";
import { Field } from "@/components/Field";
import { StyleSheet, Pressable } from "react-native";
import { useForm, Controller } from "react-hook-form";
import { ThemedText } from "@/components/ThemedText";
import { ThemedView } from "@/components/ThemedView";
export interface IFormData {
email: string;
streetAddress: string;
city: string;
state: string;
country: string;
zipCode: string;
creditCardNumber: string;
creditCardCvv: number;
creditCardExpirationYear: number;
creditCardExpirationMonth: number;
}
interface IProps {
onSubmit(formData: IFormData): void;
}
const CheckoutForm = ({ onSubmit }: IProps) => {
const { control, handleSubmit } = useForm({
defaultValues: {
email: "someone@example.com",
streetAddress: "1600 Amphitheatre Parkway",
city: "Mountain View",
state: "CA",
country: "United States",
zipCode: "94043",
creditCardNumber: "4432-8015-6152-0454",
creditCardCvv: 672,
creditCardExpirationYear: 2030,
creditCardExpirationMonth: 1,
},
});
return (
<ThemedScrollView style={styles.container}>
<Controller
control={control}
rules={{ required: true }}
render={({ field: { onChange, onBlur, value } }) => (
<Field
label="E-mail Address"
placeholder="E-mail Address"
onBlur={onBlur}
onChangeText={onChange}
value={value}
/>
)}
name="email"
/>
<Controller
control={control}
rules={{ required: true }}
render={({ field: { onChange, onBlur, value } }) => (
<Field
label="Street Address"
placeholder="Street Address"
onBlur={onBlur}
onChangeText={onChange}
value={value}
/>
)}
name="streetAddress"
/>
<Controller
control={control}
rules={{ required: true }}
render={({ field: { onChange, onBlur, value } }) => (
<Field
label="Zip Code"
placeholder="Zip Code"
onBlur={onBlur}
onChangeText={onChange}
value={value}
/>
)}
name="zipCode"
/>
<Controller
control={control}
rules={{ required: true }}
render={({ field: { onChange, onBlur, value } }) => (
<Field
label="Country"
placeholder="Country"
onBlur={onBlur}
onChangeText={onChange}
value={value}
/>
)}
name="country"
/>
<Controller
control={control}
rules={{ required: true }}
render={({ field: { onChange, onBlur, value } }) => (
<Field
label="Credit Card Number"
placeholder="Credit Card Number"
onBlur={onBlur}
onChangeText={onChange}
value={value}
keyboardType="numeric"
/>
)}
name="creditCardNumber"
/>
<Controller
control={control}
rules={{ required: true }}
render={({ field: { onChange, onBlur, value } }) => (
<Field
label="Expiration Month"
placeholder="Month"
onBlur={onBlur}
onChangeText={onChange}
value={value.toString()}
keyboardType="numeric"
/>
)}
name="creditCardExpirationMonth"
/>
<Controller
control={control}
rules={{ required: true }}
render={({ field: { onChange, onBlur, value } }) => (
<Field
label="Expiration Year"
placeholder="Year"
onBlur={onBlur}
onChangeText={onChange}
value={value.toString()}
keyboardType="numeric"
/>
)}
name="creditCardExpirationYear"
/>
<Controller
control={control}
rules={{ required: true }}
render={({ field: { onChange, onBlur, value } }) => (
<Field
label="CVV"
placeholder="CVV"
onBlur={onBlur}
onChangeText={onChange}
value={value.toString()}
keyboardType="numeric"
/>
)}
name="creditCardCvv"
/>
<ThemedView style={styles.submitContainer}>
<Pressable style={styles.submit} onPress={handleSubmit(onSubmit)}>
<ThemedText style={styles.submitText}>Place Order</ThemedText>
</Pressable>
</ThemedView>
</ThemedScrollView>
);
};
const styles = StyleSheet.create({
container: {
marginLeft: 30,
},
submitContainer: {
display: "flex",
justifyContent: "center",
alignItems: "center",
margin: 20,
},
submit: {
borderRadius: 4,
backgroundColor: "blue",
alignItems: "center",
justifyContent: "center",
width: 150,
padding: 10,
position: "relative",
},
submitText: {
color: "white",
fontSize: 20,
},
});
export default CheckoutForm;