# Mutations Optimistic Updates Audit

**Date**: 2026-01-11  
**Action**: 4.4.1.4 - Audit all mutations for optimistic updates  
**Status**: ✅ Complete

## Summary

This document audits all React Query mutations in the codebase to identify which mutations have optimistic updates and which are missing them.

## Methodology

- Searched for all `useMutation` calls in the codebase
- Checked each mutation for:
  - `onMutate` handler (optimistic update)
  - `createOptimisticUpdate`, `createArrayOptimisticUpdate`, `createToggleOptimisticUpdate` usage
  - Manual optimistic update logic in `onMutate`
- Categorized mutations by optimistic update status

## Mutations WITH Optimistic Updates ✅

### 1. Like/Unlike Track (`LikeButton.tsx`)
- **Mutations**: `likeMutation`, `unlikeMutation`
- **Type**: Manual `onMutate` with local state
- **Pattern**: Updates local state (`isLiked`, `likeCount`) optimistically
- **Rollback**: Manual revert in `onError`
- **Lines**: 67-96 (like), 99-120 (unlike)

### 2. Follow/Unfollow Playlist (`PlaylistFollowButton.tsx`)
- **Mutations**: `followMutation`, `unfollowMutation`
- **Type**: Manual `onMutate` with local state
- **Pattern**: Updates local state (`following`, `followerCount`) optimistically
- **Rollback**: Manual revert in `onError`
- **Lines**: 84-114 (follow), 117-145 (unfollow)

## Mutations WITHOUT Optimistic Updates ❌

### Playlist Operations (`usePlaylist.ts`)

#### 1. `useCreatePlaylist`
- **Mutation**: Create playlist
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update to immediately show new playlist in list

#### 2. `useUpdatePlaylist`
- **Mutation**: Update playlist
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createOptimisticUpdate` utility

#### 3. `useDeletePlaylist`
- **Mutation**: Delete playlist
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update to immediately remove from list

#### 4. `useAddTrackToPlaylist`
- **Mutation**: Add track to playlist
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createArrayOptimisticUpdate` (operation: 'add')

#### 5. `useAddCollaborator`
- **Mutation**: Add collaborator to playlist
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createArrayOptimisticUpdate` (operation: 'add')

#### 6. `useRemoveCollaborator`
- **Mutation**: Remove collaborator from playlist
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createArrayOptimisticUpdate` (operation: 'remove')

#### 7. `useUpdateCollaboratorPermission`
- **Mutation**: Update collaborator permission
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createArrayOptimisticUpdate` (operation: 'update')

#### 8. `useReorderPlaylistTracks`
- **Mutation**: Reorder tracks in playlist
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update to immediately show new order

### Comment Operations

#### 9. `createCommentMutation` (`CommentSection.tsx`)
- **Mutation**: Create comment
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createArrayOptimisticUpdate` (operation: 'add')

#### 10. `createReplyMutation` (`CommentThread.tsx`)
- **Mutation**: Create reply to comment
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createArrayOptimisticUpdate` (operation: 'add')

#### 11. `updateCommentMutation` (`CommentThread.tsx`)
- **Mutation**: Update comment
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createArrayOptimisticUpdate` (operation: 'update')

