navigation updates to make sure update happens after going to sub-space in space analytics
This commit is contained in:
parent
551b0cd407
commit
0e47b84552
10 changed files with 151 additions and 55 deletions
|
|
@ -24,6 +24,7 @@ import 'package:fluffychat/pages/settings_notifications/settings_notifications.d
|
|||
import 'package:fluffychat/pages/settings_password/settings_password.dart';
|
||||
import 'package:fluffychat/pages/settings_security/settings_security.dart';
|
||||
import 'package:fluffychat/pages/settings_style/settings_style.dart';
|
||||
import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart';
|
||||
import 'package:fluffychat/pangea/guard/p_vguard.dart';
|
||||
import 'package:fluffychat/pangea/pages/analytics/student_analytics/student_analytics.dart';
|
||||
import 'package:fluffychat/pangea/pages/exchange/add_exchange_to_class.dart';
|
||||
|
|
@ -171,6 +172,28 @@ abstract class AppRoutes {
|
|||
const StudentAnalyticsPage(),
|
||||
),
|
||||
redirect: loggedOutRedirect,
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: 'messages',
|
||||
pageBuilder: (context, state) => defaultPageBuilder(
|
||||
context,
|
||||
state,
|
||||
const StudentAnalyticsPage(
|
||||
selectedView: BarChartViewSelection.messages,
|
||||
),
|
||||
),
|
||||
),
|
||||
GoRoute(
|
||||
path: 'errors',
|
||||
pageBuilder: (context, state) => defaultPageBuilder(
|
||||
context,
|
||||
state,
|
||||
const StudentAnalyticsPage(
|
||||
selectedView: BarChartViewSelection.grammar,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
GoRoute(
|
||||
path: 'analytics',
|
||||
|
|
@ -189,6 +212,36 @@ abstract class AppRoutes {
|
|||
state,
|
||||
const ClassAnalyticsPage(),
|
||||
),
|
||||
routes: [
|
||||
GoRoute(
|
||||
path: 'messages',
|
||||
pageBuilder: (context, state) => defaultPageBuilder(
|
||||
context,
|
||||
state,
|
||||
ClassAnalyticsPage(
|
||||
// when going to sub-space from within a parent space's analytics, the
|
||||
// analytics list tiles do not properly update. Adding a unique key to this page is the best fix
|
||||
// I can find at the moment
|
||||
key: UniqueKey(),
|
||||
selectedView: BarChartViewSelection.messages,
|
||||
),
|
||||
),
|
||||
),
|
||||
GoRoute(
|
||||
path: 'errors',
|
||||
pageBuilder: (context, state) => defaultPageBuilder(
|
||||
context,
|
||||
state,
|
||||
ClassAnalyticsPage(
|
||||
// when going to sub-space from within a parent space's analytics, the
|
||||
// analytics list tiles do not properly update. Adding a unique key to this page is the best fix
|
||||
// I can find at the moment
|
||||
key: UniqueKey(),
|
||||
selectedView: BarChartViewSelection.grammar,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
|
||||
enum BarChartViewSelection {
|
||||
|
|
@ -30,4 +29,15 @@ extension BarChartViewSelectionExtension on BarChartViewSelection {
|
|||
return Icons.spellcheck_outlined;
|
||||
}
|
||||
}
|
||||
|
||||
String get route {
|
||||
switch (this) {
|
||||
case BarChartViewSelection.messages:
|
||||
return 'messages';
|
||||
// case BarChartViewSelection.vocab:
|
||||
// return 'vocab';
|
||||
case BarChartViewSelection.grammar:
|
||||
return 'errors';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'dart:async';
|
||||
|
||||
import 'package:fluffychat/pangea/controllers/pangea_controller.dart';
|
||||
import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart';
|
||||
import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
|
|
@ -24,6 +25,7 @@ class AnalyticsListTile extends StatefulWidget {
|
|||
required this.isSelected,
|
||||
required this.onTap,
|
||||
required this.pangeaController,
|
||||
this.controller,
|
||||
// this.isEnabled = true,
|
||||
// this.showSpaceAnalytics = true,
|
||||
this.refreshStream,
|
||||
|
|
@ -42,6 +44,7 @@ class AnalyticsListTile extends StatefulWidget {
|
|||
// final bool showSpaceAnalytics;
|
||||
|
||||
final PangeaController pangeaController;
|
||||
final BaseAnalyticsController? controller;
|
||||
final StreamController? refreshStream;
|
||||
|
||||
@override
|
||||
|
|
@ -133,11 +136,17 @@ class AnalyticsListTileState extends State<AnalyticsListTile> {
|
|||
),
|
||||
selected: widget.isSelected,
|
||||
onTap: () {
|
||||
(room?.isSpace ?? false) && widget.allowNavigateOnSelect
|
||||
? context.go(
|
||||
'/rooms/analytics/${room!.id}',
|
||||
)
|
||||
: widget.onTap(widget.selected);
|
||||
if (widget.controller?.widget.selectedView == null) {
|
||||
widget.onTap(widget.selected);
|
||||
return;
|
||||
}
|
||||
if ((room?.isSpace ?? false) && widget.allowNavigateOnSelect) {
|
||||
final String selectedView =
|
||||
widget.controller!.widget.selectedView!.route;
|
||||
context.go('/rooms/analytics/${room!.id}/$selectedView');
|
||||
return;
|
||||
}
|
||||
widget.onTap(widget.selected);
|
||||
},
|
||||
trailing: (room?.isSpace ?? false) &&
|
||||
widget.selected.type != AnalyticsEntryType.privateChats &&
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ import '../../models/chart_analytics_model.dart';
|
|||
class BaseAnalyticsPage extends StatefulWidget {
|
||||
final String pageTitle;
|
||||
final List<TabData> tabs;
|
||||
final BarChartViewSelection? selectedView;
|
||||
|
||||
final AnalyticsSelected defaultSelected;
|
||||
final AnalyticsSelected? alwaysSelected;
|
||||
|
|
@ -30,6 +31,7 @@ class BaseAnalyticsPage extends StatefulWidget {
|
|||
required this.tabs,
|
||||
required this.alwaysSelected,
|
||||
required this.defaultSelected,
|
||||
this.selectedView,
|
||||
this.myAnalyticsController,
|
||||
});
|
||||
|
||||
|
|
@ -39,7 +41,6 @@ class BaseAnalyticsPage extends StatefulWidget {
|
|||
|
||||
class BaseAnalyticsController extends State<BaseAnalyticsPage> {
|
||||
final PangeaController pangeaController = MatrixState.pangeaController;
|
||||
BarChartViewSelection? selectedView;
|
||||
AnalyticsSelected? selected;
|
||||
String? currentLemma;
|
||||
ChartAnalyticsModel? chartData;
|
||||
|
|
@ -125,14 +126,6 @@ class BaseAnalyticsController extends State<BaseAnalyticsPage> {
|
|||
TimeSpan get currentTimeSpan =>
|
||||
pangeaController.analytics.currentAnalyticsTimeSpan;
|
||||
|
||||
void navigate() {
|
||||
if (selectedView != null) {
|
||||
setSelectedView(null);
|
||||
} else {
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> toggleSelection(AnalyticsSelected selectedParam) async {
|
||||
setState(() {
|
||||
debugPrint("selectedParam.id is ${selectedParam.id}");
|
||||
|
|
@ -163,13 +156,6 @@ class BaseAnalyticsController extends State<BaseAnalyticsPage> {
|
|||
refreshStream.add(false);
|
||||
}
|
||||
|
||||
void setSelectedView(BarChartViewSelection? view) {
|
||||
currentLemma = null;
|
||||
selectedView = view;
|
||||
setState(() {});
|
||||
refreshStream.add(false);
|
||||
}
|
||||
|
||||
void setCurrentLemma(String? lemma) {
|
||||
currentLemma = lemma;
|
||||
setState(() {});
|
||||
|
|
@ -206,6 +192,19 @@ class TabItem {
|
|||
|
||||
enum AnalyticsEntryType { student, room, space, privateChats }
|
||||
|
||||
extension AnalyticsEntryTypeExtension on AnalyticsEntryType {
|
||||
String get route {
|
||||
switch (this) {
|
||||
case AnalyticsEntryType.student:
|
||||
return 'mylearning';
|
||||
case AnalyticsEntryType.space:
|
||||
return 'analytics';
|
||||
default:
|
||||
throw Exception('No route for $this');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class AnalyticsSelected {
|
||||
String id;
|
||||
AnalyticsEntryType type;
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ import 'package:fluffychat/widgets/layouts/max_width_body.dart';
|
|||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_gen/gen_l10n/l10n.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
class BaseAnalyticsView extends StatelessWidget {
|
||||
const BaseAnalyticsView({
|
||||
|
|
@ -22,11 +23,11 @@ class BaseAnalyticsView extends StatelessWidget {
|
|||
final BaseAnalyticsController controller;
|
||||
|
||||
Widget chartView(BuildContext context) {
|
||||
if (controller.selectedView == null) {
|
||||
if (controller.widget.selectedView == null) {
|
||||
return const SizedBox();
|
||||
}
|
||||
|
||||
switch (controller.selectedView!) {
|
||||
switch (controller.widget.selectedView!) {
|
||||
case BarChartViewSelection.messages:
|
||||
return MessagesBarChart(
|
||||
chartAnalytics: controller.chartData,
|
||||
|
|
@ -60,36 +61,32 @@ class BaseAnalyticsView extends StatelessWidget {
|
|||
text: controller.widget.pageTitle,
|
||||
style: const TextStyle(decoration: TextDecoration.underline),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () => controller.selectedView != null
|
||||
? controller.setSelectedView(null)
|
||||
: null,
|
||||
..onTap = () {
|
||||
if (controller.widget.selectedView == null) return;
|
||||
String route =
|
||||
"/rooms/${controller.widget.defaultSelected.type.route}";
|
||||
if (controller.widget.defaultSelected.type ==
|
||||
AnalyticsEntryType.space) {
|
||||
route += "/${controller.widget.defaultSelected.id}";
|
||||
}
|
||||
context.go(route);
|
||||
},
|
||||
),
|
||||
if (controller.selectedView != null)
|
||||
if (controller.widget.selectedView != null)
|
||||
const TextSpan(
|
||||
text: " > ",
|
||||
),
|
||||
if (controller.selectedView != null)
|
||||
TextSpan(
|
||||
style: const TextStyle(decoration: TextDecoration.underline),
|
||||
text: controller.selectedView!.string(context),
|
||||
recognizer: TapGestureRecognizer()
|
||||
..onTap = () => controller.currentLemma != null
|
||||
? controller.setCurrentLemma(null)
|
||||
: null,
|
||||
),
|
||||
if (controller.widget.selectedView != null)
|
||||
TextSpan(text: controller.widget.selectedView!.string(context)),
|
||||
],
|
||||
),
|
||||
overflow: TextOverflow.ellipsis,
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
leading: IconButton(
|
||||
icon: const Icon(Icons.arrow_back),
|
||||
onPressed: controller.navigate,
|
||||
),
|
||||
),
|
||||
body: MaxWidthBody(
|
||||
withScrolling: false,
|
||||
child: controller.selectedView != null
|
||||
child: controller.widget.selectedView != null
|
||||
? Column(
|
||||
children: [
|
||||
Row(
|
||||
|
|
@ -177,6 +174,7 @@ class BaseAnalyticsView extends StatelessWidget {
|
|||
.allowNavigateOnSelect,
|
||||
pangeaController:
|
||||
controller.pangeaController,
|
||||
controller: controller,
|
||||
),
|
||||
),
|
||||
if (controller
|
||||
|
|
@ -202,6 +200,7 @@ class BaseAnalyticsView extends StatelessWidget {
|
|||
onTap: controller.toggleSelection,
|
||||
pangeaController:
|
||||
controller.pangeaController,
|
||||
controller: controller,
|
||||
),
|
||||
],
|
||||
),
|
||||
|
|
@ -230,6 +229,7 @@ class BaseAnalyticsView extends StatelessWidget {
|
|||
.allowNavigateOnSelect,
|
||||
pangeaController:
|
||||
controller.pangeaController,
|
||||
controller: controller,
|
||||
),
|
||||
)
|
||||
.toList(),
|
||||
|
|
@ -249,7 +249,7 @@ class BaseAnalyticsView extends StatelessWidget {
|
|||
children: [
|
||||
const Divider(height: 1),
|
||||
ListTile(
|
||||
title: const Text("Error Analytics"),
|
||||
title: Text(L10n.of(context)!.grammarAnalytics),
|
||||
leading: CircleAvatar(
|
||||
backgroundColor:
|
||||
Theme.of(context).scaffoldBackgroundColor,
|
||||
|
|
@ -258,13 +258,20 @@ class BaseAnalyticsView extends StatelessWidget {
|
|||
child: Icon(BarChartViewSelection.grammar.icon),
|
||||
),
|
||||
trailing: const Icon(Icons.chevron_right),
|
||||
onTap: () => controller.setSelectedView(
|
||||
BarChartViewSelection.grammar,
|
||||
),
|
||||
onTap: () {
|
||||
String route =
|
||||
"/rooms/${controller.widget.defaultSelected.type.route}";
|
||||
if (controller.widget.defaultSelected.type ==
|
||||
AnalyticsEntryType.space) {
|
||||
route += "/${controller.widget.defaultSelected.id}";
|
||||
}
|
||||
route += "/${BarChartViewSelection.grammar.route}";
|
||||
context.go(route);
|
||||
},
|
||||
),
|
||||
const Divider(height: 1),
|
||||
ListTile(
|
||||
title: const Text("Message Analytics"),
|
||||
title: Text(L10n.of(context)!.messageAnalytics),
|
||||
leading: CircleAvatar(
|
||||
backgroundColor:
|
||||
Theme.of(context).scaffoldBackgroundColor,
|
||||
|
|
@ -273,9 +280,16 @@ class BaseAnalyticsView extends StatelessWidget {
|
|||
child: Icon(BarChartViewSelection.messages.icon),
|
||||
),
|
||||
trailing: const Icon(Icons.chevron_right),
|
||||
onTap: () => controller.setSelectedView(
|
||||
BarChartViewSelection.messages,
|
||||
),
|
||||
onTap: () {
|
||||
String route =
|
||||
"/rooms/${controller.widget.defaultSelected.type.route}";
|
||||
if (controller.widget.defaultSelected.type ==
|
||||
AnalyticsEntryType.space) {
|
||||
route += "/${controller.widget.defaultSelected.id}";
|
||||
}
|
||||
route += "/${BarChartViewSelection.messages.route}";
|
||||
context.go(route);
|
||||
},
|
||||
),
|
||||
const Divider(height: 1),
|
||||
],
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ import 'dart:async';
|
|||
import 'dart:developer';
|
||||
|
||||
import 'package:fluffychat/pangea/constants/pangea_room_types.dart';
|
||||
import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart';
|
||||
import 'package:fluffychat/pangea/extensions/pangea_room_extension/pangea_room_extension.dart';
|
||||
import 'package:fluffychat/pangea/utils/error_handler.dart';
|
||||
import 'package:fluffychat/pangea/widgets/common/list_placeholder.dart';
|
||||
|
|
@ -18,7 +19,8 @@ import 'class_analytics_view.dart';
|
|||
enum AnalyticsPageType { classList, student, classDetails }
|
||||
|
||||
class ClassAnalyticsPage extends StatefulWidget {
|
||||
const ClassAnalyticsPage({super.key});
|
||||
final BarChartViewSelection? selectedView;
|
||||
const ClassAnalyticsPage({super.key, this.selectedView});
|
||||
|
||||
@override
|
||||
State<ClassAnalyticsPage> createState() => ClassAnalyticsV2Controller();
|
||||
|
|
@ -40,6 +42,9 @@ class ClassAnalyticsV2Controller extends State<ClassAnalyticsPage> {
|
|||
_classRoom = classId != null
|
||||
? Matrix.of(context).client.getRoomById(classId!)
|
||||
: null;
|
||||
if (_classRoom == null) {
|
||||
context.go('/rooms/analytics');
|
||||
}
|
||||
getChatAndStudents();
|
||||
}
|
||||
return _classRoom;
|
||||
|
|
|
|||
|
|
@ -48,6 +48,7 @@ class ClassAnalyticsView extends StatelessWidget {
|
|||
|
||||
return controller.classId != null
|
||||
? BaseAnalyticsPage(
|
||||
selectedView: controller.widget.selectedView,
|
||||
pageTitle: pageTitle,
|
||||
tabs: [tab1, tab2],
|
||||
alwaysSelected: AnalyticsSelected(
|
||||
|
|
|
|||
|
|
@ -61,9 +61,11 @@ class AnalyticsClassListView extends StatelessWidget {
|
|||
AnalyticsEntryType.space,
|
||||
snapshot.data![i].name,
|
||||
),
|
||||
onTap: (selected) => context.go(
|
||||
'/rooms/analytics/${selected.id}',
|
||||
),
|
||||
onTap: (selected) {
|
||||
context.go(
|
||||
'/rooms/analytics/${selected.id}',
|
||||
);
|
||||
},
|
||||
allowNavigateOnSelect: true,
|
||||
isSelected: false,
|
||||
pangeaController: controller.pangeaController,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import 'dart:async';
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:fluffychat/pangea/enum/bar_chart_view_enum.dart';
|
||||
import 'package:fluffychat/pangea/widgets/common/list_placeholder.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
|
@ -13,7 +14,8 @@ import '../base_analytics.dart';
|
|||
import 'student_analytics_view.dart';
|
||||
|
||||
class StudentAnalyticsPage extends StatefulWidget {
|
||||
const StudentAnalyticsPage({super.key});
|
||||
final BarChartViewSelection? selectedView;
|
||||
const StudentAnalyticsPage({super.key, this.selectedView});
|
||||
|
||||
@override
|
||||
State<StudentAnalyticsPage> createState() => StudentAnalyticsController();
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@ class StudentAnalyticsView extends StatelessWidget {
|
|||
|
||||
return controller.userId != null
|
||||
? BaseAnalyticsPage(
|
||||
selectedView: controller.widget.selectedView,
|
||||
pageTitle: pageTitle,
|
||||
tabs: [chatTabData, classTabData],
|
||||
alwaysSelected: AnalyticsSelected(
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue