Skip to content

Commit 8879717

Browse files
authored
Make Student Card Picture hideable on Home (#301)
1 parent 4e6cbe2 commit 8879717

File tree

11 files changed

+157
-113
lines changed

11 files changed

+157
-113
lines changed

assets/translations/de.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,5 +233,6 @@
233233
"suggested": "Interessante {}",
234234
"more": "Mehr",
235235
"visibility": "Sichtbarkeit",
236-
"utilizationAt": "Auslastung bei {}%"
236+
"utilizationAt": "Auslastung bei {}%",
237+
"showStudentCardPicture": "Student Card Bild zeigen"
237238
}

assets/translations/en.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,5 +233,6 @@
233233
"suggested": "Suggested {}",
234234
"more": "More",
235235
"visibility": "Visibility",
236-
"utilizationAt": "Utilization at {}%"
236+
"utilizationAt": "Utilization at {}%",
237+
"showStudentCardPicture": "Show Student Card Picture"
237238
}

ios/Podfile.lock

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ PODS:
99
- Firebase/RemoteConfig (11.4.0):
1010
- Firebase/CoreOnly
1111
- FirebaseRemoteConfig (~> 11.4.0)
12-
- firebase_core (3.8.0):
12+
- firebase_core (3.8.1):
1313
- Firebase/CoreOnly (= 11.4.0)
1414
- Flutter
15-
- firebase_crashlytics (4.1.5):
15+
- firebase_crashlytics (4.2.0):
1616
- Firebase/Crashlytics (= 11.4.0)
1717
- firebase_core
1818
- Flutter
19-
- firebase_remote_config (5.1.5):
19+
- firebase_remote_config (5.2.0):
2020
- Firebase/RemoteConfig (= 11.4.0)
2121
- firebase_core
2222
- Flutter
@@ -28,7 +28,7 @@ PODS:
2828
- GoogleUtilities/Logger (~> 8.0)
2929
- FirebaseCoreExtension (11.4.1):
3030
- FirebaseCore (~> 11.0)
31-
- FirebaseCoreInternal (11.5.0):
31+
- FirebaseCoreInternal (11.6.0):
3232
- "GoogleUtilities/NSData+zlib (~> 8.0)"
3333
- FirebaseCrashlytics (11.4.0):
3434
- FirebaseCore (~> 11.4)
@@ -52,7 +52,7 @@ PODS:
5252
- FirebaseSharedSwift (~> 11.0)
5353
- GoogleUtilities/Environment (~> 8.0)
5454
- "GoogleUtilities/NSData+zlib (~> 8.0)"
55-
- FirebaseRemoteConfigInterop (11.5.0)
55+
- FirebaseRemoteConfigInterop (11.6.0)
5656
- FirebaseSessions (11.4.0):
5757
- FirebaseCore (~> 11.4)
5858
- FirebaseCoreExtension (~> 11.4)
@@ -62,7 +62,7 @@ PODS:
6262
- GoogleUtilities/UserDefaults (~> 8.0)
6363
- nanopb (~> 3.30910.0)
6464
- PromisesSwift (~> 2.1)
65-
- FirebaseSharedSwift (11.5.0)
65+
- FirebaseSharedSwift (11.6.0)
6666
- Flutter (1.0.0)
6767
- flutter_native_splash (2.4.3):
6868
- Flutter
@@ -122,20 +122,21 @@ PODS:
122122
- sqflite_darwin (0.0.4):
123123
- Flutter
124124
- FlutterMacOS
125-
- sqlite3 (3.47.0):
126-
- sqlite3/common (= 3.47.0)
127-
- sqlite3/common (3.47.0)
128-
- sqlite3/dbstatvtab (3.47.0):
125+
- sqlite3 (3.47.1):
126+
- sqlite3/common (= 3.47.1)
127+
- sqlite3/common (3.47.1)
128+
- sqlite3/dbstatvtab (3.47.1):
129129
- sqlite3/common
130-
- sqlite3/fts5 (3.47.0):
130+
- sqlite3/fts5 (3.47.1):
131131
- sqlite3/common
132-
- sqlite3/perf-threadsafe (3.47.0):
132+
- sqlite3/perf-threadsafe (3.47.1):
133133
- sqlite3/common
134-
- sqlite3/rtree (3.47.0):
134+
- sqlite3/rtree (3.47.1):
135135
- sqlite3/common
136136
- sqlite3_flutter_libs (0.0.1):
137137
- Flutter
138-
- sqlite3 (~> 3.47.0)
138+
- FlutterMacOS
139+
- sqlite3 (~> 3.47.1)
139140
- sqlite3/dbstatvtab
140141
- sqlite3/fts5
141142
- sqlite3/perf-threadsafe
@@ -164,7 +165,7 @@ DEPENDENCIES:
164165
- quick_actions_ios (from `.symlinks/plugins/quick_actions_ios/ios`)
165166
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
166167
- sqflite_darwin (from `.symlinks/plugins/sqflite_darwin/darwin`)
167-
- sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/ios`)
168+
- sqlite3_flutter_libs (from `.symlinks/plugins/sqlite3_flutter_libs/darwin`)
168169
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
169170
- video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/darwin`)
170171

