Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

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

Rev Autor Línea Nro. Línea
1 efrain 1
//
2
//  GridGalleryView.swift
3
//  twogetskills
4
//
5
//  Created by Efrain Yanez Recanatini on 3/7/22.
6
//
7
 
8
import Foundation
9
 
10
import SwiftUI
11
 
12
 
13
struct GridGalleryView: View {
14
 
8 efrain 15
    @EnvironmentObject private var networkMonitor : NetworkMonitor
1 efrain 16
    @EnvironmentObject private var appNavigation : AppNavigation
32 efrain 17
    @ObservedObject private var viewModel : GalleryGridViewModel = GalleryGridViewModel()
35 efrain 18
    @State private var positionVisible: Int = 0
1 efrain 19
 
20
 
17 efrain 21
    private var appData = AppData.sharedInstance
1 efrain 22
    private var capsuleTitle : String = ""
35 efrain 23
    private let rows = [
24
        GridItem(.flexible())
25
    ]
1 efrain 26
 
27
 
17 efrain 28
 
1 efrain 29
 
30
    init()
31
    {
32
        self.viewModel.fetch(capsuleUuid: appData.capsuleUuidActive, userUuid: appData.userUuid)
33
 
34
        let capsuleDao = CapsuleDao.sharedInstance
35
        let capsule = capsuleDao.selectByUuid(uuid: appData.capsuleUuidActive)
36
 
37
        if capsule.name.count > Constants.APP_BAR_TITLE_MAX_LENGTH {
38
            capsuleTitle = String(Array(capsule.name)[0...Constants.APP_BAR_TITLE_MAX_LENGTH]) + "..."
39
        } else {
40
            capsuleTitle = capsule.name
41
        }
42
    }
43
 
44
 
33 efrain 45
    @ViewBuilder
1 efrain 46
    var body: some View {
47
        GeometryReader { geometry in
35 efrain 48
            ZStack {
49
 
50
                if self.viewModel.hasPrevious()  {
51
                    Button(action: {
52
                        print("Button previouse")
53
                        self.viewModel.previous()
54
                        print("slideActiveIndex: \(self.viewModel.slideActiveIndex)")
55
                        self.completeSlide(position: self.viewModel.slideActiveIndex)
56
 
57
                        appData.slideUuidActive = self.viewModel.slides[self.viewModel.slideActiveIndex].uuid
58
                        appData.save()
36 efrain 59
 
60
                        self.positionVisible = self.viewModel.slideActiveIndex
35 efrain 61
                    }, label: {
62
                        Image(systemName: "arrow.left")
36 efrain 63
                            .frame(width: 40.0, height: 40.0, alignment: .center)
35 efrain 64
                    })
32 efrain 65
 
36 efrain 66
 
35 efrain 67
                         .cornerRadius(/*@START_MENU_TOKEN@*/3.0/*@END_MENU_TOKEN@*/)
68
                    .background(Color("color_button_gallery_background"))
69
                    .foregroundColor(Color("color_button_gallery_foreground"))
70
                        .offset(x: -1 * ((geometry.size.width / 2) - 30), y :  25).zIndex(10000)
71
                }
1 efrain 72
 
35 efrain 73
                if self.viewModel.hasNext() {
1 efrain 74
                    Button(action: {
35 efrain 75
                        print("Button next")
76
                        self.viewModel.next()
77
                        print("slideActiveIndex: \(self.viewModel.slideActiveIndex)")
78
                        self.completeSlide(position: self.viewModel.slideActiveIndex)
22 efrain 79
 
35 efrain 80
                        appData.slideUuidActive = self.viewModel.slides[self.viewModel.slideActiveIndex].uuid
81
                        appData.save()
1 efrain 82
 
36 efrain 83
                        self.positionVisible  = self.viewModel.slideActiveIndex
1 efrain 84
 
36 efrain 85
 
1 efrain 86
                    }, label: {
35 efrain 87
                        Image(systemName: "arrow.right")
36 efrain 88
                            .frame(width: 40.0, height: 40.0, alignment: .center)
1 efrain 89
                    })
36 efrain 90
 
35 efrain 91
                    .background(Color("color_button_gallery_background"))
92
                    .foregroundColor(Color("color_button_gallery_foreground"))
93
                    .offset(x: ((geometry.size.width  / 2) - 30), y :  25).zIndex(10000)
1 efrain 94
                }
95
 
35 efrain 96
                VStack(spacing: 0) {
97
                    HStack {
98
                        Button(action: {
99
 
100
 
101
                            appNavigation.subpageActive = .slides
102
 
103
 
104
                        }, label: {
34 efrain 105
 
35 efrain 106
 
107
                            Image(systemName: "chevron.backward")
108
                            .frame(width: 32, height: 32, alignment: /*@START_MENU_TOKEN@*/.center/*@END_MENU_TOKEN@*/)
109
                            .aspectRatio(contentMode: .fit)
110
                                .foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground"))
111
                        })
112
                        .padding(.leading, 16)
34 efrain 113
 
35 efrain 114
                        Text(networkMonitor.status == .disconnected ? Config.LANG_ERROR_NETWORK_MESSAGE_SHORT :  capsuleTitle)
115
                        .font(Font.custom(Config.FONT_NAME_REGULAR, size: Config.FONT_SIZE_APP_BAR_HEAD1 ))
116
                            .foregroundColor(networkMonitor.status == .disconnected ? Color("color_network_disconnected_foreground") : Color("color_app_bar_foreground"))
117
                            .padding(.leading, 4)
34 efrain 118
 
35 efrain 119
                        Spacer()
120
                    }
121
                    .edgesIgnoringSafeArea(.top)
122
                    .frame(height: 50)
123
                    .background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))
124
 
125
 
126
                    Divider().background(networkMonitor.status == .disconnected ? Color("color_network_disconnected_background") : Color("color_app_bar_background"))
127
 
36 efrain 128
                    VStack(spacing: 0)  {
129
                        GeometryReader { geometry2 in
35 efrain 130
                    ScrollViewReader { scrollProxy in
131
                        ScrollView(.horizontal) {
132
                            LazyHGrid(rows: rows, alignment: .center) {
133
                                ForEach(0..<self.viewModel.slides.count) { index in
134
                                    CardGalleryView(
135
                                        slideUuid:  self.viewModel.slides[self.viewModel.slideActiveIndex].uuid
136
                                    )
137
                                    .environmentObject(appNavigation)
36 efrain 138
                                    .frame(width: geometry2.size.width, height: geometry2.size.height)
35 efrain 139
                                    .id(index)
36 efrain 140
                                    //.border(Color.green, width: 1)
141
                                    .onAppear {
142
                                        completeSlide(position: index)
143
                                        self.viewModel.slideActiveIndex = index
144
                                    }
34 efrain 145
                                }
36 efrain 146
                            }//.border(Color.black, width: 1)
147
                        }//.border(Color.red, width: 1)
148
                            .frame(width: geometry2.size.width, height: geometry2.size.height)
35 efrain 149
                        .onChange(of: self.positionVisible) { id in
150
                            guard id != nil else { return }
34 efrain 151
 
35 efrain 152
                            print("positionVisible : \(positionVisible)")
153
                            scrollProxy.scrollTo(id)
34 efrain 154
 
155
                        }
35 efrain 156
                        .onAppear {
157
                            var position : Int = 0
158
                            var i : Int = 0
159
                            while i < self.viewModel.slides.count {
160
                                if appData.slideUuidActive == self.viewModel.slides[i].uuid {
161
                                    position = i
162
                                }
163
                                i += 1
32 efrain 164
                            }
1 efrain 165
 
35 efrain 166
                            self.viewModel.slideActiveIndex = position
36 efrain 167
                            completeSlide(position: position)
35 efrain 168
                            scrollProxy.scrollTo(position)
17 efrain 169
                        }
170
                    }
36 efrain 171
                        }
172
                    }
32 efrain 173
                }
1 efrain 174
            }
175
        }
176
    }
177
 
178
    private func completeSlide(position: Int)
179
    {
180
 
181
        if self.viewModel.slides[position].type == Constants.SLIDE_TYPE_IMAGE {
182
 
183
            let dataService = DataService()
184
            dataService.completeSlide(slide: self.viewModel.slides[position])
185
        }
186
    }
187
 
188
 
189
 
190
 
191
 
192
}
193
 
194
 
195
 
196
 
197
 
198
struct GridGalleryView_Previews: PreviewProvider {
199
    static var previews: some View {
200
        //GridGalleryView(capsuleUuid: "C123", position: 2)
201
 
202
        GridGalleryView()
203
    }
204
}
205
 
206
 
207