# Push Notification Test Payloads

These `.apns` files can be dragged onto the iOS Simulator to test push notifications with action buttons.

## How to Use

1. Run the app on the iOS Simulator
2. Drag and drop any `.apns` file onto the Simulator window
3. The notification will appear with the appropriate action buttons

## Before Testing

Edit the `task_id` in each file to match a valid task ID from your database.

## Available Payloads

| File | Category | Actions | Description |
|------|----------|---------|-------------|
| `task_overdue.apns` | TASK_ACTIONABLE | edit, complete, cancel, mark_in_progress | Overdue task notification |
| `task_due_soon.apns` | TASK_ACTIONABLE | edit, complete, cancel, mark_in_progress | Task due within threshold |
| `task_in_progress.apns` | TASK_IN_PROGRESS | edit, complete, cancel | Task being worked on |
| `task_cancelled.apns` | TASK_CANCELLED | uncancel, delete | Cancelled task |
| `task_completed.apns` | TASK_COMPLETED | (none - read only) | Completed one-time task |
| `task_assigned.apns` | TASK_ACTIONABLE | edit, complete, cancel, mark_in_progress | Task assigned to user |
| `task_generic_free_user.apns` | TASK_NOTIFICATION_GENERIC | (none) | Free user sees generic message |

## iOS Notification Categories

The `category` field in `aps` maps to these iOS notification categories:

- `TASK_ACTIONABLE` - For overdue, due_soon, upcoming tasks (full action set)
- `TASK_IN_PROGRESS` - For tasks currently being worked on
- `TASK_CANCELLED` - For cancelled tasks (can uncancel or delete)
- `TASK_COMPLETED` - For completed one-time tasks (read-only, no actions)
- `TASK_NOTIFICATION_GENERIC` - For free users (no actions, generic message)

## Payload Structure

```json
{
    "Simulator Target Bundle": "com.tt.honeyDue.honeyDueDev",
    "aps": {
        "alert": {
            "title": "Notification Title",
            "subtitle": "Residence Name",
            "body": "Notification body text"
        },
        "sound": "default",
        "badge": 1,
        "category": "TASK_ACTIONABLE",
        "mutable-content": 1,
        "thread-id": "task-{id}"
    },
    "task_id": 123,
    "task_name": "Task Name",
    "residence_id": 1,
    "residence_name": "Residence Name",
    "notification_type": "task_overdue|task_due_soon|task_completed|task_assigned",
    "button_types": ["edit", "complete", "cancel", "mark_in_progress"],
    "is_premium": true
}
```

## Custom Data Fields

| Field | Type | Description |
|-------|------|-------------|
| `task_id` | int | The task ID to navigate to when tapped |
| `task_name` | string | Display name of the task |
| `residence_id` | int | The residence ID |
| `residence_name` | string | Display name of the residence |
| `notification_type` | string | Type of notification (for analytics/logging) |
| `button_types` | array | Available actions for this task state |
| `is_premium` | bool | Whether user is premium (affects display) |

## Notes

- The `Simulator Target Bundle` must match your app's bundle identifier
- `mutable-content: 1` allows the Notification Service Extension to modify content
- `thread-id` groups related notifications together
- The app must register notification categories on launch for actions to work
