Skip to content

Instantly share code, notes, and snippets.

@shricodev
Created June 3, 2025 07:24
Show Gist options
  • Save shricodev/c577d1a73e16f4a3d030535fcff0f8cd to your computer and use it in GitHub Desktop.
Save shricodev/c577d1a73e16f4a3d030535fcff0f8cd to your computer and use it in GitHub Desktop.
Bug Fixing (Collaborative Editing): Claude Sonnet 4
󰜴 collaborative-editor git:(main) ✘ claude --model "claude-sonnet-4-20250514"
╭────────────────────────────────────────────────────────────────────────────────────────────────╮
│ ✻ Welcome to Claude Code! │
│ │
│ /help for help, /status for your current setup │
│ │
│ cwd: /home/shricodev/codes/work/blogs/composio/comparisons/claude-code/collaborative-editor │
╰────────────────────────────────────────────────────────────────────────────────────────────────╯
> Hey, the project had everything working, recently the project got introduced few bugs where a document name never updates even though you rename it and also a user seem to be able to
remove themselves as a collaborator from their own document. Also a user who should not have the permission to view a document is able to view it. Help me fix all of it.
● I'll help you fix these bugs in the collaborative editor. Let me create a todo list to track all the issues and then investigate each one.
● Update Todos
⎿  ☐ Investigate document name update bug - names not persisting after rename
☐ Fix user able to remove themselves as collaborator from own document
☐ Add access check in getDocument function to prevent unauthorized viewing
☐ Run npm run lint to check code quality
● Let me start by investigating the document management code to understand these issues.
● Read(lib/actions/room.actions.ts)…
⎿  Read 154 lines (ctrl+r to expand)
● Read(components/Header.tsx)…
⎿  Read 31 lines (ctrl+r to expand)
● Read(components/ShareModal.tsx)…
⎿  Read 119 lines (ctrl+r to expand)
● Now let me look at the Collaborator component and the CollaborativeRoom to understand the document title update issue:
● Read(components/Collaborator.tsx)…
⎿  Read 87 lines (ctrl+r to expand)
● Read(components/CollaborativeRoom.tsx)…
⎿  Read 144 lines (ctrl+r to expand)
● Now I can identify the issues. Let me update the todo and start fixing them:
● Update Todos
⎿  ☐ Investigate document name update bug - names not persisting after rename
☐ Fix user able to remove themselves as collaborator from own document
☐ Add access check in getDocument function to prevent unauthorized viewing
☐ Run npm run lint to check code quality
● I found the issues! Let me fix them one by one:
Issue 1: In updateDocument function (room.actions.ts:60), the title is hardcoded to "Untitled" instead of using the passed title parameter.
● Update(lib/actions/room.actions.ts)…
⎿  Updated lib/actions/room.actions.ts with 1 addition and 1 removal
57 try {
58 const updatedRoom = await liveblocks.updateRoom(roomId, {
59 metadata: {
60 title: "Untitled",
60 title,
61 },
62 });
63
● Update Todos
⎿  ☒ Investigate document name update bug - names not persisting after rename
☐ Fix user able to remove themselves as collaborator from own document
☐ Add access check in getDocument function to prevent unauthorized viewing
☐ Run npm run lint to check code quality
● Issue 2: In removeCollaborator function (room.actions.ts:132), the logic is inverted - it should prevent removing if the email EQUALS the creator's email, not if it doesn't equal.
● Update(lib/actions/room.actions.ts)…
⎿  Updated lib/actions/room.actions.ts with 6 additions and 2 removals
129 try {
130 const room = await liveblocks.getRoom(roomId);
131
132 if (room.metadata.email !== email) {
132 if (room.metadata.email === email) {
133 throw new Error("You cannot remove yourself as the document creator");
134 }
135
136 const updatedRoom = await liveblocks.updateRoom(roomId, {});
136 const updatedRoom = await liveblocks.updateRoom(roomId, {
137 usersAccesses: {
138 [email]: null,
139 },
140 });
141
142 revalidatePath(`/documents/${roomId}`);
143 return parseStringify(updatedRoom);
● Update Todos
⎿  ☒ Investigate document name update bug - names not persisting after rename
☒ Fix user able to remove themselves as collaborator from own document
☐ Add access check in getDocument function to prevent unauthorized viewing
☐ Run npm run lint to check code quality
● Issue 3: The getDocument function needs an access check. Let me check the utils file for access checking functions:
● Read(lib/utils.ts)…
⎿  Read 98 lines (ctrl+r to expand)
● Now I need to check the user's access to the room. Let me look at how Liveblocks handles user access and add the proper access check to the getDocument function:
● Update(lib/actions/room.actions.ts)…
⎿  Updated lib/actions/room.actions.ts with 9 additions
46 }) => {
47 try {
48 const room = await liveblocks.getRoom(roomId);
49
50 // Check if user has access to this room
51 const hasAccess = Object.keys(room.usersAccesses).includes(userId) ||
52 room.metadata.email === userId ||
53 room.metadata.creatorId === userId;
54
55 if (!hasAccess) {
56 throw new Error("You do not have access to this document");
57 }
58
59 return parseStringify(room);
60 } catch (error) {
61 console.log(`Error happened while getting a room: ${error}`);
● Update Todos
⎿  ☒ Investigate document name update bug - names not persisting after rename
☒ Fix user able to remove themselves as collaborator from own document
☒ Add access check in getDocument function to prevent unauthorized viewing
☐ Run npm run lint to check code quality
● Now let me run the lint command:
● Bash(npm run lint)…
⎿  > [email protected] lint
> next lint
✔ No ESLint warnings or errors
● Update Todos
⎿  ☒ Investigate document name update bug - names not persisting after rename
☒ Fix user able to remove themselves as collaborator from own document
☒ Add access check in getDocument function to prevent unauthorized viewing
☒ Run npm run lint to check code quality
● Fixed all bugs:
1. Document title not updating: updateDocument was hardcoded to set title as "Untitled" instead of using the passed parameter
2. Owner removing themselves: Logic was inverted - now prevents creator from removing themselves
3. Unauthorized document access: Added access validation in getDocument to check user permissions
4. Lint passed: No ESLint errors found
All issues resolved and code quality maintained.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment