From fe6f3abbd54e56edd5fbe55511d16464676cc86d Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 21 Jun 2023 18:37:31 +0300 Subject: [PATCH] macOS widgets --- lib/ui/app/window_manager.dart | 9 ++++++++- macos/CompanyIntent/IntentHandler.swift | 20 ++++++++++++-------- macos/DashboardWidget/DashboardWidget.swift | 13 ++++++++++--- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/lib/ui/app/window_manager.dart b/lib/ui/app/window_manager.dart index 46d1ce04c..7fbe8ea62 100644 --- a/lib/ui/app/window_manager.dart +++ b/lib/ui/app/window_manager.dart @@ -95,18 +95,25 @@ class _WindowManagerState extends State with WindowListener { } class WidgetData { - WidgetData({this.url, this.companies}); + WidgetData({ + this.url, + this.companies, + this.companyId, + }); WidgetData.fromJson(Map json) : url = json['url'], + companyId = json['company_id'], companies = json['companies']; Map toJson() => { 'companies': companies, + 'company_id': companyId, 'url': url, }; final String url; + final String companyId; final Map companies; } diff --git a/macos/CompanyIntent/IntentHandler.swift b/macos/CompanyIntent/IntentHandler.swift index 7269c8d13..f0d9853be 100644 --- a/macos/CompanyIntent/IntentHandler.swift +++ b/macos/CompanyIntent/IntentHandler.swift @@ -4,38 +4,42 @@ class IntentHandler: INExtension, ConfigurationIntentHandling { private func loadWidgetData() -> WidgetData { let sharedDefaults = UserDefaults(suiteName: "group.com.invoiceninja.app") - var exampleData: WidgetData = WidgetData(url: "", companies: [:]) + var widgetData: WidgetData = WidgetData(url: "", companyId: "", companies: [:]) if let sharedDefaults = sharedDefaults { do { if let shared = sharedDefaults.string(forKey: "widget_data") { let decoder = JSONDecoder() - exampleData = try decoder.decode(WidgetData.self, from: shared.data(using: .utf8)!) + widgetData = try decoder.decode(WidgetData.self, from: shared.data(using: .utf8)!) } } catch { print(error) } } - return exampleData + return widgetData } func provideCompanyOptionsCollection(for intent: ConfigurationIntent) async throws -> INObjectCollection { - let exampleData = loadWidgetData() + let widgetData = loadWidgetData() - let companies = exampleData.companies.values.map { company in + let companies = widgetData.companies.values.map { company in Company(identifier: company.id, display: company.name) } return INObjectCollection(items: companies) } - //func defaultCompany(for intent: ConfigurationIntent) -> Company? {} + func defaultCompany(for intent: ConfigurationIntent) -> Company? { + let widgetData = loadWidgetData() + let company = widgetData.companies[widgetData.companyId]; + return Company(identifier: company!.id, display: company!.name) + } func provideCurrencyOptionsCollection(for intent: ConfigurationIntent) async throws -> INObjectCollection { - let exampleData = loadWidgetData() + let widgetData = loadWidgetData() - let company = exampleData.companies[(intent.company?.identifier!)!] + let company = widgetData.companies[(intent.company?.identifier!)!] let currencies = company!.currencies.values.map { currency in Currency(identifier: currency.id, display: currency.name) } diff --git a/macos/DashboardWidget/DashboardWidget.swift b/macos/DashboardWidget/DashboardWidget.swift index ba82bc448..e2cc05794 100644 --- a/macos/DashboardWidget/DashboardWidget.swift +++ b/macos/DashboardWidget/DashboardWidget.swift @@ -11,11 +11,11 @@ import Intents struct Provider: IntentTimelineProvider { func placeholder(in context: Context) -> SimpleEntry { - SimpleEntry(date: Date(), configuration: ConfigurationIntent(), widgetData: WidgetData(url: "url", companies: [:]), field: "Invoices", value: 0) + SimpleEntry(date: Date(), configuration: ConfigurationIntent(), widgetData: WidgetData(url: "url", companyId: "", companies: [:]), field: "Invoices", value: 0) } func getSnapshot(for configuration: ConfigurationIntent, in context: Context, completion: @escaping (SimpleEntry) -> ()) { - let entry = SimpleEntry(date: Date(), configuration: configuration, widgetData: WidgetData(url: "url", companies: [:]), field: "Invoices", value: 0) + let entry = SimpleEntry(date: Date(), configuration: configuration, widgetData: WidgetData(url: "url", companyId: "", companies: [:]), field: "Invoices", value: 0) completion(entry) } @@ -96,7 +96,14 @@ struct Provider: IntentTimelineProvider { struct WidgetData: Decodable, Hashable { let url: String + let companyId: String let companies: [String: WidgetCompany] + + enum CodingKeys: String, CodingKey { + case url + case companyId = "company_id" + case companies + } } struct WidgetCompany: Decodable, Hashable { @@ -185,7 +192,7 @@ struct DashboardWidget: Widget { struct DashboardWidget_Previews: PreviewProvider { static var previews: some View { - DashboardWidgetEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent(), widgetData: WidgetData(url: "url", companies: [:]), field: "Invoices", value: 0)) + DashboardWidgetEntryView(entry: SimpleEntry(date: Date(), configuration: ConfigurationIntent(), widgetData: WidgetData(url: "url", companyId: "", companies: [:]), field: "Invoices", value: 0)) .previewContext(WidgetPreviewContext(family: .systemSmall)) //.environment(\.sizeCategory, .extraLarge) //.environment(\.colorScheme, .dark)