From 268055269913bf32ba42e2c17df8fd8b656105a0 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 1 Jan 2026 11:49:36 +0000 Subject: [PATCH 1/3] feat: Add Instagram drawer for viewing beta videos Add a bottom drawer that displays beta videos from Instagram for climbs. The drawer can be opened from: - Ellipsis menu in the queue control bar - Instagram button on the play screen - "Beta Videos" option in queue list item dropdown menus The drawer opens to 90% height and reuses the existing beta videos API endpoint at /api/v1/[board_name]/beta/[climb_uuid]. --- .../play/[climb_uuid]/play-view-client.tsx | 32 ++- .../instagram-drawer/instagram-drawer.tsx | 267 ++++++++++++++++++ .../queue-control/queue-control-bar.tsx | 36 ++- .../queue-control/queue-list-item.tsx | 10 +- .../components/queue-control/queue-list.tsx | 24 ++ 5 files changed, 364 insertions(+), 5 deletions(-) create mode 100644 packages/web/app/components/instagram-drawer/instagram-drawer.tsx diff --git a/packages/web/app/[board_name]/[layout_id]/[size_id]/[set_ids]/[angle]/play/[climb_uuid]/play-view-client.tsx b/packages/web/app/[board_name]/[layout_id]/[size_id]/[set_ids]/[angle]/play/[climb_uuid]/play-view-client.tsx index d25417af..1e27a3be 100644 --- a/packages/web/app/[board_name]/[layout_id]/[size_id]/[set_ids]/[angle]/play/[climb_uuid]/play-view-client.tsx +++ b/packages/web/app/[board_name]/[layout_id]/[size_id]/[set_ids]/[angle]/play/[climb_uuid]/play-view-client.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState, useCallback } from 'react'; import { Button, Empty } from 'antd'; -import { LeftOutlined, RightOutlined } from '@ant-design/icons'; +import { LeftOutlined, RightOutlined, InstagramOutlined } from '@ant-design/icons'; import { useSwipeable } from 'react-swipeable'; import { useRouter, useSearchParams } from 'next/navigation'; import { track } from '@vercel/analytics'; @@ -12,6 +12,7 @@ import BoardRenderer from '@/app/components/board-renderer/board-renderer'; import ClimbTitle from '@/app/components/climb-card/climb-title'; import { constructClimbListWithSlugs, constructPlayUrlWithSlugs } from '@/app/lib/url-utils'; import { themeTokens } from '@/app/theme/theme-config'; +import InstagramDrawer from '@/app/components/instagram-drawer/instagram-drawer'; import styles from './play-view.module.css'; type PlayViewClientProps = { @@ -37,6 +38,7 @@ const PlayViewClient: React.FC = ({ boardDetails, initialCl const [swipeOffset, setSwipeOffset] = useState(0); const [showSwipeHint, setShowSwipeHint] = useState(true); + const [isInstagramDrawerOpen, setIsInstagramDrawerOpen] = useState(false); // Use queue's current climb if available, otherwise use initial climb from SSR const displayClimb = currentClimb || initialClimb; @@ -177,9 +179,27 @@ const PlayViewClient: React.FC = ({ boardDetails, initialCl className={styles.climbTitleContainer} style={{ padding: `${themeTokens.spacing[1]}px ${themeTokens.spacing[3]}px`, + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + gap: themeTokens.spacing[2], }} > - +
+ +
+