Merge pull request #61 from refilc/dev

Dev
This commit is contained in:
Márton Kiss 2023-09-27 23:04:56 +02:00 committed by GitHub
commit cd8ab8bfdb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 200 additions and 26 deletions

View File

@ -40,6 +40,11 @@ class FilcAPI {
static const allThemes = "$themeGet/all"; static const allThemes = "$themeGet/all";
static const themeByID = "$themeGet/"; static const themeByID = "$themeGet/";
static const gradeColorsShare = "$baseUrl/v2/shared/grade-colors/add";
static const gradeColorsGet = "$baseUrl/v2/shared/grade-colors/get";
static const allGradeColors = "$gradeColorsGet/all";
static const gradeColorsByID = "$gradeColorsGet/";
static Future<bool> checkConnectivity() async => static Future<bool> checkConnectivity() async =>
(await Connectivity().checkConnectivity()) != ConnectivityResult.none; (await Connectivity().checkConnectivity()) != ConnectivityResult.none;
@ -209,6 +214,9 @@ class FilcAPI {
theme.json['panels_color'] = theme.panelsColor.value.toString(); theme.json['panels_color'] = theme.panelsColor.value.toString();
theme.json['accent_color'] = theme.accentColor.value.toString(); theme.json['accent_color'] = theme.accentColor.value.toString();
// set linked grade colors
theme.json['grade_colors_id'] = theme.gradeColors.id;
http.Response res = await http.post( http.Response res = await http.post(
Uri.parse(themeShare), Uri.parse(themeShare),
body: theme.json, body: theme.json,
@ -235,7 +243,49 @@ class FilcAPI {
throw "HTTP ${res.statusCode}: ${res.body}"; throw "HTTP ${res.statusCode}: ${res.body}";
} }
} on Exception catch (error, stacktrace) { } on Exception catch (error, stacktrace) {
log("ERROR: FilcAPI.addSharedTheme: $error $stacktrace"); log("ERROR: FilcAPI.getSharedTheme: $error $stacktrace");
}
return null;
}
static Future<void> addSharedGradeColors(
SharedGradeColors gradeColors) async {
try {
gradeColors.json.remove('json');
gradeColors.json['is_public'] = gradeColors.isPublic.toString();
gradeColors.json['five_color'] = gradeColors.fiveColor.value.toString();
gradeColors.json['four_color'] = gradeColors.fourColor.value.toString();
gradeColors.json['three_color'] = gradeColors.threeColor.value.toString();
gradeColors.json['two_color'] = gradeColors.twoColor.value.toString();
gradeColors.json['one_color'] = gradeColors.oneColor.value.toString();
http.Response res = await http.post(
Uri.parse(gradeColorsShare),
body: gradeColors.json,
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
);
if (res.statusCode != 201) {
throw "HTTP ${res.statusCode}: ${res.body}";
}
log('Shared grade colors successfully with ID: ${gradeColors.id}');
} on Exception catch (error, stacktrace) {
log("ERROR: FilcAPI.addSharedGradeColors: $error $stacktrace");
}
}
static Future<Map?> getSharedGradeColors(String id) async {
try {
http.Response res = await http.get(Uri.parse(gradeColorsByID + id));
if (res.statusCode == 200) {
return (jsonDecode(res.body) as Map);
} else {
throw "HTTP ${res.statusCode}: ${res.body}";
}
} on Exception catch (error, stacktrace) {
log("ERROR: FilcAPI.getSharedGradeColors: $error $stacktrace");
} }
return null; return null;
} }

View File

