Skip to content

Commit 89b6400

Browse files
committed
Optimize Search and Merge General, Person and Room Search
1 parent f5b145c commit 89b6400

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+360
-486
lines changed

lib/base/enums/search_type.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
enum SearchType {
2+
general,
3+
room,
4+
person;
5+
}

lib/base/routing/router.dart

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'package:campus_flutter/base/enums/campus.dart';
2+
import 'package:campus_flutter/base/enums/search_type.dart';
23
import 'package:campus_flutter/base/util/fullscreen_image_view.dart';
34
import 'package:campus_flutter/base/routing/router_service.dart';
45
import 'package:campus_flutter/base/routing/routes.dart';
@@ -31,8 +32,8 @@ import 'package:campus_flutter/placesComponent/views/campuses/campus_scaffold.da
3132
import 'package:campus_flutter/placesComponent/views/places_screen.dart';
3233
import 'package:campus_flutter/placesComponent/views/studyGroups/study_room_group_scaffold.dart';
3334
import 'package:campus_flutter/placesComponent/views/studyGroups/study_rooms_view.dart';
34-
import 'package:campus_flutter/searchComponent/views/appWideSearch/search_scaffold.dart';
35-
import 'package:campus_flutter/searchComponent/views/personRoomSearch/search_view.dart';
35+
import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart';
36+
import 'package:campus_flutter/searchComponent/views/search_scaffold.dart';
3637
import 'package:campus_flutter/settingsComponent/views/settings_scaffold.dart';
3738
import 'package:campus_flutter/studiesComponent/model/lecture.dart';
3839
import 'package:campus_flutter/studiesComponent/screen/studies_screen.dart';
@@ -220,7 +221,22 @@ final _router = GoRouter(
220221
),
221222
GoRoute(
222223
path: search,
223-
builder: (context, state) => const SearchScaffold(),
224+
builder: (context, state) => SearchScaffold(
225+
viewModel:
226+
searchViewModel((SearchType.general, state.extra as String?)),
227+
),
228+
),
229+
GoRoute(
230+
path: roomSearch,
231+
builder: (context, state) => SearchScaffold(
232+
viewModel: searchViewModel((SearchType.room, state.extra as String?)),
233+
),
234+
),
235+
GoRoute(
236+
path: personSearch,
237+
builder: (context, state) => SearchScaffold(
238+
viewModel: searchViewModel((SearchType.person, state.extra as String?)),
239+
),
224240
),
225241
GoRoute(
226242
path: studyRoom,
@@ -244,16 +260,6 @@ final _router = GoRouter(
244260
imageData: state.extra as String,
245261
),
246262
),
247-
GoRoute(
248-
path: roomSearch,
249-
builder: (context, state) {
250-
final data = state.extra as (String?, bool?);
251-
return PersonRoomSearchScaffold(
252-
searchString: data.$1,
253-
isRoomSearch: data.$2 ?? true,
254-
);
255-
},
256-
),
257263
GoRoute(
258264
path: eventCreation,
259265
builder: (context, state) => EventCreationScaffold(

lib/base/routing/routes.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,15 @@ const menuSettings = "/menu+settings";
3737
const feedback = "$menuSettings/feedback";
3838
const feedbackSuccess = "$feedback/success";
3939

40-
/// General
40+
/// Search
4141
const search = "/search";
42+
const roomSearch = "/roomSearch";
43+
const personSearch = "/personSearch";
44+
45+
/// General
4246
const navigaTum = "/navigaTum";
4347
const personDetails = "/personDetails";
4448
const cafeteria = "/cafeteria";
4549
const studyRoom = "/studyRoom";
4650
const networkImage = "/networkImage";
4751
const localeImage = "/localeImage";
48-
const roomSearch = "/roomSearch";

lib/base/util/custom_back_button.dart

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,30 @@ import 'package:go_router/go_router.dart';
55
class CustomBackButton extends StatelessWidget {
66
const CustomBackButton({
77
super.key,
8+
this.beforeOnPressed,
89
this.onPressed,
910
this.color,
1011
});
1112

1213
final Function()? onPressed;
14+
final Function()? beforeOnPressed;
1315
final Color? color;
1416

1517
@override
1618
Widget build(BuildContext context) {
1719
return BackButton(
1820
color: color,
19-
onPressed: onPressed ?? () => defaultOnPressed(context),
21+
onPressed: () {
22+
if (beforeOnPressed != null) {
23+
beforeOnPressed!();
24+
}
25+
26+
if (onPressed != null) {
27+
onPressed!();
28+
} else {
29+
defaultOnPressed(context);
30+
}
31+
},
2032
);
2133
}
2234

lib/navigaTumComponent/viewModels/navigatum_search_viewmodel.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import 'package:campus_flutter/navigaTumComponent/model/navigatum_navigation_entity.dart';
22
import 'package:campus_flutter/navigaTumComponent/services/navigatum_search_service.dart';
3-
import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart';
3+
import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart';
44
import 'package:collection/collection.dart';
55
import 'package:flutter_riverpod/flutter_riverpod.dart';
66
import 'package:rxdart/rxdart.dart';
77

88
final navigaTumSearchViewModel = Provider((ref) => NavigaTumSearchViewModel());
99

1010
class NavigaTumSearchViewModel
11-
implements SearchViewModel<NavigaTumNavigationEntity> {
11+
implements CategorySearchViewModel<NavigaTumNavigationEntity> {
1212
@override
1313
BehaviorSubject<List<NavigaTumNavigationEntity>?> searchResults =
1414
BehaviorSubject.seeded(null);

lib/navigation_service.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import 'dart:io';
22

33
import 'package:campus_flutter/base/enums/credentials.dart';
4+
import 'package:campus_flutter/base/enums/search_type.dart';
45
import 'package:campus_flutter/base/routing/routes.dart';
56
import 'package:campus_flutter/homeComponent/view/widget/widget_screen.dart';
67
import 'package:campus_flutter/main.dart';
78
import 'package:campus_flutter/onboardingComponent/viewModels/onboarding_viewmodel.dart';
8-
import 'package:campus_flutter/searchComponent/viewModels/global_search_viewmodel.dart';
9+
import 'package:campus_flutter/searchComponent/viewModels/search_viewmodel.dart';
910
import 'package:campus_flutter/studentCardComponent/views/student_card_view.dart';
1011
import 'package:campus_flutter/base/extensions/context.dart';
1112
import 'package:easy_localization/easy_localization.dart';
@@ -81,7 +82,9 @@ class NavigationService {
8182
Widget searchButton(int currentIndex, WidgetRef ref, BuildContext context) {
8283
return IconButton(
8384
onPressed: () {
84-
ref.read(searchViewModel).setSearchCategories(currentIndex);
85+
ref
86+
.read(searchViewModel((SearchType.general, null)))
87+
.setSearchCategories(currentIndex);
8588
context.push(search);
8689
},
8790
icon: const Icon(Icons.search),
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import 'package:campus_flutter/searchComponent/protocols/searchable.dart';
22
import 'package:rxdart/rxdart.dart';
33

4-
abstract class SearchViewModel<T extends Searchable> {
4+
abstract class CategorySearchViewModel<T extends Searchable> {
55
late BehaviorSubject<List<T>?> searchResults;
66
}

lib/searchComponent/viewModels/global_search_viewmodel.dart renamed to lib/searchComponent/viewModels/search_viewmodel.dart

Lines changed: 61 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import 'package:campus_flutter/base/enums/credentials.dart';
22
import 'package:campus_flutter/base/enums/search_category.dart';
3+
import 'package:campus_flutter/base/enums/search_type.dart';
34
import 'package:campus_flutter/onboardingComponent/viewModels/onboarding_viewmodel.dart';
45
import 'package:campus_flutter/navigaTumComponent/viewModels/navigatum_search_viewmodel.dart';
56
import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/person_search_viewmodel.dart';
@@ -12,30 +13,55 @@ import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/n
1213
import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/personal_lecture_seach_viewmodel.dart';
1314
import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/student_club_search_viewmodel.dart';
1415
import 'package:campus_flutter/searchComponent/viewModels/searchableViewModels/study_room_search_viewmodel.dart';
16+
import 'package:flutter/material.dart';
1517
import 'package:flutter_riverpod/flutter_riverpod.dart';
1618
import 'package:rxdart/rxdart.dart';
1719

18-
final searchViewModel = Provider((ref) => GlobalSearchViewModel(ref));
20+
final searchViewModel = Provider.family<SearchViewModel, (SearchType, String?)>(
21+
(ref, data) => data.$2 != null
22+
? SearchViewModel(ref, searchType: data.$1, searchString: data.$2!)
23+
: SearchViewModel(ref, searchType: data.$1),
24+
);
1925

20-
class GlobalSearchViewModel {
26+
class SearchViewModel {
2127
BehaviorSubject<List<SearchCategory>?> result = BehaviorSubject.seeded(null);
2228
BehaviorSubject<List<SearchCategory>> selectedCategories =
2329
BehaviorSubject.seeded([]);
2430

25-
String searchString = "";
31+
late final TextEditingController searchTextController;
32+
final SearchType searchType;
33+
final Ref ref;
2634

2735
bool isAuthorized = false;
2836

29-
final Ref ref;
37+
SearchViewModel(
38+
this.ref, {
39+
required this.searchType,
40+
String? searchString,
41+
}) {
42+
searchTextController = TextEditingController(text: searchString);
43+
selectedCategories.add(_initialSearchCategories());
44+
triggerSearchAfterUpdate();
45+
}
3046

31-
GlobalSearchViewModel(this.ref);
47+
_initialSearchCategories() {
48+
switch (searchType) {
49+
case SearchType.general:
50+
return <SearchCategory>[];
51+
case SearchType.room:
52+
return [SearchCategory.rooms, SearchCategory.studyRoom];
53+
case SearchType.person:
54+
return [SearchCategory.persons];
55+
}
56+
}
3257

33-
void search(String searchString) async {
58+
void _search() async {
59+
final searchString = searchTextController.text;
3460
if (searchString.isEmpty) {
3561
clear();
3662
return;
3763
}
38-
this.searchString = searchString;
64+
searchTextController.text = searchString;
3965
if (selectedCategories.value.isEmpty) {
4066
if (ref.read(onboardingViewModel).credentials.value ==
4167
Credentials.tumId) {
@@ -63,29 +89,26 @@ class GlobalSearchViewModel {
6389
}
6490

6591
void clear() {
66-
searchString = "";
92+
searchTextController.clear();
6793
result.add(null);
6894
}
6995

70-
void triggerSearchAfterUpdate(String? searchString) {
71-
if (searchString != null) {
72-
this.searchString = searchString;
73-
}
74-
search(this.searchString);
96+
void triggerSearchAfterUpdate() {
97+
_search();
7598
if (selectedCategories.value.isEmpty) {
7699
for (var category in SearchCategory.values) {
77100
if (isAuthorized) {
78-
_authorizedSearchTriggerBuilder(searchString, category);
101+
_authorizedSearchTriggerBuilder(category);
79102
} else {
80-
_unauthorizedSearchTriggerBuilder(searchString, category);
103+
_unauthorizedSearchTriggerBuilder(category);
81104
}
82105
}
83106
} else {
84107
for (var selectedCategory in selectedCategories.value) {
85108
if (isAuthorized) {
86-
_authorizedSearchTriggerBuilder(searchString, selectedCategory);
109+
_authorizedSearchTriggerBuilder(selectedCategory);
87110
} else {
88-
_unauthorizedSearchTriggerBuilder(searchString, selectedCategory);
111+
_unauthorizedSearchTriggerBuilder(selectedCategory);
89112
}
90113
}
91114
}
@@ -130,77 +153,57 @@ class GlobalSearchViewModel {
130153
}
131154
}
132155

133-
void _authorizedSearchTriggerBuilder(
134-
String? searchString,
135-
SearchCategory searchCategory,
136-
) {
156+
void _authorizedSearchTriggerBuilder(SearchCategory searchCategory) {
157+
final searchString = searchTextController.text;
137158
switch (searchCategory) {
138159
case SearchCategory.grade:
139-
ref.read(gradesSearchViewModel).gradesSearch(query: this.searchString);
160+
ref.read(gradesSearchViewModel).gradesSearch(query: searchString);
140161
case SearchCategory.cafeterias:
141-
ref
142-
.read(cafeteriaSearchViewModel)
143-
.cafeteriaSearch(query: this.searchString);
162+
ref.read(cafeteriaSearchViewModel).cafeteriaSearch(query: searchString);
144163
case SearchCategory.calendar:
145-
ref
146-
.read(calendarSearchViewModel)
147-
.calendarSearch(query: this.searchString);
164+
ref.read(calendarSearchViewModel).calendarSearch(query: searchString);
148165
case SearchCategory.movie:
149-
ref.read(movieSearchViewModel).movieSearch(query: this.searchString);
166+
ref.read(movieSearchViewModel).movieSearch(query: searchString);
150167
case SearchCategory.news:
151-
ref.read(newsSearchViewModel).newsSearch(query: this.searchString);
168+
ref.read(newsSearchViewModel).newsSearch(query: searchString);
152169
case SearchCategory.studentClub:
153170
ref
154171
.read(studentClubSearchViewModel)
155-
.studentClubSearch(query: this.searchString);
172+
.studentClubSearch(query: searchString);
156173
case SearchCategory.studyRoom:
157-
ref
158-
.read(studyRoomSearchViewModel)
159-
.studyRoomSearch(query: this.searchString);
174+
ref.read(studyRoomSearchViewModel).studyRoomSearch(query: searchString);
160175
case SearchCategory.lectures:
161-
ref
162-
.read(lectureSearchViewModel)
163-
.lectureSearch(query: this.searchString);
176+
ref.read(lectureSearchViewModel).lectureSearch(query: searchString);
164177
case SearchCategory.personalLectures:
165178
ref
166179
.read(personalLectureSearchViewModel)
167-
.personalLectureSearch(query: this.searchString);
180+
.personalLectureSearch(query: searchString);
168181
case SearchCategory.persons:
169-
ref.read(personSearchViewModel).personSearch(query: this.searchString);
182+
ref.read(personSearchViewModel).personSearch(query: searchString);
170183
case SearchCategory.rooms:
171-
ref
172-
.read(navigaTumSearchViewModel)
173-
.navigaTumSearch(query: this.searchString);
184+
ref.read(navigaTumSearchViewModel).navigaTumSearch(query: searchString);
174185
default:
175186
return;
176187
}
177188
}
178189

179-
void _unauthorizedSearchTriggerBuilder(
180-
String? searchString,
181-
SearchCategory searchCategory,
182-
) {
190+
void _unauthorizedSearchTriggerBuilder(SearchCategory searchCategory) {
191+
final searchString = searchTextController.text;
183192
switch (searchCategory) {
184193
case SearchCategory.cafeterias:
185-
ref
186-
.read(cafeteriaSearchViewModel)
187-
.cafeteriaSearch(query: this.searchString);
194+
ref.read(cafeteriaSearchViewModel).cafeteriaSearch(query: searchString);
188195
case SearchCategory.movie:
189-
ref.read(movieSearchViewModel).movieSearch(query: this.searchString);
196+
ref.read(movieSearchViewModel).movieSearch(query: searchString);
190197
case SearchCategory.news:
191-
ref.read(newsSearchViewModel).newsSearch(query: this.searchString);
198+
ref.read(newsSearchViewModel).newsSearch(query: searchString);
192199
case SearchCategory.studentClub:
193200
ref
194201
.read(studentClubSearchViewModel)
195-
.studentClubSearch(query: this.searchString);
202+
.studentClubSearch(query: searchString);
196203
case SearchCategory.studyRoom:
197-
ref
198-
.read(studyRoomSearchViewModel)
199-
.studyRoomSearch(query: this.searchString);
204+
ref.read(studyRoomSearchViewModel).studyRoomSearch(query: searchString);
200205
case SearchCategory.rooms:
201-
ref
202-
.read(navigaTumSearchViewModel)
203-
.navigaTumSearch(query: this.searchString);
206+
ref.read(navigaTumSearchViewModel).navigaTumSearch(query: searchString);
204207
default:
205208
return;
206209
}

lib/searchComponent/viewModels/searchableViewModels/cafeteria_search_viewmodel.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ import 'package:campus_flutter/placesComponent/model/cafeterias/cafeteria.dart';
22
import 'package:campus_flutter/placesComponent/services/cafeterias_service.dart';
33
import 'package:campus_flutter/searchComponent/model/search_exception.dart';
44
import 'package:campus_flutter/searchComponent/protocols/global_search.dart';
5-
import 'package:campus_flutter/searchComponent/protocols/search_viewmodel.dart';
5+
import 'package:campus_flutter/searchComponent/protocols/category_search_viewmodel.dart';
66
import 'package:flutter_riverpod/flutter_riverpod.dart';
77
import 'package:rxdart/rxdart.dart';
88

99
final cafeteriaSearchViewModel = Provider((ref) => CafeteriaSearchViewModel());
1010

11-
class CafeteriaSearchViewModel implements SearchViewModel<Cafeteria> {
11+
class CafeteriaSearchViewModel implements CategorySearchViewModel<Cafeteria> {
1212
@override
1313
BehaviorSubject<List<Cafeteria>?> searchResults =
1414
BehaviorSubject.seeded(null);

0 commit comments

Comments
 (0)