feat(live): 라이브 상세를 전역 바텀시트로 표시한다

This commit is contained in:
Yu Sung
2026-03-06 17:46:26 +09:00
parent 42ce09d927
commit 298c02b83f
4 changed files with 79 additions and 1 deletions

View File

@@ -11,6 +11,14 @@ struct AppRoute: Hashable {
let id = UUID()
}
struct LiveDetailSheetState {
let roomId: Int
let onClickParticipant: () -> Void
let onClickReservation: () -> Void
let onClickStart: () -> Void
let onClickCancel: () -> Void
}
class AppState: ObservableObject {
static let shared = AppState()
@@ -62,6 +70,7 @@ class AppState: ObservableObject {
@Published var isShowErrorPopup = false
@Published var errorMessage = ""
@Published var liveDetailSheet: LiveDetailSheetState? = nil
private func syncStepWithNavigationPath() {
let validRoutes = Set(navigationPath)
@@ -83,10 +92,21 @@ class AppState: ObservableObject {
DispatchQueue.main.async {
switch step {
case .splash, .main:
self.liveDetailSheet = nil
self.rootStep = step
self.routeStepMap.removeAll()
self.navigationPath.removeAll()
self.appStep = step
case .liveDetail(let roomId, let onClickParticipant, let onClickReservation, let onClickStart, let onClickCancel):
self.liveDetailSheet = LiveDetailSheetState(
roomId: roomId,
onClickParticipant: onClickParticipant,
onClickReservation: onClickReservation,
onClickStart: onClickStart,
onClickCancel: onClickCancel
)
self.appStep = step
default:
let route = AppRoute()
@@ -99,6 +119,12 @@ class AppState: ObservableObject {
func back() {
DispatchQueue.main.async {
if self.liveDetailSheet != nil {
self.liveDetailSheet = nil
self.syncStepWithNavigationPath()
return
}
if self.navigationPath.isEmpty {
self.rootStep = .main
self.appStep = .main
@@ -108,6 +134,13 @@ class AppState: ObservableObject {
_ = self.navigationPath.popLast()
}
}
func hideLiveDetailSheet() {
DispatchQueue.main.async {
self.liveDetailSheet = nil
self.syncStepWithNavigationPath()
}
}
// ( -> ) UI
func softRestart() {

View File

@@ -30,6 +30,21 @@ struct ContentView: View {
.navigationBarBackButtonHidden(true)
}
if let liveDetailSheet = appState.liveDetailSheet {
LiveDetailView(
roomId: liveDetailSheet.roomId,
onClickParticipant: liveDetailSheet.onClickParticipant,
onClickReservation: liveDetailSheet.onClickReservation,
onClickStart: liveDetailSheet.onClickStart,
onClickCancel: liveDetailSheet.onClickCancel,
onClickClose: {
withAnimation {
appState.hideLiveDetailSheet()
}
}
)
}
if isShowDialog {
SodaDialog(
title: I18n.Common.pointGrantTitle,

View File

@@ -33,7 +33,7 @@ struct LiveDetailView: View {
var onClickClose: (() -> Void)? = nil
var body: some View {
BaseView(isLoading: $viewModel.isLoading) {
ZStack {
Color.black.opacity(0.7)
.onTapGesture {
viewModel.onBack {