diff --git a/mac/Config/Config/InstallationViews/CompletedInstallView.swift b/mac/Config/Config/InstallationViews/CompletedInstallView.swift index 9d1a460ab0..51e69ff230 100644 --- a/mac/Config/Config/InstallationViews/CompletedInstallView.swift +++ b/mac/Config/Config/InstallationViews/CompletedInstallView.swift @@ -21,7 +21,6 @@ struct CompletedInstallView: View { } var body: some View { - VStack { Spacer() @@ -43,4 +42,3 @@ struct CompletedInstallView: View { } } } - diff --git a/mac/Config/Config/InstallationViews/GrantAccessibiltyPermissionView.swift b/mac/Config/Config/InstallationViews/GrantAccessibiltyPermissionView.swift index f95d57dc85..27dc346da4 100644 --- a/mac/Config/Config/InstallationViews/GrantAccessibiltyPermissionView.swift +++ b/mac/Config/Config/InstallationViews/GrantAccessibiltyPermissionView.swift @@ -50,7 +50,7 @@ struct GrantAccessibiltyPermissionView: View { .padding(7) .background { Capsule() - .fill(.quaternary.opacity(0.6)) + .fill(.quaternary.opacity(0.5)) } } @@ -68,16 +68,16 @@ struct GrantAccessibiltyPermissionView: View { Spacer() HStack { - Text("Grant accessibility control") .font(.title2) .frame(maxWidth: .infinity, alignment: .leading) Button { if installation.currentTask()?.taskType == .requestAccess { - openSettingsButtonPressed = true installation.executeNextInstallationTask() + openSettingsButtonPressed = true } else { openAccessibilitySettings() + openSettingsButtonPressed = true } } label: { Text("Open Settings") @@ -91,7 +91,6 @@ struct GrantAccessibiltyPermissionView: View { Button { checkingPermission = true installation.executeNextInstallationTask() - } label: { Text("Continue") .padding(.horizontal, 16) @@ -115,19 +114,3 @@ struct GrantAccessibiltyPermissionView: View { } } } - -struct GrantAccessibiltyPermissionView_Previews: PreviewProvider { - struct PreviewHost: View { - @Namespace private var namespace - private let installation = InstallationContainer() - - var body: some View { - GrantAccessibiltyPermissionView(namespace: namespace, onContinue: {}) - .environmentObject(installation) - } - } - - static var previews: some View { - PreviewHost() - } -} diff --git a/mac/Config/Config/InstallationViews/InstallPage.swift b/mac/Config/Config/InstallationViews/InstallPage.swift index bc58ce9b18..771af31b46 100644 --- a/mac/Config/Config/InstallationViews/InstallPage.swift +++ b/mac/Config/Config/InstallationViews/InstallPage.swift @@ -9,7 +9,8 @@ enum InstallPage: String, CaseIterable { case loading - case initial + case initialInstall + case initialRepair case completed case enableInputMethod case allowSecurityPermission diff --git a/mac/Config/Config/InstallationViews/NewInstallView.swift b/mac/Config/Config/InstallationViews/NewInstallView.swift index 51f5c5d0d1..db16949fb6 100644 --- a/mac/Config/Config/InstallationViews/NewInstallView.swift +++ b/mac/Config/Config/InstallationViews/NewInstallView.swift @@ -11,11 +11,11 @@ import Foundation struct NewInstallView: View { - @EnvironmentObject var installation: InstallationContainer - @Environment(\.dismiss) private var dismiss + let namespace: Namespace.ID let onContinue: () -> Void + var versionText: String { if let version = installation.installationState?.keymanVersion { return "Version: \(version) " diff --git a/mac/Config/Config/InstallationViews/InitialRepairView.swift b/mac/Config/Config/InstallationViews/NewRepairView.swift similarity index 77% rename from mac/Config/Config/InstallationViews/InitialRepairView.swift rename to mac/Config/Config/InstallationViews/NewRepairView.swift index 6b376b5131..f3eed80609 100644 --- a/mac/Config/Config/InstallationViews/InitialRepairView.swift +++ b/mac/Config/Config/InstallationViews/NewRepairView.swift @@ -12,9 +12,12 @@ import SwiftUI import AppKit internal import UniformTypeIdentifiers -struct InitialRepairView: View { +struct NewRepairView: View { + @EnvironmentObject var installation: InstallationContainer + let namespace: Namespace.ID + let onContinue: () -> Void var body: some View { VStack { @@ -42,22 +45,8 @@ struct InitialRepairView: View { .buttonStyle(.borderedProminent) .tint(.blue) .clipShape(Capsule()) - NavigationButton(action: .advance) + NavigationButton(action: .advance, onContinue: onContinue) } } } } - -private struct InitialRepairViewPreview: View { - @Namespace private var namespace - private let installation = InstallationContainer() - - var body: some View { - InitialRepairView(namespace: namespace) - .environmentObject(installation) - } -} - -#Preview { - InitialRepairViewPreview() -} diff --git a/mac/Config/Config/InstallationViews/ParentInstallView.swift b/mac/Config/Config/InstallationViews/ParentInstallView.swift index da3a05e9c5..a200476e04 100644 --- a/mac/Config/Config/InstallationViews/ParentInstallView.swift +++ b/mac/Config/Config/InstallationViews/ParentInstallView.swift @@ -16,10 +16,12 @@ struct ParentInstallView: View { func chooseCurrentPage() { if installation.installationPhase.hasTasks { switch installation.currentTask()?.taskType { - case .prepareNewInstall: currentPage = .initial + case .prepareNewInstall: currentPage = .initialInstall + case .prepareNewRepair: currentPage = .initialRepair case .enableInputMethod: currentPage = .enableInputMethod case .requestAccess: currentPage = .allowSecurityPermission - case .confirmAccess: print("Access granted") + case .confirmAccess: currentPage = .allowSecurityPermission + case .confirmRestart: currentPage = .restartComputer case .requestRestart: currentPage = .restartComputer default: currentPage = .completed } @@ -28,21 +30,26 @@ struct ParentInstallView: View { case .evaluatingInstallation: currentPage = .loading case .inputMethodMissing, .inputMethodOutdated: currentPage = .rerunInstaller case .installationComplete: - if installation.getHasDisplayedInstallationComplete() { - currentPage = .completed + currentPage = .completed + if !installation.getHasDisplayedInstallationComplete() { installation.setHasDisplayedInstallationComplete() } - default: currentPage = .completed + default: + currentPage = .completed } } - print("currentPage is now \(currentPage)") + } var body: some View { ZStack { switch currentPage { case .loading: ProgressView() - case .initial: NewInstallView(namespace: animation,onContinue: { + case .initialInstall: NewInstallView(namespace: animation,onContinue: { + installation.executeNextInstallationTask() + chooseCurrentPage() + }) + case .initialRepair: NewRepairView(namespace: animation,onContinue: { installation.executeNextInstallationTask() chooseCurrentPage() }) @@ -54,15 +61,19 @@ struct ParentInstallView: View { } } .onAppear { + print("LOL ", installation.installationPhase) + print("LOL ", installation.currentTask()?.taskType ?? "no task available") if installation.installationPhase == .evaluatingInstallation { currentPage = .loading Task { while installation.installationPhase == .evaluatingInstallation { - try? await Task.sleep(for: .milliseconds(100)) + try? await Task.sleep(for: .milliseconds(200)) } await MainActor.run { withAnimation(.smooth) { chooseCurrentPage() + print("LOOL ", installation.installationPhase) + } } } @@ -70,8 +81,6 @@ struct ParentInstallView: View { chooseCurrentPage() } } - .onReceive( NotificationCenter.default.publisher(for: .installationRepairStarted)) { notification in - } .padding() .frame(minWidth: 600) .frame(minHeight: 400) diff --git a/mac/Config/Config/InstallationViews/RerunInstallerView.swift b/mac/Config/Config/InstallationViews/RerunInstallerView.swift index a452b115f2..1f10ab0be2 100644 --- a/mac/Config/Config/InstallationViews/RerunInstallerView.swift +++ b/mac/Config/Config/InstallationViews/RerunInstallerView.swift @@ -11,6 +11,20 @@ import SwiftUI import AppKit internal import UniformTypeIdentifiers +private func chooseAndOpenKeymanInstaller() { + let panel = NSOpenPanel() + panel.message = "Open the Keyman .pkg file." + panel.allowedContentTypes = [UTType(filenameExtension: "pkg")!] + panel.directoryURL = FileManager.default.urls( + for: .downloadsDirectory, + in: .userDomainMask + ).first + + if panel.runModal() == .OK, let url = panel.url { + NSWorkspace.shared.open(url) + } +} + struct RerunInstallerView: View { @EnvironmentObject var installation: InstallationContainer let namespace: Namespace.ID @@ -42,7 +56,7 @@ struct RerunInstallerView: View { .font(.title2) .frame(maxWidth: .infinity, alignment: .leading) Button { - installation.executeNextInstallationTask() + chooseAndOpenKeymanInstaller() } label: { Text("Open Installer") .padding(.horizontal, 16)