mirror of
https://github.com/maxgoedjen/secretive.git
synced 2026-03-06 01:37:22 +01:00
Missing secrets help (#671)
This commit is contained in:
@@ -25,6 +25,9 @@ extension EnvironmentValues {
|
||||
}()
|
||||
@Entry var updater: any UpdaterProtocol = _updater
|
||||
|
||||
private static let _justUpdatedChecker = JustUpdatedChecker()
|
||||
@Entry var justUpdatedChecker: any JustUpdatedCheckerProtocol = _justUpdatedChecker
|
||||
|
||||
@MainActor var secretStoreList: SecretStoreList {
|
||||
EnvironmentValues._secretStoreList
|
||||
}
|
||||
@@ -33,8 +36,8 @@ extension EnvironmentValues {
|
||||
@main
|
||||
struct Secretive: App {
|
||||
|
||||
private let justUpdatedChecker = JustUpdatedChecker()
|
||||
@Environment(\.agentStatusChecker) var agentStatusChecker
|
||||
@Environment(\.justUpdatedChecker) var justUpdatedChecker
|
||||
@AppStorage("defaultsHasRunSetup") var hasRunSetup = false
|
||||
@State private var showingSetup = false
|
||||
@State private var showingIntegrations = false
|
||||
@@ -52,7 +55,7 @@ struct Secretive: App {
|
||||
.onReceive(NotificationCenter.default.publisher(for: NSApplication.didBecomeActiveNotification)) { _ in
|
||||
guard hasRunSetup else { return }
|
||||
agentStatusChecker.check()
|
||||
if agentStatusChecker.running && justUpdatedChecker.justUpdated {
|
||||
if agentStatusChecker.running && justUpdatedChecker.justUpdatedBuild {
|
||||
// Relaunch the agent, since it'll be running from earlier update still
|
||||
reinstallAgent()
|
||||
} else if !agentStatusChecker.running && !agentStatusChecker.developmentBuild {
|
||||
@@ -89,7 +92,6 @@ struct Secretive: App {
|
||||
extension Secretive {
|
||||
|
||||
private func reinstallAgent() {
|
||||
justUpdatedChecker.check()
|
||||
Task {
|
||||
_ = await LaunchAgentController().install()
|
||||
try? await Task.sleep(for: .seconds(1))
|
||||
|
||||
@@ -1,23 +1,33 @@
|
||||
import Foundation
|
||||
import AppKit
|
||||
|
||||
protocol JustUpdatedCheckerProtocol: Observable {
|
||||
var justUpdated: Bool { get }
|
||||
@MainActor protocol JustUpdatedCheckerProtocol: Observable {
|
||||
var justUpdatedBuild: Bool { get }
|
||||
var justUpdatedOS: Bool { get }
|
||||
}
|
||||
|
||||
@Observable class JustUpdatedChecker: JustUpdatedCheckerProtocol {
|
||||
@Observable @MainActor class JustUpdatedChecker: JustUpdatedCheckerProtocol {
|
||||
|
||||
var justUpdated: Bool = false
|
||||
var justUpdatedBuild: Bool = false
|
||||
var justUpdatedOS: Bool = false
|
||||
|
||||
init() {
|
||||
check()
|
||||
nonisolated init() {
|
||||
Task { @MainActor in
|
||||
check()
|
||||
}
|
||||
}
|
||||
|
||||
func check() {
|
||||
let lastBuild = UserDefaults.standard.object(forKey: Constants.previousVersionUserDefaultsKey) as? String ?? "None"
|
||||
private func check() {
|
||||
let lastBuild = UserDefaults.standard.object(forKey: Constants.previousVersionUserDefaultsKey) as? String
|
||||
let lastOS = UserDefaults.standard.object(forKey: Constants.previousOSVersionUserDefaultsKey) as? String
|
||||
let currentBuild = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
|
||||
let osRaw = ProcessInfo.processInfo.operatingSystemVersion
|
||||
let currentOS = "\(osRaw.majorVersion).\(osRaw.minorVersion).\(osRaw.patchVersion)"
|
||||
UserDefaults.standard.set(currentBuild, forKey: Constants.previousVersionUserDefaultsKey)
|
||||
justUpdated = lastBuild != currentBuild
|
||||
UserDefaults.standard.set(currentOS, forKey: Constants.previousOSVersionUserDefaultsKey)
|
||||
justUpdatedBuild = lastBuild != currentBuild
|
||||
// To prevent this showing on first lauch for every user, only show if lastBuild is non-nil.
|
||||
justUpdatedOS = lastBuild != nil && lastOS != currentOS
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +38,7 @@ extension JustUpdatedChecker {
|
||||
|
||||
enum Constants {
|
||||
static let previousVersionUserDefaultsKey = "com.maxgoedjen.Secretive.lastBuild"
|
||||
static let previousOSVersionUserDefaultsKey = "com.maxgoedjen.Secretive.lastOS"
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -66,7 +66,7 @@ struct CreateSecretView<StoreType: SecretStoreModifiable>: View {
|
||||
Text(.createSecretBiometryCurrentWarning)
|
||||
.padding(.horizontal, 10)
|
||||
.padding(.vertical, 3)
|
||||
.background(.red.opacity(0.5), in: RoundedRectangle(cornerRadius: 5))
|
||||
.boxBackground(color: .red)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -85,7 +85,7 @@ struct CreateSecretView<StoreType: SecretStoreModifiable>: View {
|
||||
Text(.createSecretMldsaWarning)
|
||||
.padding(.horizontal, 10)
|
||||
.padding(.vertical, 3)
|
||||
.background(.red.opacity(0.5), in: RoundedRectangle(cornerRadius: 5))
|
||||
.boxBackground(color: .orange)
|
||||
}
|
||||
}
|
||||
VStack(alignment: .leading) {
|
||||
|
||||
@@ -27,7 +27,9 @@ struct EmptyStoreImmutableView: View {
|
||||
}
|
||||
|
||||
struct EmptyStoreModifiableView: View {
|
||||
|
||||
|
||||
@Environment(\.justUpdatedChecker) var justUpdatedChecker
|
||||
|
||||
var body: some View {
|
||||
GeometryReader { windowGeometry in
|
||||
VStack {
|
||||
@@ -51,6 +53,21 @@ struct EmptyStoreModifiableView: View {
|
||||
}.frame(height: (windowGeometry.size.height/2) - 20).padding()
|
||||
Text(.emptyStoreModifiableClickHereTitle).bold()
|
||||
Text(.emptyStoreModifiableClickHereDescription)
|
||||
if justUpdatedChecker.justUpdatedOS {
|
||||
Spacer()
|
||||
.frame(height: 20)
|
||||
VStack(spacing: 10) {
|
||||
Text(.emptyStoreModifiableEmptyOsWarningTitle)
|
||||
.font(.title2)
|
||||
.bold()
|
||||
Text(.emptyStoreModifiableEmptyOsWarningDescription)
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
.bold()
|
||||
}
|
||||
.padding()
|
||||
.boxBackground(color: .orange)
|
||||
.padding()
|
||||
}
|
||||
Spacer()
|
||||
}.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||
}
|
||||
@@ -61,6 +78,10 @@ struct EmptyStoreModifiableView: View {
|
||||
#Preview {
|
||||
EmptyStoreImmutableView()
|
||||
}
|
||||
#Preview {
|
||||
EmptyStoreImmutableView()
|
||||
// .environment(\.justUpdatedChecker, <#T##value: V##V#>)
|
||||
}
|
||||
#Preview {
|
||||
EmptyStoreModifiableView()
|
||||
}
|
||||
|
||||
32
Sources/Secretive/Views/Styles/BoxBackgroundStyle.swift
Normal file
32
Sources/Secretive/Views/Styles/BoxBackgroundStyle.swift
Normal file
@@ -0,0 +1,32 @@
|
||||
import SwiftUI
|
||||
|
||||
struct BoxBackgroundModifier: ViewModifier {
|
||||
|
||||
let color: Color
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
content
|
||||
.background {
|
||||
RoundedRectangle(cornerRadius: 5)
|
||||
.fill(color.opacity(0.3))
|
||||
.stroke(color, lineWidth: 1)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extension View {
|
||||
|
||||
func boxBackground(color: Color) -> some View {
|
||||
modifier(BoxBackgroundModifier(color: color))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
#Preview {
|
||||
Text("Hello")
|
||||
.boxBackground(color: .red)
|
||||
.padding()
|
||||
Text("Hello")
|
||||
.boxBackground(color: .orange)
|
||||
.padding()
|
||||
}
|
||||
Reference in New Issue
Block a user