diff --git a/packages/web/app/components/board-page/header.tsx b/packages/web/app/components/board-page/header.tsx index a456b4b0..ff25dbac 100644 --- a/packages/web/app/components/board-page/header.tsx +++ b/packages/web/app/components/board-page/header.tsx @@ -1,7 +1,7 @@ 'use client'; import React, { useState, useMemo } from 'react'; import dynamic from 'next/dynamic'; -import { Flex, Button, Dropdown, MenuProps } from 'antd'; +import { Flex, Button, Dropdown, MenuProps, Badge } from 'antd'; import { Header } from 'antd/es/layout/layout'; import { useSession, signOut } from 'next-auth/react'; import { usePathname, useSearchParams, useRouter } from 'next/navigation'; @@ -9,8 +9,10 @@ import SearchButton from '../search-drawer/search-button'; import SearchClimbNameInput from '../search-drawer/search-climb-name-input'; import { UISearchParamsProvider } from '../queue-control/ui-searchparams-provider'; import { BoardDetails } from '@/app/lib/types'; -import { ExperimentOutlined } from '@ant-design/icons'; +import { ExperimentOutlined, FileTextOutlined } from '@ant-design/icons'; import { themeTokens } from '@/app/theme/theme-config'; +import { useDrafts } from '../drafts/drafts-context'; +import { DraftsDrawer } from '../drafts/drafts-drawer'; // Dynamically import bluetooth component to reduce initial bundle size // LED placement data (~50KB) is only loaded when bluetooth is actually used @@ -75,11 +77,23 @@ function usePageMode(): PageMode { export default function BoardSeshHeader({ boardDetails, angle }: BoardSeshHeaderProps) { const { data: session } = useSession(); const { currentClimb } = useQueueContext(); + const { drafts } = useDrafts(); const [showAuthModal, setShowAuthModal] = useState(false); + const [showDraftsDrawer, setShowDraftsDrawer] = useState(false); const pageMode = usePageMode(); const searchParams = useSearchParams(); const router = useRouter(); + // Filter drafts count for current board configuration + const filteredDraftsCount = useMemo(() => { + return drafts.filter( + (draft) => + draft.boardName === boardDetails.board_name && + draft.layoutId === boardDetails.layout_id && + draft.sizeId === boardDetails.size_id, + ).length; + }, [drafts, boardDetails]); + // Build back to list URL for play/view pages const getBackToListUrl = () => { const { board_name, layout_name, size_name, size_description, set_names } = boardDetails; @@ -226,9 +240,22 @@ export default function BoardSeshHeader({ boardDetails, angle }: BoardSeshHeader {/* Right Section */} - {/* Create mode: Show cancel and publish buttons */} + {/* Create mode: Show cancel, drafts, and publish buttons */} {pageMode === 'create' ? ( - + <> + + {/* Drafts button with badge - only shown on create page */} + {filteredDraftsCount > 0 && ( + +