fix(login): resolve merge conflict — preloader now uses APP_VERSION

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
VPS 4 Builder
2026-05-14 08:01:55 +02:00
2 changed files with 21 additions and 21 deletions
+3 -3
View File
@@ -44,7 +44,7 @@ const AppointmentModal: React.FC<{
const debouncedSearchTerm = useDebounce(searchTerm, 400);
const fetcher = useCallback(() => HybridBackend.getPacientes(debouncedSearchTerm), [debouncedSearchTerm]);
const fetcher = useCallback(() => HybridBackend.getPacientes(debouncedSearchTerm).then(r => Array.isArray(r.data) ? r.data : []), [debouncedSearchTerm]);
const { data: searchResults, isLoading: isSearching } = useHybridBackend<Paciente[]>(fetcher, [debouncedSearchTerm]);
const { data: agendamentos, refresh: refreshAgendamentos } = useHybridBackend<Agendamento[]>(HybridBackend.getAgendamentos);
@@ -93,14 +93,14 @@ const AppointmentModal: React.FC<{
const slots: string[] = [];
if (!selectedDentistId || !selectedDate) return slots;
const existingAppointments = agendamentos?.filter(ag =>
const existingAppointments = (agendamentos ?? []).filter(ag =>
ag.dentistaId === selectedDentistId &&
new Date(ag.start).toISOString().split('T')[0] === selectedDate &&
ag.id !== initialAppointment?.id
).map(ag => ({
start: new Date(ag.start).getHours() * 60 + new Date(ag.start).getMinutes(),
end: new Date(ag.end).getHours() * 60 + new Date(ag.end).getMinutes(),
})) || [];
}));
const dayOfWeek = new Date(selectedDate).getUTCDay();
const dayHorarios = allHorarios?.filter(h => h.dia_semana === dayOfWeek && h.ativo) || [];
+18 -18
View File
@@ -19,6 +19,16 @@ export const LoginView: React.FC<LoginViewProps> = ({ onLoginSuccess }) => {
return () => clearTimeout(timer);
}, []);
if (isInitializing) {
return (
<div className="min-h-screen bg-gray-50 flex flex-col items-center justify-center p-4">
<Loader2 className="animate-spin text-blue-600 mb-4" size={48} />
<h2 className="text-gray-500 font-bold uppercase tracking-widest text-sm">Inicializando Sistema...</h2>
<span className="text-gray-400 text-xs mt-2 font-mono font-bold bg-gray-200 px-2 py-1 rounded">{APP_VERSION}</span>
</div>
);
}
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setLoading(true);
@@ -38,16 +48,6 @@ export const LoginView: React.FC<LoginViewProps> = ({ onLoginSuccess }) => {
}
};
if (isInitializing) {
return (
<div className="min-h-screen bg-gray-50 flex flex-col items-center justify-center p-4">
<Loader2 className="animate-spin text-blue-600 mb-4" size={48} />
<h2 className="text-gray-500 font-bold uppercase tracking-widest text-sm">Inicializando Sistema...</h2>
<span className="text-gray-400 text-xs mt-2 font-mono font-bold bg-gray-200 px-2 py-1 rounded">V1.0.2</span>
</div>
);
}
return (
<div className="min-h-screen bg-gray-50 flex items-center justify-center p-4">
<div className="max-w-md w-full bg-white rounded-2xl shadow-xl overflow-hidden border border-gray-100">
@@ -58,7 +58,7 @@ export const LoginView: React.FC<LoginViewProps> = ({ onLoginSuccess }) => {
<h1 className="text-2xl font-bold text-white uppercase tracking-wide">SCOREODONTO</h1>
<p className="text-blue-100 text-xs font-bold uppercase mt-1">SISTEMA INTEGRADO POSTGRESQL + GOOGLE</p>
</div>
<div className="p-8">
<h2 className="text-lg font-bold text-gray-800 uppercase mb-6 text-center flex items-center justify-center gap-2">
<Lock size={18} className="text-blue-600"/> ACESSO RESTRITO
@@ -69,8 +69,8 @@ export const LoginView: React.FC<LoginViewProps> = ({ onLoginSuccess }) => {
<label className="block text-xs font-bold text-gray-500 mb-1 uppercase">USUÁRIO / EMAIL</label>
<div className="relative">
<User className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400" size={18} />
<input
type="email"
<input
type="email"
required
value={email}
onChange={(e) => setEmail(e.target.value)}
@@ -84,8 +84,8 @@ export const LoginView: React.FC<LoginViewProps> = ({ onLoginSuccess }) => {
<label className="block text-xs font-bold text-gray-500 mb-1 uppercase">SENHA DE ACESSO</label>
<div className="relative">
<Lock className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400" size={18} />
<input
type="password"
<input
type="password"
required
value={password}
onChange={(e) => setPassword(e.target.value)}
@@ -101,8 +101,8 @@ export const LoginView: React.FC<LoginViewProps> = ({ onLoginSuccess }) => {
</div>
)}
<button
type="submit"
<button
type="submit"
disabled={loading}
className="w-full bg-blue-600 hover:bg-blue-700 text-white py-3 rounded-lg font-bold uppercase flex items-center justify-center gap-2 transition-all shadow-lg hover:shadow-xl disabled:opacity-70 disabled:cursor-not-allowed mt-4"
>
@@ -124,4 +124,4 @@ export const LoginView: React.FC<LoginViewProps> = ({ onLoginSuccess }) => {
</div>
</div>
);
};
};