@ -8,6 +8,7 @@ class SharedTheme {
Color backgroundColor; Color backgroundColor;
Color panelsColor; Color panelsColor;
Color accentColor; Color accentColor;
SharedGradeColors gradeColors;
SharedTheme({ SharedTheme({
required this.json, required this.json,
@ -17,9 +18,10 @@ class SharedTheme {
required this.backgroundColor, required this.backgroundColor,
required this.panelsColor, required this.panelsColor,
required this.accentColor, required this.accentColor,
required this.gradeColors,
}); });
factory SharedTheme.fromJson(Map json) { factory SharedTheme.fromJson(Map json, SharedGradeColors gradeColors) {
return SharedTheme( return SharedTheme(
json: json, json: json,
id: json['public_id'], id: json['public_id'],
@ -28,6 +30,45 @@ class SharedTheme {
backgroundColor: Color(json['background_color']), backgroundColor: Color(json['background_color']),
panelsColor: Color(json['panels_color']), panelsColor: Color(json['panels_color']),
accentColor: Color(json['accent_color']), accentColor: Color(json['accent_color']),
gradeColors: gradeColors,
);
}
}
class SharedGradeColors {
Map json;
String id;
bool isPublic;
String nickname;
Color fiveColor;
Color fourColor;
Color threeColor;
Color twoColor;
Color oneColor;
SharedGradeColors({
required this.json,
required this.id,
this.isPublic = false,
this.nickname = 'Anonymous',
required this.fiveColor,
required this.fourColor,
required this.threeColor,
required this.twoColor,
required this.oneColor,
});
factory SharedGradeColors.fromJson(Map json) {
return SharedGradeColors(
json: json,
id: json['public_id'],
isPublic: json['is_public'] ?? false,
nickname: json['nickname'] ?? 'Anonymous',
fiveColor: Color(json['five_color']),
fourColor: Color(json['four_color']),
threeColor: Color(json['three_color']),
twoColor: Color(json['two_color']),
oneColor: Color(json['one_color']),
); );
} }
} }

View File

@ -1,5 +1,6 @@
import 'dart:convert'; import 'dart:convert';
import 'package:filcnaplo_kreta_api/client/api.dart'; import 'package:filcnaplo_kreta_api/client/api.dart';
import 'package:filcnaplo_kreta_api/models/school.dart';
import 'package:filcnaplo_kreta_api/models/student.dart'; import 'package:filcnaplo_kreta_api/models/student.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@ -43,7 +44,16 @@ class User {
username: map["username"], username: map["username"],
password: map["password"], password: map["password"],
name: map["name"].trim(), name: map["name"].trim(),
student: Student.fromJson(jsonDecode(map["student"])), student: map["student"] != 'null'
? Student.fromJson(jsonDecode(map["student"]))
: Student(
id: const Uuid().v4(),
name: 'Ismeretlen Diák',
school: School(instituteCode: '', name: '', city: ''),
birth: DateTime.now(),
yearId: '1',
parents: [],
),
role: Role.values[map["role"] ?? 0], role: Role.values[map["role"] ?? 0],
nickname: map["nickname"] ?? "", nickname: map["nickname"] ?? "",
picture: map["picture"] ?? "", picture: map["picture"] ?? "",

View File

@ -101,6 +101,7 @@ Future<List<DateWidget>> getFilterWidgets(FilterType activeData,
gradeProvider.grades, gradeProvider.lastSeenDate); gradeProvider.grades, gradeProvider.lastSeenDate);
if (settingsProvider.gradeOpeningFun) { if (settingsProvider.gradeOpeningFun) {
items.addAll( items.addAll(
// ignore: use_build_context_synchronously
await getFilterWidgets(FilterType.newGrades, context: context)); await getFilterWidgets(FilterType.newGrades, context: context));
} }
break; break;

View File

@ -3,7 +3,7 @@ description: "Nem hivatalos e-napló alkalmazás az e-Kréta rendszerhez"
homepage: https://refilc.hu homepage: https://refilc.hu
publish_to: "none" publish_to: "none"
version: 4.2.5+225 version: 4.3.0+226
environment: environment:
sdk: ">=2.17.0 <3.0.0" sdk: ">=2.17.0 <3.0.0"

View File

