refactoring

security update
This commit is contained in:
Mguy13 2022-12-25 22:17:59 +01:00
parent 1747ab0245
commit 78fe9e7b09
39 changed files with 289 additions and 132 deletions

View file

@ -18,12 +18,7 @@ class _DownloadedGalleryView extends StatelessWidget {
child: ValueListenableBuilder<bool>(
valueListenable: galleryViewModel.isViewingFavouriteListenable,
builder: (context, final isViewingFavourites, _) => !isViewingFavourites
? Wrap(
runSpacing: 24,
spacing: 8,
alignment: WrapAlignment.center,
runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center,
? CustomWrap(
children: [
for (final imageModel in galleryViewModel.imageModels)
_StarrableImage(
@ -33,12 +28,7 @@ class _DownloadedGalleryView extends StatelessWidget {
),
],
)
: Wrap(
runSpacing: 24,
spacing: 8,
alignment: WrapAlignment.center,
runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center,
: CustomWrap(
children: [
for (final favouriteImageModel in galleryViewModel.favouriteImageModels)
_StarrableImage(
@ -88,11 +78,14 @@ class _StarrableImageState extends State<_StarrableImage> {
context,
imageModel: widget.imageModel,
),
child: CachedNetworkImage(
imageUrl: widget.imageModel.uri.toString(),
cacheKey: widget.imageModel.imageIndex.toString(),
progressIndicatorBuilder: (_, __, final progress) => CircularProgressIndicator(
value: widget.galleryViewModel.downloadProgressValue(progress: progress),
child: Hero(
tag: widget.imageModel.imageIndex,
child: CachedNetworkImage(
imageUrl: widget.imageModel.uri.toString(),
cacheKey: widget.imageModel.imageIndex.toString(),
progressIndicatorBuilder: (_, __, final progress) => CircularProgressIndicator(
value: widget.galleryViewModel.downloadProgressValue(progress: progress),
),
),
),
),

View file

@ -1,13 +1,14 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:mc_gallery/features/core/data/constants/const_media.dart';
import '/features/core/data/constants/const_colors.dart';
import '/features/core/data/constants/const_durations.dart';
import '/features/core/data/constants/const_media.dart';
import '/features/core/widgets/gap.dart';
import '/features/core/widgets/mcg_scaffold.dart';
import '/features/core/widgets/state/multi_value_listenable_builder.dart';
import '/features/core/widgets/state/view_model_builder.dart';
import '/features/home/widgets/custom_wrap.dart';
import '../../data/enums/search_option.dart';
import '../../data/models/image_model.dart';
import 'gallery_view_model.dart';
@ -81,21 +82,38 @@ class GalleryView extends StatelessWidget {
valueListenable: model.isSearchingListenable,
builder: (context, final isSearching, _) => AnimatedSwitcher(
duration: ConstDurations.oneAndHalfDefaultAnimationDuration,
child: Column(
children: [
ValueListenableBuilder<bool>(
valueListenable: model.isViewingFavouriteListenable,
builder: (context, final isViewingFavourites, child) =>
Switch(
value: isViewingFavourites,
onChanged: model.onFavouriteViewChange,
),
),
!isSearching
? _DownloadedGalleryView(galleryViewModel: model)
: _SearchGalleryView(galleryViewModel: model),
],
),
child: !isSearching
? Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
ValueListenableBuilder<bool>(
valueListenable: model.isViewingFavouriteListenable,
builder:
(context, final isViewingFavourites, child) =>
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ConstMedia.buildIcon(
ConstMedia.favStarOutline,
width: 24,
height: 24,
),
Switch(
value: isViewingFavourites,
onChanged: model.onFavouriteViewChange,
),
ConstMedia.buildIcon(
ConstMedia.favStarFilled,
width: 24,
height: 24,
),
],
),
),
_DownloadedGalleryView(galleryViewModel: model),
],
)
: _SearchGalleryView(galleryViewModel: model),
),
);
}

View file

@ -3,10 +3,9 @@ import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:mc_gallery/features/core/data/extensions/value_notifier_extensions.dart';
import '/features/core/abstracts/base_view_model.dart';
import '/features/core/services/logging_service.dart';
import '/features/core/data/extensions/value_notifier_extensions.dart';
import '/features/core/services/navigation_service.dart';
import '/locator.dart';
import '../../data/enums/search_option.dart';
@ -20,17 +19,14 @@ class GalleryViewModel extends BaseViewModel {
required ImagesService imagesService,
required NavigationService navigationService,
required ImageCacheManagerService imageCacheManagerService,
required LoggingService loggingService,
}) : _imagesService = imagesService,
_navigationService = navigationService,
_imageCacheManagerService = imageCacheManagerService,
_loggingService = loggingService;
_imageCacheManagerService = imageCacheManagerService;
final ImagesService _imagesService;
final NavigationService _navigationService;
//todo(mehul): Use to implement pull-to-refresh or an extra widget
final ImageCacheManagerService _imageCacheManagerService;
final LoggingService _loggingService;
final ValueNotifier<bool> _isDisplayingPressingPrompt = ValueNotifier(true);
ValueListenable<bool> get isDisplayingPressingPrompt => _isDisplayingPressingPrompt;
@ -59,7 +55,7 @@ class GalleryViewModel extends BaseViewModel {
// If empty-string (from backspacing) -> reset state.
if (searchTerm.isEmpty) {
_imageSearchResultsNotifier.value = [];
_loggingService.info('Clearing results on search string removal');
log.info('Clearing results on search string removal');
return;
}
@ -82,7 +78,7 @@ class GalleryViewModel extends BaseViewModel {
// If transitioning from 'Searching', clear previous results immediately
if (_isSearchingNotifier.value) {
_imageSearchResultsNotifier.value = [];
_loggingService.info('Clearing of results on view mode change');
log.info('Clearing of results on view mode change');
}
_isSearchingNotifier.flipValue();
@ -92,10 +88,10 @@ class GalleryViewModel extends BaseViewModel {
void onSearchOptionChanged(SearchOption? option) {
_searchOptionNotifier.value = option!;
_loggingService.info('Switched over to $option search');
log.info('Switched over to $option search');
_imageSearchResultsNotifier.value = [];
_loggingService.info('Cleared resultsw from view');
log.info('Cleared resultsw from view');
//todo(mehul): Either redo search or force user to type in new (trigger) by clearing field
}

View file

@ -29,12 +29,7 @@ class _SearchGalleryView extends StatelessWidget {
builder: (context, final searchOption, child) {
switch (searchOption) {
case SearchOption.local:
return Wrap(
runSpacing: 24,
spacing: 8,
alignment: WrapAlignment.center,
runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center,
return CustomWrap(
children: [
for (final resultsImageModel in resultsImageModels)
CachedNetworkImage(
@ -48,12 +43,7 @@ class _SearchGalleryView extends StatelessWidget {
],
);
case SearchOption.web:
return Wrap(
runSpacing: 24,
spacing: 8,
alignment: WrapAlignment.center,
runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center,
return CustomWrap(
children: [
for (final imageResult in resultsImageModels)
Image.network(