From 9d72ef21547a27c5457f195f4f18e68dd3084cbd Mon Sep 17 00:00:00 2001 From: Nikolas Rimikis Date: Thu, 6 Apr 2023 13:34:15 +0200 Subject: [PATCH] WIP --- lib/src/screens/category_screen.dart | 4 +-- lib/src/screens/recipes_list_screen.dart | 4 +-- lib/src/services/api_provider.dart | 42 ++++++++++++++++++++++-- lib/src/services/services.dart | 3 ++ lib/src/services/user_repository.dart | 1 + pubspec.yaml | 9 ++++- 6 files changed, 55 insertions(+), 8 deletions(-) diff --git a/lib/src/screens/category_screen.dart b/lib/src/screens/category_screen.dart index d6675683..81e1627c 100644 --- a/lib/src/screens/category_screen.dart +++ b/lib/src/screens/category_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:flutter_cache_manager_dio/flutter_cache_manager_dio.dart'; import 'package:flutter_spinkit/flutter_spinkit.dart'; import 'package:flutter_translate/flutter_translate.dart'; import 'package:nc_cookbook_api/nc_cookbook_api.dart'; @@ -72,7 +72,7 @@ class _CategoryScreenState extends State { } Future refresh() async { - await DefaultCacheManager().emptyCache(); + await DioCacheManager.instance.emptyCache(); // ignore: use_build_context_synchronously BlocProvider.of(context).add(const CategoriesLoaded()); } diff --git a/lib/src/screens/recipes_list_screen.dart b/lib/src/screens/recipes_list_screen.dart index 4fa05a3e..fb95df45 100644 --- a/lib/src/screens/recipes_list_screen.dart +++ b/lib/src/screens/recipes_list_screen.dart @@ -1,6 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; -import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:flutter_cache_manager_dio/flutter_cache_manager_dio.dart'; import 'package:flutter_translate/flutter_translate.dart'; import 'package:nextcloud_cookbook_flutter/src/blocs/recipes_short/recipes_short_bloc.dart'; import 'package:nextcloud_cookbook_flutter/src/widget/recipe_list_item.dart'; @@ -18,7 +18,7 @@ class RecipesListScreen extends StatefulWidget { class _RecipesListScreenState extends State { Future refresh() async { - await DefaultCacheManager().emptyCache(); + await DioCacheManager.instance.emptyCache(); // ignore: use_build_context_synchronously BlocProvider.of(context) .add(RecipesShortLoaded(category: widget.category)); diff --git a/lib/src/services/api_provider.dart b/lib/src/services/api_provider.dart index 6c8705ed..7b20bf4f 100644 --- a/lib/src/services/api_provider.dart +++ b/lib/src/services/api_provider.dart @@ -2,7 +2,10 @@ part of 'services.dart'; class ApiProvider { factory ApiProvider() => _apiProvider; - ApiProvider._() { + ApiProvider._(); + static final ApiProvider _apiProvider = ApiProvider._(); + + Future initialize() async { final auth = UserRepository().currentAppAuthentication; final client = Dio( @@ -23,8 +26,42 @@ class ApiProvider { ); } + final documentsDir = await getApplicationDocumentsDirectory(); + + // Global options + final options = CacheOptions( + // A default store is required for interceptor. + store: SembastCacheStore(storePath: documentsDir.path), + + // All subsequent fields are optional. + + // Default. + policy: CachePolicy.noCache, + // Returns a cached response on error but for statuses 401 & 403. + // Also allows to return a cached response on network errors (e.g. offline usage). + // Defaults to [null]. + hitCacheOnErrorExcept: [401, 403], + // Overrides any HTTP directive to delete entry past this duration. + // Useful only when origin server has no cache config or custom behaviour is desired. + // Defaults to [null]. + maxStale: const Duration(days: 7), + // Default. Allows 3 cache sets and ease cleanup. + priority: CachePriority.normal, + // Default. Body and headers encryption with your own algorithm. + cipher: null, + // Default. Key builder to retrieve requests. + keyBuilder: CacheOptions.defaultCacheKeyBuilder, + // Default. Allows to cache POST requests. + // Overriding [keyBuilder] is strongly recommended when [true]. + allowPostMethod: false, + ); + ncCookbookApi = NcCookbookApi( - dio: client, + basePathOverride: '${auth.server}/apps/cookbook', + interceptors: [ + BasicAuthInterceptor(), + DioCacheInterceptor(options: options), + ], ); ncCookbookApi.setBasicAuth( @@ -37,7 +74,6 @@ class ApiProvider { miscApi = ncCookbookApi.getMiscApi(); tagsApi = ncCookbookApi.getTagsApi(); } - static final ApiProvider _apiProvider = ApiProvider._(); late NcCookbookApi ncCookbookApi; late RecipesApi recipeApi; diff --git a/lib/src/services/services.dart b/lib/src/services/services.dart index 82830441..e5c13e7c 100644 --- a/lib/src/services/services.dart +++ b/lib/src/services/services.dart @@ -5,6 +5,8 @@ import 'dart:developer'; import 'package:dio/dio.dart' as dio; import 'package:dio/dio.dart'; import 'package:dio/io.dart'; +import 'package:dio_cache_interceptor/dio_cache_interceptor.dart'; +import 'package:dio_cache_interceptor_sembast_storage/dio_cache_interceptor_sembast_storage.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; @@ -17,6 +19,7 @@ import 'package:nextcloud_cookbook_flutter/src/models/image_response.dart'; import 'package:nextcloud_cookbook_flutter/src/models/timer.dart'; import 'package:nextcloud_cookbook_flutter/src/screens/recipe_import_screen.dart'; import 'package:nextcloud_cookbook_flutter/src/util/url_validator.dart'; +import 'package:path_provider/path_provider.dart'; import 'package:timezone/data/latest_10y.dart' as tz; import 'package:timezone/timezone.dart' as tz; import 'package:xml/xml.dart'; diff --git a/lib/src/services/user_repository.dart b/lib/src/services/user_repository.dart index c2158533..613a5ae5 100644 --- a/lib/src/services/user_repository.dart +++ b/lib/src/services/user_repository.dart @@ -70,6 +70,7 @@ class UserRepository { ApiProvider().ncCookbookApi.isSupportedSync(version); Future fetchApiVersion() async { + await ApiProvider().initialize(); final response = await ApiProvider().miscApi.version(); return response.data!.apiVersion; diff --git a/pubspec.yaml b/pubspec.yaml index ac3e3bc3..6138af1a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -82,7 +82,14 @@ dependencies: timezone: ^0.9.1 cached_network_image: ^3.0.0 - flutter_cache_manager: ^3.3.0 + #flutter_cache_manager: ^3.3.0 + flutter_cache_manager_dio: + git: + url: https://github.com/josh-burton/flutter_cache_manager_dio.git + ref: dio-5.x + dio_cache_interceptor_sembast_storage: ^0.1.0 + dio_cache_interceptor: ^3.4.1 + path_provider: ^2.0.14 flutter_typeahead: ^4.3.7