import 'dart:convert'; import 'dart:developer'; import 'package:dio/dio.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:gap/gap.dart'; import 'package:material_symbols_icons/symbols.dart'; import 'package:provider/provider.dart'; import 'package:styled_widget/styled_widget.dart'; import 'package:surface/providers/sn_network.dart'; import 'package:surface/widgets/dialog.dart'; import 'package:surface/widgets/loading_indicator.dart'; import 'package:uuid/uuid.dart'; class ChatManageScreen extends StatefulWidget { final String? editingChannelAlias; const ChatManageScreen({super.key, this.editingChannelAlias}); @override State createState() => _ChatManageScreenState(); } class _ChatManageScreenState extends State { bool _isBusy = false; final _aliasController = TextEditingController(); final _nameController = TextEditingController(); final _descriptionController = TextEditingController(); Future _performAction() async { final uuid = const Uuid(); final sn = context.read(); setState(() => _isBusy = true); // TODO Add realm support // final scope = widget.realm != null ? widget.realm!.alias : 'global'; final scope = 'global'; final payload = { 'alias': _aliasController.text.isNotEmpty ? _aliasController.text.toLowerCase() : uuid.v4().replaceAll('-', '').substring(0, 12), 'name': _nameController.text, 'description': _descriptionController.text, }; try { final resp = await sn.client.request( widget.editingChannelAlias != null ? '/cgi/im/channels/$scope/${widget.editingChannelAlias}' : '/cgi/im/channels/$scope', data: payload, options: Options( method: widget.editingChannelAlias != null ? 'PUT' : 'POST', ), ); log(jsonEncode(resp.data)); // ignore: use_build_context_synchronously if (context.mounted) Navigator.pop(context, resp.data); } catch (err) { // ignore: use_build_context_synchronously if (context.mounted) context.showErrorDialog(err); } setState(() => _isBusy = false); } @override void dispose() { super.dispose(); _aliasController.dispose(); _nameController.dispose(); _descriptionController.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: widget.editingChannelAlias != null ? Text('screenChatManage').tr() : Text('screenChatNew').tr(), ), body: SingleChildScrollView( child: Column( children: [ LoadingIndicator(isActive: _isBusy), const Gap(24), TextField( controller: _aliasController, decoration: InputDecoration( border: const UnderlineInputBorder(), labelText: 'fieldChatAlias'.tr(), helperText: 'fieldChatAliasHint'.tr(), helperMaxLines: 2, ), onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), ), const Gap(4), TextField( controller: _nameController, decoration: InputDecoration( border: const UnderlineInputBorder(), labelText: 'fieldChatName'.tr(), ), onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), ), const Gap(4), TextField( controller: _descriptionController, maxLines: null, minLines: 3, decoration: InputDecoration( border: const UnderlineInputBorder(), labelText: 'fieldChatDescription'.tr(), ), onTapOutside: (_) => FocusManager.instance.primaryFocus?.unfocus(), ), const Gap(12), Row( mainAxisAlignment: MainAxisAlignment.end, children: [ ElevatedButton.icon( onPressed: _isBusy ? null : _performAction, icon: const Icon(Symbols.save), label: Text('apply').tr(), ), ], ), ], ).padding(horizontal: 24), ), ); } }