Encrypted messaging app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

196 lines
6.0 KiB

import 'dart:io';
import 'package:Capsule/components/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import '/components/custom_circle_avatar.dart';
import '/models/conversations.dart';
class ConversationEditDetails extends StatefulWidget {
final Function(String conversationName, File? conversationIcon) saveCallback;
final Conversation? conversation;
const ConversationEditDetails({
Key? key,
required this.saveCallback,
this.conversation,
}) : super(key: key);
@override
State<ConversationEditDetails> createState() => _ConversationEditDetails();
}
class _ConversationEditDetails extends State<ConversationEditDetails> {
final _formKey = GlobalKey<FormState>();
List<Conversation> conversations = [];
TextEditingController conversationNameController = TextEditingController();
File? conversationIcon;
bool showFileSelector = false;
@override
void initState() {
if (widget.conversation != null) {
conversationNameController.text = widget.conversation!.name;
conversationIcon = widget.conversation!.icon;
}
super.initState();
}
@override
Widget build(BuildContext context) {
const TextStyle inputTextStyle = TextStyle(
fontSize: 25,
);
final OutlineInputBorder inputBorderStyle = OutlineInputBorder(
borderRadius: BorderRadius.circular(5),
borderSide: const BorderSide(
color: Colors.transparent,
)
);
final ButtonStyle buttonStyle = ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(horizontal: 30, vertical: 10),
textStyle: TextStyle(
fontSize: 15,
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.error,
),
);
return Scaffold(
appBar: AppBar(
elevation: 0,
automaticallyImplyLeading: false,
flexibleSpace: SafeArea(
child: Container(
padding: const EdgeInsets.only(right: 16),
child: Row(
children: <Widget>[
IconButton(
onPressed: (){
Navigator.pop(context);
},
icon: const Icon(Icons.arrow_back),
),
const SizedBox(width: 2,),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
widget.conversation != null ?
widget.conversation!.name + ' Settings' :
'Add Conversation',
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w600
),
),
],
),
),
],
),
),
),
),
body: Center(
child: Padding(
padding: const EdgeInsets.only(
top: 50,
left: 25,
right: 25,
),
child: Form(
key: _formKey,
child: Column(
children: [
CustomCircleAvatar(
icon: const Icon(Icons.people, size: 60),
image: conversationIcon,
radius: 50,
editImageCallback: () {
setState(() {
showFileSelector = true;
});
},
),
const SizedBox(height: 20),
AnimatedSwitcher(
duration: const Duration(milliseconds: 250),
transitionBuilder: (Widget child, Animation<double> animation) {
return SizeTransition(sizeFactor: animation, child: child);
},
child: showFileSelector ?
Padding(
padding: const EdgeInsets.only(bottom: 10),
child: FilePicker(
cameraHandle: (XFile image) {
setState(() {
conversationIcon = File(image.path);
showFileSelector = false;
});
},
galleryHandleSingle: (XFile image) async {
setState(() {
conversationIcon = File(image.path);
showFileSelector = false;
});
},
),
) :
const SizedBox(height: 10),
),
TextFormField(
controller: conversationNameController,
textAlign: TextAlign.center,
decoration: InputDecoration(
hintText: 'Title',
enabledBorder: inputBorderStyle,
focusedBorder: inputBorderStyle,
),
style: inputTextStyle,
// The validator receives the text that the user has entered.
validator: (value) {
if (value == null || value.isEmpty) {
return 'Add a title';
}
return null;
},
),
const SizedBox(height: 30),
ElevatedButton(
style: buttonStyle,
onPressed: () {
if (!_formKey.currentState!.validate()) {
return;
}
widget.saveCallback(
conversationNameController.text,
conversationIcon,
);
},
child: const Text('Save'),
),
],
),
),
),
),
);
}
}