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