Skip to content

Commit

Permalink
fix: tela agendamento
Browse files Browse the repository at this point in the history
  • Loading branch information
Julio-Pupim committed Nov 18, 2024
1 parent c9f3042 commit c650e14
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 94 deletions.
85 changes: 52 additions & 33 deletions frontend/app/(agenda)/agendamento.tsx
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
import React, { useEffect, useState } from 'react';
import { ScrollView, StyleSheet, Text, View, Button, StatusBar, Alert, TextInput, Pressable } from 'react-native';
import { StyleSheet, Text, View, StatusBar, TextInput, Pressable } from 'react-native';
import { Ionicons } from '@expo/vector-icons';
import DateTimePicker, { DateTimePickerEvent } from '@react-native-community/datetimepicker';
import { Controller, Form, useForm } from 'react-hook-form';
import { Controller, useForm } from 'react-hook-form';
import { SafeAreaView } from 'react-native-safe-area-context';
import { router, useLocalSearchParams } from 'expo-router';
import { DateInput } from '@/components/DateInput';
import { TimeInput } from '@/components/HoraInput';
import ReservaService from '../../service/ReservaService'
import PrestadorService from '../../service/prestadorservice'
import ServicoService from '../../service/ServicoService'
import ReservaService from '../../service/ReservaService'
import { AutocompleteInput } from '@/components/AutocompleteInput';

