Una aplicación móvil de gestión de tareas construida con React Native y Firebase. Ofrece sincronización en tiempo real, modo offline y una experiencia de usuario fluida con características avanzadas de productividad.
// models/Task.js
interface Task {
id: string;
title: string;
description?: string;
completed: boolean;
dueDate?: Date;
category?: string;
tags: string[];
priority: 'low' | 'medium' | 'high';
userId: string;
createdAt: Date;
updatedAt: Date;
}
// Firebase schema
const taskConverter = {
toFirestore: (task: Task) => {
return {
title: task.title,
description: task.description,
completed: task.completed,
dueDate: task.dueDate,
category: task.category,
tags: task.tags,
priority: task.priority,
userId: task.userId,
createdAt: task.createdAt,
updatedAt: task.updatedAt,
};
},
fromFirestore: (snapshot, options) => {
const data = snapshot.data(options);
return {
id: snapshot.id,
...data,
};
},
};
// utils/sync.js
export const syncTasks = async () => {
try {
// Obtener tareas locales no sincronizadas
const localTasks = await AsyncStorage.getItem('unsyncedTasks');
const tasks = JSON.parse(localTasks || '[]');
// Sincronizar con Firebase
const batch = firestore().batch();
tasks.forEach(task => {
const ref = firestore().collection('tasks').doc(task.id);
batch.set(ref, task, { merge: true });
});
await batch.commit();
await AsyncStorage.removeItem('unsyncedTasks');
// Configurar listener para cambios en tiempo real
return firestore()
.collection('tasks')
.where('userId', '==', auth().currentUser.uid)
.onSnapshot(snapshot => {
snapshot.docChanges().forEach(change => {
if (change.type === 'modified') {
// Actualizar estado local
dispatch(updateTask(change.doc.data()));
}
});
});
} catch (error) {
console.error('Error syncing tasks:', error);
// Guardar para reintento posterior
await AsyncStorage.setItem('syncFailed', 'true');
}
};
Explora el código y prueba la aplicación: