Skip to content

Commit c328eaa

Browse files
Merge pull request #2211 from nextcloud/refactor/neon_framework/options-provider
2 parents 42cc362 + 3b9f88c commit c328eaa

File tree

24 files changed

+88
-62
lines changed

24 files changed

+88
-62
lines changed

packages/neon/neon_files/lib/src/blocs/browser.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,6 @@ sealed class FilesBrowserBloc implements InteractiveBloc {
3939

4040
BehaviorSubject<PathUri> get uri;
4141

42-
FilesOptions get options;
43-
4442
/// Mode to operate the `FilesBrowserView` in.
4543
FilesBrowserMode get mode;
4644
}
@@ -65,7 +63,6 @@ class _FilesBrowserBloc extends InteractiveBloc implements FilesBrowserBloc {
6563
@override
6664
final log = Logger('FilesBrowserBloc');
6765

68-
@override
6966
final FilesOptions options;
7067
final Account account;
7168

packages/neon/neon_files/lib/src/blocs/files.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ sealed class FilesBloc implements InteractiveBloc {
4949

5050
BehaviorSubject<BuiltList<FilesTask>> get tasks;
5151

52-
FilesOptions get options;
53-
5452
FilesBrowserBloc get browser;
5553

5654
FilesBrowserBloc getNewFilesBrowserBloc({PathUri? initialUri, FilesBrowserMode? mode});
@@ -68,7 +66,6 @@ class _FilesBloc extends InteractiveBloc implements FilesBloc {
6866
@override
6967
final log = Logger('FilesBloc');
7068

71-
@override
7269
final FilesOptions options;
7370
final Account account;
7471
@override

packages/neon/neon_files/lib/src/widgets/browser_view.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:neon_files/src/widgets/file_list_tile.dart';
1313
import 'package:neon_files/src/widgets/navigator.dart';
1414
import 'package:neon_framework/blocs.dart';
1515
import 'package:neon_framework/sort_box.dart';
16+
import 'package:neon_framework/utils.dart';
1617
import 'package:neon_framework/widgets.dart';
1718
import 'package:nextcloud/webdav.dart';
1819

@@ -32,13 +33,16 @@ class FilesBrowserView extends StatefulWidget {
3233

3334
class _FilesBrowserViewState extends State<FilesBrowserView> {
3435
late final StreamSubscription<Object> errorsSubscription;
36+
late final FilesOptions options;
3537

3638
@override
3739
void initState() {
3840
errorsSubscription = widget.bloc.errors.listen((error) {
3941
NeonError.showSnackbar(context, error);
4042
});
4143

44+
options = NeonProvider.of<FilesOptions>(context);
45+
4246
super.initState();
4347
}
4448

@@ -72,8 +76,8 @@ class _FilesBrowserViewState extends State<FilesBrowserView> {
7276
},
7377
child: SortBoxBuilder(
7478
sortBox: filesSortBox,
75-
sortProperty: widget.bloc.options.filesSortPropertyOption,
76-
sortBoxOrder: widget.bloc.options.filesSortBoxOrderOption,
79+
sortProperty: options.filesSortPropertyOption,
80+
sortBoxOrder: options.filesSortBoxOrderOption,
7781
presort: const {
7882
(property: FilesSortProperty.isFolder, order: SortBoxOrder.ascending),
7983
},

packages/neon/neon_files/lib/src/widgets/dialog.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:image_picker/image_picker.dart';
99
import 'package:neon_files/l10n/localizations.dart';
1010
import 'package:neon_files/src/blocs/browser.dart';
1111
import 'package:neon_files/src/blocs/files.dart';
12+
import 'package:neon_files/src/options.dart';
1213
import 'package:neon_files/src/utils/dialog.dart';
1314
import 'package:neon_files/src/widgets/browser_view.dart';
1415
import 'package:neon_framework/platform.dart';
@@ -73,7 +74,7 @@ class _FilesChooseCreateModalState extends State<FilesChooseCreateModal> {
7374
}
7475

7576
Future<bool> confirmUpload(int size) async {
76-
final sizeWarning = widget.bloc.options.uploadSizeWarning.value;
77+
final sizeWarning = NeonProvider.of<FilesOptions>(context).uploadSizeWarning.value;
7778
if (sizeWarning != null) {
7879
if (size > sizeWarning) {
7980
final result = await showUploadConfirmationDialog(context, sizeWarning, size);

packages/neon/neon_files/lib/src/widgets/file_list_tile.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import 'package:flutter_material_design_icons/flutter_material_design_icons.dart
44
import 'package:neon_files/src/blocs/browser.dart';
55
import 'package:neon_files/src/blocs/files.dart';
66
import 'package:neon_files/src/models/file_details.dart';
7+
import 'package:neon_files/src/options.dart';
78
import 'package:neon_files/src/utils/dialog.dart';
89
import 'package:neon_files/src/utils/task.dart';
910
import 'package:neon_files/src/widgets/actions.dart';
1011
import 'package:neon_files/src/widgets/file_preview.dart';
1112
import 'package:neon_framework/theme.dart';
13+
import 'package:neon_framework/utils.dart';
1214
import 'package:neon_framework/widgets.dart';
1315

1416
class FileListTile extends StatelessWidget {
@@ -27,7 +29,7 @@ class FileListTile extends StatelessWidget {
2729
if (details.isDirectory) {
2830
browserBloc.setPath(details.uri);
2931
} else if (browserBloc.mode == FilesBrowserMode.browser) {
30-
final sizeWarning = bloc.options.downloadSizeWarning.value;
32+
final sizeWarning = NeonProvider.of<FilesOptions>(context).downloadSizeWarning.value;
3133
if (sizeWarning != null && details.size != null && details.size! > sizeWarning) {
3234
final decision = await showDownloadConfirmationDialog(context, sizeWarning, details.size!);
3335

packages/neon/neon_files/lib/src/widgets/file_preview.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import 'package:file_icons/file_icons.dart';
22
import 'package:flutter/material.dart';
33
import 'package:neon_files/src/blocs/files.dart';
44
import 'package:neon_files/src/models/file_details.dart';
5+
import 'package:neon_files/src/options.dart';
56
import 'package:neon_framework/models.dart';
67
import 'package:neon_framework/theme.dart';
78
import 'package:neon_framework/utils.dart';
@@ -46,7 +47,7 @@ class FilePreview extends StatelessWidget {
4647
}
4748

4849
return ValueListenableBuilder(
49-
valueListenable: bloc.options.showPreviewsOption,
50+
valueListenable: NeonProvider.of<FilesOptions>(context).showPreviewsOption,
5051
builder: (context, showPreviews, _) {
5152
if (showPreviews && (details.hasPreview ?? false)) {
5253
final preview = FilePreviewImage(

packages/neon/neon_news/lib/src/blocs/articles.dart

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ sealed class NewsArticlesBloc implements InteractiveBloc {
4545

4646
BehaviorSubject<FilterType> get filterType;
4747

48-
NewsOptions get options;
49-
5048
ListType? get listType;
5149
}
5250

@@ -80,7 +78,6 @@ class _NewsArticlesBloc extends InteractiveBloc implements NewsArticlesBloc {
8078
final log = Logger('NewsArticlesBloc');
8179

8280
final NewsBloc _newsBloc;
83-
@override
8481
final NewsOptions options;
8582
final Account account;
8683
final int? id;

packages/neon/neon_news/lib/src/blocs/news.dart

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ sealed class NewsBloc implements InteractiveBloc {
4141

4242
BehaviorSubject<int> get unreadCounter;
4343

44-
NewsOptions get options;
45-
4644
NewsMainArticlesBloc get mainArticlesBloc;
4745
}
4846

packages/neon/neon_news/lib/src/pages/article.dart

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import 'package:flutter/material.dart';
44
import 'package:flutter_html/flutter_html.dart';
55
import 'package:neon_framework/platform.dart';
66
import 'package:neon_framework/theme.dart';
7+
import 'package:neon_framework/utils.dart';
78
import 'package:neon_framework/widgets.dart';
89
import 'package:neon_news/l10n/localizations.dart';
910
import 'package:neon_news/src/blocs/article.dart';
1011
import 'package:neon_news/src/blocs/articles.dart';
12+
import 'package:neon_news/src/options.dart';
1113
import 'package:share_plus/share_plus.dart';
1214
import 'package:url_launcher/url_launcher_string.dart';
1315
import 'package:wakelock_plus/wakelock_plus.dart';
@@ -89,7 +91,11 @@ class _NewsArticlePageState extends State<NewsArticlePage> {
8991

9092
Future<void> _startMarkAsReadTimer() async {
9193
if (await widget.bloc.unread.first) {
92-
if (widget.articlesBloc.options.articleDisableMarkAsReadTimeoutOption.value) {
94+
if (!mounted) {
95+
return;
96+
}
97+
98+
if (NeonProvider.of<NewsOptions>(context).articleDisableMarkAsReadTimeoutOption.value) {
9399
widget.bloc.markArticleAsRead();
94100
} else {
95101
_markAsReadTimer = Timer(const Duration(seconds: 3), () async {

packages/neon/neon_news/lib/src/pages/feed.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import 'package:neon_framework/models.dart';
33
import 'package:neon_framework/utils.dart';
44
import 'package:neon_news/src/blocs/articles.dart';
55
import 'package:neon_news/src/blocs/news.dart';
6+
import 'package:neon_news/src/options.dart';
67
import 'package:neon_news/src/widgets/articles_view.dart';
78
import 'package:nextcloud/news.dart' as news;
89

@@ -27,7 +28,7 @@ class NewsFeedPage extends StatelessWidget {
2728
child: NewsArticlesView(
2829
bloc: NewsArticlesBloc(
2930
newsBloc: bloc,
30-
options: bloc.options,
31+
options: NeonProvider.of<NewsOptions>(context),
3132
account: NeonProvider.of<Account>(context),
3233
id: feed.id,
3334
listType: ListType.feed,

packages/neon/neon_news/lib/src/pages/main.dart

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:neon_framework/utils.dart';
66
import 'package:neon_framework/widgets.dart';
77
import 'package:neon_news/l10n/localizations.dart';
88
import 'package:neon_news/src/blocs/news.dart';
9+
import 'package:neon_news/src/options.dart';
910
import 'package:neon_news/src/widgets/articles_view.dart';
1011
import 'package:neon_news/src/widgets/feed_floating_action_button.dart';
1112
import 'package:neon_news/src/widgets/feeds_view.dart';
@@ -23,13 +24,14 @@ class NewsMainPage extends StatefulWidget {
2324

2425
class _NewsMainPageState extends State<NewsMainPage> {
2526
late NewsBloc bloc;
26-
late int _index = bloc.options.defaultCategoryOption.value.index;
27+
late int index;
2728
late final StreamSubscription<Object> errorsSubscription;
2829

2930
@override
3031
void initState() {
3132
super.initState();
3233
bloc = NeonProvider.of<NewsBloc>(context);
34+
index = NeonProvider.of<NewsOptions>(context).defaultCategoryOption.value.index;
3335

3436
errorsSubscription = bloc.errors.listen((error) {
3537
NeonError.showSnackbar(context, error);
@@ -67,10 +69,10 @@ class _NewsMainPageState extends State<NewsMainPage> {
6769
return Scaffold(
6870
resizeToAvoidBottomInset: false,
6971
bottomNavigationBar: BottomNavigationBar(
70-
currentIndex: _index,
72+
currentIndex: index,
7173
onTap: (index) {
7274
setState(() {
73-
_index = index;
75+
this.index = index;
7476
});
7577
},
7678
items: [
@@ -88,8 +90,8 @@ class _NewsMainPageState extends State<NewsMainPage> {
8890
),
8991
],
9092
),
91-
body: views[_index],
92-
floatingActionButton: floatingActionButtons[_index],
93+
body: views[index],
94+
floatingActionButton: floatingActionButtons[index],
9395
);
9496
}
9597
}

packages/neon/neon_news/lib/src/widgets/articles_view.dart

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ class NewsArticlesView extends StatefulWidget {
4242

4343
class _NewsArticlesViewState extends State<NewsArticlesView> {
4444
late final StreamSubscription<Object> errorsSubscription;
45+
late final NewsOptions options;
4546

4647
@override
4748
void initState() {
@@ -50,6 +51,8 @@ class _NewsArticlesViewState extends State<NewsArticlesView> {
5051
errorsSubscription = widget.bloc.errors.listen((error) {
5152
NeonError.showSnackbar(context, error);
5253
});
54+
55+
options = NeonProvider.of<NewsOptions>(context);
5356
}
5457

5558
@override
@@ -67,8 +70,8 @@ class _NewsArticlesViewState extends State<NewsArticlesView> {
6770
subject: widget.bloc.articles,
6871
builder: (context, articles) => SortBoxBuilder(
6972
sortBox: articlesSortBox,
70-
sortProperty: widget.newsBloc.options.articlesSortPropertyOption,
71-
sortBoxOrder: widget.newsBloc.options.articlesSortBoxOrderOption,
73+
sortProperty: options.articlesSortPropertyOption,
74+
sortBoxOrder: options.articlesSortBoxOrderOption,
7275
input: articles.data?.toList(),
7376
builder: (context, sorted) => NeonListView(
7477
scrollKey: 'news-articles',
@@ -219,7 +222,7 @@ class _NewsArticlesViewState extends State<NewsArticlesView> {
219222
}
220223
},
221224
onTap: () async {
222-
final viewType = widget.newsBloc.options.articleViewTypeOption.value;
225+
final viewType = options.articleViewTypeOption.value;
223226
String? bodyData;
224227
try {
225228
bodyData = _fixArticleBody(article.body);

packages/neon/neon_news/lib/src/widgets/feeds_view.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import 'package:neon_framework/utils.dart';
66
import 'package:neon_framework/widgets.dart';
77
import 'package:neon_news/l10n/localizations.dart';
88
import 'package:neon_news/src/blocs/news.dart';
9+
import 'package:neon_news/src/options.dart';
910
import 'package:neon_news/src/pages/feed.dart';
1011
import 'package:neon_news/src/sort/feeds.dart';
1112
import 'package:neon_news/src/utils/dialog.dart';
@@ -25,14 +26,16 @@ class NewsFeedsView extends StatelessWidget {
2526

2627
@override
2728
Widget build(BuildContext context) {
29+
final options = NeonProvider.of<NewsOptions>(context);
30+
2831
return ResultBuilder.behaviorSubject(
2932
subject: bloc.folders,
3033
builder: (context, folders) => ResultBuilder.behaviorSubject(
3134
subject: bloc.feeds,
3235
builder: (context, feeds) => SortBoxBuilder(
3336
sortBox: feedsSortBox,
34-
sortProperty: bloc.options.feedsSortPropertyOption,
35-
sortBoxOrder: bloc.options.feedsSortBoxOrderOption,
37+
sortProperty: options.feedsSortPropertyOption,
38+
sortBoxOrder: options.feedsSortBoxOrderOption,
3639
input: folders.hasData ? feeds.data?.where((f) => folderID == null || f.folderId == folderID).toList() : null,
3740
builder: (context, sorted) => NeonListView(
3841
scrollKey: 'news-feeds',

packages/neon/neon_news/lib/src/widgets/folder_view.dart

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,16 @@ class NewsFolderView extends StatefulWidget {
2323
}
2424

2525
class _NewsFolderViewState extends State<NewsFolderView> {
26-
late final option = widget.bloc.options.defaultFolderViewTypeOption;
27-
late DefaultFolderViewType _viewType = option.value;
26+
late final NewsOptions options;
27+
late DefaultFolderViewType viewType;
28+
29+
@override
30+
void initState() {
31+
super.initState();
32+
33+
options = NeonProvider.of<NewsOptions>(context);
34+
viewType = options.defaultFolderViewTypeOption.value;
35+
}
2836

2937
@override
3038
Widget build(BuildContext context) {
@@ -34,28 +42,28 @@ class _NewsFolderViewState extends State<NewsFolderView> {
3442
margin: const EdgeInsets.symmetric(horizontal: 15),
3543
child: DropdownButton(
3644
isExpanded: true,
37-
value: _viewType,
38-
items: option.values.keys
45+
value: viewType,
46+
items: options.defaultFolderViewTypeOption.values.keys
3947
.map(
4048
(key) => DropdownMenuItem(
4149
value: key,
42-
child: Text(option.values[key]!(context)),
50+
child: Text(options.defaultFolderViewTypeOption.values[key]!(context)),
4351
),
4452
)
4553
.toList(),
4654
onChanged: (value) {
4755
setState(() {
48-
_viewType = value!;
56+
viewType = value!;
4957
});
5058
},
5159
),
5260
),
5361
Expanded(
54-
child: _viewType == DefaultFolderViewType.articles
62+
child: viewType == DefaultFolderViewType.articles
5563
? NewsArticlesView(
5664
bloc: NewsArticlesBloc(
5765
newsBloc: widget.bloc,
58-
options: widget.bloc.options,
66+
options: options,
5967
account: NeonProvider.of<Account>(context),
6068
id: widget.folder.id,
6169
listType: ListType.folder,

packages/neon/neon_news/lib/src/widgets/folders_view.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import 'package:flutter/material.dart';
22
import 'package:neon_framework/blocs.dart';
33
import 'package:neon_framework/sort_box.dart';
44
import 'package:neon_framework/theme.dart';
5+
import 'package:neon_framework/utils.dart';
56
import 'package:neon_framework/widgets.dart';
67
import 'package:neon_news/l10n/localizations.dart';
78
import 'package:neon_news/src/blocs/news.dart';
9+
import 'package:neon_news/src/options.dart';
810
import 'package:neon_news/src/pages/folder.dart';
911
import 'package:neon_news/src/sort/folders.dart';
1012
import 'package:neon_news/src/utils/dialog.dart';
@@ -19,14 +21,16 @@ class NewsFoldersView extends StatelessWidget {
1921

2022
@override
2123
Widget build(BuildContext context) {
24+
final options = NeonProvider.of<NewsOptions>(context);
25+
2226
return ResultBuilder.behaviorSubject(
2327
subject: bloc.folders,
2428
builder: (context, folders) => ResultBuilder.behaviorSubject(
2529
subject: bloc.feeds,
2630
builder: (context, feeds) => SortBoxBuilder(
2731
sortBox: foldersSortBox,
28-
sortProperty: bloc.options.foldersSortPropertyOption,
29-
sortBoxOrder: bloc.options.foldersSortBoxOrderOption,
32+
sortProperty: options.foldersSortPropertyOption,
33+
sortBoxOrder: options.foldersSortBoxOrderOption,
3034
input: feeds.hasData
3135
? [
3236
...?folders.data,

0 commit comments

Comments
 (0)