moved non-premium features from premium folder

This commit is contained in:
Kima 2023-10-21 21:11:39 +02:00
parent 774f63aa89
commit 316039463f
25 changed files with 90 additions and 146 deletions

2
.gitignore vendored
View File

@ -35,3 +35,5 @@ filcnaplo_premium/android/
.github .github
.idea .idea
.gitmodules .gitmodules
filcnaplo/.DS_Store

View File

@ -14,7 +14,7 @@ import 'package:filcnaplo/theme/theme.dart';
import 'package:filcnaplo_kreta_api/client/client.dart'; import 'package:filcnaplo_kreta_api/client/client.dart';
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
import 'package:filcnaplo_premium/providers/goal_provider.dart'; import 'package:filcnaplo_premium/providers/goal_provider.dart';
import 'package:filcnaplo_premium/providers/share_provider.dart'; import 'package:filcnaplo_kreta_api/providers/share_provider.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';

View File

@ -11,12 +11,12 @@ library hsv_picker;
import 'package:filcnaplo/models/shared_theme.dart'; import 'package:filcnaplo/models/shared_theme.dart';
import 'package:filcnaplo_mobile_ui/common/custom_snack_bar.dart'; import 'package:filcnaplo_mobile_ui/common/custom_snack_bar.dart';
import 'package:filcnaplo_premium/providers/share_provider.dart'; import 'package:filcnaplo_kreta_api/providers/share_provider.dart';
import 'package:filcnaplo_premium/ui/mobile/flutter_colorpicker/block_picker.dart'; import 'package:filcnaplo/ui/flutter_colorpicker/block_picker.dart';
import 'package:filcnaplo_premium/ui/mobile/flutter_colorpicker/palette.dart'; import 'package:filcnaplo/ui/flutter_colorpicker/palette.dart';
import 'package:filcnaplo_premium/ui/mobile/flutter_colorpicker/utils.dart'; import 'package:filcnaplo/ui/flutter_colorpicker/utils.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/theme.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/theme_screen.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/theme.i18n.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/theme_screen.i18n.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:filcnaplo/theme/colors/colors.dart'; import 'package:filcnaplo/theme/colors/colors.dart';

View File

