114 lines
4.2 KiB
Dart
114 lines
4.2 KiB
Dart
import 'package:easy_localization/easy_localization.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:flutter_card_swiper/flutter_card_swiper.dart';
|
|
import 'package:flutter_hooks/flutter_hooks.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:island/widgets/app_scaffold.dart';
|
|
import 'package:island/widgets/post/post_item.dart';
|
|
import 'package:island/widgets/post/post_list.dart';
|
|
import 'package:material_symbols_icons/symbols.dart';
|
|
import 'package:styled_widget/styled_widget.dart';
|
|
|
|
class PostShuffleScreen extends HookConsumerWidget {
|
|
const PostShuffleScreen({super.key});
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
final postListState = ref.watch(postListNotifierProvider(shuffle: true));
|
|
final postListNotifier = ref.watch(
|
|
postListNotifierProvider(shuffle: true).notifier,
|
|
);
|
|
|
|
final cardSwiperController = useMemoized(() => CardSwiperController(), []);
|
|
|
|
useEffect(() {
|
|
return cardSwiperController.dispose;
|
|
}, []);
|
|
|
|
const kBottomControlHeight = 64.0;
|
|
|
|
return AppScaffold(
|
|
appBar: AppBar(title: const Text('postShuffle').tr()),
|
|
body: Stack(
|
|
children: [
|
|
Padding(
|
|
padding: EdgeInsets.only(
|
|
bottom:
|
|
kBottomControlHeight + MediaQuery.of(context).padding.bottom,
|
|
),
|
|
child:
|
|
(postListState.value?.items.length ?? 0) > 0
|
|
? CardSwiper(
|
|
controller: cardSwiperController,
|
|
cardsCount: postListState.value!.items.length,
|
|
cardBuilder: (
|
|
context,
|
|
index,
|
|
horizontalOffsetPercentage,
|
|
verticalOffsetPercentage,
|
|
) {
|
|
return Center(
|
|
child: ConstrainedBox(
|
|
constraints: BoxConstraints(maxWidth: 540),
|
|
child: SingleChildScrollView(
|
|
child: Card(
|
|
margin: EdgeInsets.zero,
|
|
child: ClipRRect(
|
|
borderRadius: const BorderRadius.all(
|
|
Radius.circular(8),
|
|
),
|
|
child: PostActionableItem(
|
|
item: postListState.value!.items[index],
|
|
),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
);
|
|
},
|
|
onEnd: () {
|
|
if (postListState.value?.hasMore ?? true) {
|
|
postListNotifier.fetch(
|
|
cursor: postListState.value?.nextCursor,
|
|
);
|
|
}
|
|
},
|
|
)
|
|
: Center(child: CircularProgressIndicator()),
|
|
),
|
|
Positioned(
|
|
left: 0,
|
|
right: 0,
|
|
bottom: 0,
|
|
child: Container(
|
|
color: Theme.of(context).colorScheme.surfaceContainer,
|
|
padding: EdgeInsets.only(
|
|
bottom: MediaQuery.of(context).padding.bottom,
|
|
),
|
|
height: kBottomControlHeight,
|
|
child:
|
|
Row(
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
IconButton(
|
|
onPressed: () {
|
|
cardSwiperController.undo();
|
|
},
|
|
icon: const Icon(Symbols.arrow_left_alt),
|
|
),
|
|
IconButton(
|
|
onPressed: () {
|
|
cardSwiperController.swipe(CardSwiperDirection.right);
|
|
},
|
|
icon: const Icon(Symbols.arrow_right_alt),
|
|
),
|
|
],
|
|
).padding(all: 8).center(),
|
|
),
|
|
),
|
|
],
|
|
),
|
|
);
|
|
}
|
|
}
|