// // SplashView.swift // SodaLive // // Created by klaus on 2023/08/09. // import SwiftUI import FirebaseRemoteConfig struct SplashView: View { @State private var isShowForcedUpdatePopup = false @State private var isShowUpdatePopup = false @State private var isShowMaintenancePopup = false @StateObject var liveViewModel = LiveViewModel() var body: some View { ZStack(alignment: .top) { Image("splash_bg") .resizable() .scaledToFill() .edgesIgnoringSafeArea(.all) VStack(spacing: 0) { Spacer() Text(I18n.Splash.tagline) .appFont(size: 23, weight: .bold) .foregroundColor(.white) Image("splash_text_logo") .padding(.top, 10) Text(I18n.Splash.brandName) .appFont(size: 21, weight: .bold) .foregroundColor(.white) .padding(.top, 52) } .padding(.bottom, screenSize().height * 100 / 2337) if isShowMaintenancePopup { SodaDialog( title: I18n.Splash.maintenanceTitle, desc: I18n.Splash.maintenanceDesc, confirmButtonTitle: I18n.Common.confirm, confirmButtonAction: { isShowMaintenancePopup = false } ) } if isShowUpdatePopup { SodaDialog( title: I18n.Splash.updateTitle, desc: I18n.Splash.updateDesc, confirmButtonTitle: I18n.Splash.updateConfirm, confirmButtonAction: { UIApplication.shared.open(URL(string: "https://apps.apple.com/us/app/id6461721697?mt=8")!, options: [:]) }, cancelButtonTitle: I18n.Splash.updateCancel, cancelButtonAction: { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { AppState.shared.setAppStep(step: .main) } } ) } if isShowForcedUpdatePopup { SodaDialog( title: I18n.Splash.updateTitle, desc: I18n.Splash.forcedUpdateDesc, confirmButtonTitle: I18n.Splash.updateConfirm, confirmButtonAction: { UIApplication.shared.open(URL(string: "https://apps.apple.com/us/app/id6461721697?mt=8")!, options: [:]) } ) } } .onAppear { DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { AppState.shared.isRestartApp = false } fetchLastestVersion() } } private func fetchLastestVersion() { let remoteConfig = RemoteConfig.remoteConfig() let configSettings = RemoteConfigSettings() configSettings.minimumFetchInterval = 60 remoteConfig.configSettings = configSettings remoteConfig.fetch { status, error in if status == .success { remoteConfig.activate { changed, error in let isMaintenance = remoteConfig["is_maintenance"].boolValue if isMaintenance { isShowMaintenancePopup = true } else { checkAppVersion(latestVersion: remoteConfig["ios_latest_version"].stringValue) } } } else { nextAppStep() } } } private func nextAppStep() { DispatchQueue.main.asyncAfter(deadline: .now() + 0.7) { withAnimation { if !UserDefaults.string(forKey: UserDefaultsKey.token).trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { if AppState.shared.pushRoomId > 0 { liveViewModel.enterLiveRoom(roomId: AppState.shared.pushRoomId) } else if AppState.shared.pushChannelId > 0 { AppState.shared.setAppStep(step: .creatorDetail(userId: AppState.shared.pushChannelId)) } else if AppState.shared.pushAudioContentId > 0 { AppState.shared.setAppStep(step: .contentDetail(contentId: AppState.shared.pushAudioContentId)) } else if AppState.shared.pushSeriesId > 0 { AppState.shared.setAppStep(step: .seriesDetail(seriesId: AppState.shared.pushSeriesId)) } else { AppState.shared.setAppStep(step: .main) } } else { AppState.shared.setAppStep(step: .main) } } } } private func checkAppVersion(latestVersion: String?) { let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String if let latestVersion = latestVersion, let version = version { let latestVersions = latestVersion.split(separator: ".") let versions = version.split(separator: ".") let latestMajor = Int(latestVersions[0])! let latestMinor = Int(latestVersions[1])! let latestPatch = Int(latestVersions[2])! let major = Int(versions[0])! let minor = Int(versions[1])! let patch = Int(versions[2])! if latestMajor > major || (latestMajor == major && latestMinor > minor) { self.isShowForcedUpdatePopup = true } else if latestMajor == major && latestMinor == minor && latestPatch > patch { self.isShowUpdatePopup = true } else { nextAppStep() } } else { nextAppStep() } } } #Preview { SplashView() }