Rev 1 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
//
// GridCapsuleView.swift
// twogetskills
//
// Created by Efrain Yanez Recanatini on 2/17/22.
//
import SwiftUI
struct GridCapsuleView: View
{
@EnvironmentObject private var networkMonitor : NetworkMonitor
@EnvironmentObject private var appNavigation : AppNavigation
@State private var scrollToIndex : Int = 0
@ObservedObject private var viewModel : CapsuleGridViewModel = CapsuleGridViewModel()
private let itemPerRow: CGFloat = 2
private let config = [
GridItem(.flexible()),
GridItem(.flexible())
]
private var appData = AppData.sharedInstance
private var topicTitle : String = ""
private let capsuleUuidActive : String
init(preview : Bool = false)
{
self.capsuleUuidActive = appData.capsuleUuidActive
let topicDao = TopicDao()
let topicModel = topicDao.selectByUuid(uuid: appData.topicUuidActive)
viewModel.fetch(topicUuid: appData.topicUuidActive, userUuid: appData.userUuid)
if topicModel.name.count > Constants.APP_BAR_TITLE_MAX_LENGTH {
topicTitle = String(Array(topicModel.name)[0...Constants.APP_BAR_TITLE_MAX_LENGTH]) + "..."
} else {
topicTitle = topicModel.name
}
}
var body: some View {
VStack(spacing: 0) {
HStack {
Button(action: {
appData.capsuleUuidActive = ""
appData.slideUuidActive = ""
appData.save()
withAnimation {
appNavigation.subpageActive = .topics
}
}, label: {
Image(systemName: "chevron.backward")
.frame(width: 32, height: 32, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
.aspectRatio(contentMode: .fit)
.foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground"))
})
.padding(.leading, 16)
Text(networkMonitor.status == .disconnected ? Config.LANG_ERROR_NETWORK_MESSAGE_SHORT : topicTitle)
.font(Font.custom(Config.FONT_NAME_REGULAR, size: Config.FONT_SIZE_APP_BAR_HEAD1 ))
.foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground"))
.padding(.leading, 4)
Spacer()
}
.edgesIgnoringSafeArea(.top)
.frame(height: 50)
.background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))
Divider().background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))
ScrollView() {
ScrollViewReader { proxy in
LazyVGrid(columns: config, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/, spacing: /*@START_MENU_TOKEN@*/nil/*@END_MENU_TOKEN@*/, pinnedViews: /*@START_MENU_TOKEN@*/[]/*@END_MENU_TOKEN@*/, content:
{
ForEach(0..<self.viewModel.capsules.count) { index in
CardCapsuleView(
capsuleUuid: self.viewModel.capsules[index].uuid
)
.environmentObject(appNavigation)
.frame(
width: Constants.CARD_WIDTH,
height: Constants.CARD_HEIGHT,
alignment: .center
).id(index)
}
.onChange(of: scrollToIndex, perform: { value in
proxy.scrollTo(value, anchor: nil)
})
})
}
}
.padding(.top, 5)
}
.onAppear {
var i : Int = 0
while i < self.viewModel.capsules.count {
if self.capsuleUuidActive == self.viewModel.capsules[i].uuid {
self.scrollToIndex = i
}
i += 1
}
}
}
}
struct GridCapsuleView_Previews: PreviewProvider {
static var previews: some View {
GridCapsuleView( preview: true)
}
}