mirror of
https://github.com/nostrlabs-io/zap-stream-flutter.git
synced 2025-06-15 19:48:23 +00:00
113 lines
4.0 KiB
Dart
113 lines
4.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:ndk/ndk.dart';
|
|
import 'package:zap_stream_flutter/i18n/strings.g.dart';
|
|
import 'package:zap_stream_flutter/imgproxy.dart';
|
|
import 'package:zap_stream_flutter/theme.dart';
|
|
import 'package:zap_stream_flutter/utils.dart';
|
|
import 'package:zap_stream_flutter/widgets/avatar.dart';
|
|
import 'package:zap_stream_flutter/widgets/pill.dart';
|
|
import 'package:zap_stream_flutter/widgets/profile.dart';
|
|
|
|
class StreamTileWidget extends StatelessWidget {
|
|
final StreamEvent stream;
|
|
|
|
const StreamTileWidget(this.stream, {super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return GestureDetector(
|
|
onTap: () {
|
|
context.push("/e/${stream.link}", extra: stream);
|
|
},
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
spacing: 8,
|
|
children: [
|
|
Container(
|
|
decoration: BoxDecoration(borderRadius: DEFAULT_BR, color: LAYER_1),
|
|
clipBehavior: Clip.antiAlias,
|
|
child: AspectRatio(
|
|
aspectRatio: 16 / 9,
|
|
child: Stack(
|
|
children: [
|
|
Center(
|
|
child: ProxyImg(
|
|
url: stream.info.image ?? "",
|
|
placeholderSize: 100,
|
|
),
|
|
),
|
|
if (stream.info.status != null)
|
|
Positioned(
|
|
right: 8,
|
|
top: 8,
|
|
child: PillWidget(
|
|
color: switch (stream.info.status) {
|
|
StreamStatus.live => Theme.of(context).highlightColor,
|
|
_ => LAYER_3,
|
|
},
|
|
child: Text(
|
|
switch (stream.info.status!) {
|
|
StreamStatus.live => t.stream.status.live,
|
|
StreamStatus.ended => t.stream.status.ended,
|
|
StreamStatus.planned => t.stream.status.planned,
|
|
},
|
|
style: TextStyle(
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.w600,
|
|
fontSize: 14,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
if (stream.info.participants != null)
|
|
Positioned(
|
|
right: 8,
|
|
bottom: 8,
|
|
child: PillWidget(
|
|
color: LAYER_1.withAlpha(200),
|
|
child: Text(
|
|
t.viewers(n: stream.info.participants!),
|
|
style: TextStyle(
|
|
color: Colors.white,
|
|
fontWeight: FontWeight.w600,
|
|
fontSize: 14,
|
|
),
|
|
),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
),
|
|
ProfileLoaderWidget(stream.info.host, (context, state) {
|
|
final profile = state.data ?? Metadata(pubKey: stream.info.host);
|
|
return Row(
|
|
spacing: 8,
|
|
children: [
|
|
AvatarWidget(profile: profile),
|
|
Expanded(
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
stream.info.title ?? "",
|
|
overflow: TextOverflow.clip,
|
|
style: TextStyle(fontWeight: FontWeight.w500),
|
|
),
|
|
ProfileNameWidget(
|
|
profile: profile,
|
|
style: TextStyle(color: LAYER_4),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
],
|
|
);
|
|
}),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|