Repository navigation
feat(web): complete live roster drag for bots and groups - #218
Conversation
The live BotRosterSidebar could reorder sections and rows with hello-pangea, but pins were not a drop target and drag cleanup was incomplete. Port the upstream sidebar pointer, insertion-gap, and motion behavior onto the live bot/group roster without settling chats or changing group membership.
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
This is Leo's agent. GroupThreadLanding hook-order crash, reproduced on baseline rather than inferred from an untouched file:
Follow-up drag evidence on this branch: Crew group row dragged to the top without navigating away from Mori; mobile sidebar opened and Akeru dragged above Scout in the sheet. |
Greptile SummaryThis update unifies roster sorting across bots, groups, sections, pinned entries, and Unassigned entries. It adds pointer-drag cleanup, accessible menu-based reordering, motion and insertion feedback, and persistence support for newly discovered Unassigned items. Confidence Score: 5/5Safe to merge; there are no outstanding blocking issues. greptile-apps[bot] manually resolved the keyboard-reordering thread without explanation. greptile-apps[bot] manually resolved the interrupted-drag click-suppression thread without explanation. greptile-apps[bot] manually resolved the keyboard action activation thread without explanation. leoisadev1 manually resolved the Unassigned reorder thread without explanation. Reviews (4): Last reviewed commit: "fix(web): reconcile live roster items be..." | Re-trigger Greptile |
Greptile found that the live roster registered only a pointer sensor, and that a cancelled drag could leave a capture-phase click suppressor that blocked the next keyboard activation. Register dnd-kit's keyboard sensor and drop that suppressor on keydown.
dnd-kit KeyboardSensor made Enter/Space start a drag on live bot and group rows. Put Move up/down on the existing action menus, and ignore keyboard-generated clicks plus the next keydown in cancelled-drag click suppression. Grok 4.6 in Akeru Bot.
Problem
The live Akeru roster (
BotRosterSidebar) used@hello-pangea/dnd. Pins were a display-only strip, not a sortable destination. Drag cleanup did not cover Escape, blur, hidden tab, unmount, or a missed release. Insertion-gap motion, destination labels, and empty/collapsed targets from upstream thread-sidebar drag never reached the live bot/group UI.Change
Adapt upstream sidebar drag onto the live roster, not the dead
Sidebar.tsx.detail === 0) and clears on the next keydownLayout is still browser-local per environment. Server-backed roster order, sidebar file drops, and native arrange are follow-up PRs.
Upstream
Reviewed adaptations of pingdotgg/t3code:
Scope checklist
activeOrder)Verification
vp test runon roster logic/store/drag/pointer/motion plus SidebarChrome and shortcut guards: 96 passedvp lintandvp run --filter @t3tools/web typecheckon the changed files: cleanvp run dev --home-dir /tmp/akeru-roster-drag.VVPXZ4with pairing/bots/...); the drag did not navigate.ceb469ba2): Actions menu Move up on Mori (Crew, Mori, Scout, Akeru), Move down on Crew (Mori, Crew, Scout, Akeru). Enter on the Akeru row opened Akeru chat; Enter on Crew opened the group chat (no KeyboardSensor drag). Pointer-drag Scout, Escape cancel, then Enter on Akeru still opened Akeru. Blur cancel, then Actions Move down on Mori (Crew, Mori, Scout, Akeru). Hidden/visibility cancel without pointerup, then Enter on Scout still opened Scout.GroupThreadLanding hook crash (baseline)
Opening
/groups/...still hitsRendered more hooks than during the previous renderinGroupThreadLandingatuseReplyPlaybackThread(line 96), afterif (!group) return null(line 90).Isolated baseline proof, not “the file was untouched”:
apps/web/src/components/roster/GroupThreadLanding.tsxis identical onorigin/main, this worktree, and PR 218 HEAD:a2c27563b420e122f83e658567071580e773fe0b. Last change:4314798bd feat(web): add Read aloud for stored bot replies (#194).fix/group-reply-playback-hook-order,ThreadLanding.hookOrder.test.tsx) against that baseline file without applying fix(web): keep reply playback hooks stable during chat hydration #202’s fix. All three cases failed with the same error: missing bot, archived bot, and missing group then hydrated group. Group failure stack:GroupThreadLanding.tsx:96→useReplyPlaybackThread.roster-drag.webm
Limitations
window.prompt.Grok 4.6 High in Grok Build via Orca.