Skip to content

Commit d9047ec

Browse files
authored
Add English Support to Student Clubs (#278)
1 parent b1fb13e commit d9047ec

File tree

10 files changed

+131
-33
lines changed

10 files changed

+131
-33
lines changed

lib/base/networking/apis/tumdev/campus_backend.pb.dart

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4350,12 +4350,21 @@ class GetCanteenHeadCountReply extends $pb.GeneratedMessage {
43504350
}
43514351

43524352
class ListStudentClubRequest extends $pb.GeneratedMessage {
4353-
factory ListStudentClubRequest() => create();
4353+
factory ListStudentClubRequest({
4354+
Language? language,
4355+
}) {
4356+
final $result = create();
4357+
if (language != null) {
4358+
$result.language = language;
4359+
}
4360+
return $result;
4361+
}
43544362
ListStudentClubRequest._() : super();
43554363
factory ListStudentClubRequest.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r);
43564364
factory ListStudentClubRequest.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r);
43574365

43584366
static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'ListStudentClubRequest', package: const $pb.PackageName(_omitMessageNames ? '' : 'api'), createEmptyInstance: create)
4367+
..e<Language>(1, _omitFieldNames ? '' : 'language', $pb.PbFieldType.OE, defaultOrMaker: Language.German, valueOf: Language.valueOf, enumValues: Language.values)
43594368
..hasRequiredFields = false
43604369
;
43614370

@@ -4379,6 +4388,17 @@ class ListStudentClubRequest extends $pb.GeneratedMessage {
43794388
@$core.pragma('dart2js:noInline')
43804389
static ListStudentClubRequest getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor<ListStudentClubRequest>(create);
43814390
static ListStudentClubRequest? _defaultInstance;
4391+
4392+
/// Language of the student clubs and categories
4393+
/// Defaults to german
4394+
@$pb.TagNumber(1)
4395+
Language get language => $_getN(0);
4396+
@$pb.TagNumber(1)
4397+
set language(Language v) { setField(1, v); }
4398+
@$pb.TagNumber(1)
4399+
$core.bool hasLanguage() => $_has(0);
4400+
@$pb.TagNumber(1)
4401+
void clearLanguage() => clearField(1);
43824402
}
43834403

