Proyectos de Subversion Iphone Microlearning - Nuevo Interface

Rev

Rev 14 | Rev 19 | 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
//  CardGalleryView.swift
3
//  twogetskills
4
//
5
//  Created by Efrain Yanez Recanatini on 3/6/22.
6
//
7
 
8
import Foundation
9
import SwiftUI
10
import AVKit
17 efrain 11
import Network
12
import Alamofire
13
import SwiftyJSON
14
import TTGSnackbar
1 efrain 15
 
16
struct CardGalleryView: View {
17
 
8 efrain 18
    @EnvironmentObject private var networkMonitor : NetworkMonitor
1 efrain 19
    @EnvironmentObject private var appNavigation : AppNavigation
20
    @ObservedObject private var viewModel = GalleryCardViewModel()
21
 
17 efrain 22
 
8 efrain 23
 
24
    @State private var showGlobalAlert : Bool = false
25
    @State private var titleGlobalAlert : String = ""
26
    @State private var messageGlobalAlert : String = ""
27
 
28
 
17 efrain 29
    @State private var isDownloadInProgress = false
30
    @State private var isDownloadCompleted = false
31
    @State private var bytesDownloaded : Int64 = 0
14 efrain 32
 
1 efrain 33
 
34
    private var buttonShow : Bool = false
35
    private var buttonTitle : String = ""
36
 
8 efrain 37
 
14 efrain 38
    private let userUuid : String
17 efrain 39
    private var appData = AppData.sharedInstance
1 efrain 40
 
41
 
42
    init (slideUuid : String) {
14 efrain 43
        userUuid = appData.userUuid
44
        viewModel.fetch(slideUuid: slideUuid, userUuid: userUuid)
1 efrain 45
 
46
        self.buttonShow = false
47
        if self.viewModel.slide.type == Constants.SLIDE_TYPE_QUIZ  {
48
            self.buttonTitle = Config.LANG_BUTTON_LAUNCH_QUIZ
49
            self.buttonShow = true
50
        } else if self.viewModel.slide.type == Constants.SLIDE_TYPE_VIDEO {
51
            self.buttonTitle =  Config.LANG_BUTTON_LAUNCH_VIDEO_PLAYER
52
            self.buttonShow = true
53
        } else if self.viewModel.slide.type == Constants.SLIDE_TYPE_AUDIO   {
54
            self.buttonTitle = Config.LANG_BUTTON_LAUNCH_AUDIO_PLAYER
55
            self.buttonShow = true
56
        } else if self.viewModel.slide.type == Constants.SLIDE_TYPE_DOCUMENT {
57
            self.buttonTitle = Config.LANG_BUTTON_LAUNCH_VIEW_PDF
58
            self.buttonShow = true
8 efrain 59
 
60
        } else if self.viewModel.slide.type == Constants.SLIDE_TYPE_TEXT {
14 efrain 61
            self.buttonTitle = Config.LANG_BUTTON_LAUNCH_VIEW_TEXT
8 efrain 62
            self.buttonShow = true
1 efrain 63
        } else {
64
            self.buttonShow = false
65
        }
66
 
67
    }
68
 
69
 
70
 
71
 
72
    var body: some View {
73
        GeometryReader { geometry in
74
            let checkMarkX = (geometry.size.width - 50) / 2
75
            let checkMarkY = -1 * ((geometry.size.height - 50) / 2)
76
 
77
            let buttonX = (geometry.size.width - 180) / 2
17 efrain 78
           // let buttonY = (geometry.size.height - 80) / 2
79
 
80
            let buttonY = (geometry.size.height - 100) / 2
1 efrain 81
 
82
            ZStack {
17 efrain 83
                if self.isDownloadInProgress {
84
                    VStack {
85
                        ProgressView()
86
                        .progressViewStyle(CircularProgressViewStyle(tint: Color("color_progress_view_foreground")))
87
                        .scaleEffect(3, anchor: .center).zIndex(100000)
88
 
89
                        Text(String( self.bytesDownloaded) + " bytes descargados").zIndex(100000)
90
                    }.background(Color("color_filter_background"))
91
                }
92
 
1 efrain 93
                if self.viewModel.slide.completed == 1  {
8 efrain 94
                    Image(uiImage: UIImage(named: "ic_slide_completado_checkmark") ?? UIImage()).offset(x: checkMarkX, y: checkMarkY).zIndex(10000)
1 efrain 95
                }
96
 
97
                if self.buttonShow {
98
 
99
                    Button(action: {
100
                        btnPlay()
101
                    }, label: {
102
                        Text(self.buttonTitle)
103
                            .font(Font.custom(Config.FONT_NAME_BOLD, size: Config.FONT_SIZE_BUTTONS))
104
                        .foregroundColor(Color("color_button_gallery_foreground"))
105
 
106
                    })
107
 
108
                    .padding(.vertical, 15)
109
                    .padding(.horizontal, 10)
110
                    .background(Color("color_button_gallery_background"))
111
                    .cornerRadius(/*@START_MENU_TOKEN@*/3.0/*@END_MENU_TOKEN@*/)
112
                    .offset(x: buttonX, y: buttonY)
113
                    .zIndex(10000)
114
                }
115
 
116
                if (self.viewModel.progressCapsule >= 100 && self.viewModel.completedCapsule == 0)
117
                    || (self.viewModel.progressTopic >= 100 && self.viewModel.completedTopic == 0) {
118
                    Button(action: {
119
                        if self.viewModel.progressTopic >= 100 && self.viewModel.completedTopic == 0 {
120
 
121
                            appNavigation.subpageActive = .finishtopic
122
 
123
                        } else {
124
                            if self.viewModel.progressCapsule >= 100 && self.viewModel.completedCapsule == 0 {
125
                                appNavigation.subpageActive = .finishcapsule
126
                            }
127
                        }
128
                    }, label: {
129
                        Text(Config.LANG_BUTTON_FINISH_CAPSULE_OR_TOPIC)
130
                        .font(.callout)
131
                        .foregroundColor(.black)
132
                    })
133
                    .padding()
134
                    .background(Color("color_button_gallery_background"))
135
                    .cornerRadius(/*@START_MENU_TOKEN@*/3.0/*@END_MENU_TOKEN@*/)
136
                    .zIndex(10000)
137
                }
138
 
139
                VStack {
8 efrain 140
 
141
 
142
 
1 efrain 143
                    Spacer()
144
                    HStack {
145
                        if viewModel.slide.background.isEmpty && viewModel.slide.file.isEmpty {
146
                            Image(uiImage: UIImage(named: "logo") ?? UIImage())
147
                            .resizable()
148
                            .aspectRatio(contentMode: .fit)
149
                        } else {
150
                            CustomAsyncImage(
151
                                url: URL(string: self.viewModel.slide.type == Constants.SLIDE_TYPE_IMAGE ? self.viewModel.slide.file : self.viewModel.slide.background)!,
152
                                placeholder: {
153
                                    Spacer()
154
                                    Text(Config.LANG_COMMON_LOADING).font(.footnote).foregroundColor(.black)
155
                                    Spacer()
156
                                },
157
                                image: {
158
                                    Image(uiImage: $0).resizable()
159
                                }
160
                            )
161
                        }
162
                    }.padding(.horizontal, 5)
163
 
164
                    Spacer()
165
                }
166
               // .zIndex(500)
167
 
14 efrain 168
            }.onAppear {
169
                self.viewModel.fetchProgress(slideUuid: self.viewModel.slide.uuid, userUuid: self.userUuid)
170
            }
171
             .alert(isPresented: $showGlobalAlert) {
8 efrain 172
                Alert(
173
                    title: Text(self.titleGlobalAlert),
174
                    message: Text(self.messageGlobalAlert),
175
                    dismissButton: .default(Text(Config.LANG_COMMON_OK))
176
                )
1 efrain 177
            }
178
        }
179
    }
180
 
181
    private func btnPlay()
182
    {
183
 
17 efrain 184
        switch self.viewModel.slide.type
185
        {
186
            case Constants.SLIDE_TYPE_TEXT :
187
                appNavigation.pageActive = .webviewer
188
                break;
189
 
190
            case Constants.SLIDE_TYPE_QUIZ :
191
                let snackbar = TTGSnackbar(message: "Por implementar", duration: .long)
192
                snackbar.show()
193
                break;
194
 
195
            default :
196
                downloadFile();
197
                break;
198
        }
199
 
200
 
201
 
202
    }
203
 
204
    private func downloadFile()
205
    {
8 efrain 206
        if networkMonitor.status == .disconnected {
1 efrain 207
 
8 efrain 208
            self.titleGlobalAlert = Config.LANG_ERROR_NETWORK_TITLE
209
            self.messageGlobalAlert = Config.LANG_ERROR_NETWORK_MESSAGE_LONG
210
            self.showGlobalAlert  = true
211
            return
212
        }
213
 
17 efrain 214
        guard let url = URL(string: viewModel.slide.file) else {
215
            return
216
        }
8 efrain 217
 
17 efrain 218
        let arrayFullFilename = viewModel.slide.file.split(separator: "/")
219
        let filename  = String(arrayFullFilename[arrayFullFilename.count - 1])
220
 
1 efrain 221
 
17 efrain 222
 
223
        let headerSecurity = HeaderSecurity()
224
 
225
        let headers: HTTPHeaders = [
226
            .init(name: Constants.HTTP_HEADER_SECURITY_TOKEN, value: appData.deviceUuid),
227
            .init(name: Constants.HTTP_HEADER_SECURITY_SECRET, value: headerSecurity.secret),
228
            .init(name: Constants.HTTP_HEADER_SECURITY_CREATED, value: String(headerSecurity.created)),
229
            .init(name: Constants.HTTP_HEADER_SECURITY_RAND, value: String(headerSecurity.rand)),
230
            .accept(Constants.HTTP_HEADER_ACCEPT)
231
        ]
232
 
233
        AF.request(url, method: .get, headers: headers)
234
        .downloadProgress(closure : { (progress) in
235
            self.isDownloadInProgress = true
236
            self.bytesDownloaded = progress.completedUnitCount
8 efrain 237
 
17 efrain 238
        })
239
        .responseData{ (response) in
240
            self.isDownloadInProgress = false
241
 
242
            if let data = response.data {
243
             let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
244
                let resourceURL = documentsURL.appendingPathComponent(filename)
245
                do {
246
                    try data.write(to: resourceURL)
247
 
248
                    appData.urlExternalDownloaded = resourceURL.absoluteString
249
                    appData.save()
250
 
251
                    switch self.viewModel.slide.type
252
                    {
253
                        case  Constants.SLIDE_TYPE_VIDEO  :
254
                           // AppDelegate.orientationLock = UIInterfaceOrientationMask.landscapeLeft
255
                           //UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
256
                          //UIViewController.attemptRotationToDeviceOrientation()
257
 
258
 
259
                            self.appNavigation.pageActive = .videoplayer
260
                            break
261
 
262
                        case Constants.SLIDE_TYPE_AUDIO :
263
                           self.appNavigation.pageActive = .videoplayer
264
                            break
265
 
266
                        default :
267
                            self.appNavigation.pageActive = .pdfviewer
268
                            break
269
                    }
270
                } catch {
271
                    self.titleGlobalAlert = Config.LANG_ERROR_COMMUNICATION_TITLE
272
                    self.messageGlobalAlert = Config.LANG_ERROR_COMMUNICATION_MESSAGE
273
                    self.showGlobalAlert  = true
274
                }
275
 
276
            }
1 efrain 277
        }
278
    }
279
 
280
}
281
 
282
struct CardGalleryView_Previews: PreviewProvider {
283
    static var previews: some View {
284
        CardGalleryView(slideUuid: "S123")
285
    }
286
 
287
}
288