Skip to content

Commit a564465

Browse files
authored
Merge pull request #377 from HydrogenC/ui-tweaks
UI tweaks for forum (1st Pass)
2 parents 5f0c0b5 + c6957c0 commit a564465

24 files changed

+525
-500
lines changed

android/app/src/main/AndroidManifest.xml

-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@
5959
<!-- Deep Links -->
6060
<intent-filter>
6161
<action android:name="android.intent.action.VIEW" />
62-
6362
<category android:name="android.intent.category.DEFAULT" />
6463
<category android:name="android.intent.category.BROWSABLE" />
6564
<!-- Accepts URIs that begin with YOUR_SCHEME://YOUR_HOST -->

lib/page/danke/course_group_detail.dart

+7-4
Original file line numberDiff line numberDiff line change
@@ -31,13 +31,13 @@ import 'package:dan_xi/util/public_extension_methods.dart';
3131
import 'package:dan_xi/util/stream_listener.dart';
3232
import 'package:dan_xi/widget/danke/course_review_widget.dart';
3333
import 'package:dan_xi/widget/danke/course_widgets.dart';
34+
import 'package:dan_xi/widget/libraries/chip_widgets.dart';
3435
import 'package:dan_xi/widget/libraries/error_page_widget.dart';
3536
import 'package:dan_xi/widget/libraries/future_widget.dart';
3637
import 'package:dan_xi/widget/libraries/paged_listview.dart';
3738
import 'package:dan_xi/widget/libraries/platform_app_bar_ex.dart';
3839
import 'package:dan_xi/widget/libraries/platform_context_menu.dart';
3940
import 'package:dan_xi/widget/libraries/top_controller.dart';
40-
import 'package:dan_xi/widget/forum/forum_widgets.dart';
4141
import 'package:flutter/cupertino.dart';
4242
import 'package:flutter/material.dart';
4343
import 'package:flutter/services.dart';
@@ -327,6 +327,9 @@ class CourseGroupDetailState extends State<CourseGroupDetail> {
327327
}
328328

329329
Widget _buildHead(BuildContext context) {
330+
final overallWord =
331+
S.of(context).curriculum_ratings_overall_words.split(';');
332+
330333
var wildCard = S.of(context).all;
331334
var teacherList = [
332335
FilterTag(wildCard, "*"),
@@ -358,9 +361,9 @@ class CourseGroupDetailState extends State<CourseGroupDetail> {
358361
color: Colors.grey)),
359362
..._courseGroup!.credits!.map((e) => Padding(
360363
padding: const EdgeInsets.symmetric(horizontal: 4),
361-
child: OTLeadingTag(
364+
child: LeadingChip(
362365
color: Colors.orange,
363-
text:
366+
label:
364367
"${e.toStringAsFixed(1)} ${S.of(context).credits}",
365368
)))
366369
],
@@ -376,7 +379,7 @@ class CourseGroupDetailState extends State<CourseGroupDetail> {
376379
),
377380
averageOverallLevel >= 0
378381
? Text(
379-
overallWord![averageOverallLevel],
382+
overallWord[averageOverallLevel],
380383
style: TextStyle(
381384
color: wordColor[averageOverallLevel],
382385
fontSize: 15),

lib/page/danke/course_review_editor.dart

+13-4
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,15 @@ class CourseReviewEditorWidgetState extends State<CourseReviewEditorWidget> {
332332
teacherFilterNotifier.value = selectedCourse.teachers!;
333333
}
334334

335+
final overallWord =
336+
S.of(context).curriculum_ratings_overall_words.split(';');
337+
final contentWord =
338+
S.of(context).curriculum_ratings_content_words.split(';');
339+
final workloadWord =
340+
S.of(context).curriculum_ratings_workload_words.split(';');
341+
final assessmentWord =
342+
S.of(context).curriculum_ratings_assessment_words.split(';');
343+
335344
return ChangeNotifierProvider(
336345
create: (_) => review.grade.clone(),
337346
child: SingleChildScrollView(
@@ -444,7 +453,7 @@ class CourseReviewEditorWidgetState extends State<CourseReviewEditorWidget> {
444453
)),
445454
Consumer<CourseGrade>(
446455
builder: (ctx, grade, _) => RatingTextWidget(
447-
words: overallWord!, rating: grade.overall ?? 0)),
456+
words: overallWord, rating: grade.overall ?? 0)),
448457
Center(
449458
child: Text(S.of(context).curriculum_ratings_content)),
450459
Builder(
@@ -459,7 +468,7 @@ class CourseReviewEditorWidgetState extends State<CourseReviewEditorWidget> {
459468
})),
460469
Consumer<CourseGrade>(
461470
builder: (ctx, grade, _) => RatingTextWidget(
462-
words: contentWord!, rating: grade.content ?? 0)),
471+
words: contentWord, rating: grade.content ?? 0)),
463472
Center(
464473
child: Text(S.of(context).curriculum_ratings_workload)),
465474
Builder(
@@ -475,7 +484,7 @@ class CourseReviewEditorWidgetState extends State<CourseReviewEditorWidget> {
475484
)),
476485
Consumer<CourseGrade>(
477486
builder: (ctx, grade, _) => RatingTextWidget(
478-
words: workloadWord!, rating: grade.workload ?? 0)),
487+
words: workloadWord, rating: grade.workload ?? 0)),
479488
Center(
480489
child:
481490
Text(S.of(context).curriculum_ratings_assessment)),
@@ -492,7 +501,7 @@ class CourseReviewEditorWidgetState extends State<CourseReviewEditorWidget> {
492501
)),
493502
Consumer<CourseGrade>(
494503
builder: (ctx, grade, _) => RatingTextWidget(
495-
words: assessmentWord!,
504+
words: assessmentWord,
496505
rating: grade.assessment ?? 0)),
497506
],
498507
),

