macOS widgets

This commit is contained in:
Hillel Coren 2023-06-21 18:37:31 +03:00
parent 87bb99979e
commit fe6f3abbd5
3 changed files with 30 additions and 12 deletions

View File

@ -95,18 +95,25 @@ class _WindowManagerState extends State<WindowManager> with WindowListener {
}
class WidgetData {
WidgetData({this.url, this.companies});
WidgetData({
this.url,
this.companies,
this.companyId,
});
WidgetData.fromJson(Map<String, dynamic> json)
: url = json['url'],
companyId = json['company_id'],
companies = json['companies'];
Map<String, dynamic> toJson() => <String, dynamic>{
'companies': companies,
'company_id': companyId,
'url': url,
};
final String url;
final String companyId;
final Map<String, WidgetCompany> companies;
}

View File

@ -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<Company> {
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<Currency> {
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)
}

View File

@ -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)