Merge branch 'master' into notifications
This commit is contained in:
@@ -22,16 +22,21 @@ class MessageViewTile extends StatelessWidget {
|
||||
UserProvider user = Provider.of<UserProvider>(context, listen: false);
|
||||
String recipientLabel = "";
|
||||
|
||||
if (message.recipients.any((r) => r.name == user.student?.name)) recipientLabel = "me".i18n;
|
||||
if (message.recipients.any((r) => r.name == user.student?.name))
|
||||
recipientLabel = "me".i18n;
|
||||
|
||||
if (recipientLabel != "" && message.recipients.length > 1) {
|
||||
recipientLabel += " +";
|
||||
recipientLabel += message.recipients.where((r) => r.name != user.student?.name).length.toString();
|
||||
recipientLabel += message.recipients
|
||||
.where((r) => r.name != user.student?.name)
|
||||
.length
|
||||
.toString();
|
||||
}
|
||||
|
||||
if (recipientLabel == "") {
|
||||
// note: convertint to set to remove duplicates
|
||||
recipientLabel += message.recipients.map((r) => r.name).toSet().join(", ");
|
||||
recipientLabel +=
|
||||
message.recipients.map((r) => r.name).toSet().join(", ");
|
||||
}
|
||||
|
||||
List<Widget> attachments = [];
|
||||
@@ -75,9 +80,9 @@ class MessageViewTile extends StatelessWidget {
|
||||
overflow: TextOverflow.ellipsis,
|
||||
maxLines: 1,
|
||||
),
|
||||
trailing: Row(
|
||||
trailing: const Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: const [
|
||||
children: [
|
||||
// IconButton(
|
||||
// onPressed: () {},
|
||||
// icon: Icon(FeatherIcons.cornerUpLeft, color: AppColors.of(context).text),
|
||||
|
||||
@@ -55,7 +55,9 @@ class _LiveCardState extends State<LiveCard> {
|
||||
case LiveCardState.morning:
|
||||
child = LiveCardWidget(
|
||||
key: const Key('livecard.morning'),
|
||||
title: DateFormat("EEEE", I18n.of(context).locale.toString()).format(DateTime.now()).capital(),
|
||||
title: DateFormat("EEEE", I18n.of(context).locale.toString())
|
||||
.format(DateTime.now())
|
||||
.capital(),
|
||||
icon: FeatherIcons.sun,
|
||||
description: liveCard.nextLesson != null
|
||||
? Text.rich(
|
||||
@@ -63,26 +65,40 @@ class _LiveCardState extends State<LiveCard> {
|
||||
children: [
|
||||
TextSpan(text: "first_lesson_1".i18n),
|
||||
TextSpan(
|
||||
text: liveCard.nextLesson!.subject.renamedTo ?? liveCard.nextLesson!.subject.name.capital(),
|
||||
text: liveCard.nextLesson!.subject.renamedTo ??
|
||||
liveCard.nextLesson!.subject.name.capital(),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Theme.of(context).colorScheme.secondary.withOpacity(.85),
|
||||
fontStyle: liveCard.nextLesson!.subject.isRenamed && settingsProvider.renamedSubjectsItalics ? FontStyle.italic : null),
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withOpacity(.85),
|
||||
fontStyle: liveCard.nextLesson!.subject.isRenamed &&
|
||||
settingsProvider.renamedSubjectsItalics
|
||||
? FontStyle.italic
|
||||
: null),
|
||||
),
|
||||
TextSpan(text: "first_lesson_2".i18n),
|
||||
TextSpan(
|
||||
text: liveCard.nextLesson!.room.capital(),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Theme.of(context).colorScheme.secondary.withOpacity(.85),
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withOpacity(.85),
|
||||
),
|
||||
),
|
||||
TextSpan(text: "first_lesson_3".i18n),
|
||||
TextSpan(
|
||||
text: DateFormat('H:mm').format(liveCard.nextLesson!.start),
|
||||
text: DateFormat('H:mm')
|
||||
.format(liveCard.nextLesson!.start),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Theme.of(context).colorScheme.secondary.withOpacity(.85),
|
||||
color: Theme.of(context)
|
||||
.colorScheme
|
||||
.secondary
|
||||
.withOpacity(.85),
|
||||
),
|
||||
),
|
||||
TextSpan(text: "first_lesson_4".i18n),
|
||||
@@ -93,30 +109,48 @@ class _LiveCardState extends State<LiveCard> {
|
||||
);
|
||||
break;
|
||||
case LiveCardState.duringLesson:
|
||||
final elapsedTime = DateTime.now().difference(liveCard.currentLesson!.start).inSeconds.toDouble() + bellDelay.inSeconds;
|
||||
final maxTime = liveCard.currentLesson!.end.difference(liveCard.currentLesson!.start).inSeconds.toDouble();
|
||||
final elapsedTime = DateTime.now()
|
||||
.difference(liveCard.currentLesson!.start)
|
||||
.inSeconds
|
||||
.toDouble() +
|
||||
bellDelay.inSeconds;
|
||||
final maxTime = liveCard.currentLesson!.end
|
||||
.difference(liveCard.currentLesson!.start)
|
||||
.inSeconds
|
||||
.toDouble();
|
||||
|
||||
final showMinutes = maxTime - elapsedTime > 60;
|
||||
|
||||
child = LiveCardWidget(
|
||||
key: const Key('livecard.duringLesson'),
|
||||
leading: liveCard.currentLesson!.lessonIndex + (RegExp(r'\d').hasMatch(liveCard.currentLesson!.lessonIndex) ? "." : ""),
|
||||
title: liveCard.currentLesson!.subject.renamedTo ?? liveCard.currentLesson!.subject.name.capital(),
|
||||
leading: liveCard.currentLesson!.lessonIndex +
|
||||
(RegExp(r'\d').hasMatch(liveCard.currentLesson!.lessonIndex)
|
||||
? "."
|
||||
: ""),
|
||||
title: liveCard.currentLesson!.subject.renamedTo ??
|
||||
liveCard.currentLesson!.subject.name.capital(),
|
||||
titleItalic: liveCard.currentLesson!.subject.isRenamed,
|
||||
subtitle: liveCard.currentLesson!.room,
|
||||
icon: SubjectIcon.resolveVariant(subject: liveCard.currentLesson!.subject, context: context),
|
||||
description: liveCard.currentLesson!.description != "" ? Text(liveCard.currentLesson!.description) : null,
|
||||
nextSubject: liveCard.nextLesson?.subject.renamedTo ?? liveCard.nextLesson?.subject.name.capital(),
|
||||
nextSubjectItalic: liveCard.nextLesson?.subject.isRenamed == true && settingsProvider.renamedSubjectsItalics ?? false,
|
||||
icon: SubjectIcon.resolveVariant(
|
||||
subject: liveCard.currentLesson!.subject, context: context),
|
||||
description: liveCard.currentLesson!.description != ""
|
||||
? Text(liveCard.currentLesson!.description)
|
||||
: null,
|
||||
nextSubject: liveCard.nextLesson?.subject.renamedTo ??
|
||||
liveCard.nextLesson?.subject.name.capital(),
|
||||
nextSubjectItalic: liveCard.nextLesson?.subject.isRenamed == true &&
|
||||
settingsProvider.renamedSubjectsItalics,
|
||||
nextRoom: liveCard.nextLesson?.room,
|
||||
progressMax: showMinutes ? maxTime / 60 : maxTime,
|
||||
progressCurrent: showMinutes ? elapsedTime / 60 : elapsedTime,
|
||||
progressAccuracy: showMinutes ? ProgressAccuracy.minutes : ProgressAccuracy.seconds,
|
||||
progressAccuracy:
|
||||
showMinutes ? ProgressAccuracy.minutes : ProgressAccuracy.seconds,
|
||||
onProgressTap: () {
|
||||
showDialog(
|
||||
barrierColor: Colors.black,
|
||||
context: context,
|
||||
builder: (context) => HeadsUpCountdown(maxTime: maxTime, elapsedTime: elapsedTime),
|
||||
builder: (context) =>
|
||||
HeadsUpCountdown(maxTime: maxTime, elapsedTime: elapsedTime),
|
||||
);
|
||||
},
|
||||
);
|
||||
@@ -131,8 +165,15 @@ class _LiveCardState extends State<LiveCard> {
|
||||
|
||||
final diff = liveCard.getFloorDifference();
|
||||
|
||||
final maxTime = liveCard.nextLesson!.start.difference(liveCard.prevLesson!.end).inSeconds.toDouble();
|
||||
final elapsedTime = DateTime.now().difference(liveCard.prevLesson!.end).inSeconds.toDouble() + bellDelay.inSeconds.toDouble();
|
||||
final maxTime = liveCard.nextLesson!.start
|
||||
.difference(liveCard.prevLesson!.end)
|
||||
.inSeconds
|
||||
.toDouble();
|
||||
final elapsedTime = DateTime.now()
|
||||
.difference(liveCard.prevLesson!.end)
|
||||
.inSeconds
|
||||
.toDouble() +
|
||||
bellDelay.inSeconds.toDouble();
|
||||
|
||||
final showMinutes = maxTime - elapsedTime > 60;
|
||||
|
||||
@@ -141,14 +182,21 @@ class _LiveCardState extends State<LiveCard> {
|
||||
title: "break".i18n,
|
||||
icon: iconFloorMap[diff],
|
||||
description: liveCard.nextLesson!.room != liveCard.prevLesson!.room
|
||||
? Text("go $diff".i18n.fill([diff != "to room" ? (liveCard.nextLesson!.getFloor() ?? 0) : liveCard.nextLesson!.room]))
|
||||
? Text("go $diff".i18n.fill([
|
||||
diff != "to room"
|
||||
? (liveCard.nextLesson!.getFloor() ?? 0)
|
||||
: liveCard.nextLesson!.room
|
||||
]))
|
||||
: Text("stay".i18n),
|
||||
nextSubject: liveCard.nextLesson?.subject.renamedTo ?? liveCard.nextLesson?.subject.name.capital(),
|
||||
nextSubjectItalic: liveCard.nextLesson?.subject.isRenamed == true && settingsProvider.renamedSubjectsItalics ?? false,
|
||||
nextSubject: liveCard.nextLesson?.subject.renamedTo ??
|
||||
liveCard.nextLesson?.subject.name.capital(),
|
||||
nextSubjectItalic: liveCard.nextLesson?.subject.isRenamed == true &&
|
||||
settingsProvider.renamedSubjectsItalics,
|
||||
nextRoom: diff != "to room" ? liveCard.nextLesson?.room : null,
|
||||
progressMax: showMinutes ? maxTime / 60 : maxTime,
|
||||
progressCurrent: showMinutes ? elapsedTime / 60 : elapsedTime,
|
||||
progressAccuracy: showMinutes ? ProgressAccuracy.minutes : ProgressAccuracy.seconds,
|
||||
progressAccuracy:
|
||||
showMinutes ? ProgressAccuracy.minutes : ProgressAccuracy.seconds,
|
||||
onProgressTap: () {
|
||||
showDialog(
|
||||
barrierColor: Colors.black,
|
||||
@@ -164,14 +212,18 @@ class _LiveCardState extends State<LiveCard> {
|
||||
case LiveCardState.afternoon:
|
||||
child = LiveCardWidget(
|
||||
key: const Key('livecard.afternoon'),
|
||||
title: DateFormat("EEEE", I18n.of(context).locale.toString()).format(DateTime.now()).capital(),
|
||||
title: DateFormat("EEEE", I18n.of(context).locale.toString())
|
||||
.format(DateTime.now())
|
||||
.capital(),
|
||||
icon: FeatherIcons.coffee,
|
||||
);
|
||||
break;
|
||||
case LiveCardState.night:
|
||||
child = LiveCardWidget(
|
||||
key: const Key('livecard.night'),
|
||||
title: DateFormat("EEEE", I18n.of(context).locale.toString()).format(DateTime.now()).capital(),
|
||||
title: DateFormat("EEEE", I18n.of(context).locale.toString())
|
||||
.format(DateTime.now())
|
||||
.capital(),
|
||||
icon: FeatherIcons.moon,
|
||||
);
|
||||
break;
|
||||
|
||||
@@ -12,14 +12,16 @@ class PremiumButton extends StatefulWidget {
|
||||
State<PremiumButton> createState() => _PremiumButtonState();
|
||||
}
|
||||
|
||||
class _PremiumButtonState extends State<PremiumButton> with TickerProviderStateMixin {
|
||||
class _PremiumButtonState extends State<PremiumButton>
|
||||
with TickerProviderStateMixin {
|
||||
late final AnimationController _animation;
|
||||
bool _heldDown = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
_animation = AnimationController(vsync: this, duration: const Duration(seconds: 3));
|
||||
_animation =
|
||||
AnimationController(vsync: this, duration: const Duration(seconds: 3));
|
||||
_animation.repeat();
|
||||
}
|
||||
|
||||
@@ -38,7 +40,8 @@ class _PremiumButtonState extends State<PremiumButton> with TickerProviderStateM
|
||||
transitionType: ContainerTransitionType.fadeThrough,
|
||||
openElevation: 0,
|
||||
closedElevation: 0,
|
||||
closedShape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(14.0)),
|
||||
closedShape:
|
||||
RoundedRectangleBorder(borderRadius: BorderRadius.circular(14.0)),
|
||||
openBuilder: (context, _) => const PremiumScreen(),
|
||||
closedBuilder: (context, action) => GestureDetector(
|
||||
onTapDown: (_) => setState(() => _heldDown = true),
|
||||
@@ -57,16 +60,20 @@ class _PremiumButtonState extends State<PremiumButton> with TickerProviderStateM
|
||||
child: ClipRRect(
|
||||
borderRadius: BorderRadius.circular(14.0),
|
||||
child: ImageFiltered(
|
||||
imageFilter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
|
||||
imageFilter:
|
||||
ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
|
||||
child: Container(
|
||||
height: 70,
|
||||
decoration: BoxDecoration(
|
||||
gradient: SweepGradient(colors: const [
|
||||
Colors.blue,
|
||||
Colors.orange,
|
||||
Colors.purple,
|
||||
Colors.blue,
|
||||
], transform: GradientRotation(_animation.value * 6.283185)),
|
||||
gradient: SweepGradient(
|
||||
colors: const [
|
||||
Colors.blue,
|
||||
Colors.orange,
|
||||
Colors.purple,
|
||||
Colors.blue,
|
||||
],
|
||||
transform: GradientRotation(
|
||||
_animation.value * 6.283185)),
|
||||
),
|
||||
),
|
||||
),
|
||||
@@ -92,9 +99,9 @@ class _PremiumButtonState extends State<PremiumButton> with TickerProviderStateM
|
||||
Color(0xff1EA18F),
|
||||
]),
|
||||
),
|
||||
child: Row(
|
||||
child: const Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: const [
|
||||
children: [
|
||||
Icon(FilcIcons.premium, color: Colors.white),
|
||||
SizedBox(width: 12.0),
|
||||
Text(
|
||||
|
||||
@@ -21,8 +21,9 @@ class PremiumScreen extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final middleColor =
|
||||
Theme.of(context).brightness == Brightness.dark ? const Color.fromARGB(255, 20, 57, 46) : const Color.fromARGB(255, 10, 140, 123);
|
||||
final middleColor = Theme.of(context).brightness == Brightness.dark
|
||||
? const Color.fromARGB(255, 20, 57, 46)
|
||||
: const Color.fromARGB(255, 10, 140, 123);
|
||||
|
||||
final future = FilcAPI.getSupporters();
|
||||
|
||||
@@ -78,7 +79,8 @@ class PremiumScreen extends StatelessWidget {
|
||||
children: [
|
||||
Expanded(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24.0),
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 24.0),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
@@ -87,16 +89,25 @@ class PremiumScreen extends StatelessWidget {
|
||||
const SizedBox(height: 12.0),
|
||||
const Text(
|
||||
"Még több filc.",
|
||||
style: TextStyle(fontWeight: FontWeight.w600, fontSize: 25.0, color: Colors.white),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 25.0,
|
||||
color: Colors.white),
|
||||
),
|
||||
const Text(
|
||||
"reFilc Premium.",
|
||||
style: TextStyle(fontWeight: FontWeight.w800, fontSize: 35.0, color: Colors.white),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w800,
|
||||
fontSize: 35.0,
|
||||
color: Colors.white),
|
||||
),
|
||||
const SizedBox(height: 15.0),
|
||||
Text(
|
||||
"Támogasd a filcet, és szerezz cserébe pár kényelmes jutalmat!",
|
||||
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20, color: Colors.white.withOpacity(.8)),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 20,
|
||||
color: Colors.white.withOpacity(.8)),
|
||||
),
|
||||
const SizedBox(height: 25.0),
|
||||
SupportersButton(supporters: future),
|
||||
@@ -110,43 +121,61 @@ class PremiumScreen extends StatelessWidget {
|
||||
),
|
||||
),
|
||||
SliverPadding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24.0).add(const EdgeInsets.only(bottom: 100)),
|
||||
padding: const EdgeInsets.symmetric(horizontal: 24.0)
|
||||
.add(const EdgeInsets.only(bottom: 100)),
|
||||
sliver: SliverToBoxAdapter(
|
||||
child: Column(
|
||||
children: [
|
||||
PremiumPlanCard(
|
||||
icon: const Icon(FilcIcons.kupak),
|
||||
title: Text("Kupak", style: TextStyle(foreground: GradientStyles.kupakPaint)),
|
||||
title: Text("Kupak",
|
||||
style: TextStyle(
|
||||
foreground: GradientStyles.kupakPaint)),
|
||||
gradient: GradientStyles.kupak,
|
||||
price: 2,
|
||||
description: const Text("Szabd személyre a filcet és láss részletesebb statisztikákat."),
|
||||
url: "https://github.com/sponsors/filc/sponsorships?tier_id=238453&preview=true",
|
||||
active: ActiveSponsorCard.estimateLevel(context.watch<PremiumProvider>().scopes) == PremiumFeatureLevel.kupak,
|
||||
description: const Text(
|
||||
"Szabd személyre a filcet és láss részletesebb statisztikákat."),
|
||||
url:
|
||||
"https://github.com/sponsors/filc/sponsorships?tier_id=238453&preview=true",
|
||||
active: ActiveSponsorCard.estimateLevel(
|
||||
context.watch<PremiumProvider>().scopes) ==
|
||||
PremiumFeatureLevel.kupak,
|
||||
),
|
||||
const SizedBox(height: 8.0),
|
||||
PremiumPlanCard(
|
||||
icon: const Icon(FilcIcons.tinta),
|
||||
title: Text("Tinta", style: TextStyle(foreground: GradientStyles.tintaPaint)),
|
||||
title: Text("Tinta",
|
||||
style: TextStyle(
|
||||
foreground: GradientStyles.tintaPaint)),
|
||||
gradient: GradientStyles.tinta,
|
||||
price: 5,
|
||||
description: const Text("Kényelmesebb órarend, asztali alkalmazás és célok kitűzése."),
|
||||
url: "https://github.com/sponsors/filc/sponsorships?tier_id=238454&preview=true",
|
||||
active: ActiveSponsorCard.estimateLevel(context.watch<PremiumProvider>().scopes) == PremiumFeatureLevel.tinta,
|
||||
description: const Text(
|
||||
"Kényelmesebb órarend, asztali alkalmazás és célok kitűzése."),
|
||||
url:
|
||||
"https://github.com/sponsors/filc/sponsorships?tier_id=238454&preview=true",
|
||||
active: ActiveSponsorCard.estimateLevel(
|
||||
context.watch<PremiumProvider>().scopes) ==
|
||||
PremiumFeatureLevel.tinta,
|
||||
),
|
||||
const SizedBox(height: 12.0),
|
||||
PremiumGoalCard(progress: snapshot.data?.progress ?? 0, target: snapshot.data?.max ?? 1),
|
||||
PremiumGoalCard(
|
||||
progress: snapshot.data?.progress ?? 0,
|
||||
target: snapshot.data?.max ?? 1),
|
||||
const SizedBox(height: 12.0),
|
||||
const GithubConnectButton(),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 14.0).add(const EdgeInsets.only(top: 12.0)),
|
||||
child: Row(
|
||||
children: const [
|
||||
padding: const EdgeInsets.symmetric(vertical: 14.0)
|
||||
.add(const EdgeInsets.only(top: 12.0)),
|
||||
child: const Row(
|
||||
children: [
|
||||
Icon(FilcIcons.kupak),
|
||||
SizedBox(width: 12.0),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"Kupak jutalmak",
|
||||
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 20),
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -154,40 +183,50 @@ class PremiumScreen extends StatelessWidget {
|
||||
),
|
||||
PremiumRewardCard(
|
||||
imageKey: "premium_nickname_showcase",
|
||||
icon: SvgPicture.asset("assets/images/nickname_icon.svg", color: Theme.of(context).iconTheme.color),
|
||||
icon: SvgPicture.asset(
|
||||
"assets/images/nickname_icon.svg",
|
||||
color: Theme.of(context).iconTheme.color),
|
||||
title: const Text("Profil személyre szabás"),
|
||||
description: const Text("Állíts be egy saját becenevet és egy profilképet (akár animáltat is!)"),
|
||||
description: const Text(
|
||||
"Állíts be egy saját becenevet és egy profilképet (akár animáltat is!)"),
|
||||
),
|
||||
const SizedBox(height: 14.0),
|
||||
PremiumRewardCard(
|
||||
imageKey: "premium_theme_showcase",
|
||||
icon: SvgPicture.asset("assets/images/theme_icon.svg", color: Theme.of(context).iconTheme.color),
|
||||
icon: SvgPicture.asset("assets/images/theme_icon.svg",
|
||||
color: Theme.of(context).iconTheme.color),
|
||||
title: const Text("Téma+"),
|
||||
description: const Text("Válassz saját háttérszínt és kártyaszínt is, akár saját HEX-kóddal!"),
|
||||
description: const Text(
|
||||
"Válassz saját háttérszínt és kártyaszínt is, akár saját HEX-kóddal!"),
|
||||
),
|
||||
const SizedBox(height: 14.0),
|
||||
PremiumRewardCard(
|
||||
imageKey: "premium_stats_showcase",
|
||||
icon: SvgPicture.asset("assets/images/stats_icon.svg", color: Theme.of(context).iconTheme.color),
|
||||
icon: SvgPicture.asset("assets/images/stats_icon.svg",
|
||||
color: Theme.of(context).iconTheme.color),
|
||||
title: const Text("Részletes jegy statisztika"),
|
||||
description: const Text("Válassz heti, havi és háromhavi időtartam közül, és pontosan lásd, mennyi jegyed van."),
|
||||
description: const Text(
|
||||
"Válassz heti, havi és háromhavi időtartam közül, és pontosan lásd, mennyi jegyed van."),
|
||||
),
|
||||
const SizedBox(height: 14.0),
|
||||
const PremiumRewardCard(
|
||||
title: Text("Még pár dolog..."),
|
||||
description:
|
||||
Text("🔣\tVálassz ikon témát\n✨\tPrémium rang és csevegő a discord szerverünkön\n📬\tElsőbbségi segítségnyújtás"),
|
||||
description: Text(
|
||||
"🔣\tVálassz ikon témát\n✨\tPrémium rang és csevegő a discord szerverünkön\n📬\tElsőbbségi segítségnyújtás"),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 14.0).add(const EdgeInsets.only(top: 12.0)),
|
||||
child: Row(
|
||||
children: const [
|
||||
padding: const EdgeInsets.symmetric(vertical: 14.0)
|
||||
.add(const EdgeInsets.only(top: 12.0)),
|
||||
child: const Row(
|
||||
children: [
|
||||
Icon(FilcIcons.tinta),
|
||||
SizedBox(width: 12.0),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"Tinta jutalmak",
|
||||
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 20),
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -195,48 +234,62 @@ class PremiumScreen extends StatelessWidget {
|
||||
),
|
||||
PremiumRewardCard(
|
||||
imageKey: "premium_timetable_showcase",
|
||||
icon: SvgPicture.asset("assets/images/timetable_icon.svg", color: Theme.of(context).iconTheme.color),
|
||||
icon: SvgPicture.asset(
|
||||
"assets/images/timetable_icon.svg",
|
||||
color: Theme.of(context).iconTheme.color),
|
||||
title: const Text("Heti órarend nézet"),
|
||||
description:
|
||||
const Text("Egy órarend, ami a teljes képernyődet kihasználja, csak nem olyan idegesítő, mint az eKRÉTA féle."),
|
||||
description: const Text(
|
||||
"Egy órarend, ami a teljes képernyődet kihasználja, csak nem olyan idegesítő, mint az eKRÉTA féle."),
|
||||
),
|
||||
const SizedBox(height: 14.0),
|
||||
PremiumRewardCard(
|
||||
imageKey: "premium_widget_showcase",
|
||||
icon: SvgPicture.asset("assets/images/widget_icon.svg", color: Theme.of(context).iconTheme.color),
|
||||
icon: SvgPicture.asset(
|
||||
"assets/images/widget_icon.svg",
|
||||
color: Theme.of(context).iconTheme.color),
|
||||
title: const Text("Widget"),
|
||||
description: const Text("Mindig lásd, milyen órád lesz, a kezdőképernyőd kényelméből."),
|
||||
description: const Text(
|
||||
"Mindig lásd, milyen órád lesz, a kezdőképernyőd kényelméből."),
|
||||
),
|
||||
const SizedBox(height: 14.0),
|
||||
PremiumRewardCard(
|
||||
soon: true,
|
||||
imageKey: "premium_goal_showcase",
|
||||
icon: SvgPicture.asset("assets/images/goal_icon.svg", color: Theme.of(context).iconTheme.color),
|
||||
icon: SvgPicture.asset("assets/images/goal_icon.svg",
|
||||
color: Theme.of(context).iconTheme.color),
|
||||
title: const Text("Cél követés"),
|
||||
description: const Text("Add meg, mi a célod, és mi majd kiszámoljuk, hogyan juthatsz oda!"),
|
||||
description: const Text(
|
||||
"Add meg, mi a célod, és mi majd kiszámoljuk, hogyan juthatsz oda!"),
|
||||
),
|
||||
const SizedBox(height: 14.0),
|
||||
PremiumRewardCard(
|
||||
soon: true,
|
||||
imageKey: "premium_desktop_showcase",
|
||||
icon: SvgPicture.asset("assets/images/desktop_icon.svg", color: Theme.of(context).iconTheme.color),
|
||||
icon: SvgPicture.asset(
|
||||
"assets/images/desktop_icon.svg",
|
||||
color: Theme.of(context).iconTheme.color),
|
||||
title: const Text("Asztali verzió"),
|
||||
description: const Text("Érd el a reFilcet a gépeden is, és menekülj meg a csúnya felhasználói felületektől!"),
|
||||
description: const Text(
|
||||
"Érd el a reFilcet a gépeden is, és menekülj meg a csúnya felhasználói felületektől!"),
|
||||
),
|
||||
const SizedBox(height: 14.0),
|
||||
const PremiumRewardCard(
|
||||
title: Text("Még pár dolog..."),
|
||||
description: Text("🖋️\tMinden kupak jutalom\n✨\tKorai hozzáférés új verziókhoz"),
|
||||
description: Text(
|
||||
"🖋️\tMinden kupak jutalom\n✨\tKorai hozzáférés új verziókhoz"),
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 14.0).add(const EdgeInsets.only(top: 12.0)),
|
||||
child: Row(
|
||||
children: const [
|
||||
padding: const EdgeInsets.symmetric(vertical: 14.0)
|
||||
.add(const EdgeInsets.only(top: 12.0)),
|
||||
child: const Row(
|
||||
children: [
|
||||
SizedBox(width: 12.0),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"Mire vársz még?",
|
||||
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 20),
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -244,20 +297,24 @@ class PremiumScreen extends StatelessWidget {
|
||||
),
|
||||
GithubCard(
|
||||
onPressed: () {
|
||||
Navigator.of(context).push(MaterialPageRoute(builder: (context) {
|
||||
Navigator.of(context)
|
||||
.push(MaterialPageRoute(builder: (context) {
|
||||
return const PremiumActivationView();
|
||||
}));
|
||||
},
|
||||
),
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 14.0).add(const EdgeInsets.only(top: 12.0)),
|
||||
child: Row(
|
||||
children: const [
|
||||
padding: const EdgeInsets.symmetric(vertical: 14.0)
|
||||
.add(const EdgeInsets.only(top: 12.0)),
|
||||
child: const Row(
|
||||
children: [
|
||||
SizedBox(width: 12.0),
|
||||
Expanded(
|
||||
child: Text(
|
||||
"Gyakori kérdések",
|
||||
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20),
|
||||
style: TextStyle(
|
||||
fontWeight: FontWeight.w500,
|
||||
fontSize: 20),
|
||||
),
|
||||
),
|
||||
],
|
||||
|
||||
@@ -95,6 +95,46 @@ class NavigationScreenState extends State<NavigationScreen>
|
||||
}
|
||||
}
|
||||
|
||||
// Platform messages are asynchronous, so we initialize in an async method.
|
||||
Future<void> initPlatformState() async {
|
||||
// Configure BackgroundFetch.
|
||||
int status = await BackgroundFetch.configure(
|
||||
BackgroundFetchConfig(
|
||||
minimumFetchInterval: 15,
|
||||
stopOnTerminate: false,
|
||||
enableHeadless: true,
|
||||
requiresBatteryNotLow: false,
|
||||
requiresCharging: false,
|
||||
requiresStorageNotLow: false,
|
||||
requiresDeviceIdle: false,
|
||||
requiredNetworkType: NetworkType.ANY), (String taskId) async {
|
||||
// <-- Event handler
|
||||
// This is the fetch-event callback.
|
||||
if (kDebugMode) {
|
||||
print("[BackgroundFetch] Event received $taskId");
|
||||
}
|
||||
|
||||
// IMPORTANT: You must signal completion of your task or the OS can punish your app
|
||||
// for taking too long in the background.
|
||||
BackgroundFetch.finish(taskId);
|
||||
}, (String taskId) async {
|
||||
// <-- Task timeout handler.
|
||||
// This task has exceeded its allowed running-time. You must stop what you're doing and immediately .finish(taskId)
|
||||
if (kDebugMode) {
|
||||
print("[BackgroundFetch] TASK TIMEOUT taskId: $taskId");
|
||||
}
|
||||
BackgroundFetch.finish(taskId);
|
||||
});
|
||||
if (kDebugMode) {
|
||||
print('[BackgroundFetch] configure success: $status');
|
||||
}
|
||||
|
||||
// If the widget was removed from the tree while the asynchronous platform
|
||||
// message was in flight, we want to discard the reply rather than calling
|
||||
// setState to update our non-existent appearance.
|
||||
if (!mounted) return;
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
@@ -138,7 +178,10 @@ class NavigationScreenState extends State<NavigationScreen>
|
||||
@override
|
||||
void didChangePlatformBrightness() {
|
||||
if (settings.theme == ThemeMode.system) {
|
||||
Brightness? brightness = WidgetsBinding.instance.window.platformBrightness;
|
||||
// ignore: deprecated_member_use
|
||||
Brightness? brightness =
|
||||
// ignore: deprecated_member_use
|
||||
WidgetsBinding.instance.window.platformBrightness;
|
||||
Provider.of<ThemeModeObserver>(context, listen: false).changeTheme(
|
||||
brightness == Brightness.light ? ThemeMode.light : ThemeMode.dark);
|
||||
}
|
||||
|
||||
@@ -484,8 +484,9 @@ class _BellDelaySettingState extends State<BellDelaySetting>
|
||||
Duration sdiff = lesson.start.difference(now);
|
||||
Duration ediff = lesson.end.difference(now);
|
||||
|
||||
if (closest == null || sdiff.abs() < closest.abs())
|
||||
if (closest == null || sdiff.abs() < closest.abs()) {
|
||||
closest = sdiff;
|
||||
}
|
||||
if (ediff.abs() < closest.abs()) closest = ediff;
|
||||
}
|
||||
if (closest != null) {
|
||||
|
||||
@@ -84,34 +84,37 @@ class _SettingsScreenState extends State<SettingsScreen>
|
||||
|
||||
String _firstName;
|
||||
|
||||
List<String> _nameParts = user.displayName?.split(" ") ?? ["?"];
|
||||
List<String> _nameParts = account.displayName.split(" ");
|
||||
if (!settings.presentationMode) {
|
||||
_firstName = _nameParts.length > 1 ? _nameParts[1] : _nameParts[0];
|
||||
} else {
|
||||
_firstName = "János";
|
||||
}
|
||||
|
||||
accountTiles.add(AccountTile(
|
||||
name: Text(!settings.presentationMode ? account.name : "János",
|
||||
style: const TextStyle(fontWeight: FontWeight.w500)),
|
||||
username:
|
||||
Text(!settings.presentationMode ? account.username : "01234567890"),
|
||||
profileImage: ProfileImage(
|
||||
name: _firstName,
|
||||
backgroundColor: Theme.of(context)
|
||||
.colorScheme
|
||||
.primary, //!settings.presentationMode
|
||||
//? ColorUtils.stringToColor(account.name)
|
||||
//: Theme.of(context).colorScheme.secondary,
|
||||
role: account.role,
|
||||
accountTiles.add(
|
||||
AccountTile(
|
||||
name: Text(!settings.presentationMode ? account.name : "János",
|
||||
style: const TextStyle(fontWeight: FontWeight.w500)),
|
||||
username: Text(
|
||||
!settings.presentationMode ? account.username : "01234567890"),
|
||||
profileImage: ProfileImage(
|
||||
name: _firstName,
|
||||
role: account.role,
|
||||
profilePictureString: account.picture,
|
||||
backgroundColor: Theme.of(context)
|
||||
.colorScheme
|
||||
.primary, //!settings.presentationMode
|
||||
//? ColorUtils.stringToColor(account.name)
|
||||
//: Theme.of(context).colorScheme.secondary,
|
||||
),
|
||||
onTap: () {
|
||||
user.setUser(account.id);
|
||||
restore().then((_) => user.setUser(account.id));
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
onTapMenu: () => _showBottomSheet(account),
|
||||
),
|
||||
onTap: () {
|
||||
user.setUser(account.id);
|
||||
restore().then((_) => user.setUser(account.id));
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
onTapMenu: () => _showBottomSheet(account),
|
||||
));
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -973,7 +976,9 @@ class _SettingsScreenState extends State<SettingsScreen>
|
||||
child: Text("v${release.data!['version']}"),
|
||||
);
|
||||
} else {
|
||||
String envAppVer = const String.fromEnvironment("APPVER", defaultValue: "?");
|
||||
String envAppVer = const String.fromEnvironment(
|
||||
"APPVER",
|
||||
defaultValue: "?");
|
||||
return DefaultTextStyle(
|
||||
style: Theme.of(context)
|
||||
.textTheme
|
||||
|
||||
@@ -5,6 +5,6 @@ class GradesBody extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column();
|
||||
return const Column();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,6 @@ class PersonalityBody extends StatelessWidget {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Column();
|
||||
return const Column();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user