lib/page/forum/admin_operation.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ class AdminOperationPageState extends State<AdminOperationPage> {
156156
children: [
157157
OTFloorWidget(
158158
floor: _floor,
159-
showBottomBar: false,
159+
showToolBars: false,
160160
hasBackgroundImage: _backgroundImage != null),
161161
const Divider(),
162162
FutureFoledListWidget(

lib/page/forum/hole_detail.dart

+40-26
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import 'package:dan_xi/widget/forum/forum_widgets.dart';
5050
import 'package:flutter/cupertino.dart';
5151
import 'package:flutter/material.dart';
5252
import 'package:flutter/services.dart';
53+
import 'package:flutter/widgets.dart';
5354
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
5455
import 'package:flutter_progress_dialog/flutter_progress_dialog.dart';
5556
import 'package:intl/intl.dart';
@@ -127,8 +128,7 @@ class BBSPostDetailState extends State<BBSPostDetail> {
127128
Future<List<OTFloor>?> _loadContent(int page) async {
128129
Future<List<OTFloor>?> loadPunishmentHistory(int page) async {
129130
if (page == 0) {
130-
return (await ForumRepository.getInstance()
131-
.getPunishmentHistory())
131+
return (await ForumRepository.getInstance().getPunishmentHistory())
132132
?.map((e) => e.floor!)
133133
.toList();
134134
} else {
@@ -140,10 +140,9 @@ class BBSPostDetailState extends State<BBSPostDetail> {
140140
final results = switch (_renderModel) {
141141
Normal(hole: var hole) => await ForumRepository.getInstance()
142142
.loadFloors(hole, startFloor: page * Constant.POST_COUNT_PER_PAGE),
143-
Search(keyword: var searchKeyword) =>
144-
await ForumRepository.getInstance().loadSearchResults(
145-
searchKeyword,
146-
startFloor: _listViewController.length()),
143+
Search(keyword: var searchKeyword) => await ForumRepository.getInstance()
144+
.loadSearchResults(searchKeyword,
145+
startFloor: _listViewController.length()),
147146
PunishmentHistory() => await loadPunishmentHistory(page),
148147
};
149148

@@ -183,8 +182,8 @@ class BBSPostDetailState extends State<BBSPostDetail> {
183182

184183
// Update hole view count
185184
if (hole.hole_id != null) {
186-
unawaited(ForumRepository.getInstance()
187-
.updateHoleViewCount(hole.hole_id!));
185+
unawaited(
186+
ForumRepository.getInstance().updateHoleViewCount(hole.hole_id!));
188187
}
189188
} else if (widget.arguments!.containsKey('searchKeyword')) {
190189
_renderModel = Search(widget.arguments!['searchKeyword']);
@@ -685,9 +684,7 @@ class BBSPostDetailState extends State<BBSPostDetail> {
685684
Navigator.of(cxt).pop(newDivision);
686685
}
687686

688-
ForumRepository.getInstance()
689-
.getDivisions()
690-
.forEach((value) {
687+
ForumRepository.getInstance().getDivisions().forEach((value) {
691688
list.add(ListTile(
692689
title: Text(value.name ?? "null"),
693690
subtitle: Text(value.description ?? ""),
@@ -777,16 +774,16 @@ class BBSPostDetailState extends State<BBSPostDetail> {
777774
String postTimeStr = S.of(menuContext).post_time(postTime);
778775

779776
List<Widget> menu = [
780-
if (e.is_me == true && e.deleted == false)
777+
if (e.is_me == true && e.deleted == false) ...[
781778
PlatformContextMenuItem(
782779
menuContext: menuContext,
783780
onPressed: () async {
784781
if (await OTEditor.modifyReply(
785782
context, e.hole_id, e.floor_id, e.content)) {
783+
if (!context.mounted) return;
786784
Noticing.showMaterialNotice(
787785
context, S.of(context).request_success);
788-
ForumRepository.getInstance()
789-
.invalidateFloorCache(e.floor_id!);
786+
ForumRepository.getInstance().invalidateFloorCache(e.floor_id!);
790787
final newFloor = await ForumRepository.getInstance()
791788
.loadSpecificFloor(e.floor_id!);
792789
_listViewController.replaceDatumWith(e, newFloor!);
@@ -798,6 +795,31 @@ class BBSPostDetailState extends State<BBSPostDetail> {
798795
},
799796
child: Text(S.of(context).modify),
800797
),
798+
PlatformContextMenuItem(
799+
menuContext: menuContext,
800+
onPressed: () async {
801+
if (await Noticing.showConfirmationDialog(context,
802+
S.of(context).about_to_delete_floor(e.floor_id ?? "null"),
803+
title: S.of(context).are_you_sure,
804+
isConfirmDestructive: true) ==
805+
true) {
806+
if (!context.mounted) return;
807+
try {
808+
await ForumRepository.getInstance().deleteFloor(e.floor_id!);
809+
Noticing.showMaterialNotice(
810+
context, S.of(context).request_success);
811+
ForumRepository.getInstance().invalidateFloorCache(e.floor_id!);
812+
final newFloor = await ForumRepository.getInstance()
813+
.loadSpecificFloor(e.floor_id!);
814+
_listViewController.replaceDatumWith(e, newFloor!);
815+
} catch (e, st) {
816+
Noticing.showErrorDialog(context, e, trace: st);
817+
}
818+
}
819+
},
820+
child: Text(S.of(context).delete),
821+
)
822+
],
801823

802824
// Standard Operations
803825
PlatformContextMenuItem(
@@ -854,6 +876,7 @@ class BBSPostDetailState extends State<BBSPostDetail> {
854876
isDestructive: true,
855877
onPressed: () async {
856878
if (await OTEditor.reportPost(context, e.floor_id)) {
879+
if (!context.mounted) return;
857880
Noticing.showMaterialNotice(context, S.of(context).report_success);
858881
}
859882
},
@@ -993,8 +1016,7 @@ class BBSPostDetailState extends State<BBSPostDetail> {
9931016
.loadFloors(hole,
9941017
startFloor: pageIndex * Constant.POST_COUNT_PER_PAGE),
9951018
Search(keyword: var searchKeyword) =>
996-
await ForumRepository.getInstance().loadSearchResults(
997-
searchKeyword,
1019+
await ForumRepository.getInstance().loadSearchResults(searchKeyword,
9981020
startFloor: pageIndex * Constant.POST_COUNT_PER_PAGE),
9991021
PunishmentHistory() =>
10001022
(await ForumRepository.getInstance().getPunishmentHistory())
@@ -1017,14 +1039,6 @@ class BBSPostDetailState extends State<BBSPostDetail> {
10171039
final floorWidget = OTFloorWidget(
10181040
hasBackgroundImage: _backgroundImage != null,
10191041
floor: floor,
1020-
// Refresh single floor when modified or deleted
1021-
onOperation: () async {
1022-
ForumRepository.getInstance()
1023-
.invalidateFloorCache(floor.floor_id!);
1024-
final newFloor = await ForumRepository.getInstance()
1025-
.loadSpecificFloor(floor.floor_id!);
1026-
_listViewController.replaceDatumWith(floor, newFloor!);
1027-
},
10281042
index: _renderModel is Normal ? index : null,
10291043
isInMention: isNested,
10301044
parentHole: switch (_renderModel) {
@@ -1077,8 +1091,8 @@ class BBSPostDetailState extends State<BBSPostDetail> {
10771091
final int length = _listViewController.length();
10781092
smartNavigatorPush(context, '/image/detail', arguments: {
10791093
'preview_url': url,
1080-
'hd_url': ForumRepository.getInstance()
1081-
.extractHighDefinitionImageUrl(url!),
1094+
'hd_url':
1095+
ForumRepository.getInstance().extractHighDefinitionImageUrl(url!),
10821096
'hero_tag': heroTag,
10831097
'image_list': extractAllImages(),
10841098
'loader': loadPageImage,

lib/page/forum/hole_editor.dart

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import 'package:dan_xi/widget/libraries/error_page_widget.dart';
4040
import 'package:dan_xi/widget/libraries/image_picker_proxy.dart';
4141
import 'package:dan_xi/widget/libraries/linkify_x.dart';
4242
import 'package:dan_xi/widget/libraries/platform_app_bar_ex.dart';
43-
import 'package:dan_xi/widget/libraries/round_chip.dart';
43+
import 'package:dan_xi/widget/libraries/chip_widgets.dart';
4444
import 'package:dan_xi/widget/libraries/scale_transform.dart';
4545
import 'package:dan_xi/widget/forum/ottag_selector.dart';
4646
import 'package:flutter/cupertino.dart';
@@ -326,7 +326,7 @@ class BBSEditorWidgetState extends State<BBSEditorWidget> {
326326
final GlobalKey<OTTagSelectorState> _tagSelectorKey =
327327
GlobalKey<OTTagSelectorState>();
328328

329-
Future _buildStickersSheet(BuildContext context) {
329+
Future<T?> _buildStickersSheet<T>(BuildContext context) {
330330
return showPlatformModalSheet(
331331
context: context,
332332
builder: (BuildContext context) {

lib/page/forum/quiz.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import 'package:dan_xi/provider/settings_provider.dart';
55
import 'package:dan_xi/repository/forum/forum_repository.dart';
66
import 'package:dan_xi/util/browser_util.dart';
77
import 'package:dan_xi/util/public_extension_methods.dart';
8-
import 'package:dan_xi/widget/libraries/round_chip.dart';
8+
import 'package:dan_xi/widget/libraries/chip_widgets.dart';
99
import 'package:flutter_platform_widgets/flutter_platform_widgets.dart';
1010
import 'package:flutter/material.dart';
1111

lib/page/home_page.dart

+4-4
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ import 'package:provider/provider.dart';
6161
import 'package:quick_actions/quick_actions.dart';
6262
import 'package:receive_intent/receive_intent.dart' as ri;
6363
import 'package:screen_capture_event/screen_capture_event.dart';
64-
import 'package:uni_links/uni_links.dart';
64+
import 'package:app_links/app_links.dart';
6565
import 'package:xiao_mi_push_plugin/entity/mi_push_command_message_entity.dart';
6666
import 'package:xiao_mi_push_plugin/entity/mi_push_message_entity.dart';
6767
import 'package:xiao_mi_push_plugin/xiao_mi_push_plugin.dart';
@@ -351,12 +351,12 @@ class HomePageState extends State<HomePage> with WidgetsBindingObserver {
351351
// is recognized as an invalid path by [dealWithUri] now. Improve it later.
352352
if (PlatformX.isWeb) return;
353353

354-
Uri? initialUri;
355-
initialUri = await getInitialUri();
354+
final appLinks = AppLinks();
355+
Uri? initialUri = await appLinks.getInitialLink();
356356
if (initialUri != null) await dealWithUri(initialUri);
357357

358358
_uniLinksSubscription.bindOnlyInvalid(
359-
uriLinkStream.listen((Uri? uri) async {
359+
appLinks.uriLinkStream.listen((Uri? uri) async {
360360
if (uri != null) await dealWithUri(uri);
361361
}, onError: (Object error) {
362362
// Handle exception by warning the user their action did not succeed

lib/page/subpage_danke.dart

+1-9
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import 'package:dan_xi/repository/forum/forum_repository.dart';
2828
import 'package:dan_xi/util/master_detail_view.dart';
2929
import 'package:dan_xi/widget/danke/course_list_widget.dart';
3030
import 'package:dan_xi/widget/danke/course_search_bar.dart';
31-
import 'package:dan_xi/widget/danke/course_widgets.dart';
3231
import 'package:dan_xi/widget/danke/random_review_widgets.dart';
3332
import 'package:dan_xi/widget/libraries/error_page_widget.dart';
3433
import 'package:dan_xi/widget/libraries/future_widget.dart';
@@ -59,14 +58,7 @@ class DankeSubPageState extends PlatformSubpageState<DankeSubPage> {
5958

6059
@override
6160
Widget buildPage(BuildContext context) {
62-
if (overallWord == null) {
63-
overallWord = S.of(context).curriculum_ratings_overall_words.split(';');
64-
contentWord = S.of(context).curriculum_ratings_content_words.split(';');
65-
workloadWord = S.of(context).curriculum_ratings_workload_words.split(';');
66-
assessmentWord =
67-
S.of(context).curriculum_ratings_assessment_words.split(';');
68-
}
69-
61+
7062
_backgroundImage = SettingsProvider.getInstance().backgroundImage;
7163
return Container(
7264
// padding top

lib/widget/danke/course_review_widget.dart

+13-4
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,15 @@ class ReviewFooter extends StatelessWidget {
214214

215215
@override
216216
Widget build(BuildContext context) {
217+
final overallWord =
218+
S.of(context).curriculum_ratings_overall_words.split(';');
219+
final contentWord =
220+
S.of(context).curriculum_ratings_content_words.split(';');
221+
final workloadWord =
222+
S.of(context).curriculum_ratings_workload_words.split(';');
223+
final assessmentWord =
224+
S.of(context).curriculum_ratings_assessment_words.split(';');
225+
217226
const labelStyle = TextStyle(color: Colors.grey, fontSize: 12);
218227

219228
return Wrap(
@@ -229,7 +238,7 @@ class ReviewFooter extends StatelessWidget {
229238
width: 6,
230239
),
231240
Text(
232-
overallWord![overallLevel],
241+
overallWord[overallLevel],
233242
style: TextStyle(color: wordColor[overallLevel], fontSize: 12),
234243
)
235244
],
@@ -242,7 +251,7 @@ class ReviewFooter extends StatelessWidget {
242251
width: 6,
243252
),
244253
Text(
245-
contentWord![styleLevel],
254+
contentWord[styleLevel],
246255
style: TextStyle(color: wordColor[styleLevel], fontSize: 12),
247256
)
248257
],
@@ -255,7 +264,7 @@ class ReviewFooter extends StatelessWidget {
255264
width: 6,
256265
),
257266
Text(
258-
workloadWord![workloadLevel],
267+
workloadWord[workloadLevel],
259268
style: TextStyle(color: wordColor[workloadLevel], fontSize: 12),
260269
)
261270
],
@@ -269,7 +278,7 @@ class ReviewFooter extends StatelessWidget {
269278
width: 6,
270279
),
271280
Text(
272-
assessmentWord![assessmentLevel],
281+
assessmentWord[assessmentLevel],
273282
style: TextStyle(color: wordColor[assessmentLevel], fontSize: 12),
274283
)
275284
],

0 commit comments

Comments
 (0)