|
@@ -3,6 +3,7 @@ import 'package:flutter_widget_from_html/flutter_widget_from_html.dart';
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
import 'package:url_launcher/url_launcher.dart';
|
|
import 'package:veloe_kemono_party_flutter/models/attachment.dart';
|
|
import 'package:veloe_kemono_party_flutter/models/attachment.dart';
|
|
import 'smart_image_container.dart';
|
|
import 'smart_image_container.dart';
|
|
|
|
+import 'package:share_plus/share_plus.dart';
|
|
import '../../models/post.dart';
|
|
import '../../models/post.dart';
|
|
|
|
|
|
class PostContainer extends StatelessWidget {
|
|
class PostContainer extends StatelessWidget {
|
|
@@ -118,7 +119,8 @@ class _PostActionsFooter extends StatelessWidget {
|
|
}
|
|
}
|
|
|
|
|
|
void _sharePost(Post post) {
|
|
void _sharePost(Post post) {
|
|
- //create link to share
|
|
|
|
|
|
+ var link = 'https://kemono.su/${post.service}/user/${post.user}/post/${post.id}';
|
|
|
|
+ Share.share(link);
|
|
}
|
|
}
|
|
|
|
|
|
class _PostContentSection extends StatelessWidget {
|
|
class _PostContentSection extends StatelessWidget {
|
|
@@ -128,6 +130,10 @@ class _PostContentSection extends StatelessWidget {
|
|
|
|
|
|
@override
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
Widget build(BuildContext context) {
|
|
|
|
+ final imageAttachments = post.attachments
|
|
|
|
+ .where((a) => _isImageFile(a.link))
|
|
|
|
+ .toList();
|
|
|
|
+
|
|
return Column(
|
|
return Column(
|
|
mainAxisSize: MainAxisSize.min,
|
|
mainAxisSize: MainAxisSize.min,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
@@ -140,7 +146,7 @@ class _PostContentSection extends StatelessWidget {
|
|
),
|
|
),
|
|
|
|
|
|
// Attachments Grid
|
|
// Attachments Grid
|
|
- if (post.attachments.isNotEmpty)
|
|
|
|
|
|
+ if (imageAttachments.isNotEmpty)
|
|
LayoutBuilder(
|
|
LayoutBuilder(
|
|
builder: (context, constraints) {
|
|
builder: (context, constraints) {
|
|
return Column(
|
|
return Column(
|
|
@@ -152,11 +158,11 @@ class _PostContentSection extends StatelessWidget {
|
|
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
|
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
|
|
crossAxisCount: _calculateColumnCount(constraints.maxWidth),
|
|
crossAxisCount: _calculateColumnCount(constraints.maxWidth),
|
|
),
|
|
),
|
|
- itemCount: post.attachments.length,
|
|
|
|
|
|
+ itemCount: imageAttachments.length,
|
|
itemBuilder: (context, index) => Padding(
|
|
itemBuilder: (context, index) => Padding(
|
|
padding: const EdgeInsets.all(4),
|
|
padding: const EdgeInsets.all(4),
|
|
child: SmartImageContainer(
|
|
child: SmartImageContainer(
|
|
- imageUrl: post.attachments[index].link,
|
|
|
|
|
|
+ imageUrl: imageAttachments[index].link,
|
|
//onTap: () => _handleAttachmentTap(index),
|
|
//onTap: () => _handleAttachmentTap(index),
|
|
),
|
|
),
|
|
),
|
|
),
|
|
@@ -209,6 +215,22 @@ class _PostContentSection extends StatelessWidget {
|
|
return 'Download';
|
|
return 'Download';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ bool _isImageFile(String url) {
|
|
|
|
+ try {
|
|
|
|
+ final uri = Uri.parse(url);
|
|
|
|
+ final path = uri.path.toLowerCase();
|
|
|
|
+
|
|
|
|
+ final cleanPath = path.split('?').first.split('#').first;
|
|
|
|
+ const imageExtensions = {
|
|
|
|
+ 'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg',
|
|
|
|
+ 'tiff', 'heic', 'heif'
|
|
|
|
+ };
|
|
|
|
+ return imageExtensions.any((ext) => cleanPath.endsWith('.$ext'));
|
|
|
|
+ } catch (e) {
|
|
|
|
+ return false; // Invalid URL format
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
Future<bool> _handleUrlLaunch(BuildContext context, String url) async {
|
|
Future<bool> _handleUrlLaunch(BuildContext context, String url) async {
|