This commit is contained in:
otsmr 2025-04-21 17:23:44 +02:00
parent cbe2619a06
commit 8a96fa700c
3 changed files with 137 additions and 96 deletions

View file

@ -0,0 +1,135 @@
import 'dart:math';
import 'package:avatar_maker/avatar_maker.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:twonly/src/json_models/userdata.dart';
import 'package:twonly/src/providers/api/api.dart';
import 'package:twonly/src/providers/settings_change_provider.dart';
import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/utils/storage.dart';
class ModifyAvatar extends StatelessWidget {
const ModifyAvatar({super.key});
Future updateUserAvatar(String json, String svg) async {
UserData? user = await getUser();
if (user == null) return null;
user.avatarJson = json;
user.avatarSvg = svg;
if (user.avatarCounter == null) {
user.avatarCounter = 1;
} else {
user.avatarCounter = user.avatarCounter! + 1;
}
await updateUser(user);
await notifyContactsAboutProfileChange();
}
AvatarMakerThemeData getAvatarMakerTheme(BuildContext context) {
ThemeMode? selectedTheme =
context.watch<SettingsChangeProvider>().themeMode;
bool isDarkMode =
MediaQuery.of(context).platformBrightness == Brightness.dark;
if (selectedTheme == ThemeMode.dark ||
(selectedTheme == ThemeMode.system && isDarkMode)) {
return AvatarMakerThemeData(
boxDecoration: BoxDecoration(
boxShadow: [BoxShadow()],
),
unselectedTileDecoration: BoxDecoration(
color: const Color.fromARGB(255, 50, 50, 50), // Dark mode color
borderRadius: BorderRadius.circular(10),
),
selectedTileDecoration: BoxDecoration(
color: const Color.fromARGB(255, 100, 100, 100), // Dark mode color
borderRadius: BorderRadius.circular(10),
),
selectedIconColor: Colors.white,
unselectedIconColor: Colors.grey,
primaryBgColor: Colors.black, // Dark mode background
secondaryBgColor: Colors.grey[850]!, // Dark mode secondary background
labelTextStyle:
TextStyle(color: Colors.white), // Light text for dark mode
);
} else {
return AvatarMakerThemeData(
boxDecoration: BoxDecoration(
boxShadow: [BoxShadow()],
),
unselectedTileDecoration: BoxDecoration(
color: const Color.fromARGB(255, 240, 240, 240), // Light mode color
borderRadius: BorderRadius.circular(10),
),
selectedTileDecoration: BoxDecoration(
color: const Color.fromARGB(255, 200, 200, 200), // Light mode color
borderRadius: BorderRadius.circular(10),
),
selectedIconColor: Colors.black,
unselectedIconColor: Colors.grey,
primaryBgColor: Colors.white, // Light mode background
secondaryBgColor: Colors.grey[200]!, // Light mode secondary background
labelTextStyle:
TextStyle(color: Colors.black), // Dark text for light mode
);
}
}
@override
Widget build(BuildContext context) {
var width = MediaQuery.of(context).size.width;
return Scaffold(
appBar: AppBar(
title: Text(context.lang.settingsProfileCustomizeAvatar),
),
body: Center(
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 00),
child: AvatarMakerAvatar(
radius: 130,
backgroundColor: Colors.transparent,
),
),
SizedBox(
width: min(600, width * 0.85),
child: Row(
children: [
Spacer(),
AvatarMakerSaveWidget(
onTap: () async {
final json =
await AvatarMakerController.getJsonOptions();
final svg = await AvatarMakerController.getAvatarSVG();
await updateUserAvatar(json, svg);
if (context.mounted) {
Navigator.pop(context);
}
},
),
AvatarMakerRandomWidget(),
AvatarMakerResetWidget(),
],
),
),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 8.0, vertical: 30),
child: AvatarMakerCustomizer(
scaffoldWidth: min(600, width * 0.85),
autosave: false,
theme: getAvatarMakerTheme(context),
),
),
],
),
),
),
);
}
}

View file

