123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281 |
- import 'dart:io';
- import 'package:dio/dio.dart';
- import 'package:easy_localization/easy_localization.dart';
- import 'package:file_picker/file_picker.dart';
- import 'package:flutter/foundation.dart';
- import 'package:flutter/material.dart';
- import 'package:telnow_mobile_new/src/api/api_auth_provider.dart';
- import 'package:telnow_mobile_new/src/layouts/components/template.dart';
- import 'package:telnow_mobile_new/src/utils/U.dart';
- class MobMessageBroadcastPage extends StatefulWidget {
- final user;
- final recipient;
- const MobMessageBroadcastPage(this.user, this.recipient, {super.key});
- @override
- State<MobMessageBroadcastPage> createState() => _MobMessageBroadcastPageState();
- }
- class _MobMessageBroadcastPageState extends State<MobMessageBroadcastPage> {
- final ApiAuthProvider _apiAuthProvider = ApiAuthProvider();
- bool _isDisabled = true;
- List data = [];
- String listOfTenant = '';
- String? textContent;
- String _filePath = '';
- String _fileName = '';
- String _fileExt = '';
- PlatformFile? fileX;
- var _prevImg;
- File? file;
- int count = 0;
- bool _isSending = false;
- _buttonController(value) {
- textContent = value;
- bool activate = true;
- if (value.length == 0) {
- activate = false;
- }
- setState(() {
- _isDisabled = !activate;
- });
- }
- _sendMyMessage() async {
- var recTenant = listOfTenant;
- var params = {'recipientTenant': recTenant, 'text': textContent};
- var data;
- if (file != null || fileX != null) {
- var _file;
- _file = kIsWeb ? await MultipartFile.fromBytes(fileX!.bytes!, filename: fileX!.name) : await MultipartFile.fromFile(_filePath);
- FormData formData = FormData.fromMap({
- 'file': _file,
- });
- data = formData;
- }
- setState(() {
- _isSending = true;
- });
- var res = await _apiAuthProvider.postData('/api/messages/broadcast', params, data, context);
- // print("res : ${res.toString()}");
- if (res != null && mounted) {
- Navigator.pop(context, 'pop');
- }
- else{
- setState(() {
- _isSending = false;
- });
- }
- }
- @override
- void initState() {
- // TODO: implement initState
- data = widget.recipient;
- if (data.isNotEmpty) {
- // int? totalLength = 96;
- data.sort((a, b) => (a['name'].length).compareTo(b['name'].length));
- listOfTenant = data.map((e) => e['code']).join(',');
- // data.forEach((e) {
- // totalLength = (totalLength! - e['name'].length) as int?;
- // totalLength! >= 0 ? count++ : null;
- // listOfTenant += ',' + e['code'];
- // });
- }
- // print(data);
- super.initState();
- }
- @override
- Widget build(BuildContext context) {
- return Scaffold(
- backgroundColor: Colors.white,
- appBar: appBarTemplate(context: context, title: 'composeMessage'.tr(), action: [
- !_isSending ? Padding(
- padding: EdgeInsets.only(right: 20),
- child: GestureDetector(
- child: U.iconsax('bold/send-1', size: 30, color: _isDisabled ? primaryColor.withOpacity(0.5):primaryColor),
- onTap: _isDisabled ? null : ()=>_sendMyMessage(),
- ),
- ):Container()
- ]),
- body: !_isSending ? Column(
- children: [
- divider(),
- Expanded(
- child: Container(
- alignment: Alignment.topCenter,
- width: U.bodyWidth(context),
- padding: EdgeInsets.fromLTRB(15, 15, 15, 0),
- child: SingleChildScrollView(
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- widget.recipient != null ? Row(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Padding(
- padding: EdgeInsets.only(top: 4),
- child: Text('to'.tr()),
- ),
- data.isNotEmpty?Expanded(
- child: Wrap(
- children: List.generate(data.length, (i) {
- return Container(
- decoration: BoxDecoration(color: Color(U.getColor(data[i]['code'])), borderRadius: BorderRadius.all(Radius.circular(2))),
- padding: EdgeInsets.fromLTRB(8, 4, 8, 4),
- margin: EdgeInsets.fromLTRB(8, 0, 0, 8),
- child: Text(data[i]['name'], style: TextStyle(color: Colors.white)),
- );
- }),
- )
- ):Container(
- decoration: BoxDecoration(color: Color(U.getColor('allInformants')), borderRadius: BorderRadius.all(Radius.circular(2))),
- padding: EdgeInsets.fromLTRB(8, 4, 8, 4),
- margin: EdgeInsets.fromLTRB(8, 0, 0, 8),
- child: Text(
- "allInformants".tr(),
- style: TextStyle(color: Colors.white),
- ),
- )
- ],
- ) : Container(),
- SizedBox(height: 16),
- Text('message'.tr()),
- SizedBox(height: 8),
- TextField(
- maxLines: null,
- maxLength: 256,
- decoration: InputDecoration(
- border: OutlineInputBorder(),
- focusedBorder: OutlineInputBorder(
- borderSide: const BorderSide(color: Colors.black45),
- )),
- onChanged: (String value) async {
- _buttonController(value);
- },
- ),
- Align(
- alignment: Alignment.bottomLeft,
- child: Container(
- child: GestureDetector(
- child: Container(
- child: Row(
- children: [
- Icon(Icons.attach_file_outlined),
- SizedBox(
- width: 4,
- ),
- Text(_filePath == '' ? 'addAttachment'.tr() : 'editAttachment'.tr())
- ],
- ),
- ),
- onTap: () async {
- var allowedExt = ['jpg', 'pdf', 'png', 'jpeg'];
- _filePath = '';
- _fileName = '';
- FilePickerResult? result = await FilePicker.platform.pickFiles(
- type: FileType.custom,
- allowedExtensions: allowedExt,
- withReadStream: false,
- );
- if (result != null) {
- PlatformFile _file = result.files.first;
- if (!allowedExt.contains(_file.extension)) {
- final snackBar = SnackBar(
- content: Row(
- children: [
- Icon(
- Icons.warning,
- color: Colors.yellow,
- size: 18,
- ),
- SizedBox(
- width: 8,
- ),
- Text(
- 'unsupportedFile'.tr(),
- style: TextStyle(),
- overflow: TextOverflow.fade,
- maxLines: 2,
- )
- ],
- ));
- ScaffoldMessenger.of(context).showSnackBar(snackBar);
- } else {
- _fileName = _file.name;
- _fileExt = _file.extension!;
- if (!kIsWeb) {
- file = File(result.files.single.path!);
- _filePath = _file.path!;
- } else {
- fileX = result.files.single;
- _prevImg = Image.memory(fileX!.bytes!);
- }
- }
- }
- setState(() {});
- }),
- ),
- ),
- _fileName != '' ? Padding(
- padding: EdgeInsets.only(top: 12),
- child: Text(_fileName, overflow: TextOverflow.ellipsis),
- ) : Container(),
- _filePath != '' || fileX != null ? Padding(
- padding: EdgeInsets.only(top: 12, bottom: 12),
- child: Stack(
- children: [
- _fileExt != 'pdf' ? !kIsWeb ? Image.file(File(_filePath)) : _prevImg != null ? _prevImg : Container() : Padding(
- padding: EdgeInsets.only(top: 6, left: 8),
- child: Row(
- children: [
- Icon(Icons.picture_as_pdf),
- SizedBox(width: 6),
- Text('pdfFile'.tr())
- ],
- ),
- ),
- GestureDetector(
- child: Container(
- width: double.infinity,
- height: 36,
- padding: EdgeInsets.only(top: 6, right: 8),
- decoration: BoxDecoration(color: Colors.transparent.withOpacity(0.5), gradient: LinearGradient(end: Alignment.bottomCenter, begin: Alignment.center, colors: [Color(0xffDADADA), Colors.white])),
- child: Align(
- child: Row(
- mainAxisAlignment: MainAxisAlignment.end,
- children: [
- Text('delete'.tr()),
- Icon(Icons.clear)
- ],
- ),
- alignment: Alignment.topRight,
- ),
- ),
- onTap: () {
- // print('delete please!');
- setState(() {
- _filePath = '';
- _fileName = '';
- fileX = null;
- });
- },
- )
- ],
- ),
- ) : Container()
- ],
- ),
- )
- ),
- )
- ],
- ):loadingTemplate(),
- );
- }
- }
|