43844404
class ListStudentClubReply extends $pb.GeneratedMessage {
@@ -4526,6 +4546,7 @@ class StudentClubCollection extends $pb.GeneratedMessage {
45264546
$core.String? title,
45274547
$core.String? description,
45284548
$core.Iterable<StudentClub>? clubs,
4549+
$fixnum.Int64? unstableCollectionId,
45294550
}) {
45304551
final $result = create();
45314552
if (title != null) {
@@ -4537,6 +4558,9 @@ class StudentClubCollection extends $pb.GeneratedMessage {
45374558
if (clubs != null) {
45384559
$result.clubs.addAll(clubs);
45394560
}
4561+
if (unstableCollectionId != null) {
4562+
$result.unstableCollectionId = unstableCollectionId;
4563+
}
45404564
return $result;
45414565
}
45424566
StudentClubCollection._() : super();
@@ -4547,6 +4571,7 @@ class StudentClubCollection extends $pb.GeneratedMessage {
45474571
..aOS(1, _omitFieldNames ? '' : 'title')
45484572
..aOS(2, _omitFieldNames ? '' : 'description')
45494573
..pc<StudentClub>(3, _omitFieldNames ? '' : 'clubs', $pb.PbFieldType.PM, subBuilder: StudentClub.create)
4574+
..a<$fixnum.Int64>(4, _omitFieldNames ? '' : 'unstableCollectionId', $pb.PbFieldType.OU6, defaultOrMaker: $fixnum.Int64.ZERO)
45504575
..hasRequiredFields = false
45514576
;
45524577

@@ -4591,6 +4616,17 @@ class StudentClubCollection extends $pb.GeneratedMessage {
45914616

45924617
@$pb.TagNumber(3)
45934618
$core.List<StudentClub> get clubs => $_getList(2);
4619+
4620+
/// id of the collection.
4621+
/// Might not be stable over time because of scraping
4622+
@$pb.TagNumber(4)
4623+
$fixnum.Int64 get unstableCollectionId => $_getI64(3);
4624+
@$pb.TagNumber(4)
4625+
set unstableCollectionId($fixnum.Int64 v) { $_setInt64(3, v); }
4626+
@$pb.TagNumber(4)
4627+
$core.bool hasUnstableCollectionId() => $_has(3);
4628+
@$pb.TagNumber(4)
4629+
void clearUnstableCollectionId() => clearField(4);
45944630
}
45954631

45964632

lib/base/networking/apis/tumdev/campus_backend.pbenum.dart

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,21 @@ class DeviceType extends $pb.ProtobufEnum {
3030
const DeviceType._($core.int v, $core.String n) : super(v, n);
3131
}
3232

33+
class Language extends $pb.ProtobufEnum {
34+
static const Language German = Language._(0, _omitEnumNames ? '' : 'German');
35+
static const Language English = Language._(1, _omitEnumNames ? '' : 'English');
36+
37+
static const $core.List<Language> values = <Language> [
38+
German,
39+
English,
40+
];
41+
42+
static final $core.Map<$core.int, Language> _byValue = $pb.ProtobufEnum.initByValue(values);
43+
static Language? valueOf($core.int value) => _byValue[value];
44+
45+
const Language._($core.int v, $core.String n) : super(v, n);
46+
}
47+
3348
class CreateFeedbackRequest_Recipient extends $pb.ProtobufEnum {
3449
static const CreateFeedbackRequest_Recipient TUM_DEV = CreateFeedbackRequest_Recipient._(0, _omitEnumNames ? '' : 'TUM_DEV');
3550
static const CreateFeedbackRequest_Recipient TUM_CONTACT = CreateFeedbackRequest_Recipient._(1, _omitEnumNames ? '' : 'TUM_CONTACT');

lib/base/networking/apis/tumdev/campus_backend.pbjson.dart

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,19 @@ const DeviceType$json = {
2727
final $typed_data.Uint8List deviceTypeDescriptor = $convert.base64Decode(
2828
'CgpEZXZpY2VUeXBlEgcKA0lPUxAAEgsKB0FORFJPSUQQARILCgdXSU5ET1dTEAI=');
2929

30+
@$core.Deprecated('Use languageDescriptor instead')
31+
const Language$json = {
32+
'1': 'Language',
33+
'2': [
34+
{'1': 'German', '2': 0},
35+
{'1': 'English', '2': 1},
36+
],
37+
};
38+
39+
/// Descriptor for `Language`. Decode as a `google.protobuf.EnumDescriptorProto`.
40+
final $typed_data.Uint8List languageDescriptor = $convert.base64Decode(
41+
'CghMYW5ndWFnZRIKCgZHZXJtYW4QABILCgdFbmdsaXNoEAE=');
42+
3043
@$core.Deprecated('Use createDeviceRequestDescriptor instead')
3144
const CreateDeviceRequest$json = {
3245
'1': 'CreateDeviceRequest',
@@ -913,11 +926,18 @@ final $typed_data.Uint8List getCanteenHeadCountReplyDescriptor = $convert.base64
913926
@$core.Deprecated('Use listStudentClubRequestDescriptor instead')
914927
const ListStudentClubRequest$json = {
915928
'1': 'ListStudentClubRequest',
929+
'2': [
930+
{'1': 'language', '3': 1, '4': 1, '5': 14, '6': '.api.Language', '9': 0, '10': 'language', '17': true},
931+
],
932+
'8': [
933+
{'1': '_language'},
934+
],
916935
};
917936

918937
/// Descriptor for `ListStudentClubRequest`. Decode as a `google.protobuf.DescriptorProto`.
919938
final $typed_data.Uint8List listStudentClubRequestDescriptor = $convert.base64Decode(
920-
'ChZMaXN0U3R1ZGVudENsdWJSZXF1ZXN0');
939+
'ChZMaXN0U3R1ZGVudENsdWJSZXF1ZXN0Ei4KCGxhbmd1YWdlGAEgASgOMg0uYXBpLkxhbmd1YW'
940+
'dlSABSCGxhbmd1YWdliAEBQgsKCV9sYW5ndWFnZQ==');
921941

922942
@$core.Deprecated('Use listStudentClubReplyDescriptor instead')
923943
const ListStudentClubReply$json = {
@@ -962,12 +982,14 @@ const StudentClubCollection$json = {
962982
{'1': 'title', '3': 1, '4': 1, '5': 9, '10': 'title'},
963983
{'1': 'description', '3': 2, '4': 1, '5': 9, '10': 'description'},
964984
{'1': 'clubs', '3': 3, '4': 3, '5': 11, '6': '.api.StudentClub', '10': 'clubs'},
985+
{'1': 'unstable_collection_id', '3': 4, '4': 1, '5': 4, '10': 'unstableCollectionId'},
965986
],
966987
};
967988

968989
/// Descriptor for `StudentClubCollection`. Decode as a `google.protobuf.DescriptorProto`.
969990
final $typed_data.Uint8List studentClubCollectionDescriptor = $convert.base64Decode(
970991
'ChVTdHVkZW50Q2x1YkNvbGxlY3Rpb24SFAoFdGl0bGUYASABKAlSBXRpdGxlEiAKC2Rlc2NyaX'
971992
'B0aW9uGAIgASgJUgtkZXNjcmlwdGlvbhImCgVjbHVicxgDIAMoCzIQLmFwaS5TdHVkZW50Q2x1'
972-
'YlIFY2x1YnM=');
993+
'YlIFY2x1YnMSNAoWdW5zdGFibGVfY29sbGVjdGlvbl9pZBgEIAEoBFIUdW5zdGFibGVDb2xsZW'
994+
'N0aW9uSWQ=');
973995

lib/campusComponent/service/student_club_service.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@ import 'package:campus_flutter/main.dart';
44

55
class StudentClubService {
66
static Future<(DateTime?, List<StudentClubCollection>)> fetchStudentClubs(
7+
Language? language,
78
bool forceRefresh,
89
) async {
910
final start = DateTime.now();
1011
GrpcClient grpcClient = getIt<GrpcClient>();
1112
final response = await grpcClient.listStudentClub(
12-
ListStudentClubRequest(),
13+
ListStudentClubRequest(
14+
language: language,
15+
),
1316
);
1417
return (start, response.collections);
1518
}

lib/campusComponent/view/studentClub/student_club_widget_view.dart

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'package:campus_flutter/base/enums/error_handling_view_type.dart';
2+
import 'package:campus_flutter/base/errorHandling/error_handling_router.dart';
13
import 'package:campus_flutter/base/routing/routes.dart';
24
import 'package:campus_flutter/base/util/delayed_loading_indicator.dart';
35
import 'package:campus_flutter/base/util/url_launcher.dart';
@@ -20,10 +22,10 @@ class StudentClubWidgetView extends ConsumerStatefulWidget {
2022

2123
class _StudentClubWidgetViewState extends ConsumerState<StudentClubWidgetView> {
2224
@override
23-
void initState() {
24-
ref.read(studentClubViewModel).fetchStudentClubs(false);
25+
void didChangeDependencies() {
26+
ref.read(studentClubViewModel).fetchStudentClubs(false, context);
2527
ref.read(movieViewModel).fetch(false);
26-
super.initState();
28+
super.didChangeDependencies();
2729
}
2830

2931
@override
@@ -77,9 +79,10 @@ class _StudentClubWidgetViewState extends ConsumerState<StudentClubWidgetView> {
7779
),
7880
);
7981
} else if (snapshot.hasError) {
80-
return const Card(
81-
child: DelayedLoadingIndicator(
82-
name: "Student Clubs",
82+
return Card(
83+
child: ErrorHandlingRouter(
84+
error: Error(),
85+
errorHandlingViewType: ErrorHandlingViewType.textOnly,
8386
),
8487
);
8588
} else {

lib/campusComponent/viewmodel/student_club_viewmodel.dart

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import 'package:campus_flutter/base/networking/apis/tumdev/campus_backend.pb.dart';
22
import 'package:campus_flutter/campusComponent/service/student_club_service.dart';
3+
import 'package:easy_localization/easy_localization.dart';
4+
import 'package:flutter/material.dart';
35
import 'package:flutter_riverpod/flutter_riverpod.dart';
46
import 'package:rxdart/rxdart.dart';
57

@@ -11,8 +13,12 @@ class StudentClubViewModel {
1113
final BehaviorSubject<List<StudentClub>?> suggestions =
1214
BehaviorSubject.seeded(null);
1315

14-
Future fetchStudentClubs(bool forceRefresh) {
15-
return StudentClubService.fetchStudentClubs(forceRefresh).then(
16+
Future fetchStudentClubs(bool forceRefresh, BuildContext context) {
17+
final currentLanguage = context.locale.languageCode == "de"
18+
? Language.German
19+
: Language.English;
20+
return StudentClubService.fetchStudentClubs(currentLanguage, forceRefresh)
21+
.then(
1622
(value) {
1723
collections.add(value.$2);
1824
final studentClubs = value.$2.expand((e) => e.clubs).toList();

lib/searchComponent/viewModels/searchableViewModels/student_club_search_viewmodel.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class StudentClubSearchViewModel implements SearchViewModel<StudentClubSearch> {
2323
required String query,
2424
}) async {
2525
if (studentClubData.isEmpty) {
26-
return StudentClubService.fetchStudentClubs(forcedRefresh).then(
26+
return StudentClubService.fetchStudentClubs(null, forcedRefresh).then(
2727
(value) {
2828
studentClubData = value.$2
2929
.expand((e) => e.clubs)

protos/tumdev/campus_backend.proto

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -564,7 +564,17 @@ message GetCanteenHeadCountReply {
564564
// A time stamp indicating how up to date the response is. Only valid in case percent != -1.
565565
google.protobuf.Timestamp timestamp = 4;
566566
}
567-
message ListStudentClubRequest {}
567+
568+
enum Language {
569+
German = 0;
570+
English = 1;
571+
}
572+
573+
message ListStudentClubRequest {
574+
// Language of the student clubs and categories
575+
// Defaults to german
576+
optional Language language = 1;
577+
}
568578
message ListStudentClubReply {
569579
repeated StudentClubCollection collections = 1;
570580
}
@@ -582,4 +592,7 @@ message StudentClubCollection {
582592
string title = 1;
583593
string description = 2;
584594
repeated StudentClub clubs = 3;
595+
// id of the collection.
596+
// Might not be stable over time because of scraping
597+
uint64 unstable_collection_id = 4;
585598
}

pubspec.lock

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -648,10 +648,10 @@ packages:
648648
dependency: "direct main"
649649
description:
650650
name: get_it
651-
sha256: d85128a5dae4ea777324730dc65edd9c9f43155c109d5cc0a69cab74139fbac1
651+
sha256: ff97e5e7b2e82e63c82f5658c6ba2605ea831f0f7489b0d2fb255d817ec4eb5e
652652
url: "https://pub.dev"
653653
source: hosted
654-
version: "7.7.0"
654+
version: "8.0.0"
655655
glob:
656656
dependency: transitive
657657
description:
@@ -696,10 +696,10 @@ packages:
696696
dependency: transitive
697697
description:
698698
name: google_maps_flutter_android
699-
sha256: "36e75af1d0bd4c7391eacdaedf9ca7632c5b9709c5ec618b04489b79ea2b3f82"
699+
sha256: "10cf27bee8c560f8e69992b3a0f27ddf1d7acbea622ddb13ef3f587848a73f26"
700700
url: "https://pub.dev"
701701
source: hosted
702-
version: "2.14.6"
702+
version: "2.14.7"
703703
google_maps_flutter_ios:
704704
dependency: transitive
705705
description:
@@ -1169,18 +1169,18 @@ packages:
11691169
dependency: "direct main"
11701170
description:
11711171
name: quick_actions
1172-
sha256: b17da113df7a7005977f64adfa58ccc49c829d3ccc6e8e770079a8c7fbf2da9e
1172+
sha256: "2c1d9a91f3218b4e987a7e1e95ba0415b7f48a2cb3ffacc027a1e3d3c117223f"
11731173
url: "https://pub.dev"
11741174
source: hosted
1175-
version: "1.0.7"
1175+
version: "1.0.8"
11761176
quick_actions_android:
11771177
dependency: transitive
11781178
description:
11791179
name: quick_actions_android
1180-
sha256: "54a581491b90ff2e1be94af84a40c05e806e232184bb32afa2df57b07c4d6882"
1180+
sha256: "6932eeb970c6f7aed60708faf0ecea7068af84ee642c3bf308a0629abe90399b"
11811181
url: "https://pub.dev"
11821182
source: hosted
1183-
version: "1.0.15"
1183+
version: "1.0.16"
11841184
quick_actions_ios:
11851185
dependency: transitive
11861186
description:
@@ -1462,34 +1462,34 @@ packages:
14621462
dependency: "direct main"
14631463
description:
14641464
name: syncfusion_flutter_calendar
1465-
sha256: c501e463e69ed6f69323ead6b3b47873e5f25d00ec481fe2429f9ebbac92271b
1465+
sha256: "992d51b58453362df5ef789f3ffc89ede1f52e6788fe71e342c2ef5c2a6b58eb"
14661466
url: "https://pub.dev"
14671467
source: hosted
1468-
version: "27.1.48"
1468+
version: "27.1.50"
14691469
syncfusion_flutter_charts:
14701470
dependency: "direct main"
14711471
description:
14721472
name: syncfusion_flutter_charts
1473-
sha256: cdc207291ad0caf34cb9e20caa8938ff65f67a413b3a86a14d3a7b341a772100
1473+
sha256: "68eac622c9ad73618ddddbb5b8185792f590258e7400cf1f606c97f892c4a724"
14741474
url: "https://pub.dev"
14751475
source: hosted
1476-
version: "27.1.48"
1476+
version: "27.1.50"
14771477
syncfusion_flutter_core:
14781478
dependency: "direct main"
14791479
description:
14801480
name: syncfusion_flutter_core
1481-
sha256: "4347f4d2f5d89461df2c53e6fbf53aef38c7f05ed79b0760d935fb1ec836213b"
1481+
sha256: efbc44bdef33bf8f469c5ac7830df9631972721e157021db14bd78cdb1047fe1
14821482
url: "https://pub.dev"
14831483
source: hosted
1484-
version: "27.1.48"
1484+
version: "27.1.50"
14851485
syncfusion_flutter_datepicker:
14861486
dependency: "direct main"
14871487
description:
14881488
name: syncfusion_flutter_datepicker
1489-
sha256: "239331a866e57794925d29f9a68af0f52b2d1942001588e11f49729de2c670b0"
1489+
sha256: c54e0f4a56e713f68b4bdcac36f23c68cf35f3b0a02f0a9abb230c42ab64b3c6
14901490
url: "https://pub.dev"
14911491
source: hosted
1492-
version: "27.1.48"
1492+
version: "27.1.50"
14931493
synchronized:
14941494
dependency: transitive
14951495
description:
@@ -1606,10 +1606,10 @@ packages:
16061606
dependency: transitive
16071607
description:
16081608
name: url_launcher_macos
1609-
sha256: "9a1a42d5d2d95400c795b2914c36fdcb525870c752569438e4ebb09a2b5d90de"
1609+
sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672"
16101610
url: "https://pub.dev"
16111611
source: hosted
1612-
version: "3.2.0"
1612+
version: "3.2.1"
16131613
url_launcher_platform_interface:
16141614
dependency: transitive
16151615
description:

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ dependencies:
2727
rxdart: ^0.28.0
2828
go_router: ^14.0.1
2929
flutter_riverpod: ^2.3.6
30-
get_it: ^7.6.0
30+
get_it: ^8.0.0
3131

3232
# user interface
3333
shimmer: ^3.0.0

0 commit comments

Comments
 (0)