forked from firka/student-legacy
527 lines
20 KiB
Dart
527 lines
20 KiB
Dart
import 'package:flutter_svg/svg.dart';
|
|
import 'package:intl/intl.dart';
|
|
import 'package:provider/provider.dart';
|
|
import 'package:refilc/api/providers/database_provider.dart';
|
|
import 'package:refilc/api/providers/user_provider.dart';
|
|
import 'package:refilc/helpers/subject.dart';
|
|
import 'package:refilc/models/settings.dart';
|
|
import 'package:refilc/theme/colors/colors.dart';
|
|
import 'package:refilc/theme/colors/utils.dart';
|
|
import 'package:refilc/utils/format.dart';
|
|
import 'package:refilc_kreta_api/models/lesson.dart';
|
|
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart';
|
|
import 'package:refilc_mobile_ui/common/round_border_icon.dart';
|
|
import 'package:refilc/ui/widgets/lesson/lesson_tile.dart';
|
|
import 'package:flutter/material.dart';
|
|
|
|
class LessonViewable extends StatefulWidget {
|
|
const LessonViewable(
|
|
this.lesson, {
|
|
super.key,
|
|
this.swapDesc = false,
|
|
required this.customDesc,
|
|
this.showSubTiles = true,
|
|
});
|
|
|
|
final Lesson lesson;
|
|
final bool swapDesc;
|
|
final String customDesc;
|
|
final bool showSubTiles;
|
|
|
|
@override
|
|
State<LessonViewable> createState() => LessonViewableState();
|
|
}
|
|
|
|
class LessonViewableState extends State<LessonViewable> {
|
|
final _descTxt = TextEditingController();
|
|
|
|
late UserProvider user;
|
|
late DatabaseProvider databaseProvider;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
user = Provider.of<UserProvider>(context);
|
|
databaseProvider = Provider.of<DatabaseProvider>(context);
|
|
|
|
if (widget.customDesc.replaceAll(' ', '') != '' &&
|
|
widget.customDesc != widget.lesson.description) {
|
|
_descTxt.text = widget.customDesc;
|
|
}
|
|
|
|
Lesson lsn = widget.lesson;
|
|
lsn.description = widget.customDesc;
|
|
|
|
final tile = LessonTile(
|
|
lsn,
|
|
swapDesc: widget.swapDesc,
|
|
showSubTiles: widget.showSubTiles,
|
|
);
|
|
|
|
if (lsn.subject.id == '' || tile.lesson.isEmpty) return tile;
|
|
|
|
return GestureDetector(
|
|
onTap: () => TimetableLessonPopup.show(
|
|
context: context,
|
|
lesson: lsn,
|
|
),
|
|
child: LessonTile(
|
|
lsn,
|
|
swapDesc: widget.swapDesc,
|
|
showSubTiles: widget.showSubTiles,
|
|
// onTap: () => TimetableLessonPopup.show(
|
|
// context: context,
|
|
// lesson: lsn,
|
|
// ),
|
|
),
|
|
);
|
|
|
|
// return Viewable(
|
|
// tile: tile,
|
|
// view: CardHandle(child: LessonView(lsn)),
|
|
// actions: [
|
|
// PanelButton(
|
|
// background: true,
|
|
// title: Text(
|
|
// "edit_lesson".i18n,
|
|
// textAlign: TextAlign.center,
|
|
// maxLines: 2,
|
|
// overflow: TextOverflow.ellipsis,
|
|
// ),
|
|
// onPressed: () {
|
|
// Navigator.of(context, rootNavigator: true).pop();
|
|
|
|
// if (!Provider.of<PlusProvider>(context, listen: false)
|
|
// .hasScope(PremiumScopes.timetableNotes)) {
|
|
// PlusLockedFeaturePopup.show(
|
|
// context: context, feature: PremiumFeature.timetableNotes);
|
|
|
|
// return;
|
|
// }
|
|
|
|
// showDialog(
|
|
// context: context,
|
|
// builder: (context) => StatefulBuilder(builder: (context, setS) {
|
|
// return AlertDialog(
|
|
// shape: const RoundedRectangleBorder(
|
|
// borderRadius: BorderRadius.all(Radius.circular(14.0))),
|
|
// title: Text("edit_lesson".i18n),
|
|
// content: Column(
|
|
// mainAxisSize: MainAxisSize.min,
|
|
// children: [
|
|
// // description
|
|
// TextField(
|
|
// controller: _descTxt,
|
|
// decoration: InputDecoration(
|
|
// border: OutlineInputBorder(
|
|
// borderSide: const BorderSide(
|
|
// color: Colors.grey, width: 1.5),
|
|
// borderRadius: BorderRadius.circular(12.0),
|
|
// ),
|
|
// focusedBorder: OutlineInputBorder(
|
|
// borderSide: const BorderSide(
|
|
// color: Colors.grey, width: 1.5),
|
|
// borderRadius: BorderRadius.circular(12.0),
|
|
// ),
|
|
// contentPadding:
|
|
// const EdgeInsets.symmetric(horizontal: 12.0),
|
|
// hintText: 'l_desc'.i18n,
|
|
// suffixIcon: IconButton(
|
|
// icon: const Icon(
|
|
// FeatherIcons.x,
|
|
// color: Colors.grey,
|
|
// size: 18.0,
|
|
// ),
|
|
// onPressed: () {
|
|
// setState(() {
|
|
// _descTxt.text = '';
|
|
// });
|
|
// },
|
|
// ),
|
|
// ),
|
|
// ),
|
|
// // const SizedBox(
|
|
// // height: 14.0,
|
|
// // ),
|
|
// // // class
|
|
// // TextField(
|
|
// // controller: _descTxt,
|
|
// // onEditingComplete: () async {
|
|
// // // SharedTheme? theme = await shareProvider.getThemeById(
|
|
// // // context,
|
|
// // // id: _paintId.text.replaceAll(' ', ''),
|
|
// // // );
|
|
|
|
// // // if (theme != null) {
|
|
// // // // set theme variable
|
|
// // // newThemeByID = theme;
|
|
|
|
// // // _paintId.clear();
|
|
// // // } else {
|
|
// // // ScaffoldMessenger.of(context).showSnackBar(
|
|
// // // CustomSnackBar(
|
|
// // // content: Text("theme_not_found".i18n,
|
|
// // // style: const TextStyle(color: Colors.white)),
|
|
// // // backgroundColor: AppColors.of(context).red,
|
|
// // // context: context,
|
|
// // // ),
|
|
// // // );
|
|
// // // }
|
|
// // },
|
|
// // decoration: InputDecoration(
|
|
// // border: OutlineInputBorder(
|
|
// // borderSide: const BorderSide(
|
|
// // color: Colors.grey, width: 1.5),
|
|
// // borderRadius: BorderRadius.circular(12.0),
|
|
// // ),
|
|
// // focusedBorder: OutlineInputBorder(
|
|
// // borderSide: const BorderSide(
|
|
// // color: Colors.grey, width: 1.5),
|
|
// // borderRadius: BorderRadius.circular(12.0),
|
|
// // ),
|
|
// // contentPadding:
|
|
// // const EdgeInsets.symmetric(horizontal: 12.0),
|
|
// // hintText: 'l_desc'.i18n,
|
|
// // suffixIcon: IconButton(
|
|
// // icon: const Icon(
|
|
// // FeatherIcons.x,
|
|
// // color: Colors.grey,
|
|
// // size: 18.0,
|
|
// // ),
|
|
// // onPressed: () {
|
|
// // setState(() {
|
|
// // _descTxt.text = '';
|
|
// // });
|
|
// // },
|
|
// // ),
|
|
// // ),
|
|
// // ),
|
|
// ],
|
|
// ),
|
|
// actions: [
|
|
// TextButton(
|
|
// child: Text(
|
|
// "cancel".i18n,
|
|
// style: const TextStyle(fontWeight: FontWeight.w500),
|
|
// ),
|
|
// onPressed: () {
|
|
// Navigator.of(context).maybePop();
|
|
// },
|
|
// ),
|
|
// TextButton(
|
|
// child: Text(
|
|
// "done".i18n,
|
|
// style: const TextStyle(fontWeight: FontWeight.w500),
|
|
// ),
|
|
// onPressed: () async {
|
|
// saveLesson();
|
|
|
|
// Navigator.of(context).pop();
|
|
// setState(() {});
|
|
// },
|
|
// ),
|
|
// ],
|
|
// );
|
|
// }),
|
|
// );
|
|
// },
|
|
// ),
|
|
// ],
|
|
// );
|
|
}
|
|
|
|
void saveLesson() async {
|
|
Map<String, String> lessonDesc = await databaseProvider.userQuery
|
|
.getCustomLessonDescriptions(userId: user.id!);
|
|
|
|
lessonDesc[widget.lesson.id] = _descTxt.text;
|
|
|
|
if (_descTxt.text.replaceAll(' ', '') == '') {
|
|
lessonDesc.remove(widget.lesson.id);
|
|
}
|
|
|
|
// ignore: use_build_context_synchronously
|
|
await databaseProvider.userStore
|
|
.storeCustomLessonDescriptions(lessonDesc, userId: user.id!);
|
|
}
|
|
}
|
|
|
|
class TimetableLessonPopup extends StatelessWidget {
|
|
const TimetableLessonPopup({
|
|
super.key,
|
|
required this.lesson,
|
|
required this.outsideContext,
|
|
});
|
|
|
|
final Lesson lesson;
|
|
final BuildContext outsideContext;
|
|
|
|
static void show({
|
|
required BuildContext context,
|
|
required Lesson lesson,
|
|
}) =>
|
|
showRoundedModalBottomSheet(
|
|
context,
|
|
child: TimetableLessonPopup(
|
|
lesson: lesson,
|
|
outsideContext: context,
|
|
),
|
|
showHandle: false,
|
|
);
|
|
|
|
// IconData _getIcon() => _featureLevels[feature] == PremiumFeatureLevel.cap
|
|
// ? FilcIcons.kupak
|
|
// : _featureLevels[feature] == PremiumFeatureLevel.ink
|
|
// ? FilcIcons.tinta
|
|
// : FilcIcons.tinta;
|
|
// Color _getColor(BuildContext context) =>
|
|
// _featureLevels[feature] == PremiumFeatureLevel.gold
|
|
// ? const Color(0xFFC89B08)
|
|
// : Theme.of(context).brightness == Brightness.light
|
|
// ? const Color(0xff691A9B)
|
|
// : const Color(0xffA66FC8);
|
|
// String? _getAsset() => _featureAssets[feature];
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Container(
|
|
decoration: BoxDecoration(
|
|
color: Theme.of(context).scaffoldBackgroundColor,
|
|
borderRadius: const BorderRadius.vertical(
|
|
top: Radius.circular(12.0),
|
|
),
|
|
),
|
|
child: Stack(
|
|
children: [
|
|
Stack(
|
|
children: [
|
|
SvgPicture.asset(
|
|
"assets/svg/mesh_bg.svg",
|
|
// ignore: deprecated_member_use
|
|
color: ColorsUtils()
|
|
.fade(context, Theme.of(context).colorScheme.secondary,
|
|
darkenAmount: 0.1, lightenAmount: 0.1)
|
|
.withOpacity(0.33),
|
|
width: MediaQuery.of(context).size.width,
|
|
),
|
|
Container(
|
|
decoration: BoxDecoration(
|
|
borderRadius: const BorderRadius.vertical(
|
|
top: Radius.circular(12.0),
|
|
),
|
|
gradient: LinearGradient(
|
|
colors: [
|
|
Theme.of(context).scaffoldBackgroundColor,
|
|
Theme.of(context)
|
|
.scaffoldBackgroundColor
|
|
.withOpacity(0.1),
|
|
Theme.of(context)
|
|
.scaffoldBackgroundColor
|
|
.withOpacity(0.1),
|
|
Theme.of(context).scaffoldBackgroundColor,
|
|
],
|
|
stops: const [0.1, 0.5, 0.7, 1.0],
|
|
begin: Alignment.topCenter,
|
|
end: Alignment.bottomCenter,
|
|
),
|
|
),
|
|
width: MediaQuery.of(context).size.width,
|
|
height: 175.0,
|
|
),
|
|
],
|
|
),
|
|
SizedBox(
|
|
width: MediaQuery.of(context).size.width,
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(18.0),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.center,
|
|
children: [
|
|
Container(
|
|
width: 40,
|
|
height: 4,
|
|
decoration: BoxDecoration(
|
|
color: ColorsUtils()
|
|
.fade(
|
|
context, Theme.of(context).colorScheme.secondary,
|
|
darkenAmount: 0.1, lightenAmount: 0.1)
|
|
.withOpacity(0.33),
|
|
borderRadius: BorderRadius.circular(
|
|
2.0,
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(
|
|
height: 38.0,
|
|
),
|
|
Container(
|
|
decoration: BoxDecoration(
|
|
color: Theme.of(context).scaffoldBackgroundColor,
|
|
borderRadius: BorderRadius.circular(50.0),
|
|
),
|
|
child: RoundBorderIcon(
|
|
color: ColorsUtils()
|
|
.darken(
|
|
Theme.of(context).colorScheme.secondary,
|
|
amount: 0.1,
|
|
)
|
|
.withOpacity(0.9),
|
|
width: 1.5,
|
|
padding: 10.0,
|
|
icon: Icon(
|
|
SubjectIcon.resolveVariant(
|
|
context: context, subject: lesson.subject),
|
|
size: 32.0,
|
|
color: ColorsUtils()
|
|
.darken(
|
|
Theme.of(context).colorScheme.secondary,
|
|
amount: 0.1,
|
|
)
|
|
.withOpacity(0.8),
|
|
),
|
|
),
|
|
),
|
|
const SizedBox(
|
|
height: 55.0,
|
|
),
|
|
Container(
|
|
width: double.infinity,
|
|
decoration: BoxDecoration(
|
|
color: Theme.of(context).colorScheme.background,
|
|
borderRadius: BorderRadius.vertical(
|
|
top: const Radius.circular(12.0),
|
|
bottom: (lesson.description.replaceAll(' ', '') != '')
|
|
? const Radius.circular(6.0)
|
|
: const Radius.circular(12.0),
|
|
),
|
|
),
|
|
padding: const EdgeInsets.all(14.0),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
'${DateFormat('H:mm').format(lesson.start)} - ${DateFormat('H:mm').format(lesson.end)}',
|
|
style: TextStyle(
|
|
color: AppColors.of(context).text.withOpacity(0.85),
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w500,
|
|
),
|
|
),
|
|
const SizedBox(
|
|
height: 12.0,
|
|
),
|
|
Text(
|
|
lesson.subject.isRenamed &&
|
|
Provider.of<SettingsProvider>(context,
|
|
listen: false)
|
|
.renamedSubjectsEnabled
|
|
? lesson.subject.renamedTo!
|
|
: lesson.subject.name.capital(),
|
|
style: TextStyle(
|
|
color: AppColors.of(context).text,
|
|
fontSize: 20.0,
|
|
fontWeight: FontWeight.w700,
|
|
fontStyle: Provider.of<SettingsProvider>(context,
|
|
listen: false)
|
|
.renamedSubjectsItalics &&
|
|
lesson.subject.isRenamed
|
|
? FontStyle.italic
|
|
: null,
|
|
),
|
|
),
|
|
const SizedBox(
|
|
height: 8.0,
|
|
),
|
|
Text(
|
|
lesson.teacher.name,
|
|
style: TextStyle(
|
|
color: AppColors.of(context).text.withOpacity(0.9),
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w500,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
if (lesson.description.replaceAll(' ', '') != '')
|
|
const SizedBox(
|
|
height: 6.0,
|
|
),
|
|
if (lesson.description.replaceAll(' ', '') != '')
|
|
Container(
|
|
width: double.infinity,
|
|
decoration: BoxDecoration(
|
|
color: Theme.of(context).colorScheme.background,
|
|
borderRadius: const BorderRadius.vertical(
|
|
top: Radius.circular(6.0),
|
|
bottom: Radius.circular(12.0),
|
|
),
|
|
),
|
|
padding: const EdgeInsets.all(14.0),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
lesson.description,
|
|
style: TextStyle(
|
|
color:
|
|
AppColors.of(context).text.withOpacity(0.9),
|
|
fontSize: 14.0,
|
|
fontWeight: FontWeight.w600,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
// const SizedBox(
|
|
// height: 24.0,
|
|
// ),
|
|
// GestureDetector(
|
|
// onTap: () async {
|
|
// ReverseSearch.getSubjectByLesson(lesson, context)
|
|
// .then((subject) {
|
|
// if (subject != null) {
|
|
// GradesPage.jump(outsideContext, subject: subject);
|
|
// } else {
|
|
// ScaffoldMessenger.of(context)
|
|
// .showSnackBar(CustomSnackBar(
|
|
// content: Text("Cannot find subject".i18n,
|
|
// style: const TextStyle(color: Colors.white)),
|
|
// backgroundColor: AppColors.of(context).red,
|
|
// context: context,
|
|
// ));
|
|
// }
|
|
// });
|
|
// },
|
|
// child: Container(
|
|
// width: double.infinity,
|
|
// decoration: BoxDecoration(
|
|
// color: Theme.of(context).colorScheme.background,
|
|
// borderRadius: BorderRadius.circular(12.0),
|
|
// ),
|
|
// padding: const EdgeInsets.all(16.0),
|
|
// child: Column(
|
|
// crossAxisAlignment: CrossAxisAlignment.center,
|
|
// children: [
|
|
// Text(
|
|
// 'view_subject'.i18n,
|
|
// style: TextStyle(
|
|
// color:
|
|
// AppColors.of(context).text.withOpacity(0.9),
|
|
// fontSize: 18.0,
|
|
// fontWeight: FontWeight.w500,
|
|
// ),
|
|
// ),
|
|
// ],
|
|
// ),
|
|
// ),
|
|
// ),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|