@@ -226,7 +227,7 @@ EXTERNAL SOURCES:
226227
sqflite_darwin:
227228
:path: ".symlinks/plugins/sqflite_darwin/darwin"
228229
sqlite3_flutter_libs:
229-
:path: ".symlinks/plugins/sqlite3_flutter_libs/ios"
230+
:path: ".symlinks/plugins/sqlite3_flutter_libs/darwin"
230231
url_launcher_ios:
231232
:path: ".symlinks/plugins/url_launcher_ios/ios"
232233
video_player_avfoundation:
@@ -235,19 +236,19 @@ EXTERNAL SOURCES:
235236
SPEC CHECKSUMS:
236237
device_info_plus: bf2e3232933866d73fe290f2942f2156cdd10342
237238
Firebase: cf1b19f21410b029b6786a54e9764a0cacad3c99
238-
firebase_core: 9efc3ecf689cdbc90f13f4dc58108c83ea46b266
239-
firebase_crashlytics: 72a8b504422ba8bb435a7a0c0a9341320cbcbe29
240-
firebase_remote_config: 96a9b7e79624c5d9d16befdef60791966bb83919
239+
firebase_core: 418aed674e9a0b8b6088aec16cde82a811f6261f
240+
firebase_crashlytics: 757e252772ed3dd37c07638f9fcd4dceb5f101c8
241+
firebase_remote_config: 015a36be218a38943c2273d63b33bc983b3d7bb6
241242
FirebaseABTesting: aef1719704fade00b200827e7973f352efc4caee
242243
FirebaseCore: e0510f1523bc0eb21653cac00792e1e2bd6f1771
243244
FirebaseCoreExtension: f1bc67a4702931a7caa097d8e4ac0a1b0d16720e
244-
FirebaseCoreInternal: f47dd28ae7782e6a4738aad3106071a8fe0af604
245+
FirebaseCoreInternal: d98ab91e2d80a56d7b246856a8885443b302c0c2
245246
FirebaseCrashlytics: 41bbdd2b514a8523cede0c217aee6ef7ecf38401
246247
FirebaseInstallations: 6ef4a1c7eb2a61ee1f74727d7f6ce2e72acf1414
247248
FirebaseRemoteConfig: 7655681d02417bc9b287338edb9d721ff79e1a4a
248-
FirebaseRemoteConfigInterop: 7a7aebb9342d53913a5c890efa88e289d9e5c1bc
249+
FirebaseRemoteConfigInterop: e75e348953352a000331eb77caf01e424248e176
249250
FirebaseSessions: 3f56f177d9e53a85021d16b31f9a111849d1dd8b
250-
FirebaseSharedSwift: 302ac5967857ad7e7388b15382d705b8c8d892aa
251+
FirebaseSharedSwift: a4e5dfca3e210633bb3a3dfb94176c019211948b
251252
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
252253
flutter_native_splash: e8a1e01082d97a8099d973f919f57904c925008a
253254
flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
@@ -268,8 +269,8 @@ SPEC CHECKSUMS:
268269
quick_actions_ios: 56f3cbaa71e94f212838d1f9fe354bd0734779bf
269270
shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
270271
sqflite_darwin: 5a7236e3b501866c1c9befc6771dfd73ffb8702d
271-
sqlite3: 0aa20658a9b238a3b1ff7175eb7bdd863b0ab4fd
272-
sqlite3_flutter_libs: b55ef23cfafea5318ae5081e0bf3fbbce8417c94
272+
sqlite3: 1e522f0938463e44b7faf50393b40bdc1e1e456d
273+
sqlite3_flutter_libs: 1b4e98da20ebd4e9b1240269b78cdcf492dbe9f3
273274
url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
274275
video_player_avfoundation: 7c6c11d8470e1675df7397027218274b6d2360b3
275276

