feat: fix pull to refresh

This commit is contained in:
omkar 2025-01-31 20:22:48 +05:30
parent 9f1d38010e
commit 2fab0e7745
3 changed files with 23 additions and 3 deletions

View file

@ -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/streamio_addons/extension/query_extension.dart';
import 'package:madari_client/features/widgetter/plugin_base.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/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/state/widget_state_provider.dart';
import 'package:madari_client/features/widgetter/types/home_layout_model.dart'; import 'package:madari_client/features/widgetter/types/home_layout_model.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -48,10 +49,14 @@ class LayoutManagerState extends State<LayoutManager> {
super.didChangeDependencies(); super.didChangeDependencies();
} }
Future<void> refresh() { Future<void> refresh() async {
return _loadLayouts( final result = await _loadLayouts(
refresh: true, refresh: true,
); );
HomeLayoutService.instance.refreshWidgets.add(true);
return result;
} }
Future<void> _loadLayouts({ Future<void> _loadLayouts({
@ -60,7 +65,8 @@ class LayoutManagerState extends State<LayoutManager> {
try { try {
_logger.info('Loading layouts'); _logger.info('Loading layouts');
final query = Query( final query = Query(
key: "home_layout_${SelectedProfileService.instance.selectedProfileId}${widget.hasSearch}", key:
"home_layout_${SelectedProfileService.instance.selectedProfileId}${widget.hasSearch}",
config: QueryConfig( config: QueryConfig(
ignoreCacheDuration: refresh, ignoreCacheDuration: refresh,
cacheDuration: const Duration(hours: 8), cacheDuration: const Duration(hours: 8),

View file

@ -1,3 +1,5 @@
import 'dart:async';
import 'package:cached_query_flutter/cached_query_flutter.dart'; import 'package:cached_query_flutter/cached_query_flutter.dart';
import 'package:flex_color_picker/flex_color_picker.dart'; import 'package:flex_color_picker/flex_color_picker.dart';
import 'package:flutter/material.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/models/stremio_base_types.dart';
import '../../../../streamio_addons/service/stremio_addon_service.dart'; import '../../../../streamio_addons/service/stremio_addon_service.dart';
import '../../../interface/widgets.dart'; import '../../../interface/widgets.dart';
import '../../../service/home_layout_service.dart';
import '../../../state/widget_state_provider.dart'; import '../../../state/widget_state_provider.dart';
import '../utils/size.dart'; import '../utils/size.dart';
import 'catalog_featured_shimmer.dart'; import 'catalog_featured_shimmer.dart';
@ -53,6 +56,8 @@ class _CatalogGridState extends State<CatalogGrid> implements Refreshable {
late final id = late final id =
'catalog-${widget.config["type"]}-${widget.config["addon"]}-${widget.config["id"]}'; 'catalog-${widget.config["type"]}-${widget.config["addon"]}-${widget.config["id"]}';
late StreamSubscription<void> _refresh;
InfiniteQuery<List<Meta>, int> getQuery({ InfiniteQuery<List<Meta>, int> getQuery({
String? id, String? id,
}) { }) {
@ -160,6 +165,11 @@ class _CatalogGridState extends State<CatalogGrid> implements Refreshable {
void initState() { void initState() {
super.initState(); super.initState();
_query = getQuery(); _query = getQuery();
_refresh = HomeLayoutService.instance.refreshWidgets.listen((value) {
_query.refetch();
});
_gridFocusNode = FocusNode( _gridFocusNode = FocusNode(
debugLabel: 'CatalogGrid-$id', debugLabel: 'CatalogGrid-$id',
onKeyEvent: _handleKeyEvent, onKeyEvent: _handleKeyEvent,
@ -184,6 +194,7 @@ class _CatalogGridState extends State<CatalogGrid> implements Refreshable {
void dispose() { void dispose() {
_scrollController.dispose(); _scrollController.dispose();
_gridFocusNode.dispose(); _gridFocusNode.dispose();
_refresh.cancel();
super.dispose(); super.dispose();
} }

View file

@ -2,6 +2,7 @@ import 'package:cached_query_flutter/cached_query_flutter.dart';
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
import 'package:madari_client/features/settings/service/selected_profile.dart'; import 'package:madari_client/features/settings/service/selected_profile.dart';
import 'package:pocketbase/pocketbase.dart'; import 'package:pocketbase/pocketbase.dart';
import 'package:rxdart/subjects.dart';
import '../../pocketbase/service/pocketbase.service.dart'; import '../../pocketbase/service/pocketbase.service.dart';
import '../types/widget_gallery.dart'; import '../types/widget_gallery.dart';
@ -12,6 +13,8 @@ class HomeLayoutService {
static final HomeLayoutService instance = HomeLayoutService._internal(); static final HomeLayoutService instance = HomeLayoutService._internal();
HomeLayoutService._internal(); HomeLayoutService._internal();
final BehaviorSubject refreshWidgets = BehaviorSubject();
Future<List<LayoutWidgetConfig>> loadLayoutWidgets() async { Future<List<LayoutWidgetConfig>> loadLayoutWidgets() async {
try { try {
_logger.info('Loading layout widgets'); _logger.info('Loading layout widgets');