invoice/lib/main.dart

169 lines
6.9 KiB
Dart

import 'dart:async';
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:invoiceninja_flutter/.env.dart';
import 'package:invoiceninja_flutter/constants.dart';
import 'package:invoiceninja_flutter/data/models/serializers.dart';
import 'package:invoiceninja_flutter/main_app.dart';
import 'package:invoiceninja_flutter/redux/app/app_middleware.dart';
import 'package:invoiceninja_flutter/redux/app/app_reducer.dart';
import 'package:invoiceninja_flutter/redux/app/app_state.dart';
import 'package:invoiceninja_flutter/redux/auth/auth_middleware.dart';
import 'package:invoiceninja_flutter/redux/client/client_middleware.dart';
import 'package:invoiceninja_flutter/redux/company_gateway/company_gateway_middleware.dart';
import 'package:invoiceninja_flutter/redux/credit/credit_middleware.dart';
import 'package:invoiceninja_flutter/redux/dashboard/dashboard_middleware.dart';
import 'package:invoiceninja_flutter/redux/design/design_middleware.dart';
import 'package:invoiceninja_flutter/redux/document/document_middleware.dart';
import 'package:invoiceninja_flutter/redux/expense/expense_middleware.dart';
import 'package:invoiceninja_flutter/redux/group/group_middleware.dart';
import 'package:invoiceninja_flutter/redux/invoice/invoice_middleware.dart';
import 'package:invoiceninja_flutter/redux/payment/payment_middleware.dart';
import 'package:invoiceninja_flutter/redux/product/product_middleware.dart';
import 'package:invoiceninja_flutter/redux/project/project_middleware.dart';
import 'package:invoiceninja_flutter/redux/quote/quote_middleware.dart';
import 'package:invoiceninja_flutter/redux/reports/reports_middleware.dart';
import 'package:invoiceninja_flutter/redux/settings/settings_middleware.dart';
import 'package:invoiceninja_flutter/redux/task/task_middleware.dart';
import 'package:invoiceninja_flutter/redux/tax_rate/tax_rate_middleware.dart';
import 'package:invoiceninja_flutter/redux/ui/pref_state.dart';
import 'package:invoiceninja_flutter/redux/user/user_middleware.dart';
import 'package:invoiceninja_flutter/redux/vendor/vendor_middleware.dart';
import 'package:redux/redux.dart';
import 'package:redux_logging/redux_logging.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:invoiceninja_flutter/utils/web_stub.dart'
if (dart.library.html) 'package:invoiceninja_flutter/utils/web.dart';
// STARTER: import - do not remove comment
import 'package:invoiceninja_flutter/redux/subscription/subscription_middleware.dart';
import 'package:invoiceninja_flutter/redux/task_status/task_status_middleware.dart';
import 'package:invoiceninja_flutter/redux/expense_category/expense_category_middleware.dart';
import 'package:invoiceninja_flutter/redux/recurring_invoice/recurring_invoice_middleware.dart';
import 'package:invoiceninja_flutter/redux/webhook/webhook_middleware.dart';
import 'package:invoiceninja_flutter/redux/token/token_middleware.dart';
import 'package:invoiceninja_flutter/redux/payment_term/payment_term_middleware.dart';
void main({bool isTesting = false}) async {
WidgetsFlutterBinding.ensureInitialized();
final store = Store<AppState>(appReducer,
initialState: await _initialState(isTesting),
middleware: []
..addAll(createStoreAuthMiddleware())
..addAll(createStoreDocumentsMiddleware())
..addAll(createStoreDashboardMiddleware())
..addAll(createStoreProductsMiddleware())
..addAll(createStoreClientsMiddleware())
..addAll(createStoreInvoicesMiddleware())
..addAll(createStoreExpensesMiddleware())
..addAll(createStoreVendorsMiddleware())
..addAll(createStoreTasksMiddleware())
..addAll(createStoreProjectsMiddleware())
..addAll(createStorePaymentsMiddleware())
..addAll(createStoreQuotesMiddleware())
..addAll(createStoreSettingsMiddleware())
..addAll(createStoreReportsMiddleware())
// STARTER: middleware - do not remove comment
..addAll(createStoreSubscriptionsMiddleware())
..addAll(createStoreTaskStatusesMiddleware())
..addAll(createStoreExpenseCategoriesMiddleware())
..addAll(createStoreRecurringInvoicesMiddleware())
..addAll(createStoreWebhooksMiddleware())
..addAll(createStoreTokensMiddleware())
..addAll(createStorePaymentTermsMiddleware())
..addAll(createStoreDesignsMiddleware())
..addAll(createStoreCreditsMiddleware())
..addAll(createStoreUsersMiddleware())
..addAll(createStoreTaxRatesMiddleware())
..addAll(createStoreCompanyGatewaysMiddleware())
..addAll(createStoreGroupsMiddleware())
..addAll(createStorePersistenceMiddleware())
..addAll(isTesting || kReleaseMode
? []
: [
LoggingMiddleware<dynamic>.printer(
formatter: LoggingMiddleware.multiLineFormatter,
),
]));
if (kIsWeb || !kReleaseMode) {
runApp(InvoiceNinjaApp(store: store));
} else {
await SentryFlutter.init(
(options) {
options.dsn = Config.SENTRY_DNS;
options.release = kClientVersion;
options.beforeSend = (SentryEvent event, {dynamic hint}) {
final state = store.state;
final account = state.account;
final reportErrors = account?.reportErrors ?? false;
if (!reportErrors) {
return null;
}
event = event.copyWith(
environment: '${store.state.environment}'.split('.').last,
extra: <String, dynamic>{
'server_version': account?.currentVersion ?? 'Unknown',
'route': state.uiState.currentRoute,
},
);
return event;
};
},
appRunner: () => runApp(InvoiceNinjaApp(store: store)),
);
}
}
Future<AppState> _initialState(bool isTesting) async {
final prefs = await SharedPreferences.getInstance();
final prefString = prefs?.getString(kSharedPrefs);
final url = WebUtils.browserUrl ?? prefs.getString(kSharedPrefUrl) ?? '';
//url = kAppProductionUrl;
//url = kAppDemoUrl;
var prefState = PrefState();
if (prefString != null) {
try {
prefState = serializers.deserializeWith(
PrefState.serializer, json.decode(prefString));
} catch (e) {
print('Failed to load prefs: $e');
}
}
String currentRoute;
/*
if (kIsWeb && prefState.isDesktop) {
currentRoute = html.window.location.hash.replaceFirst('#', '');
if (currentRoute.isEmpty || currentRoute == '/') {
currentRoute = DashboardScreenBuilder.route;
}
}
*/
bool reportErrors = false;
if (kIsWeb) {
reportErrors = WebUtils.getHtmlValue('report-errors') == '1';
if (reportErrors) {
print('Error reporting is enabled');
}
}
return AppState(
prefState: prefState,
currentRoute: currentRoute,
url: Config.DEMO_MODE ? '' : url,
reportErrors: reportErrors,
);
}