import 'package:flutter/material.dart'; import 'package:photo_view/photo_view.dart'; import 'package:veloe_kemono_party_flutter/pages/widgets/video_player_widget'; import '../models/post.dart'; class MediaCarouselItem { final String url; final String type; // 'image' or 'video' final int postIndex; final int attachmentIndex; MediaCarouselItem({ required this.url, required this.type, required this.postIndex, required this.attachmentIndex, }); } class MediaCarouselScreen extends StatefulWidget { final int initialIndex; final List mediaItems; final Future Function() loadMorePosts; final List allPosts; const MediaCarouselScreen({ super.key, required this.initialIndex, required this.mediaItems, required this.loadMorePosts, required this.allPosts, }); @override State createState() => _MediaCarouselScreenState(); } class _MediaCarouselScreenState extends State { late PageController _pageController; late int _currentIndex; late List _mediaItems; @override void initState() { super.initState(); _currentIndex = widget.initialIndex; _mediaItems = widget.mediaItems; _pageController = PageController(initialPage: widget.initialIndex); } @override Widget build(BuildContext context) { return Scaffold( backgroundColor: Colors.black, body: Stack( children: [ PageView.builder( controller: _pageController, itemCount: _mediaItems.length, onPageChanged: (index) { setState(() { _currentIndex = index; }); // Check if we are near the end and load more if (index >= _mediaItems.length - 3) { _loadMoreIfNeeded(); } }, itemBuilder: (context, index) { final item = _mediaItems[index]; if (item.type == 'image') { return PhotoView( imageProvider: NetworkImage(item.url), backgroundDecoration: const BoxDecoration(color: Colors.black), ); } else { return VideoPlayerWidget(videoUrl: item.url); } }, ), Positioned( top: 40, left: 20, child: IconButton( icon: const Icon(Icons.close, color: Colors.white), onPressed: () => Navigator.pop(context), ), ), ], ), ); } Future _loadMoreIfNeeded() async { if (_currentIndex >= _mediaItems.length - 3) { await widget.loadMorePosts(); setState(() { _mediaItems = _compileMediaItems(widget.allPosts); }); } } List _compileMediaItems(List posts) { List items = []; for (int i = 0; i < posts.length; i++) { final post = posts[i]; for (int j = 0; j < post.attachments.length; j++) { final attachment = post.attachments[j]; items.add( MediaCarouselItem( url: attachment.link, type: attachment.isImage ? "image" : "video", postIndex: i, attachmentIndex: j, ), ); } } return items; } }