Compare commits

..

2 Commits

Author SHA1 Message Date
842dd08f73 adicionar condóminos 2026-04-16 09:03:15 +01:00
58a5649851 Ligação inicial ao Firebase e criação do formulário de condomínios 2026-04-14 17:15:05 +01:00
4 changed files with 94 additions and 40 deletions

View File

@@ -1,3 +1,3 @@
{ {
"liveServer.settings.port": 5502 "liveServer.settings.port": 5503
} }

16
firebase.js Normal file
View File

@@ -0,0 +1,16 @@
import { initializeApp } from "https://www.gstatic.com/firebasejs/12.1.0/firebase-app.js";
import { getFirestore } from "https://www.gstatic.com/firebasejs/12.1.0/firebase-firestore.js";
const firebaseConfig = {
apiKey: "SUA_API_KEY",
authDomain: "SEU_PROJETO.firebaseapp.com",
projectId: "SEU_PROJECT_ID",
storageBucket: "SEU_PROJETO.appspot.com",
messagingSenderId: "SEU_ID",
appId: "SEU_APP_ID"
};
const app = initializeApp(firebaseConfig);
const db = getFirestore(app);
export { db };

View File

@@ -95,10 +95,10 @@
Building2, Users, Wallet, Wrench, Bell, Search, Plus, Menu, X, Building2, Users, Wallet, Wrench, Bell, Search, Plus, Menu, X,
TrendingUp, TrendingDown, CheckCircle, AlertCircle, Clock, LogOut, TrendingUp, TrendingDown, CheckCircle, AlertCircle, Clock, LogOut,
Edit2, Trash2, Save, Filter, MoreVertical, FileText, Edit2, Trash2, Save, Filter, MoreVertical, FileText,
Dumbbell, PartyPopper, Trophy, Map, Calendar, MapPin, Info Dumbbell, PartyPopper, Trophy, Map, Calendar, MapPin, Info,
MessageCircle, Paperclip, Send
} from 'lucide-react'; } from 'lucide-react';
const INITIAL_RESIDENTS = [ const INITIAL_RESIDENTS = [
{ id: 1, unit: '1º Esq', name: 'Ana Silva', contact: '912 345 678', email: 'ana.silva@email.com', status: 'Pago', pending: 0, role: 'morador' }, { id: 1, unit: '1º Esq', name: 'Ana Silva', contact: '912 345 678', email: 'ana.silva@email.com', status: 'Pago', pending: 0, role: 'morador' },
{ id: 2, unit: '1º Dto', name: 'Carlos Santos', contact: '965 432 109', email: 'carlos.s@email.com', status: 'Pendente', pending: 45.00, role: 'morador' }, { id: 2, unit: '1º Dto', name: 'Carlos Santos', contact: '965 432 109', email: 'carlos.s@email.com', status: 'Pendente', pending: 45.00, role: 'morador' },
@@ -256,9 +256,9 @@
const [password, setPassword] = useState(''); const [password, setPassword] = useState('');
const [error, setError] = useState(''); const [error, setError] = useState('');
const handleSubmit = (e) => { const handleSubmit = async (e) => {
e.preventDefault(); e.preventDefault();
const success = onLogin(email, password); const success = await onLogin(email, password);
if (!success) { if (!success) {
setError('Email ou Palavra-passe incorreta'); setError('Email ou Palavra-passe incorreta');
} }
@@ -327,27 +327,46 @@
return sessionStorage.getItem('condo_role') || 'morador'; return sessionStorage.getItem('condo_role') || 'morador';
}); });
const handleLogin = (email, password) => { const handleLogin = async (email, password) => {
let role = null; try {
if (email === 'administradores@gmail.com' && password === 'admin123') { const userCredential = await signInWithEmailAndPassword(auth, email, password);
role = 'admin'; let role = 'morador';
} else if (email === 'moradores@gmail.com' && password === 'moradores123') { if (email.toLowerCase().includes('admin')) {
role = 'morador'; role = 'admin';
} else { } else {
const residentUser = residents.find(r => r.email && r.email.toLowerCase() === email.toLowerCase()); const residentUser = residents.find(r => r.email && r.email.toLowerCase() === email.toLowerCase());
if (residentUser && (password === residentUser.contact || password === '1234')) { if (residentUser) {
role = residentUser.role || 'morador'; role = residentUser.role || 'morador';
}
} }
}
if (role) {
sessionStorage.setItem('condo_auth', 'true'); sessionStorage.setItem('condo_auth', 'true');
sessionStorage.setItem('condo_role', role); sessionStorage.setItem('condo_role', role);
setIsAuthenticated(true); setIsAuthenticated(true);
setUserRole(role); setUserRole(role);
return true; return true;
} catch (error) {
console.log("Firebase Auth falhou, a tentar conta local...", error);
let role = null;
if (email === 'administradores@gmail.com' && password === 'admin123') {
role = 'admin';
} else if (email === 'moradores@gmail.com' && password === 'moradores123') {
role = 'morador';
} else {
const residentUser = residents.find(r => r.email && r.email.toLowerCase() === email.toLowerCase());
if (residentUser && (password === residentUser.contact || password === '1234')) {
role = residentUser.role || 'morador';
}
}
if (role) {
sessionStorage.setItem('condo_auth', 'true');
sessionStorage.setItem('condo_role', role);
setIsAuthenticated(true);
setUserRole(role);
return true;
}
return false;
} }
return false;
}; };
const handleLogout = () => { const handleLogout = () => {
@@ -1277,6 +1296,12 @@
))} ))}
</tbody> </tbody>
</table> </table>
<div id="formCondominio" style={{display: 'none'}}>
<input id="fracao" placeholder="Fração" />
<input id="proprietario" placeholder="Proprietário" />
<input id="contacto" placeholder="Contacto" />
<button id="guardar">Guardar</button>
</div>
</div> </div>
</div> </div>
)} )}
@@ -1629,23 +1654,7 @@
const root = createRoot(document.getElementById('root')); const root = createRoot(document.getElementById('root'));
root.render(<App />); root.render(<App />);
</script> </script>
<script type="module"> <!-- Firebase configs moved to top in React Module -->
import { initializeApp } from "https://www.gstatic.com/firebasejs/12.10.0/firebase-app.js";
import { getAnalytics } from "https://www.gstatic.com/firebasejs/12.10.0/firebase-analytics.js";
const firebaseConfig = {
apiKey: "AIzaSyAQHgVDJWM42HfRzvKTxdVW78Qq48vBb2A",
authDomain: "condomaster-pro-ed9af.firebaseapp.com",
projectId: "condomaster-pro-ed9af",
storageBucket: "condomaster-pro-ed9af.firebasestorage.app",
messagingSenderId: "169472241616",
appId: "1:169472241616:web:8e6074dc4b8a6dce9013d5",
measurementId: "G-2BH2VTW6D5"
};
const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
</script>
</body> </body>
</html> </html>

