59 lines
1.6 KiB
Swift
59 lines
1.6 KiB
Swift
import SwiftUI
|
|
import Env
|
|
|
|
extension IceCubesApp {
|
|
var tabBarView: some View {
|
|
TabView(selection: .init(get: {
|
|
selectedTab
|
|
}, set: { newTab in
|
|
if newTab == selectedTab {
|
|
/// Stupid hack to trigger onChange binding in tab views.
|
|
popToRootTab = .other
|
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
|
|
popToRootTab = selectedTab
|
|
}
|
|
}
|
|
|
|
HapticManager.shared.fireHaptic(of: .tabSelection)
|
|
SoundEffectManager.shared.playSound(of: .tabSelection)
|
|
|
|
selectedTab = newTab
|
|
|
|
DispatchQueue.main.async {
|
|
if selectedTab == .notifications,
|
|
let token = appAccountsManager.currentAccount.oauthToken
|
|
{
|
|
userPreferences.notificationsCount[token] = 0
|
|
watcher.unreadNotificationsCount = 0
|
|
}
|
|
}
|
|
|
|
})) {
|
|
ForEach(availableTabs) { tab in
|
|
tab.makeContentView(popToRootTab: $popToRootTab)
|
|
.tabItem {
|
|
if userPreferences.showiPhoneTabLabel {
|
|
tab.label
|
|
} else {
|
|
Image(systemName: tab.iconName)
|
|
}
|
|
}
|
|
.tag(tab)
|
|
.badge(badgeFor(tab: tab))
|
|
.toolbarBackground(theme.primaryBackgroundColor.opacity(0.50), for: .tabBar)
|
|
}
|
|
}
|
|
.id(appAccountsManager.currentClient.id)
|
|
}
|
|
|
|
|
|
private func badgeFor(tab: Tab) -> Int {
|
|
if tab == .notifications, selectedTab != tab,
|
|
let token = appAccountsManager.currentAccount.oauthToken
|
|
{
|
|
return watcher.unreadNotificationsCount + (userPreferences.notificationsCount[token] ?? 0)
|
|
}
|
|
return 0
|
|
}
|
|
}
|