114 lines
3 KiB
Swift
114 lines
3 KiB
Swift
|
import Foundation
|
||
|
import SwiftfulRouting
|
||
|
import SwiftUI
|
||
|
|
||
|
private enum Tab {
|
||
|
case conversations
|
||
|
case contacts
|
||
|
case settings
|
||
|
}
|
||
|
|
||
|
struct MainTabScreen: View {
|
||
|
@State private var selectedTab: Tab = .conversations
|
||
|
|
||
|
var body: some View {
|
||
|
ZStack {
|
||
|
// Background color
|
||
|
Color.Material.Background.light
|
||
|
.ignoresSafeArea()
|
||
|
|
||
|
// Content
|
||
|
VStack(spacing: 0) {
|
||
|
switch selectedTab {
|
||
|
case .conversations:
|
||
|
Color.red
|
||
|
// ConversationsScreen()
|
||
|
|
||
|
case .contacts:
|
||
|
RouterView { _ in
|
||
|
ContactsScreen()
|
||
|
}
|
||
|
|
||
|
case .settings:
|
||
|
Color.green
|
||
|
// SettingsScreen()
|
||
|
}
|
||
|
|
||
|
// Tab bar
|
||
|
TabBar(selectedTab: $selectedTab)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private struct TabBar: View {
|
||
|
@Binding var selectedTab: Tab
|
||
|
|
||
|
var body: some View {
|
||
|
VStack(spacing: 0) {
|
||
|
Rectangle()
|
||
|
.frame(maxWidth: .infinity)
|
||
|
.frame(height: 0.2)
|
||
|
.foregroundColor(.Material.Shape.separator)
|
||
|
HStack(spacing: 0) {
|
||
|
TabBarButton(buttonType: .contacts, selectedTab: $selectedTab)
|
||
|
TabBarButton(buttonType: .conversations, selectedTab: $selectedTab)
|
||
|
TabBarButton(buttonType: .settings, selectedTab: $selectedTab)
|
||
|
}
|
||
|
.background(Color.Material.Background.dark)
|
||
|
}
|
||
|
.frame(height: 50)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private struct TabBarButton: View {
|
||
|
let buttonType: Tab
|
||
|
|
||
|
@Binding var selectedTab: Tab
|
||
|
|
||
|
var body: some View {
|
||
|
ZStack {
|
||
|
VStack(spacing: 2) {
|
||
|
buttonImg
|
||
|
.foregroundColor(buttonType == selectedTab ? .Material.Elements.active : .Material.Elements.inactive)
|
||
|
.font(.system(size: 24, weight: .light))
|
||
|
.symbolRenderingMode(.hierarchical)
|
||
|
Text(buttonTitle)
|
||
|
.font(.sub1)
|
||
|
.foregroundColor(buttonType == selectedTab ? .Material.Text.main : .Material.Elements.inactive)
|
||
|
}
|
||
|
Rectangle()
|
||
|
.foregroundColor(.white.opacity(0.01))
|
||
|
.onTapGesture {
|
||
|
selectedTab = buttonType
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var buttonImg: Image {
|
||
|
switch buttonType {
|
||
|
case .contacts:
|
||
|
return Image(systemName: "person.2.fill")
|
||
|
|
||
|
case .conversations:
|
||
|
return Image(systemName: "bubble.left.fill")
|
||
|
|
||
|
case .settings:
|
||
|
return Image(systemName: "gearshape.fill")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var buttonTitle: String {
|
||
|
switch buttonType {
|
||
|
case .contacts:
|
||
|
return L10n.Tabs.Name.contacts
|
||
|
|
||
|
case .conversations:
|
||
|
return L10n.Tabs.Name.conversations
|
||
|
|
||
|
case .settings:
|
||
|
return L10n.Tabs.Name.settings
|
||
|
}
|
||
|
}
|
||
|
}
|