Files
zap-stream-flutter/lib/pages/profile.dart
2025-05-26 13:28:00 +01:00

120 lines
4.0 KiB
Dart

import 'package:flutter/widgets.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/const.dart';
import 'package:zap_stream_flutter/rx_filter.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/button.dart';
import 'package:zap_stream_flutter/widgets/button_follow.dart';
import 'package:zap_stream_flutter/widgets/header.dart';
import 'package:zap_stream_flutter/widgets/nostr_text.dart';
import 'package:zap_stream_flutter/widgets/profile.dart';
import 'package:zap_stream_flutter/widgets/stream_grid.dart';
class ProfilePage extends StatelessWidget {
final String pubkey;
const ProfilePage({super.key, required this.pubkey});
@override
Widget build(BuildContext context) {
final hexPubkey = bech32ToHex(pubkey);
final isMe = ndk.accounts.getPublicKey() == hexPubkey;
return ProfileLoaderWidget(hexPubkey, (ctx, state) {
final profile = state.data ?? Metadata(pubKey: hexPubkey);
return SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
spacing: 16,
children: [
HeaderWidget(),
if (profile.banner != null)
SizedBox(
height: 140,
width: double.maxFinite,
child: ProxyImg(url: profile.banner!),
),
Row(
spacing: 8,
children: [
AvatarWidget(profile: profile, size: 80),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
ProfileNameWidget(
profile: profile,
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.w600,
),
),
Text.rich(
TextSpan(
style: TextStyle(color: LAYER_5),
children: textToSpans(
profile.about ?? "",
[],
profile.pubKey,
),
),
),
],
),
),
],
),
if (isMe)
Row(
spacing: 8,
children: [
BasicButton.text(
t.button.logout,
onTap: (context) {
loginData.logout();
ndk.accounts.logout();
context.go("/");
},
),
BasicButton.text(
t.button.edit_profile,
onTap: (context) {
context.push("/settings/profile");
},
),
],
),
if (!isMe) FollowButton(pubkey: hexPubkey),
Text(
t.profile.past_streams,
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w600),
),
RxFilter<Nip01Event>(
Key("profile-streams:$hexPubkey"),
filters: [
Filter(kinds: [30_311], limit: 100, pTags: [hexPubkey]),
Filter(kinds: [30_311], limit: 100, authors: [hexPubkey]),
],
builder: (ctx, state) {
return StreamGrid(
events: state ?? [],
showLive: true,
showEnded: true,
showPlanned: true,
);
},
),
],
),
);
});
}
}