diff --git a/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift b/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift index df88d79..7d413c4 100644 --- a/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift +++ b/SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift @@ -90,7 +90,28 @@ struct LiveRoomViewV2: View { return !(isCurrentUserHost || isCurrentUserStaff) } - + + private var isShowingPersistentDialog: Bool { + viewModel.isShowProfilePopup + || viewModel.isShowDonationPopup + || (viewModel.changeIsAdult && !UserDefaults.bool(forKey: .auth)) + || viewModel.isShowNoticeLikeHeart + || viewModel.isShowQuitPopup + || viewModel.isShowLiveEndPopup + || isShowChatDeleteDialog + || viewModel.isShowProfileList + || viewModel.isShowUserProfilePopup + || viewModel.isShowReportMenu + || viewModel.isShowUesrBlockConfirm + || viewModel.isShowUesrReportView + || viewModel.isShowProfileReportConfirm + || (viewModel.isShowNoChattingConfirm && viewModel.noChattingUserId > 0) + || isShowFollowNotifyDialog + || viewModel.isShowRouletteSettings + || (!viewModel.roulettePreviewList.isEmpty && viewModel.isShowRoulettePreview) + || viewModel.isShowRoulette + } + var body: some View { ScreenCaptureSecureContainer(isSecureModeEnabled: shouldEnforceScreenCaptureProtection) { ZStack { @@ -1086,7 +1107,7 @@ struct LiveRoomViewV2: View { guestFollowButtonTypeOverride = nil } } - .onChange(of: isShowChatDeleteDialog) { isShowing in + .onChange(of: isShowingPersistentDialog) { isShowing in if isShowing { hideKeyboard() } diff --git a/docs/20260410_라이브룸다이얼로그표시시키보드내림.md b/docs/20260410_라이브룸다이얼로그표시시키보드내림.md new file mode 100644 index 0000000..87608d0 --- /dev/null +++ b/docs/20260410_라이브룸다이얼로그표시시키보드내림.md @@ -0,0 +1,60 @@ +# 20260410_라이브룸다이얼로그표시시키보드내림.md + +## 개요 +- `LiveRoomViewV2`에서 자동으로 사라지지 않는 다이얼로그가 표시될 때, 채팅 입력으로 올라와 있던 키보드를 즉시 내린다. +- 대상은 화면 위에 유지되는 다이얼로그/팝업이며, 기존에 이미 처리 중인 삭제 확인 다이얼로그와 동일한 사용자 경험으로 맞춘다. +- 범위는 `LiveRoomViewV2.swift` 내부 상태 변화 처리로 한정한다. + +## 요구사항 해석(고정) +- 사용자가 채팅 입력 중이어도 비자동-dismiss 다이얼로그가 열리면 키보드는 내려가야 한다. +- 자동으로 사라지는 토스트나 일시적 애니메이션 오버레이는 대상에서 제외한다. +- 기존 다이얼로그 표시/닫기 로직, 각 액션의 비즈니스 동작은 변경하지 않는다. + +## 완료 기준 (Acceptance Criteria) +- [ ] AC1: `LiveRoomProfilesDialogView`가 표시되면 키보드가 내려간다. +- [ ] AC2: `LiveRoomUserProfileDialogView`가 표시되면 키보드가 내려간다. +- [ ] AC3: `SodaDialog` 기반의 유지형 다이얼로그가 표시되면 키보드가 내려간다. +- [ ] AC4: 기존에 처리 중인 `isShowChatDeleteDialog` 동작은 유지된다. +- [ ] AC5: 다이얼로그 표시 외 다른 기존 라이브룸 동작에는 회귀가 없다. + +## 구현 체크리스트 +- [x] `LiveRoomViewV2` 내 유지형 다이얼로그 표시 상태 목록 확정 +- [x] 키보드 dismiss 공통 처리 지점 추가 +- [x] 관련 표시 상태 변화 시 `hideKeyboard()` 호출 연결 +- [x] 정적 진단 및 빌드 검증 수행 + +## 영향 파일(예상) +- `SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift` + +## 검증 계획 +- `lsp_diagnostics("SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift")` +- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build` +- `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` +- 수동 QA: 채팅 입력 중 각 대상 다이얼로그를 열어 키보드가 즉시 내려가는지 확인 + +## 검증 기록 +- 2026-04-10 (계획 문서 초안) + - 무엇/왜/어떻게: `LiveRoomViewV2`의 다이얼로그 노출 구간과 기존 키보드 dismiss 처리(`isShowChatDeleteDialog`)를 기준으로, 유지형 다이얼로그 표시 시 키보드를 내리는 최소 수정 범위를 문서화했다. + - 실행 명령/도구: + - `read(LiveRoomViewV2.swift)` + - `glob("docs/*")` + - `read(20260319_라이브룸채팅삭제기능구현계획.md, 20260306_라이브룸외부이동확인다이얼로그.md)` + - 결과: + - 계획 문서 생성 완료. + - 코드 수정 및 빌드 검증은 아직 수행하지 않음. + +- 2026-04-10 (유지형 다이얼로그 표시 시 키보드 내림 반영) + - 무엇/왜/어떻게: `LiveRoomViewV2`에 유지형 다이얼로그 표시 여부를 묶는 `isShowingPersistentDialog` 계산 프로퍼티를 추가하고, 해당 값이 `true`로 전환될 때 `hideKeyboard()`를 호출하도록 변경했다. 개별 버튼 액션마다 중복 처리하지 않고, 실제 다이얼로그 표시 상태 변화 시점에만 키보드 dismiss가 일어나도록 맞췄다. + - 실행 명령/도구: + - `background_output(bg_0e23617c)` + - `lsp_diagnostics("SodaLive/Sources/Live/Room/V2/LiveRoomViewV2.swift")` + - `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" -configuration Debug build` + - `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" -configuration Debug build` + - `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive" test` + - `xcodebuild -workspace "SodaLive.xcworkspace" -scheme "SodaLive-dev" test` + - 결과: + - `LiveRoomViewV2.swift` 진단 오류 없음 확인. + - `SodaLive-dev` Debug 빌드 `** BUILD SUCCEEDED **` 확인. + - `SodaLive` Debug 빌드는 병렬 실행 중 `build.db` lock으로 1회 실패했고, 동일 명령 단독 재실행 후 `** BUILD SUCCEEDED **` 확인. + - 두 스킴 모두 test action 미구성으로 자동 테스트 실행 불가(`Scheme ... is not currently configured for the test action.`). + - CLI 환경 제약으로 실제 라이브룸 진입 후 키보드/다이얼로그 상호작용 수동 QA는 후속 확인 필요.