diff --git a/lib/features/profile/presentation/bloc/sub_cubit/sub_cubit.dart b/lib/features/profile/presentation/bloc/sub_cubit/sub_cubit.dart index ea5e2c15..60e2c486 100644 --- a/lib/features/profile/presentation/bloc/sub_cubit/sub_cubit.dart +++ b/lib/features/profile/presentation/bloc/sub_cubit/sub_cubit.dart @@ -9,19 +9,19 @@ class SubCubit extends Cubit { required this.profileRepository, }) : super(const SubState()); - getSubscriptions(String slug) async { + getSubscriptions(String slug, [String? query]) async { emit(const SubState.loading()); try { - emit(SubState.loaded(subList: await profileRepository.getSubscriptionsBySlug(slug))); + emit(SubState.loaded(subList: await profileRepository.getSubscriptionsBySlug(slug, query))); } catch (e) { emit(SubState.error(errorMessage: e.toString())); } } - getSubscribers(String slug) async { + getSubscribers(String slug, [String? query]) async { emit(const SubState.loading()); try { - emit(SubState.loaded(subList: await profileRepository.getSubscribersBySlug(slug))); + emit(SubState.loaded(subList: await profileRepository.getSubscribersBySlug(slug, query))); } catch (e) { emit(SubState.error(errorMessage: e.toString())); } diff --git a/lib/features/profile/presentation/pages/subs_screen.dart b/lib/features/profile/presentation/pages/subs_screen.dart index 2b923dc0..82a9b166 100644 --- a/lib/features/profile/presentation/pages/subs_screen.dart +++ b/lib/features/profile/presentation/pages/subs_screen.dart @@ -1,8 +1,10 @@ +import 'package:easy_debounce/easy_debounce.dart'; import 'package:eatvio_app/core/locator_service.dart'; import 'package:eatvio_app/core/widgets/loader.dart'; import 'package:eatvio_app/features/profile/presentation/bloc/sub_cubit/sub_cubit.dart'; import 'package:eatvio_app/features/profile/presentation/bloc/sub_cubit/sub_state.dart'; import 'package:eatvio_app/features/profile/presentation/widgets/sub_widget.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; @@ -39,6 +41,33 @@ class _SubsScreenState extends State { builder: (BuildContext context, SubState state) { return Scaffold( appBar: AppBar( + bottom: PreferredSize( + preferredSize: Size(MediaQuery.of(context).size.width, 40), + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), + child: CupertinoSearchTextField( + prefixIcon: Icon(Icons.search), + placeholder: 'Поиск', + onChanged: (query) { + if (query.length > 2) { + EasyDebounce.debounce( + 'searchSubs', + Duration(milliseconds: 300), + () { + widget.subType == SubType.Subscriptions + ? (context.read().getSubscriptions(widget.slug, query)) + : (context.read().getSubscribers(widget.slug, query)); + }, + ); + } else { + widget.subType == SubType.Subscriptions + ? (context.read().getSubscriptions(widget.slug)) + : (context.read().getSubscribers(widget.slug)); + } + }, + ), + ), + ), title: Text( widget.subType == SubType.Subscriptions ? 'Подписки' : 'Подписчики', ), diff --git a/lib/features/profile/repositories/profile_repository.dart b/lib/features/profile/repositories/profile_repository.dart index 5432c3b8..022a768e 100644 --- a/lib/features/profile/repositories/profile_repository.dart +++ b/lib/features/profile/repositories/profile_repository.dart @@ -114,17 +114,17 @@ class ProfileRepository { } } - Future> getSubscribersBySlug(String slug) async { + Future> getSubscribersBySlug(String slug, [String? query]) async { try { - return (await profileService.getSubscribers(slug: slug)).data; + return (await profileService.getSubscribers(slug: slug, query: query)).data; } catch (e) { rethrow; } } - Future> getSubscriptionsBySlug(String slug) async { + Future> getSubscriptionsBySlug(String slug, [String? query]) async { try { - return (await profileService.getSubscriptions(slug: slug)).data; + return (await profileService.getSubscriptions(slug: slug, query: query)).data; } catch (e) { rethrow; } diff --git a/lib/features/profile/services/profile_service.dart b/lib/features/profile/services/profile_service.dart index 477a1aa0..1665d9e0 100644 --- a/lib/features/profile/services/profile_service.dart +++ b/lib/features/profile/services/profile_service.dart @@ -64,11 +64,13 @@ abstract class ProfileService { @GET('/api/profile/{slug}/subscribers') Future getSubscribers({ @Path() required String slug, + @Query('filters[name][\$startsWith]') String? query, }); @GET('/api/profile/{slug}/subscriptions') Future getSubscriptions({ @Path() required String slug, + @Query('filters[name][\$startsWith]') String? query, }); @POST('/api/profile/subscribe/{slug}') diff --git a/lib/features/profile/services/profile_service.g.dart b/lib/features/profile/services/profile_service.g.dart index f43fbfe2..366ab7de 100644 --- a/lib/features/profile/services/profile_service.g.dart +++ b/lib/features/profile/services/profile_service.g.dart @@ -377,9 +377,15 @@ class _ProfileService implements ProfileService { } @override - Future getSubscribers({required String slug}) async { + Future getSubscribers({ + required String slug, + String? query, + }) async { final _extra = {}; - final queryParameters = {}; + final queryParameters = { + r'filters[name][$startsWith]': query + }; + queryParameters.removeWhere((k, v) => v == null); final _headers = {}; const Map? _data = null; final _options = _setStreamType(Options( @@ -410,9 +416,15 @@ class _ProfileService implements ProfileService { } @override - Future getSubscriptions({required String slug}) async { + Future getSubscriptions({ + required String slug, + String? query, + }) async { final _extra = {}; - final queryParameters = {}; + final queryParameters = { + r'filters[name][$startsWith]': query + }; + queryParameters.removeWhere((k, v) => v == null); final _headers = {}; const Map? _data = null; final _options = _setStreamType(Options(