diff --git a/lib/base/enums/search_type.dart b/lib/base/enums/search_type.dart new file mode 100644 index 00000000..a2568e2b --- /dev/null +++ b/lib/base/enums/search_type.dart @@ -0,0 +1,5 @@ +enum SearchType { + general, + room, + person; +} diff --git a/lib/base/routing/router.dart b/lib/base/routing/router.dart index 172eac3d..0aa853e4 100644 --- a/lib/base/routing/router.dart +++ b/lib/base/routing/router.dart @@ -1,4 +1,5 @@ import 'package:campus_flutter/base/enums/campus.dart'; +import 'package:campus_flutter/base/enums/search_type.dart'; import 'package:campus_flutter/base/util/fullscreen_image_view.dart'; import 'package:campus_flutter/base/routing/router_service.dart'; import 'package:campus_flutter/base/routing/routes.dart'; @@ -31,8 +32,8 @@ import 'package:campus_flutter/placesComponent/views/campuses/campus_scaffold.da import 'package:campus_flutter/placesComponent/views/places_screen.dart'; import 'package:campus_flutter/placesComponent/views/studyGroups/study_room_group_scaffold.dart'; import 'package:campus_flutter/placesComponent/views/studyGroups/study_rooms_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_scaffold.dart'; -import 'package:campus_flutter/searchComponent/views/personRoomSearch/search_view.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/views/search_scaffold.dart'; import 'package:campus_flutter/settingsComponent/views/settings_scaffold.dart'; import 'package:campus_flutter/studiesComponent/model/lecture.dart'; import 'package:campus_flutter/studiesComponent/screen/studies_screen.dart'; @@ -220,7 +221,22 @@ final _router = GoRouter( ), GoRoute( path: search, - builder: (context, state) => const SearchScaffold(), + builder: (context, state) => SearchScaffold( + viewModel: + searchViewModel((SearchType.general, state.extra as String?)), + ), + ), + GoRoute( + path: roomSearch, + builder: (context, state) => SearchScaffold( + viewModel: searchViewModel((SearchType.room, state.extra as String?)), + ), + ), + GoRoute( + path: personSearch, + builder: (context, state) => SearchScaffold( + viewModel: searchViewModel((SearchType.person, state.extra as String?)), + ), ), GoRoute( path: studyRoom, @@ -244,16 +260,6 @@ final _router = GoRouter( imageData: state.extra as String, ), ), - GoRoute( - path: roomSearch, - builder: (context, state) { - final data = state.extra as (String?, bool?); - return PersonRoomSearchScaffold( - searchString: data.$1, - isRoomSearch: data.$2 ?? true, - ); - }, - ), GoRoute( path: eventCreation, builder: (context, state) => EventCreationScaffold( diff --git a/lib/base/routing/routes.dart b/lib/base/routing/routes.dart index 94964b7d..60700284 100644 --- a/lib/base/routing/routes.dart +++ b/lib/base/routing/routes.dart @@ -37,12 +37,15 @@ const menuSettings = "/menu+settings"; const feedback = "$menuSettings/feedback"; const feedbackSuccess = "$feedback/success"; -/// General +/// Search const search = "/search"; +const roomSearch = "/roomSearch"; +const personSearch = "/personSearch"; + +/// General const navigaTum = "/navigaTum"; const personDetails = "/personDetails"; const cafeteria = "/cafeteria"; const studyRoom = "/studyRoom"; const networkImage = "/networkImage"; const localeImage = "/localeImage"; -const roomSearch = "/roomSearch"; diff --git a/lib/base/util/custom_back_button.dart b/lib/base/util/custom_back_button.dart index 13e7e0f8..8adbc7d7 100644 --- a/lib/base/util/custom_back_button.dart +++ b/lib/base/util/custom_back_button.dart @@ -5,18 +5,30 @@ import 'package:go_router/go_router.dart'; class CustomBackButton extends StatelessWidget { const CustomBackButton({ super.key, + this.beforeOnPressed, this.onPressed, this.color, }); final Function()? onPressed; + final Function()? beforeOnPressed; final Color? color; @override Widget build(BuildContext context) { return BackButton( color: color, - onPressed: onPressed ?? () => defaultOnPressed(context), + onPressed: () { + if (beforeOnPressed != null) { + beforeOnPressed!(); + } + + if (onPressed != null) { + onPressed!(); + } else { + defaultOnPressed(context); + } + }, ); } diff --git a/lib/navigaTumComponent/viewModels/navigatum_search_viewmodel.dart b/lib/navigaTumComponent/viewModels/navigatum_search_viewmodel.dart index a46c6491..b6440ce4 100644 --- a/lib/navigaTumComponent/viewModels/navigatum_search_viewmodel.dart +++ b/lib/navigaTumComponent/viewModels/navigatum_search_viewmodel.dart @@ -1,6 +1,6 @@ import 'package:campus_flutter/navigaTumComponent/model/navigatum_navigation_entity.dart'; import 'package:campus_flutter/navigaTumComponent/services/navigatum_search_service.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:collection/collection.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; @@ -8,7 +8,7 @@ import 'package:rxdart/rxdart.dart'; final navigaTumSearchViewModel = Provider((ref) => NavigaTumSearchViewModel()); class NavigaTumSearchViewModel - implements SearchViewModel { + implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/navigation_service.dart b/lib/navigation_service.dart index ebd21369..2a2c159d 100644 --- a/lib/navigation_service.dart +++ b/lib/navigation_service.dart @@ -1,11 +1,12 @@ import 'dart:io'; import 'package:campus_flutter/base/enums/credentials.dart'; +import 'package:campus_flutter/base/enums/search_type.dart'; import 'package:campus_flutter/base/routing/routes.dart'; import 'package:campus_flutter/homeComponent/view/widget/widget_screen.dart'; import 'package:campus_flutter/main.dart'; import 'package:campus_flutter/onboardingComponent/viewModels/onboarding_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/viewModels/global_search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/studentCardComponent/views/student_card_view.dart'; import 'package:campus_flutter/base/extensions/context.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -81,7 +82,9 @@ class NavigationService { Widget searchButton(int currentIndex, WidgetRef ref, BuildContext context) { return IconButton( onPressed: () { - ref.read(searchViewModel).setSearchCategories(currentIndex); + ref + .read(searchViewModel((SearchType.general, null))) + .setSearchCategories(currentIndex); context.push(search); }, icon: const Icon(Icons.search), diff --git a/lib/searchComponent/protocols/search_viewmodel.dart b/lib/searchComponent/protocols/category_search_viewmodel.dart similarity index 72% rename from lib/searchComponent/protocols/search_viewmodel.dart rename to lib/searchComponent/protocols/category_search_viewmodel.dart index 471b8390..fe5f7a46 100644 --- a/lib/searchComponent/protocols/search_viewmodel.dart +++ b/lib/searchComponent/protocols/category_search_viewmodel.dart @@ -1,6 +1,6 @@ import 'package:campus_flutter/searchComponent/protocols/searchable.dart'; import 'package:rxdart/rxdart.dart'; -abstract class SearchViewModel { +abstract class CategorySearchViewModel { late BehaviorSubject?> searchResults; } diff --git a/lib/searchComponent/viewModels/global_search_viewmodel.dart b/lib/searchComponent/viewModels/search_viewmodel.dart similarity index 62% rename from lib/searchComponent/viewModels/global_search_viewmodel.dart rename to lib/searchComponent/viewModels/search_viewmodel.dart index 38dc993e..eda2f3cf 100644 --- a/lib/searchComponent/viewModels/global_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/search_viewmodel.dart @@ -1,5 +1,6 @@ import 'package:campus_flutter/base/enums/credentials.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; +import 'package:campus_flutter/base/enums/search_type.dart'; import 'package:campus_flutter/onboardingComponent/viewModels/onboarding_viewmodel.dart'; import 'package:campus_flutter/navigaTumComponent/viewModels/navigatum_search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/person_search_viewmodel.dart'; @@ -12,30 +13,55 @@ import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/n import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/personal_lecture_seach_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/student_club_search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/study_room_search_viewmodel.dart'; +import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; -final searchViewModel = Provider((ref) => GlobalSearchViewModel(ref)); +final searchViewModel = Provider.family( + (ref, data) => data.$2 != null + ? SearchViewModel(ref, searchType: data.$1, searchString: data.$2!) + : SearchViewModel(ref, searchType: data.$1), +); -class GlobalSearchViewModel { +class SearchViewModel { BehaviorSubject?> result = BehaviorSubject.seeded(null); BehaviorSubject> selectedCategories = BehaviorSubject.seeded([]); - String searchString = ""; + late final TextEditingController searchTextController; + final SearchType searchType; + final Ref ref; bool isAuthorized = false; - final Ref ref; + SearchViewModel( + this.ref, { + required this.searchType, + String? searchString, + }) { + searchTextController = TextEditingController(text: searchString); + selectedCategories.add(_initialSearchCategories()); + triggerSearchAfterUpdate(); + } - GlobalSearchViewModel(this.ref); + _initialSearchCategories() { + switch (searchType) { + case SearchType.general: + return []; + case SearchType.room: + return [SearchCategory.rooms, SearchCategory.studyRoom]; + case SearchType.person: + return [SearchCategory.persons]; + } + } - void search(String searchString) async { + void _search() async { + final searchString = searchTextController.text; if (searchString.isEmpty) { clear(); return; } - this.searchString = searchString; + searchTextController.text = searchString; if (selectedCategories.value.isEmpty) { if (ref.read(onboardingViewModel).credentials.value == Credentials.tumId) { @@ -63,29 +89,26 @@ class GlobalSearchViewModel { } void clear() { - searchString = ""; + searchTextController.clear(); result.add(null); } - void triggerSearchAfterUpdate(String? searchString) { - if (searchString != null) { - this.searchString = searchString; - } - search(this.searchString); + void triggerSearchAfterUpdate() { + _search(); if (selectedCategories.value.isEmpty) { for (var category in SearchCategory.values) { if (isAuthorized) { - _authorizedSearchTriggerBuilder(searchString, category); + _authorizedSearchTriggerBuilder(category); } else { - _unauthorizedSearchTriggerBuilder(searchString, category); + _unauthorizedSearchTriggerBuilder(category); } } } else { for (var selectedCategory in selectedCategories.value) { if (isAuthorized) { - _authorizedSearchTriggerBuilder(searchString, selectedCategory); + _authorizedSearchTriggerBuilder(selectedCategory); } else { - _unauthorizedSearchTriggerBuilder(searchString, selectedCategory); + _unauthorizedSearchTriggerBuilder(selectedCategory); } } } @@ -130,77 +153,57 @@ class GlobalSearchViewModel { } } - void _authorizedSearchTriggerBuilder( - String? searchString, - SearchCategory searchCategory, - ) { + void _authorizedSearchTriggerBuilder(SearchCategory searchCategory) { + final searchString = searchTextController.text; switch (searchCategory) { case SearchCategory.grade: - ref.read(gradesSearchViewModel).gradesSearch(query: this.searchString); + ref.read(gradesSearchViewModel).gradesSearch(query: searchString); case SearchCategory.cafeterias: - ref - .read(cafeteriaSearchViewModel) - .cafeteriaSearch(query: this.searchString); + ref.read(cafeteriaSearchViewModel).cafeteriaSearch(query: searchString); case SearchCategory.calendar: - ref - .read(calendarSearchViewModel) - .calendarSearch(query: this.searchString); + ref.read(calendarSearchViewModel).calendarSearch(query: searchString); case SearchCategory.movie: - ref.read(movieSearchViewModel).movieSearch(query: this.searchString); + ref.read(movieSearchViewModel).movieSearch(query: searchString); case SearchCategory.news: - ref.read(newsSearchViewModel).newsSearch(query: this.searchString); + ref.read(newsSearchViewModel).newsSearch(query: searchString); case SearchCategory.studentClub: ref .read(studentClubSearchViewModel) - .studentClubSearch(query: this.searchString); + .studentClubSearch(query: searchString); case SearchCategory.studyRoom: - ref - .read(studyRoomSearchViewModel) - .studyRoomSearch(query: this.searchString); + ref.read(studyRoomSearchViewModel).studyRoomSearch(query: searchString); case SearchCategory.lectures: - ref - .read(lectureSearchViewModel) - .lectureSearch(query: this.searchString); + ref.read(lectureSearchViewModel).lectureSearch(query: searchString); case SearchCategory.personalLectures: ref .read(personalLectureSearchViewModel) - .personalLectureSearch(query: this.searchString); + .personalLectureSearch(query: searchString); case SearchCategory.persons: - ref.read(personSearchViewModel).personSearch(query: this.searchString); + ref.read(personSearchViewModel).personSearch(query: searchString); case SearchCategory.rooms: - ref - .read(navigaTumSearchViewModel) - .navigaTumSearch(query: this.searchString); + ref.read(navigaTumSearchViewModel).navigaTumSearch(query: searchString); default: return; } } - void _unauthorizedSearchTriggerBuilder( - String? searchString, - SearchCategory searchCategory, - ) { + void _unauthorizedSearchTriggerBuilder(SearchCategory searchCategory) { + final searchString = searchTextController.text; switch (searchCategory) { case SearchCategory.cafeterias: - ref - .read(cafeteriaSearchViewModel) - .cafeteriaSearch(query: this.searchString); + ref.read(cafeteriaSearchViewModel).cafeteriaSearch(query: searchString); case SearchCategory.movie: - ref.read(movieSearchViewModel).movieSearch(query: this.searchString); + ref.read(movieSearchViewModel).movieSearch(query: searchString); case SearchCategory.news: - ref.read(newsSearchViewModel).newsSearch(query: this.searchString); + ref.read(newsSearchViewModel).newsSearch(query: searchString); case SearchCategory.studentClub: ref .read(studentClubSearchViewModel) - .studentClubSearch(query: this.searchString); + .studentClubSearch(query: searchString); case SearchCategory.studyRoom: - ref - .read(studyRoomSearchViewModel) - .studyRoomSearch(query: this.searchString); + ref.read(studyRoomSearchViewModel).studyRoomSearch(query: searchString); case SearchCategory.rooms: - ref - .read(navigaTumSearchViewModel) - .navigaTumSearch(query: this.searchString); + ref.read(navigaTumSearchViewModel).navigaTumSearch(query: searchString); default: return; } diff --git a/lib/searchComponent/viewModels/searchableViewModels/cafeteria_search_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/cafeteria_search_viewmodel.dart index 366f4608..6fc90a55 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/cafeteria_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/cafeteria_search_viewmodel.dart @@ -2,13 +2,13 @@ import 'package:campus_flutter/placesComponent/model/cafeterias/cafeteria.dart'; import 'package:campus_flutter/placesComponent/services/cafeterias_service.dart'; import 'package:campus_flutter/searchComponent/model/search_exception.dart'; import 'package:campus_flutter/searchComponent/protocols/global_search.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; final cafeteriaSearchViewModel = Provider((ref) => CafeteriaSearchViewModel()); -class CafeteriaSearchViewModel implements SearchViewModel { +class CafeteriaSearchViewModel implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/viewModels/searchableViewModels/calendar_search_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/calendar_search_viewmodel.dart index 03c13b04..cb34da7d 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/calendar_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/calendar_search_viewmodel.dart @@ -2,13 +2,14 @@ import 'package:campus_flutter/calendarComponent/model/calendar_event.dart'; import 'package:campus_flutter/calendarComponent/services/calendar_service.dart'; import 'package:campus_flutter/searchComponent/model/search_exception.dart'; import 'package:campus_flutter/searchComponent/protocols/global_search.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; final calendarSearchViewModel = Provider((ref) => CalendarSearchViewModel()); -class CalendarSearchViewModel implements SearchViewModel { +class CalendarSearchViewModel + implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/viewModels/searchableViewModels/grades_search_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/grades_search_viewmodel.dart index 05679f81..5fa8c8c0 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/grades_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/grades_search_viewmodel.dart @@ -2,13 +2,13 @@ import 'package:campus_flutter/studiesComponent/model/grade.dart'; import 'package:campus_flutter/studiesComponent/service/grade_service.dart'; import 'package:campus_flutter/searchComponent/model/search_exception.dart'; import 'package:campus_flutter/searchComponent/protocols/global_search.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; final gradesSearchViewModel = Provider((ref) => GradesSearchViewModel()); -class GradesSearchViewModel implements SearchViewModel { +class GradesSearchViewModel implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/viewModels/searchableViewModels/lecture_search_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/lecture_search_viewmodel.dart index 213aba2f..b34b831e 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/lecture_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/lecture_search_viewmodel.dart @@ -2,13 +2,13 @@ import 'package:campus_flutter/studiesComponent/model/lecture.dart'; import 'package:campus_flutter/studiesComponent/service/lecture_search_service.dart'; import 'package:campus_flutter/searchComponent/model/search_exception.dart'; import 'package:campus_flutter/searchComponent/protocols/global_search.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; final lectureSearchViewModel = Provider((ref) => LectureSearchViewModel()); -class LectureSearchViewModel implements SearchViewModel { +class LectureSearchViewModel implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/viewModels/searchableViewModels/movie_search_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/movie_search_viewmodel.dart index 844016bf..f5e60eb9 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/movie_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/movie_search_viewmodel.dart @@ -3,14 +3,14 @@ import 'package:campus_flutter/campusComponent/service/movie_service.dart'; import 'package:campus_flutter/searchComponent/model/comparison_token.dart'; import 'package:campus_flutter/searchComponent/model/search_exception.dart'; import 'package:campus_flutter/searchComponent/protocols/global_search.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/protocols/searchable.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; final movieSearchViewModel = Provider((ref) => MovieSearchViewModel()); -class MovieSearchViewModel implements SearchViewModel { +class MovieSearchViewModel implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/viewModels/searchableViewModels/news_search_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/news_search_viewmodel.dart index bc2e16a9..2cd1dbb9 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/news_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/news_search_viewmodel.dart @@ -3,14 +3,14 @@ import 'package:campus_flutter/campusComponent/service/news_service.dart'; import 'package:campus_flutter/searchComponent/model/comparison_token.dart'; import 'package:campus_flutter/searchComponent/model/search_exception.dart'; import 'package:campus_flutter/searchComponent/protocols/global_search.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/protocols/searchable.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; final newsSearchViewModel = Provider((ref) => NewsSearchViewModel()); -class NewsSearchViewModel implements SearchViewModel { +class NewsSearchViewModel implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/viewModels/searchableViewModels/person_search_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/person_search_viewmodel.dart index 9ce5703f..c5378157 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/person_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/person_search_viewmodel.dart @@ -1,12 +1,12 @@ import 'package:campus_flutter/personComponent/model/personSearch/person.dart'; import 'package:campus_flutter/personComponent/services/person_search_service.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; final personSearchViewModel = Provider((ref) => PersonSearchViewModel()); -class PersonSearchViewModel implements SearchViewModel { +class PersonSearchViewModel implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/viewModels/searchableViewModels/personal_lecture_seach_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/personal_lecture_seach_viewmodel.dart index c3fcd3bd..e34dd68a 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/personal_lecture_seach_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/personal_lecture_seach_viewmodel.dart @@ -2,14 +2,15 @@ import 'package:campus_flutter/studiesComponent/model/lecture.dart'; import 'package:campus_flutter/studiesComponent/service/lecture_service.dart'; import 'package:campus_flutter/searchComponent/model/search_exception.dart'; import 'package:campus_flutter/searchComponent/protocols/global_search.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; final personalLectureSearchViewModel = Provider((ref) => PersonalLectureSearchViewModel()); -class PersonalLectureSearchViewModel implements SearchViewModel { +class PersonalLectureSearchViewModel + implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/viewModels/searchableViewModels/student_club_search_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/student_club_search_viewmodel.dart index 97ab6377..7a307ee5 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/student_club_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/student_club_search_viewmodel.dart @@ -3,7 +3,7 @@ import 'package:campus_flutter/campusComponent/service/student_club_service.dart import 'package:campus_flutter/searchComponent/model/comparison_token.dart'; import 'package:campus_flutter/searchComponent/model/search_exception.dart'; import 'package:campus_flutter/searchComponent/protocols/global_search.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/protocols/searchable.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:rxdart/rxdart.dart'; @@ -11,7 +11,8 @@ import 'package:rxdart/rxdart.dart'; final studentClubSearchViewModel = Provider((ref) => StudentClubSearchViewModel()); -class StudentClubSearchViewModel implements SearchViewModel { +class StudentClubSearchViewModel + implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/viewModels/searchableViewModels/study_room_search_viewmodel.dart b/lib/searchComponent/viewModels/searchableViewModels/study_room_search_viewmodel.dart index 4cdd414c..8fdae6f9 100644 --- a/lib/searchComponent/viewModels/searchableViewModels/study_room_search_viewmodel.dart +++ b/lib/searchComponent/viewModels/searchableViewModels/study_room_search_viewmodel.dart @@ -5,7 +5,7 @@ import 'package:campus_flutter/placesComponent/services/study_rooms_service.dart import 'package:campus_flutter/searchComponent/model/comparison_token.dart'; import 'package:campus_flutter/searchComponent/model/search_exception.dart'; import 'package:campus_flutter/searchComponent/protocols/global_search.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/protocols/searchable.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:json_annotation/json_annotation.dart'; @@ -14,7 +14,7 @@ import 'package:rxdart/rxdart.dart'; final studyRoomSearchViewModel = Provider((ref) => StudyRoomSearchViewModel()); class StudyRoomSearchViewModel - implements SearchViewModel { + implements CategorySearchViewModel { @override BehaviorSubject?> searchResults = BehaviorSubject.seeded(null); diff --git a/lib/searchComponent/views/appWideSearch/search_result_view_builder.dart b/lib/searchComponent/views/appWideSearch/search_result_view_builder.dart deleted file mode 100644 index b7f32f17..00000000 --- a/lib/searchComponent/views/appWideSearch/search_result_view_builder.dart +++ /dev/null @@ -1,49 +0,0 @@ -import 'package:campus_flutter/base/enums/search_category.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/cafeteria_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/calendar_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/grade_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/lecture_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/movie_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/navigatum_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/news_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/person_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/personal_lecture_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/student_club_search_result_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/resultViews/study_room_search_result_view.dart'; -import 'package:flutter/material.dart'; - -class SearchResultViewBuilder extends StatelessWidget { - const SearchResultViewBuilder(this.searchCategory, {super.key}); - - final SearchCategory searchCategory; - - @override - Widget build(BuildContext context) { - switch (searchCategory) { - case SearchCategory.grade: - return const GradeSearchResultView(); - case SearchCategory.cafeterias: - return const CafeteriasSearchResultView(); - case SearchCategory.calendar: - return const CalendarSearchResultView(); - case SearchCategory.movie: - return const MovieSearchResultView(); - case SearchCategory.news: - return const NewsSearchResultView(); - case SearchCategory.studentClub: - return const StudentClubSearchResultView(); - case SearchCategory.studyRoom: - return const StudyRoomSearchResultView(); - case SearchCategory.lectures: - return const LectureSearchResultView(); - case SearchCategory.personalLectures: - return const PersonalLectureSearchResultView(); - case SearchCategory.persons: - return const PersonSearchResultView(); - case SearchCategory.rooms: - return const NavigaTumSearchResultView(); - default: - return Container(); - } - } -} diff --git a/lib/searchComponent/views/appWideSearch/search_scaffold.dart b/lib/searchComponent/views/appWideSearch/search_scaffold.dart deleted file mode 100644 index 9f89365d..00000000 --- a/lib/searchComponent/views/appWideSearch/search_scaffold.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:campus_flutter/base/util/custom_back_button.dart'; -import 'package:campus_flutter/searchComponent/viewModels/global_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_view.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; - -class SearchScaffold extends ConsumerWidget { - const SearchScaffold({super.key}); - - @override - Widget build(BuildContext context, WidgetRef ref) { - return Scaffold( - appBar: AppBar( - title: Text(context.tr("search")), - leading: CustomBackButton( - onPressed: () { - ref.read(searchViewModel).clear(); - context.pop(); - }, - ), - ), - body: SearchView(showContent: true), - ); - } -} diff --git a/lib/searchComponent/views/personRoomSearch/search_view.dart b/lib/searchComponent/views/personRoomSearch/search_view.dart deleted file mode 100644 index 37d1c35d..00000000 --- a/lib/searchComponent/views/personRoomSearch/search_view.dart +++ /dev/null @@ -1,229 +0,0 @@ -import 'package:campus_flutter/base/enums/error_handling_view_type.dart'; -import 'package:campus_flutter/base/errorHandling/error_handling_router.dart'; -import 'package:campus_flutter/base/util/custom_back_button.dart'; -import 'package:campus_flutter/base/util/delayed_loading_indicator.dart'; -import 'package:campus_flutter/base/routing/routes.dart'; -import 'package:campus_flutter/base/util/seperated_list.dart'; -import 'package:campus_flutter/navigaTumComponent/model/navigatum_navigation_entity.dart'; -import 'package:campus_flutter/navigaTumComponent/viewModels/navigatum_search_viewmodel.dart'; -import 'package:campus_flutter/personComponent/model/personSearch/person.dart'; -import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/person_search_viewmodel.dart'; -import 'package:campus_flutter/base/extensions/context.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:go_router/go_router.dart'; - -class PersonRoomSearchScaffold extends ConsumerWidget { - const PersonRoomSearchScaffold({ - super.key, - this.searchString, - this.isRoomSearch = true, - }); - - final bool isRoomSearch; - final String? searchString; - - @override - Widget build(BuildContext context, WidgetRef ref) { - return Scaffold( - appBar: AppBar( - leading: CustomBackButton( - onPressed: () { - context.canPop() ? context.pop() : context.go(search); - if (isRoomSearch) { - ref.read(navigaTumSearchViewModel).searchResults.add([]); - } else { - ref.read(personSearchViewModel).searchResults.add([]); - } - }, - ), - title: Text( - isRoomSearch ? context.tr("roomSearch") : context.tr("personSearch"), - ), - ), - body: PersonRoomSearchView( - searchString: searchString, - isRoomSearch: isRoomSearch, - ), - ); - } -} - -class PersonRoomSearchView extends ConsumerStatefulWidget { - const PersonRoomSearchView({ - super.key, - this.searchString, - required this.isRoomSearch, - }); - - final bool isRoomSearch; - final String? searchString; - - @override - ConsumerState createState() => _SearchViewState(); -} - -class _SearchViewState extends ConsumerState { - final TextEditingController textEditingController = TextEditingController(); - - bool showClearButton = false; - - @override - void initState() { - if (widget.searchString != null) { - if (widget.isRoomSearch) { - ref - .read(navigaTumSearchViewModel) - .navigaTumSearch(query: widget.searchString!); - } else { - ref - .read(personSearchViewModel) - .personSearch(query: widget.searchString!); - } - setState(() { - textEditingController.text = widget.searchString!; - }); - } - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Column( - children: [ - _textField(), - Padding(padding: EdgeInsets.symmetric(vertical: context.halfPadding)), - _searchBody(), - ], - ); - } - - Widget _textField() { - return Padding( - padding: EdgeInsets.symmetric(horizontal: context.padding), - child: TextField( - controller: textEditingController, - onChanged: (searchString) { - setState(() { - showClearButton = searchString.isNotEmpty; - }); - if (widget.isRoomSearch) { - if (searchString.isNotEmpty) { - ref - .read(navigaTumSearchViewModel) - .navigaTumSearch(query: searchString); - } else { - ref.read(navigaTumSearchViewModel).searchResults.add(null); - } - } else { - if (searchString.isNotEmpty) { - ref.read(personSearchViewModel).personSearch(query: searchString); - } else { - ref.read(navigaTumSearchViewModel).searchResults.add(null); - } - } - }, - decoration: InputDecoration( - hintText: context.tr("search"), - suffixIcon: showClearButton - ? GestureDetector( - onTap: () { - setState(() { - textEditingController.text = ""; - showClearButton = false; - }); - if (widget.isRoomSearch) { - ref - .read(navigaTumSearchViewModel) - .searchResults - .add(null); - } else { - ref - .read(navigaTumSearchViewModel) - .searchResults - .add(null); - } - }, - child: const Icon(Icons.clear), - ) - : null, - ), - onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), - ), - ); - } - - Widget _searchBody() { - return StreamBuilder( - stream: widget.isRoomSearch - ? ref.watch(navigaTumSearchViewModel).searchResults - : ref.watch(personSearchViewModel).searchResults, - builder: (context, snapshot) { - if (snapshot.hasData) { - return Expanded( - child: SingleChildScrollView( - child: Card( - child: SeparatedList.list( - data: snapshot.data!, - tile: (searchable) { - if (widget.isRoomSearch) { - final navigaTumEntity = - searchable as NavigaTumNavigationEntity; - return ListTile( - title: Text(navigaTumEntity.getFormattedName()), - subtitle: Text( - navigaTumEntity.getFormattedSubtext(), - maxLines: 1, - overflow: TextOverflow.ellipsis, - ), - trailing: const Icon(Icons.arrow_forward_ios, size: 15), - onTap: () => - context.push(navigaTum, extra: navigaTumEntity.id), - ); - } else { - final person = searchable as Person; - return ListTile( - title: Text(person.fullNameWithTitle), - trailing: const Icon(Icons.arrow_forward_ios, size: 15), - onTap: () => context.push( - personDetails, - extra: person.obfuscatedID, - ), - ); - } - }, - ), - ), - ), - ); - } else if (snapshot.hasError) { - return Expanded( - child: ErrorHandlingRouter( - error: snapshot.error!, - errorHandlingViewType: ErrorHandlingViewType.textOnly, - ), - ); - } else { - if (widget.searchString != null) { - return Expanded( - child: Center( - child: DelayedLoadingIndicator( - name: widget.isRoomSearch - ? context.tr("rooms") - : context.tr("persons"), - ), - ), - ); - } else { - return Expanded( - child: Center( - child: Text(context.tr("enterQueryStart")), - ), - ); - } - } - }, - ); - } -} diff --git a/lib/searchComponent/views/appWideSearch/resultViews/cafeteria_search_result_view.dart b/lib/searchComponent/views/resultViews/cafeteria_search_result_view.dart similarity index 72% rename from lib/searchComponent/views/appWideSearch/resultViews/cafeteria_search_result_view.dart rename to lib/searchComponent/views/resultViews/cafeteria_search_result_view.dart index 8ee44025..04931e67 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/cafeteria_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/cafeteria_search_result_view.dart @@ -1,20 +1,24 @@ import 'package:campus_flutter/base/routing/routes.dart' as routes; import 'package:campus_flutter/placesComponent/model/cafeterias/cafeteria.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/cafeteria_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; class CafeteriasSearchResultView extends ConsumerWidget { - const CafeteriasSearchResultView({super.key}); + const CafeteriasSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.cafeterias, - viewModel: cafeteriaSearchViewModel, + viewModel: viewModel, + categoryViewModel: cafeteriaSearchViewModel, body: (cafeteria) => ListTile( title: Text(cafeteria.name), trailing: const Icon( diff --git a/lib/searchComponent/views/appWideSearch/resultViews/calendar_search_result_view.dart b/lib/searchComponent/views/resultViews/calendar_search_result_view.dart similarity index 83% rename from lib/searchComponent/views/appWideSearch/resultViews/calendar_search_result_view.dart rename to lib/searchComponent/views/resultViews/calendar_search_result_view.dart index f2fe3a0d..54dc9bd2 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/calendar_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/calendar_search_result_view.dart @@ -2,8 +2,9 @@ import 'package:campus_flutter/base/routing/routes.dart'; import 'package:campus_flutter/base/util/icon_text.dart'; import 'package:campus_flutter/calendarComponent/model/calendar_event.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/calendar_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:campus_flutter/base/extensions/context.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -11,13 +12,16 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; class CalendarSearchResultView extends ConsumerWidget { - const CalendarSearchResultView({super.key}); + const CalendarSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.calendar, - viewModel: calendarSearchViewModel, + viewModel: viewModel, + categoryViewModel: calendarSearchViewModel, body: (calendarEvent) => ListTile( title: Text(calendarEvent.title ?? "-"), subtitle: Column( diff --git a/lib/searchComponent/views/appWideSearch/resultViews/grade_search_result_view.dart b/lib/searchComponent/views/resultViews/grade_search_result_view.dart similarity index 66% rename from lib/searchComponent/views/appWideSearch/resultViews/grade_search_result_view.dart rename to lib/searchComponent/views/resultViews/grade_search_result_view.dart index d05c89f4..20feea6b 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/grade_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/grade_search_result_view.dart @@ -1,19 +1,23 @@ +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/studiesComponent/model/grade.dart'; import 'package:campus_flutter/studiesComponent/view/grade/grade_view.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/grades_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class GradeSearchResultView extends ConsumerWidget { - const GradeSearchResultView({super.key}); + const GradeSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.grade, - viewModel: gradesSearchViewModel, + viewModel: viewModel, + categoryViewModel: gradesSearchViewModel, body: (grade) => GradeRow(grade: grade), ); } diff --git a/lib/searchComponent/views/appWideSearch/resultViews/lecture_search_result_view.dart b/lib/searchComponent/views/resultViews/lecture_search_result_view.dart similarity index 68% rename from lib/searchComponent/views/appWideSearch/resultViews/lecture_search_result_view.dart rename to lib/searchComponent/views/resultViews/lecture_search_result_view.dart index 65198cb0..95b2baf2 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/lecture_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/lecture_search_result_view.dart @@ -1,19 +1,23 @@ +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/studiesComponent/model/lecture.dart'; import 'package:campus_flutter/studiesComponent/view/lecture/lecture_view.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/lecture_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class LectureSearchResultView extends ConsumerWidget { - const LectureSearchResultView({super.key}); + const LectureSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.lectures, - viewModel: lectureSearchViewModel, + viewModel: viewModel, + categoryViewModel: lectureSearchViewModel, body: (lecture) => LectureView( lecture: lecture, isSearch: true, diff --git a/lib/searchComponent/views/appWideSearch/resultViews/movie_search_result_view.dart b/lib/searchComponent/views/resultViews/movie_search_result_view.dart similarity index 82% rename from lib/searchComponent/views/appWideSearch/resultViews/movie_search_result_view.dart rename to lib/searchComponent/views/resultViews/movie_search_result_view.dart index 64de822e..187fdcdf 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/movie_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/movie_search_result_view.dart @@ -2,19 +2,23 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:campus_flutter/base/util/string_parser.dart'; import 'package:campus_flutter/base/util/url_launcher.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/movie_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class MovieSearchResultView extends ConsumerWidget { - const MovieSearchResultView({super.key}); + const MovieSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.movie, - viewModel: movieSearchViewModel, + viewModel: viewModel, + categoryViewModel: movieSearchViewModel, body: (movieSearch) => ListTile( leading: ClipRRect( borderRadius: BorderRadius.circular(5), diff --git a/lib/searchComponent/views/appWideSearch/resultViews/navigatum_search_result_view.dart b/lib/searchComponent/views/resultViews/navigatum_search_result_view.dart similarity index 73% rename from lib/searchComponent/views/appWideSearch/resultViews/navigatum_search_result_view.dart rename to lib/searchComponent/views/resultViews/navigatum_search_result_view.dart index e098bf5e..53bf920e 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/navigatum_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/navigatum_search_result_view.dart @@ -2,20 +2,24 @@ import 'package:campus_flutter/base/enums/search_category.dart'; import 'package:campus_flutter/base/routing/routes.dart'; import 'package:campus_flutter/navigaTumComponent/model/navigatum_navigation_entity.dart'; import 'package:campus_flutter/navigaTumComponent/viewModels/navigatum_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; class NavigaTumSearchResultView extends ConsumerWidget { - const NavigaTumSearchResultView({super.key}); + const NavigaTumSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.rooms, - viewModel: navigaTumSearchViewModel, + viewModel: viewModel, + categoryViewModel: navigaTumSearchViewModel, body: (entity) => ListTile( title: Text(entity.getFormattedName()), subtitle: Text(entity.getFormattedName()), diff --git a/lib/searchComponent/views/appWideSearch/resultViews/news_search_result_view.dart b/lib/searchComponent/views/resultViews/news_search_result_view.dart similarity index 85% rename from lib/searchComponent/views/appWideSearch/resultViews/news_search_result_view.dart rename to lib/searchComponent/views/resultViews/news_search_result_view.dart index 4f66e160..2d94e179 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/news_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/news_search_result_view.dart @@ -2,20 +2,24 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; import 'package:campus_flutter/base/util/string_parser.dart'; import 'package:campus_flutter/base/routing/routes.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/news_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; class NewsSearchResultView extends ConsumerWidget { - const NewsSearchResultView({super.key}); + const NewsSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.news, - viewModel: newsSearchViewModel, + viewModel: viewModel, + categoryViewModel: newsSearchViewModel, body: (newsSearch) { final imageUrl = newsSearch.news.imageUrl.toString().contains("src_1.png") diff --git a/lib/searchComponent/views/appWideSearch/resultViews/person_search_result_view.dart b/lib/searchComponent/views/resultViews/person_search_result_view.dart similarity index 72% rename from lib/searchComponent/views/appWideSearch/resultViews/person_search_result_view.dart rename to lib/searchComponent/views/resultViews/person_search_result_view.dart index e812eead..18f22e23 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/person_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/person_search_result_view.dart @@ -1,20 +1,24 @@ import 'package:campus_flutter/base/routing/routes.dart'; import 'package:campus_flutter/personComponent/model/personSearch/person.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/person_search_viewmodel.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; class PersonSearchResultView extends ConsumerWidget { - const PersonSearchResultView({super.key}); + const PersonSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.persons, - viewModel: personSearchViewModel, + viewModel: viewModel, + categoryViewModel: personSearchViewModel, body: (person) => ListTile( title: Text(person.fullNameWithTitle), trailing: const Icon( diff --git a/lib/searchComponent/views/appWideSearch/resultViews/personal_lecture_search_result_view.dart b/lib/searchComponent/views/resultViews/personal_lecture_search_result_view.dart similarity index 68% rename from lib/searchComponent/views/appWideSearch/resultViews/personal_lecture_search_result_view.dart rename to lib/searchComponent/views/resultViews/personal_lecture_search_result_view.dart index 532c4444..3a028ea2 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/personal_lecture_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/personal_lecture_search_result_view.dart @@ -1,19 +1,23 @@ +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/studiesComponent/model/lecture.dart'; import 'package:campus_flutter/studiesComponent/view/lecture/lecture_view.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/personal_lecture_seach_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class PersonalLectureSearchResultView extends ConsumerWidget { - const PersonalLectureSearchResultView({super.key}); + const PersonalLectureSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.personalLectures, - viewModel: personalLectureSearchViewModel, + viewModel: viewModel, + categoryViewModel: personalLectureSearchViewModel, body: (lecture) => LectureView( lecture: lecture, isSearch: true, diff --git a/lib/searchComponent/views/appWideSearch/resultViews/student_club_search_result_view.dart b/lib/searchComponent/views/resultViews/student_club_search_result_view.dart similarity index 86% rename from lib/searchComponent/views/appWideSearch/resultViews/student_club_search_result_view.dart rename to lib/searchComponent/views/resultViews/student_club_search_result_view.dart index 44b71497..1ce5a0a4 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/student_club_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/student_club_search_result_view.dart @@ -1,20 +1,24 @@ import 'package:cached_network_image/cached_network_image.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; import 'package:campus_flutter/base/util/url_launcher.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/student_club_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_svg/flutter_svg.dart'; class StudentClubSearchResultView extends ConsumerWidget { - const StudentClubSearchResultView({super.key}); + const StudentClubSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.studentClub, - viewModel: studentClubSearchViewModel, + viewModel: viewModel, + categoryViewModel: studentClubSearchViewModel, body: (studentClubSearch) { return ListTile( leading: image(studentClubSearch.studentClub.coverUrl), diff --git a/lib/searchComponent/views/appWideSearch/resultViews/study_room_search_result_view.dart b/lib/searchComponent/views/resultViews/study_room_search_result_view.dart similarity index 67% rename from lib/searchComponent/views/appWideSearch/resultViews/study_room_search_result_view.dart rename to lib/searchComponent/views/resultViews/study_room_search_result_view.dart index c6705300..a4c5aa3f 100644 --- a/lib/searchComponent/views/appWideSearch/resultViews/study_room_search_result_view.dart +++ b/lib/searchComponent/views/resultViews/study_room_search_result_view.dart @@ -1,19 +1,23 @@ import 'package:campus_flutter/placesComponent/views/homeWidget/study_room_widget_view.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/study_room_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_card_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_card_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class StudyRoomSearchResultView extends ConsumerWidget { - const StudyRoomSearchResultView({super.key}); + const StudyRoomSearchResultView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return SearchResultCardView( searchCategory: SearchCategory.studyRoom, - viewModel: studyRoomSearchViewModel, + viewModel: viewModel, + categoryViewModel: studyRoomSearchViewModel, body: (studyRoomSearchResult) => StudyRoomWidgetView(studyRoomSearchResult.studyRoomGroup), ); diff --git a/lib/searchComponent/views/appWideSearch/search_category_picker_view.dart b/lib/searchComponent/views/search_category_picker_view.dart similarity index 79% rename from lib/searchComponent/views/appWideSearch/search_category_picker_view.dart rename to lib/searchComponent/views/search_category_picker_view.dart index 00ac50a7..93681576 100644 --- a/lib/searchComponent/views/appWideSearch/search_category_picker_view.dart +++ b/lib/searchComponent/views/search_category_picker_view.dart @@ -2,17 +2,19 @@ import 'package:campus_flutter/base/enums/credentials.dart'; import 'package:campus_flutter/base/util/horizontal_slider.dart'; import 'package:campus_flutter/onboardingComponent/viewModels/onboarding_viewmodel.dart'; import 'package:campus_flutter/base/enums/search_category.dart'; -import 'package:campus_flutter/searchComponent/viewModels/global_search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class SearchCategoryPickerView extends ConsumerWidget { - const SearchCategoryPickerView({super.key}); + const SearchCategoryPickerView({super.key, required this.viewModel}); + + final Provider viewModel; @override Widget build(BuildContext context, WidgetRef ref) { return StreamBuilder( - stream: ref.watch(searchViewModel).selectedCategories, + stream: ref.watch(viewModel).selectedCategories, builder: (context, snapshot) { return Padding( padding: const EdgeInsets.symmetric(vertical: 10.0), @@ -21,8 +23,8 @@ class SearchCategoryPickerView extends ConsumerWidget { height: 40, child: (searchCategory) => InkWell( onLongPress: () { - ref.read(searchViewModel).selectSingleCategory(searchCategory); - ref.read(searchViewModel).triggerSearchAfterUpdate(null); + ref.read(viewModel).selectSingleCategory(searchCategory); + ref.read(viewModel).triggerSearchAfterUpdate(); }, child: FilterChip( label: Text( @@ -32,8 +34,8 @@ class SearchCategoryPickerView extends ConsumerWidget { ), ), onSelected: (selected) { - ref.read(searchViewModel).updateCategory(searchCategory); - ref.read(searchViewModel).triggerSearchAfterUpdate(null); + ref.read(viewModel).updateCategory(searchCategory); + ref.read(viewModel).triggerSearchAfterUpdate(); }, selected: (snapshot.data ?? []).isNotEmpty ? snapshot.data?.contains(searchCategory) ?? false diff --git a/lib/searchComponent/views/appWideSearch/search_result_card_view.dart b/lib/searchComponent/views/search_result_card_view.dart similarity index 86% rename from lib/searchComponent/views/appWideSearch/search_result_card_view.dart rename to lib/searchComponent/views/search_result_card_view.dart index 81395493..00e0f152 100644 --- a/lib/searchComponent/views/appWideSearch/search_result_card_view.dart +++ b/lib/searchComponent/views/search_result_card_view.dart @@ -5,24 +5,26 @@ import 'package:campus_flutter/base/extensions/context.dart'; import 'package:campus_flutter/base/util/delayed_loading_indicator.dart'; import 'package:campus_flutter/base/util/padded_divider.dart'; import 'package:campus_flutter/homeComponent/view/widget/widget_frame_view.dart'; -import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart'; import 'package:campus_flutter/searchComponent/protocols/searchable.dart'; -import 'package:campus_flutter/searchComponent/viewModels/global_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_details_view.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_details_view.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -class SearchResultCardView, S extends Searchable> - extends ConsumerWidget { +class SearchResultCardView, + S extends Searchable> extends ConsumerWidget { const SearchResultCardView({ super.key, - required this.searchCategory, required this.viewModel, + required this.categoryViewModel, + required this.searchCategory, required this.body, }); - final Provider> viewModel; + final Provider viewModel; + final Provider> categoryViewModel; final SearchCategory searchCategory; final Widget Function(S searchable) body; @@ -33,7 +35,9 @@ class SearchResultCardView, S extends Searchable> SearchCategoryExtension.localizedEnumTitle(searchCategory, context), child: Card( child: StreamBuilder( - stream: ref.watch>(viewModel).searchResults, + stream: ref + .watch>(categoryViewModel) + .searchResults, builder: (context, snapshot) { if (snapshot.hasData) { if (snapshot.data!.isEmpty) { @@ -102,8 +106,7 @@ class SearchResultCardView, S extends Searchable> } int _calculateItemLength(List? data, WidgetRef ref) { - final selectedCategories = - ref.read(searchViewModel).selectedCategories.value; + final selectedCategories = ref.read(viewModel).selectedCategories.value; if (selectedCategories.contains(searchCategory) && selectedCategories.length == 1) { return (data!.length >= 9 ? 9 : data.length) + 1; diff --git a/lib/searchComponent/views/appWideSearch/search_result_details_view.dart b/lib/searchComponent/views/search_result_details_view.dart similarity index 100% rename from lib/searchComponent/views/appWideSearch/search_result_details_view.dart rename to lib/searchComponent/views/search_result_details_view.dart diff --git a/lib/searchComponent/views/search_result_view_builder.dart b/lib/searchComponent/views/search_result_view_builder.dart new file mode 100644 index 00000000..861110f3 --- /dev/null +++ b/lib/searchComponent/views/search_result_view_builder.dart @@ -0,0 +1,56 @@ +import 'package:campus_flutter/base/enums/search_category.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/cafeteria_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/calendar_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/grade_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/lecture_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/movie_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/navigatum_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/news_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/person_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/personal_lecture_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/student_club_search_result_view.dart'; +import 'package:campus_flutter/searchComponent/views/resultViews/study_room_search_result_view.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class SearchResultViewBuilder extends StatelessWidget { + const SearchResultViewBuilder({ + super.key, + required this.viewModel, + required this.searchCategory, + }); + + final Provider viewModel; + final SearchCategory searchCategory; + + @override + Widget build(BuildContext context) { + switch (searchCategory) { + case SearchCategory.grade: + return GradeSearchResultView(viewModel: viewModel); + case SearchCategory.cafeterias: + return CafeteriasSearchResultView(viewModel: viewModel); + case SearchCategory.calendar: + return CalendarSearchResultView(viewModel: viewModel); + case SearchCategory.movie: + return MovieSearchResultView(viewModel: viewModel); + case SearchCategory.news: + return NewsSearchResultView(viewModel: viewModel); + case SearchCategory.studentClub: + return StudentClubSearchResultView(viewModel: viewModel); + case SearchCategory.studyRoom: + return StudyRoomSearchResultView(viewModel: viewModel); + case SearchCategory.lectures: + return LectureSearchResultView(viewModel: viewModel); + case SearchCategory.personalLectures: + return PersonalLectureSearchResultView(viewModel: viewModel); + case SearchCategory.persons: + return PersonSearchResultView(viewModel: viewModel); + case SearchCategory.rooms: + return NavigaTumSearchResultView(viewModel: viewModel); + default: + return Container(); + } + } +} diff --git a/lib/searchComponent/views/search_scaffold.dart b/lib/searchComponent/views/search_scaffold.dart new file mode 100644 index 00000000..b4f7f576 --- /dev/null +++ b/lib/searchComponent/views/search_scaffold.dart @@ -0,0 +1,29 @@ +import 'package:campus_flutter/base/enums/search_type.dart'; +import 'package:campus_flutter/base/util/custom_back_button.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/views/search_view.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +class SearchScaffold extends ConsumerWidget { + const SearchScaffold({super.key, required this.viewModel}); + + final Provider viewModel; + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + appBar: AppBar( + title: Text(context.tr("search")), + leading: CustomBackButton( + beforeOnPressed: (viewModel.argument as (SearchType, String?)).$1 == + SearchType.general + ? ref.read(viewModel).clear + : null, + ), + ), + body: SearchView(viewModel: viewModel, showContent: true), + ); + } +} diff --git a/lib/searchComponent/views/appWideSearch/search_textfield_view.dart b/lib/searchComponent/views/search_textfield_view.dart similarity index 67% rename from lib/searchComponent/views/appWideSearch/search_textfield_view.dart rename to lib/searchComponent/views/search_textfield_view.dart index 8a4d5379..f18286b9 100644 --- a/lib/searchComponent/views/appWideSearch/search_textfield_view.dart +++ b/lib/searchComponent/views/search_textfield_view.dart @@ -1,13 +1,16 @@ import 'package:campus_flutter/base/extensions/context.dart'; -import 'package:campus_flutter/searchComponent/viewModels/global_search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; class SearchTextField extends ConsumerStatefulWidget { - const SearchTextField({super.key, required this.textEditingController}); + const SearchTextField({ + super.key, + required this.viewModel, + }); - final TextEditingController textEditingController; + final Provider viewModel; @override ConsumerState createState() => @@ -22,11 +25,16 @@ class _SearchTextFieldState extends ConsumerState { return Padding( padding: EdgeInsets.symmetric(horizontal: context.padding), child: TextField( - controller: widget.textEditingController, + controller: ref.watch(widget.viewModel).searchTextController, onChanged: (searchString) { - ref.read(searchViewModel).triggerSearchAfterUpdate(searchString); + ref.read(widget.viewModel).triggerSearchAfterUpdate(); setState(() { - showIcon = widget.textEditingController.value.text.isNotEmpty; + showIcon = ref + .read(widget.viewModel) + .searchTextController + .value + .text + .isNotEmpty; }); }, decoration: InputDecoration( @@ -34,8 +42,7 @@ class _SearchTextFieldState extends ConsumerState { suffixIcon: showIcon ? GestureDetector( onTap: () { - ref.read(searchViewModel).clear(); - widget.textEditingController.clear(); + ref.read(widget.viewModel).clear(); setState(() { showIcon = false; }); diff --git a/lib/searchComponent/views/appWideSearch/search_view.dart b/lib/searchComponent/views/search_view.dart similarity index 60% rename from lib/searchComponent/views/appWideSearch/search_view.dart rename to lib/searchComponent/views/search_view.dart index 03dc43dc..3531a402 100644 --- a/lib/searchComponent/views/appWideSearch/search_view.dart +++ b/lib/searchComponent/views/search_view.dart @@ -1,18 +1,21 @@ import 'package:campus_flutter/base/enums/search_category.dart'; -import 'package:campus_flutter/searchComponent/viewModels/global_search_viewmodel.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_category_picker_view.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_result_view_builder.dart'; -import 'package:campus_flutter/searchComponent/views/appWideSearch/search_textfield_view.dart'; +import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart'; +import 'package:campus_flutter/searchComponent/views/search_category_picker_view.dart'; +import 'package:campus_flutter/searchComponent/views/search_result_view_builder.dart'; +import 'package:campus_flutter/searchComponent/views/search_textfield_view.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart'; class SearchView extends ConsumerWidget { - SearchView({super.key, required this.showContent}); - - final TextEditingController textEditingController = TextEditingController(); + const SearchView({ + super.key, + required this.viewModel, + required this.showContent, + }); + final Provider viewModel; final bool showContent; @override @@ -24,10 +27,10 @@ class SearchView extends ConsumerWidget { ? Column( mainAxisSize: MainAxisSize.min, children: [ - SearchTextField( - textEditingController: textEditingController, + SearchTextField(viewModel: viewModel), + SearchCategoryPickerView( + viewModel: viewModel, ), - const SearchCategoryPickerView(), _search(ref), ], ) //) @@ -39,9 +42,10 @@ class SearchView extends ConsumerWidget { Widget _search(WidgetRef ref) { return Expanded( child: StreamBuilder( - stream: ref.watch(searchViewModel).result, + stream: ref.watch(viewModel).result, builder: (context, snapshot) { - if (!snapshot.hasData && textEditingController.text.isEmpty) { + if (!snapshot.hasData && + ref.read(viewModel).searchTextController.text.isEmpty) { return Center( child: Text(context.tr("enterQueryStart")), ); @@ -51,8 +55,10 @@ class SearchView extends ConsumerWidget { return MasonryGridView.count( crossAxisCount: 2, itemCount: snapshot.data?.length ?? 0, - itemBuilder: (context, index) => - SearchResultViewBuilder(snapshot.data![index]), + itemBuilder: (context, index) => SearchResultViewBuilder( + viewModel: viewModel, + searchCategory: snapshot.data![index], + ), ); } else { return SingleChildScrollView( @@ -61,7 +67,10 @@ class SearchView extends ConsumerWidget { children: [ for (var result in snapshot.data ?? const Iterable.empty()) - SearchResultViewBuilder(result), + SearchResultViewBuilder( + viewModel: viewModel, + searchCategory: result, + ), ], ), ); diff --git a/lib/studiesComponent/view/lectureDetail/basic_lecture_info_view.dart b/lib/studiesComponent/view/lectureDetail/basic_lecture_info_view.dart index 59e16f9f..3647d33c 100644 --- a/lib/studiesComponent/view/lectureDetail/basic_lecture_info_view.dart +++ b/lib/studiesComponent/view/lectureDetail/basic_lecture_info_view.dart @@ -43,11 +43,8 @@ class BasicLectureInfoView extends ConsumerWidget { iconData: Icons.person, trailingWidget: IconButton( onPressed: () => context.push( - roomSearch, - extra: ( - lectureDetails.speaker?.split(",").first, - false, - ), + personSearch, + extra: lectureDetails.speaker?.split(",").first, ), icon: Icon( Icons.search, diff --git a/lib/studiesComponent/view/lectureDetail/lecture_meeting_info_view.dart b/lib/studiesComponent/view/lectureDetail/lecture_meeting_info_view.dart index 77c9bf9c..0c72f180 100644 --- a/lib/studiesComponent/view/lectureDetail/lecture_meeting_info_view.dart +++ b/lib/studiesComponent/view/lectureDetail/lecture_meeting_info_view.dart @@ -30,10 +30,7 @@ class LectureMeetingInfoView extends ConsumerWidget { trailingWidget: IconButton( onPressed: () => context.push( roomSearch, - extra: ( - ref.read(viewModel).event!.location, - null, - ), + extra: ref.read(viewModel).event!.location, ), icon: Icon( Icons.search,