feat(live): 라이브 상세를 전역 바텀시트로 표시한다
This commit is contained in:
@@ -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() {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user