@ -1,5 +1,3 @@
import 'dart:math';
import 'package:avatar_maker/avatar_maker.dart'; import 'package:avatar_maker/avatar_maker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
@ -8,6 +6,7 @@ import 'package:twonly/src/json_models/userdata.dart';
import 'package:twonly/src/providers/api/api.dart'; import 'package:twonly/src/providers/api/api.dart';
import 'package:twonly/src/utils/misc.dart'; import 'package:twonly/src/utils/misc.dart';
import 'package:twonly/src/utils/storage.dart'; import 'package:twonly/src/utils/storage.dart';
import 'package:twonly/src/views/settings/profile/modify_avatar_view.dart';
class ProfileView extends StatefulWidget { class ProfileView extends StatefulWidget {
const ProfileView({super.key}); const ProfileView({super.key});
@ -94,99 +93,6 @@ class _ProfileViewState extends State<ProfileView> {
} }
} }
class ModifyAvatar extends StatelessWidget {
const ModifyAvatar({super.key});
Future updateUserAvatar(String json, String svg) async {
UserData? user = await getUser();
if (user == null) return null;
user.avatarJson = json;
user.avatarSvg = svg;
if (user.avatarCounter == null) {
user.avatarCounter = 1;
} else {
user.avatarCounter = user.avatarCounter! + 1;
}
await updateUser(user);
await notifyContactsAboutProfileChange();
}
@override
Widget build(BuildContext context) {
var _width = MediaQuery.of(context).size.width;
return Scaffold(
appBar: AppBar(
title: Text(context.lang.settingsProfileCustomizeAvatar),
),
body: Center(
child: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Padding(
padding: const EdgeInsets.symmetric(vertical: 00),
child: AvatarMakerAvatar(
radius: 130,
backgroundColor: Colors.transparent,
),
),
SizedBox(
width: min(600, _width * 0.85),
child: Row(
children: [
Spacer(),
AvatarMakerSaveWidget(
onTap: () async {
final json =
await AvatarMakerController.getJsonOptions();
final svg = await AvatarMakerController.getAvatarSVG();
await updateUserAvatar(json, svg);
if (context.mounted) {
Navigator.pop(context);
}
},
),
AvatarMakerRandomWidget(),
AvatarMakerResetWidget(),
],
),
),
Padding(
padding:
const EdgeInsets.symmetric(horizontal: 8.0, vertical: 30),
child: AvatarMakerCustomizer(
scaffoldWidth: min(600, _width * 0.85),
autosave: false,
theme: AvatarMakerThemeData(
boxDecoration: BoxDecoration(
boxShadow: [BoxShadow()],
),
unselectedTileDecoration: BoxDecoration(
color: const Color.fromARGB(255, 83, 83, 83),
borderRadius: BorderRadius.circular(10),
),
selectedTileDecoration: BoxDecoration(
color: const Color.fromARGB(255, 117, 117, 117),
borderRadius: BorderRadius.circular(10),
),
selectedIconColor: Colors.white,
unselectedIconColor: Colors.grey,
primaryBgColor: Colors.transparent,
secondaryBgColor: Colors.transparent,
labelTextStyle: TextStyle(
color: Theme.of(context).colorScheme.tertiary),
),
),
),
],
),
),
),
);
}
}
Future<String?> showDisplayNameChangeDialog( Future<String?> showDisplayNameChangeDialog(
BuildContext context, String currentName) { BuildContext context, String currentName) {
final TextEditingController controller = final TextEditingController controller =

View file

@ -9,7 +9,7 @@ import 'package:twonly/src/views/settings/account_view.dart';
import 'package:twonly/src/views/settings/appearance_view.dart'; import 'package:twonly/src/views/settings/appearance_view.dart';
import 'package:twonly/src/views/settings/chat_settings_view.dart'; import 'package:twonly/src/views/settings/chat_settings_view.dart';
import 'package:twonly/src/views/settings/notification_view.dart'; import 'package:twonly/src/views/settings/notification_view.dart';
import 'package:twonly/src/views/settings/profile_view.dart'; import 'package:twonly/src/views/settings/profile/profile_view.dart';
import 'package:twonly/src/views/settings/help_view.dart'; import 'package:twonly/src/views/settings/help_view.dart';
import 'package:twonly/src/views/settings/privacy_view.dart'; import 'package:twonly/src/views/settings/privacy_view.dart';