175 lines
7.2 KiB
Dart
175 lines
7.2 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/entities.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(true || isTesting || kReleaseMode
|
|
? []
|
|
: [
|
|
LoggingMiddleware<dynamic>.printer(
|
|
formatter: LoggingMiddleware.multiLineFormatter,
|
|
),
|
|
]));
|
|
|
|
if (!kReleaseMode) {
|
|
runApp(InvoiceNinjaApp(store: store));
|
|
} else {
|
|
await SentryFlutter.init(
|
|
(options) {
|
|
options.dsn = Config.SENTRY_DNS;
|
|
options.release =
|
|
String.fromEnvironment('SENTRY_RELEASE', defaultValue: 'Unknown');
|
|
options.dist = 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 browserRoute;
|
|
if (kIsWeb && prefState.isDesktop) {
|
|
browserRoute = WebUtils.browserRoute;
|
|
if (browserRoute.isNotEmpty && browserRoute.length > 4) {
|
|
if (browserRoute == '/kanban') {
|
|
browserRoute = '/task';
|
|
prefState = prefState.rebuild((b) => b
|
|
..showKanban = true
|
|
..useSidebarEditor[EntityType.task] = true);
|
|
}
|
|
} else {
|
|
browserRoute = null;
|
|
}
|
|
}
|
|
|
|
bool reportErrors = false;
|
|
if (kIsWeb) {
|
|
reportErrors = WebUtils.getHtmlValue('report-errors') == '1';
|
|
if (reportErrors) {
|
|
print('Error reporting is enabled');
|
|
}
|
|
}
|
|
|
|
return AppState(
|
|
prefState: prefState,
|
|
url: Config.DEMO_MODE ? '' : url,
|
|
reportErrors: reportErrors,
|
|
currentRoute: browserRoute,
|
|
);
|
|
}
|