| 1 | efrain | 1 | //
 | 
        
           |  |  | 2 | //  GridSlideView.swift
 | 
        
           |  |  | 3 | //  twogetskills
 | 
        
           |  |  | 4 | //
 | 
        
           |  |  | 5 | //  Created by Efrain Yanez Recanatini on 2/17/22.
 | 
        
           |  |  | 6 | //
 | 
        
           |  |  | 7 |   | 
        
           |  |  | 8 | import SwiftUI
 | 
        
           |  |  | 9 |   | 
        
           |  |  | 10 |   | 
        
           |  |  | 11 | struct GridSlideView: View {
 | 
        
           |  |  | 12 |   | 
        
           |  |  | 13 |     @EnvironmentObject private var networkMonitor : NetworkMonitor
 | 
        
           |  |  | 14 |     @EnvironmentObject private var appNavigation : AppNavigation
 | 
        
           |  |  | 15 |     @ObservedObject  private var viewModel : SlideGridViewModel = SlideGridViewModel()
 | 
        
           |  |  | 16 |   | 
        
           |  |  | 17 |     @State private var scrollToIndex : Int = 0
 | 
        
           |  |  | 18 |   | 
        
           |  |  | 19 |     private var appData = AppData.sharedInstance
 | 
        
           | 17 | efrain | 20 |     private let capsuleDao : CapsuleDao = CapsuleDao()
 | 
        
           | 1 | efrain | 21 |     private var capsuleModel : CapsuleModel = CapsuleModel()
 | 
        
           |  |  | 22 |   | 
        
           |  |  | 23 |   | 
        
           |  |  | 24 |     private var capsuleTitle : String = ""
 | 
        
           |  |  | 25 |   | 
        
           |  |  | 26 |     private let config = [
 | 
        
           |  |  | 27 |         GridItem(.fixed(Constants.CARD_WIDTH)),
 | 
        
           |  |  | 28 |         GridItem(.fixed(Constants.CARD_WIDTH))
 | 
        
           |  |  | 29 |     ]
 | 
        
           |  |  | 30 |   | 
        
           |  |  | 31 |   | 
        
           |  |  | 32 |     init()
 | 
        
           |  |  | 33 |     {
 | 
        
           |  |  | 34 |         self.capsuleModel = capsuleDao.selectByUuid(uuid: appData.capsuleUuidActive)
 | 
        
           |  |  | 35 |         viewModel.fetch(capsuleUuid: self.capsuleModel.uuid, userUuid: appData.userUuid)
 | 
        
           |  |  | 36 |   | 
        
           |  |  | 37 |         if self.capsuleModel.name.count > Constants.APP_BAR_TITLE_MAX_LENGTH {
 | 
        
           |  |  | 38 |             capsuleTitle = String(Array(self.capsuleModel.name)[0...Constants.APP_BAR_TITLE_MAX_LENGTH]) + "..."
 | 
        
           |  |  | 39 |         } else {
 | 
        
           |  |  | 40 |             capsuleTitle = self.capsuleModel.name
 | 
        
           |  |  | 41 |         }
 | 
        
           |  |  | 42 |     }
 | 
        
           |  |  | 43 |   | 
        
           |  |  | 44 |     var body: some View {
 | 
        
           |  |  | 45 |   | 
        
           |  |  | 46 |             VStack(spacing: 0) {
 | 
        
           |  |  | 47 |                 HStack {
 | 
        
           |  |  | 48 |                     Button(action: {
 | 
        
           |  |  | 49 |   | 
        
           |  |  | 50 |   | 
        
           |  |  | 51 |                         if appNavigation.subPageSource == .mycapsules {
 | 
        
           |  |  | 52 |                             //appData.topicUuidActive = ""
 | 
        
           |  |  | 53 |                             //appData.capsuleUuidActive = ""
 | 
        
           |  |  | 54 |                             appData.slideUuidActive = ""
 | 
        
           |  |  | 55 |                             appData.save()
 | 
        
           |  |  | 56 |   | 
        
           |  |  | 57 |                             withAnimation {
 | 
        
           |  |  | 58 |                                 appNavigation.subpageActive = .mycapsules
 | 
        
           |  |  | 59 |                             }
 | 
        
           |  |  | 60 |                         } else {
 | 
        
           |  |  | 61 |                             appData.slideUuidActive = ""
 | 
        
           |  |  | 62 |                             appData.save()
 | 
        
           |  |  | 63 |   | 
        
           |  |  | 64 |                             withAnimation {
 | 
        
           |  |  | 65 |                                 appNavigation.subpageActive = .capsules
 | 
        
           |  |  | 66 |                             }
 | 
        
           |  |  | 67 |                         }
 | 
        
           |  |  | 68 |   | 
        
           |  |  | 69 |   | 
        
           |  |  | 70 |                     }, label: {
 | 
        
           |  |  | 71 |   | 
        
           |  |  | 72 |   | 
        
           |  |  | 73 |                         Image(systemName: "chevron.backward")
 | 
        
           |  |  | 74 |                         .frame(width: 32, height: 32, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
 | 
        
           |  |  | 75 |                         .aspectRatio(contentMode: .fit)
 | 
        
           |  |  | 76 |                             .foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground"))
 | 
        
           |  |  | 77 |                     })
 | 
        
           |  |  | 78 |                     .padding(.leading, 16)
 | 
        
           |  |  | 79 |   | 
        
           |  |  | 80 |                     Text(networkMonitor.status == .disconnected ? Config.LANG_ERROR_NETWORK_MESSAGE_SHORT : capsuleTitle)
 | 
        
           |  |  | 81 |                     .font(Font.custom(Config.FONT_NAME_REGULAR, size: Config.FONT_SIZE_APP_BAR_HEAD1 ))
 | 
        
           |  |  | 82 |                      .foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground"))
 | 
        
           |  |  | 83 |                         .padding(.leading, 4)
 | 
        
           |  |  | 84 |   | 
        
           |  |  | 85 |                     Spacer()
 | 
        
           |  |  | 86 |                 }
 | 
        
           |  |  | 87 |                 .edgesIgnoringSafeArea(.top)
 | 
        
           |  |  | 88 |                 .frame(height: 50)
 | 
        
           |  |  | 89 |                 .background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))
 | 
        
           |  |  | 90 |   | 
        
           |  |  | 91 |   | 
        
           |  |  | 92 |                 Divider().background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))
 | 
        
           |  |  | 93 |   | 
        
           |  |  | 94 |   | 
        
           |  |  | 95 |                 Divider()
 | 
        
           |  |  | 96 |   | 
        
           |  |  | 97 |                 ScrollView() {
 | 
        
           |  |  | 98 |                     ScrollViewReader { proxy in
 | 
        
           |  |  | 99 |                         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: {
 | 
        
           |  |  | 100 |   | 
        
           |  |  | 101 |                             ForEach(0..<self.viewModel.slides.count) { index in
 | 
        
           |  |  | 102 |                                 CardSlideView(
 | 
        
           |  |  | 103 |                                     slideUuid: self.viewModel.slides[index].uuid,
 | 
        
           |  |  | 104 |                                     position: index
 | 
        
           |  |  | 105 |                                 )
 | 
        
           |  |  | 106 |                                 .environmentObject(appNavigation)
 | 
        
           |  |  | 107 |                                 .frame(
 | 
        
           |  |  | 108 |                                     width: Constants.CARD_WIDTH,
 | 
        
           |  |  | 109 |                                     height: Constants.CARD_HEIGHT,
 | 
        
           |  |  | 110 |                                     alignment: .center
 | 
        
           |  |  | 111 |                                 )
 | 
        
           |  |  | 112 |                                 .id(index)
 | 
        
           |  |  | 113 |   | 
        
           |  |  | 114 |                             }
 | 
        
           |  |  | 115 |                             /*}.onChange(of:  scrollToIndex, perform: { value in
 | 
        
           |  |  | 116 |                                 //print("onChange")
 | 
        
           |  |  | 117 |                                 proxy.scrollTo(value, anchor: nil)
 | 
        
           |  |  | 118 |                             })*/
 | 
        
           |  |  | 119 |                         })
 | 
        
           |  |  | 120 |                     }
 | 
        
           |  |  | 121 |   | 
        
           |  |  | 122 |                 }
 | 
        
           |  |  | 123 |                 .onAppear {
 | 
        
           |  |  | 124 |                     var i : Int = 0
 | 
        
           |  |  | 125 |                     while i < self.viewModel.slides.count {
 | 
        
           |  |  | 126 |                         if appData.slideUuidActive == self.viewModel.slides[i].uuid {
 | 
        
           |  |  | 127 |                             self.scrollToIndex = i
 | 
        
           |  |  | 128 |                         }
 | 
        
           |  |  | 129 |                         i += 1
 | 
        
           |  |  | 130 |                     }
 | 
        
           |  |  | 131 |                 }
 | 
        
           |  |  | 132 |                 .padding(.top, 5)
 | 
        
           |  |  | 133 |   | 
        
           |  |  | 134 |   | 
        
           |  |  | 135 |   | 
        
           |  |  | 136 |   | 
        
           |  |  | 137 |         }
 | 
        
           |  |  | 138 |     }
 | 
        
           |  |  | 139 | }
 | 
        
           |  |  | 140 |   | 
        
           |  |  | 141 | struct GridSlideView_Previews: PreviewProvider {
 | 
        
           |  |  | 142 |     static var previews: some View {
 | 
        
           |  |  | 143 |         //GridSlideView(capsuleUuid: "C123")
 | 
        
           |  |  | 144 |         GridSlideView()
 | 
        
           |  |  | 145 |     }
 | 
        
           |  |  | 146 | }
 | 
        
           |  |  | 147 |   | 
        
           |  |  | 148 |   |