Summary
On Home, long-pressing a video card silently enters bulk-selection mode. Replace that with an iOS-style context menu offering a thumbnail preview and quick actions (Favorite, Edit, Share, Delete, Select).
Scope corrected 2026-07-25. The original body named VideoCard and VideoCardCompact as the affected components. Only one card is involved, on one screen — details under "Actual surface".
Actual surface
Long-press is wired in exactly one place in the repo:
src/app/(tabs)/index/index.tsx:319 — onLongPress={() => handleVideoLongPress(item.id)}, which drives useSelectionMode (:166, handler at :183).
VideoCardCompact merely forwards an optional onLongPress prop (:25, :41, :98). Its other four consumers do not pass one, so they have no long-press behaviour to replace:
src/app/(tabs)/calendar/index.tsx:280
src/app/(tabs)/dashboard/index.tsx:184
src/app/(tabs)/search/index.tsx:97
src/app/settings/duplicate-candidates.tsx:144
VideoCard is not affected. Its props are { video, onPress } only (src/components/VideoCard.tsx:24) — it has no long-press path, and a repo-wide grep finds no importer at all, so it is unreferenced. Its removal is tracked separately and is not a prerequisite here.
So the change is confined to Home. Whether the other four surfaces should gain the same menu is a follow-up decision, not part of this issue.
Proposal
- Wrap the Home card with a native iOS context menu.
react-native-ios-context-menu is not currently a dependency (confirmed against package.json), so this adds one — weigh that against Expo SDK 55 / RN 0.83 compatibility before committing.
- Menu items: Toggle Favorite, Edit (open video detail), Share (native share sheet), Delete, Select (enters the existing
useSelectionMode flow).
- Tap is unchanged — still opens video detail.
- Android / Web keep the current long-press-to-select fallback.
Notes
- Selection mode itself stays; it stops being the default long-press outcome and becomes a menu item, matching Photos.
- Haptics must go through
src/services/hapticsService.ts — direct expo-haptics imports are blocked by no-restricted-imports in eslint.config.js.
- If the context-menu library turns out to be incompatible with the current SDK, an acceptable smaller outcome is to keep selection mode but give long-press a visible affordance.
Acceptance criteria
- Long-press on a Home video card shows a context menu with at least Favorite / Edit / Delete / Select.
- Tap still opens the video detail screen.
- Bulk selection mode remains reachable via the
Select action, and the rest of useSelectionMode is unchanged.
- Calendar / dashboard / search / duplicate-candidates are visibly unaffected.
- Web and Android do not crash and keep current behaviour.
Summary
On Home, long-pressing a video card silently enters bulk-selection mode. Replace that with an iOS-style context menu offering a thumbnail preview and quick actions (Favorite, Edit, Share, Delete, Select).
Actual surface
Long-press is wired in exactly one place in the repo:
src/app/(tabs)/index/index.tsx:319—onLongPress={() => handleVideoLongPress(item.id)}, which drivesuseSelectionMode(:166, handler at:183).VideoCardCompactmerely forwards an optionalonLongPressprop (:25, :41, :98). Its other four consumers do not pass one, so they have no long-press behaviour to replace:src/app/(tabs)/calendar/index.tsx:280src/app/(tabs)/dashboard/index.tsx:184src/app/(tabs)/search/index.tsx:97src/app/settings/duplicate-candidates.tsx:144VideoCardis not affected. Its props are{ video, onPress }only (src/components/VideoCard.tsx:24) — it has no long-press path, and a repo-wide grep finds no importer at all, so it is unreferenced. Its removal is tracked separately and is not a prerequisite here.So the change is confined to Home. Whether the other four surfaces should gain the same menu is a follow-up decision, not part of this issue.
Proposal
react-native-ios-context-menuis not currently a dependency (confirmed againstpackage.json), so this adds one — weigh that against Expo SDK 55 / RN 0.83 compatibility before committing.useSelectionModeflow).Notes
src/services/hapticsService.ts— directexpo-hapticsimports are blocked byno-restricted-importsineslint.config.js.Acceptance criteria
Selectaction, and the rest ofuseSelectionModeis unchanged.