90 lines
2.9 KiB
Dart
90 lines
2.9 KiB
Dart
|
import 'dart:convert';
|
||
|
|
||
|
import 'package:avatar_stack/avatar_stack.dart';
|
||
|
import 'package:cached_network_image/cached_network_image.dart';
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:get/get.dart';
|
||
|
import 'package:solian/models/account.dart';
|
||
|
import 'package:solian/models/call.dart';
|
||
|
import 'package:solian/models/channel.dart';
|
||
|
import 'package:solian/platform.dart';
|
||
|
import 'package:solian/providers/call.dart';
|
||
|
import 'package:solian/widgets/chat/call/call_prejoin.dart';
|
||
|
|
||
|
class ChannelCallIndicator extends StatelessWidget {
|
||
|
final Channel channel;
|
||
|
final Call ongoingCall;
|
||
|
|
||
|
const ChannelCallIndicator(
|
||
|
{super.key, required this.channel, required this.ongoingCall});
|
||
|
|
||
|
void _showCallPrejoin(BuildContext context) {
|
||
|
showModalBottomSheet(
|
||
|
useRootNavigator: true,
|
||
|
context: context,
|
||
|
builder: (context) => ChatCallPrejoinPopup(
|
||
|
ongoingCall: ongoingCall,
|
||
|
channel: channel,
|
||
|
),
|
||
|
);
|
||
|
}
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
final ChatCallProvider call = Get.find();
|
||
|
|
||
|
return MaterialBanner(
|
||
|
padding: const EdgeInsets.only(left: 16, top: 4, bottom: 4),
|
||
|
leading: const Icon(Icons.call_received),
|
||
|
backgroundColor: Theme.of(context).colorScheme.surfaceContainer,
|
||
|
dividerColor: Colors.transparent,
|
||
|
content: Row(
|
||
|
children: [
|
||
|
if (ongoingCall.participants.isEmpty) Text('callOngoingEmpty'.tr),
|
||
|
if (ongoingCall.participants.isNotEmpty)
|
||
|
Text('callOngoingParticipants'.trParams({
|
||
|
'count': ongoingCall.participants.length.toString(),
|
||
|
})),
|
||
|
const SizedBox(width: 6),
|
||
|
if (ongoingCall.participants.isNotEmpty)
|
||
|
Container(
|
||
|
height: 28,
|
||
|
constraints: const BoxConstraints(maxWidth: 120),
|
||
|
child: AvatarStack(
|
||
|
height: 28,
|
||
|
borderWidth: 0,
|
||
|
avatars: ongoingCall.participants.map((x) {
|
||
|
final userinfo = Account.fromJson(jsonDecode(x['metadata']));
|
||
|
return PlatformInfo.canCacheImage
|
||
|
? CachedNetworkImageProvider(userinfo.avatar)
|
||
|
as ImageProvider
|
||
|
: NetworkImage(userinfo.avatar) as ImageProvider;
|
||
|
}).toList(),
|
||
|
),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
actions: [
|
||
|
Obx(() {
|
||
|
if (call.current.value == null) {
|
||
|
return TextButton(
|
||
|
onPressed: () => _showCallPrejoin(context),
|
||
|
child: Text('callJoin'.tr),
|
||
|
);
|
||
|
} else if (call.channel.value?.id == channel.id) {
|
||
|
return TextButton(
|
||
|
onPressed: () => call.gotoScreen(context),
|
||
|
child: Text('callResume'.tr),
|
||
|
);
|
||
|
} else {
|
||
|
return TextButton(
|
||
|
onPressed: null,
|
||
|
child: Text('callJoin'.tr),
|
||
|
);
|
||
|
}
|
||
|
})
|
||
|
],
|
||
|
);
|
||
|
}
|
||
|
}
|