Merge branch 'main' into timer

This commit is contained in:
Chris Sanden
2026-04-25 15:49:06 +02:00
committed by GitHub
20 changed files with 575 additions and 54 deletions

View File

@@ -0,0 +1,173 @@
## #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:
```ts
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/