Skip to content

Commit

Permalink
feat: URL handler to allow one-click copy-to-device / install (#127)
Browse files Browse the repository at this point in the history
This change adds a handler for `x-reconnect://install/` URLs. They
accept a `path` parameter of a file URL (e.g.,
`file:///Users/jbmorley/installer.sis`) and will copy the specified file
to the connected Psion. Longer-term this should kick-off a managed
install in Reconnect. Nearer-term, it could perhaps launch the Installer
on the Psion on transfer completion.
  • Loading branch information
jbmorley authored Jul 19, 2024
1 parent fa08a1f commit ea8337b
Show file tree
Hide file tree
Showing 5 changed files with 32 additions and 9 deletions.
1 change: 1 addition & 0 deletions Reconnect/Extensions/URL.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ extension URL {

static let about = URL(string: "x-reconnect://about")!
static let browser = URL(string: "x-reconnect://browser")!
static let install = URL(string: "x-reconnect://install/")!

func appendingPathComponents(_ pathComponents: [String]) -> URL {
return pathComponents.reduce(self) { url, pathComponent in
Expand Down
7 changes: 4 additions & 3 deletions Reconnect/Model/BrowserModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,10 @@ class BrowserModel {
return navigationStack.previousItems.reversed()
}

var transfersModel = TransfersModel()

let fileServer = FileServer()

let transfersModel: TransfersModel

var drives: [FileServer.DriveInfo] = []
var files: [FileServer.DirectoryEntry] = []

Expand All @@ -68,7 +68,8 @@ class BrowserModel {

private var navigationStack = NavigationStack()

init() {
init(transfersModel: TransfersModel) {
self.transfersModel = transfersModel
}

func start() async {
Expand Down
20 changes: 17 additions & 3 deletions Reconnect/ReconnectApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,13 @@ import Diligence
import Interact
import Sparkle

@main
@main @MainActor
struct ReconnectApp: App {

static let title = "Reconnect Support (\(Bundle.main.extendedVersion ?? "Unknown Version"))"

@State var server = Server()
@State var transfersModel = TransfersModel()
@State var applicationModel: ApplicationModel

init() {
Expand All @@ -48,10 +49,23 @@ struct ReconnectApp: App {
}

WindowGroup("My Psion") {
ContentView(applicationModel: applicationModel)
ContentView(applicationModel: applicationModel, transfersModel: transfersModel)
.onOpenURL { url in
print(url)
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
let path = components.queryItems?.first(where: { $0.name == "path" })?.value,
let installerURL = URL(string: path),
installerURL.scheme == "file"
else {
return
}
let filename = installerURL.lastPathComponent
transfersModel.upload(from: installerURL, to: "C:".appendingWindowsPathComponent(filename))
}
.handlesExternalEvents(preferring: [.install, .browser], allowing: [])
}
.environment(applicationModel)
.handlesExternalEvents(matching: [.browser])
.handlesExternalEvents(matching: [.browser, .install])

About(repository: "inseven/reconnect", copyright: "Copyright © 2024 Jason Morley") {
Action("GitHub", url: URL(string: "https://github.com/inseven/reconnect")!)
Expand Down
5 changes: 3 additions & 2 deletions Reconnect/Views/BrowserView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,10 @@ struct BrowserView: View {

@Environment(ApplicationModel.self) var applicationModel

@State private var browserModel = BrowserModel()
@State private var browserModel: BrowserModel

init() {
init(transfersModel: TransfersModel) {
_browserModel = State(initialValue: BrowserModel(transfersModel: transfersModel))
}

var body: some View {
Expand Down
8 changes: 7 additions & 1 deletion Reconnect/Views/ContentView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,16 @@ import SwiftUI
struct ContentView: View {

var applicationModel: ApplicationModel
var transfersModel: TransfersModel

init(applicationModel: ApplicationModel, transfersModel: TransfersModel) {
self.applicationModel = applicationModel
self.transfersModel = transfersModel
}

var body: some View {
VStack {
BrowserView()
BrowserView(transfersModel: transfersModel)
}
.showsDockIcon()
}
Expand Down

0 comments on commit ea8337b

Please sign in to comment.