lib/base/enums/user_preference.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ enum UserPreference {
66
theme(int),
77
calendarColors(String),
88
browser(bool),
9+
studentCardPicture(bool),
910
failedGrades(bool),
1011
weekends(bool),
1112
hiddenCalendarEntries(bool),

lib/homeComponent/view/contactCard/contact_card_loading_view.dart

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'package:campus_flutter/base/enums/device.dart';
2+
import 'package:campus_flutter/base/services/device_type_service.dart';
13
import 'package:campus_flutter/base/util/placeholder_text.dart';
24
import 'package:campus_flutter/base/util/shimmer_view.dart';
35
import 'package:campus_flutter/homeComponent/view/contactCard/contact_card_view.dart';
@@ -20,15 +22,16 @@ class ContactCardLoadingView extends StatelessWidget {
2022
Column(
2123
crossAxisAlignment: CrossAxisAlignment.start,
2224
children: [
23-
ShimmerView(
24-
child: PlaceholderText(
25-
text: "StudentCard".toUpperCase(),
26-
style: Theme.of(context).textTheme.bodySmall?.copyWith(
27-
color: Colors.grey,
28-
fontWeight: FontWeight.w700,
29-
),
25+
if (DeviceService.getType(context) == Device.phone)
26+
ShimmerView(
27+
child: PlaceholderText(
28+
text: "StudentCard".toUpperCase(),
29+
style: Theme.of(context).textTheme.bodySmall?.copyWith(
30+
color: Colors.grey,
31+
fontWeight: FontWeight.w700,
32+
),
33+
),
3034
),
31-
),
3235
ShimmerView(
3336
child: PlaceholderText(
3437
text: "Max Mustermann",

lib/homeComponent/view/contactCard/contact_card_view.dart

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
import 'package:auto_size_text/auto_size_text.dart';
2+
import 'package:campus_flutter/base/enums/device.dart';
23
import 'package:campus_flutter/base/extensions/base_64_decode_image_data.dart';
4+
import 'package:campus_flutter/base/services/device_type_service.dart';
35
import 'package:campus_flutter/base/util/delayed_loading_indicator.dart';
46
import 'package:campus_flutter/homeComponent/view/contactCard/contact_card_loading_view.dart';
57
import 'package:campus_flutter/navigation_service.dart';
68
import 'package:campus_flutter/personComponent/model/personDetails/person_details.dart';
79
import 'package:campus_flutter/personComponent/model/profile/profile.dart';
810
import 'package:campus_flutter/personComponent/viewModel/person_details_viewmodel.dart';
9-
import 'package:campus_flutter/studentCardComponent/model/student_card.dart';
11+
import 'package:campus_flutter/settingsComponent/views/settings_view.dart';
1012
import 'package:campus_flutter/studentCardComponent/viewModel/student_card_viewmodel.dart';
1113
import 'package:easy_localization/easy_localization.dart';
1214
import 'package:flutter/material.dart';
@@ -60,20 +62,21 @@ class _ContactCardViewState extends ConsumerState<ContactCardView> {
6062
padding: const EdgeInsets.all(10.0),
6163
child: Row(
6264
children: [
63-
profilePicture(),
65+
profilePicture(data),
6466
const Padding(padding: EdgeInsets.only(left: 15)),
6567
Expanded(
6668
child: Column(
6769
crossAxisAlignment: CrossAxisAlignment.start,
6870
mainAxisAlignment: MainAxisAlignment.center,
6971
children: [
70-
Text(
71-
"StudentCard".toUpperCase(),
72-
style: Theme.of(context).textTheme.bodySmall?.copyWith(
73-
color: Colors.grey,
74-
fontWeight: FontWeight.w700,
75-
),
76-
),
72+
if (DeviceService.getType(context) == Device.phone)
73+
Text(
74+
"StudentCard".toUpperCase(),
75+
style: Theme.of(context).textTheme.bodySmall?.copyWith(
76+
color: Colors.grey,
77+
fontWeight: FontWeight.w700,
78+
),
79+
),
7780
Text(
7881
data?.fullName ?? profile.fullName,
7982
style: Theme.of(context).textTheme.headlineSmall,
@@ -95,27 +98,35 @@ class _ContactCardViewState extends ConsumerState<ContactCardView> {
9598
);
9699
}
97100

98-
Widget profilePicture() {
99-
return StreamBuilder(
100-
stream: ref.watch(studentCardViewModel).studentCard,
101-
builder: (context, snapshot) {
102-
if (snapshot.hasData || snapshot.hasError) {
103-
return CircleAvatar(
104-
backgroundImage: imageData(snapshot),
105-
backgroundColor: Theme.of(context).cardTheme.color,
106-
radius: contactImageSize / 2,
107-
);
108-
} else {
109-
return SizedBox(height: contactImageSize, width: contactImageSize);
110-
}
111-
},
101+
Widget profilePicture(PersonDetails? data) {
102+
if (ref.read(showStudentCardPicture)) {
103+
return StreamBuilder(
104+
stream: ref.watch(studentCardViewModel).studentCard,
105+
builder: (context, snapshot) {
106+
if (snapshot.hasData || snapshot.hasError) {
107+
return image(snapshot.data?.firstOrNull?.image);
108+
} else {
109+
return SizedBox(height: contactImageSize, width: contactImageSize);
110+
}
111+
},
112+
);
113+
} else {
114+
return image(data?.imageData);
115+
}
116+
}
117+
118+
Widget image(String? imageData) {
119+
return CircleAvatar(
120+
backgroundImage: provideImage(imageData),
121+
backgroundColor: Theme.of(context).cardTheme.color,
122+
radius: contactImageSize / 2,
112123
);
113124
}
114125

115-
ImageProvider<Object> imageData(AsyncSnapshot<List<StudentCard>?> snapshot) {
116-
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
126+
ImageProvider<Object> provideImage(String? imageData) {
127+
if (imageData != null) {
117128
return Image.memory(
118-
base64DecodeImageData(snapshot.data!.first.image),
129+
base64DecodeImageData(imageData),
119130
).image;
120131
} else {
121132
return const AssetImage(

lib/personComponent/model/personDetails/person_details.dart

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1+
import 'package:campus_flutter/base/enums/gender.dart';
12
import 'package:campus_flutter/personComponent/model/personDetails/contact_info.dart';
3+
import 'package:campus_flutter/personComponent/model/personDetails/organisation.dart';
24
import 'package:campus_flutter/personComponent/model/personDetails/phone_extension.dart';
35
import 'package:campus_flutter/personComponent/model/personDetails/room.dart';
46
import 'package:json_annotation/json_annotation.dart';
57

6-
import '../../../base/enums/gender.dart';
7-
import 'organisation.dart';
8-
98
part 'person_details.g.dart';
109

1110
@JsonSerializable()

lib/settingsComponent/viewModels/settings_viewmodel.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ class SettingsViewModel {
3030
Appearance.values[value as int];
3131
case UserPreference.browser:
3232
ref.read(useWebView.notifier).state = value as bool;
33+
case UserPreference.studentCardPicture:
34+
ref.read(showStudentCardPicture.notifier).state = value as bool;
3335
case UserPreference.failedGrades:
3436
ref.read(hideFailedGrades.notifier).state = value as bool;
3537
case UserPreference.weekends:
@@ -53,6 +55,8 @@ class SettingsViewModel {
5355
value = value.index;
5456
case UserPreference.browser:
5557
ref.read(useWebView.notifier).state = value as bool;
58+
case UserPreference.studentCardPicture:
59+
ref.read(showStudentCardPicture.notifier).state = value as bool;
5660
case UserPreference.failedGrades:
5761
ref.read(hideFailedGrades.notifier).state = value as bool;
5862
case UserPreference.weekends:

lib/settingsComponent/views/appearance_settings_view.dart

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:campus_flutter/base/enums/appearance.dart';
22
import 'package:campus_flutter/base/enums/user_preference.dart';
33
import 'package:campus_flutter/base/util/seperated_list.dart';
4+
import 'package:campus_flutter/personComponent/viewModel/profile_viewmodel.dart';
45
import 'package:campus_flutter/studiesComponent/viewModel/grade_viewmodel.dart';
56
import 'package:campus_flutter/homeComponent/view/widget/widget_frame_view.dart';
67
import 'package:campus_flutter/main.dart';
@@ -22,6 +23,7 @@ class AppearanceSettingsView extends ConsumerWidget {
2223
widgets: [
2324
_appearanceSelection(context, ref),
2425
_useWebView(context, ref),
26+
_showStudentCardPicture(context, ref),
2527
_hideFailedGrades(context, ref),
2628
],
2729
),
@@ -71,6 +73,26 @@ class AppearanceSettingsView extends ConsumerWidget {
7173
);
7274
}
7375

76+
Widget _showStudentCardPicture(BuildContext context, WidgetRef ref) {
77+
return ListTile(
78+
dense: true,
79+
title: Text(
80+
context.tr("showStudentCardPicture"),
81+
style: Theme.of(context).textTheme.bodyMedium,
82+
),
83+
trailing: Switch(
84+
value: ref.watch(showStudentCardPicture),
85+
onChanged: (value) {
86+
ref.read(settingsViewModel).savePreference(
87+
UserPreference.studentCardPicture,
88+
value,
89+
);
90+
ref.read(profileViewModel).fetch(false);
91+
},
92+
),
93+
);
94+
}
95+
7496
Widget _hideFailedGrades(BuildContext context, WidgetRef ref) {
7597
return ListTile(
7698
dense: true,

lib/settingsComponent/views/settings_view.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'package:go_router/go_router.dart';
1414
import 'package:package_info_plus/package_info_plus.dart';
1515

1616
final useWebView = StateProvider<bool>((ref) => true);
17+
final showStudentCardPicture = StateProvider<bool>((ref) => true);
1718
final hideFailedGrades = StateProvider<bool>((ref) => false);
1819
final showWeekends = StateProvider<bool>((ref) => false);
1920
final showHiddenCalendarEntries = StateProvider<bool>((ref) => false);

0 commit comments

Comments
 (0)