LogoLupe

App de Tareas

Descripción del proyecto

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.

Características principales

  • Sincronización en la nube
  • Notificaciones push
  • Categorización de tareas
  • Recordatorios
  • Modo offline
  • Compartir tareas
  • Etiquetas personalizadas
  • Estadísticas de productividad

Stack tecnológico

Frontend

  • React Native
  • Redux Toolkit
  • React Navigation
  • React Native Paper

Backend

  • Firebase Authentication
  • Cloud Firestore
  • Cloud Functions
  • Firebase Cloud Messaging

Características móviles

  • Almacenamiento local
  • Notificaciones push
  • Sincronización background
  • Biometría

Ejemplos de código

Modelo de Tarea

// 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,
    };
  },
};

Lógica de Sincronización

// 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');
  }
};

Recursos adicionales

Explora el código y prueba la aplicación: