Files
YungR1otz/lib/features/discover/presentation/screens/discover_screen.dart
Lucas Saburido cabf2025cd first commit
2026-05-13 16:26:45 +01:00

92 lines
3.1 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../../../../core/theme/app_colors.dart';
import '../../../../core/widgets/riotz_scaffold.dart';
import '../../../music/presentation/widgets/track_card.dart';
import '../providers/discover_providers.dart';
class DiscoverScreen extends ConsumerStatefulWidget {
const DiscoverScreen({super.key});
@override
ConsumerState<DiscoverScreen> createState() => _DiscoverScreenState();
}
class _DiscoverScreenState extends ConsumerState<DiscoverScreen> {
final _searchController = TextEditingController();
String _query = '';
@override
void dispose() {
_searchController.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
final discoverAsync = ref.watch(discoverDataProvider);
return RiotzScaffold(
appBar: AppBar(title: const Text('RIOTZ // DISCOVER')),
body: RefreshIndicator(
color: AppColors.neonRed,
backgroundColor: AppColors.black,
onRefresh: () async => ref.invalidate(discoverDataProvider),
child: ListView(
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 24),
children: [
TextField(
controller: _searchController,
decoration: const InputDecoration(
prefixIcon: Icon(Icons.search, color: AppColors.white),
hintText: 'SEARCH THE VOID...',
),
onChanged: (value) => setState(() => _query = value.trim()),
),
const SizedBox(height: 32),
discoverAsync.when(
loading: () => const Center(child: Padding(padding: EdgeInsets.all(48), child: CircularProgressIndicator(color: AppColors.neonRed))),
error: (error, _) => Center(child: Text('DISCOVERY OFFLINE: $error')),
data: (data) => _buildDiscoveryContent(theme, data),
),
],
),
),
);
}
Widget _buildDiscoveryContent(ThemeData theme, data) {
// Logic previously implemented in discover_page.dart, now polished for discover_screen.dart
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
_SectionHeader(title: 'TRENDING AGENTS', count: data.trendingUsers.length),
const SizedBox(height: 40),
_SectionHeader(title: 'SONIC FREQUENCIES', count: data.trendingTracks.length),
const SizedBox(height: 16),
...data.trendingTracks.take(5).map((track) => TrackCard(track: track)),
],
);
}
}
class _SectionHeader extends StatelessWidget {
const _SectionHeader({required this.title, required this.count});
final String title;
final int count;
@override
Widget build(BuildContext context) {
final theme = Theme.of(context);
return Row(
children: [
Text(title, style: theme.textTheme.labelLarge?.copyWith(letterSpacing: 2)),
const Spacer(),
Text('[$count]', style: theme.textTheme.labelLarge?.copyWith(color: AppColors.neonRed)),
],
);
}
}