This repository has no description
0

Configure Feed

Select the types of activity you want to include in your feed.

at main 218 lines 7.1 kB View raw View rendered
1# Edit & Delete Flush Feature 2 3## Overview 4This feature allows users to edit and delete their own flush records directly from their profile page. The implementation includes a modal interface for editing, client-side validation, and proper handling through the AT Protocol and Jetstream firehose. 5 6## What Was Added 7 8### 1. API Client Functions (`src/lib/api-client.ts`) 9Added two new functions to handle record management: 10 11- **`deleteFlushRecord(session, recordUri)`**: Deletes a flush record using the AT Protocol's `deleteRecord` method 12- **`updateFlushRecord(session, recordUri, text, emoji, originalCreatedAt)`**: Updates a flush record using the AT Protocol's `putRecord` method 13 14Both functions: 15- Parse AT URIs correctly (format: `at://did:plc:xxx/collection.name/rkey`) 16- Use the OAuth session's Agent for authenticated requests 17- Include proper error handling and logging 18- Preserve the original `createdAt` timestamp on updates 19 20### 2. Edit Modal Component (`src/components/EditFlushModal.tsx`) 21A beautiful modal dialog that provides: 22 23- Pre-populated form with the flush's current text and emoji 24- Character counter (59 character limit) 25- Emoji selector with all approved emojis 26- Content validation (banned words, character limits) 27- Delete confirmation workflow 28- Loading states for all async operations 29- Error handling with user-friendly messages 30- Backdrop click to close 31- Responsive design for mobile devices 32 33### 3. Profile Page Updates (`src/app/profile/[handle]/page.tsx`) 34Enhanced the profile page with: 35 36- Edit button on each flush (only visible to the flush owner) 37- Authentication check using `useAuth()` hook to compare DIDs 38- Integration with `EditFlushModal` component 39- State management for editing operations 40- Success/error message display 41- Optimistic UI updates (updates local state immediately) 42 43New state variables: 44- `editingFlush`: Tracks which flush is being edited 45- `actionError`: Displays error messages 46- `actionSuccess`: Displays success messages 47 48New functions: 49- `isOwnProfile()`: Checks if the logged-in user owns the profile 50- `handleUpdateFlush()`: Handles the update operation 51- `handleDeleteFlush()`: Handles the delete operation 52 53### 4. Profile Styles (`src/app/profile/[handle]/profile.module.css`) 54Added styles for: 55 56- `.contentRight`: Container for timestamp and edit button 57- `.editButton`: Pencil icon button with hover effects 58- `.actionError`: Error message styling 59- `.actionSuccess`: Success message styling 60 61### 5. Edit Modal Styles (`src/components/EditFlushModal.module.css`) 62Complete styling for the modal including: 63 64- Dark backdrop overlay 65- Centered modal with max-width 66- Form inputs and emoji grid 67- Action buttons (Save, Cancel, Delete) 68- Delete confirmation UI 69- Responsive mobile layout 70- Smooth transitions and hover effects 71 72### 6. Jetstream Consumer (`scripts/firehose-worker.js`) 73Updated to properly handle: 74 75- **Delete operations**: Removes records from Supabase when deleted from the network 76- **Update operations**: Updates existing records with new content 77- URI construction for record matching 78- Proper error handling for database operations 79 80## How It Works 81 82### User Flow 83 841. **User navigates to their own profile** 85 - Edit buttons appear next to each of their flushes 86 - Buttons are hidden for other users' profiles 87 882. **User clicks edit button** 89 - Modal opens with pre-filled form 90 - Current text and emoji are displayed 91 - User can modify text and/or emoji 92 - Character counter shows remaining characters 93 943. **User saves changes** 95 - Validation runs (banned words, character limits) 96 - API call made to update the record via AT Protocol 97 - Local state updates immediately (optimistic UI) 98 - Success message displayed 99 - Modal closes automatically 100 1014. **User deletes a flush** 102 - Clicks "Delete Flush" button 103 - Confirmation prompt appears 104 - On confirmation, record is deleted via AT Protocol 105 - Record removed from local state 106 - Success message displayed 107 - Modal closes 108 109### Technical Flow 110 111#### Update Operation 112``` 113User clicks Save 114 → Validation (client-side) 115 → updateFlushRecord(session, uri, text, emoji, createdAt) 116 → Agent.api.com.atproto.repo.putRecord() 117 → PDS updates the record 118 → Jetstream firehose emits 'update' event 119 → Worker processes event 120 → Supabase record updated 121 → UI updates optimistically 122``` 123 124#### Delete Operation 125``` 126User confirms delete 127 → deleteFlushRecord(session, uri) 128 → Agent.api.com.atproto.repo.deleteRecord() 129 → PDS deletes the record 130 → Jetstream firehose emits 'delete' event 131 → Worker processes event 132 → Supabase record deleted 133 → UI updates optimistically 134``` 135 136## Authorization 137 138- Uses OAuth session from `@atproto/oauth-client-browser` 139- Compares `session.sub` (user's DID) with `profileData.did` 140- Edit buttons only visible when DIDs match 141- AT Protocol handles authorization at the PDS level 142- Users can only edit/delete their own records 143 144## Validation 145 146All validation from the original flush creation is preserved: 147 148- **Character limit**: 59 characters 149- **Banned words**: Content filtering via `containsBannedWords()` 150- **Text sanitization**: via `sanitizeText()` 151- **Emoji validation**: Only approved emojis from the list 152- **Authentication**: Must be logged in 153 154## Error Handling 155 156Comprehensive error handling at every level: 157 158- Network failures 159- Authorization errors 160- Validation errors 161- User-friendly error messages 162- Console logging for debugging 163- Graceful degradation 164 165## Responsive Design 166 167The modal and edit buttons work beautifully on: 168 169- Desktop screens 170- Tablets 171- Mobile devices 172 173Features: 174- Touch-friendly button sizes 175- Readable text at all sizes 176- Scrollable modal content 177- Proper spacing and padding 178 179## Future Enhancements 180 181Potential improvements: 182 1831. **Edit history**: Track when records were edited 1842. **Undo functionality**: Allow users to revert changes 1853. **Bulk operations**: Edit/delete multiple flushes at once 1864. **Keyboard shortcuts**: Quick access to edit/delete 1875. **Inline editing**: Edit directly in the feed without modal 1886. **Draft saving**: Save edits as drafts before publishing 189 190## Testing Checklist 191 192To verify the feature works correctly: 193 194- [ ] Edit button appears on own profile only 195- [ ] Edit button hidden on other users' profiles 196- [ ] Modal opens when edit button clicked 197- [ ] Form pre-populates with current values 198- [ ] Text changes are validated 199- [ ] Emoji selection works 200- [ ] Character counter updates correctly 201- [ ] Save button updates the record 202- [ ] Delete button shows confirmation 203- [ ] Delete confirmation works 204- [ ] Cancel buttons close modal 205- [ ] Success messages display 206- [ ] Error messages display 207- [ ] Local state updates optimistically 208- [ ] Jetstream updates Supabase correctly 209- [ ] Mobile layout works properly 210 211## Notes 212 213- Records maintain their original `createdAt` timestamp when updated 214- Updates create a new CID (Content Identifier) for the record 215- The URI remains the same (same `rkey`) 216- Deletes are permanent and cannot be undone 217- All operations respect AT Protocol's distributed architecture 218