Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

Rev 35 | Rev 37 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

//
//  GridGalleryView.swift
//  twogetskills
//
//  Created by Efrain Yanez Recanatini on 3/7/22.
//

import Foundation

import SwiftUI


struct GridGalleryView: View {

    @EnvironmentObject private var networkMonitor : NetworkMonitor
    @EnvironmentObject private var appNavigation : AppNavigation
    @ObservedObject private var viewModel : GalleryGridViewModel = GalleryGridViewModel()
    @State private var positionVisible: Int = 0


    private var appData = AppData.sharedInstance
    private var capsuleTitle : String = ""
    private let rows = [
        GridItem(.flexible())
    ]
    
    
  
    
    init()
    {
        self.viewModel.fetch(capsuleUuid: appData.capsuleUuidActive, userUuid: appData.userUuid)
        
        let capsuleDao = CapsuleDao.sharedInstance
        let capsule = capsuleDao.selectByUuid(uuid: appData.capsuleUuidActive)
       
        if capsule.name.count > Constants.APP_BAR_TITLE_MAX_LENGTH {
            capsuleTitle = String(Array(capsule.name)[0...Constants.APP_BAR_TITLE_MAX_LENGTH]) + "..."
        } else {
            capsuleTitle = capsule.name
        }
    }

    
    @ViewBuilder
    var body: some View {
        GeometryReader { geometry in
            ZStack {
                
                if self.viewModel.hasPrevious()  {
                    Button(action: {
                        print("Button previouse")
                        self.viewModel.previous()
                        print("slideActiveIndex: \(self.viewModel.slideActiveIndex)")
                        self.completeSlide(position: self.viewModel.slideActiveIndex)
                        
                        appData.slideUuidActive = self.viewModel.slides[self.viewModel.slideActiveIndex].uuid
                        appData.save()
                        
                        self.positionVisible = self.viewModel.slideActiveIndex
                    }, label: {
                        Image(systemName: "arrow.left")
                            .frame(width: 40.0, height: 40.0, alignment: .center)
                    })
                    

                         .cornerRadius(/*@START_MENU_TOKEN@*/3.0/*@END_MENU_TOKEN@*/)
                    .background(Color("color_button_gallery_background"))
                    .foregroundColor(Color("color_button_gallery_foreground"))
                        .offset(x: -1 * ((geometry.size.width / 2) - 30), y :  25).zIndex(10000)
                }
                
                if self.viewModel.hasNext() {
                    Button(action: {
                        print("Button next")
                        self.viewModel.next()
                        print("slideActiveIndex: \(self.viewModel.slideActiveIndex)")
                        self.completeSlide(position: self.viewModel.slideActiveIndex)
                        
                        appData.slideUuidActive = self.viewModel.slides[self.viewModel.slideActiveIndex].uuid
                        appData.save()
                        
                        self.positionVisible  = self.viewModel.slideActiveIndex
                        
                        
                    }, label: {
                        Image(systemName: "arrow.right")
                            .frame(width: 40.0, height: 40.0, alignment: .center)
                    })
                    
                    .background(Color("color_button_gallery_background"))
                    .foregroundColor(Color("color_button_gallery_foreground"))
                    .offset(x: ((geometry.size.width  / 2) - 30), y :  25).zIndex(10000)
                }
                
                VStack(spacing: 0) {
                    HStack {
                        Button(action: {
                            
                           
                            appNavigation.subpageActive = .slides
                            
                            
                        }, 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 :  capsuleTitle)
                        .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"))
                    
                    VStack(spacing: 0)  {
                        GeometryReader { geometry2 in
                    ScrollViewReader { scrollProxy in
                        ScrollView(.horizontal) {
                            LazyHGrid(rows: rows, alignment: .center) {
                                ForEach(0..<self.viewModel.slides.count) { index in
                                    CardGalleryView(
                                        slideUuid:  self.viewModel.slides[self.viewModel.slideActiveIndex].uuid
                                    )
                                    .environmentObject(appNavigation)
                                    .frame(width: geometry2.size.width, height: geometry2.size.height)
                                    .id(index)
                                    //.border(Color.green, width: 1)
                                    .onAppear {
                                        completeSlide(position: index)
                                        self.viewModel.slideActiveIndex = index
                                    }
                                }
                            }//.border(Color.black, width: 1)
                        }//.border(Color.red, width: 1)
                            .frame(width: geometry2.size.width, height: geometry2.size.height)
                        .onChange(of: self.positionVisible) { id in
                            guard id != nil else { return }
                            
                            print("positionVisible : \(positionVisible)")
                            scrollProxy.scrollTo(id)

                        }
                        .onAppear {
                            var position : Int = 0
                            var i : Int = 0
                            while i < self.viewModel.slides.count {
                                if appData.slideUuidActive == self.viewModel.slides[i].uuid {
                                    position = i
                                }
                                i += 1
                            }
                            
                            self.viewModel.slideActiveIndex = position
                            completeSlide(position: position)
                            scrollProxy.scrollTo(position)
                        }
                    }
                        }
                    }
                }
            }
        }
    }
    
    private func completeSlide(position: Int)
    {

        if self.viewModel.slides[position].type == Constants.SLIDE_TYPE_IMAGE {
            
            let dataService = DataService()
            dataService.completeSlide(slide: self.viewModel.slides[position])
        }
    }
    
    

 

}





struct GridGalleryView_Previews: PreviewProvider {
    static var previews: some View {
        //GridGalleryView(capsuleUuid: "C123", position: 2)
        
        GridGalleryView()
    }
}