@ -21,7 +21,7 @@ import 'package:filcnaplo_desktop_ui/pages/grades/grade_subject_view.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:filcnaplo/helpers/average_helper.dart'; import 'package:filcnaplo/helpers/average_helper.dart';
import 'package:filcnaplo_premium/ui/mobile/grades/average_selector.dart'; import 'package:filcnaplo_mobile_ui/pages/grades/average_selector.dart';
import 'grades_page.i18n.dart'; import 'grades_page.i18n.dart';
class GradesPage extends StatefulWidget { class GradesPage extends StatefulWidget {
@ -41,14 +41,15 @@ class _GradesPageState extends State<GradesPage> {
int avgDropValue = 0; int avgDropValue = 0;
List<Grade> getSubjectGrades(GradeSubject subject, {int days = 0}) => gradeProvider List<Grade> getSubjectGrades(GradeSubject subject, {int days = 0}) =>
.grades gradeProvider.grades
.where((e) => .where((e) =>
e.subject == subject && e.subject == subject &&
e.type == GradeType.midYear && e.type == GradeType.midYear &&
(days == 0 || (days == 0 ||
e.date.isBefore(DateTime.now().subtract(Duration(days: days))))) e.date
.toList(); .isBefore(DateTime.now().subtract(Duration(days: days)))))
.toList();
void generateTiles() { void generateTiles() {
List<GradeSubject> subjects = gradeProvider.grades List<GradeSubject> subjects = gradeProvider.grades
@ -144,8 +145,9 @@ class _GradesPageState extends State<GradesPage> {
Expanded( Expanded(
child: StatisticsTile( child: StatisticsTile(
outline: true, outline: true,
title: AutoSizeText( // https://discord.com/channels/1111649116020285532/1153397476578050130 title: AutoSizeText(
"classavg".i18n, // https://discord.com/channels/1111649116020285532/1153397476578050130
"classavg".i18n,
textAlign: TextAlign.center, textAlign: TextAlign.center,
maxLines: 2, maxLines: 2,
wrapWords: false, wrapWords: false,
@ -208,7 +210,7 @@ class _GradesPageState extends State<GradesPage> {
title: Row( title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
PremiumAverageSelector( AverageSelector(
value: avgDropValue, value: avgDropValue,
onChanged: (value) { onChanged: (value) {
setState(() { setState(() {

View File

@ -38,8 +38,7 @@ import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'settings_screen.i18n.dart'; import 'settings_screen.i18n.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/nickname.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/user/nickname.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/icon_pack.dart';
class SettingsScreen extends StatefulWidget { class SettingsScreen extends StatefulWidget {
const SettingsScreen({Key? key}) : super(key: key); const SettingsScreen({Key? key}) : super(key: key);
@ -586,7 +585,8 @@ class _SettingsScreenState extends State<SettingsScreen>
.secondary, .secondary,
), ),
), ),
const PremiumIconPackSelector(), // we need icon pack selector here
// const PremiumIconPackSelector(),
], ],
), ),
), ),

View File

@ -16,17 +16,17 @@ final Map<int, String> avgDropItems = {
7: "7_days_average", 7: "7_days_average",
}; };
class PremiumAverageSelector extends StatefulWidget { class AverageSelector extends StatefulWidget {
const PremiumAverageSelector({Key? key, this.onChanged, required this.value}) : super(key: key); const AverageSelector({Key? key, this.onChanged, required this.value}) : super(key: key);
final Function(int?)? onChanged; final Function(int?)? onChanged;
final int value; final int value;
@override @override
_PremiumAverageSelectorState createState() => _PremiumAverageSelectorState(); _AverageSelectorState createState() => _AverageSelectorState();
} }
class _PremiumAverageSelectorState extends State<PremiumAverageSelector> { class _AverageSelectorState extends State<AverageSelector> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<DropdownMenuItem<int>> dropdownItems = avgDropItems.keys.map((item) { List<DropdownMenuItem<int>> dropdownItems = avgDropItems.keys.map((item) {

View File

@ -26,7 +26,7 @@ import 'package:filcnaplo_premium/providers/premium_provider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:filcnaplo/helpers/average_helper.dart'; import 'package:filcnaplo/helpers/average_helper.dart';
import 'package:filcnaplo_premium/ui/mobile/grades/average_selector.dart'; import 'average_selector.dart';
import 'package:filcnaplo_premium/ui/mobile/premium/premium_inline.dart'; import 'package:filcnaplo_premium/ui/mobile/premium/premium_inline.dart';
import 'grades_page.i18n.dart'; import 'grades_page.i18n.dart';
@ -240,7 +240,7 @@ class _GradesPageState extends State<GradesPage> {
title: Row( title: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
PremiumAverageSelector( AverageSelector(
value: avgDropValue, value: avgDropValue,
onChanged: (value) { onChanged: (value) {
setState(() { setState(() {

View File

@ -12,17 +12,17 @@ import 'package:intl/intl.dart';
import 'package:i18n_extension/i18n_widget.dart'; import 'package:i18n_extension/i18n_widget.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class PremiumFSTimetable extends StatefulWidget { class FSTimetable extends StatefulWidget {
const PremiumFSTimetable({Key? key, required this.controller}) const FSTimetable({Key? key, required this.controller})
: super(key: key); : super(key: key);
final TimetableController controller; final TimetableController controller;
@override @override
State<PremiumFSTimetable> createState() => _PremiumFSTimetableState(); State<FSTimetable> createState() => _FSTimetableState();
} }
class _PremiumFSTimetableState extends State<PremiumFSTimetable> { class _FSTimetableState extends State<FSTimetable> {
late SettingsProvider settings; late SettingsProvider settings;
@override @override

View File

@ -12,19 +12,21 @@ import 'package:filcnaplo_mobile_ui/common/empty.dart';
import 'package:filcnaplo_mobile_ui/common/panel/panel.dart'; import 'package:filcnaplo_mobile_ui/common/panel/panel.dart';
import 'package:filcnaplo_mobile_ui/common/profile_image/profile_button.dart'; import 'package:filcnaplo_mobile_ui/common/profile_image/profile_button.dart';
import 'package:filcnaplo_mobile_ui/common/profile_image/profile_image.dart'; import 'package:filcnaplo_mobile_ui/common/profile_image/profile_image.dart';
import 'package:filcnaplo_mobile_ui/common/system_chrome.dart';
import 'package:filcnaplo_mobile_ui/common/widgets/lesson/lesson_view.dart'; import 'package:filcnaplo_mobile_ui/common/widgets/lesson/lesson_view.dart';
import 'package:filcnaplo_kreta_api/controllers/timetable_controller.dart'; import 'package:filcnaplo_kreta_api/controllers/timetable_controller.dart';
import 'package:filcnaplo_mobile_ui/common/widgets/lesson/lesson_viewable.dart'; import 'package:filcnaplo_mobile_ui/common/widgets/lesson/lesson_viewable.dart';
import 'package:filcnaplo_mobile_ui/pages/timetable/day_title.dart'; import 'package:filcnaplo_mobile_ui/pages/timetable/day_title.dart';
import 'package:filcnaplo_mobile_ui/pages/timetable/fs_timetable.dart';
import 'package:filcnaplo_mobile_ui/screens/navigation/navigation_route_handler.dart'; import 'package:filcnaplo_mobile_ui/screens/navigation/navigation_route_handler.dart';
import 'package:filcnaplo_mobile_ui/screens/navigation/navigation_screen.dart'; import 'package:filcnaplo_mobile_ui/screens/navigation/navigation_screen.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:i18n_extension/i18n_widget.dart'; import 'package:i18n_extension/i18n_widget.dart';
import 'package:filcnaplo_premium/ui/mobile/timetable/fs_timetable_button.dart';
import 'timetable_page.i18n.dart'; import 'timetable_page.i18n.dart';
// todo: "fix" overflow (priority: -1) // todo: "fix" overflow (priority: -1)
@ -199,7 +201,38 @@ class _TimetablePageState extends State<TimetablePage>
snap: false, snap: false,
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor, surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
actions: [ actions: [
PremiumFSTimetableButton(controller: _controller, tabcontroller: _tabController), Padding(
padding: const EdgeInsets.all(8.0),
child: IconButton(
splashRadius: 24.0,
onPressed: () {
// If timetable empty, show empty
if (_tabController.length == 0) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text("empty_timetable".i18n),
duration: const Duration(seconds: 2),
));
return;
}
Navigator.of(context, rootNavigator: true)
.push(PageRouteBuilder(
pageBuilder:
(context, animation, secondaryAnimation) =>
FSTimetable(
controller: _controller,
),
))
.then((_) {
SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp]);
setSystemChrome(context);
});
},
icon: Icon(FeatherIcons.trello,
color: AppColors.of(context).text),
),
),
// Profile Icon // Profile Icon
Padding( Padding(

View File

@ -27,7 +27,7 @@ import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.i18n.dart';
import 'package:flutter_material_color_picker/flutter_material_color_picker.dart'; import 'package:flutter_material_color_picker/flutter_material_color_picker.dart';
import 'package:filcnaplo/models/icon_pack.dart'; import 'package:filcnaplo/models/icon_pack.dart';
import 'package:filcnaplo/utils/format.dart'; import 'package:filcnaplo/utils/format.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/theme.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/theme_screen.dart';
class SettingsHelper { class SettingsHelper {
static const Map<String, String> langMap = { static const Map<String, String> langMap = {

View File

@ -27,6 +27,7 @@ import 'package:filcnaplo_mobile_ui/screens/news/news_screen.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/accounts/account_tile.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/accounts/account_tile.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/accounts/account_view.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/accounts/account_view.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/debug/subject_icon_gallery.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/debug/subject_icon_gallery.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/modify_subject_names.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/notifications_screen.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/notifications_screen.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/privacy_view.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/privacy_view.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/settings_helper.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/settings_helper.dart';
@ -39,10 +40,8 @@ import 'package:provider/provider.dart';
import 'package:url_launcher/url_launcher.dart'; import 'package:url_launcher/url_launcher.dart';
import 'settings_screen.i18n.dart'; import 'settings_screen.i18n.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/nickname.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/user/nickname.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/profile_pic.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/user/profile_pic.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/icon_pack.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/modify_subject_names.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/modify_teacher_names.dart'; import 'package:filcnaplo_premium/ui/mobile/settings/modify_teacher_names.dart';
import 'package:filcnaplo_premium/ui/mobile/settings/welcome_message.dart'; import 'package:filcnaplo_premium/ui/mobile/settings/welcome_message.dart';
@ -685,7 +684,17 @@ class _SettingsScreenState extends State<SettingsScreen>
activeColor: Theme.of(context).colorScheme.secondary, activeColor: Theme.of(context).colorScheme.secondary,
), ),
), ),
const PremiumIconPackSelector(), PanelButton(
onPressed: () {
SettingsHelper.iconPack(context);
},
title: Text("icon_pack".i18n),
leading: const Icon(FeatherIcons.grid),
trailing: Text(
settings.iconPack.name.capital(),
style: const TextStyle(fontSize: 14.0),
),
),
// if ios show live activity color option // if ios show live activity color option
if (defaultTargetPlatform == TargetPlatform.iOS) if (defaultTargetPlatform == TargetPlatform.iOS)

View File

@ -15,14 +15,14 @@ import 'package:filcnaplo_mobile_ui/common/widgets/grade/new_grades.dart';
import 'package:filcnaplo_mobile_ui/common/widgets/homework/homework_tile.dart'; import 'package:filcnaplo_mobile_ui/common/widgets/homework/homework_tile.dart';
import 'package:filcnaplo_premium/models/premium_scopes.dart'; import 'package:filcnaplo_premium/models/premium_scopes.dart';
import 'package:filcnaplo_premium/providers/premium_provider.dart'; import 'package:filcnaplo_premium/providers/premium_provider.dart';
import 'package:filcnaplo_premium/providers/share_provider.dart'; import 'package:filcnaplo_kreta_api/providers/share_provider.dart';
import 'package:filcnaplo_premium/ui/mobile/flutter_colorpicker/colorpicker.dart'; import 'package:filcnaplo/ui/flutter_colorpicker/colorpicker.dart';
import 'package:filcnaplo_premium/ui/mobile/premium/upsell.dart'; import 'package:filcnaplo_premium/ui/mobile/premium/upsell.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'theme.i18n.dart'; import 'theme_screen.i18n.dart';
import 'package:share_plus/share_plus.dart'; import 'package:share_plus/share_plus.dart';
class PremiumCustomAccentColorSetting extends StatefulWidget { class PremiumCustomAccentColorSetting extends StatefulWidget {

View File

@ -1,39 +0,0 @@
import 'package:filcnaplo/models/settings.dart';
import 'package:filcnaplo_mobile_ui/common/panel/panel_button.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/settings_helper.dart';
import 'package:filcnaplo_premium/models/premium_scopes.dart';
import 'package:filcnaplo_premium/providers/premium_provider.dart';
import 'package:filcnaplo_premium/ui/mobile/premium/upsell.dart';
import 'package:flutter/material.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.i18n.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:provider/provider.dart';
import 'package:filcnaplo/utils/format.dart';
class PremiumIconPackSelector extends StatelessWidget {
const PremiumIconPackSelector({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
final settings = Provider.of<SettingsProvider>(context);
return PanelButton(
onPressed: () {
if (!Provider.of<PremiumProvider>(context, listen: false)
.hasScope(PremiumScopes.customIcons)) {
PremiumLockedFeatureUpsell.show(
context: context, feature: PremiumFeature.iconpack);
return;
}
SettingsHelper.iconPack(context);
},
title: Text("icon_pack".i18n),
leading: const Icon(FeatherIcons.grid),
trailing: Text(
settings.iconPack.name.capital(),
style: const TextStyle(fontSize: 14.0),
),
);
}
}

View File

@ -17,8 +17,7 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/modify_names.i18n.dart';
import 'modify_names.i18n.dart';
class MenuRenamedTeachers extends StatelessWidget { class MenuRenamedTeachers extends StatelessWidget {
const MenuRenamedTeachers({Key? key, required this.settings}) const MenuRenamedTeachers({Key? key, required this.settings})

View File

@ -1,62 +0,0 @@
import 'package:filcnaplo/theme/colors/colors.dart';
import 'package:filcnaplo_kreta_api/controllers/timetable_controller.dart';
import 'package:filcnaplo_mobile_ui/common/system_chrome.dart';
import 'package:filcnaplo_premium/models/premium_scopes.dart';
import 'package:filcnaplo_premium/providers/premium_provider.dart';
import 'package:filcnaplo_premium/ui/mobile/premium/upsell.dart';
import 'package:filcnaplo_premium/ui/mobile/timetable/fs_timetable.dart';
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:filcnaplo_mobile_ui/pages/timetable/timetable_page.i18n.dart';
class PremiumFSTimetableButton extends StatelessWidget {
const PremiumFSTimetableButton(
{Key? key, required this.controller, required this.tabcontroller})
: super(key: key);
final TimetableController controller;
final TabController tabcontroller;
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(8.0),
child: IconButton(
splashRadius: 24.0,
onPressed: () {
if (!Provider.of<PremiumProvider>(context, listen: false)
.hasScope(PremiumScopes.fsTimetable)) {
PremiumLockedFeatureUpsell.show(
context: context, feature: PremiumFeature.weeklytimetable);
return;
}
// If timetable empty, show empty
if (tabcontroller.length == 0) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text("empty_timetable".i18n),
duration: const Duration(seconds: 2),
));
return;
}
Navigator.of(context, rootNavigator: true)
.push(PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) =>
PremiumFSTimetable(
controller: controller,
),
))
.then((_) {
SystemChrome.setPreferredOrientations(
[DeviceOrientation.portraitUp]);
setSystemChrome(context);
});
},
icon: Icon(FeatherIcons.trello, color: AppColors.of(context).text),
),
);
}
}