Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor(neon_framework): introduce storage library #1554

Merged
merged 11 commits into from
Feb 1, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions packages/neon/neon_dashboard/test/widget_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ void main() {
),
);

setUp(() {
final storage = MockNeonStorage();
when(() => storage.requestCache).thenReturn(null);
});

group('Widget item', () {
final item = dashboard.WidgetItem(
(b) => b
Expand Down
1 change: 1 addition & 0 deletions packages/neon/neon_files/lib/src/options.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import 'package:filesize/filesize.dart';
import 'package:neon_files/l10n/localizations.dart';
import 'package:neon_framework/settings.dart';
import 'package:neon_framework/sort_box.dart';
import 'package:neon_framework/storage.dart';

class FilesOptions extends AppImplementationOptions {
FilesOptions(super.storage) {
Expand Down
1 change: 1 addition & 0 deletions packages/neon/neon_news/lib/src/options.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import 'package:neon_framework/platform.dart';
import 'package:neon_framework/settings.dart';
import 'package:neon_framework/sort_box.dart';
import 'package:neon_framework/storage.dart';
import 'package:neon_news/l10n/localizations.dart';
import 'package:neon_news/src/blocs/articles.dart';

Expand Down
1 change: 1 addition & 0 deletions packages/neon/neon_notes/lib/src/options.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import 'package:neon_framework/settings.dart';
import 'package:neon_framework/sort_box.dart';
import 'package:neon_framework/storage.dart';
import 'package:neon_notes/l10n/localizations.dart';

class NotesOptions extends AppImplementationOptions {
Expand Down
6 changes: 2 additions & 4 deletions packages/neon_framework/lib/neon.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,11 @@ import 'package:neon_framework/src/models/account.dart';
import 'package:neon_framework/src/models/app_implementation.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/platform/platform.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/theme/neon.dart';
import 'package:neon_framework/src/utils/global_options.dart';
import 'package:neon_framework/src/utils/provider.dart';
import 'package:neon_framework/src/utils/request_manager.dart';
import 'package:neon_framework/src/utils/user_agent.dart';
import 'package:neon_framework/storage.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:provider/provider.dart';

Expand All @@ -35,8 +34,7 @@ Future<void> runNeon({
FlutterNativeSplash.preserve(widgetsBinding: binding);

await NeonPlatform.setup();
await RequestManager.instance.initCache();
await NeonStorage.init();
await NeonStorage().init();

final packageInfo = await PackageInfo.fromPlatform();
buildUserAgent(packageInfo);
Expand Down
1 change: 0 additions & 1 deletion packages/neon_framework/lib/settings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,4 @@ export 'package:neon_framework/src/models/label_builder.dart';
export 'package:neon_framework/src/settings/models/option.dart';
export 'package:neon_framework/src/settings/models/options_category.dart';
export 'package:neon_framework/src/settings/models/options_collection.dart';
export 'package:neon_framework/src/settings/models/storage.dart' show Storable;
export 'package:neon_framework/src/settings/widgets/settings_list.dart';
23 changes: 10 additions & 13 deletions packages/neon_framework/lib/src/blocs/accounts.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,14 @@ import 'package:neon_framework/src/models/account.dart';
import 'package:neon_framework/src/models/account_cache.dart';
import 'package:neon_framework/src/models/app_implementation.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/storage/keys.dart';
import 'package:neon_framework/src/utils/account_options.dart';
import 'package:neon_framework/src/utils/findable.dart';
import 'package:neon_framework/src/utils/global_options.dart';
import 'package:neon_framework/storage.dart';
import 'package:nextcloud/core.dart' as core;
import 'package:rxdart/rxdart.dart';

const _keyAccounts = 'accounts';

/// The Bloc responsible for managing the [Account]s
@sealed
abstract interface class AccountsBloc implements Disposable {
Expand Down Expand Up @@ -153,7 +152,7 @@ class _AccountsBloc extends Bloc implements AccountsBloc {
this.globalOptions,
this.allAppImplementations,
) {
const lastUsedStorage = SingleValueStorage(StorageKeys.lastUsedAccount);
final lastUsedStorage = NeonStorage().singleValueStore(StorageKeys.lastUsedAccount);

accounts
..add(loadAccounts())
Expand Down Expand Up @@ -313,7 +312,7 @@ class _AccountsBloc extends Bloc implements AccountsBloc {

@override
AccountOptions getOptionsFor(Account account) => accountsOptions[account] ??= AccountOptions(
AppStorage(StorageKeys.accounts, account.id),
NeonStorage().settingsStore(StorageKeys.accountOptions, account.id),
getAppsBlocFor(account),
);

Expand Down Expand Up @@ -369,21 +368,19 @@ class _AccountsBloc extends Bloc implements AccountsBloc {
///
/// It is not checked whether the stored information is still valid.
List<Account> loadAccounts() {
const storage = AppStorage(StorageKeys.accounts);
final storage = NeonStorage().singleValueStore(StorageKeys.accounts);

if (storage.containsKey(_keyAccounts)) {
return storage
.getStringList(_keyAccounts)!
.map((a) => Account.fromJson(json.decode(a) as Map<String, dynamic>))
.toList();
if (storage.hasValue()) {
return storage.getStringList()!.map((a) => Account.fromJson(json.decode(a) as Map<String, dynamic>)).toList();
}

return [];
}

/// Saves the given [accounts] to the storage.
Future<void> saveAccounts(List<Account> accounts) async {
const storage = AppStorage(StorageKeys.accounts);
final storage = NeonStorage().singleValueStore(StorageKeys.accounts);
final values = accounts.map((a) => json.encode(a.toJson())).toList();

await storage.setStringList(_keyAccounts, values);
await storage.setStringList(values);
}
5 changes: 3 additions & 2 deletions packages/neon_framework/lib/src/blocs/first_launch.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import 'dart:async';
import 'package:meta/meta.dart';
import 'package:neon_framework/src/bloc/bloc.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/storage/keys.dart';
import 'package:neon_framework/storage.dart';
import 'package:rxdart/rxdart.dart';

/// Bloc that manages tasks that only need to run at the first launch of the app.
Expand All @@ -23,7 +24,7 @@ class _FirstLaunchBloc extends Bloc implements FirstLaunchBloc {
_FirstLaunchBloc({
bool disabled = false,
}) {
const storage = SingleValueStorage(StorageKeys.firstLaunch);
final storage = NeonStorage().singleValueStore(StorageKeys.firstLaunch);

if (!disabled && !storage.hasValue()) {
onFirstLaunch.add(null);
Expand Down
5 changes: 3 additions & 2 deletions packages/neon_framework/lib/src/blocs/push_notifications.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,11 @@ import 'package:neon_framework/src/bloc/bloc.dart';
import 'package:neon_framework/src/blocs/accounts.dart';
import 'package:neon_framework/src/models/account.dart';
import 'package:neon_framework/src/platform/platform.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/storage/keys.dart';
import 'package:neon_framework/src/utils/findable.dart';
import 'package:neon_framework/src/utils/global_options.dart';
import 'package:neon_framework/src/utils/push_utils.dart';
import 'package:neon_framework/storage.dart';
import 'package:nextcloud/notifications.dart' as notifications;
import 'package:unifiedpush/unifiedpush.dart';

Expand Down Expand Up @@ -42,7 +43,7 @@ class _PushNotificationsBloc extends Bloc implements PushNotificationsBloc {
}

final AccountsBloc accountsBloc;
late final storage = const AppStorage(StorageKeys.lastEndpoint);
late final storage = NeonStorage().settingsStore(StorageKeys.lastEndpoint);
final GlobalOptions globalOptions;

StreamSubscription<List<Account>>? accountsListener;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,12 @@ import 'package:neon_framework/src/models/account.dart';
import 'package:neon_framework/src/models/account_cache.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/settings/models/options_collection.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/src/storage/keys.dart';

import 'package:neon_framework/src/utils/findable.dart';
import 'package:neon_framework/src/utils/provider.dart';
import 'package:neon_framework/src/widgets/drawer_destination.dart';
import 'package:neon_framework/storage.dart';
import 'package:nextcloud/core.dart' as core;
import 'package:nextcloud/nextcloud.dart' show VersionCheck;
import 'package:provider/provider.dart';
Expand Down Expand Up @@ -46,9 +48,9 @@ abstract class AppImplementation<T extends Bloc, R extends AppImplementationOpti
/// Localized name of this app.
String name(BuildContext context) => nameFromLocalization(NeonLocalizations.of(context));

/// The [SettingsStorage] for this app.
/// The storage bucket for this app.
@protected
late final AppStorage storage = AppStorage(StorageKeys.apps, id);
late final SettingsStore storage = NeonStorage().settingsStore(StorageKeys.apps, id);

/// The options associated with this app.
///
Expand Down
6 changes: 3 additions & 3 deletions packages/neon_framework/lib/src/settings/models/option.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@ import 'package:meta/meta.dart';
import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/models/label_builder.dart';
import 'package:neon_framework/src/settings/models/options_category.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/storage.dart';
import 'package:rxdart/rxdart.dart';

/// Listenable option that is persisted in the [SettingsStorage].
/// Listenable option that is persisted in the [SettingsStore].
///
/// See:
/// * [ToggleOption] for an Option<bool>
Expand Down Expand Up @@ -44,7 +44,7 @@ sealed class Option<T> extends ChangeNotifier implements ValueListenable<T>, Dis
}

/// Storage to persist the state.
final SettingsStorage storage;
final SettingsStore storage;

/// Storage key to save the state at.
final Storable key;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:neon_framework/src/models/disposable.dart';
import 'package:neon_framework/src/settings/models/exportable.dart';
import 'package:neon_framework/src/settings/models/option.dart';
import 'package:neon_framework/src/settings/models/options_category.dart';
import 'package:neon_framework/src/settings/models/storage.dart';
import 'package:neon_framework/storage.dart';

/// Collection of [Option]s.
abstract class OptionsCollection implements Exportable, Disposable {
Expand All @@ -12,7 +12,7 @@ abstract class OptionsCollection implements Exportable, Disposable {

/// Storage backend to use.
@protected
final AppStorage storage;
final SettingsStore storage;

/// Collection of options.
@protected
Expand Down
Loading
Loading