@ -7,7 +7,7 @@ import 'package:filcnaplo/api/client.dart';
import 'package:filcnaplo/api/login.dart'; import 'package:filcnaplo/api/login.dart';
import 'package:filcnaplo_mobile_ui/screens/login/login_button.dart'; import 'package:filcnaplo_mobile_ui/screens/login/login_button.dart';
import 'package:filcnaplo_mobile_ui/screens/login/login_input.dart'; import 'package:filcnaplo_mobile_ui/screens/login/login_input.dart';
import 'package:filcnaplo_desktop_ui/screens/login/school_input/school_input.dart'; // import 'package:filcnaplo_desktop_ui/screens/login/school_input/school_input.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_acrylic/flutter_acrylic.dart'; import 'package:flutter_acrylic/flutter_acrylic.dart';
@ -36,8 +36,8 @@ class LoginScreen extends StatefulWidget {
class _LoginScreenState extends State<LoginScreen> { class _LoginScreenState extends State<LoginScreen> {
final usernameController = TextEditingController(); final usernameController = TextEditingController();
final passwordController = TextEditingController(); final passwordController = TextEditingController();
final schoolController = SchoolInputController(); // final schoolController = SchoolInputController();
final _scrollController = ScrollController(); // final _scrollController = ScrollController();
LoginState _loginState = LoginState.normal; LoginState _loginState = LoginState.normal;
bool showBack = false; bool showBack = false;
@ -57,9 +57,9 @@ class _LoginScreenState extends State<LoginScreen> {
FilcAPI.getSchools().then((schools) { FilcAPI.getSchools().then((schools) {
if (schools != null) { if (schools != null) {
schoolController.update(() { // schoolController.update(() {
schoolController.schools = schools; // schoolController.schools = schools;
}); // });
} else { } else {
ElegantNotification.error( ElegantNotification.error(
background: Colors.white, background: Colors.white,
@ -238,10 +238,10 @@ class _LoginScreenState extends State<LoginScreen> {
), ),
), ),
), ),
SchoolInput( // SchoolInput(
scroll: _scrollController, // scroll: _scrollController,
controller: schoolController, // controller: schoolController,
), // ),
], ],
), ),
), ),
@ -320,8 +320,10 @@ class _LoginScreenState extends State<LoginScreen> {
String password = passwordController.text; String password = passwordController.text;
if (username == "" || if (username == "" ||
password == "" || password ==
schoolController.selectedSchool == null) { "" /*||
schoolController.selectedSchool == null*/
) {
return setState(() => _loginState = LoginState.missingFields); return setState(() => _loginState = LoginState.missingFields);
} }
@ -330,7 +332,8 @@ class _LoginScreenState extends State<LoginScreen> {
loginAPI( loginAPI(
username: username, username: username,
password: password, password: password,
instituteCode: schoolController.selectedSchool!.instituteCode, instituteCode: 'shit',
// instituteCode: schoolController.selectedSchool!.instituteCode,
context: context, context: context,
onLogin: (user) { onLogin: (user) {
ElegantNotification.success( ElegantNotification.success(

View File

@ -17,8 +17,12 @@ class ShareProvider extends ChangeNotifier {
// Future<void> shareTheme({required SharedTheme theme}) async { // Future<void> shareTheme({required SharedTheme theme}) async {
// } // }
// themes
Future<SharedTheme> shareCurrentTheme(BuildContext context, Future<SharedTheme> shareCurrentTheme(BuildContext context,
{bool isPublic = false, bool shareNick = true}) async { {bool isPublic = false,
bool shareNick = true,
required SharedGradeColors gradeColors}) async {
final SettingsProvider settings = final SettingsProvider settings =
Provider.of<SettingsProvider>(context, listen: false); Provider.of<SettingsProvider>(context, listen: false);
@ -38,7 +42,7 @@ class ShareProvider extends ChangeNotifier {
const Color(0xFF3D7BF4).value, const Color(0xFF3D7BF4).value,
}; };
SharedTheme theme = SharedTheme.fromJson(themeJson); SharedTheme theme = SharedTheme.fromJson(themeJson, gradeColors);
FilcAPI.addSharedTheme(theme); FilcAPI.addSharedTheme(theme);
return theme; return theme;
@ -49,9 +53,54 @@ class ShareProvider extends ChangeNotifier {
Map? themeJson = await FilcAPI.getSharedTheme(id); Map? themeJson = await FilcAPI.getSharedTheme(id);
if (themeJson != null) { if (themeJson != null) {
SharedTheme theme = SharedTheme.fromJson(themeJson); Map? gradeColorsJson =
await FilcAPI.getSharedGradeColors(themeJson['grade_colors_id']);
if (gradeColorsJson != null) {
SharedTheme theme = SharedTheme.fromJson(
themeJson, SharedGradeColors.fromJson(gradeColorsJson));
return theme; return theme;
} }
}
return null;
}
// grade colors
Future<SharedGradeColors> shareCurrentGradeColors(
BuildContext context, {
bool isPublic = false,
bool shareNick = true,
}) async {
final SettingsProvider settings =
Provider.of<SettingsProvider>(context, listen: false);
Map gradeColorsJson = {
'public_id': const Uuid().v4(),
'is_public': isPublic,
'nickname': shareNick ? _user.nickname : 'Anonymous',
'five_color': settings.gradeColors[4].value,
'four_color': settings.gradeColors[3].value,
'three_color': settings.gradeColors[2].value,
'two_color': settings.gradeColors[1].value,
'one_color': settings.gradeColors[0].value,
};
SharedGradeColors gradeColors = SharedGradeColors.fromJson(gradeColorsJson);
FilcAPI.addSharedGradeColors(gradeColors);
return gradeColors;
}
Future<SharedGradeColors?> getGradeColorsById(BuildContext context,
{required String id}) async {
Map? gradeColorsJson = await FilcAPI.getSharedGradeColors(id);
if (gradeColorsJson != null) {
SharedGradeColors gradeColors =
SharedGradeColors.fromJson(gradeColorsJson);
return gradeColors;
}
return null; return null;
} }

View File

@ -283,8 +283,16 @@ class _PremiumCustomAccentColorSettingState
label: "understand".i18n, label: "understand".i18n,
onTap: () async { onTap: () async {
Navigator.of(context).pop(); Navigator.of(context).pop();
SharedTheme theme = await shareProvider
.shareCurrentTheme(context); SharedGradeColors gradeColors =
await shareProvider
.shareCurrentGradeColors(context);
SharedTheme theme =
await shareProvider.shareCurrentTheme(
context,
gradeColors: gradeColors,
);
Share.share( Share.share(
theme.id, theme.id,
subject: 'share_subj_theme'.i18n, subject: 'share_subj_theme'.i18n,
@ -804,6 +812,18 @@ class _PremiumCustomAccentColorSettingState
setTheme(settings.theme, true); setTheme(settings.theme, true);
}, },
onThemeIdProvided: (theme) { onThemeIdProvided: (theme) {
// changing grade colors
List<Color> colors = [
theme.gradeColors.oneColor,
theme.gradeColors.twoColor,
theme.gradeColors.threeColor,
theme.gradeColors.fourColor,
theme.gradeColors.fiveColor,
];
settings.update(
gradeColors: colors);
// changing theme
setState(() { setState(() {
updateCustomColor( updateCustomColor(
null, null,