another.im-ios/Monal/another.im/Views/Main/MainTabScreen.swift
2024-12-02 16:50:23 +01:00

115 lines
3 KiB
Swift

import Foundation
import SwiftfulRouting
import SwiftUI
private enum Tab {
case chats
case contacts
case settings
}
struct MainTabScreen: View {
@EnvironmentObject var wrapper: WrapperXMPP
@State private var selectedTab: Tab = .chats
var body: some View {
ZStack {
// Background color
Color.Material.Background.light
.ignoresSafeArea()
// Content
VStack(spacing: 0) {
switch selectedTab {
case .chats:
ChatsListScreen()
case .contacts:
ContactsScreen()
case .settings:
Text("settings")
Spacer()
// SettingsScreen()
// .environment(\.settingsParent, .main)
}
// 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: .chats, 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 .chats:
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 .chats:
return L10n.Tabs.Name.conversations
case .settings:
return L10n.Tabs.Name.settings
}
}
}