Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Projects/App/Sources/View/AppRootView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ private extension AppRootView {
case .launch:
LaunchScreenView()
case .login:
LoginContentView(
LoginCoordinatorView(
onLoginCompleted: { transition(to: .main) },
onSignupCompleted: { nickname in
self.nickname = nickname
Expand Down
38 changes: 16 additions & 22 deletions Projects/App/Sources/View/LivithMainTabView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,24 +26,22 @@ struct LivithMainTabView: View {
// MARK: - Property

@State private var selectedTab: Tab = .home
@State private var isTabBarHidden: Bool = false
@State private var deepLinkConcertID: Int?
@State private var deepLinkInitialTab: SegmentedTabBarType.DetailTab = .artistDetail
@State private var deepLinkInitialSection: ConcertInfoSection?
@State private var deepLinkShowInterest: Bool = false

// MARK: - LifeCycle

init() {
configureTabBarAppearance()
}

// MARK: - Body

var body: some View {
TabView(selection: $selectedTab) {
HomeContentView(
isTabBarHidden: $isTabBarHidden,
HomeCoordinatorView(
deepLinkConcertID: $deepLinkConcertID,
deepLinkInitialTab: $deepLinkInitialTab,
deepLinkInitialSection: $deepLinkInitialSection,
Expand All @@ -53,17 +51,14 @@ struct LivithMainTabView: View {
.tabItem {
makeTabItem(.home)
}
.toolbar(isTabBarHidden ? .hidden : .visible, for: .tabBar)

SearchContentView(isTabBarHidden: $isTabBarHidden)

SearchCoordinatorView()
.tag(Tab.search)
.tabItem {
makeTabItem(.search)
}
.toolbar(isTabBarHidden ? .hidden : .visible, for: .tabBar)

UserContentView(
isTabBarHidden: $isTabBarHidden,

UserCoordinatorView(
onNavigateToHome: {
selectedTab = .home
}
Expand All @@ -72,7 +67,6 @@ struct LivithMainTabView: View {
.tabItem {
makeTabItem(.my)
}
.toolbar(isTabBarHidden ? .hidden : .visible, for: .tabBar)
}
.preferredColorScheme(.dark)
.onChange(of: selectedTab) { _, newTab in
Expand Down Expand Up @@ -109,24 +103,24 @@ private extension LivithMainTabView {
let appearance = UITabBarAppearance()
appearance.configureWithOpaqueBackground()
appearance.backgroundColor = UIColor(Color.livithColor(.black100))

// 상단 구분선 설정
appearance.shadowColor = UIColor(Color.livithColor(.black50))

appearance.stackedLayoutAppearance.normal.iconColor = UIColor(Color.livithColor(.black50))
appearance.stackedLayoutAppearance.normal.titleTextAttributes = [
.foregroundColor: UIColor(Color.livithColor(.black50))
]

appearance.stackedLayoutAppearance.selected.iconColor = UIColor(Color.livithColor(.yellow60))
appearance.stackedLayoutAppearance.selected.titleTextAttributes = [
.foregroundColor: UIColor(Color.livithColor(.yellow60))
]

UITabBar.appearance().standardAppearance = appearance
UITabBar.appearance().scrollEdgeAppearance = appearance
}

@ViewBuilder
func makeTabItem(_ tab: Tab) -> some View {
(selectedTab == tab ? tab.selectedIcon : tab.defaultIcon)
Expand All @@ -147,15 +141,15 @@ extension LivithMainTabView.Tab {
case .my: return "마이"
}
}

var defaultIcon: Image {
switch self {
case .home: return Image.livithIcon(.homeDisabled)
case .search: return Image.livithIcon(.ticketDisabled)
case .my: return Image.livithIcon(.myDisabled)
}
}

var selectedIcon: Image {
switch self {
case .home: return Image.livithIcon(.homeEnabled)
Expand Down
118 changes: 0 additions & 118 deletions Projects/ConcertFeature/Sources/Coordinator/ConcertCoordinator.swift

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
//
// ConcertCoordinatorView.swift
// ConcertFeature
//
// Created by on 6/16/26.
// Copyright © 2026 Livith. All rights reserved.
//

import SwiftUI

import Domain
import LivithDesignSystem
import SetlistFeature
import SongFeature

public struct ConcertCoordinatorView: View {

private let concertID: Int
private let initialTab: SegmentedTabBarType.DetailTab
private let initialSection: ConcertInfoSection?
private let onTicketSiteReturn: () -> Void

public init(
concertID: Int,
initialTab: SegmentedTabBarType.DetailTab = .artistDetail,
initialSection: ConcertInfoSection? = nil,
onTicketSiteReturn: @escaping () -> Void = {}
) {
self.concertID = concertID
self.initialTab = initialTab
self.initialSection = initialSection
self.onTicketSiteReturn = onTicketSiteReturn
}

public var body: some View {
ConcertView(
concertID: concertID,
initialTab: initialTab,
initialSection: initialSection,
onTicketSiteReturn: onTicketSiteReturn
)
.navigationDestination(for: ConcertRoute.self) { route in
destinationView(for: route)
}
}

@ViewBuilder
private func destinationView(for route: ConcertRoute) -> some View {
switch route {
case .setlistDetail(let concertID, let setlistID):
SetlistDetailContainerView(
concertID: concertID,
setlistID: setlistID
)
case .songLyrics(let songID, let setlistID, let songTitle):
SongLyricsView(
songID: songID,
setlistID: setlistID,
songTitle: songTitle
)
case .merchandiseDetail(let merchandiseList, let ticketingOfficeURL):
MerchandiseDetailView(
merchandiseList: merchandiseList,
ticketingOfficeURL: ticketingOfficeURL,
onTicketSiteReturn: onTicketSiteReturn
)
case .detail:
EmptyView()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,14 @@ import Foundation

import Domain
import LivithDesignSystem
import Coordinator

public enum ConcertRoute: Route {
public enum ConcertRoute: Hashable {
case detail(
concertID: Int,
initialTab: SegmentedTabBarType.DetailTab = .artistDetail,
initialSection: ConcertInfoSection? = nil
)
case setlistDetail(concertID: Int, setlistID: Int)
case songLyrics(songID: Int, setlistID: Int, songTitle: String)
case safari(URL)
case ticketSafari(URL)
case merchandiseDetail([ConcertMerchandise], ticketingOfficeURL: URL?)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//
// SetlistDetailContainerView.swift
// ConcertFeature
//
// Created by on 6/16/26.
// Copyright © 2026 Livith. All rights reserved.
//

import SwiftUI

import Domain
import SetlistFeature
import SongFeature

struct SetlistDetailContainerView: View {

let concertID: Int
let setlistID: Int

@State private var pendingSong: SetlistSong?

var body: some View {
SetlistDetailView(
concertID: concertID,
setlistID: setlistID,
onPlaySong: { song in pendingSong = song }
)
.navigationDestination(item: $pendingSong) { song in
SongLyricsView(
songID: song.id,
setlistID: setlistID,
songTitle: song.title
)
}
}
}
Loading