macOS widgets

This commit is contained in:
Hillel Coren 2023-06-28 18:19:58 +03:00
parent 607ed2878b
commit b0b4345a49
3 changed files with 149 additions and 147 deletions

View File

@ -0,0 +1,144 @@
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/dashboard_model.dart';
import 'package:invoiceninja_flutter/data/models/static/currency_model.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/company/company_selectors.dart';
import 'package:invoiceninja_flutter/redux/company/company_state.dart';
import 'package:invoiceninja_flutter/redux/static/static_state.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/strings.dart';
class WidgetData {
WidgetData({
this.url,
this.companies,
this.companyId,
this.dateRanges,
});
WidgetData.fromState(AppState state, AppLocalization localization)
: url = formatApiUrl(state.authState.url),
companyId = state.account.defaultCompanyId,
companies = {
for (var userCompany in state.userCompanyStates
.where((state) => state.company.hasName))
userCompany.company.id: WidgetCompany.fromUserCompany(
userCompanyState: userCompany,
staticState: state.staticState,
)
},
dateRanges = Map.fromIterable(
DateRange.values.where((value) => value != DateRange.custom),
key: (dynamic item) => toSnakeCase('$item'),
value: (dynamic item) => localization.lookup('$item'));
WidgetData.fromJson(Map<String, dynamic> json)
: url = json['url'],
companyId = json['company_id'],
companies = json['companies'],
dateRanges = json['date_ranges'];
Map<String, dynamic> toJson() => <String, dynamic>{
'companies': companies,
'company_id': companyId,
'url': url,
'date_ranges': dateRanges,
};
final String url;
final String companyId;
final Map<String, WidgetCompany> companies;
final Map<String, String> dateRanges;
}
class WidgetCompany {
WidgetCompany(
{this.id,
this.name,
this.token,
this.accentColor,
this.firstMonthOfYear,
this.currencyId,
this.currencies});
WidgetCompany.fromUserCompany(
{UserCompanyState userCompanyState, StaticState staticState})
: id = userCompanyState.userCompany.company.id,
name = userCompanyState.userCompany.company.displayName,
token = userCompanyState.userCompany.token.token,
accentColor = userCompanyState.userCompany.settings.validatedAccentColor,
firstMonthOfYear =
parseInt(userCompanyState.userCompany.company.firstMonthOfYear),
currencyId = userCompanyState.userCompany.company.currencyId,
currencies = {
for (var currencyId in getCurrencyIds(
userCompanyState.userCompany.company,
userCompanyState.clientState.map,
userCompanyState.groupState.map,
).where((currencyId) => currencyId != kCurrencyAll))
currencyId: WidgetCurrency.fromCurrency(
staticState.currencyMap[currencyId],
)
};
WidgetCompany.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'],
token = json['token'],
accentColor = json['accent_color'],
currencies = json['currencies'],
currencyId = json['currency_id'],
firstMonthOfYear = json['first_month_of_year'];
Map<String, dynamic> toJson() => <String, dynamic>{
'id': id,
'name': name,
'token': token,
'accent_color': accentColor,
'currencies': currencies,
'currency_id': currencyId,
'first_month_of_year': firstMonthOfYear,
};
final String id;
final String name;
final String token;
final String accentColor;
final String currencyId;
final int firstMonthOfYear;
final Map<String, WidgetCurrency> currencies;
}
class WidgetCurrency {
WidgetCurrency({
this.id,
this.name,
this.code,
this.exchangeRate,
});
WidgetCurrency.fromCurrency(CurrencyEntity currency)
: id = currency.id,
name = currency.name,
code = currency.code,
exchangeRate = currency.exchangeRate;
WidgetCurrency.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'],
code = json['code'],
exchangeRate = json['exchange_rate'];
Map<String, dynamic> toJson() => <String, dynamic>{
'id': id,
'name': name,
'code': code,
'exchange_rate': exchangeRate,
};
final String id;
final String name;
final String code;
final double exchangeRate;
}

View File

