@@ -11,12 +11,14 @@ import { FilterBar } from './FilterBar'
1111import { SelectionActionBar } from './SelectionActionBar'
1212import { SettingsView } from '../ui/SettingsView'
1313import { HelpModal } from '../ui/HelpModal'
14+ import { QuickTagModal } from '../ui/QuickTagModal'
1415import { ToastContainer } from '../ui/Toast'
1516import { PackageOpen } from '../ui/Icons'
1617import {
1718 getAllBookmarks ,
1819 deleteBookmark ,
1920 bulkDeleteBookmarks ,
21+ toggleReadLater ,
2022} from '../../services/bookmarks'
2123
2224export function BookmarkList ( ) {
@@ -52,6 +54,8 @@ export function BookmarkList() {
5254 const [ searchQuery , setSearchQuery ] = useState ( '' )
5355 const [ isSidebarOpen , setIsSidebarOpen ] = useState ( false )
5456 const [ isHelpOpen , setIsHelpOpen ] = useState ( false )
57+ const [ isTagModalOpen , setIsTagModalOpen ] = useState ( false )
58+ const [ tagModalBookmark , setTagModalBookmark ] = useState ( null )
5559 const [ selectedIndex , setSelectedIndex ] = useState ( - 1 )
5660 const [ selectionMode , setSelectionMode ] = useState ( false )
5761 const [ selectedIds , setSelectedIds ] = useState ( new Set ( ) )
@@ -335,6 +339,63 @@ export function BookmarkList() {
335339 }
336340 } , [ selectedIds , addToast , exitSelectionMode ] )
337341
342+ // Get the currently selected bookmark
343+ const getSelectedBookmark = useCallback ( ( ) => {
344+ if ( selectedIndex >= 0 && selectedIndex < filteredBookmarks . length ) {
345+ return filteredBookmarks [ selectedIndex ]
346+ }
347+ return null
348+ } , [ selectedIndex , filteredBookmarks ] )
349+
350+ // Shift+T: Open tag edit modal for selected bookmark
351+ const openTagModal = useCallback ( ( ) => {
352+ if ( filterView === 'inbox' ) return
353+ if ( isAddingNew || editingBookmarkId ) return
354+ const bookmark = getSelectedBookmark ( )
355+ if ( bookmark ) {
356+ setTagModalBookmark ( bookmark )
357+ setIsTagModalOpen ( true )
358+ }
359+ } , [ filterView , isAddingNew , editingBookmarkId , getSelectedBookmark ] )
360+
361+ const closeTagModal = useCallback ( ( ) => {
362+ setIsTagModalOpen ( false )
363+ setTagModalBookmark ( null )
364+ } , [ ] )
365+
366+ // Shift+L: Toggle read later for selected bookmark
367+ const toggleReadLaterSelected = useCallback ( ( ) => {
368+ if ( filterView === 'inbox' ) return
369+ if ( isAddingNew || editingBookmarkId ) return
370+ const bookmark = getSelectedBookmark ( )
371+ if ( bookmark ) {
372+ try {
373+ const newValue = toggleReadLater ( bookmark . _id )
374+ addToast ( {
375+ message : newValue ? 'Added to Read Later' : 'Removed from Read Later' ,
376+ duration : 2000 ,
377+ } )
378+ } catch ( error ) {
379+ console . error ( 'Failed to toggle read later:' , error )
380+ }
381+ }
382+ } , [ filterView , isAddingNew , editingBookmarkId , getSelectedBookmark , addToast ] )
383+
384+ // c: Copy URL to clipboard
385+ const copySelectedUrl = useCallback ( ( ) => {
386+ if ( filterView === 'inbox' ) return
387+ if ( isAddingNew || editingBookmarkId ) return
388+ const bookmark = getSelectedBookmark ( )
389+ if ( bookmark ) {
390+ navigator . clipboard . writeText ( bookmark . url ) . then ( ( ) => {
391+ addToast ( { message : 'URL copied to clipboard' , duration : 2000 } )
392+ } ) . catch ( ( error ) => {
393+ console . error ( 'Failed to copy URL:' , error )
394+ addToast ( { message : 'Failed to copy URL' , duration : 2000 } )
395+ } )
396+ }
397+ } , [ filterView , isAddingNew , editingBookmarkId , getSelectedBookmark , addToast ] )
398+
338399 useEffect ( ( ) => {
339400 setSelectedIndex ( - 1 )
340401 } , [ filteredBookmarks . length , filterView , selectedTag , debouncedSearchQuery ] )
@@ -364,8 +425,12 @@ export function BookmarkList() {
364425 'shift+j' : selectNextWithShift ,
365426 'shift+k' : selectPrevWithShift ,
366427 'enter' : openSelected ,
428+ 'o' : openSelected ,
367429 'e' : editSelected ,
368430 'd' : selectionMode && selectedIds . size > 0 ? handleBulkDelete : deleteSelected ,
431+ 't' : openTagModal ,
432+ 'l' : toggleReadLaterSelected ,
433+ 'c' : copySelectedUrl ,
369434 'mod+k' : focusSearch ,
370435 'q' : exitInbox ,
371436 'mod+z' : handleUndo ,
@@ -547,6 +612,12 @@ export function BookmarkList() {
547612
548613 < HelpModal isOpen = { isHelpOpen } onClose = { ( ) => setIsHelpOpen ( false ) } />
549614
615+ < QuickTagModal
616+ isOpen = { isTagModalOpen }
617+ onClose = { closeTagModal }
618+ bookmark = { tagModalBookmark }
619+ />
620+
550621 < SelectionActionBar
551622 selectedCount = { selectedIds . size }
552623 onDelete = { handleBulkDelete }
0 commit comments