type AgendamentoForm = {
Expand All @@ -29,10 +28,8 @@ const prestadorClick = () => {

export default function Agendamento() {

const [prestadores, setPrestadores] = useState([]);
const [servicos, setServicos] = useState([]);
const [filteredServicos, setFilteredServicos] = useState([]);

const [prestadores, setPrestadores] = useState<any>([]);
const [servicos, setServicos] = useState<any>([]);

const { idPrestador, idServico, dataAgendamento } = useLocalSearchParams();

Expand All @@ -47,37 +44,50 @@ export default function Agendamento() {
const fetchPrestadores = async () => {
try {
const response = await PrestadorService.getAllPrestadores();
setPrestadores(response.data);
setPrestadores(response);
} catch (error) {
console.error('Erro ao buscar prestadores:', error);
}
};

const fetchPrestadorUrl = async (idPrestador: any) => {
try {
const response = await PrestadorService.getPrestadorById(idPrestador);
setPrestadores(response);
} catch (error) {
console.error('Erro ao buscar prestadores:', error);
}
};

const fetchServicos = async () => {
const fetchServicoUrl = async (idServico: any) => {
try {
const response = await ServicoService.getServicosByPrestador();
setServicos(response.data);
const response = await ServicoService.getServicoById(idServico);
setServicos(response);
} catch (error) {
console.error('Erro ao buscar serviços:', error);
}
};

useEffect(() => {
fetchPrestadores();
fetchServicos();
if (!parsedIdPrestador && !parsedIdServico) {
fetchPrestadores();

}
}, []);

const { control, handleSubmit, formState: { errors, isValid }, watch } = useForm<AgendamentoForm>({
const { control, handleSubmit, formState: { errors, isValid }, watch, setValue } = useForm<AgendamentoForm>({
defaultValues: {
servico: '',
prestador: '',
anotacao: '',
data: parsedDataAgendamento,
hora: null,
},
mode: 'onChange',
});

const saveReserva = (reserva: AgendamentoForm) => {
console.log(reserva)
}

return (
<SafeAreaView style={styles.container}>
<StatusBar hidden />
Expand All @@ -98,52 +108,61 @@ export default function Agendamento() {
control={control}
name="prestador"
rules={{ required: 'Prestador é um campo obrigatório' }}
defaultValue={async ()=>{
if(parsedIdPrestador){
const response =await PrestadorService.getPrestadorById()
return response.data
defaultValue={async () => {
if (parsedIdPrestador) {
PrestadorService.getPrestadorById(parsedIdPrestador).then((response) => {
setValue("prestador", response.nome); // Atualiza o valor do campo
setPrestadores(prestadores);
});
}
return ''
}}
render={({ field: { onChange, value } }) => (
render={({ field: { onChange, value, } }) => (
<AutocompleteInput
placeholder="Digite para buscar prestador"
data={prestadores}
value={value}
onChange={onChange}
onSelect={(item) => {
onChange(item.id);
setFilteredServicos(servicos.filter((s) => s.prestadorId === item.id));
console.log("AAAA",item)
onChange(item.nome);
value={item}
setServicos(item.servicos || []);
}}
filterKey="nome"
/>
)}
/>
{errors.prestador && <Text style={styles.errorText}>{errors.prestador.message}</Text>}
{errors.prestador && <Text style={styles.errorText}>{errors.prestador.message?.toString()}</Text>}

<Controller
control={control}
name="servico"
rules={{ required: 'Serviço é um campo obrigatório' }}
defaultValue={async ()=>{
if(parsedIdServico){
const response = await ServicoService.getServicoById()
return response.data;
defaultValue={async () => {
if (parsedIdServico) {
return await ServicoService.getServic oById().then((response)=>{
setValue('servico',response.descricao)
setServicos(response)
})
}
return ''
}}
render={({ field: { onChange, value } }) => (
<AutocompleteInput
placeholder="Digite para buscar serviço"
data={filteredServicos}
data={servicos}
value={value}
onChange={onChange}
onSelect={(item) => onChange(item.id)}
filterKey="nome"
onSelect={(item) => {
value={item}
onChange(item.descricao)}
}
filterKey="descricao"
/>
)}
/>
{errors.servico && <Text style={styles.errorText}>{errors.servico.message}</Text>}
{errors.servico && <Text style={styles.errorText}>{errors.servico.message?.toString()}</Text>}


<DateInput
Expand Down
1 change: 0 additions & 1 deletion frontend/app/(auth)/login.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import { SafeAreaView } from 'react-native-safe-area-context';
import axios from 'axios';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { router } from 'expo-router';
import UsuarioService from '../../service/UsuarioService'

type LoginForm = {
email: string;
Expand Down
131 changes: 73 additions & 58 deletions frontend/components/AutocompleteInput.tsx
Original file line number Diff line number Diff line change
@@ -1,70 +1,85 @@
import React from 'react';
import React, { useState } from 'react';
import {
View,
TextInput,
FlatList,
Text,
StyleSheet,
TouchableOpacity,
View,
TextInput,
FlatList,
Text,
StyleSheet,
Pressable,
} from 'react-native';

type AutocompleteInputProps = {
placeholder: string;
data: any[];
value: string;
onChange: (text: string) => void;
onSelect: (item: any) => void;
filterKey: string; // Nome da chave a ser filtrada (ex: 'nome')
placeholder: string;
data: any[];
value: string;
onChange: (text: string) => void;
onSelect: (item: any) => void;
filterKey: string;
};

export const AutocompleteInput: React.FC<AutocompleteInputProps> = ({
placeholder,
data,
value,
onChange,
onSelect,
filterKey,
placeholder,
data,
value,
onChange,
onSelect,
filterKey,
}) => {
const filteredData = data.filter((item) =>
item[filterKey].toLowerCase().includes(value.toLowerCase())
);
const [showSuggestions, setShowSuggestions] = useState(false);

return (
<View>
<TextInput
style={styles.input}
placeholder={placeholder}
value={value}
onChangeText={onChange}
/>
<FlatList
data={filteredData}
keyExtractor={(_item, index) => index.toString()}
renderItem={({ item }) => (
<TouchableOpacity
style={styles.suggestionItem}
onPress={() => onSelect(item)}
>
<Text>{item[filterKey]}</Text>
</TouchableOpacity>
)}
/>
</View>
);
const filteredData = data.filter((item) =>
item[filterKey]?.toLowerCase().includes(value?.toLowerCase())
);

return (
<View>
<TextInput
style={styles.input}
placeholder={placeholder}
value={value}
onChangeText={(text) => {
onChange(text);
setShowSuggestions(true);
}}
onFocus={() => setShowSuggestions(true)}
onBlur={() => setTimeout(() => setShowSuggestions(false), 200)
}
/>
{showSuggestions && filteredData.length > 0 && (
<FlatList
data={filteredData}
keyExtractor={(_item, index) => _item.id || index.toString()}
renderItem={({ item }) => (
<Pressable
style={styles.suggestionItem}
onPress={() => {
console.log("AAAA", item)
onSelect(item);
setShowSuggestions(false);
}}
>
<Text>{item[filterKey]}</Text>
</Pressable>
)}
/>
)}
</View>
);
};

const styles = StyleSheet.create({
input: {
height: 40,
borderColor: '#CCC',
borderWidth: 1,
borderRadius: 5,
marginBottom: 10,
paddingHorizontal: 10,
},
suggestionItem: {
padding: 10,
borderBottomWidth: 1,
borderColor: '#EEE',
},
});
input: {
height: 40,
borderColor: '#CCC',
borderWidth: 1,
borderRadius: 5,
marginBottom: 10,
paddingHorizontal: 10,
},
suggestionItem: {
padding: 10,
borderBottomWidth: 1,
borderColor: '#EEE',
backgroundColor: '#FFF',
},
});
2 changes: 1 addition & 1 deletion frontend/service/ServicoService.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ const createServico = async (servicos) => {

const getServicosByPrestador = async (idPrestador) => {
try {
const response = await axiosInstance.get(`?id_prestador=${idPrestador}`);
const response = await axiosInstance.get(`/prestador/${idPrestador}`);
return response.data;
} catch (error) {
console.error('Erro ao buscar serviços do prestador:', error);
Expand Down
2 changes: 1 addition & 1 deletion frontend/service/prestadorservice.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import axios from 'axios';
import AsyncStorage from '@react-native-async-storage/async-storage';

const API_URL = 'http://localhost:8080/api/prestador';
const API_URL = 'http://localhost:8080/api/prestadores';

// Função para recuperar o token do AsyncStorage
const getAuthToken = async () => {
Expand Down

0 comments on commit c650e14

Please sign in to comment.