Proyectos de Subversion Iphone Microlearning - Inconcert

Rev

Rev 17 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

//
//  DownloadFile.swift
//  twogetskills
//
//  Created by Efrain Yanez Recanatini on 8/10/22.
//

import SwiftUI

import Network
import Alamofire
import SwiftyJSON
import TTGSnackbar


struct DownloadFileView: View {
    @EnvironmentObject private var networkMonitor : NetworkMonitor
    @EnvironmentObject private var appNavigation : AppNavigation
    

    @State private var isDownloadFailed = false
    @State private var bytesDownloaded : Int64 = 0
    
    @State private var showGlobalAlert : Bool = false
    @State private var titleGlobalAlert : String = ""
    @State private var messageGlobalAlert : String = ""
    
    private var appData = Environment(\.appData).wrappedValue
    private let slideModel : SlideModel
    
    init()
    {
        let slideDao = SlideDao()
        slideModel = slideDao.selectByUuid(uuid: appData.slideUuidActive)
    }
    
    var body: some View {
        HStack {
            Spacer()
            VStack(spacing: 0) {

                LottieView(name: isDownloadFailed ? "download-failed": "download-inprogress")
                    .frame(width: UIScreen.main.bounds.width / 2,
                           height: UIScreen.main.bounds.height / 4)
                    .padding(.top, 40)
                
                Text(isDownloadFailed ? Config.LANG_DOWNLOAD_FAILED_TITLE : Config.LANG_DOWNLOAD_TITLE )
                    .font(Font.custom(Config.FONT_NAME_BOLD, size:Config.FONT_SIZE_FINISH_TITLE))
                    .foregroundColor(Color("color_textview_foreground"))
                    .padding(.top, 40)
                
                
                Text(isDownloadFailed ? Config.LANG_DOWNLOAD_FAILED_LABEL:  Config.LANG_DOWNLOAD_LABEL  )
                    
                    .font(Font.custom(Config.FONT_NAME_BOLD, size:Config.FONT_SIZE_FINISH_MESSAGE))
                    .foregroundColor(Color("color_textview_foreground"))

                    .padding(.top, 20)
                
     
                if bytesDownloaded > 0 {
                    Text(String(bytesDownloaded) + " " + Config.LANG_DOWNLOAD_BYTES)
                    .font(Font.custom(Config.FONT_NAME_BOLD, size: Config.FONT_SIZE_FINISH_MESSAGE))
                    .foregroundColor(Color("color_textview_foreground"))
                    .padding(.top, 20)
                }
                
                Spacer()
            
                if isDownloadFailed {
                     Button(action: {
                        withAnimation {
                            appNavigation.pageActive = .home
                        }
                     }, label: {
                        Text(Config.LANG_COMMON_RETURN)
                            .font(Font.custom(Config.FONT_NAME_REGULAR, size: 16))
                            .frame(width: UIScreen.main.bounds.width - 32, height: 35)
                               
                               .foregroundColor(Color("color_button_dark_foreground"))
                               .background(Color("color_button_dark_background"))
                               .border(Color( "color_button_dark_border"), width: Config.BUTTON_BORDER_SIZE)
                               .cornerRadius(Config.BUTTON_BORDER_RADIUS)
                     }).padding(.bottom, 30)
                }
           
            }
            Spacer()
        }
        .onAppear {
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                downloadFile()
            }
        }
        .alert(isPresented: $showGlobalAlert) {
            Alert(
                title: Text(self.titleGlobalAlert),
                message: Text(self.messageGlobalAlert),
                dismissButton: .default(Text(Config.LANG_COMMON_OK))
            )
        }
        .background(Color("color_window_background"))
    
    }
    
    private func downloadFile()
    {
        guard let url = URL(string: slideModel.file) else {
            return
        }
            
        let arrayFullFilename = slideModel.file.split(separator: "/")
        let filename  = String(arrayFullFilename[arrayFullFilename.count - 1])

        let headerSecurity = HeaderSecurity()
            
        let headers: HTTPHeaders = [
            .init(name: Constants.HTTP_HEADER_SECURITY_TOKEN, value: appData.deviceUuid),
            .init(name: Constants.HTTP_HEADER_SECURITY_SECRET, value: headerSecurity.secret),
            .init(name: Constants.HTTP_HEADER_SECURITY_CREATED, value: String(headerSecurity.created)),
            .init(name: Constants.HTTP_HEADER_SECURITY_RAND, value: String(headerSecurity.rand)),
                .accept(Constants.HTTP_HEADER_ACCEPT)
        ]
            
        AF.request(url, method: .get, headers: headers)
            .downloadProgress(closure : { (progress) in
             
                self.bytesDownloaded = progress.completedUnitCount
                
        })
            .responseData{ (response) in
          
                if let data = response.data {
                 let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
                    let resourceURL = documentsURL.appendingPathComponent(filename)
                    do {
                        try data.write(to: resourceURL)

                        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
                            
                        appData.urlExternalDownloaded = resourceURL.absoluteString
                        appData.save()

                        switch slideModel.type
                        {
                            case  Constants.SLIDE_TYPE_VIDEO  :
                               AppDelegate.orientationLock = UIInterfaceOrientationMask.landscapeLeft
                               UIDevice.current.setValue(UIInterfaceOrientation.landscapeLeft.rawValue, forKey: "orientation")
                              UIViewController.attemptRotationToDeviceOrientation()
                                
                                
                                self.appNavigation.pageActive = .videoplayer
                                break
                       
                            case Constants.SLIDE_TYPE_AUDIO :
                               self.appNavigation.pageActive = .videoplayer
                                break
                           
                            default :
                                self.appNavigation.pageActive = .pdfviewer
                                break
                        }
                        }
                    } catch {
                        isDownloadFailed = true
                        titleGlobalAlert = Config.LANG_ERROR_COMMUNICATION_TITLE
                        messageGlobalAlert = Config.LANG_ERROR_COMMUNICATION_MESSAGE
                        showGlobalAlert  = true
                    }
                   
                } else {
                    isDownloadFailed = true
                }
            }
    }
        
}

struct DownloadFileView_Previews: PreviewProvider {
    static var previews: some View {
        DownloadFileView()
    }
}