From 2fab0e7745e2e51db3ad3e7bcc7572752fe39305 Mon Sep 17 00:00:00 2001 From: omkar Date: Fri, 31 Jan 2025 20:22:48 +0530 Subject: [PATCH] feat: fix pull to refresh --- lib/features/widgetter/plugin_layout.dart | 12 +++++++++--- .../plugins/stremio/widgets/catalog_grid.dart | 11 +++++++++++ .../widgetter/service/home_layout_service.dart | 3 +++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/lib/features/widgetter/plugin_layout.dart b/lib/features/widgetter/plugin_layout.dart index fbdbc55..8d8d368 100644 --- a/lib/features/widgetter/plugin_layout.dart +++ b/lib/features/widgetter/plugin_layout.dart @@ -5,6 +5,7 @@ import 'package:madari_client/features/settings/service/selected_profile.dart'; import 'package:madari_client/features/streamio_addons/extension/query_extension.dart'; import 'package:madari_client/features/widgetter/plugin_base.dart'; import 'package:madari_client/features/widgetter/plugins/stremio/widgets/catalog_featured_shimmer.dart'; +import 'package:madari_client/features/widgetter/service/home_layout_service.dart'; import 'package:madari_client/features/widgetter/state/widget_state_provider.dart'; import 'package:madari_client/features/widgetter/types/home_layout_model.dart'; import 'package:provider/provider.dart'; @@ -48,10 +49,14 @@ class LayoutManagerState extends State { super.didChangeDependencies(); } - Future refresh() { - return _loadLayouts( + Future refresh() async { + final result = await _loadLayouts( refresh: true, ); + + HomeLayoutService.instance.refreshWidgets.add(true); + + return result; } Future _loadLayouts({ @@ -60,7 +65,8 @@ class LayoutManagerState extends State { try { _logger.info('Loading layouts'); final query = Query( - key: "home_layout_${SelectedProfileService.instance.selectedProfileId}${widget.hasSearch}", + key: + "home_layout_${SelectedProfileService.instance.selectedProfileId}${widget.hasSearch}", config: QueryConfig( ignoreCacheDuration: refresh, cacheDuration: const Duration(hours: 8), diff --git a/lib/features/widgetter/plugins/stremio/widgets/catalog_grid.dart b/lib/features/widgetter/plugins/stremio/widgets/catalog_grid.dart index 7517025..d462bb8 100644 --- a/lib/features/widgetter/plugins/stremio/widgets/catalog_grid.dart +++ b/lib/features/widgetter/plugins/stremio/widgets/catalog_grid.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:cached_query_flutter/cached_query_flutter.dart'; import 'package:flex_color_picker/flex_color_picker.dart'; import 'package:flutter/material.dart'; @@ -15,6 +17,7 @@ import 'package:shimmer/shimmer.dart'; import '../../../../streamio_addons/models/stremio_base_types.dart'; import '../../../../streamio_addons/service/stremio_addon_service.dart'; import '../../../interface/widgets.dart'; +import '../../../service/home_layout_service.dart'; import '../../../state/widget_state_provider.dart'; import '../utils/size.dart'; import 'catalog_featured_shimmer.dart'; @@ -53,6 +56,8 @@ class _CatalogGridState extends State implements Refreshable { late final id = 'catalog-${widget.config["type"]}-${widget.config["addon"]}-${widget.config["id"]}'; + late StreamSubscription _refresh; + InfiniteQuery, int> getQuery({ String? id, }) { @@ -160,6 +165,11 @@ class _CatalogGridState extends State implements Refreshable { void initState() { super.initState(); _query = getQuery(); + + _refresh = HomeLayoutService.instance.refreshWidgets.listen((value) { + _query.refetch(); + }); + _gridFocusNode = FocusNode( debugLabel: 'CatalogGrid-$id', onKeyEvent: _handleKeyEvent, @@ -184,6 +194,7 @@ class _CatalogGridState extends State implements Refreshable { void dispose() { _scrollController.dispose(); _gridFocusNode.dispose(); + _refresh.cancel(); super.dispose(); } diff --git a/lib/features/widgetter/service/home_layout_service.dart b/lib/features/widgetter/service/home_layout_service.dart index 46805c1..267129f 100644 --- a/lib/features/widgetter/service/home_layout_service.dart +++ b/lib/features/widgetter/service/home_layout_service.dart @@ -2,6 +2,7 @@ import 'package:cached_query_flutter/cached_query_flutter.dart'; import 'package:logging/logging.dart'; import 'package:madari_client/features/settings/service/selected_profile.dart'; import 'package:pocketbase/pocketbase.dart'; +import 'package:rxdart/subjects.dart'; import '../../pocketbase/service/pocketbase.service.dart'; import '../types/widget_gallery.dart'; @@ -12,6 +13,8 @@ class HomeLayoutService { static final HomeLayoutService instance = HomeLayoutService._internal(); HomeLayoutService._internal(); + final BehaviorSubject refreshWidgets = BehaviorSubject(); + Future> loadLayoutWidgets() async { try { _logger.info('Loading layout widgets');