Skip to content

Commit

Permalink
Merge pull request #742 from nextcloud/refactor/types
Browse files Browse the repository at this point in the history
Refactor/types
  • Loading branch information
Leptopoda authored Sep 8, 2023
2 parents 4ba933d + 2dda9e6 commit abbb3d7
Show file tree
Hide file tree
Showing 82 changed files with 295 additions and 185 deletions.
10 changes: 5 additions & 5 deletions packages/app/integration_test/screenshot_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import 'package:neon/settings.dart';
import 'package:neon_files/widgets/actions.dart';
import 'package:shared_preferences/shared_preferences.dart';

Future runTestApp(
Future<void> runTestApp(
final WidgetTester tester,
final IntegrationTestWidgetsFlutterBinding binding, {
final Account? account,
Expand All @@ -30,18 +30,18 @@ Future runTestApp(
await tester.pumpAndSettle();
}

Future openDrawer(final WidgetTester tester) async {
Future<void> openDrawer(final WidgetTester tester) async {
await tester.tap(find.byTooltip('Open navigation menu'));
await tester.pumpAndSettle();
}

Future switchPage(final WidgetTester tester, final String name) async {
Future<void> switchPage(final WidgetTester tester, final String name) async {
await openDrawer(tester);
await tester.tap(find.text(name).last);
await tester.pumpAndSettle();
}

Future prepareScreenshot(final WidgetTester tester, final IntegrationTestWidgetsFlutterBinding binding) async {
Future<void> prepareScreenshot(final WidgetTester tester, final IntegrationTestWidgetsFlutterBinding binding) async {
await binding.convertFlutterSurfaceToImage();
await tester.pumpAndSettle();
}
Expand All @@ -63,7 +63,7 @@ Future<Account> getAccount(final String username) async {
);
}

Future main() async {
Future<void> main() async {
// The screenshots are pretty annoying on Android. See https://github.com/flutter/flutter/issues/92381

assert(Platform.isAndroid, 'Screenshots need to be taken on Android');
Expand Down
2 changes: 1 addition & 1 deletion packages/app/lib/main.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import 'package:app/apps.dart';
import 'package:app/branding.dart';
import 'package:neon/neon.dart';

Future main() async {
Future<void> main() async {
await runNeon(
appImplementations: appImplementations,
theme: neonTheme,
Expand Down
2 changes: 1 addition & 1 deletion packages/dynamite/dynamite/lib/src/builder/client.dart
Original file line number Diff line number Diff line change
Expand Up @@ -604,7 +604,7 @@ final _response = await ${isRootClient ? 'this' : '_rootClient'}.doRequest(
b.returns = refer('Future<$dataType>');
code.write('return $dataValue;');
} else {
b.returns = refer('Future');
b.returns = refer('Future<void>');
code.write('return;');
}

Expand Down
5 changes: 3 additions & 2 deletions packages/neon/neon/lib/blocs.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
export 'package:neon/src/bloc/bloc.dart';
export 'package:neon/src/bloc/result.dart';
export 'package:neon/src/bloc/result_builder.dart';
export 'package:neon/src/blocs/accounts.dart'; // TODO: Remove access to the AccountsBloc. Apps should not need to access this
export 'package:neon/src/blocs/timer.dart';
// TODO: Remove access to the AccountsBloc. Apps should not need to access this
export 'package:neon/src/blocs/accounts.dart' show AccountsBloc;
export 'package:neon/src/blocs/timer.dart' hide TimerBlocEvents, TimerBlocStates;
2 changes: 1 addition & 1 deletion packages/neon/neon/lib/neon.dart
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import 'package:neon/src/utils/user_agent.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:provider/provider.dart';

Future runNeon({
Future<void> runNeon({
required final Iterable<AppImplementation> appImplementations,
required final NeonTheme theme,
@visibleForTesting final WidgetsBinding? bindingOverride,
Expand Down
14 changes: 8 additions & 6 deletions packages/neon/neon/lib/src/app.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import 'dart:io';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:flutter_native_splash/flutter_native_splash.dart';
import 'package:meta/meta.dart';
import 'package:neon/l10n/localizations.dart';
import 'package:neon/src/bloc/result_builder.dart';
import 'package:neon/src/blocs/accounts.dart';
Expand All @@ -27,6 +28,7 @@ import 'package:quick_actions/quick_actions.dart';
import 'package:tray_manager/tray_manager.dart' as tray;
import 'package:window_manager/window_manager.dart';

@internal
class NeonApp extends StatefulWidget {
const NeonApp({
required this.neonTheme,
Expand Down Expand Up @@ -196,7 +198,7 @@ class _NeonAppState extends State<NeonApp> with WidgetsBindingObserver, tray.Tra
}

@override
Future onWindowClose() async {
Future<void> onWindowClose() async {
if (_globalOptions.startupMinimizeInsteadOfExit.value) {
await _saveAndMinimizeWindow();
} else {
Expand All @@ -205,11 +207,11 @@ class _NeonAppState extends State<NeonApp> with WidgetsBindingObserver, tray.Tra
}

@override
Future onWindowMinimize() async {
Future<void> onWindowMinimize() async {
await _saveAndMinimizeWindow();
}

Future _handleShortcut(final String shortcutType) async {
Future<void> _handleShortcut(final String shortcutType) async {
if (shortcutType == 'show_hide') {
if (NeonPlatform.instance.canUseWindowManager) {
if (await windowManager.isVisible()) {
Expand All @@ -231,13 +233,13 @@ class _NeonAppState extends State<NeonApp> with WidgetsBindingObserver, tray.Tra
}
}

Future _openAppFromExternal(final Account account, final String id) async {
Future<void> _openAppFromExternal(final Account account, final String id) async {
await _accountsBloc.getAppsBlocFor(account).setActiveApp(id);
_navigatorKey.currentState!.popUntil((final route) => route.settings.name == 'home');
await _showAndRestoreWindow();
}

Future _saveAndMinimizeWindow() async {
Future<void> _saveAndMinimizeWindow() async {
_lastBounds = await windowManager.getBounds();
if (_globalOptions.systemTrayEnabled.value && _globalOptions.systemTrayHideToTrayWhenMinimized.value) {
await windowManager.hide();
Expand All @@ -246,7 +248,7 @@ class _NeonAppState extends State<NeonApp> with WidgetsBindingObserver, tray.Tra
}
}

Future _showAndRestoreWindow() async {
Future<void> _showAndRestoreWindow() async {
if (!NeonPlatform.instance.canUseWindowManager) {
return;
}
Expand Down
6 changes: 3 additions & 3 deletions packages/neon/neon/lib/src/bloc/bloc.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,17 @@ abstract class InteractiveBloc extends Bloc {
final _errorsStreamController = StreamController<Object>();
late Stream<Object> errors = _errorsStreamController.stream.asBroadcastStream();

Future refresh();
Future<void> refresh();

void addError(final Object error) {
_errorsStreamController.add(error);
}

// ignore: avoid_void_async
void wrapAction(
final Future Function() call, {
final AsyncCallback call, {
final bool disableTimeout = false,
final Future Function()? refresh,
final AsyncCallback? refresh,
}) async {
try {
if (disableTimeout) {
Expand Down
3 changes: 3 additions & 0 deletions packages/neon/neon/lib/src/blocs/accounts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'dart:async';
import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:meta/meta.dart';
import 'package:neon/src/bloc/bloc.dart';
import 'package:neon/src/blocs/apps.dart';
import 'package:neon/src/blocs/capabilities.dart';
Expand All @@ -17,6 +18,7 @@ import 'package:rxdart/rxdart.dart';

const _keyAccounts = 'accounts';

@internal
abstract interface class AccountsBlocEvents {
/// Logs in the given [account].
///
Expand All @@ -40,6 +42,7 @@ abstract interface class AccountsBlocEvents {
void setActiveAccount(final Account account);
}

@internal
abstract interface class AccountsBlocStates {
/// All registered accounts.
///
Expand Down
16 changes: 9 additions & 7 deletions packages/neon/neon/lib/src/blocs/apps.dart
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,17 @@ import 'package:nextcloud/nextcloud.dart';
import 'package:provider/provider.dart';
import 'package:rxdart/rxdart.dart';

abstract class AppsBlocEvents {
@internal
abstract interface class AppsBlocEvents {
/// Sets the active app using the [appID].
///
/// If the app is already the active app nothing will happen.
/// When using [skipAlreadySet] nothing will be done if there already is an active app.
void setActiveApp(final String appID, {final bool skipAlreadySet = false});
}

abstract class AppsBlocStates {
@internal
abstract interface class AppsBlocStates {
BehaviorSubject<Result<List<CoreNavigationEntry>>> get apps;

BehaviorSubject<Result<Iterable<AppImplementation>>> get appImplementations;
Expand All @@ -33,7 +35,7 @@ abstract class AppsBlocStates {

BehaviorSubject<AppImplementation> get activeApp;

BehaviorSubject get openNotifications;
BehaviorSubject<void> get openNotifications;

BehaviorSubject<Iterable<(String, Object?)>?> get appVersions;
}
Expand Down Expand Up @@ -182,13 +184,13 @@ class AppsBloc extends InteractiveBloc implements AppsBlocEvents, AppsBlocStates
BehaviorSubject<Result<NotificationsAppInterface?>>();

@override
BehaviorSubject openNotifications = BehaviorSubject();
BehaviorSubject<void> openNotifications = BehaviorSubject();

@override
BehaviorSubject<List<(String, Object?)>?> appVersions = BehaviorSubject();

@override
Future refresh() async {
Future<void> refresh() async {
await RequestManager.instance
.wrapNextcloud<List<CoreNavigationEntry>, CoreNavigationGetAppsNavigationResponseApplicationJson>(
_account.id,
Expand All @@ -200,7 +202,7 @@ class AppsBloc extends InteractiveBloc implements AppsBlocEvents, AppsBlocStates
}

@override
Future setActiveApp(final String appID, {final bool skipAlreadySet = false}) async {
Future<void> setActiveApp(final String appID, {final bool skipAlreadySet = false}) async {
if (appID == AppIDs.notifications) {
openNotifications.add(null);
return;
Expand All @@ -220,6 +222,6 @@ class AppsBloc extends InteractiveBloc implements AppsBlocEvents, AppsBlocStates
T getAppBloc<T extends Bloc>(final AppImplementation<T, dynamic> appImplementation) =>
appImplementation.getBloc(_account);

List<Provider> get appBlocProviders =>
List<Provider<Bloc>> get appBlocProviders =>
_allAppImplementations.map((final appImplementation) => appImplementation.blocProvider).toList();
}
8 changes: 5 additions & 3 deletions packages/neon/neon/lib/src/blocs/capabilities.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@ import 'package:neon/src/utils/request_manager.dart';
import 'package:nextcloud/nextcloud.dart';
import 'package:rxdart/rxdart.dart';

abstract class CapabilitiesBlocEvents {}
@internal
abstract interface class CapabilitiesBlocEvents {}

abstract class CapabilitiesBlocStates {
@internal
abstract interface class CapabilitiesBlocStates {
BehaviorSubject<Result<CoreOcsGetCapabilitiesResponseApplicationJson_Ocs_Data>> get capabilities;
}

Expand All @@ -35,7 +37,7 @@ class CapabilitiesBloc extends InteractiveBloc implements CapabilitiesBlocEvents
BehaviorSubject<Result<CoreOcsGetCapabilitiesResponseApplicationJson_Ocs_Data>>();

@override
Future refresh() async {
Future<void> refresh() async {
await RequestManager.instance.wrapNextcloud<CoreOcsGetCapabilitiesResponseApplicationJson_Ocs_Data,
CoreOcsGetCapabilitiesResponseApplicationJson>(
_account.id,
Expand Down
10 changes: 6 additions & 4 deletions packages/neon/neon/lib/src/blocs/first_launch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ import 'package:neon/src/bloc/bloc.dart';
import 'package:neon/src/settings/models/storage.dart';
import 'package:rxdart/rxdart.dart';

abstract class FirstLaunchBlocEvents {}
@internal
abstract interface class FirstLaunchBlocEvents {}

abstract class FirstLaunchBlocStates {
BehaviorSubject get onFirstLaunch;
@internal
abstract interface class FirstLaunchBlocStates {
BehaviorSubject<void> get onFirstLaunch;
}

@immutable
Expand All @@ -31,5 +33,5 @@ class FirstLaunchBloc extends Bloc implements FirstLaunchBlocEvents, FirstLaunch
}

@override
final BehaviorSubject onFirstLaunch = BehaviorSubject();
final BehaviorSubject<void> onFirstLaunch = BehaviorSubject();
}
6 changes: 5 additions & 1 deletion packages/neon/neon/lib/src/blocs/login_check_account.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:meta/meta.dart';
import 'package:neon/src/bloc/bloc.dart';
import 'package:neon/src/bloc/result.dart';
import 'package:neon/src/models/account.dart';
import 'package:neon/src/utils/user_agent.dart';
import 'package:nextcloud/nextcloud.dart';
import 'package:rxdart/rxdart.dart';

@internal
abstract interface class LoginCheckAccountBlocEvents {}

@internal
abstract interface class LoginCheckAccountBlocStates {
/// Contains the account for the user
BehaviorSubject<Result<Account>> get state;
}

@internal
class LoginCheckAccountBloc extends InteractiveBloc
implements LoginCheckAccountBlocEvents, LoginCheckAccountBlocStates {
LoginCheckAccountBloc(
Expand All @@ -40,7 +44,7 @@ class LoginCheckAccountBloc extends InteractiveBloc
BehaviorSubject<Result<Account>> state = BehaviorSubject();

@override
Future refresh() async {
Future<void> refresh() async {
state.add(Result.loading());

try {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:meta/meta.dart';
import 'package:neon/src/bloc/bloc.dart';
import 'package:neon/src/bloc/result.dart';
import 'package:neon/src/utils/user_agent.dart';
import 'package:nextcloud/nextcloud.dart';
import 'package:rxdart/rxdart.dart';

@internal
abstract interface class LoginCheckServerStatusBlocEvents {}

@internal
abstract interface class LoginCheckServerStatusBlocStates {
/// Contains the current server connection state
BehaviorSubject<Result<CoreStatus>> get state;
}

@internal
class LoginCheckServerStatusBloc extends InteractiveBloc
implements LoginCheckServerStatusBlocEvents, LoginCheckServerStatusBlocStates {
LoginCheckServerStatusBloc(this.serverURL) {
Expand All @@ -33,7 +37,7 @@ class LoginCheckServerStatusBloc extends InteractiveBloc
BehaviorSubject<Result<CoreStatus>> state = BehaviorSubject();

@override
Future refresh() async {
Future<void> refresh() async {
state.add(Result.loading());

try {
Expand Down
10 changes: 7 additions & 3 deletions packages/neon/neon/lib/src/blocs/login_flow.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,24 @@
import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:meta/meta.dart';
import 'package:neon/src/bloc/bloc.dart';
import 'package:neon/src/bloc/result.dart';
import 'package:neon/src/utils/user_agent.dart';
import 'package:nextcloud/nextcloud.dart';
import 'package:rxdart/rxdart.dart';

abstract class LoginFlowBlocEvents {}
@internal
abstract interface class LoginFlowBlocEvents {}

abstract class LoginFlowBlocStates {
@internal
abstract interface class LoginFlowBlocStates {
BehaviorSubject<Result<CoreLoginFlowV2>> get init;

Stream<CoreLoginFlowV2Credentials> get result;
}

@internal
class LoginFlowBloc extends InteractiveBloc implements LoginFlowBlocEvents, LoginFlowBlocStates {
LoginFlowBloc(this.serverURL) {
unawaited(refresh());
Expand Down Expand Up @@ -45,7 +49,7 @@ class LoginFlowBloc extends InteractiveBloc implements LoginFlowBlocEvents, Logi
late Stream<CoreLoginFlowV2Credentials> result = _resultController.stream.asBroadcastStream();

@override
Future refresh() async {
Future<void> refresh() async {
try {
init.add(Result.loading());

Expand Down
Loading

0 comments on commit abbb3d7

Please sign in to comment.