import React, { useState, useEffect } from 'react'; import { View, Text, StyleSheet, TextInput, ScrollView, TouchableOpacity, Alert, Linking, Platform, Image } from 'react-native'; import { router } from 'expo-router'; import Animated, { FadeIn, FadeOut, FadeInUp } from 'react-native-reanimated'; import * as ImagePicker from 'expo-image-picker'; import { useBarbearia } from '../../stores/BarbeariaContext'; import { useLanguage } from '../../stores/LanguageContext'; import { Card } from '../../components/ui/Card'; import { Button } from '../../components/ui/Button'; import { COLORS, SPACING, TYPOGRAPHY, BORDER_RADIUS, SHADOWS } from '../../constants/theme'; import { Trash2, Pencil, ChevronRight, ChevronLeft, CheckCircle2, Globe, Scissors, Layout, MapPin, Users, Camera, CreditCard, Wallet, Smartphone, Check } from 'lucide-react-native'; const DEFAULT_COLORS = { primary: '#EAB308', secondary: '#1A1A1A', accent: '#8B4513', background: '#0F0F0F', card: '#1E1E1E', text: '#FFFFFF', textMuted: '#A0A0A0', }; export default function ConfigPage() { const { barbearia, updateBarbearia, addService, updateService, removeService, addBarber, updateBarber, removeBarber, isLoading } = useBarbearia(); const { t, language, formatPrice } = useLanguage(); // Use colors do context ou theme default const themeColors = barbearia?.colors || COLORS; const [currentStep, setCurrentStep] = useState(1); // Form estados const [nome, setNome] = useState(''); const [slug, setSlug] = useState(''); const [logo, setLogo] = useState(''); const [endereco, setEndereco] = useState(''); const [cidade, setCidade] = useState(''); const [numero, setNumero] = useState(''); const [paymentMethods, setPaymentMethods] = useState(['money', 'pix', 'card', 'alias']); const [primaryColor, setPrimaryColor] = useState(themeColors.primary); // Novo/Editar serviço estado const [editingServiceId, setEditingServiceId] = useState(null); const [newServiceNamePt, setNewServiceNamePt] = useState(''); const [newServiceNameEs, setNewServiceNameEs] = useState(''); const [newServicePricePt, setNewServicePricePt] = useState(''); const [newServicePriceEs, setNewServicePriceEs] = useState(''); const [newServiceDuration, setNewServiceDuration] = useState(''); // Novo/Editar barbeiro estado const [editingBarberId, setEditingBarberId] = useState(null); const [newBarberName, setNewBarberName] = useState(''); const [newBarberPhoto, setNewBarberPhoto] = useState(''); const [newBarberCommission, setNewBarberCommission] = useState('50'); const [newBarberEmail, setNewBarberEmail] = useState(''); const [newBarberPassword, setNewBarberPassword] = useState(''); const [canViewFinance, setCanViewFinance] = useState(false); const [canEditConfig, setCanEditConfig] = useState(false); useEffect(() => { if (barbearia) { setNome(barbearia.nome || ''); setSlug(barbearia.slug || ''); setLogo(barbearia.logo || ''); setEndereco(barbearia.endereco || ''); setCidade(barbearia.cidade || ''); setNumero(barbearia.numero || ''); if (barbearia.paymentMethods && barbearia.paymentMethods.length > 0) { setPaymentMethods(barbearia.paymentMethods); } if (barbearia.colors && barbearia.colors.primary) { setPrimaryColor(barbearia.colors.primary); } } }, [barbearia]); const togglePaymentMethod = (method: string) => { setPaymentMethods(prev => prev.includes(method) ? prev.filter(m => m !== method) : [...prev, method] ); }; const pickImage = async (setter: (uri: string) => void) => { const { status } = await ImagePicker.requestMediaLibraryPermissionsAsync(); if (status !== 'granted') { Alert.alert('Permissão necessária', 'Precisamos de acesso à sua galeria para escolher a foto.'); return; } const result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, aspect: [1, 1], quality: 0.5, base64: true, }); if (!result.canceled && result.assets[0].base64) { setter(`data:image/jpeg;base64,${result.assets[0].base64}`); } }; const handleSave = async () => { try { const colors = { ...DEFAULT_COLORS, primary: primaryColor }; await updateBarbearia({ nome, slug, logo, endereco, cidade, numero, paymentMethods, colors }); } catch (err) { console.error(err); } }; const nextStep = async () => { await handleSave(); setCurrentStep(prev => Math.min(prev + 1, 7)); }; const prevStep = () => { setCurrentStep(prev => Math.max(prev - 1, 1)); }; const handleSaveService = async () => { if (!newServiceNamePt || !newServiceNameEs || !newServicePricePt || !newServicePriceEs || !newServiceDuration) { if(Platform.OS === 'web') window.alert(t('admin.config.fill_all') || 'Preencha todos os campos'); return; } try { const serviceData = { nomePt: newServiceNamePt, nomeEs: newServiceNameEs, precoPt: Number(newServicePricePt), precoEs: Number(newServicePriceEs), duracao: Number(newServiceDuration), }; if (editingServiceId) { await updateService(editingServiceId, serviceData); } else { await addService(serviceData); } setEditingServiceId(null); setNewServiceNamePt(''); setNewServiceNameEs(''); setNewServicePricePt(''); setNewServicePriceEs(''); setNewServiceDuration(''); } catch (err) { console.error(err); } }; const handleEditService = (service: any) => { setEditingServiceId(service.id); setNewServiceNamePt(service.nomePt); setNewServiceNameEs(service.nomeEs); setNewServicePricePt(String(service.precoPt)); setNewServicePriceEs(String(service.precoEs)); setNewServiceDuration(String(service.duracao)); }; const cancelEditService = () => { setEditingServiceId(null); setNewServiceNamePt(''); setNewServiceNameEs(''); setNewServicePricePt(''); setNewServicePriceEs(''); setNewServiceDuration(''); }; const handleSaveBarber = async () => { if (!newBarberName || !newBarberCommission || !newBarberEmail || !newBarberPassword) { if(Platform.OS === 'web') window.alert('Preencha nome, e-mail, senha e comissão'); return; } try { const barberData = { nome: newBarberName, foto: newBarberPhoto || 'https://images.unsplash.com/photo-1503443207922-dff7d543fd0e?w=400', commission: Number(newBarberCommission) || 0, email: newBarberEmail, password: newBarberPassword, permissions: { canViewFinance, canEditConfig, canEditAgenda: true } }; if (editingBarberId) { await updateBarber(editingBarberId, barberData); } else { await addBarber(barberData); } setEditingBarberId(null); setNewBarberName(''); setNewBarberPhoto(''); setNewBarberCommission('50'); setNewBarberEmail(''); setNewBarberPassword(''); setCanViewFinance(false); setCanEditConfig(false); } catch (err) { console.error(err); } }; const handleEditBarber = (barber: any) => { setEditingBarberId(barber.id); setNewBarberName(barber.nome); setNewBarberPhoto(barber.foto); setNewBarberCommission(String(barber.commission || 50)); setNewBarberEmail(barber.email || ''); setNewBarberPassword(barber.password || ''); setCanViewFinance(barber.permissions?.canViewFinance || false); setCanEditConfig(barber.permissions?.canEditConfig || false); }; const cancelEditBarber = () => { setEditingBarberId(null); setNewBarberName(''); setNewBarberPhoto(''); setNewBarberCommission('50'); setNewBarberEmail(''); setNewBarberPassword(''); setCanViewFinance(false); setCanEditConfig(false); }; const handleViewApp = () => { const url = `${window.location.origin}/${slug}`; if (Platform.OS === 'web') { window.open(url, '_blank'); } else { Linking.openURL(url); } }; if (isLoading) return Carregando...; const renderStepIndicator = () => ( {[1, 2, 3, 4, 5, 6, 7].map((step) => ( ))} ); return ( {t('profile.settings')} {renderStepIndicator()} {currentStep === 1 ? t('admin.config.identity') : currentStep === 2 ? t('admin.config.location') : currentStep === 3 ? t('admin.config.services') : currentStep === 4 ? t('admin.config.barbers') : currentStep === 5 ? (t('admin.config.payments') || 'Formas de Recebimento') : currentStep === 6 ? (t('admin.config.colors') || 'Cores do App') : t('admin.config.ready')} {currentStep === 1 && ( Nome da Barbearia Slug da URL Logo da Barbearia pickImage(setLogo)}> {logo ? ( ) : ( Selecionar Logo )} )} {currentStep === 2 && ( Cidade Endereço Número )} {currentStep === 3 && ( {barbearia?.services.map((service) => ( {language === 'pt' ? service.nomePt : service.nomeEs} {`${formatPrice(service.precoPt, service.precoEs)} • ${service.duracao} min`} handleEditService(service)} style={styles.actionIconBtn}> removeService(service.id)} style={styles.actionIconBtn}> ))} {editingServiceId && Editando Serviço...} {editingServiceId && (