import 'dart:convert'; import 'dart:developer'; import 'dart:io'; import 'package:filcnaplo/api/providers/database_provider.dart'; import 'package:filcnaplo/api/providers/user_provider.dart'; import 'package:filcnaplo_mobile_ui/common/bottom_sheet_menu/bottom_sheet_menu_item.dart'; import 'package:filcnaplo_premium/models/premium_scopes.dart'; import 'package:filcnaplo_premium/providers/premium_provider.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/settings_screen.i18n.dart'; import 'package:provider/provider.dart'; import 'package:image_picker/image_picker.dart'; class UserMenuProfilePic extends StatelessWidget { const UserMenuProfilePic({Key? key}) : super(key: key); @override Widget build(BuildContext context) { if (!Provider.of(context) .hasScope(PremiumScopes.nickname)) { return const SizedBox(); } return BottomSheetMenuItem( onPressed: () { showDialog( context: context, builder: (context) => const UserProfilePicEditor()); }, icon: const Icon(FeatherIcons.camera), title: Text("edit_profile_picture".i18n), ); } } class UserProfilePicEditor extends StatefulWidget { const UserProfilePicEditor({Key? key}) : super(key: key); @override State createState() => _UserProfilePicEditorState(); } class _UserProfilePicEditorState extends State { late final UserProvider user; File? _file; File? _sample; File? _lastCropped; File? image; Future pickImage() async { try { final image = await ImagePicker().pickImage(source: ImageSource.gallery); if (image == null) return; File imageFile = File(image.path); _sample?.delete(); _file?.delete(); setState(() { _file = imageFile; }); } on PlatformException catch (e) { log('Failed to pick image: $e'); } } Widget openImageWidget() { return InkWell( customBorder: RoundedRectangleBorder( borderRadius: BorderRadius.circular(14.0), ), onTap: () => pickImage(), child: Container( decoration: BoxDecoration( border: Border.all(color: Colors.grey), borderRadius: BorderRadius.circular(14.0)), width: double.infinity, padding: const EdgeInsets.symmetric(vertical: 32.0, horizontal: 8.0), child: Column( children: [ Text( "click_here".i18n, style: const TextStyle(fontSize: 22.0, fontWeight: FontWeight.w600), ), Text( "select_profile_picture".i18n, style: const TextStyle(fontSize: 14.0, fontWeight: FontWeight.w500), ) ], ), ), ); } Future _cropImage() async { List imageBytes = await _file!.readAsBytes(); String base64Image = base64Encode(imageBytes); user.user!.picture = base64Image; Provider.of(context, listen: false) .store .storeUser(user.user!); Provider.of(context, listen: false).refresh(); } @override void initState() { super.initState(); user = Provider.of(context, listen: false); } @override void dispose() { super.dispose(); _file?.delete(); _sample?.delete(); _lastCropped?.delete(); } @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("edit_profile_picture".i18n), content: Column( mainAxisSize: MainAxisSize.min, children: [ Padding( padding: const EdgeInsets.symmetric(vertical: 12.0, horizontal: 24.0), child: openImageWidget(), ), if (user.user!.picture != "") TextButton( child: Text( "remove_profile_picture".i18n, style: const TextStyle( fontWeight: FontWeight.w500, color: Colors.red), ), onPressed: () { user.user!.picture = ""; Provider.of(context, listen: false) .store .storeUser(user.user!); Provider.of(context, listen: false).refresh(); Navigator.of(context).pop(true); }, ), ], ), 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 { await _cropImage(); Navigator.of(context).pop(true); }, ), ], ); } }