lemmur-app-android/lib/pages/media_view.dart

124 lines
3.8 KiB
Dart
Raw Normal View History

2020-09-10 23:03:50 +02:00
import 'package:cached_network_image/cached_network_image.dart';
import 'package:esys_flutter_share/esys_flutter_share.dart';
2020-09-10 23:03:50 +02:00
import 'package:flutter/material.dart';
2020-09-11 10:54:03 +02:00
import 'package:flutter/services.dart';
2020-09-10 23:03:50 +02:00
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:photo_view/photo_view.dart';
import '../widgets/bottom_modal.dart';
2020-09-30 19:05:00 +02:00
/// View to interact with a media object. Zoom in/out, download, share, etc.
class MediaViewPage extends HookWidget {
2020-09-10 23:03:50 +02:00
final String url;
final GlobalKey<ScaffoldState> _key = GlobalKey();
2020-09-10 23:03:50 +02:00
MediaViewPage(this.url);
2020-09-10 23:03:50 +02:00
@override
Widget build(BuildContext context) {
final showButtons = useState(true);
final isZoomedOut = useState(true);
2020-09-10 23:03:50 +02:00
notImplemented() {
2021-01-03 19:43:39 +01:00
_key.currentState.showSnackBar(const SnackBar(
content: Text("this feature hasn't been implemented yet 😰")));
}
useEffect(() {
if (showButtons.value) {
SystemChrome.setEnabledSystemUIOverlays([
2020-09-11 10:54:03 +02:00
SystemUiOverlay.bottom,
SystemUiOverlay.top,
]);
} else {
SystemChrome.setEnabledSystemUIOverlays([]);
}
2020-09-13 21:15:20 +02:00
return null;
2020-09-13 18:16:53 +02:00
}, [showButtons.value]);
useEffect(
() => () => SystemChrome.setEnabledSystemUIOverlays([
SystemUiOverlay.bottom,
SystemUiOverlay.top,
]),
[]);
2020-09-11 10:54:03 +02:00
share() {
showModalBottomSheet(
backgroundColor: Colors.transparent,
context: context,
builder: (context) => BottomModal(
child: Column(
children: [
ListTile(
2021-01-03 19:43:39 +01:00
leading: const Icon(Icons.link),
title: const Text('Share link'),
onTap: () {
Navigator.of(context).pop();
Share.text('Share image url', url, 'text/plain');
},
),
ListTile(
2021-01-03 19:43:39 +01:00
leading: const Icon(Icons.image),
title: const Text('Share file'),
onTap: () {
Navigator.of(context).pop();
notImplemented();
// TODO: share file
},
),
],
),
),
);
}
2020-09-10 23:03:50 +02:00
return Scaffold(
key: _key,
extendBodyBehindAppBar: true,
extendBody: true,
2020-09-11 11:00:04 +02:00
appBar: showButtons.value
? AppBar(
backgroundColor: Colors.black38,
shadowColor: Colors.transparent,
2021-01-03 19:43:39 +01:00
leading: const CloseButton(),
2020-09-11 11:00:04 +02:00
actions: [
2020-09-10 23:03:50 +02:00
IconButton(
2021-01-03 19:43:39 +01:00
icon: const Icon(Icons.share),
2020-09-10 23:03:50 +02:00
tooltip: 'share',
onPressed: share,
2020-09-10 23:03:50 +02:00
),
IconButton(
2021-01-03 19:43:39 +01:00
icon: const Icon(Icons.file_download),
2020-09-10 23:03:50 +02:00
tooltip: 'download',
onPressed: notImplemented,
2020-09-10 23:03:50 +02:00
),
2020-09-11 11:00:04 +02:00
],
)
: null,
body: GestureDetector(
onTapUp: (details) => showButtons.value = !showButtons.value,
onVerticalDragEnd: isZoomedOut.value
? (details) {
if (details.primaryVelocity.abs() > 1000) {
Navigator.of(context).pop();
}
}
: null,
child: PhotoView(
scaleStateChangedCallback: (value) {
isZoomedOut.value = value == PhotoViewScaleState.zoomedOut ||
value == PhotoViewScaleState.initial;
},
minScale: PhotoViewComputedScale.contained,
initialScale: PhotoViewComputedScale.contained,
imageProvider: CachedNetworkImageProvider(url),
heroAttributes: PhotoViewHeroAttributes(tag: url),
loadingBuilder: (context, event) =>
2021-01-03 19:43:39 +01:00
const Center(child: CircularProgressIndicator()),
2020-09-10 23:03:50 +02:00
),
),
);
}
}