This commit is contained in:
		@@ -1,4 +1,5 @@
 | 
				
			|||||||
import 'package:flutter/material.dart';
 | 
					import 'package:flutter/material.dart';
 | 
				
			||||||
 | 
					import 'package:flutter/services.dart';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
 | 
					import 'package:flutter_secure_storage/flutter_secure_storage.dart';
 | 
				
			||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
 | 
					import 'package:flutter_riverpod/flutter_riverpod.dart';
 | 
				
			||||||
@@ -232,10 +233,11 @@ final ThemeData f0ck95Theme = ThemeData(
 | 
				
			|||||||
    onPrimary: Colors.black,
 | 
					    onPrimary: Colors.black,
 | 
				
			||||||
    onSecondary: Colors.white,
 | 
					    onSecondary: Colors.white,
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  appBarTheme: const AppBarTheme(
 | 
					  appBarTheme: AppBarTheme(
 | 
				
			||||||
    backgroundColor: Color(0xFFC0C0C0),
 | 
					    backgroundColor: const Color(0xFFE0E0E0),
 | 
				
			||||||
    foregroundColor: Colors.black,
 | 
					    foregroundColor: Colors.black,
 | 
				
			||||||
    elevation: 2,
 | 
					    elevation: 4,
 | 
				
			||||||
 | 
					    centerTitle: true
 | 
				
			||||||
  ),
 | 
					  ),
 | 
				
			||||||
  textTheme: const TextTheme(
 | 
					  textTheme: const TextTheme(
 | 
				
			||||||
    bodyLarge: TextStyle(color: Colors.black),
 | 
					    bodyLarge: TextStyle(color: Colors.black),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -105,9 +105,7 @@ class _DetailViewState extends ConsumerState<DetailView> {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    if (itemIndex == -1) {
 | 
					    if (itemIndex == -1) {
 | 
				
			||||||
      Future.microtask(() {
 | 
					      Future.microtask(() {
 | 
				
			||||||
        ref
 | 
					        ref.read(mediaProvider.notifier).loadMedia(id: widget.initialItemId + 50);
 | 
				
			||||||
            .read(mediaProvider.notifier)
 | 
					 | 
				
			||||||
            .loadMedia(/*id: widget.initialItemId + 50*/);
 | 
					 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      return Scaffold(
 | 
					      return Scaffold(
 | 
				
			||||||
        appBar: AppBar(),
 | 
					        appBar: AppBar(),
 | 
				
			||||||
@@ -125,113 +123,7 @@ class _DetailViewState extends ConsumerState<DetailView> {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return Scaffold(
 | 
					    return Scaffold(
 | 
				
			||||||
      appBar: AppBar(
 | 
					 | 
				
			||||||
        centerTitle: true,
 | 
					 | 
				
			||||||
        title: Text('f0ck #${mediaState.mediaItems[_currentIndex].id}'),
 | 
					 | 
				
			||||||
        automaticallyImplyLeading: false,
 | 
					 | 
				
			||||||
        leading: IconButton(
 | 
					 | 
				
			||||||
          icon: const Icon(Icons.arrow_back),
 | 
					 | 
				
			||||||
          onPressed: () {
 | 
					 | 
				
			||||||
            context.canPop() ? context.pop() : context.go('/', extra: true);
 | 
					 | 
				
			||||||
          },
 | 
					 | 
				
			||||||
        ),
 | 
					 | 
				
			||||||
        actions: [
 | 
					 | 
				
			||||||
          IconButton(
 | 
					 | 
				
			||||||
            icon: const Icon(Icons.fullscreen),
 | 
					 | 
				
			||||||
            onPressed: () {
 | 
					 | 
				
			||||||
              final mediaState = ref.read(mediaProvider);
 | 
					 | 
				
			||||||
              final currentItem = mediaState.mediaItems[_currentIndex];
 | 
					 | 
				
			||||||
              Navigator.of(context).push(
 | 
					 | 
				
			||||||
                MaterialPageRoute(
 | 
					 | 
				
			||||||
                  builder: (_) => FullScreenMediaView(item: currentItem),
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
              );
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
          IconButton(
 | 
					 | 
				
			||||||
            icon: const Icon(Icons.download),
 | 
					 | 
				
			||||||
            onPressed: _downloadMedia,
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
          PopupMenuButton<String>(
 | 
					 | 
				
			||||||
            onSelected: (value) async {
 | 
					 | 
				
			||||||
              final item = mediaState.mediaItems[_currentIndex];
 | 
					 | 
				
			||||||
              switch (value) {
 | 
					 | 
				
			||||||
                case 'media':
 | 
					 | 
				
			||||||
                  File file = await DefaultCacheManager().getSingleFile(
 | 
					 | 
				
			||||||
                    item.mediaUrl,
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
                  Uint8List bytes = await file.readAsBytes();
 | 
					 | 
				
			||||||
                  final params = ShareParams(
 | 
					 | 
				
			||||||
                    files: [XFile.fromData(bytes, mimeType: item.mime)],
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
                  await SharePlus.instance.share(params);
 | 
					 | 
				
			||||||
                  break;
 | 
					 | 
				
			||||||
                case 'direct_link':
 | 
					 | 
				
			||||||
                  await SharePlus.instance.share(
 | 
					 | 
				
			||||||
                    ShareParams(text: item.mediaUrl),
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
                  break;
 | 
					 | 
				
			||||||
                case 'post_link':
 | 
					 | 
				
			||||||
                  await SharePlus.instance.share(
 | 
					 | 
				
			||||||
                    ShareParams(text: item.postUrl),
 | 
					 | 
				
			||||||
                  );
 | 
					 | 
				
			||||||
                  break;
 | 
					 | 
				
			||||||
              }
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
            itemBuilder: (context) => [
 | 
					 | 
				
			||||||
              PopupMenuItem(
 | 
					 | 
				
			||||||
                value: 'media',
 | 
					 | 
				
			||||||
                child: ListTile(
 | 
					 | 
				
			||||||
                  leading: const Icon(Icons.image),
 | 
					 | 
				
			||||||
                  title: const Text('Als Datei'),
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
              ),
 | 
					 | 
				
			||||||
              PopupMenuItem(
 | 
					 | 
				
			||||||
                value: 'direct_link',
 | 
					 | 
				
			||||||
                child: ListTile(
 | 
					 | 
				
			||||||
                  leading: const Icon(Icons.link),
 | 
					 | 
				
			||||||
                  title: const Text('Link zur Datei'),
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
              ),
 | 
					 | 
				
			||||||
              PopupMenuItem(
 | 
					 | 
				
			||||||
                value: 'post_link',
 | 
					 | 
				
			||||||
                child: ListTile(
 | 
					 | 
				
			||||||
                  leading: const Icon(Icons.article),
 | 
					 | 
				
			||||||
                  title: const Text('Link zum f0ck'),
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
              ),
 | 
					 | 
				
			||||||
            ],
 | 
					 | 
				
			||||||
            icon: const Icon(Icons.share),
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
          Builder(
 | 
					 | 
				
			||||||
            builder: (context) {
 | 
					 | 
				
			||||||
              return IconButton(
 | 
					 | 
				
			||||||
                icon: const Icon(Icons.menu),
 | 
					 | 
				
			||||||
                onPressed: () {
 | 
					 | 
				
			||||||
                  Scaffold.of(context).openEndDrawer();
 | 
					 | 
				
			||||||
                },
 | 
					 | 
				
			||||||
              );
 | 
					 | 
				
			||||||
            },
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
        ],
 | 
					 | 
				
			||||||
      ),
 | 
					 | 
				
			||||||
      endDrawer: EndDrawer(ref: ref),
 | 
					      endDrawer: EndDrawer(ref: ref),
 | 
				
			||||||
      body: Stack(
 | 
					 | 
				
			||||||
        children: [
 | 
					 | 
				
			||||||
          PageTransformer(
 | 
					 | 
				
			||||||
            controller: _pageController!,
 | 
					 | 
				
			||||||
            pages: mediaState.mediaItems.map((item) {
 | 
					 | 
				
			||||||
              int itemIndex = mediaState.mediaItems.indexOf(item);
 | 
					 | 
				
			||||||
              return SafeArea(
 | 
					 | 
				
			||||||
                child: SmartRefreshIndicator(
 | 
					 | 
				
			||||||
                  onRefresh: _loadMoreMedia,
 | 
					 | 
				
			||||||
                  child: _buildMediaItem(item, _currentIndex == itemIndex),
 | 
					 | 
				
			||||||
                ),
 | 
					 | 
				
			||||||
              );
 | 
					 | 
				
			||||||
            }).toList(),
 | 
					 | 
				
			||||||
          ),
 | 
					 | 
				
			||||||
        ],
 | 
					 | 
				
			||||||
      ),
 | 
					 | 
				
			||||||
      persistentFooterButtons: mediaState.tag != null
 | 
					      persistentFooterButtons: mediaState.tag != null
 | 
				
			||||||
          ? [
 | 
					          ? [
 | 
				
			||||||
              Center(
 | 
					              Center(
 | 
				
			||||||
@@ -245,6 +137,120 @@ class _DetailViewState extends ConsumerState<DetailView> {
 | 
				
			|||||||
              ),
 | 
					              ),
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
          : null,
 | 
					          : null,
 | 
				
			||||||
 | 
					      body: CustomScrollView(
 | 
				
			||||||
 | 
					        slivers: [
 | 
				
			||||||
 | 
					          SliverAppBar(
 | 
				
			||||||
 | 
					            floating: true,
 | 
				
			||||||
 | 
					            pinned: true,
 | 
				
			||||||
 | 
					            snap: true,
 | 
				
			||||||
 | 
					            centerTitle: true,
 | 
				
			||||||
 | 
					            title: Text('f0ck #${mediaState.mediaItems[_currentIndex].id}'),
 | 
				
			||||||
 | 
					            leading: IconButton(
 | 
				
			||||||
 | 
					              icon: const Icon(Icons.arrow_back),
 | 
				
			||||||
 | 
					              onPressed: () {
 | 
				
			||||||
 | 
					                context.canPop() ? context.pop() : context.go('/', extra: true);
 | 
				
			||||||
 | 
					              },
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					            actions: [
 | 
				
			||||||
 | 
					              IconButton(
 | 
				
			||||||
 | 
					                icon: const Icon(Icons.fullscreen),
 | 
				
			||||||
 | 
					                onPressed: () {
 | 
				
			||||||
 | 
					                  final currentItem = mediaState.mediaItems[_currentIndex];
 | 
				
			||||||
 | 
					                  Navigator.of(context).push(
 | 
				
			||||||
 | 
					                    MaterialPageRoute(
 | 
				
			||||||
 | 
					                      builder: (_) => FullScreenMediaView(item: currentItem),
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					              IconButton(
 | 
				
			||||||
 | 
					                icon: const Icon(Icons.download),
 | 
				
			||||||
 | 
					                onPressed: _downloadMedia,
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					              PopupMenuButton<String>(
 | 
				
			||||||
 | 
					                onSelected: (value) async {
 | 
				
			||||||
 | 
					                  final item = mediaState.mediaItems[_currentIndex];
 | 
				
			||||||
 | 
					                  switch (value) {
 | 
				
			||||||
 | 
					                    case 'media':
 | 
				
			||||||
 | 
					                      File file = await DefaultCacheManager().getSingleFile(
 | 
				
			||||||
 | 
					                        item.mediaUrl,
 | 
				
			||||||
 | 
					                      );
 | 
				
			||||||
 | 
					                      Uint8List bytes = await file.readAsBytes();
 | 
				
			||||||
 | 
					                      final params = ShareParams(
 | 
				
			||||||
 | 
					                        files: [XFile.fromData(bytes, mimeType: item.mime)],
 | 
				
			||||||
 | 
					                      );
 | 
				
			||||||
 | 
					                      await SharePlus.instance.share(params);
 | 
				
			||||||
 | 
					                      break;
 | 
				
			||||||
 | 
					                    case 'direct_link':
 | 
				
			||||||
 | 
					                      await SharePlus.instance.share(
 | 
				
			||||||
 | 
					                        ShareParams(text: item.mediaUrl),
 | 
				
			||||||
 | 
					                      );
 | 
				
			||||||
 | 
					                      break;
 | 
				
			||||||
 | 
					                    case 'post_link':
 | 
				
			||||||
 | 
					                      await SharePlus.instance.share(
 | 
				
			||||||
 | 
					                        ShareParams(text: item.postUrl),
 | 
				
			||||||
 | 
					                      );
 | 
				
			||||||
 | 
					                      break;
 | 
				
			||||||
 | 
					                  }
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                itemBuilder: (context) => [
 | 
				
			||||||
 | 
					                  PopupMenuItem(
 | 
				
			||||||
 | 
					                    value: 'media',
 | 
				
			||||||
 | 
					                    child: ListTile(
 | 
				
			||||||
 | 
					                      leading: const Icon(Icons.image),
 | 
				
			||||||
 | 
					                      title: const Text('Als Datei'),
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                  ),
 | 
				
			||||||
 | 
					                  PopupMenuItem(
 | 
				
			||||||
 | 
					                    value: 'direct_link',
 | 
				
			||||||
 | 
					                    child: ListTile(
 | 
				
			||||||
 | 
					                      leading: const Icon(Icons.link),
 | 
				
			||||||
 | 
					                      title: const Text('Link zur Datei'),
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                  ),
 | 
				
			||||||
 | 
					                  PopupMenuItem(
 | 
				
			||||||
 | 
					                    value: 'post_link',
 | 
				
			||||||
 | 
					                    child: ListTile(
 | 
				
			||||||
 | 
					                      leading: const Icon(Icons.article),
 | 
				
			||||||
 | 
					                      title: const Text('Link zum f0ck'),
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                  ),
 | 
				
			||||||
 | 
					                ],
 | 
				
			||||||
 | 
					                icon: const Icon(Icons.share),
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					              Builder(
 | 
				
			||||||
 | 
					                builder: (context) => IconButton(
 | 
				
			||||||
 | 
					                  icon: const Icon(Icons.menu),
 | 
				
			||||||
 | 
					                  onPressed: () {
 | 
				
			||||||
 | 
					                    Scaffold.of(context).openEndDrawer();
 | 
				
			||||||
 | 
					                  },
 | 
				
			||||||
 | 
					                ),
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					            ],
 | 
				
			||||||
 | 
					            flexibleSpace: FlexibleSpaceBar(
 | 
				
			||||||
 | 
					              background: Container(color: Colors.transparent),
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					          SliverPadding(
 | 
				
			||||||
 | 
					            padding: EdgeInsets.zero,
 | 
				
			||||||
 | 
					            sliver: SliverFillRemaining(
 | 
				
			||||||
 | 
					              child: PageTransformer(
 | 
				
			||||||
 | 
					                controller: _pageController!,
 | 
				
			||||||
 | 
					                pages: mediaState.mediaItems.map((item) {
 | 
				
			||||||
 | 
					                  int pageIndex = mediaState.mediaItems.indexOf(item);
 | 
				
			||||||
 | 
					                  return SafeArea(
 | 
				
			||||||
 | 
					                    top: false,
 | 
				
			||||||
 | 
					                    child: SmartRefreshIndicator(
 | 
				
			||||||
 | 
					                      onRefresh: _loadMoreMedia,
 | 
				
			||||||
 | 
					                      child: _buildMediaItem(item, _currentIndex == pageIndex),
 | 
				
			||||||
 | 
					                    ),
 | 
				
			||||||
 | 
					                  );
 | 
				
			||||||
 | 
					                }).toList(),
 | 
				
			||||||
 | 
					              ),
 | 
				
			||||||
 | 
					            ),
 | 
				
			||||||
 | 
					          ),
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
    );
 | 
					    );
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -258,8 +264,10 @@ class _DetailViewState extends ConsumerState<DetailView> {
 | 
				
			|||||||
            CachedNetworkImage(
 | 
					            CachedNetworkImage(
 | 
				
			||||||
              imageUrl: item.mediaUrl,
 | 
					              imageUrl: item.mediaUrl,
 | 
				
			||||||
              fit: BoxFit.contain,
 | 
					              fit: BoxFit.contain,
 | 
				
			||||||
              placeholder: (context, url) => const CircularProgressIndicator(),
 | 
					              placeholder: (context, url) =>
 | 
				
			||||||
              errorWidget: (context, url, error) => const Icon(Icons.error),
 | 
					                  const Center(child: CircularProgressIndicator()),
 | 
				
			||||||
 | 
					              errorWidget: (context, url, error) =>
 | 
				
			||||||
 | 
					                  const Center(child: Icon(Icons.error)),
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
          else
 | 
					          else
 | 
				
			||||||
            VideoWidget(details: item, isActive: isActive),
 | 
					            VideoWidget(details: item, isActive: isActive),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,7 +62,7 @@ class _FullScreenMediaViewState extends State<FullScreenMediaView> {
 | 
				
			|||||||
            child: Align(
 | 
					            child: Align(
 | 
				
			||||||
              alignment: Alignment.topLeft,
 | 
					              alignment: Alignment.topLeft,
 | 
				
			||||||
              child: IconButton(
 | 
					              child: IconButton(
 | 
				
			||||||
                icon: const Icon(Icons.arrow_back),
 | 
					                icon: const Icon(Icons.arrow_back, color: Colors.white),
 | 
				
			||||||
                onPressed: () => Navigator.of(context).pop(),
 | 
					                onPressed: () => Navigator.of(context).pop(),
 | 
				
			||||||
              ),
 | 
					              ),
 | 
				
			||||||
            ),
 | 
					            ),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -16,7 +16,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
 | 
				
			|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
 | 
					# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
 | 
				
			||||||
# In Windows, build-name is used as the major, minor, and patch parts
 | 
					# In Windows, build-name is used as the major, minor, and patch parts
 | 
				
			||||||
# of the product and file versions while build-number is used as the build suffix.
 | 
					# of the product and file versions while build-number is used as the build suffix.
 | 
				
			||||||
version: 1.1.20+50
 | 
					version: 1.1.21+51
 | 
				
			||||||
 | 
					
 | 
				
			||||||
environment:
 | 
					environment:
 | 
				
			||||||
  sdk: ^3.9.0-100.2.beta
 | 
					  sdk: ^3.9.0-100.2.beta
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user