View File

@@ -21,16 +21,16 @@ document.addEventListener('DOMContentLoaded', () => {
}); });
function setupEventListeners() { function setupEventListeners() {
document.getElementById('login-form').addEventListener('submit', handleLogin); document.getElementById('login-form').addEventListener('submit', handleLogin);
document.getElementById('form-morador').addEventListener('submit', saveMorador); document.getElementById('form-morador').addEventListener('submit', saveMorador);
document.getElementById('form-transacao').addEventListener('submit', saveTransacao); document.getElementById('form-transacao').addEventListener('submit', saveTransacao);
document.getElementById('form-ocorrencia').addEventListener('submit', saveOcorrencia); document.getElementById('form-ocorrencia').addEventListener('submit', saveOcorrencia);
document.getElementById('form-aviso').addEventListener('submit', saveAviso); document.getElementById('form-aviso').addEventListener('submit', saveAviso);
if (sessionStorage.getItem('condoProUser')) { if (sessionStorage.getItem('condoProUser')) {
renderDashboard(); renderDashboard();
} }
@@ -101,7 +101,7 @@ function showToast(message, type = 'primary') {
async function dbSelect(table, orderBy = null) { async function dbSelect(table, orderBy = null) {
if (IS_MOCK) { if (IS_MOCK) {
const data = JSON.parse(localStorage.getItem(`condopro_${table}`)) || []; const data = JSON.parse(localStorage.getItem(`condopro_${table}`)) || [];
if (orderBy) { if (orderBy) {
data.sort((a, b) => new Date(b.created_at) - new Date(a.created_at)); data.sort((a, b) => new Date(b.created_at) - new Date(a.created_at));
} }
return { data, error: null }; return { data, error: null };
@@ -490,3 +490,32 @@ function exportPDF(tableId, filename) {
doc.save(filename + '.pdf'); doc.save(filename + '.pdf');
showToast("PDF gerado com sucesso!", "success"); showToast("PDF gerado com sucesso!", "success");
} }
import { db } from "./firebase.js";
import { collection, addDoc } from "https://www.gstatic.com/firebasejs/12.1.0/firebase-firestore.js";
import { db } from "./firebase.js";
import { collection, addDoc } from "https://www.gstatic.com/firebasejs/12.1.0/firebase-firestore.js";
document.getElementById("btnAdicionar").onclick = () => {
document.getElementById("formCondominio").style.display = "block";
};
document.getElementById("guardar").onclick = async () => {
const fracao = document.getElementById("fracao").value;
const proprietario = document.getElementById("proprietario").value;
const contacto = document.getElementById("contacto").value;
try {
await addDoc(collection(db, "condominios"), {
fracao,
proprietario,
contacto,
estado: "Pago",
divida: 0
});
alert("Guardado com sucesso!");
} catch (e) {
alert("Erro: " + e.message);
}
};