import { useEffect } from "react"; import { createFileRoute } from "@tanstack/react-router"; import { create } from "zustand"; import clsx from "clsx"; import { Button } from "~/components/button"; import type { LinkBookmark } from "~/bookmark"; const testBookmarks: LinkBookmark[] = [ { kind: "link", id: "1", title: "Running a Docker container as a non-root user", url: "https://test.website.com/article/123", }, { kind: "link", id: "2", title: "Running a Docker container as a non-root user", url: "https://test.website.com/article/123", }, ]; const LAYOUT_MODE = { popup: "popup", sideBySide: "side-by-side", } as const; type LayoutMode = (typeof LAYOUT_MODE)[keyof typeof LAYOUT_MODE]; interface BookmarkPageState { bookmarks: LinkBookmark[]; selectedBookmarkIndex: number; isBookmarkItemExpanded: boolean; isBookmarkPreviewOpened: boolean; layoutMode: LayoutMode; setBookmarkItemExpanded: (isExpanded: boolean) => void; setBookmarkPreviewOpened: (isOpened: boolean) => void; setLayoutMode: (mode: LayoutMode) => void; selectBookmarkAt: (index: number) => void; } const useBookmarkPageStore = create()((set, get) => ({ bookmarks: testBookmarks, selectedBookmarkIndex: 0, isBookmarkItemExpanded: false, isBookmarkPreviewOpened: false, layoutMode: LAYOUT_MODE.popup, setBookmarkItemExpanded(isExpanded: boolean) { set({ isBookmarkItemExpanded: isExpanded }); }, setBookmarkPreviewOpened(isOpened: boolean) { set({ isBookmarkPreviewOpened: isOpened }); }, setLayoutMode(mode: LayoutMode) { set({ layoutMode: mode }); }, selectBookmarkAt(index: number) { const bookmarks = get().bookmarks; if (index >= 0 && index < bookmarks.length) { set({ selectedBookmarkIndex: index }); } }, })); function Page() { const setLayoutMode = useBookmarkPageStore((state) => state.setLayoutMode); useEffect(() => { function onKeyDown(event: KeyboardEvent) { const state = useBookmarkPageStore.getState(); switch (event.key) { case "ArrowDown": state.selectBookmarkAt(state.selectedBookmarkIndex + 1); break; case "ArrowUp": state.selectBookmarkAt(state.selectedBookmarkIndex - 1); break; case "ArrowLeft": state.setBookmarkItemExpanded(false); break; case "ArrowRight": state.setBookmarkItemExpanded(true); break; default: break; } } window.addEventListener("keydown", onKeyDown); return () => { window.removeEventListener("keydown", onKeyDown); }; }, [useBookmarkPageStore]); useEffect(() => { function mediaQueryListener(this: MediaQueryList) { if (this.matches) { setLayoutMode(LAYOUT_MODE.sideBySide); } else { setLayoutMode(LAYOUT_MODE.popup); } } const q = window.matchMedia("(width >= 64rem)"); q.addEventListener("change", mediaQueryListener); mediaQueryListener.call(q); return () => { q.removeEventListener("change", mediaQueryListener); }; }, []); return (

YOUR BOOKMARKS

{testBookmarks.map((bookmark, i) => ( ))}
); } function Main({ children }: React.PropsWithChildren) { const isPreviewOpened = useBookmarkPageStore( (state) => state.isBookmarkPreviewOpened, ); const layoutMode = useBookmarkPageStore((state) => state.layoutMode); return (
{children}
); } function BookmarkPreview() { const isVisible = useBookmarkPageStore( (state) => state.isBookmarkPreviewOpened, ); const layoutMode = useBookmarkPageStore((state) => state.layoutMode); if (!isVisible) { return null; } return (

Content here

); } function BookmarkListItem({ bookmark, index, }: { bookmark: LinkBookmark; index: number }) { const url = new URL(bookmark.url); const selectedBookmark = useBookmarkPageStore( (state) => state.bookmarks[state.selectedBookmarkIndex], ); const isSelected = selectedBookmark.id === bookmark.id; const isBookmarkItemExpanded = useBookmarkPageStore( (state) => state.isBookmarkItemExpanded, ); const setBookmarkItemExpanded = useBookmarkPageStore( (state) => state.setBookmarkItemExpanded, ); const selectBookmarkAt = useBookmarkPageStore( (state) => state.selectBookmarkAt, ); const setBookmarkPreviewOpened = useBookmarkPageStore( (state) => state.setBookmarkPreviewOpened, ); function expandOrOpenPreview() { setBookmarkItemExpanded(true); if (useBookmarkPageStore.getState().layoutMode === LAYOUT_MODE.sideBySide) { console.log(useBookmarkPageStore.getState().layoutMode); setBookmarkPreviewOpened(true); } } return (
{ if (!isBookmarkItemExpanded) { selectBookmarkAt(index); } }} >

{url.host}

{isBookmarkItemExpanded && isSelected ? (

#dev #devops #devops #devops #devops #devops #devops

 
) : null}
); } function OpenBookmarkPreviewButton() { const isBookmarkPreviewOpened = useBookmarkPageStore( (state) => state.isBookmarkPreviewOpened, ); const setBookmarkPreviewOpened = useBookmarkPageStore( (state) => state.setBookmarkPreviewOpened, ); const setBookmarkItemExpanded = useBookmarkPageStore( (state) => state.setBookmarkItemExpanded, ); useEffect(() => { function onKeyDown(event: KeyboardEvent) { if (isBookmarkPreviewOpened && event.key === "c") { closePreview(); } else if (!isBookmarkPreviewOpened && event.key === "o") { openPreview(); } } window.addEventListener("keydown", onKeyDown); return () => { window.removeEventListener("keydown", onKeyDown); }; }, [isBookmarkPreviewOpened]); function closePreview() { setBookmarkPreviewOpened(false); setBookmarkItemExpanded(false); } function openPreview() { setBookmarkPreviewOpened(true); } return ( ); } export const Route = createFileRoute("/$username/bookmarks")({ component: Page, });