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-notificationsfor 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.addNotificationResponseReceivedListenerNotifications.getLastNotificationResponse()
Behavior:
-
Works when:
- app is open
- app is in background
- app is launched from notification
Routing:
- Extract
aIdfromnotification.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
aIdvia 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/