Proyectos de Subversion Iphone Microlearning - Inconcert

Rev

Rev 17 | 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 {
    let minDragTranslationForSwipe: CGFloat = 50
    
    @State var selectTab : Int = 0
    @State private var positionVisible: Int = 0
    
    @EnvironmentObject private var networkMonitor : NetworkMonitor
    @EnvironmentObject private var appNavigation : AppNavigation
    @ObservedObject private var viewModel : GalleryGridViewModel = GalleryGridViewModel()
    


    private var appData = Environment(\.appData).wrappedValue
    private var capsuleTitle : String = ""

    
  
    
    init()
    {
        self.viewModel.fetch(capsuleUuid: appData.capsuleUuidActive, userUuid: appData.userUuid)
        
        let capsuleDao = CapsuleDao()
        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: {
                        self.viewModel.previous()
                        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: {
                        self.viewModel.next()
                        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"))
                    
                    
                    GeometryReader { geometry2 in
                    
                        TabView(selection: self.$selectTab ) {
                            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)
                                .highPriorityGesture(DragGesture().onEnded({ self.handleSwipe(translation: $0.translation.width)}))
                                                            
                            }
                        }
                        .onChange(of: self.positionVisible) { id in
                            self.selectTab = positionVisible
                        }
                        .tabViewStyle(PageTabViewStyle())
                    }

                    
                   .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)
                            
                    }
                }
            }
        }
    }
    
    
    func handleSwipe(translation: CGFloat) {
        if translation > minDragTranslationForSwipe  {
            if self.viewModel.hasPrevious() {
                self.viewModel.previous()
                self.completeSlide(position: self.viewModel.slideActiveIndex)
                
                appData.slideUuidActive = self.viewModel.slides[self.viewModel.slideActiveIndex].uuid
                appData.save()
                
                self.positionVisible = self.viewModel.slideActiveIndex
            }
        } else  if translation < -minDragTranslationForSwipe {
            if self.viewModel.hasNext() {
                self.viewModel.next()
                self.completeSlide(position: self.viewModel.slideActiveIndex)
                
                appData.slideUuidActive = self.viewModel.slides[self.viewModel.slideActiveIndex].uuid
                appData.save()
                
                self.positionVisible  = self.viewModel.slideActiveIndex
            }
        }
    }
    
    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()
    }
}