-
Notifications
You must be signed in to change notification settings - Fork 3
[feature] 대동제 공연시간표 페이지 및 탭/슬라이드 ab테스트추가 #1518
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
seongwon030
merged 19 commits into
develop-fe
from
feature/#1517-performance-schedule-page-MOA-835
May 11, 2026
Merged
Changes from all commits
Commits
Show all changes
19 commits
Select commit
Hold shift + click to select a range
d1ec5d6
refactor(festival): PerformanceList props 기반 공통화
seongwon030 7e3e7ef
feat(festival): PerformanceCard 곡 미공개 상태 처리
seongwon030 3ab456d
feat(festival): 2026 대동제 버스킹 시간표 페이지 구현
seongwon030 3e5fe79
feat(festival): 아티스트 공연 섹션 추가 및 Performance 타입 개선
seongwon030 436b5da
feat: 공연시간표 top,bottom 마진 늘림
seongwon030 a3b2adc
feat(festival): 대동제 필터칩 추가 및 BuskingPage Filter 통합
seongwon030 c75153e
feat: YB 시작시간 추가
seongwon030 7eb465f
refactor(festival): date-fns format으로 날짜 문자열 생성 개선
seongwon030 9c6978f
fix(festival): DayArrowsNav findIndex -1 및 빈 days 가드 추가
seongwon030 554525c
fix: 대동제로 이벤트명 변경
seongwon030 1dce9eb
refactor(main): Popup을 PopupConfig 기반 다중 팝업 구조로 변경
seongwon030 abd86c4
test(main): Popup 테스트를 popupUtils 기반으로 업데이트
seongwon030 594636e
docs: Popup 다중 팝업 구조 문서 추가
seongwon030 67b586b
refactor(main): PopupConfig에 내부 라우팅 to 필드 추가
seongwon030 acfdbfb
feat(main): 대동제 팝업 추가 및 메인 페이지 교체
seongwon030 6c0ff67
fix(main): Popup 미표시 시 MAIN_POPUP_NOT_SHOWN 트래킹 복구
seongwon030 5b2f644
Merge pull request #1519 from Moadong/feature/festival-popup
seongwon030 b084e86
feat(main): 대동제 필터칩 NotificationDot 세션 기반 표시 추가
seongwon030 200a4ea
feat(main): 웹뷰 대동제 팝업 추가 및 이미지 여백 CSS 보정
seongwon030 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| # 2026 대동제 버스킹 시간표 페이지 | ||
|
|
||
| 4일간 진행되는 버스킹 공연 시간표를 제공하는 페이지. 날짜 네비게이션 방식을 A/B 테스트로 검증한다. | ||
|
|
||
| ## 라우트 | ||
|
|
||
| `/festival-busking` → `BuskingPage` | ||
|
|
||
| ## 페이지 구조 | ||
|
|
||
| ``` | ||
| BuskingPage | ||
| ├── DayTabsNav (variant: 'tabs') — UnderlineTabs로 날짜 탭 | ||
| ├── DayArrowsNav (variant: 'arrows') — ‹ 날짜 › 화살표 네비게이션 | ||
| ├── SectionLabel "동아리 공연" — 두 섹션 모두 있을 때만 표시 | ||
| ├── PerformanceList (performances) — 동아리 공연 목록 | ||
| ├── SectionLabel "🎤 아티스트 공연" | ||
| └── PerformanceList (mainStagePerformances, hideSongs) — 아티스트 공연 목록 | ||
| └── TimelineRow + PerformanceCard | ||
| ``` | ||
|
|
||
| ## A/B 실험 | ||
|
|
||
| | 항목 | 내용 | | ||
| | --------- | --------------------------- | | ||
| | 실험 키 | `festival_timetable_nav_v1` | | ||
| | Variant A | `tabs` — 날짜 4개 탭 | | ||
| | Variant B | `arrows` — 화살표 순차 이동 | | ||
| | 비율 | 50 : 50 | | ||
|
|
||
| 실험 정의: `src/experiments/definitions.ts` → `festivalTimetableNavExperiment` | ||
|
|
||
| ## Mixpanel 이벤트 | ||
|
|
||
| | 이벤트명 | 트리거 | 주요 속성 | | ||
| | ----------------------------------- | ----------------------- | -------------------------------------------------- | | ||
| | `2026-daedong 버스킹 시간표 페이지` | 페이지 진입 | — | | ||
| | `2026-daedong Day Changed` | 날짜 전환 | `from_day`, `to_day`, `nav_variant`, `interaction` | | ||
| | `2026-daedong Day Duration` | 날짜 이탈 / 페이지 이탈 | `day`, `nav_variant`, `duration_seconds` | | ||
|
|
||
| `interaction` 값: `'click'` (버튼) / `'swipe'` (터치 제스처) | ||
|
|
||
| ## 데이터 | ||
|
|
||
| `src/pages/FestivalPage/data/buskingDays.ts` — `BUSKING_DAYS: FestivalDay[]` | ||
|
|
||
| - `performances: []`이고 `mainStagePerformances`도 없는 날짜는 탭/화살표에서 제외 | ||
| - 오늘 날짜가 축제 기간이면 해당 날짜로 자동 진입 | ||
| - `mainStagePerformances`: 동아리 공연 종료 후 진행되는 아티스트 공연 (Day1~4 모두 포함) | ||
|
|
||
| ### 아티스트 공연 라인업 | ||
|
|
||
| | 날짜 | 아티스트 | | ||
| | ---- | ------------------- | | ||
| | Day1 | YB | | ||
| | Day2 | 최예나, 이창섭 | | ||
| | Day3 | FIFTY FIFTY, 비와이 | | ||
| | Day4 | V.O.S, 청하 | | ||
|
|
||
| ## 관련 코드 | ||
|
|
||
| - `src/pages/FestivalPage/BuskingPage/BuskingPage.tsx` — 메인 페이지, 실험 분기 및 이벤트 트래킹 | ||
| - `src/pages/FestivalPage/components/DayTabsNav/DayTabsNav.tsx` — tabs variant | ||
| - `src/pages/FestivalPage/components/DayArrowsNav/DayArrowsNav.tsx` — arrows variant | ||
| - `src/pages/FestivalPage/data/buskingDays.ts` — 4일치 공연 데이터 (`performances` + `mainStagePerformances`) | ||
| - `src/pages/FestivalPage/components/PerformanceList/PerformanceList.tsx` — `performances`, `festivalDate`, `hideSongs` props 지원 | ||
| - `src/pages/FestivalPage/components/PerformanceCard/PerformanceCard.tsx` — `hideSongs`이면 곡목 영역 숨김, `songs: []`이면 "🎵 추후 공개 예정" 표시 | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| # Filter 칩 NotificationDot — 대동제 세션 기반 표시 | ||
|
|
||
| `Filter` 컴포넌트의 `NotificationDot`은 두 가지 조건으로 표시된다. | ||
|
|
||
| - `홍보`: `usePromotionNotification` 훅이 반환하는 서버 데이터 기반 | ||
| - `대동제`: 세션 기반 — 첫 방문 시 항상 표시, 칩 클릭 시 사라짐 (탭 종료 후 재표시) | ||
|
|
||
| `대동제` dot 상태는 `Filter` 내부에서 `sessionStorage('daedong_filter_seen')`으로 자체 관리하며, `MainPage.tsx`나 Filter props 변경 없이 동작한다. | ||
|
|
||
| ## 관련 코드 | ||
|
|
||
| - `src/components/common/Filter/Filter.tsx` — `daedongDotSeen` state, `handleFilterOptionClick` 내 sessionStorage 처리 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,34 @@ | ||
| # Popup — 다중 팝업 지원 구조 | ||
|
|
||
| 메인 페이지에서 노출되는 팝업 시스템. `PopupConfig` 배열로 여러 팝업을 관리하며, 첫 번째 eligible 팝업을 자동으로 표시한다. | ||
|
|
||
| ## 구조 | ||
|
|
||
| - `configs: PopupConfig[]`를 prop으로 받아, 조건을 통과하는 첫 번째 팝업을 표시 | ||
| - 각 팝업은 독립적인 `storageKey` / `sessionKey`를 가짐 | ||
| - `daysToHide: 0`으로 설정하면 "다시 보지 않기" 클릭 후에도 항상 재표시 | ||
|
|
||
| ## PopupConfig 필드 | ||
|
|
||
| | 필드 | 타입 | 설명 | | ||
| | -------------- | ---------------------- | ---------------------------------------- | | ||
| | `id` | `string` | Mixpanel `popupType` 값으로 사용 | | ||
| | `storageKey` | `string` | "다시 보지 않기" localStorage 키 | | ||
| | `sessionKey` | `string` | "닫기" sessionStorage 키 | | ||
| | `daysToHide` | `number?` | 숨김 유지 일수 (기본 7, 0이면 항상 표시) | | ||
| | `image` | `string` | 팝업 이미지 경로 | | ||
| | `mobileOnly` | `boolean?` | 모바일 전용 여부 | | ||
| | `to` | `string?` | 이미지 클릭 시 내부 라우팅 경로 | | ||
| | `onImageClick` | `(trackEvent) => void` | 이미지 클릭 핸들러 (트래킹 포함) | | ||
|
|
||
| ## 새 팝업 추가 방법 | ||
|
|
||
| 1. `popupConfigs.ts`에 `PopupConfig` 객체 추가 | ||
| 2. `MainPage.tsx`의 `configs` 배열에 삽입 (앞에 넣을수록 우선 표시) | ||
|
|
||
| ## 관련 코드 | ||
|
|
||
| - `src/utils/popupUtils.ts` — `PopupConfig` 인터페이스, `isPopupHidden`, `DAYS_TO_HIDE` | ||
| - `src/pages/MainPage/components/Popup/Popup.tsx` — 팝업 렌더링 컴포넌트 | ||
| - `src/pages/MainPage/components/Popup/popupConfigs.ts` — 팝업 config 정의 (`APP_DOWNLOAD_POPUP`) | ||
| - `src/pages/MainPage/components/Popup/Popup.test.tsx` — `isPopupHidden` 유틸 테스트 |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,26 +1,13 @@ | ||
| import type { ExperimentDefinition } from './types'; | ||
|
|
||
| export const mainBannerExperiment = { | ||
| key: 'main_banner_v1', | ||
| variants: ['A', 'B'] as const, | ||
| defaultVariant: 'A', | ||
| export const festivalTimetableNavExperiment = { | ||
| key: 'festival_timetable_nav_v1', | ||
| variants: ['tabs', 'arrows'] as const, | ||
| defaultVariant: 'tabs', | ||
| weights: { | ||
| A: 50, | ||
| B: 50, | ||
| tabs: 50, | ||
| arrows: 50, | ||
| }, | ||
| } satisfies ExperimentDefinition<'A' | 'B'>; | ||
| } satisfies ExperimentDefinition<'tabs' | 'arrows'>; | ||
|
|
||
| export const applyButtonCopyExperiment = { | ||
| key: 'apply_button_copy_v1', | ||
| variants: ['A', 'B'] as const, | ||
| defaultVariant: 'A', | ||
| weights: { | ||
| A: 50, | ||
| B: 50, | ||
| }, | ||
| } satisfies ExperimentDefinition<'A' | 'B'>; | ||
|
|
||
| export const ALL_EXPERIMENTS = [ | ||
| mainBannerExperiment, | ||
| applyButtonCopyExperiment, | ||
| ] as const; | ||
| export const ALL_EXPERIMENTS = [festivalTimetableNavExperiment] as const; |
60 changes: 60 additions & 0 deletions
60
frontend/src/pages/FestivalPage/BuskingPage/BuskingPage.styles.ts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,60 @@ | ||
| import styled from 'styled-components'; | ||
|
|
||
| export const Container = styled.div` | ||
| width: 100%; | ||
| max-width: 550px; | ||
| margin: 0 auto; | ||
| `; | ||
|
|
||
| export const NavWrapper = styled.div` | ||
| margin-bottom: 16px; | ||
| `; | ||
|
|
||
| export const TimetableSection = styled.section` | ||
| width: 100%; | ||
| max-width: 500px; | ||
| margin: 0 auto 20px; | ||
| `; | ||
|
|
||
| export const TimetableHeader = styled.div` | ||
| margin: 10px 20px 14px; | ||
| padding: 14px 16px; | ||
| border-radius: 14px; | ||
| background: #fff7f3; | ||
| border: 1px solid #ffe0d4; | ||
| display: flex; | ||
| flex-direction: column; | ||
| gap: 4px; | ||
| `; | ||
|
|
||
| export const TimetableDate = styled.p` | ||
| margin: 0; | ||
| color: #3a3a3a; | ||
| font-size: 14px; | ||
| font-weight: 700; | ||
| `; | ||
|
|
||
| export const TimetableLocation = styled.p` | ||
| margin: 0; | ||
| color: #7a7a7a; | ||
| font-size: 12px; | ||
| font-weight: 600; | ||
| `; | ||
|
|
||
| export const SectionLabel = styled.div` | ||
| display: flex; | ||
| align-items: center; | ||
| gap: 10px; | ||
| margin: 20px 20px 12px; | ||
| color: #7a7a7a; | ||
| font-size: 12px; | ||
| font-weight: 600; | ||
|
|
||
| &::before, | ||
| &::after { | ||
| content: ''; | ||
| flex: 1; | ||
| height: 1px; | ||
| background: #e8e8e8; | ||
| } | ||
| `; |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.