diff --git a/packages/web/src/app/bookmarks/-bookmark-list.tsx b/packages/web/src/app/bookmarks/-bookmark-list.tsx
index 9cd1ecf..44ee26b 100644
--- a/packages/web/src/app/bookmarks/-bookmark-list.tsx
+++ b/packages/web/src/app/bookmarks/-bookmark-list.tsx
@@ -2,8 +2,8 @@ import type { Bookmark } from "@markone/core"
import { Link } from "@tanstack/react-router"
import clsx from "clsx"
import { memo, useCallback, useRef } from "react"
+import { Menu, MenuButton, MenuItems, MenuItem } from "@headlessui/react"
import { useBookmarkTags } from "~/bookmark/api"
-import { Button } from "~/components/button"
import { List, type ListRef } from "~/components/list"
import { DialogKind, ActionBarContentKind, useBookmarkPageStore } from "./-store"
import { useMnemonics } from "~/hooks/use-mnemonics"
@@ -18,7 +18,6 @@ export enum BookmarkListItemAction {
interface BookmarkListProps {
bookmarks: Bookmark[]
selectedBookmarkId?: string
- alwaysExpandItem: boolean
onSelectionChange?: (bookmark: Bookmark) => void
onItemAction: (bookmark: Bookmark, action: BookmarkListItemAction) => void
className?: string
@@ -38,93 +37,104 @@ const BookmarkTagList = memo(function BookmarkTagList({ bookmark }: { bookmark:
) : null
})
-const BookmarkListItem = memo(function BookmarkListItem({
+const BookmarkItemMenu = memo(function BookmarkItemMenu({
bookmark,
- isSelected,
- isExpanded,
- onSelect,
- onExpand,
onItemAction,
- alwaysExpandItem,
}: {
bookmark: Bookmark
- isSelected: boolean
- isExpanded: boolean
- onSelect: () => void
- onExpand: () => void
onItemAction: (bookmark: Bookmark, action: BookmarkListItemAction) => void
- alwaysExpandItem: boolean
}) {
- const url = new URL(bookmark.url)
-
return (
-
-
-
-
- {bookmark.title}
-
-
{url.host}
- {isExpanded ? (
- <>
-
-
-
-
-
-
-
-
-
- >
- ) : null}
-
-
+ More options for {bookmark.title}
+ ⋯
+
+
+
+
+
+
+
+
+
)
})
+const BookmarkListItem = memo(
+ ({
+ bookmark,
+ isSelected,
+ onItemAction,
+ }: {
+ bookmark: Bookmark
+ isSelected: boolean
+ onItemAction: (bookmark: Bookmark, action: BookmarkListItemAction) => void
+ }) => {
+ const url = new URL(bookmark.url)
+
+ return (
+
+
+
+ >
+
+
+
+
+
+ {bookmark.title}
+
+ {isSelected ? : null}
+
+
{url.host}
+
+
+ )
+ },
+)
+
function BookmarkList({
bookmarks,
selectedBookmarkId,
- alwaysExpandItem,
onSelectionChange,
onItemAction,
className,
@@ -165,20 +175,11 @@ function BookmarkList({
ref={listRef}
items={bookmarks}
selectedItemId={selectedBookmarkId}
- alwaysExpandItem={alwaysExpandItem}
onSelectionChange={handleSelect}
className={className}
emptyMessage="No bookmarks found!"
- renderItem={({ item: bookmark, isSelected, isExpanded, onSelect, onExpand }) => (
-
+ renderItem={({ item: bookmark, isSelected, onSelect }) => (
+
)}
/>
)
diff --git a/packages/web/src/app/bookmarks/index.tsx b/packages/web/src/app/bookmarks/index.tsx
index c1e3378..b310d89 100644
--- a/packages/web/src/app/bookmarks/index.tsx
+++ b/packages/web/src/app/bookmarks/index.tsx
@@ -79,7 +79,6 @@ function BookmarkListContainer() {
return (
0 ? "-mt-2" : ""}
- alwaysExpandItem={false}
bookmarks={bookmarks}
onItemAction={handleBookmarkListItemAction}
/>
diff --git a/packages/web/src/components/list.tsx b/packages/web/src/components/list.tsx
index f43b4f2..a5b9b5b 100644
--- a/packages/web/src/components/list.tsx
+++ b/packages/web/src/components/list.tsx
@@ -16,12 +16,9 @@ interface ListState {
items: T[]
selectedIndex: number
selectedItemId: string
- isItemExpanded: boolean
- alwaysExpandItem: boolean
setItems: (items: T[]) => void
setSelectedIndex: (index: number) => void
setSelectedItemId: (id: string) => void
- setIsItemExpanded: (expanded: boolean) => void
}
type ListStore = ReturnType>
@@ -33,14 +30,11 @@ type MnemonicCallback = (event: KeyboardEvent, item: T) => void
interface ListProps {
items: T[]
selectedItemId?: string
- alwaysExpandItem?: boolean
onSelectionChange?: (item: T) => void
renderItem: (props: {
item: T
isSelected: boolean
- isExpanded: boolean
onSelect: () => void
- onExpand: () => void
}) => React.ReactNode
className?: string
emptyMessage?: string
@@ -51,7 +45,6 @@ interface ListProps {
function List({
items,
selectedItemId,
- alwaysExpandItem = false,
onSelectionChange,
renderItem,
className,
@@ -59,7 +52,7 @@ function List({
mnemonics,
ref,
}: ListProps) {
- const storeRef = useRef>(createListStore({ items, selectedItemId, alwaysExpandItem }))
+ const storeRef = useRef>(createListStore({ items, selectedItemId }))
useImperativeHandle(
ref,
@@ -107,11 +100,9 @@ function List({
function createListStore({
items,
selectedItemId,
- alwaysExpandItem = false,
}: {
items: T[]
selectedItemId?: string
- alwaysExpandItem?: boolean
}) {
let _selectedItemId = selectedItemId
if (!_selectedItemId && items.length > 0) {
@@ -121,10 +112,8 @@ function createListStore({
return createStore>()(
subscribeWithSelector((set) => ({
items,
- alwaysExpandItem,
selectedIndex: selectedItemId ? items.findIndex((item) => item.id === selectedItemId) : 0,
selectedItemId: _selectedItemId ?? "",
- isItemExpanded: alwaysExpandItem,
setItems(items: T[]) {
set({
@@ -141,10 +130,6 @@ function createListStore({
setSelectedItemId(id: string) {
set({ selectedItemId: id })
},
-
- setIsItemExpanded(expanded: boolean) {
- set({ isItemExpanded: expanded })
- },
})),
)
}
@@ -164,27 +149,20 @@ function ListItem({
item,
index,
isSelected,
- isExpanded,
onSelect,
- onExpand,
renderItem,
}: {
item: T
index: number
isSelected: boolean
- isExpanded: boolean
onSelect: (id: string) => void
- onExpand: (expanded: boolean) => void
renderItem: (props: {
item: T
isSelected: boolean
- isExpanded: boolean
onSelect: () => void
- onExpand: () => void
}) => React.ReactNode
}) {
const setSelectedIndex = useListStore((state) => state.setSelectedIndex)
- const isItemExpanded = useListStore((state) => state.isItemExpanded)
useEffect(() => {
if (isSelected) {
@@ -196,24 +174,16 @@ function ListItem({
onSelect(item.id)
}, [item.id, onSelect])
- const handleExpand = useCallback(() => {
- onExpand(!isExpanded)
- }, [isExpanded, onExpand])
-
const handleMouseEnter = useCallback(() => {
- if (!isItemExpanded) {
- onSelect(item.id)
- }
- }, [isItemExpanded, item.id, onSelect])
+ onSelect(item.id)
+ }, [item.id, onSelect])
return (
{renderItem({
item,
isSelected,
- isExpanded,
onSelect: handleSelect,
- onExpand: handleExpand,
})}
)
@@ -231,9 +201,7 @@ function _List({
renderItem: (props: {
item: T
isSelected: boolean
- isExpanded: boolean
onSelect: () => void
- onExpand: () => void
}) => React.ReactNode
emptyMessage: string
mnemonics?: Record>
@@ -241,9 +209,7 @@ function _List({
const store = useListStoreContext()
const items = useListStore((state) => state.items)
const selectedItemId = useListStore((state) => state.selectedItemId)
- const isItemExpanded = useListStore((state) => state.isItemExpanded)
const setSelectedItemId = useListStore void>((state) => state.setSelectedItemId)
- const setIsItemExpanded = useListStore void>((state) => state.setIsItemExpanded)
const shortcuts = useMemo(() => {
const baseShortcuts: Record void> = {
@@ -251,10 +217,6 @@ function _List({
ArrowDown: selectNextItem,
k: selectPrevItem,
ArrowUp: selectPrevItem,
- l: expandItem,
- ArrowRight: expandItem,
- h: collapseItem,
- ArrowLeft: collapseItem,
}
if (!mnemonics) {
@@ -291,17 +253,6 @@ function _List({
}
}
- function expandItem() {
- store.getState().setIsItemExpanded(true)
- }
-
- function collapseItem() {
- const state = store.getState()
- if (!state.alwaysExpandItem) {
- store.getState().setIsItemExpanded(false)
- }
- }
-
return (
{items.length === 0 ? (
@@ -309,7 +260,6 @@ function _List({
) : (
items.map((item, index) => {
const isSelected = item.id === selectedItemId
- const isExpanded = isItemExpanded && isSelected
return (
({
item={item}
index={index}
isSelected={isSelected}
- isExpanded={isExpanded}
onSelect={setSelectedItemId}
- onExpand={setIsItemExpanded}
renderItem={renderItem}
/>
)