Files
studysprint/notes/work-report-2026-04-22.md
2026-04-22 20:58:00 +02:00

3.3 KiB

#Overview

Implemented a full local notification system for assignment deadlines using Expo Notifications, integrated with Supabase-backed assignment data.


#CoreFeatures

#LocalNotifications

  • Integrated expo-notifications for scheduling local device notifications

  • Configured notification handler for:

    • banner display
    • sound
    • badge updates
  • Notifications trigger even when:

    • app is in background
    • app is fully closed

#DeadlineReminderLogic

  • Implemented reminder scheduling based on assignment deadlines

  • Default behavior:

    • notify 24 hours before deadline
  • Prevented invalid scheduling:

    • skip if reminder time is in the past
    • validate deadline input before scheduling

#AssignmentIntegration

  • Notifications tied directly to assignment lifecycle:

On Create:

  • Insert assignment into Supabase
  • Retrieve inserted assignment (aId)
  • Schedule reminder if not completed

On Edit:

  • Cancel existing scheduled notification
  • Update assignment in Supabase
  • Schedule new reminder if still active

On Delete:

  • Cancel scheduled notification
  • Remove stored notification reference

#NotificationPersistence

  • Stored notification IDs locally using AsyncStorage

  • Structure:

    • assignmentId → notificationId
  • Enables:

    • precise cancellation
    • avoiding duplicate notifications

#NotificationCancellation

  • Implemented cancellation flow using:

    • Notifications.cancelScheduledNotificationAsync(notificationId)
  • Ensures:

    • no duplicate reminders on edit
    • no orphan notifications after deletion

#NotificationRouting

  • Implemented navigation on notification tap

  • Uses:

    • Notifications.addNotificationResponseReceivedListener
    • Notifications.getLastNotificationResponse()

Behavior:

  • Works when:

    • app is open
    • app is in background
    • app is launched from notification

Routing:

  • Extract aId from notification.content.data
  • Navigate using Expo Router:
router.push({
  pathname: "/assignment/viewDetailsAssignment",
  params: { aId }
});

#AuthIntegration

  • Notification observer only runs when user session exists
  • Prevents routing into protected screens when unauthenticated

#ArchitectureDecisions

#LocalVsBackend

  • Chose local notifications only

  • No backend push notifications used

  • Rationale:

    • single-user reminders
    • simpler implementation
    • no need for push tokens or server logic

#DataSeparation

  • Supabase:

    • stores assignment data (source of truth)
  • Device (AsyncStorage):

    • stores notification IDs (device-specific state)

#RoutingApproach

  • Used existing static route:

    • /assignment/viewDetailsAssignment
  • Passed aId via params instead of dynamic route [aId].tsx

  • Keeps current structure intact


#Summary

A complete local notification system has been implemented with:

  • deadline-based scheduling
  • lifecycle-aware updates (create/edit/delete)
  • duplicate prevention
  • device-level persistence
  • deep-link style navigation on tap

This provides a solid, production-ready foundation for assignment reminders within the app.

Interesting sources: https://docs.expo.dev/versions/latest/sdk/async-storage/ https://docs.expo.dev/versions/latest/sdk/securestore/ https://docs.expo.dev/versions/latest/sdk/notifications/