paddel setup new verifier
This commit is contained in:
@@ -22,8 +22,14 @@
|
|||||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||||
|
|
||||||
<key>RsyncStudioLicenseAPIBaseURL</key>
|
<key>RsyncStudioLicenseAPIBaseURL</key>
|
||||||
<string>https://rsync.vm/api/</string>
|
<string>https://rsync.stage.absdev.net/api/</string>
|
||||||
<key>RsyncStudioLicensePublicKey</key>
|
<key>RsyncStudioLicensePublicKey</key>
|
||||||
<string>8/rlCrS5mVEi4rGNXkw0Z22XkRpSH5+jPnD4f0GyV2k=</string>
|
<string>/QWCMp3he0bUM0VIYYmH9y1/BCncpUo4h/J8sM8gPKg=</string>
|
||||||
|
<key>RsyncStudioPurchaseURL</key>
|
||||||
|
<string>https://rsync.stage.absdev.net/buy</string>
|
||||||
|
<key>RsyncStudioPortalURL</key>
|
||||||
|
<string>https://rsync.stage.absdev.net/portal</string>
|
||||||
|
<key>RsyncStudioSupportURL</key>
|
||||||
|
<string>https://rsync.stage.absdev.net/support</string>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ final class LicensingManager: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static let trialLengthDays = 30
|
static let trialLengthDays = 7
|
||||||
|
|
||||||
@Published private(set) var state: State = .trial(daysRemaining: trialLengthDays, expiresAt: Date().addingTimeInterval(TimeInterval(trialLengthDays * 86_400)))
|
@Published private(set) var state: State = .trial(daysRemaining: trialLengthDays, expiresAt: Date().addingTimeInterval(TimeInterval(trialLengthDays * 86_400)))
|
||||||
@Published private(set) var installationID = ""
|
@Published private(set) var installationID = ""
|
||||||
@@ -100,7 +100,7 @@ final class LicensingManager: ObservableObject {
|
|||||||
case .trial(let days, let expiresAt):
|
case .trial(let days, let expiresAt):
|
||||||
return "\(days) day\(days == 1 ? "" : "s") remaining · ends \(expiresAt.formatted(date: .abbreviated, time: .omitted))"
|
return "\(days) day\(days == 1 ? "" : "s") remaining · ends \(expiresAt.formatted(date: .abbreviated, time: .omitted))"
|
||||||
case .expired:
|
case .expired:
|
||||||
return "The 30-day evaluation period has ended. Activate a licence to continue using sync jobs."
|
return "The 7-day evaluation period has ended. Activate a licence to continue using sync jobs."
|
||||||
case .invalid(let message):
|
case .invalid(let message):
|
||||||
return message
|
return message
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import AppKit
|
||||||
|
|
||||||
struct LicenseRequiredView: View {
|
struct LicenseRequiredView: View {
|
||||||
@EnvironmentObject private var licensing: LicensingManager
|
@EnvironmentObject private var licensing: LicensingManager
|
||||||
@@ -19,9 +20,13 @@ struct LicenseRequiredView: View {
|
|||||||
.frame(maxWidth: 520)
|
.frame(maxWidth: 520)
|
||||||
}
|
}
|
||||||
|
|
||||||
Button("Open Licence Settings") { openSettings() }
|
HStack(spacing: 12) {
|
||||||
.buttonStyle(.borderedProminent)
|
Button("Buy Rsync Studio…") { openPurchasePage() }
|
||||||
.controlSize(.large)
|
.buttonStyle(.borderedProminent)
|
||||||
|
.controlSize(.large)
|
||||||
|
Button("Open Licence Settings") { openSettings() }
|
||||||
|
.controlSize(.large)
|
||||||
|
}
|
||||||
|
|
||||||
Text("Your jobs and history remain on this Mac. Rsync Studio does not delete local data when a trial expires or a licence is removed.")
|
Text("Your jobs and history remain on this Mac. Rsync Studio does not delete local data when a trial expires or a licence is removed.")
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
@@ -33,4 +38,11 @@ struct LicenseRequiredView: View {
|
|||||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
.background(Color(nsColor: .windowBackgroundColor))
|
.background(Color(nsColor: .windowBackgroundColor))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func openPurchasePage() {
|
||||||
|
guard let raw = Bundle.main.object(forInfoDictionaryKey: "RsyncStudioPurchaseURL") as? String,
|
||||||
|
let url = URL(string: raw),
|
||||||
|
url.scheme?.lowercased() == "https" else { return }
|
||||||
|
NSWorkspace.shared.open(url)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
import AppKit
|
||||||
|
|
||||||
struct LicenseView: View {
|
struct LicenseView: View {
|
||||||
@EnvironmentObject private var licensing: LicensingManager
|
@EnvironmentObject private var licensing: LicensingManager
|
||||||
@@ -60,7 +61,8 @@ struct LicenseView: View {
|
|||||||
showingTokenEntry.toggle()
|
showingTokenEntry.toggle()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Text("Online activation will be enabled when the licensing service URL is configured. Signed offline licence tokens can be installed without contacting a server.")
|
Button("Buy Rsync Studio…") { openPurchasePage() }
|
||||||
|
Text("Buy Personal or Professional online, then enter the licence key delivered to your email. Signed offline licence tokens can also be installed without contacting the activation server.")
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
}
|
}
|
||||||
@@ -130,4 +132,14 @@ struct LicenseView: View {
|
|||||||
showingTokenEntry = false
|
showingTokenEntry = false
|
||||||
} catch { errorMessage = error.localizedDescription }
|
} catch { errorMessage = error.localizedDescription }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func openPurchasePage() {
|
||||||
|
guard let raw = Bundle.main.object(forInfoDictionaryKey: "RsyncStudioPurchaseURL") as? String,
|
||||||
|
let url = URL(string: raw),
|
||||||
|
url.scheme?.lowercased() == "https" else {
|
||||||
|
errorMessage = "The Rsync Studio purchase page is not configured in this build."
|
||||||
|
return
|
||||||
|
}
|
||||||
|
NSWorkspace.shared.open(url)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user