Merge branch 'master' of github.com:refilc/naplo
This commit is contained in:
@@ -1,13 +1,22 @@
|
||||
import 'package:dotted_border/dotted_border.dart';
|
||||
import 'package:refilc/theme/colors/colors.dart';
|
||||
import 'package:refilc/ui/widgets/grade/grade_tile.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:i18n_extension/i18n_extension.dart';
|
||||
|
||||
class AverageDisplay extends StatelessWidget {
|
||||
const AverageDisplay({super.key, this.average = 0.0, this.border = false});
|
||||
const AverageDisplay({
|
||||
super.key,
|
||||
this.average = 0.0,
|
||||
this.border = false,
|
||||
this.dashed = false,
|
||||
this.scale = 1.0,
|
||||
});
|
||||
|
||||
final double average;
|
||||
final bool border;
|
||||
final bool dashed;
|
||||
final double scale;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -20,25 +29,44 @@ class AverageDisplay extends StatelessWidget {
|
||||
averageText = averageText.replaceAll(".", ",");
|
||||
}
|
||||
|
||||
Widget txtWidget = Text(
|
||||
average == 0.0 ? "-" : averageText,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: color, fontWeight: FontWeight.w600, fontSize: scale * 15.0),
|
||||
maxLines: 1,
|
||||
);
|
||||
|
||||
return Container(
|
||||
width: border ? 57.0 : 54.0,
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 6.0 - (border ? 2 : 0), vertical: 5.0 - (border ? 2 : 0)),
|
||||
width: (border ? 57.0 : 54.0) * scale,
|
||||
padding: (border && dashed)
|
||||
? null
|
||||
: EdgeInsets.symmetric(
|
||||
horizontal: (6.0 - (border ? 2 : 0)) * scale,
|
||||
vertical: (5.0 - (border ? 2 : 0))) *
|
||||
scale,
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(45.0),
|
||||
border: border
|
||||
borderRadius:
|
||||
(border && dashed) ? null : BorderRadius.circular(45.0 * scale),
|
||||
border: border && !dashed
|
||||
? Border.fromBorderSide(
|
||||
BorderSide(color: color.withOpacity(.5), width: 1.0))
|
||||
BorderSide(color: color.withOpacity(.5), width: 1.0 * scale))
|
||||
: null,
|
||||
color: !border ? color.withOpacity(average == 0.0 ? .15 : .25) : null,
|
||||
),
|
||||
child: Text(
|
||||
average == 0.0 ? "-" : averageText,
|
||||
textAlign: TextAlign.center,
|
||||
style: TextStyle(
|
||||
color: color, fontWeight: FontWeight.w600, fontSize: 15.0),
|
||||
maxLines: 1,
|
||||
),
|
||||
child: (border && dashed)
|
||||
? DottedBorder(
|
||||
strokeWidth: 1.0 * scale,
|
||||
padding: EdgeInsets.all(4.0 * scale),
|
||||
color: color.withOpacity(.5),
|
||||
dashPattern: const [6, 6],
|
||||
radius: Radius.circular(45.0 * scale),
|
||||
borderType: BorderType.RRect,
|
||||
child: Center(
|
||||
child: txtWidget,
|
||||
),
|
||||
)
|
||||
: txtWidget,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:refilc/helpers/subject.dart';
|
||||
import 'package:refilc/theme/colors/colors.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:refilc/theme/colors/utils.dart';
|
||||
@@ -113,7 +114,9 @@ class HeroScrollViewState extends State<HeroScrollView> {
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(top: 26.0),
|
||||
child: SvgPicture.asset(
|
||||
"assets/svg/mesh_bg.svg",
|
||||
// "assets/svg/mesh_bg.svg",
|
||||
SubjectBooklet.resolveVariant(
|
||||
context: context, subjectName: widget.title),
|
||||
// ignore: deprecated_member_use
|
||||
color: ColorsUtils()
|
||||
.darken(
|
||||
|
||||
@@ -49,6 +49,8 @@ extension Localization on String {
|
||||
"d_npc":
|
||||
"You're such a non-player character, we couldn't give you a personality.",
|
||||
"s_npc": "In-game playtime (hours)",
|
||||
// other
|
||||
"year_index": "Lesson Number",
|
||||
},
|
||||
"hu_hu": {
|
||||
// main
|
||||
@@ -96,6 +98,8 @@ extension Localization on String {
|
||||
"d_npc":
|
||||
"Egy akkora nagy non-player character vagy, hogy neked semmilyen személyiség nem jutott ezen kívül.",
|
||||
"s_npc": "In-game playtime (óra)",
|
||||
// other
|
||||
"year_index": "Éves óraszám",
|
||||
},
|
||||
"de_de": {
|
||||
// main
|
||||
@@ -144,6 +148,8 @@ extension Localization on String {
|
||||
"d_npc":
|
||||
"Du bist einfach so sehr wie ein Computer, dass wir dir nicht einmal eine Persönlichkeit geben konnten.",
|
||||
"s_npc": "Spielzeit (Stunden)",
|
||||
// other
|
||||
"year_index": "Ordinalzahl",
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ class ProfileButton extends StatelessWidget {
|
||||
radius: child.radius,
|
||||
badge: child.badge,
|
||||
role: child.role,
|
||||
gradeStreak: child.gradeStreak,
|
||||
profilePictureString: child.profilePictureString,
|
||||
onTap: () {
|
||||
showSlidingBottomSheet(
|
||||
|
||||
@@ -21,6 +21,7 @@ class ProfileImage extends StatefulWidget {
|
||||
this.censored = false,
|
||||
this.profilePictureString = "",
|
||||
this.isNotePfp = false,
|
||||
this.gradeStreak = false,
|
||||
});
|
||||
|
||||
final void Function()? onTap;
|
||||
@@ -35,6 +36,7 @@ class ProfileImage extends StatefulWidget {
|
||||
final bool censored;
|
||||
final String profilePictureString;
|
||||
final bool isNotePfp;
|
||||
final bool gradeStreak;
|
||||
|
||||
@override
|
||||
State<ProfileImage> createState() => _ProfileImageState();
|
||||
@@ -145,6 +147,20 @@ class _ProfileImageState extends State<ProfileImage> {
|
||||
color: roleColor, size: widget.radius / 1.3),
|
||||
),
|
||||
),
|
||||
|
||||
// streak indicator
|
||||
// if (widget.gradeStreak)
|
||||
// SizedBox(
|
||||
// height: widget.radius * 2,
|
||||
// width: widget.radius * 2,
|
||||
// child: Container(
|
||||
// alignment: Alignment.topLeft,
|
||||
// child: Text(
|
||||
// '🔥',
|
||||
// style: TextStyle(fontSize: widget.radius * 0.9),
|
||||
// ),
|
||||
// ),
|
||||
// ),
|
||||
],
|
||||
);
|
||||
}
|
||||
@@ -238,6 +254,29 @@ class _ProfileImageState extends State<ProfileImage> {
|
||||
),
|
||||
),
|
||||
|
||||
// streak indicator
|
||||
if (widget.gradeStreak)
|
||||
Hero(
|
||||
tag: "${widget.heroTag!}streak_indicator",
|
||||
child: FittedBox(
|
||||
fit: BoxFit.fitHeight,
|
||||
child: SizedBox(
|
||||
height: widget.radius * 2,
|
||||
width: widget.radius * 2,
|
||||
child: Transform.translate(
|
||||
offset: Offset(-widget.radius / 4, -widget.radius / 4),
|
||||
child: Container(
|
||||
alignment: Alignment.topLeft,
|
||||
child: Text(
|
||||
'🔥',
|
||||
style: TextStyle(fontSize: widget.radius * 0.8),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Material(
|
||||
color: Colors.transparent,
|
||||
clipBehavior: Clip.hardEdge,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
// ignore_for_file: use_build_context_synchronously
|
||||
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:i18n_extension/i18n_extension.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc/helpers/subject.dart';
|
||||
@@ -13,8 +14,11 @@ import 'package:refilc_kreta_api/models/exam.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_mobile_ui/common/viewable.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/card_handle.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/exam/exam_tile.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/exam/exam_view.dart';
|
||||
|
||||
class ExamViewable extends StatelessWidget {
|
||||
const ExamViewable(this.exam,
|
||||
@@ -26,22 +30,25 @@ class ExamViewable extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return GestureDetector(
|
||||
onTap: () => ExamPopup.show(context: context, exam: exam),
|
||||
child: ExamTile(
|
||||
if (Provider.of<SettingsProvider>(context).newPopups) {
|
||||
return GestureDetector(
|
||||
onTap: () => ExamPopup.show(context: context, exam: exam),
|
||||
child: ExamTile(
|
||||
exam,
|
||||
showSubject: showSubject,
|
||||
padding: tilePadding,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
return Viewable(
|
||||
tile: ExamTile(
|
||||
exam,
|
||||
showSubject: showSubject,
|
||||
padding: tilePadding,
|
||||
),
|
||||
view: CardHandle(child: ExamView(exam)),
|
||||
);
|
||||
// return Viewable(
|
||||
// tile: ExamTile(
|
||||
// exam,
|
||||
// showSubject: showSubject,
|
||||
// padding: tilePadding,
|
||||
// ),
|
||||
// view: CardHandle(child: ExamView(exam)),
|
||||
// );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,7 +105,9 @@ class ExamPopup extends StatelessWidget {
|
||||
Stack(
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
"assets/svg/mesh_bg.svg",
|
||||
// "assets/svg/mesh_bg.svg",
|
||||
SubjectBooklet.resolveVariant(
|
||||
context: context, subject: exam.subject),
|
||||
// ignore: deprecated_member_use
|
||||
color: ColorsUtils()
|
||||
.fade(context, Theme.of(context).colorScheme.secondary,
|
||||
@@ -210,13 +219,19 @@ class ExamPopup extends StatelessWidget {
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
exam.description.capital(),
|
||||
style: TextStyle(
|
||||
color:
|
||||
AppColors.of(context).text.withOpacity(0.9),
|
||||
fontSize: 16.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.7,
|
||||
child: Text(
|
||||
exam.description.capital(),
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.text
|
||||
.withOpacity(0.9),
|
||||
fontSize: 16.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
maxLines: 3,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
@@ -288,7 +303,7 @@ class ExamPopup extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
Text(
|
||||
'${DateFormat('H:mm').format(lesson!.start)} - ${DateFormat('H:mm').format(lesson!.end)}',
|
||||
'${DateFormat('MMM d, H:mm', I18n.locale.countryCode).format(lesson!.start).capital()} - ${DateFormat('H:mm').format(lesson!.end)}',
|
||||
style: TextStyle(
|
||||
color:
|
||||
AppColors.of(context).text.withOpacity(0.85),
|
||||
|
||||
@@ -12,6 +12,7 @@ extension Localization on String {
|
||||
"l_desc": "Description...",
|
||||
"done": "Done",
|
||||
"cancel": "Cancel",
|
||||
"year_index": "Lesson Number",
|
||||
},
|
||||
"hu_hu": {
|
||||
"Room": "Terem",
|
||||
@@ -22,6 +23,7 @@ extension Localization on String {
|
||||
"l_desc": "Leírás...",
|
||||
"done": "Kész",
|
||||
"cancel": "Mégse",
|
||||
"year_index": "Éves óraszám",
|
||||
},
|
||||
"de_de": {
|
||||
"Room": "Raum",
|
||||
@@ -32,6 +34,7 @@ extension Localization on String {
|
||||
"l_desc": "Beschreibung...",
|
||||
"done": "Erledigt",
|
||||
"cancel": "Abbrechen",
|
||||
"year_index": "Ordinalzahl",
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
@@ -8,11 +9,21 @@ 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/exam.dart';
|
||||
import 'package:refilc_kreta_api/models/lesson.dart';
|
||||
import 'package:refilc_kreta_api/providers/exam_provider.dart';
|
||||
import 'package:refilc_mobile_ui/common/bottom_sheet_menu/rounded_bottom_sheet.dart';
|
||||
import 'package:refilc_mobile_ui/common/panel/panel_button.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';
|
||||
import 'package:refilc_mobile_ui/common/viewable.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/card_handle.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/lesson/lesson_view.dart';
|
||||
import 'package:refilc_plus/models/premium_scopes.dart';
|
||||
import 'package:refilc_plus/providers/plus_provider.dart';
|
||||
import 'package:refilc_plus/ui/mobile/plus/upsell.dart';
|
||||
import 'lesson_view.i18n.dart';
|
||||
|
||||
class LessonViewable extends StatefulWidget {
|
||||
const LessonViewable(
|
||||
@@ -59,174 +70,169 @@ class LessonViewableState extends State<LessonViewable> {
|
||||
|
||||
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,
|
||||
// ),
|
||||
),
|
||||
// check if new popup needed
|
||||
if (Provider.of<SettingsProvider>(context).newPopups) {
|
||||
return GestureDetector(
|
||||
onTap: () => TimetableLessonPopup.show(
|
||||
context: context,
|
||||
lesson: lsn,
|
||||
),
|
||||
child: tile,
|
||||
);
|
||||
}
|
||||
|
||||
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(() {});
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
|
||||
// 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 {
|
||||
@@ -283,6 +289,18 @@ class TimetableLessonPopup extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
Exam? lessonExam;
|
||||
|
||||
if (lesson.exam != "") {
|
||||
Exam exam = Provider.of<ExamProvider>(context, listen: false)
|
||||
.exams
|
||||
.firstWhere((t) => t.id == lesson.exam,
|
||||
orElse: () => Exam.fromJson({}));
|
||||
if (exam.id != "") {
|
||||
lessonExam = exam;
|
||||
}
|
||||
}
|
||||
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
@@ -295,7 +313,9 @@ class TimetableLessonPopup extends StatelessWidget {
|
||||
Stack(
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
"assets/svg/mesh_bg.svg",
|
||||
// "assets/svg/mesh_bg.svg",
|
||||
SubjectBooklet.resolveVariant(
|
||||
context: context, subject: lesson.subject),
|
||||
// ignore: deprecated_member_use
|
||||
color: ColorsUtils()
|
||||
.fade(context, Theme.of(context).colorScheme.secondary,
|
||||
@@ -319,13 +339,13 @@ class TimetableLessonPopup extends StatelessWidget {
|
||||
.withOpacity(0.1),
|
||||
Theme.of(context).scaffoldBackgroundColor,
|
||||
],
|
||||
stops: const [0.1, 0.5, 0.7, 1.0],
|
||||
stops: const [0.0, 0.3, 0.6, 0.95],
|
||||
begin: Alignment.topCenter,
|
||||
end: Alignment.bottomCenter,
|
||||
),
|
||||
),
|
||||
width: MediaQuery.of(context).size.width,
|
||||
height: 175.0,
|
||||
height: 200.0,
|
||||
),
|
||||
],
|
||||
),
|
||||
@@ -340,16 +360,27 @@ class TimetableLessonPopup extends StatelessWidget {
|
||||
width: 40,
|
||||
height: 4,
|
||||
decoration: BoxDecoration(
|
||||
color: ColorsUtils()
|
||||
.fade(
|
||||
context, Theme.of(context).colorScheme.secondary,
|
||||
darkenAmount: 0.1, lightenAmount: 0.1)
|
||||
.withOpacity(0.33),
|
||||
color: Theme.of(context).scaffoldBackgroundColor,
|
||||
borderRadius: BorderRadius.circular(
|
||||
2.0,
|
||||
),
|
||||
),
|
||||
child: 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,
|
||||
),
|
||||
@@ -387,11 +418,9 @@ class TimetableLessonPopup extends StatelessWidget {
|
||||
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),
|
||||
borderRadius: const BorderRadius.vertical(
|
||||
top: Radius.circular(12.0),
|
||||
bottom: Radius.circular(6.0),
|
||||
),
|
||||
),
|
||||
padding: const EdgeInsets.all(14.0),
|
||||
@@ -466,7 +495,15 @@ class TimetableLessonPopup extends StatelessWidget {
|
||||
height: 8.0,
|
||||
),
|
||||
Text(
|
||||
lesson.teacher.name,
|
||||
((lesson.substituteTeacher == null ||
|
||||
lesson.substituteTeacher!.name == "")
|
||||
? (lesson.teacher.isRenamed
|
||||
? lesson.teacher.renamedTo
|
||||
: lesson.teacher.name)
|
||||
: (lesson.substituteTeacher!.isRenamed
|
||||
? lesson.substituteTeacher!.renamedTo
|
||||
: lesson.substituteTeacher!.name)) ??
|
||||
'',
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text.withOpacity(0.9),
|
||||
fontSize: 14.0,
|
||||
@@ -487,7 +524,7 @@ class TimetableLessonPopup extends StatelessWidget {
|
||||
color: Theme.of(context).colorScheme.background,
|
||||
borderRadius: const BorderRadius.vertical(
|
||||
top: Radius.circular(6.0),
|
||||
bottom: Radius.circular(12.0),
|
||||
bottom: Radius.circular(6.0),
|
||||
),
|
||||
),
|
||||
padding: const EdgeInsets.all(14.0),
|
||||
@@ -506,6 +543,94 @@ class TimetableLessonPopup extends StatelessWidget {
|
||||
],
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 6.0,
|
||||
),
|
||||
Container(
|
||||
width: double.infinity,
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).colorScheme.background,
|
||||
borderRadius: BorderRadius.vertical(
|
||||
top: const Radius.circular(6.0),
|
||||
bottom: lesson.exam != ''
|
||||
? const Radius.circular(6.0)
|
||||
: const Radius.circular(12.0),
|
||||
),
|
||||
),
|
||||
padding: const EdgeInsets.all(14.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Text(
|
||||
'${'year_index'.i18n}: ${lesson.lessonYearIndex ?? '?'}',
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text.withOpacity(0.9),
|
||||
fontSize: 14.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
if (lesson.exam != '')
|
||||
const SizedBox(
|
||||
height: 6.0,
|
||||
),
|
||||
if (lesson.exam != '' && lessonExam != null)
|
||||
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: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
const Icon(
|
||||
FeatherIcons.file,
|
||||
size: 20.0,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10.0,
|
||||
),
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width * 0.5,
|
||||
child: Text(
|
||||
lessonExam.description.capital(),
|
||||
maxLines: 2,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.text
|
||||
.withOpacity(0.9),
|
||||
fontSize: 16.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
Flexible(
|
||||
child: Text(
|
||||
lessonExam.mode?.description ?? 'Dolgozat',
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.text
|
||||
.withOpacity(0.85),
|
||||
fontSize: 14.0,
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
// const SizedBox(
|
||||
// height: 24.0,
|
||||
// ),
|
||||
|
||||
@@ -4,7 +4,9 @@ import 'dart:math';
|
||||
|
||||
import 'package:animations/animations.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:refilc/api/providers/update_provider.dart';
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/theme/colors/utils.dart';
|
||||
import 'package:refilc/ui/date_widget.dart';
|
||||
import 'package:refilc_kreta_api/models/absence.dart';
|
||||
@@ -169,6 +171,7 @@ class AbsencesPageState extends State<AbsencesPage>
|
||||
badge: updateProvider.available,
|
||||
role: user.role,
|
||||
profilePictureString: user.picture,
|
||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -179,10 +182,22 @@ class AbsencesPageState extends State<AbsencesPage>
|
||||
padding: const EdgeInsets.only(left: 8.0),
|
||||
child: Text(
|
||||
"Absences".i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
style: Provider.of<SettingsProvider>(context).fontFamily !=
|
||||
'' &&
|
||||
Provider.of<SettingsProvider>(context).titleOnlyFont
|
||||
? GoogleFonts.getFont(
|
||||
Provider.of<SettingsProvider>(context).fontFamily,
|
||||
textStyle: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
)
|
||||
: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
),
|
||||
),
|
||||
),
|
||||
bottom: FilterBar(
|
||||
@@ -504,7 +519,9 @@ class AbsencesPageState extends State<AbsencesPage>
|
||||
style: TextStyle(
|
||||
fontSize: 18.0,
|
||||
fontWeight: FontWeight.w700,
|
||||
color: AppColors.of(context).green,
|
||||
color: value1 > 0
|
||||
? AppColors.of(context).green
|
||||
: AppColors.of(context).text,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
@@ -513,12 +530,14 @@ class AbsencesPageState extends State<AbsencesPage>
|
||||
fontSize: 16.0,
|
||||
fontWeight: FontWeight.w500,
|
||||
height: 1.1,
|
||||
color: ColorsUtils().fade(
|
||||
context,
|
||||
AppColors.of(context).green,
|
||||
darkenAmount: 0.5,
|
||||
lightenAmount: 0.4,
|
||||
),
|
||||
color: value1 > 0
|
||||
? ColorsUtils().fade(
|
||||
context,
|
||||
AppColors.of(context).green,
|
||||
darkenAmount: 0.5,
|
||||
lightenAmount: 0.4,
|
||||
)
|
||||
: AppColors.of(context).text,
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -535,7 +554,9 @@ class AbsencesPageState extends State<AbsencesPage>
|
||||
style: TextStyle(
|
||||
fontSize: 18.0,
|
||||
fontWeight: FontWeight.w700,
|
||||
color: AppColors.of(context).red,
|
||||
color: value2 > 0
|
||||
? AppColors.of(context).red
|
||||
: AppColors.of(context).text,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
@@ -544,12 +565,14 @@ class AbsencesPageState extends State<AbsencesPage>
|
||||
fontSize: 16.0,
|
||||
fontWeight: FontWeight.w500,
|
||||
height: 1.1,
|
||||
color: ColorsUtils().fade(
|
||||
context,
|
||||
AppColors.of(context).red,
|
||||
darkenAmount: 0.4,
|
||||
lightenAmount: 0.2,
|
||||
),
|
||||
color: value2 > 0
|
||||
? ColorsUtils().fade(
|
||||
context,
|
||||
AppColors.of(context).red,
|
||||
darkenAmount: 0.4,
|
||||
lightenAmount: 0.2,
|
||||
)
|
||||
: AppColors.of(context).text,
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -597,8 +620,9 @@ class AbsencesPageState extends State<AbsencesPage>
|
||||
children: [
|
||||
Row(
|
||||
children: [
|
||||
const Icon(
|
||||
Icon(
|
||||
Icons.av_timer_rounded,
|
||||
color: value3 > 0 ? Colors.orange : null,
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10.0,
|
||||
|
||||
@@ -34,7 +34,6 @@ import 'package:refilc_mobile_ui/pages/grades/calculator/grade_calculator_provid
|
||||
import 'package:refilc_mobile_ui/pages/grades/grades_count.dart';
|
||||
import 'package:refilc_mobile_ui/pages/grades/graph.dart';
|
||||
import 'package:refilc_mobile_ui/pages/grades/subject_grades_container.dart';
|
||||
import 'package:refilc_plus/ui/mobile/goal_planner/goal_planner_screen.dart';
|
||||
// import 'package:refilc_plus/models/premium_scopes.dart';
|
||||
// import 'package:refilc_plus/providers/plus_provider.dart';
|
||||
import 'package:refilc_plus/ui/mobile/goal_planner/goal_state_screen.dart';
|
||||
@@ -44,6 +43,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_expandable_fab/flutter_expandable_fab.dart';
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc_plus/ui/mobile/goal_planner/goal_track_popup.dart';
|
||||
import 'grades_page.i18n.dart';
|
||||
// import 'package:refilc_plus/ui/mobile/goal_planner/new_goal.dart';
|
||||
|
||||
@@ -425,9 +425,10 @@ class _GradeSubjectViewState extends State<GradeSubjectView>
|
||||
// ScaffoldMessenger.of(context).showSnackBar(
|
||||
// const SnackBar(content: Text("Hamarosan...")));
|
||||
|
||||
Navigator.of(context).push(CupertinoPageRoute(
|
||||
builder: (context) =>
|
||||
GoalPlannerScreen(subject: widget.subject)));
|
||||
// Navigator.of(context).push(CupertinoPageRoute(
|
||||
// builder: (context) =>
|
||||
// GoalPlannerScreen(subject: widget.subject)));
|
||||
GoalTrackPopup.show(context, subject: widget.subject);
|
||||
},
|
||||
child: const Icon(FeatherIcons.flag, size: 20.0),
|
||||
),
|
||||
|
||||
@@ -4,6 +4,7 @@ import 'dart:math';
|
||||
|
||||
import 'package:auto_size_text/auto_size_text.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:refilc/api/providers/update_provider.dart';
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/ui/widgets/grade/grade_tile.dart';
|
||||
@@ -267,6 +268,12 @@ class GradesPageState extends State<GradesPage> {
|
||||
),
|
||||
),
|
||||
),
|
||||
if (hasHomework &&
|
||||
nearestExam != null &&
|
||||
Provider.of<SettingsProvider>(context).qSubjectsSubTiles)
|
||||
const SizedBox(
|
||||
height: 6.0,
|
||||
),
|
||||
if (nearestExam != null &&
|
||||
Provider.of<SettingsProvider>(context).qSubjectsSubTiles)
|
||||
Container(
|
||||
@@ -560,6 +567,7 @@ class GradesPageState extends State<GradesPage> {
|
||||
badge: updateProvider.available,
|
||||
role: user.role,
|
||||
profilePictureString: user.picture,
|
||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -568,11 +576,21 @@ class GradesPageState extends State<GradesPage> {
|
||||
title: Padding(
|
||||
padding: const EdgeInsets.only(left: 8.0),
|
||||
child: Text(
|
||||
"Grades".i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
"page_title_grades".i18n,
|
||||
style: Provider.of<SettingsProvider>(context).fontFamily !=
|
||||
'' &&
|
||||
Provider.of<SettingsProvider>(context).titleOnlyFont
|
||||
? GoogleFonts.getFont(
|
||||
Provider.of<SettingsProvider>(context).fontFamily,
|
||||
textStyle: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
)
|
||||
: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
shadowColor: Theme.of(context).shadowColor,
|
||||
@@ -667,6 +685,8 @@ class GradesPageState extends State<GradesPage> {
|
||||
|
||||
// SoonAlert.show(context: context);
|
||||
gradeCalcTotal(context);
|
||||
|
||||
Navigator.of(context, rootNavigator: true).pop();
|
||||
},
|
||||
),
|
||||
),
|
||||
|
||||
@@ -31,7 +31,8 @@ extension Localization on String {
|
||||
"grade_calc": "Grade Calculator",
|
||||
},
|
||||
"hu_hu": {
|
||||
"Grades": "Tantárgyak",
|
||||
"Grades": "Jegyek",
|
||||
"page_title_grades": "Tantárgyak",
|
||||
"Ghost Grades": "Szellem jegyek",
|
||||
"Subjects": "Tantárgyaid",
|
||||
"Subjects_changes": "Tantárgyi változások",
|
||||
|
||||
@@ -248,11 +248,12 @@ class GradeGraphState extends State<GradeGraph> {
|
||||
),
|
||||
if (ghostData.isNotEmpty && ghostSpots.isNotEmpty)
|
||||
LineChartBarData(
|
||||
preventCurveOverShooting: true,
|
||||
preventCurveOverShooting: false,
|
||||
spots: ghostSpots,
|
||||
isCurved: true,
|
||||
colors: [AppColors.of(context).text],
|
||||
barWidth: 8,
|
||||
barWidth: 6,
|
||||
curveSmoothness: 0.2,
|
||||
isStrokeCapRound: true,
|
||||
dotData: FlDotData(show: false),
|
||||
belowBarData: BarAreaData(
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'dart:math';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:refilc/api/providers/live_card_provider.dart';
|
||||
import 'package:refilc/theme/colors/colors.dart';
|
||||
import 'package:refilc/ui/date_widget.dart';
|
||||
@@ -244,14 +245,34 @@ class HomePageState extends State<HomePage> with TickerProviderStateMixin {
|
||||
greeting,
|
||||
overflow: TextOverflow.fade,
|
||||
textAlign: TextAlign.start,
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 18.0,
|
||||
color: Theme.of(context)
|
||||
.textTheme
|
||||
.bodyMedium
|
||||
?.color,
|
||||
),
|
||||
style:
|
||||
Provider.of<SettingsProvider>(context)
|
||||
.fontFamily !=
|
||||
'' &&
|
||||
Provider.of<SettingsProvider>(
|
||||
context)
|
||||
.titleOnlyFont
|
||||
? GoogleFonts.getFont(
|
||||
Provider.of<SettingsProvider>(
|
||||
context)
|
||||
.fontFamily,
|
||||
textStyle: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 18.0,
|
||||
color: Theme.of(context)
|
||||
.textTheme
|
||||
.bodyMedium
|
||||
?.color,
|
||||
),
|
||||
)
|
||||
: TextStyle(
|
||||
fontWeight: FontWeight.bold,
|
||||
fontSize: 18.0,
|
||||
color: Theme.of(context)
|
||||
.textTheme
|
||||
.bodyMedium
|
||||
?.color,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
DateFormat('EEEE, MMM d',
|
||||
@@ -317,6 +338,7 @@ class HomePageState extends State<HomePage> with TickerProviderStateMixin {
|
||||
badge: updateProvider.available,
|
||||
role: user.role,
|
||||
profilePictureString: user.picture,
|
||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -355,7 +377,7 @@ class HomePageState extends State<HomePage> with TickerProviderStateMixin {
|
||||
LiveCardState.duringLesson ||
|
||||
_liveCard.currentState ==
|
||||
LiveCardState.duringBreak)
|
||||
? 55.0
|
||||
? 62.0
|
||||
: 52.0),
|
||||
),
|
||||
child: Transform.scale(
|
||||
|
||||
@@ -404,7 +404,7 @@ class LiveCardStateA extends State<LiveCard> {
|
||||
swapRoom: true,
|
||||
currentLessonIndicator: false,
|
||||
padding:
|
||||
const EdgeInsets.only(top: 6.0, bottom: 4.0),
|
||||
const EdgeInsets.only(top: 2.0, bottom: 4.0),
|
||||
contentPadding: EdgeInsets.zero,
|
||||
showSubTiles: false,
|
||||
),
|
||||
@@ -911,6 +911,37 @@ class LiveCardStateA extends State<LiveCard> {
|
||||
Row(
|
||||
children: liveCard.nextLesson != null
|
||||
? [
|
||||
Container(
|
||||
width: (liveCard.nextLesson?.room
|
||||
.length ??
|
||||
0) >
|
||||
20
|
||||
? 111
|
||||
: null,
|
||||
padding: const EdgeInsets.symmetric(
|
||||
horizontal: 5.5, vertical: 3.0),
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.tertiary
|
||||
.withOpacity(.15),
|
||||
borderRadius:
|
||||
BorderRadius.circular(10.0),
|
||||
),
|
||||
child: Text(
|
||||
liveCard.nextLesson!.room,
|
||||
overflow: TextOverflow.ellipsis,
|
||||
style: TextStyle(
|
||||
height: 1.1,
|
||||
fontSize: 12.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withOpacity(.9),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:refilc/api/providers/update_provider.dart';
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/ui/date_widget.dart';
|
||||
import 'package:refilc_kreta_api/providers/message_provider.dart';
|
||||
import 'package:refilc/api/providers/user_provider.dart';
|
||||
@@ -109,6 +111,7 @@ class MessagesPageState extends State<MessagesPage>
|
||||
badge: updateProvider.available,
|
||||
role: user.role,
|
||||
profilePictureString: user.picture,
|
||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -128,10 +131,22 @@ class MessagesPageState extends State<MessagesPage>
|
||||
),
|
||||
Text(
|
||||
"Messages".i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
style: Provider.of<SettingsProvider>(context)
|
||||
.fontFamily !=
|
||||
'' &&
|
||||
Provider.of<SettingsProvider>(context)
|
||||
.titleOnlyFont
|
||||
? GoogleFonts.getFont(
|
||||
Provider.of<SettingsProvider>(context).fontFamily,
|
||||
textStyle: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
)
|
||||
: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -5,6 +5,7 @@ import 'dart:math';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:refilc/api/providers/database_provider.dart';
|
||||
import 'package:refilc/api/providers/self_note_provider.dart';
|
||||
import 'package:refilc/api/providers/update_provider.dart';
|
||||
@@ -35,6 +36,7 @@ import 'package:refilc_plus/models/premium_scopes.dart';
|
||||
import 'package:refilc_plus/providers/plus_provider.dart';
|
||||
import 'package:refilc_plus/ui/mobile/plus/premium_inline.dart';
|
||||
import 'package:refilc_plus/ui/mobile/plus/upsell.dart';
|
||||
import 'package:uuid/uuid.dart';
|
||||
import 'notes_page.i18n.dart';
|
||||
|
||||
enum AbsenceFilter { absences, delays, misses }
|
||||
@@ -65,9 +67,14 @@ class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
||||
|
||||
Map<String, bool> doneItems = {};
|
||||
List<Widget> noteTiles = [];
|
||||
List<TodoItem> todoItems = [];
|
||||
|
||||
final TextEditingController _taskName = TextEditingController();
|
||||
final TextEditingController _taskContent = TextEditingController();
|
||||
|
||||
void generateTiles() async {
|
||||
doneItems = await databaseProvider.userQuery.toDoItems(userId: user.id!);
|
||||
todoItems = await databaseProvider.userQuery.getTodoItems(userId: user.id!);
|
||||
|
||||
List<Widget> tiles = [];
|
||||
|
||||
@@ -82,7 +89,7 @@ class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
||||
List<Widget> toDoTiles = [];
|
||||
|
||||
if (hw.isNotEmpty &&
|
||||
!Provider.of<PlusProvider>(context, listen: false)
|
||||
Provider.of<PlusProvider>(context, listen: false)
|
||||
.hasScope(PremiumScopes.unlimitedSelfNotes)) {
|
||||
toDoTiles.addAll(hw.map((e) => TickTile(
|
||||
padding: EdgeInsets.zero,
|
||||
@@ -102,6 +109,21 @@ class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
||||
)));
|
||||
}
|
||||
|
||||
if (selfNoteProvider.todos.isNotEmpty) {
|
||||
toDoTiles.addAll(selfNoteProvider.todos.map((e) => TickTile(
|
||||
padding: EdgeInsets.zero,
|
||||
title: e.title,
|
||||
description: e.content,
|
||||
isTicked: e.done,
|
||||
onTap: (p0) async {
|
||||
todoItems.firstWhere((element) => element.id == e.id).done = p0;
|
||||
|
||||
await databaseProvider.userStore
|
||||
.storeSelfTodoItems(todoItems, userId: user.id!);
|
||||
},
|
||||
)));
|
||||
}
|
||||
|
||||
if (toDoTiles.isNotEmpty) {
|
||||
tiles.add(const SizedBox(
|
||||
height: 10.0,
|
||||
@@ -128,26 +150,31 @@ class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
||||
CupertinoPageRoute(
|
||||
builder: (context) => NoteViewScreen(note: e))),
|
||||
)
|
||||
: Container(
|
||||
height: MediaQuery.of(context).size.width / 2.42,
|
||||
width: MediaQuery.of(context).size.width / 2.42,
|
||||
decoration: BoxDecoration(
|
||||
boxShadow: [
|
||||
if (Provider.of<SettingsProvider>(context, listen: false)
|
||||
.shadowEffect)
|
||||
BoxShadow(
|
||||
offset: const Offset(0, 21),
|
||||
blurRadius: 23.0,
|
||||
color: Theme.of(context).shadowColor,
|
||||
),
|
||||
],
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(16.0),
|
||||
child: Image.memory(
|
||||
const Base64Decoder().convert(e.content),
|
||||
fit: BoxFit.cover,
|
||||
gaplessPlayback: true,
|
||||
: GestureDetector(
|
||||
onTap: () => Navigator.of(context, rootNavigator: true).push(
|
||||
CupertinoPageRoute(
|
||||
builder: (context) => NoteViewScreen(note: e))),
|
||||
child: Container(
|
||||
height: MediaQuery.of(context).size.width / 2.42,
|
||||
width: MediaQuery.of(context).size.width / 2.42,
|
||||
decoration: BoxDecoration(
|
||||
boxShadow: [
|
||||
if (Provider.of<SettingsProvider>(context, listen: false)
|
||||
.shadowEffect)
|
||||
BoxShadow(
|
||||
offset: const Offset(0, 21),
|
||||
blurRadius: 23.0,
|
||||
color: Theme.of(context).shadowColor,
|
||||
),
|
||||
],
|
||||
),
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(16.0),
|
||||
child: Image.memory(
|
||||
const Base64Decoder().convert(e.content),
|
||||
fit: BoxFit.cover,
|
||||
gaplessPlayback: true,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -289,6 +316,7 @@ class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
||||
badge: updateProvider.available,
|
||||
role: user.role,
|
||||
profilePictureString: user.picture,
|
||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -299,10 +327,20 @@ class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
||||
padding: const EdgeInsets.only(left: 8.0),
|
||||
child: Text(
|
||||
"notes".i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
style: Provider.of<SettingsProvider>(context).fontFamily !=
|
||||
'' &&
|
||||
Provider.of<SettingsProvider>(context).titleOnlyFont
|
||||
? GoogleFonts.getFont(
|
||||
Provider.of<SettingsProvider>(context).fontFamily,
|
||||
textStyle: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
)
|
||||
: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -313,6 +351,8 @@ class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
||||
.fetch(
|
||||
from: DateTime.now().subtract(const Duration(days: 30)));
|
||||
Provider.of<SelfNoteProvider>(context, listen: false).restore();
|
||||
Provider.of<SelfNoteProvider>(context, listen: false)
|
||||
.restoreTodo();
|
||||
|
||||
generateTiles();
|
||||
|
||||
@@ -410,7 +450,159 @@ class NotesPageState extends State<NotesPage> with TickerProviderStateMixin {
|
||||
},
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 10.0,
|
||||
),
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
color: Theme.of(context).colorScheme.background),
|
||||
child: ListTile(
|
||||
title: Row(
|
||||
children: [
|
||||
const Icon(Icons.task_outlined),
|
||||
const SizedBox(
|
||||
width: 10.0,
|
||||
),
|
||||
Text('new_task'.i18n),
|
||||
],
|
||||
),
|
||||
onTap: () {
|
||||
if (!Provider.of<PlusProvider>(context, listen: false)
|
||||
.hasScope(PremiumScopes.unlimitedSelfNotes)) {
|
||||
PlusLockedFeaturePopup.show(
|
||||
context: context, feature: PremiumFeature.selfNotes);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
showTaskCreation(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
]),
|
||||
);
|
||||
}
|
||||
|
||||
void showTaskCreation(context) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(14.0))),
|
||||
contentPadding: const EdgeInsets.only(top: 10.0),
|
||||
title: Text("new_task".i18n),
|
||||
content: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24.0, vertical: 10.0),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
TextField(
|
||||
controller: _taskName,
|
||||
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: "task_name".i18n,
|
||||
suffixIcon: IconButton(
|
||||
icon: const Icon(
|
||||
FeatherIcons.x,
|
||||
color: Colors.grey,
|
||||
),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
_taskName.text = "";
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 10.0,
|
||||
),
|
||||
TextField(
|
||||
controller: _taskContent,
|
||||
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: "task_content".i18n,
|
||||
suffixIcon: IconButton(
|
||||
icon: const Icon(
|
||||
FeatherIcons.x,
|
||||
color: Colors.grey,
|
||||
),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
_taskContent.text = "";
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text(
|
||||
"cancel".i18n,
|
||||
style: const TextStyle(fontWeight: FontWeight.w500),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.of(context).maybePop();
|
||||
},
|
||||
),
|
||||
TextButton(
|
||||
child: Text(
|
||||
"next".i18n,
|
||||
style: const TextStyle(fontWeight: FontWeight.w500),
|
||||
),
|
||||
onPressed: () async {
|
||||
todoItems.add(TodoItem.fromJson({
|
||||
'id': const Uuid().v4(),
|
||||
'title': _taskName.text.replaceAll(' ', '') != ""
|
||||
? _taskName.text
|
||||
: 'no_title'.i18n,
|
||||
'content': _taskContent.text,
|
||||
'done': false,
|
||||
}));
|
||||
|
||||
await databaseProvider.userStore
|
||||
.storeSelfTodoItems(todoItems, userId: user.id!);
|
||||
|
||||
setState(() {
|
||||
_taskName.text = "";
|
||||
_taskContent.text = "";
|
||||
});
|
||||
|
||||
Provider.of<SelfNoteProvider>(context, listen: false).restore();
|
||||
Provider.of<SelfNoteProvider>(context, listen: false)
|
||||
.restoreTodo();
|
||||
|
||||
generateTiles();
|
||||
|
||||
Navigator.of(context).pop(true);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,10 @@ extension ScreensLocalization on String {
|
||||
"hint_t": "Note title...",
|
||||
"your_notes": "Your Notes",
|
||||
"new_image": "New Image",
|
||||
"no_title": "No title",
|
||||
"task_content": "Task content...",
|
||||
"task_name": "Task title...",
|
||||
"new_task": "New Task",
|
||||
},
|
||||
"hu_hu": {
|
||||
"notes": "Füzet",
|
||||
@@ -26,6 +30,10 @@ extension ScreensLocalization on String {
|
||||
"hint_t": "Jegyzet címe...",
|
||||
"your_notes": "Jegyzeteid",
|
||||
"new_image": "Új kép",
|
||||
"no_title": "Nincs cím",
|
||||
"task_content": "Feladat tartalma...",
|
||||
"task_name": "Feladat címe...",
|
||||
"new_task": "Új feladat",
|
||||
},
|
||||
"de_de": {
|
||||
"notes": "Broschüre",
|
||||
@@ -38,6 +46,10 @@ extension ScreensLocalization on String {
|
||||
"hint_t": "Titel notieren...",
|
||||
"your_notes": "Deine Noten",
|
||||
"new_image": "Neues Bild",
|
||||
"no_title": "Kein Titel",
|
||||
"task_content": "Aufgabeninhalt...",
|
||||
"task_name": "Aufgabentitel...",
|
||||
"new_task": "Neue Aufgabe",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -257,6 +257,8 @@ class AddNoteScreenState extends State<AddNoteScreen> {
|
||||
style: const TextStyle(fontSize: 16.0),
|
||||
),
|
||||
),
|
||||
if (MediaQuery.of(context).viewInsets.bottom != 0)
|
||||
const SizedBox(height: 60),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -6,6 +6,7 @@ import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:image_crop/image_crop.dart';
|
||||
import 'package:image_picker/image_picker.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
@@ -27,6 +28,8 @@ class ImageNoteEditor extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _ImageNoteEditorState extends State<ImageNoteEditor> {
|
||||
final _title = TextEditingController();
|
||||
|
||||
final cropKey = GlobalKey<CropState>();
|
||||
File? _file;
|
||||
File? _sample;
|
||||
@@ -62,7 +65,7 @@ class _ImageNoteEditorState extends State<ImageNoteEditor> {
|
||||
child: Crop.file(
|
||||
_sample!,
|
||||
key: cropKey,
|
||||
aspectRatio: 1.0,
|
||||
// aspectRatio: 1.0,
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -135,7 +138,8 @@ class _ImageNoteEditorState extends State<ImageNoteEditor> {
|
||||
selfNotes.add(SelfNote.fromJson({
|
||||
'id': const Uuid().v4(),
|
||||
'content': base64Image,
|
||||
'note_type': 'image'
|
||||
'note_type': 'image',
|
||||
'title': _title.text,
|
||||
}));
|
||||
|
||||
await Provider.of<DatabaseProvider>(context, listen: false)
|
||||
@@ -143,6 +147,7 @@ class _ImageNoteEditorState extends State<ImageNoteEditor> {
|
||||
.storeSelfNotes(selfNotes, userId: widget.u.id);
|
||||
|
||||
Provider.of<SelfNoteProvider>(context, listen: false).restore();
|
||||
Provider.of<SelfNoteProvider>(context, listen: false).restoreTodo();
|
||||
|
||||
debugPrint('$file');
|
||||
}
|
||||
@@ -170,6 +175,37 @@ class _ImageNoteEditorState extends State<ImageNoteEditor> {
|
||||
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
|
||||
child: _sample == null ? openImageWidget() : cropImageWidget(),
|
||||
),
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
|
||||
child: TextField(
|
||||
controller: _title,
|
||||
onEditingComplete: () async {},
|
||||
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: 'title'.i18n,
|
||||
suffixIcon: IconButton(
|
||||
icon: const Icon(
|
||||
FeatherIcons.x,
|
||||
color: Colors.grey,
|
||||
),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
_title.text = '';
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
// if (widget.u.picture != "")
|
||||
// TextButton(
|
||||
// child: Text(
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:flutter_markdown/flutter_markdown.dart';
|
||||
import 'package:refilc/api/providers/self_note_provider.dart';
|
||||
import 'package:refilc/models/self_note.dart';
|
||||
@@ -8,6 +10,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:markdown/markdown.dart' as md;
|
||||
import 'notes_screen.i18n.dart';
|
||||
|
||||
class NoteViewScreen extends StatefulWidget {
|
||||
const NoteViewScreen({super.key, required this.note});
|
||||
@@ -30,7 +33,9 @@ class NoteViewScreenState extends State<NoteViewScreen> {
|
||||
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
leading: BackButton(color: AppColors.of(context).text),
|
||||
title: Text(
|
||||
widget.note.title ?? '${widget.note.content.split(' ')[0]}...',
|
||||
widget.note.noteType == NoteType.text
|
||||
? (widget.note.title ?? '${widget.note.content.split(' ')[0]}...')
|
||||
: 'image_note'.i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text,
|
||||
fontSize: 26.0,
|
||||
@@ -38,52 +43,55 @@ class NoteViewScreenState extends State<NoteViewScreen> {
|
||||
),
|
||||
),
|
||||
actions: [
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(10.1),
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
// handle tap
|
||||
Navigator.of(context, rootNavigator: true).push(
|
||||
CupertinoPageRoute(
|
||||
builder: (context) =>
|
||||
AddNoteScreen(initialNote: widget.note)));
|
||||
},
|
||||
child: Container(
|
||||
color: Theme.of(context).colorScheme.secondary.withOpacity(0.2),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Stack(
|
||||
children: [
|
||||
IconTheme(
|
||||
data: IconThemeData(
|
||||
color: Theme.of(context).colorScheme.secondary,
|
||||
if (widget.note.noteType == NoteType.text)
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(10.1),
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
// handle tap
|
||||
Navigator.of(context, rootNavigator: true).push(
|
||||
CupertinoPageRoute(
|
||||
builder: (context) =>
|
||||
AddNoteScreen(initialNote: widget.note)));
|
||||
},
|
||||
child: Container(
|
||||
color:
|
||||
Theme.of(context).colorScheme.secondary.withOpacity(0.2),
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.all(8.0),
|
||||
child: Stack(
|
||||
children: [
|
||||
IconTheme(
|
||||
data: IconThemeData(
|
||||
color: Theme.of(context).colorScheme.secondary,
|
||||
),
|
||||
child: const Icon(
|
||||
FeatherIcons.edit,
|
||||
size: 20.0,
|
||||
),
|
||||
),
|
||||
child: const Icon(
|
||||
FeatherIcons.edit,
|
||||
size: 20.0,
|
||||
IconTheme(
|
||||
data: IconThemeData(
|
||||
color:
|
||||
Theme.of(context).brightness == Brightness.light
|
||||
? Colors.black.withOpacity(.5)
|
||||
: Colors.white.withOpacity(.3),
|
||||
),
|
||||
child: const Icon(
|
||||
FeatherIcons.edit,
|
||||
size: 20.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
IconTheme(
|
||||
data: IconThemeData(
|
||||
color:
|
||||
Theme.of(context).brightness == Brightness.light
|
||||
? Colors.black.withOpacity(.5)
|
||||
: Colors.white.withOpacity(.3),
|
||||
),
|
||||
child: const Icon(
|
||||
FeatherIcons.edit,
|
||||
size: 20.0,
|
||||
),
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
if (widget.note.noteType == NoteType.text)
|
||||
const SizedBox(
|
||||
width: 10,
|
||||
),
|
||||
ClipRRect(
|
||||
borderRadius: BorderRadius.circular(10.1),
|
||||
child: GestureDetector(
|
||||
@@ -140,21 +148,30 @@ class NoteViewScreenState extends State<NoteViewScreen> {
|
||||
child: Column(
|
||||
children: [
|
||||
Expanded(
|
||||
child: MarkdownBody(
|
||||
data: widget.note.content,
|
||||
extensionSet: md.ExtensionSet(
|
||||
md.ExtensionSet.gitHubFlavored.blockSyntaxes,
|
||||
<md.InlineSyntax>[
|
||||
md.EmojiSyntax(),
|
||||
...md.ExtensionSet.gitHubFlavored.inlineSyntaxes
|
||||
],
|
||||
),
|
||||
styleSheet: MarkdownStyleSheet(
|
||||
p: const TextStyle(
|
||||
fontSize: 15.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
child: widget.note.noteType == NoteType.text
|
||||
? MarkdownBody(
|
||||
data: widget.note.content,
|
||||
extensionSet: md.ExtensionSet(
|
||||
md.ExtensionSet.gitHubFlavored.blockSyntaxes,
|
||||
<md.InlineSyntax>[
|
||||
md.EmojiSyntax(),
|
||||
...md.ExtensionSet.gitHubFlavored.inlineSyntaxes
|
||||
],
|
||||
),
|
||||
styleSheet: MarkdownStyleSheet(
|
||||
p: const TextStyle(
|
||||
fontSize: 15.0,
|
||||
),
|
||||
),
|
||||
)
|
||||
: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(10.0),
|
||||
child: Image.memory(
|
||||
const Base64Decoder().convert(widget.note.content),
|
||||
fit: BoxFit.contain,
|
||||
gaplessPlayback: true,
|
||||
),
|
||||
),
|
||||
),
|
||||
// Expanded(
|
||||
// child: Text(
|
||||
|
||||
@@ -268,6 +268,7 @@ class NotesScreenState extends State<NotesScreen> {
|
||||
Provider.of<HomeworkProvider>(context, listen: false)
|
||||
.fetch(from: DateTime.now().subtract(const Duration(days: 30)));
|
||||
Provider.of<SelfNoteProvider>(context, listen: false).restore();
|
||||
Provider.of<SelfNoteProvider>(context, listen: false).restoreTodo();
|
||||
|
||||
return Future(() => null);
|
||||
},
|
||||
|
||||
@@ -18,6 +18,8 @@ extension SettingsLocalization on String {
|
||||
"click_here": "Click here",
|
||||
"select_image": "to select an image",
|
||||
"new_image": "New Image",
|
||||
"image_note": "Image",
|
||||
"title": "Image title...",
|
||||
},
|
||||
"hu_hu": {
|
||||
"notes": "Füzet",
|
||||
@@ -34,6 +36,8 @@ extension SettingsLocalization on String {
|
||||
"click_here": "Kattints ide",
|
||||
"select_image": "kép kiválasztásához",
|
||||
"new_image": "Új kép",
|
||||
"image_note": "Kép",
|
||||
"title": "Kép címe...",
|
||||
},
|
||||
"de_de": {
|
||||
"notes": "Broschüre",
|
||||
@@ -50,6 +54,8 @@ extension SettingsLocalization on String {
|
||||
"click_here": "Klicken Sie hier",
|
||||
"select_image": "um ein Bild auszuwählen",
|
||||
"new_image": "Neues Bild",
|
||||
"image_note": "Bild",
|
||||
"title": "Bildtitel...",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/theme/colors/colors.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:refilc/utils/format.dart';
|
||||
@@ -50,11 +53,26 @@ class _DayTitleState extends State<DayTitle> {
|
||||
width: MediaQuery.of(context).size.width / 1.5,
|
||||
child: Text(
|
||||
widget.dayTitle(index).capital(),
|
||||
style: TextStyle(
|
||||
color:
|
||||
AppColors.of(context).text.withOpacity(opacity),
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
style: Provider.of<SettingsProvider>(context)
|
||||
.fontFamily !=
|
||||
'' &&
|
||||
Provider.of<SettingsProvider>(context)
|
||||
.titleOnlyFont
|
||||
? GoogleFonts.getFont(
|
||||
Provider.of<SettingsProvider>(context).fontFamily,
|
||||
textStyle: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.text
|
||||
.withOpacity(opacity),
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
)
|
||||
: TextStyle(
|
||||
color: AppColors.of(context)
|
||||
.text
|
||||
.withOpacity(opacity),
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold),
|
||||
),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'dart:math';
|
||||
import 'package:animations/animations.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
import 'package:i18n_extension/i18n_extension.dart';
|
||||
import 'package:refilc/api/providers/database_provider.dart';
|
||||
import 'package:refilc/api/providers/update_provider.dart';
|
||||
@@ -19,7 +20,7 @@ import 'package:refilc_mobile_ui/common/empty.dart';
|
||||
import 'package:refilc_mobile_ui/common/profile_image/profile_button.dart';
|
||||
import 'package:refilc_mobile_ui/common/profile_image/profile_image.dart';
|
||||
import 'package:refilc_mobile_ui/common/system_chrome.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/lesson/lesson_view.dart';
|
||||
// import 'package:refilc_mobile_ui/common/widgets/lesson/lesson_view.dart';
|
||||
import 'package:refilc_kreta_api/controllers/timetable_controller.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/lesson/lesson_viewable.dart';
|
||||
import 'package:refilc_mobile_ui/pages/timetable/day_title.dart';
|
||||
@@ -60,7 +61,11 @@ class TimetablePage extends StatefulWidget {
|
||||
NavigationScreen.of(context)?.setPage("timetable");
|
||||
|
||||
// Show initial Lesson
|
||||
if (lesson != null) LessonView.show(lesson, context: context);
|
||||
// if (lesson != null) LessonView.show(lesson, context: context);
|
||||
// changed to new popup
|
||||
if (lesson != null) {
|
||||
TimetableLessonPopup.show(context: context, lesson: lesson);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -316,6 +321,7 @@ class TimetablePageState extends State<TimetablePage>
|
||||
badge: updateProvider.available,
|
||||
role: user.role,
|
||||
profilePictureString: user.picture,
|
||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -374,11 +380,25 @@ class TimetablePageState extends State<TimetablePage>
|
||||
} else {
|
||||
return Text(
|
||||
"timetable".i18n,
|
||||
style: TextStyle(
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: AppColors.of(context).text,
|
||||
),
|
||||
style: Provider.of<SettingsProvider>(context)
|
||||
.fontFamily !=
|
||||
'' &&
|
||||
Provider.of<SettingsProvider>(context)
|
||||
.titleOnlyFont
|
||||
? GoogleFonts.getFont(
|
||||
Provider.of<SettingsProvider>(context)
|
||||
.fontFamily,
|
||||
textStyle: TextStyle(
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: AppColors.of(context).text,
|
||||
),
|
||||
)
|
||||
: TextStyle(
|
||||
fontSize: 32.0,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: AppColors.of(context).text,
|
||||
),
|
||||
);
|
||||
}
|
||||
}(),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc_plus/providers/plus_provider.dart';
|
||||
import 'package:refilc_plus/ui/mobile/plus/activation_view/activation_view.dart';
|
||||
import 'package:refilc_mobile_ui/plus/plus_screen.i18n.dart';
|
||||
@@ -50,6 +51,20 @@ class PlusPlanCard extends StatelessWidget {
|
||||
return;
|
||||
}
|
||||
|
||||
if (Provider.of<SettingsProvider>(context, listen: false).xFilcId ==
|
||||
"none") {
|
||||
ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
|
||||
content: Text(
|
||||
"Be kell kapcsolnod a Névtelen Analitikát a beállítások főoldalán, mielőtt reFilc+ előfizetést vásárolnál!",
|
||||
style:
|
||||
TextStyle(color: Colors.black, fontWeight: FontWeight.bold),
|
||||
),
|
||||
backgroundColor: Colors.white,
|
||||
));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (Provider.of<PlusProvider>(context, listen: false).hasPremium) {
|
||||
if (!active) {
|
||||
launchUrl(
|
||||
|
||||
@@ -225,6 +225,7 @@ class PlusScreenState extends State<PlusScreen> {
|
||||
['🎓', 'rfp_6'.i18n],
|
||||
['👕', 'rfp_14'.i18n],
|
||||
['👑', 'rfp_15'.i18n],
|
||||
['📩', 'rfp_17'.i18n],
|
||||
['🔜', 'more_soon'.i18n],
|
||||
],
|
||||
docsAccepted: docsAccepted,
|
||||
|
||||
@@ -45,6 +45,7 @@ extension SettingsLocalization on String {
|
||||
"rfp_14": "Discount in reFilc Shop (soon)",
|
||||
"rfp_15": "Subscriber role in our Discord community",
|
||||
"rfp_16": "Private leaks and informations about upcoming features",
|
||||
"rfp_17": "Grade exporting",
|
||||
// other
|
||||
"and": " and ",
|
||||
"every": "Every ",
|
||||
@@ -96,6 +97,7 @@ extension SettingsLocalization on String {
|
||||
"rfp_14": "Kedvezmény a reFilc Shop-ban (hamarosan)",
|
||||
"rfp_15": "Előfizetői rang a Discord szerverünkön",
|
||||
"rfp_16": "Privát betekintések és információk közelgő újításokról",
|
||||
"rfp_17": "Jegy exportálás",
|
||||
// other
|
||||
"and": " és ",
|
||||
"every": "Minden ",
|
||||
@@ -133,30 +135,32 @@ extension SettingsLocalization on String {
|
||||
"Der Preis wird in Euro angegeben im Bezug zum aktuellen Wechselkurs. 1 EUR ≈ 390 HUF",
|
||||
"active": "Aktiv",
|
||||
// benefits
|
||||
"rfp_1": "Előzetes hozzáférés új verziókhoz",
|
||||
"rfp_2": "2 fiók használata egyszerre",
|
||||
"rfp_3": "Egyedi üdvözlő üzenet",
|
||||
"rfp_4": "Korlátlan saját jegyzet és feladat a füzet oldalon",
|
||||
"rfp_5": "Egyedi jegy ritkaságok",
|
||||
"rfp_6": "Összesített átlagszámoló",
|
||||
"rfp_7": "Órarend jegyzetek",
|
||||
"rfp_8": "Egyedi betütípusok",
|
||||
"rfp_9": "Korlátlan fiók használata egyszerre",
|
||||
"rfp_10": "Alkalmazás ikonjának megváltoztatása (v5.1-től)",
|
||||
"rfp_11": "Live Activity szín",
|
||||
"rfp_12": "Fejlettebb cél kitűzés",
|
||||
"rfp_13": "Naptár szinkronizálás",
|
||||
"rfp_14": "Kedvezmény a reFilc Shop-ban (hamarosan)",
|
||||
"rfp_15": "Előfizetői rang a Discord szerverünkön",
|
||||
"rfp_16": "Privát betekintések és információk közelgő újításokról",
|
||||
"rfp_1": "Frühzeitiger Zugriff auf Updates",
|
||||
"rfp_2": "Verwendung von zwei Konten gleichzeitig",
|
||||
"rfp_3": "Individuelle Begrüßungsnachricht",
|
||||
"rfp_4":
|
||||
"Unbegrenzte eigene Notizen und Aufgaben auf der Notizbuchseite",
|
||||
"rfp_5": "Individuelle Notenraritäten",
|
||||
"rfp_6": "Gesamtdurchschnittsberechner",
|
||||
"rfp_7": "Stundenplan-Notizen",
|
||||
"rfp_8": "Individuelle Schriftarten",
|
||||
"rfp_9": "Unbegrenzte Konten",
|
||||
"rfp_10": "Anpassung des App-Symbols (ab v5.1)",
|
||||
"rfp_11": "Änderung der Live-Aktivitätsfarbe",
|
||||
"rfp_12": "Verbesserter Zielplaner",
|
||||
"rfp_13": "Importieren Sie Ihren Stundenplan in Ihre Kalender-App",
|
||||
"rfp_14": "Rabatt im reFilc Shop (bald)",
|
||||
"rfp_15": "Abonnentenrolle in unserer Discord-Community",
|
||||
"rfp_16": "Private Leaks und Informationen über kommende Funktionen",
|
||||
"rfp_17": "Notenexport",
|
||||
// other
|
||||
"and": " és ",
|
||||
"every": "Minden ",
|
||||
"benefit": " előny",
|
||||
"and": " und ",
|
||||
"every": "Jeder ",
|
||||
"benefit": " Vorteil",
|
||||
"show_lifetime": "Für immer Pakete",
|
||||
"more_soon": "Mehr folgt bald...",
|
||||
"faq_dc":
|
||||
"Az előnyök beváltásához írj nekünk Discord-on privát üzenetet!",
|
||||
"Um Ihre Vorteile einzulösen, schreiben Sie uns eine private Nachricht auf Discord!",
|
||||
"reactivate": "Bestehendes Abonnement reaktivieren",
|
||||
},
|
||||
};
|
||||
|
||||
179
refilc_mobile_ui/lib/screens/login/kreten_login.dart
Normal file
179
refilc_mobile_ui/lib/screens/login/kreten_login.dart
Normal file
@@ -0,0 +1,179 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc_kreta_api/client/api.dart';
|
||||
import 'package:refilc_kreta_api/client/client.dart';
|
||||
import 'package:webview_flutter/webview_flutter.dart';
|
||||
|
||||
class KretenLoginScreen extends StatefulWidget {
|
||||
const KretenLoginScreen({super.key});
|
||||
|
||||
@override
|
||||
State<KretenLoginScreen> createState() => _KretenLoginScreenState();
|
||||
}
|
||||
|
||||
class _KretenLoginScreenState extends State<KretenLoginScreen> {
|
||||
late final WebViewController controller;
|
||||
var loadingPercentage = 0;
|
||||
var currentUrl = '';
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
controller = WebViewController()
|
||||
..setJavaScriptMode(JavaScriptMode.unrestricted)
|
||||
..setNavigationDelegate(NavigationDelegate(
|
||||
onPageStarted: (url) async {
|
||||
setState(() {
|
||||
loadingPercentage = 0;
|
||||
currentUrl = url;
|
||||
});
|
||||
|
||||
List<String> requiredThings = url
|
||||
.replaceAll(
|
||||
'https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect?code=',
|
||||
'')
|
||||
.replaceAll(
|
||||
'&scope=openid email offline_access kreta-ellenorzo-webapi.public kreta-eugyintezes-webapi.public kreta-fileservice-webapi.public kreta-mobile-global-webapi.public kreta-dkt-webapi.public kreta-ier-webapi.public&state=refilc_student_mobile&session_state=',
|
||||
':')
|
||||
.split(':');
|
||||
|
||||
String code = requiredThings[0];
|
||||
// String sessionState = requiredThings[1];
|
||||
|
||||
debugPrint('url: $url');
|
||||
|
||||
// actual login (token grant) logic
|
||||
Map<String, String> headers = {
|
||||
"content-type": "application/x-www-form-urlencoded",
|
||||
"accept": "*/*",
|
||||
"user-agent":
|
||||
"eKretaStudent/264745 CFNetwork/1494.0.7 Darwin/23.4.0",
|
||||
"code_verifier": "THDUSddKOOndwCkqBtVHvRjh2LK0V2kMyLP2QirqVWQ",
|
||||
};
|
||||
|
||||
Map? res = await Provider.of<KretaClient>(context, listen: false)
|
||||
.postAPI(KretaAPI.login, headers: headers, body: {
|
||||
"code": code,
|
||||
"redirect_uri":
|
||||
"https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect",
|
||||
"client_id": "kreta-ellenorzo-student-mobile-ios",
|
||||
"grant_type": "authorization_code",
|
||||
});
|
||||
if (res != null) {
|
||||
print(res);
|
||||
// if (res.containsKey("error")) {
|
||||
// if (res["error"] == "invalid_grant") {
|
||||
// print("ERROR: invalid_grant");
|
||||
// return;
|
||||
// }
|
||||
// } else {
|
||||
// if (res.containsKey("access_token")) {
|
||||
// try {
|
||||
// Provider.of<KretaClient>(context, listen: false).accessToken =
|
||||
// res["access_token"];
|
||||
// Map? studentJson =
|
||||
// await Provider.of<KretaClient>(context, listen: false)
|
||||
// .getAPI(KretaAPI.student(instituteCode));
|
||||
// Student student = Student.fromJson(studentJson!);
|
||||
// var user = User(
|
||||
// username: username,
|
||||
// password: password,
|
||||
// instituteCode: instituteCode,
|
||||
// name: student.name,
|
||||
// student: student,
|
||||
// role: JwtUtils.getRoleFromJWT(res["access_token"])!,
|
||||
// );
|
||||
|
||||
// if (onLogin != null) onLogin(user);
|
||||
|
||||
// // Store User in the database
|
||||
// await Provider.of<DatabaseProvider>(context, listen: false)
|
||||
// .store
|
||||
// .storeUser(user);
|
||||
// Provider.of<UserProvider>(context, listen: false)
|
||||
// .addUser(user);
|
||||
// Provider.of<UserProvider>(context, listen: false)
|
||||
// .setUser(user.id);
|
||||
|
||||
// // Get user data
|
||||
// try {
|
||||
// await Future.wait([
|
||||
// Provider.of<GradeProvider>(context, listen: false)
|
||||
// .fetch(),
|
||||
// Provider.of<TimetableProvider>(context, listen: false)
|
||||
// .fetch(week: Week.current()),
|
||||
// Provider.of<ExamProvider>(context, listen: false).fetch(),
|
||||
// Provider.of<HomeworkProvider>(context, listen: false)
|
||||
// .fetch(),
|
||||
// Provider.of<MessageProvider>(context, listen: false)
|
||||
// .fetchAll(),
|
||||
// Provider.of<MessageProvider>(context, listen: false)
|
||||
// .fetchAllRecipients(),
|
||||
// Provider.of<NoteProvider>(context, listen: false).fetch(),
|
||||
// Provider.of<EventProvider>(context, listen: false)
|
||||
// .fetch(),
|
||||
// Provider.of<AbsenceProvider>(context, listen: false)
|
||||
// .fetch(),
|
||||
// ]);
|
||||
// } catch (error) {
|
||||
// print("WARNING: failed to fetch user data: $error");
|
||||
// }
|
||||
|
||||
// if (onSuccess != null) onSuccess();
|
||||
|
||||
// return LoginState.success;
|
||||
// } catch (error) {
|
||||
// print("ERROR: loginAPI: $error");
|
||||
// // maybe check debug mode
|
||||
// // ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("ERROR: $error")));
|
||||
// return LoginState.failed;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
}
|
||||
},
|
||||
onProgress: (progress) {
|
||||
setState(() {
|
||||
loadingPercentage = progress;
|
||||
});
|
||||
},
|
||||
onPageFinished: (url) {
|
||||
setState(() {
|
||||
loadingPercentage = 100;
|
||||
});
|
||||
},
|
||||
))
|
||||
..loadRequest(
|
||||
Uri.parse(
|
||||
'https://idp.e-kreta.hu/connect/authorize?prompt=login&nonce=refilc&response_type=code&code_challenge_method=S256&scope=openid%20email%20offline_access%20kreta-ellenorzo-webapi.public%20kreta-eugyintezes-webapi.public%20kreta-fileservice-webapi.public%20kreta-mobile-global-webapi.public%20kreta-dkt-webapi.public%20kreta-ier-webapi.public&code_challenge=Oj_aVMRJHYsv00mrtGJY72NJa7HY54lVnU2Cb4CWbWw&redirect_uri=https://mobil.e-kreta.hu/ellenorzo-student/prod/oauthredirect&client_id=kreta-ellenorzo-student-mobile-ios&state=refilc_student_mobile'),
|
||||
);
|
||||
}
|
||||
|
||||
// Future<void> loadLoginUrl() async {
|
||||
// String nonceStr = await Provider.of<KretaClient>(context, listen: false)
|
||||
// .getAPI(KretaAPI.nonce, json: false);
|
||||
|
||||
// Nonce nonce = getNonce(nonceStr, );
|
||||
// }
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
leading: const BackButton(),
|
||||
title: const Text('e-KRÉTA Bejelentkezés'),
|
||||
),
|
||||
body: Stack(
|
||||
children: [
|
||||
WebViewWidget(
|
||||
controller: controller,
|
||||
),
|
||||
if (loadingPercentage < 100)
|
||||
LinearProgressIndicator(
|
||||
value: loadingPercentage / 100.0,
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -56,6 +56,13 @@ class AccountView extends StatelessWidget {
|
||||
Detail(
|
||||
title: "parents".plural(user.student.parents.length),
|
||||
description: user.student.parents.join(", ")),
|
||||
const SizedBox(
|
||||
height: 10.0,
|
||||
),
|
||||
// Detail(
|
||||
// title: "parents".i18n,
|
||||
// description: user.student.parents.join(", ")),
|
||||
Detail(title: "school".i18n, description: user.student.school.name),
|
||||
],
|
||||
),
|
||||
);
|
||||
|
||||
@@ -9,6 +9,7 @@ extension Localization on String {
|
||||
"class": "Class",
|
||||
"address": "Home address",
|
||||
"parents": "Parents".one("Parent"),
|
||||
"parents_phone": "Parents' phone number: ".one("Parent"),
|
||||
},
|
||||
"hu_hu": {
|
||||
"birthdate": "Születési dátum",
|
||||
|
||||
@@ -37,6 +37,9 @@ import 'package:flutter_material_color_picker/flutter_material_color_picker.dart
|
||||
import 'package:refilc/models/icon_pack.dart';
|
||||
import 'package:refilc/utils/format.dart';
|
||||
import 'package:refilc_mobile_ui/screens/settings/theme_screen.dart';
|
||||
import 'package:refilc_plus/models/premium_scopes.dart';
|
||||
import 'package:refilc_plus/providers/plus_provider.dart';
|
||||
import 'package:refilc_plus/ui/mobile/plus/upsell.dart';
|
||||
// import 'package:refilc_plus/models/premium_scopes.dart';
|
||||
// import 'package:refilc_plus/providers/plus_provider.dart';
|
||||
// import 'package:refilc_plus/ui/mobile/plus/upsell.dart';
|
||||
@@ -900,6 +903,15 @@ class _LiveActivityColorSettingState extends State<LiveActivityColorSetting> {
|
||||
allowShades: false,
|
||||
selectedColor: settings.liveActivityColor,
|
||||
onMainColorChange: (k) {
|
||||
if (!Provider.of<PlusProvider>(context, listen: false)
|
||||
.hasScope(PremiumScopes.liveActivityColor)) {
|
||||
PlusLockedFeaturePopup.show(
|
||||
context: context,
|
||||
feature: PremiumFeature.liveActivity,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
setState(() {
|
||||
currentColor = k as Color;
|
||||
settings.update(
|
||||
|
||||
@@ -27,6 +27,7 @@ import 'package:refilc_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu.dart
|
||||
import 'package:refilc_mobile_ui/common/panel/panel.dart';
|
||||
import 'package:refilc_mobile_ui/common/panel/panel_button.dart';
|
||||
import 'package:refilc_mobile_ui/common/profile_image/profile_image.dart';
|
||||
import 'package:refilc_mobile_ui/common/soon_alert/soon_alert.dart';
|
||||
// import 'package:refilc_mobile_ui/common/soon_alert/soon_alert.dart';
|
||||
import 'package:refilc_mobile_ui/common/splitted_panel/splitted_panel.dart';
|
||||
// import 'package:refilc_mobile_ui/common/system_chrome.dart';
|
||||
@@ -320,6 +321,7 @@ class SettingsScreenState extends State<SettingsScreen>
|
||||
badge: updateProvider.available,
|
||||
role: user.role,
|
||||
profilePictureString: user.picture,
|
||||
gradeStreak: (user.gradeStreak ?? 0) > 1,
|
||||
backgroundColor: Theme.of(context)
|
||||
.colorScheme
|
||||
.tertiary, //!settings.presentationMode
|
||||
@@ -702,6 +704,46 @@ class SettingsScreenState extends State<SettingsScreen>
|
||||
],
|
||||
),
|
||||
|
||||
if ((user.gradeStreak ?? 0) > 1)
|
||||
SplittedPanel(
|
||||
padding: const EdgeInsets.only(
|
||||
bottom: 12.0, left: 24.0, right: 24.0),
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: () {
|
||||
SoonAlert.show(context: context);
|
||||
},
|
||||
child: ListTile(
|
||||
title: Text(
|
||||
"grade_streak".i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text.withOpacity(0.95),
|
||||
fontWeight: FontWeight.w500,
|
||||
),
|
||||
),
|
||||
subtitle: Text(
|
||||
"grade_streak_subtitle".i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text.withOpacity(0.75),
|
||||
),
|
||||
),
|
||||
leading: const Text(
|
||||
"🔥",
|
||||
style: TextStyle(fontSize: 22.0),
|
||||
),
|
||||
trailing: Text(
|
||||
"${user.gradeStreak}",
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text.withOpacity(0.95),
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 18.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
// plus subscribe inline
|
||||
const PlusSettingsInline(),
|
||||
|
||||
|
||||
@@ -116,6 +116,14 @@ extension SettingsLocalization on String {
|
||||
"exp_settings": "Export Settings",
|
||||
"manage_subs": "Manage Subscription",
|
||||
"copy_plus_id": "Copy reFilc+ ID",
|
||||
// grade streak
|
||||
"grade_streak": "Grade 5 Streak",
|
||||
"grade_streak_subtitle": "So many 5s in a row?!",
|
||||
// other
|
||||
"only_ch_title_font": "Font Only for Titles",
|
||||
"new_popups": "New Popups",
|
||||
"export_method": "Export Method",
|
||||
"grade_exporting": "Grade Exporting",
|
||||
},
|
||||
"hu_hu": {
|
||||
"personal_details": "Személyes információk",
|
||||
@@ -230,6 +238,14 @@ extension SettingsLocalization on String {
|
||||
"exp_settings": "Beállítások exportálása",
|
||||
"manage_subs": "Előfizetés kezelése",
|
||||
"copy_plus_id": "reFilc+ ID másolása",
|
||||
// grade streak
|
||||
"grade_streak": "5-ös sorozat",
|
||||
"grade_streak_subtitle": "Egymás után ennyi 5-ös?!",
|
||||
// other
|
||||
"only_ch_title_font": "Betűtípus csak címekre",
|
||||
"new_popups": "Új felugró ablakok",
|
||||
"export_method": "Exportálási mód",
|
||||
"grade_exporting": "Jegy exportálás",
|
||||
},
|
||||
"de_de": {
|
||||
"personal_details": "Persönliche Angaben",
|
||||
@@ -344,6 +360,14 @@ extension SettingsLocalization on String {
|
||||
"exp_settings": "Einstellungen exportieren",
|
||||
"manage_subs": "Abonnement verwalten",
|
||||
"copy_plus_id": "reFilc+ ID kopieren",
|
||||
// grade streak
|
||||
"grade_streak": "5er-Streak",
|
||||
"grade_streak_subtitle": "So viele 5er in Folge?!",
|
||||
// other
|
||||
"only_ch_title_font": "Schriftart nur für Titel",
|
||||
"new_popups": "Neue Popups",
|
||||
"export_method": "Exportmethode",
|
||||
"grade_exporting": "Noten exportieren",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc_plus/ui/mobile/settings/submenu/calendar_sync.dart';
|
||||
import 'package:refilc_plus/ui/mobile/settings/submenu/grade_exporting.dart';
|
||||
import 'package:refilc_plus/models/premium_scopes.dart';
|
||||
import 'package:refilc_plus/providers/plus_provider.dart';
|
||||
import 'package:refilc_plus/ui/mobile/plus/upsell.dart';
|
||||
@@ -158,6 +159,16 @@ class ExtrasSettingsScreenState extends State<ExtrasSettingsScreen> {
|
||||
),
|
||||
],
|
||||
),
|
||||
SplittedPanel(
|
||||
padding: const EdgeInsets.only(top: 9.0),
|
||||
cardPadding: const EdgeInsets.all(4.0),
|
||||
isSeparated: true,
|
||||
children: [
|
||||
MenuGradeExporting(
|
||||
borderRadius: BorderRadius.circular(12.0),
|
||||
),
|
||||
],
|
||||
),
|
||||
SplittedPanel(
|
||||
padding: const EdgeInsets.only(top: 9.0),
|
||||
cardPadding: const EdgeInsets.all(4.0),
|
||||
|
||||
381
refilc_mobile_ui/lib/screens/settings/submenu/grade_colors.dart
Normal file
381
refilc_mobile_ui/lib/screens/settings/submenu/grade_colors.dart
Normal file
@@ -0,0 +1,381 @@
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/theme/colors/colors.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc/ui/flutter_colorpicker/colorpicker.dart';
|
||||
import 'package:refilc/ui/widgets/grade/grade_tile.dart';
|
||||
import 'package:refilc_kreta_api/models/grade.dart';
|
||||
import 'package:refilc_mobile_ui/screens/settings/theme_screen.dart';
|
||||
import 'submenu_screen.i18n.dart';
|
||||
|
||||
enum SelectedGrade { one, two, three, four, five }
|
||||
|
||||
class GradeColorsSettingsScreen extends StatefulWidget {
|
||||
const GradeColorsSettingsScreen({super.key});
|
||||
|
||||
@override
|
||||
GradeColorsSettingsScreenState createState() =>
|
||||
GradeColorsSettingsScreenState();
|
||||
}
|
||||
|
||||
class GradeColorsSettingsScreenState extends State<GradeColorsSettingsScreen> {
|
||||
late SettingsProvider settingsProvider;
|
||||
|
||||
SelectedGrade currentEditGrade = SelectedGrade.one;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
SettingsProvider settingsProvider = Provider.of<SettingsProvider>(context);
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
|
||||
leading: BackButton(
|
||||
color: AppColors.of(context).text,
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
// made this cuz else it will be ugly
|
||||
currentEditGrade = SelectedGrade.one;
|
||||
});
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
title: Text(
|
||||
"grade_colors".i18n,
|
||||
style: TextStyle(color: AppColors.of(context).text),
|
||||
),
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
List<Color> colors = List.castFrom(settingsProvider.gradeColors);
|
||||
var defaultColors =
|
||||
SettingsProvider.defaultSettings().gradeColors;
|
||||
colors[currentEditGrade.index] =
|
||||
defaultColors[currentEditGrade.index];
|
||||
settingsProvider.update(gradeColors: colors);
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.restore,
|
||||
size: 26.0,
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
width: 10.0,
|
||||
),
|
||||
],
|
||||
),
|
||||
body: SizedBox(
|
||||
width: double.infinity,
|
||||
height: double.infinity,
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
SizedBox(
|
||||
height: MediaQuery.of(context).size.height * 0.14,
|
||||
),
|
||||
Stack(
|
||||
children: [
|
||||
Container(
|
||||
decoration: BoxDecoration(
|
||||
color: Theme.of(context).colorScheme.background,
|
||||
borderRadius: BorderRadius.circular(75.0),
|
||||
boxShadow: [
|
||||
BoxShadow(
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.shadow
|
||||
.withOpacity(.1),
|
||||
blurRadius: 10.0,
|
||||
offset: const Offset(0, 5),
|
||||
),
|
||||
],
|
||||
),
|
||||
padding: const EdgeInsets.all(6.0),
|
||||
child: GradeValueWidget(
|
||||
GradeValue(currentEditGrade.index + 1, '', '', 100),
|
||||
fill: true,
|
||||
size: 75.0,
|
||||
// color:
|
||||
// settingsProvider.gradeColors[currentEditGrade.index],
|
||||
),
|
||||
),
|
||||
// before grades
|
||||
if (currentEditGrade.index > 0)
|
||||
Transform.translate(
|
||||
offset: const Offset(-110, 16.5),
|
||||
child: GradeValueWidget(
|
||||
GradeValue(currentEditGrade.index, '', '', 100),
|
||||
fill: true,
|
||||
size: 60.0,
|
||||
// color:
|
||||
// settingsProvider.gradeColors[currentEditGrade.index],
|
||||
),
|
||||
),
|
||||
if (currentEditGrade.index > 1)
|
||||
Transform.translate(
|
||||
offset: const Offset(-200, 23),
|
||||
child: GradeValueWidget(
|
||||
GradeValue(currentEditGrade.index - 1, '', '', 100),
|
||||
fill: true,
|
||||
size: 50.0,
|
||||
// color:
|
||||
// settingsProvider.gradeColors[currentEditGrade.index],
|
||||
),
|
||||
),
|
||||
// after grades
|
||||
if (currentEditGrade.index < 4)
|
||||
Transform.translate(
|
||||
offset: const Offset(142, 16.5),
|
||||
child: GradeValueWidget(
|
||||
GradeValue(currentEditGrade.index + 2, '', '', 100),
|
||||
fill: true,
|
||||
size: 60.0,
|
||||
// color:
|
||||
// settingsProvider.gradeColors[currentEditGrade.index],
|
||||
),
|
||||
),
|
||||
if (currentEditGrade.index < 3)
|
||||
Transform.translate(
|
||||
offset: const Offset(245, 23),
|
||||
child: GradeValueWidget(
|
||||
GradeValue(currentEditGrade.index + 3, '', '', 100),
|
||||
fill: true,
|
||||
size: 50.0,
|
||||
// color:
|
||||
// settingsProvider.gradeColors[currentEditGrade.index],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
SizedBox(
|
||||
height: MediaQuery.of(context).size.height * 0.14,
|
||||
),
|
||||
],
|
||||
),
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12.0),
|
||||
child: SafeArea(
|
||||
child: FilcColorPicker(
|
||||
colorMode: CustomColorMode.grade,
|
||||
pickerColor:
|
||||
settingsProvider.gradeColors[currentEditGrade.index],
|
||||
onColorChanged: (c) {
|
||||
setState(() {
|
||||
// update grade color
|
||||
settingsProvider.update(
|
||||
gradeColors: settingsProvider.gradeColors
|
||||
..[currentEditGrade.index] = c);
|
||||
});
|
||||
},
|
||||
onColorChangeEnd: (c, {adaptive}) {
|
||||
// update grade color
|
||||
},
|
||||
onThemeIdProvided: (t) {},
|
||||
),
|
||||
),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.only(bottom: 20.0, top: 16.0),
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
GestureDetector(
|
||||
onTap: () => setState(() {
|
||||
currentEditGrade = SelectedGrade.one;
|
||||
}),
|
||||
child: Container(
|
||||
width: 45.0,
|
||||
height: 45.0,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: currentEditGrade == SelectedGrade.one
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withOpacity(.2),
|
||||
width: 1.0,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(50.0),
|
||||
color: currentEditGrade == SelectedGrade.one
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: null,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
'1',
|
||||
style: TextStyle(
|
||||
fontSize: 14.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: currentEditGrade == SelectedGrade.one
|
||||
? Colors.white
|
||||
: null,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 10.0),
|
||||
GestureDetector(
|
||||
onTap: () => setState(() {
|
||||
currentEditGrade = SelectedGrade.two;
|
||||
}),
|
||||
child: Container(
|
||||
width: 45.0,
|
||||
height: 45.0,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: currentEditGrade == SelectedGrade.two
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withOpacity(.2),
|
||||
width: 1.0,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(50.0),
|
||||
color: currentEditGrade == SelectedGrade.two
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: null,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
'2',
|
||||
style: TextStyle(
|
||||
fontSize: 14.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: currentEditGrade == SelectedGrade.two
|
||||
? Colors.white
|
||||
: null,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 10.0),
|
||||
GestureDetector(
|
||||
onTap: () => setState(() {
|
||||
currentEditGrade = SelectedGrade.three;
|
||||
}),
|
||||
child: Container(
|
||||
width: 45.0,
|
||||
height: 45.0,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: currentEditGrade == SelectedGrade.three
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withOpacity(.2),
|
||||
width: 1.0,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(50.0),
|
||||
color: currentEditGrade == SelectedGrade.three
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: null,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
'3',
|
||||
style: TextStyle(
|
||||
fontSize: 14.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: currentEditGrade == SelectedGrade.three
|
||||
? Colors.white
|
||||
: null,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 10.0),
|
||||
GestureDetector(
|
||||
onTap: () => setState(() {
|
||||
currentEditGrade = SelectedGrade.four;
|
||||
}),
|
||||
child: Container(
|
||||
width: 45.0,
|
||||
height: 45.0,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: currentEditGrade == SelectedGrade.four
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withOpacity(.2),
|
||||
width: 1.0,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(50.0),
|
||||
color: currentEditGrade == SelectedGrade.four
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: null,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
'4',
|
||||
style: TextStyle(
|
||||
fontSize: 14.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: currentEditGrade == SelectedGrade.four
|
||||
? Colors.white
|
||||
: null,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
const SizedBox(width: 10.0),
|
||||
GestureDetector(
|
||||
onTap: () => setState(() {
|
||||
currentEditGrade = SelectedGrade.five;
|
||||
}),
|
||||
child: Container(
|
||||
width: 45.0,
|
||||
height: 45.0,
|
||||
decoration: BoxDecoration(
|
||||
border: Border.all(
|
||||
color: currentEditGrade == SelectedGrade.five
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withOpacity(.2),
|
||||
width: 1.0,
|
||||
),
|
||||
borderRadius: BorderRadius.circular(50.0),
|
||||
color: currentEditGrade == SelectedGrade.five
|
||||
? Theme.of(context).colorScheme.secondary
|
||||
: null,
|
||||
),
|
||||
child: Center(
|
||||
child: Text(
|
||||
'5',
|
||||
style: TextStyle(
|
||||
fontSize: 14.0,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: currentEditGrade == SelectedGrade.five
|
||||
? Colors.white
|
||||
: null,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc_mobile_ui/screens/settings/settings_screen.i18n.dart';
|
||||
import 'package:refilc_mobile_ui/screens/settings/submenu/share_theme_popup.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
class MenuPaintList extends StatelessWidget {
|
||||
@@ -251,18 +252,7 @@ class PaintListScreenState extends State<PaintListScreen>
|
||||
subject: 'share_subj_theme'.i18n,
|
||||
);
|
||||
} else {
|
||||
SharedGradeColors gradeColors = await shareProvider
|
||||
.shareCurrentGradeColors(context);
|
||||
SharedTheme theme =
|
||||
await shareProvider.shareCurrentTheme(
|
||||
context,
|
||||
gradeColors: gradeColors,
|
||||
);
|
||||
|
||||
Share.share(
|
||||
theme.id,
|
||||
subject: 'share_subj_theme'.i18n,
|
||||
);
|
||||
ShareThemeDialog.show(context);
|
||||
}
|
||||
},
|
||||
longPressInstead: true,
|
||||
|
||||
@@ -30,6 +30,8 @@ import 'package:refilc_plus/providers/plus_provider.dart';
|
||||
import 'package:refilc_plus/ui/mobile/plus/upsell.dart';
|
||||
import 'package:google_fonts/google_fonts.dart';
|
||||
|
||||
import 'grade_colors.dart';
|
||||
|
||||
class MenuPersonalizeSettings extends StatelessWidget {
|
||||
const MenuPersonalizeSettings({
|
||||
super.key,
|
||||
@@ -459,6 +461,49 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
|
||||
),
|
||||
],
|
||||
),
|
||||
// new popup toggle
|
||||
SplittedPanel(
|
||||
padding: const EdgeInsets.only(top: 9.0),
|
||||
cardPadding: const EdgeInsets.all(4.0),
|
||||
isSeparated: true,
|
||||
children: [
|
||||
PanelButton(
|
||||
padding: const EdgeInsets.only(left: 14.0, right: 6.0),
|
||||
onPressed: () async {
|
||||
settingsProvider.update(
|
||||
newPopups: !settingsProvider.newPopups);
|
||||
|
||||
setState(() {});
|
||||
},
|
||||
title: Text(
|
||||
"new_popups".i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text.withOpacity(
|
||||
settingsProvider.newPopups ? .95 : .25),
|
||||
),
|
||||
),
|
||||
leading: Icon(
|
||||
FeatherIcons.alertOctagon,
|
||||
size: 22.0,
|
||||
color: AppColors.of(context).text.withOpacity(
|
||||
settingsProvider.newPopups ? .95 : .25),
|
||||
),
|
||||
trailing: Switch(
|
||||
onChanged: (v) async {
|
||||
settingsProvider.update(newPopups: v);
|
||||
|
||||
setState(() {});
|
||||
},
|
||||
value: settingsProvider.newPopups,
|
||||
activeColor: Theme.of(context).colorScheme.secondary,
|
||||
),
|
||||
borderRadius: const BorderRadius.vertical(
|
||||
top: Radius.circular(12.0),
|
||||
bottom: Radius.circular(12.0),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
// change subject icons
|
||||
// SplittedPanel(
|
||||
// padding: const EdgeInsets.only(top: 9.0),
|
||||
@@ -499,8 +544,14 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
|
||||
children: [
|
||||
PanelButton(
|
||||
onPressed: () {
|
||||
SettingsHelper.gradeColors(context);
|
||||
setState(() {});
|
||||
// SettingsHelper.gradeColors(context);
|
||||
// setState(() {});
|
||||
Navigator.of(context, rootNavigator: true).push(
|
||||
CupertinoPageRoute(
|
||||
builder: (context) =>
|
||||
const GradeColorsSettingsScreen(),
|
||||
),
|
||||
);
|
||||
},
|
||||
title: Text(
|
||||
"grade_colors".i18n,
|
||||
@@ -670,16 +721,6 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
|
||||
children: [
|
||||
PanelButton(
|
||||
onPressed: () {
|
||||
if (!Provider.of<PlusProvider>(context,
|
||||
listen: false)
|
||||
.hasScope(PremiumScopes.liveActivityColor)) {
|
||||
PlusLockedFeaturePopup.show(
|
||||
context: context,
|
||||
feature: PremiumFeature.liveActivity,
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
SettingsHelper.liveActivityColor(context);
|
||||
setState(() {});
|
||||
},
|
||||
@@ -882,7 +923,7 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
|
||||
title: Text('fonts'.i18n),
|
||||
padding: EdgeInsets.zero,
|
||||
cardPadding: const EdgeInsets.all(4.0),
|
||||
isSeparated: true,
|
||||
isSeparated: false,
|
||||
children: [
|
||||
PanelButton(
|
||||
onPressed: () {
|
||||
@@ -920,11 +961,72 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
|
||||
),
|
||||
borderRadius: const BorderRadius.vertical(
|
||||
top: Radius.circular(12.0),
|
||||
bottom: Radius.circular(6.0),
|
||||
),
|
||||
),
|
||||
PanelButton(
|
||||
padding: const EdgeInsets.only(left: 14.0, right: 6.0),
|
||||
onPressed: () async {
|
||||
if (!Provider.of<PlusProvider>(context, listen: false)
|
||||
.hasScope(PremiumScopes.customFont)) {
|
||||
PlusLockedFeaturePopup.show(
|
||||
context: context,
|
||||
feature: PremiumFeature.fontChange);
|
||||
return;
|
||||
}
|
||||
|
||||
settingsProvider.update(
|
||||
titleOnlyFont: !settingsProvider.titleOnlyFont);
|
||||
Provider.of<ThemeModeObserver>(context, listen: false)
|
||||
.changeTheme(settingsProvider.theme,
|
||||
updateNavbarColor: false);
|
||||
setState(() {});
|
||||
},
|
||||
title: Text(
|
||||
"only_ch_title_font".i18n,
|
||||
style: TextStyle(
|
||||
color: AppColors.of(context).text.withOpacity(
|
||||
settingsProvider.titleOnlyFont ? .95 : .25),
|
||||
),
|
||||
),
|
||||
leading: Icon(
|
||||
Icons.text_increase_rounded,
|
||||
size: 22.0,
|
||||
color: AppColors.of(context).text.withOpacity(
|
||||
settingsProvider.titleOnlyFont ? .95 : .25),
|
||||
),
|
||||
trailing: Switch(
|
||||
onChanged: (v) async {
|
||||
if (!Provider.of<PlusProvider>(context,
|
||||
listen: false)
|
||||
.hasScope(PremiumScopes.customFont)) {
|
||||
PlusLockedFeaturePopup.show(
|
||||
context: context,
|
||||
feature: PremiumFeature.fontChange);
|
||||
return;
|
||||
}
|
||||
|
||||
settingsProvider.update(titleOnlyFont: v);
|
||||
Provider.of<ThemeModeObserver>(context,
|
||||
listen: false)
|
||||
.changeTheme(settingsProvider.theme,
|
||||
updateNavbarColor: false);
|
||||
setState(() {});
|
||||
},
|
||||
value: settingsProvider.titleOnlyFont,
|
||||
activeColor: Theme.of(context).colorScheme.secondary,
|
||||
),
|
||||
borderRadius: const BorderRadius.vertical(
|
||||
top: Radius.circular(4.0),
|
||||
bottom: Radius.circular(12.0),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
// bottom padding
|
||||
const SizedBox(
|
||||
height: 20.0,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
// ignore_for_file: use_build_context_synchronously, deprecated_member_use
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
// import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/models/shared_theme.dart';
|
||||
import 'package:refilc_kreta_api/providers/share_provider.dart';
|
||||
import 'package:refilc_mobile_ui/common/action_button.dart';
|
||||
import 'package:refilc_mobile_ui/common/splitted_panel/splitted_panel.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
import 'submenu_screen.i18n.dart';
|
||||
|
||||
class ShareThemeDialog extends StatefulWidget {
|
||||
const ShareThemeDialog({super.key});
|
||||
|
||||
static void show(BuildContext context) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => AlertDialog(
|
||||
shape:
|
||||
RoundedRectangleBorder(borderRadius: BorderRadius.circular(12.0)),
|
||||
title: Text("attention".i18n),
|
||||
content: Text("share_disclaimer".i18n),
|
||||
actions: [
|
||||
ActionButton(
|
||||
label: "understand".i18n,
|
||||
onTap: () async {
|
||||
Navigator.of(context).pop();
|
||||
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => const ShareThemeDialog());
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@override
|
||||
ShareThemeDialogState createState() => ShareThemeDialogState();
|
||||
}
|
||||
|
||||
class ShareThemeDialogState extends State<ShareThemeDialog> {
|
||||
final _title = TextEditingController();
|
||||
bool isPublic = false;
|
||||
|
||||
late ShareProvider shareProvider;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
shareProvider = Provider.of<ShareProvider>(context, listen: false);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AlertDialog(
|
||||
shape: const RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.all(Radius.circular(14.0))),
|
||||
contentPadding: const EdgeInsets.only(top: 10.0),
|
||||
title: Text("share_theme".i18n),
|
||||
content: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0),
|
||||
child: TextField(
|
||||
controller: _title,
|
||||
onEditingComplete: () async {},
|
||||
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: 'paint_title'.i18n,
|
||||
suffixIcon: IconButton(
|
||||
icon: const Icon(
|
||||
FeatherIcons.x,
|
||||
color: Colors.grey,
|
||||
),
|
||||
onPressed: () {
|
||||
setState(() {
|
||||
_title.text = '';
|
||||
});
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
SplittedPanel(
|
||||
children: [
|
||||
SwitchListTile(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(16.0),
|
||||
),
|
||||
value: isPublic,
|
||||
onChanged: (value) {
|
||||
setState(() {
|
||||
isPublic = value;
|
||||
});
|
||||
},
|
||||
title: Text("is_public".i18n),
|
||||
contentPadding: const EdgeInsets.only(left: 15.0, right: 10.0),
|
||||
),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
actions: [
|
||||
TextButton(
|
||||
child: Text(
|
||||
"cancel".i18n,
|
||||
style: const TextStyle(fontWeight: FontWeight.w500),
|
||||
),
|
||||
onPressed: () {
|
||||
Navigator.of(context).maybePop();
|
||||
},
|
||||
),
|
||||
TextButton(
|
||||
child: Text(
|
||||
"share_it".i18n,
|
||||
style: const TextStyle(fontWeight: FontWeight.w500),
|
||||
),
|
||||
onPressed: () async {
|
||||
// share the fucking theme
|
||||
SharedGradeColors gradeColors =
|
||||
await shareProvider.shareCurrentGradeColors(context);
|
||||
SharedTheme theme = await shareProvider.shareCurrentTheme(
|
||||
context,
|
||||
gradeColors: gradeColors,
|
||||
isPublic: isPublic,
|
||||
displayName: _title.text,
|
||||
);
|
||||
|
||||
// save theme id in settings
|
||||
// Provider.of<SettingsProvider>(context, listen: false)
|
||||
// .update(currentThemeId: theme.id);
|
||||
|
||||
// close this popup shit
|
||||
Navigator.of(context).pop(true);
|
||||
|
||||
// show the share popup
|
||||
Share.share(
|
||||
theme.id,
|
||||
subject: 'share_subj_theme'.i18n,
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,17 @@ extension SettingsLocalization on String {
|
||||
"rare": "Rare",
|
||||
"epic": "Epic",
|
||||
"legendary": "Legendary",
|
||||
// grade colors
|
||||
"grade_colors": "Grade Colors",
|
||||
// theme share popup
|
||||
"share_theme": "Share Paint",
|
||||
"paint_title": "Paint title...",
|
||||
"share_it": "Share it!",
|
||||
"is_public": "Public Paint",
|
||||
"attention": "Attention!",
|
||||
"share_disclaimer":
|
||||
"By sharing the theme, you agree that the nickname you set and all settings of the theme will be shared publicly.",
|
||||
"understand": "I understand",
|
||||
},
|
||||
"hu_hu": {
|
||||
"general": "Általános",
|
||||
@@ -32,6 +43,17 @@ extension SettingsLocalization on String {
|
||||
"rare": "Ritka",
|
||||
"epic": "Epikus",
|
||||
"legendary": "Legendás",
|
||||
// grade colors
|
||||
"grade_colors": "Jegyek színei",
|
||||
// theme share popup
|
||||
"share_theme": "Téma megosztása",
|
||||
"paint_title": "Téma neve...",
|
||||
"share_it": "Megosztás!",
|
||||
"is_public": "Nyilvános téma",
|
||||
"attention": "Figyelem!",
|
||||
"share_disclaimer":
|
||||
"A téma megosztásával elfogadod, hogy az általad beállított becenév és a téma minden beállítása nyilvánosan megosztásra kerüljön.",
|
||||
"understand": "Értem",
|
||||
},
|
||||
"de_de": {
|
||||
"general": "Allgemeine",
|
||||
@@ -47,6 +69,17 @@ extension SettingsLocalization on String {
|
||||
"rare": "Selten",
|
||||
"epic": "Episch",
|
||||
"legendary": "Legendär",
|
||||
// grade colors
|
||||
"grade_colors": "Notenfarben",
|
||||
// theme share popup
|
||||
"share_theme": "Thema teilen",
|
||||
"paint_title": "Thema Titel...",
|
||||
"share_it": "Teilen!",
|
||||
"is_public": "Öffentliches Thema",
|
||||
"attention": "Achtung!",
|
||||
"share_disclaimer":
|
||||
"Durch das Teilen des Themes erklären Sie sich damit einverstanden, dass der von Ihnen festgelegte Spitzname und alle Einstellungen des Themes öffentlich geteilt werden.",
|
||||
"understand": "Ich verstehe",
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// ignore_for_file: use_build_context_synchronously, deprecated_member_use
|
||||
|
||||
import 'package:refilc/models/settings.dart';
|
||||
import 'package:refilc/models/shared_theme.dart';
|
||||
// import 'package:refilc/models/shared_theme.dart';
|
||||
import 'package:refilc/theme/colors/accent.dart';
|
||||
import 'package:refilc/theme/colors/colors.dart';
|
||||
import 'package:refilc/theme/observer.dart';
|
||||
@@ -10,7 +10,7 @@ import 'package:refilc/ui/widgets/message/message_tile.dart';
|
||||
import 'package:refilc_kreta_api/models/grade.dart';
|
||||
import 'package:refilc_kreta_api/models/homework.dart';
|
||||
import 'package:refilc_kreta_api/models/message.dart';
|
||||
import 'package:refilc_mobile_ui/common/action_button.dart';
|
||||
// import 'package:refilc_mobile_ui/common/action_button.dart';
|
||||
import 'package:refilc_mobile_ui/common/filter_bar.dart';
|
||||
import 'package:refilc_mobile_ui/common/panel/panel.dart';
|
||||
import 'package:refilc_mobile_ui/common/widgets/grade/new_grades.dart';
|
||||
@@ -24,6 +24,7 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:refilc_mobile_ui/screens/settings/submenu/share_theme_popup.dart';
|
||||
import 'theme_screen.i18n.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
@@ -44,6 +45,7 @@ enum CustomColorMode {
|
||||
text,
|
||||
icon,
|
||||
enterId,
|
||||
grade,
|
||||
}
|
||||
|
||||
class _PremiumCustomAccentColorSettingState
|
||||
@@ -158,6 +160,9 @@ class _PremiumCustomAccentColorSettingState
|
||||
case CustomColorMode.enterId:
|
||||
// do nothing here lol
|
||||
break;
|
||||
case CustomColorMode.grade:
|
||||
// do nothing here as well
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,6 +223,9 @@ class _PremiumCustomAccentColorSettingState
|
||||
settings.update(customAccentColor: accent, store: store);
|
||||
settings.update(customIconColor: icon, store: store);
|
||||
break;
|
||||
case CustomColorMode.grade:
|
||||
// do nothing
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -297,40 +305,48 @@ class _PremiumCustomAccentColorSettingState
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => WillPopScope(
|
||||
onWillPop: () async => false,
|
||||
child: AlertDialog(
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12.0)),
|
||||
title: Text("attention".i18n),
|
||||
content: Text("share_disclaimer".i18n),
|
||||
actions: [
|
||||
ActionButton(
|
||||
label: "understand".i18n,
|
||||
onTap: () async {
|
||||
Navigator.of(context).pop();
|
||||
// showDialog(
|
||||
// context: context,
|
||||
// builder: (context) => WillPopScope(
|
||||
// onWillPop: () async => false,
|
||||
// child: AlertDialog(
|
||||
// shape: RoundedRectangleBorder(
|
||||
// borderRadius: BorderRadius.circular(12.0)),
|
||||
// title: Text("attention".i18n),
|
||||
// content: Text("share_disclaimer".i18n),
|
||||
// actions: [
|
||||
// ActionButton(
|
||||
// label: "understand".i18n,
|
||||
// onTap: () async {
|
||||
// Navigator.of(context).pop();
|
||||
|
||||
SharedGradeColors gradeColors =
|
||||
await shareProvider
|
||||
.shareCurrentGradeColors(context);
|
||||
SharedTheme theme =
|
||||
await shareProvider.shareCurrentTheme(
|
||||
context,
|
||||
gradeColors: gradeColors,
|
||||
);
|
||||
// SharedGradeColors gradeColors =
|
||||
// await shareProvider
|
||||
// .shareCurrentGradeColors(context);
|
||||
// SharedTheme theme =
|
||||
// await shareProvider.shareCurrentTheme(
|
||||
// context,
|
||||
// gradeColors: gradeColors,
|
||||
// );
|
||||
|
||||
Share.share(
|
||||
theme.id,
|
||||
subject: 'share_subj_theme'.i18n,
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
);
|
||||
// Share.share(
|
||||
// theme.id,
|
||||
// subject: 'share_subj_theme'.i18n,
|
||||
// );
|
||||
// },
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
// );
|
||||
if (settings.currentThemeId != '') {
|
||||
Share.share(
|
||||
settings.currentThemeId,
|
||||
subject: 'share_subj_theme'.i18n,
|
||||
);
|
||||
} else {
|
||||
ShareThemeDialog.show(context);
|
||||
}
|
||||
},
|
||||
icon: const Icon(
|
||||
FeatherIcons.share2,
|
||||
|
||||
@@ -71,6 +71,7 @@ dependencies:
|
||||
markdown: ^7.2.2
|
||||
carousel_slider: ^4.2.1
|
||||
flutter_portal: ^1.1.4
|
||||
webview_flutter: ^4.8.0
|
||||
|
||||
dev_dependencies:
|
||||
flutter_lints: ^3.0.1
|
||||
|
||||
Reference in New Issue
Block a user