#### 12. `deleteCommentMutation` (`CommentThread.tsx`)
- **Mutation**: Delete comment
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createArrayOptimisticUpdate` (operation: 'remove')

### Chat Operations

#### 13. `leaveRoomMutation` (`ChatSidebar.tsx`)
- **Mutation**: Leave chat room
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update to immediately remove from conversation list

#### 14. `deleteRoomMutation` (`ChatSidebar.tsx`)
- **Mutation**: Delete chat room
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update to immediately remove from conversation list

### Notification Operations

#### 15. `markAsReadMutation` (`NotificationMenu.tsx`, `NotificationsPage.tsx`)
- **Mutation**: Mark notification as read
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update using `createArrayOptimisticUpdate` (operation: 'update')

#### 16. `markAllAsReadMutation` (`NotificationMenu.tsx`, `NotificationsPage.tsx`)
- **Mutation**: Mark all notifications as read
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update to immediately update all notifications

### Share Link Operations

#### 17. `createShareMutation` (`ShareLinkManager.tsx`)
- **Mutation**: Create share link
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update to immediately show share link

#### 18. `revokeShareMutation` (`ShareLinkManager.tsx`)
- **Mutation**: Revoke share link
- **Current**: Only `onSuccess` invalidation
- **Recommendation**: Add optimistic update to immediately remove share link

### Auth Operations

#### 19. `useLogin` (`useLogin.ts`)
- **Mutation**: Login
- **Current**: No optimistic update (correct - auth state should not be optimistic)
- **Recommendation**: ✅ No optimistic update needed (security-sensitive)

#### 20. `useRegister` (`useRegister.ts`)
- **Mutation**: Register
- **Current**: No optimistic update (correct - auth state should not be optimistic)
- **Recommendation**: ✅ No optimistic update needed (security-sensitive)

## Statistics

- **Total Mutations Found**: 20+
- **With Optimistic Updates**: 4 (20%) - LikeButton, PlaylistFollowButton
- **With Partial Optimistic Updates**: 2 (10%) - ShareLinkManager (local state in onSuccess)
- **Without Optimistic Updates**: 14+ (70%)
- **Should Not Have Optimistic Updates**: 2 (auth operations)

## Patterns Identified

### Pattern 1: Manual Local State Optimistic Updates
- **Used in**: `LikeButton`, `PlaylistFollowButton`
- **Approach**: Update local component state in `onMutate`, revert in `onError`
- **Pros**: Simple, works for isolated component state
- **Cons**: Doesn't update React Query cache, requires manual rollback

### Pattern 2: React Query Cache Invalidation Only
- **Used in**: Most mutations
- **Approach**: Only invalidate queries on success, wait for refetch
- **Pros**: Simple, ensures data consistency
- **Cons**: No immediate feedback, requires network round-trip

### Pattern 3: Utility-Based Optimistic Updates (Available but Unused)
- **Available**: `createOptimisticUpdate`, `createArrayOptimisticUpdate`, `createToggleOptimisticUpdate`
- **Used in**: None currently
- **Approach**: Use utility functions for consistent optimistic updates
- **Pros**: Consistent pattern, automatic rollback, updates React Query cache
- **Cons**: Requires setup

## Recommendations

### High Priority (User-Facing Operations)
1. **Playlist operations** (`useCreatePlaylist`, `useUpdatePlaylist`, `useDeletePlaylist`)
2. **Track operations** (`useAddTrackToPlaylist`)
3. **Comment operations** (create, update, delete)
4. **Follow/Like operations** (already have optimistic updates ✅)

### Medium Priority (Frequent Operations)
1. **Collaborator operations** (add, remove, update)
2. **Notification operations** (mark as read)
3. **Share link operations** (create, revoke)

### Low Priority (Less Frequent)
1. **Chat operations** (leave room, delete room)
2. **Reorder operations** (reorder playlist tracks)

## Next Steps

1. ✅ **Action 4.4.1.4**: Audit complete - Documented all mutations
2. **Action 4.4.1.5**: Add optimistic updates to mutations missing them (prioritize high-priority operations)
3. **Action 4.4.1.2**: Migrate manual optimistic updates to use utility functions (LikeButton, PlaylistFollowButton)

## Files Audited

- `apps/web/src/features/playlists/hooks/usePlaylist.ts` - 9 mutations
- `apps/web/src/features/tracks/components/LikeButton.tsx` - 2 mutations (with optimistic ✅)
- `apps/web/src/features/playlists/components/PlaylistFollowButton.tsx` - 2 mutations (with optimistic ✅)
- `apps/web/src/features/tracks/components/CommentSection.tsx` - 1 mutation
- `apps/web/src/features/tracks/components/CommentThread.tsx` - 3 mutations
- `apps/web/src/features/chat/components/ChatSidebar.tsx` - 2 mutations
- `apps/web/src/components/notifications/NotificationMenu.tsx` - 2 mutations
- `apps/web/src/features/notifications/pages/NotificationsPage.tsx` - 2 mutations
- `apps/web/src/components/share/ShareLinkManager.tsx` - 2 mutations
- `apps/web/src/features/auth/hooks/useLogin.ts` - 1 mutation (no optimistic needed ✅)
- `apps/web/src/features/auth/hooks/useRegister.ts` - 1 mutation (no optimistic needed ✅)