@ -10,6 +10,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:flutter_styled_toast/flutter_styled_toast.dart'; import 'package:flutter_styled_toast/flutter_styled_toast.dart';
import 'package:invoiceninja_flutter/data/models/dashboard_model.dart'; import 'package:invoiceninja_flutter/data/models/dashboard_model.dart';
import 'package:invoiceninja_flutter/data/models/widget_model.dart';
import 'package:invoiceninja_flutter/redux/auth/auth_actions.dart'; import 'package:invoiceninja_flutter/redux/auth/auth_actions.dart';
import 'package:invoiceninja_flutter/redux/reports/reports_actions.dart'; import 'package:invoiceninja_flutter/redux/reports/reports_actions.dart';
import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart'; import 'package:invoiceninja_flutter/redux/settings/settings_actions.dart';
@ -1407,7 +1408,6 @@ void _showAbout(BuildContext context) async {
]); ]);
} else { } else {
final json = jsonEncode(WidgetData.fromState(state, localization)); final json = jsonEncode(WidgetData.fromState(state, localization));
print('## Set Widget Data: $json');
await UserDefaults.setString( await UserDefaults.setString(
'widget_data', json, 'group.com.invoiceninja.app'); 'widget_data', json, 'group.com.invoiceninja.app');
await WidgetKit.reloadAllTimelines(); await WidgetKit.reloadAllTimelines();

View File

@ -1,24 +1,11 @@
import 'dart:convert';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_redux/flutter_redux.dart';
import 'package:invoiceninja_flutter/constants.dart'; import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/company_model.dart';
import 'package:invoiceninja_flutter/data/models/dashboard_model.dart';
import 'package:invoiceninja_flutter/data/models/static/currency_model.dart';
import 'package:invoiceninja_flutter/main_app.dart'; import 'package:invoiceninja_flutter/main_app.dart';
import 'package:invoiceninja_flutter/redux/app/app_actions.dart'; import 'package:invoiceninja_flutter/redux/app/app_actions.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart'; import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/company/company_selectors.dart';
import 'package:invoiceninja_flutter/redux/company/company_state.dart';
import 'package:invoiceninja_flutter/redux/static/static_state.dart';
import 'package:invoiceninja_flutter/utils/formatting.dart';
import 'package:invoiceninja_flutter/utils/localization.dart';
import 'package:invoiceninja_flutter/utils/platforms.dart'; import 'package:invoiceninja_flutter/utils/platforms.dart';
import 'package:invoiceninja_flutter/utils/strings.dart';
import 'package:shared_preferences/shared_preferences.dart'; import 'package:shared_preferences/shared_preferences.dart';
import 'package:widget_kit_plugin/user_defaults/user_defaults.dart';
import 'package:widget_kit_plugin/widget_kit/widget_kit.dart';
import 'package:window_manager/window_manager.dart'; import 'package:window_manager/window_manager.dart';
class WindowManager extends StatefulWidget { class WindowManager extends StatefulWidget {
@ -95,140 +82,11 @@ class _WindowManagerState extends State<WindowManager> with WindowListener {
super.dispose(); super.dispose();
} }
void updateWidgetData() {
}
@override @override
Widget build(BuildContext context) => widget.child; Widget build(BuildContext context) => widget.child;
} }
class WidgetData {
WidgetData({
this.url,
this.companies,
this.companyId,
this.dateRanges,
});
WidgetData.fromState(AppState state, AppLocalization localization)
: url = formatApiUrl(state.authState.url),
companyId = state.account.defaultCompanyId,
companies = {
for (var userCompany in state.userCompanyStates
.where((state) => state.company.hasName))
userCompany.company.id: WidgetCompany.fromUserCompany(
userCompanyState: userCompany,
staticState: state.staticState,
)
},
dateRanges = Map.fromIterable(
DateRange.values.where((value) => value != DateRange.custom),
key: (dynamic item) => toSnakeCase('$item'),
value: (dynamic item) => localization.lookup('$item'));
WidgetData.fromJson(Map<String, dynamic> json)
: url = json['url'],
companyId = json['company_id'],
companies = json['companies'],
dateRanges = json['date_ranges'];
Map<String, dynamic> toJson() => <String, dynamic>{
'companies': companies,
'company_id': companyId,
'url': url,
'date_ranges': dateRanges,
};
final String url;
final String companyId;
final Map<String, WidgetCompany> companies;
final Map<String, String> dateRanges;
}
class WidgetCompany {
WidgetCompany(
{this.id,
this.name,
this.token,
this.accentColor,
this.firstMonthOfYear,
this.currencyId,
this.currencies});
WidgetCompany.fromUserCompany(
{UserCompanyState userCompanyState, StaticState staticState})
: id = userCompanyState.userCompany.company.id,
name = userCompanyState.userCompany.company.displayName,
token = userCompanyState.userCompany.token.token,
accentColor = userCompanyState.userCompany.settings.validatedAccentColor,
firstMonthOfYear =
parseInt(userCompanyState.userCompany.company.firstMonthOfYear),
currencyId = userCompanyState.userCompany.company.currencyId,
currencies = {
for (var currencyId in getCurrencyIds(
userCompanyState.userCompany.company,
userCompanyState.clientState.map,
userCompanyState.groupState.map,
).where((currencyId) => currencyId != kCurrencyAll))
currencyId: WidgetCurrency.fromCurrency(
staticState.currencyMap[currencyId],
)
};
WidgetCompany.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'],
token = json['token'],
accentColor = json['accent_color'],
currencies = json['currencies'],
currencyId = json['currency_id'],
firstMonthOfYear = json['first_month_of_year'];
Map<String, dynamic> toJson() => <String, dynamic>{
'id': id,
'name': name,
'token': token,
'accent_color': accentColor,
'currencies': currencies,
'currency_id': currencyId,
'first_month_of_year': firstMonthOfYear,
};
final String id;
final String name;
final String token;
final String accentColor;
final String currencyId;
final int firstMonthOfYear;
final Map<String, WidgetCurrency> currencies;
}
class WidgetCurrency {
WidgetCurrency({
this.id,
this.name,
this.code,
this.exchangeRate,
});
WidgetCurrency.fromCurrency(CurrencyEntity currency)
: id = currency.id,
name = currency.name,
code = currency.code,
exchangeRate = currency.exchangeRate;
WidgetCurrency.fromJson(Map<String, dynamic> json)
: id = json['id'],
name = json['name'],
code = json['code'],
exchangeRate = json['exchange_rate'];
Map<String, dynamic> toJson() => <String, dynamic>{
'id': id,
'name': name,
'code': code,
'exchange_rate': exchangeRate,
};
final String id;
final String name;
final String code;
final double exchangeRate;
}