Export file option for iOS

This commit is contained in:
Balazs Perlaki-Horvath 2024-04-14 10:03:45 +02:00 committed by Kelson
parent 57bb98332d
commit db47f8cda8
2 changed files with 76 additions and 10 deletions

View File

@ -41,6 +41,7 @@ struct Kiwix: App {
.environmentObject(navigation)
.modifier(AlertHandler())
.modifier(OpenFileHandler())
.modifier(SaveContentHandler())
.onChange(of: scenePhase) { newValue in
guard newValue == .inactive else { return }
try? Database.viewContext.save()

View File

@ -19,6 +19,9 @@ import SwiftUI
struct SaveContentHandler: ViewModifier {
private let saveContentToFile = NotificationCenter.default.publisher(for: .saveContent)
#if os(iOS)
@State private var urlAndContent: (URL, URLContent)? = nil
#endif
func body(content: Content) -> some View {
content.onReceive(saveContentToFile) { notification in
@ -27,18 +30,80 @@ struct SaveContentHandler: ViewModifier {
return
}
#if os(macOS)
let savePanel = NSSavePanel()
savePanel.canCreateDirectories = true
savePanel.nameFieldStringValue = url.lastPathComponent
savePanel.begin { (response: NSApplication.ModalResponse) in
if case .OK = response,
let urlContent = ZimFileService.shared.getURLContent(url: url),
let destinationURL = savePanel.url {
try? urlContent.data.write(to: destinationURL)
savePanel.close()
}
savePanelFor(url: url)
#else
if let urlContent = ZimFileService.shared.getURLContent(url: url) {
urlAndContent = (url, urlContent)
} else {
urlAndContent = nil
}
#endif
}
#if os(iOS)
.sheet(
isPresented: Binding<Bool>.constant($urlAndContent.wrappedValue != nil),
onDismiss: {
if let (url, _) = urlAndContent,
let tempURL = url.tempFileURL() {
try? FileManager.default.removeItem(at: tempURL)
}
urlAndContent = nil
}, content: {
if let (url, urlContent) = urlAndContent {
if let tempURL = url.tempFileURL(),
(try? urlContent.data.write(to: tempURL)) != nil {
ActivityViewController(activityItems: [tempURL])
}
}
}
)
#endif
}
#if os(macOS)
private func savePanelFor(url: URL) {
let savePanel = NSSavePanel()
savePanel.canCreateDirectories = true
savePanel.nameFieldStringValue = url.lastPathComponent
savePanel.begin { (response: NSApplication.ModalResponse) in
if case .OK = response,
let urlContent = ZimFileService.shared.getURLContent(url: url),
let destinationURL = savePanel.url {
try? urlContent.data.write(to: destinationURL)
savePanel.close()
}
}
}
#endif
}
#if os(iOS)
struct ActivityViewController: UIViewControllerRepresentable {
var activityItems: [Any]
@Environment(\.dismiss) var dismissAction
func makeUIViewController(context: UIViewControllerRepresentableContext<ActivityViewController>) -> UIActivityViewController {
let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
controller.modalPresentationStyle = .pageSheet
controller.completionWithItemsHandler = { (activityType, completed, returnedItems, error) in
self.dismissAction()
}
return controller
}
func updateUIViewController(_ uiViewController: UIActivityViewController, context: Context) {
}
}
#endif
extension URL {
fileprivate func tempFileURL() -> URL? {
let directory = FileManager.default.temporaryDirectory
if #available(macOS 13.0, iOS 16.0, *) {
return directory.appending(path: lastPathComponent)
} else {
return directory.appendingPathComponent(lastPathComponent)
}
}
}