import { useState } from '@wordpress/element'; import type { Link } from '../../shared/api/types/links'; function withLinkSelected( selectedIds: ReadonlySet< number >, linkId: number, isSelected: boolean ): ReadonlySet< number > { const nextIds = new Set( selectedIds ); if ( isSelected ) { nextIds.add( linkId ); } else { nextIds.delete( linkId ); } return nextIds; } export function useLinkSelection( shownLinks: readonly Link[] ) { const [ selectedIds, setSelectedIds ] = useState< ReadonlySet< number > >( () => new Set() ); const selectedLinks = shownLinks.filter( ( link ) => selectedIds.has( link.id ) ); const select = ( linkId: number, isSelected: boolean ) => { setSelectedIds( ( previousIds ) => withLinkSelected( previousIds, linkId, isSelected ) ); }; const selectAll = () => { setSelectedIds( new Set( shownLinks.map( ( link ) => link.id ) ) ); }; const clear = () => { setSelectedIds( new Set() ); }; return { selectedIds, selectedLinks, select, selectAll, clear }; } export type LinkSelection = ReturnType< typeof useLinkSelection >;