import 'package:flutter/material.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:provider/provider.dart'; import 'package:f0ckapp/screens/DetailView.dart'; import 'package:f0ckapp/services/Api.dart'; import 'package:f0ckapp/providers/MediaProvider.dart'; class MediaGrid extends StatefulWidget { const MediaGrid({super.key}); @override State createState() => _MediaGridState(); } class _MediaGridState extends State { final ScrollController _scrollController = ScrollController(); @override void initState() { super.initState(); final provider = Provider.of(context, listen: false); Future.microtask(() { provider.loadMedia(); }); _scrollController.addListener(() { if (_scrollController.position.pixels >= _scrollController.position.maxScrollExtent - 100) { provider.loadMedia(); } }); } @override Widget build(BuildContext context) { final provider = Provider.of(context); final GlobalKey scaffoldKey = GlobalKey(); return Scaffold( key: scaffoldKey, appBar: AppBar( //centerTitle: true, title: Text('f0ck v1.0.26+26'), actions: [ DropdownButton( // mode value: provider.modes[provider.mode], isDense: true, icon: SizedBox.shrink(), items: provider.modes.map((String value) { return DropdownMenuItem(value: value, child: Text(value)); }).toList(), onChanged: (String? newValue) { if (newValue != null) { provider.setMode(provider.modes.indexOf(newValue)); } }, ), IconButton( icon: const Icon(Icons.menu), onPressed: () { scaffoldKey.currentState?.openEndDrawer(); }, ), ], ), endDrawer: Drawer( child: ListView( padding: EdgeInsets.zero, children: [ DrawerHeader( padding: EdgeInsets.all(0), child: Image.asset('assets/images/menu.webp', fit: BoxFit.cover), ), ListTile( title: Text( 'All', style: TextStyle( fontWeight: provider.type == 'alles' ? FontWeight.bold : FontWeight.normal, color: provider.type == 'alles' ? Colors.blue : Colors.white, ), ), onTap: () { provider.setType('all'); }, ), ListTile( title: Text( 'Images', style: TextStyle( fontWeight: provider.type == 'image' ? FontWeight.bold : FontWeight.normal, color: provider.type == 'image' ? Colors.blue : Colors.white, ), ), onTap: () { provider.setType('image'); }, ), ListTile( title: Text( 'Videos', style: TextStyle( fontWeight: provider.type == 'video' ? FontWeight.bold : FontWeight.normal, color: provider.type == 'video' ? Colors.blue : Colors.white, ), ), onTap: () { provider.setType('video'); }, ), ListTile( title: Text( 'Audio', style: TextStyle( fontWeight: provider.type == 'audio' ? FontWeight.bold : FontWeight.normal, color: provider.type == 'audio' ? Colors.blue : Colors.white, ), ), onTap: () { provider.setType('audio'); }, ), ], ), ), persistentFooterButtons: provider.tag != null ? [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text('tag: '), InputChip( label: Text(provider.tag!), backgroundColor: const Color(0xFF090909), labelStyle: const TextStyle(color: Colors.white), onDeleted: () { provider.setTag(null); }, ), ], ), ] : null, body: RefreshIndicator( onRefresh: () async { await provider.loadMedia(reload: true); }, child: Consumer( builder: (context, mediaProvider, child) { return GridView.builder( controller: _scrollController, gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: mediaProvider.crossAxisCount == 0 ? (MediaQuery.of(context).size.width / 110) .clamp(3, 5) .toInt() : mediaProvider.crossAxisCount, crossAxisSpacing: 5.0, mainAxisSpacing: 5.0, ), itemCount: provider.mediaItems.length + (provider.isLoading ? 1 : 0), itemBuilder: (context, index) { if (index >= provider.mediaItems.length) { return const Center(child: CircularProgressIndicator()); } final item = provider.mediaItems[index]; return InkWell( onTap: () => Navigator.push( context, MaterialPageRoute( builder: (context) => DetailView(initialItemId: item.id), ), ), child: Stack( fit: StackFit.expand, children: [ CachedNetworkImage( imageUrl: item.thumbnailUrl, fit: BoxFit.cover, placeholder: (context, url) => SizedBox.shrink(), errorWidget: (context, url, error) => Icon(Icons.error), ), Align( alignment: FractionalOffset.bottomRight, child: Icon( Icons.square, color: switch (item.mode) { 1 => Colors.green, 2 => Colors.red, _ => Colors.yellow, }, size: 15.0, ), ), ], ), ); }, ); }, ), ), ); } }