import React, { useState } from 'react'; import { View, Text, TouchableOpacity, StyleSheet, Alert, } from 'react-native'; import { useRouter } from 'expo-router'; import { useForm, Controller } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Ionicons } from '@expo/vector-icons'; import { SafeAreaView } from 'react-native-safe-area-context'; import { usePresetStore } from '@store/presetStore'; import { useAuthStore } from '@store/authStore'; import { Input } from '@presentation/components/ui/Input'; import { Button } from '@presentation/components/ui/Button'; import { colors, typography, spacing, radius } from '@shared/theme'; import type { SpoolPreset, CreateSpoolPresetInput } from '@domain/SpoolPreset'; import { createPresetUseCase } from '@infrastructure/container'; const schema = z.object({ name: z.string().min(1, 'Nome obrigatório'), spoolWeightG: z.coerce.number().min(1, 'Peso obrigatório'), }); type FormData = z.infer; type SpoolType = 'Plástico' | 'Papelão' | 'Outro'; /** * Tela de Novo Preset — QM-0 */ export default function NewPresetScreen(): React.ReactElement { const router = useRouter(); const { addPreset } = usePresetStore(); const [spoolType, setSpoolType] = useState('Plástico'); const [isLoading, setIsLoading] = useState(false); const { control, handleSubmit, formState: { errors } } = useForm({ resolver: zodResolver(schema), defaultValues: { name: '', spoolWeightG: undefined }, }); async function onSubmit(data: FormData): Promise { setIsLoading(true); try { const user = useAuthStore.getState().user; if (!user) { throw new Error('Usuário não autenticado'); } const input: CreateSpoolPresetInput = { name: data.name, spoolWeightG: Number(data.spoolWeightG), }; const preset = await createPresetUseCase.execute(user.id, input); addPreset(preset); Alert.alert('Sucesso', 'Preset criado com sucesso'); router.back(); } catch (error) { Alert.alert('Erro', `Não foi possível salvar o preset: ${(error as Error).message}`); } finally { setIsLoading(false); } } return ( {/* Header */} router.back()}> Novo Preset {/* Ícone */} {/* Nome */} ( } /> )} /> {/* Peso */} ( } rightLabel="g" /> )} /> Pese o carretel vazio em uma balança e insira o valor em gramas. {/* Tipo */} TIPO DE CARRETEL Opcional {(['Plástico', 'Papelão', 'Outro'] as SpoolType[]).map((t) => ( setSpoolType(t)} style={[styles.chip, spoolType === t && styles.chipActive]} > {t} ))} {/* CTA */}