forked from eatvio/eatvio_app
fix: ui overflow nav-bar, name files in chat, qr-code scanner in dev-tools, message field size, keyboard type
This commit is contained in:
@@ -275,6 +275,7 @@ class _ChatScreenState extends State<ChatScreen> {
|
||||
userSlug: state.chatRoom.users.receiver.slug,
|
||||
messageType: message.type,
|
||||
isConsultant: amIConsultant,
|
||||
urlsMediaInfo: message.urlsMediaInfo,
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -330,6 +331,7 @@ class _ChatScreenState extends State<ChatScreen> {
|
||||
userSlug: state.chatRoom.users.receiver.slug,
|
||||
messageType: message.type,
|
||||
isConsultant: amIConsultant,
|
||||
urlsMediaInfo: message.urlsMediaInfo,
|
||||
),
|
||||
),
|
||||
],
|
||||
@@ -460,34 +462,30 @@ class _ChatScreenState extends State<ChatScreen> {
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: 40,
|
||||
child: TextFormField(
|
||||
expands: true,
|
||||
textCapitalization: TextCapitalization.sentences,
|
||||
controller: textEditingController,
|
||||
maxLines: null,
|
||||
minLines: null,
|
||||
keyboardType: TextInputType.multiline,
|
||||
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1),
|
||||
decoration: InputDecoration(
|
||||
isDense: true,
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
|
||||
hintText: 'Сообщение',
|
||||
hintStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w400, height: 1, color: Color(0xFFAEAEB2)),
|
||||
filled: true,
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
child: TextFormField(
|
||||
textCapitalization: TextCapitalization.sentences,
|
||||
controller: textEditingController,
|
||||
maxLines: 3,
|
||||
minLines: 1,
|
||||
keyboardType: TextInputType.multiline,
|
||||
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1),
|
||||
decoration: InputDecoration(
|
||||
isDense: true,
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
|
||||
hintText: 'Сообщение',
|
||||
hintStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w400, height: 1, color: Color(0xFFAEAEB2)),
|
||||
filled: true,
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -79,34 +79,30 @@ class _EmptyChatScreenState extends State<EmptyChatScreen> {
|
||||
),
|
||||
const SizedBox(width: 8),
|
||||
Expanded(
|
||||
child: SizedBox(
|
||||
height: 40,
|
||||
child: TextFormField(
|
||||
expands: true,
|
||||
textCapitalization: TextCapitalization.sentences,
|
||||
controller: textEditingController,
|
||||
maxLines: null,
|
||||
minLines: null,
|
||||
keyboardType: TextInputType.multiline,
|
||||
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1),
|
||||
decoration: InputDecoration(
|
||||
isDense: true,
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
|
||||
hintText: 'Сообщение',
|
||||
hintStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w400, height: 1, color: Color(0xFFAEAEB2)),
|
||||
filled: true,
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
child: TextFormField(
|
||||
textCapitalization: TextCapitalization.sentences,
|
||||
controller: textEditingController,
|
||||
maxLines: 3,
|
||||
minLines: 1,
|
||||
keyboardType: TextInputType.multiline,
|
||||
style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: Colors.black, height: 1),
|
||||
decoration: InputDecoration(
|
||||
isDense: true,
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 10),
|
||||
hintText: 'Сообщение',
|
||||
hintStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w400, height: 1, color: Color(0xFFAEAEB2)),
|
||||
filled: true,
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(100),
|
||||
borderSide: const BorderSide(color: Color(0xFFD1D1D6), width: 1),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
@@ -28,6 +28,7 @@ class ChatBubbleWidget extends StatelessWidget {
|
||||
required this.userSlug,
|
||||
this.messageType,
|
||||
this.isConsultant,
|
||||
this.urlsMediaInfo,
|
||||
});
|
||||
|
||||
final DateTime sendTime;
|
||||
@@ -40,6 +41,7 @@ class ChatBubbleWidget extends StatelessWidget {
|
||||
final String userSlug;
|
||||
final String? messageType;
|
||||
final bool? isConsultant;
|
||||
final List<Map<String, dynamic>>? urlsMediaInfo;
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final size = MediaQuery.sizeOf(context);
|
||||
@@ -127,7 +129,57 @@ class ChatBubbleWidget extends StatelessWidget {
|
||||
fileName = mediaItem.path.split('/').last;
|
||||
} else {
|
||||
final urlString = mediaItem.toString();
|
||||
fileName = urlString.contains('/') ? urlString.split('/').last.split('?').first : urlString.replaceAll('chat_files/', '');
|
||||
// Получаем расширение файла из URL
|
||||
String? fileExtension;
|
||||
final urlParts = urlString.split('/');
|
||||
if (urlParts.isNotEmpty) {
|
||||
final lastPart = urlParts.last.split('?').first;
|
||||
final dotIndex = lastPart.lastIndexOf('.');
|
||||
if (dotIndex != -1 && dotIndex < lastPart.length - 1) {
|
||||
fileExtension = lastPart.substring(dotIndex);
|
||||
}
|
||||
}
|
||||
|
||||
// Пытаемся найти имя файла в urls_media_info
|
||||
String? fileNameFromInfo;
|
||||
final mediaInfo = urlsMediaInfo;
|
||||
if (mediaInfo != null && mediaInfo.isNotEmpty) {
|
||||
for (final mediaInfoMap in mediaInfo) {
|
||||
// Каждый элемент urls_media_info - это Map, где ключ - это URL
|
||||
if (mediaInfoMap.isNotEmpty) {
|
||||
for (final entry in mediaInfoMap.entries) {
|
||||
final infoUrl = entry.key.toString();
|
||||
// Сравниваем полные URL или только имя файла
|
||||
if (infoUrl == urlString ||
|
||||
urlString.contains(infoUrl) ||
|
||||
infoUrl.contains(urlString) ||
|
||||
urlString.split('/').last == infoUrl.split('/').last) {
|
||||
final fileInfo = entry.value;
|
||||
if (fileInfo is Map<String, dynamic> && fileInfo.containsKey('name')) {
|
||||
final nameValue = fileInfo['name'];
|
||||
if (nameValue != null) {
|
||||
fileNameFromInfo = nameValue.toString();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fileNameFromInfo != null && fileNameFromInfo.isNotEmpty) break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (fileNameFromInfo != null && fileNameFromInfo.isNotEmpty) {
|
||||
// Добавляем расширение к названию файла, если его там нет
|
||||
if (fileExtension != null && !fileNameFromInfo.endsWith(fileExtension)) {
|
||||
fileName = '$fileNameFromInfo$fileExtension';
|
||||
} else {
|
||||
fileName = fileNameFromInfo;
|
||||
}
|
||||
} else {
|
||||
// Fallback к старой логике, если информации нет
|
||||
fileName = urlString.contains('/') ? urlString.split('/').last.split('?').first : urlString.replaceAll('chat_files/', '');
|
||||
}
|
||||
}
|
||||
|
||||
return ListTile(
|
||||
|
||||
Reference in New Issue
Block a user