FIX Telegram Mime image share
This commit is contained in:
@@ -5,12 +5,17 @@ import 'package:flutter/material.dart';
|
||||
import 'package:flutter/rendering.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:lucide_icons/lucide_icons.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
import '../../app/icons/app_icons.dart';
|
||||
import '../../app/theme/app_colors.dart';
|
||||
import '../../core/widgets/arabic_text.dart';
|
||||
|
||||
const MethodChannel _androidShareChannel = MethodChannel(
|
||||
'com.jamshalat.app/share',
|
||||
);
|
||||
|
||||
String buildAyatShareText(Map<String, dynamic> ayat) {
|
||||
final arabic = (ayat['teksArab'] ?? '').toString().trim();
|
||||
final translation = (ayat['teksIndonesia'] ?? '').toString().trim();
|
||||
@@ -50,11 +55,7 @@ Future<void> showAyatShareSheet(
|
||||
try {
|
||||
final pngBytes = await _captureAyatShareCardPng(context, ayat);
|
||||
final file = await _writeAyatShareImage(pngBytes);
|
||||
await Share.shareXFiles(
|
||||
[XFile(file.path)],
|
||||
text: 'Ayat Hari Ini',
|
||||
subject: 'Ayat Hari Ini',
|
||||
);
|
||||
await _shareAyatImage(file);
|
||||
} catch (_) {
|
||||
if (!context.mounted) return;
|
||||
ScaffoldMessenger.of(context)
|
||||
@@ -224,12 +225,40 @@ Future<Uint8List> _captureAyatShareCardPng(
|
||||
}
|
||||
|
||||
Future<File> _writeAyatShareImage(Uint8List pngBytes) async {
|
||||
final directory = await Directory.systemTemp.createTemp('jamshalat_ayat_');
|
||||
final file = File('${directory.path}/ayat_hari_ini.png');
|
||||
final tempDirectory = await getTemporaryDirectory();
|
||||
final shareDirectory =
|
||||
Directory('${tempDirectory.path}/share_plus/jamshalat');
|
||||
if (!await shareDirectory.exists()) {
|
||||
await shareDirectory.create(recursive: true);
|
||||
}
|
||||
|
||||
final timestamp = DateTime.now().millisecondsSinceEpoch;
|
||||
final file = File('${shareDirectory.path}/ayat_hari_ini_$timestamp.png');
|
||||
await file.writeAsBytes(pngBytes, flush: true);
|
||||
return file;
|
||||
}
|
||||
|
||||
Future<void> _shareAyatImage(File file) async {
|
||||
if (Platform.isAndroid) {
|
||||
await _androidShareChannel.invokeMethod<void>('shareImage', {
|
||||
'path': file.path,
|
||||
'mimeType': 'image/png',
|
||||
'chooserTitle': 'Bagikan ayat',
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
await Share.shareXFiles(
|
||||
[
|
||||
XFile(
|
||||
file.path,
|
||||
mimeType: 'image/png',
|
||||
),
|
||||
],
|
||||
fileNameOverrides: const ['jamshalat_ayat_hari_ini.png'],
|
||||
);
|
||||
}
|
||||
|
||||
class _AyatShareCard extends StatelessWidget {
|
||||
const _AyatShareCard({
|
||||
required this.ayat,
|
||||
|
||||
23
lib/core/widgets/bottom_sheet_content_padding.dart
Normal file
23
lib/core/widgets/bottom_sheet_content_padding.dart
Normal file
@@ -0,0 +1,23 @@
|
||||
import 'dart:math' as math;
|
||||
|
||||
import 'package:flutter/widgets.dart';
|
||||
|
||||
EdgeInsets bottomSheetContentPadding(
|
||||
BuildContext context, {
|
||||
double horizontal = 16,
|
||||
double top = 20,
|
||||
double bottom = 20,
|
||||
}) {
|
||||
final mediaQuery = MediaQuery.of(context);
|
||||
final bottomInset = math.max(
|
||||
mediaQuery.viewInsets.bottom,
|
||||
mediaQuery.viewPadding.bottom,
|
||||
);
|
||||
|
||||
return EdgeInsets.fromLTRB(
|
||||
horizontal,
|
||||
top,
|
||||
horizontal,
|
||||
bottom + bottomInset,
|
||||
);
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:lucide_icons/lucide_icons.dart';
|
||||
import '../../../app/theme/app_colors.dart';
|
||||
import '../../../core/widgets/arabic_text.dart';
|
||||
import '../../../core/widgets/bottom_sheet_content_padding.dart';
|
||||
import '../../../data/local/hive_boxes.dart';
|
||||
import '../../../data/local/models/app_settings.dart';
|
||||
import '../../../data/services/muslim_api_service.dart';
|
||||
@@ -91,9 +92,8 @@ class _DoaScreenState extends State<DoaScreen> {
|
||||
),
|
||||
builder: (ctx) => StatefulBuilder(
|
||||
builder: (context, setModalState) {
|
||||
final keyboardInset = MediaQuery.of(context).viewInsets.bottom;
|
||||
return Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 20, 16, 20 + keyboardInset),
|
||||
padding: bottomSheetContentPadding(context),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
||||
@@ -10,6 +10,7 @@ import 'package:lucide_icons/lucide_icons.dart';
|
||||
|
||||
import '../../../app/theme/app_colors.dart';
|
||||
import '../../../core/widgets/arabic_text.dart';
|
||||
import '../../../core/widgets/bottom_sheet_content_padding.dart';
|
||||
import '../../../data/local/hive_boxes.dart';
|
||||
import '../../../data/local/models/app_settings.dart';
|
||||
import '../../../data/local/models/daily_worship_log.dart';
|
||||
@@ -642,9 +643,8 @@ class _DzikirScreenState extends ConsumerState<DzikirScreen>
|
||||
),
|
||||
builder: (ctx) => StatefulBuilder(
|
||||
builder: (context, setModalState) {
|
||||
final keyboardInset = MediaQuery.of(context).viewInsets.bottom;
|
||||
return Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 20, 16, 20 + keyboardInset),
|
||||
padding: bottomSheetContentPadding(context),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:lucide_icons/lucide_icons.dart';
|
||||
import '../../../app/theme/app_colors.dart';
|
||||
import '../../../core/widgets/arabic_text.dart';
|
||||
import '../../../core/widgets/bottom_sheet_content_padding.dart';
|
||||
import '../../../data/local/hive_boxes.dart';
|
||||
import '../../../data/local/models/app_settings.dart';
|
||||
import '../../../data/services/muslim_api_service.dart';
|
||||
@@ -96,9 +97,8 @@ class _HaditsScreenState extends State<HaditsScreen> {
|
||||
),
|
||||
builder: (ctx) => StatefulBuilder(
|
||||
builder: (context, setModalState) {
|
||||
final keyboardInset = MediaQuery.of(context).viewInsets.bottom;
|
||||
return Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 20, 16, 20 + keyboardInset),
|
||||
padding: bottomSheetContentPadding(context),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
||||
@@ -5,6 +5,7 @@ import 'package:go_router/go_router.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
import '../../../app/theme/app_colors.dart';
|
||||
import '../../../core/widgets/arabic_text.dart';
|
||||
import '../../../core/widgets/bottom_sheet_content_padding.dart';
|
||||
import '../../../data/local/hive_boxes.dart';
|
||||
import '../../../data/local/models/quran_bookmark.dart';
|
||||
import '../../../data/local/models/app_settings.dart';
|
||||
@@ -25,7 +26,8 @@ class _QuranBookmarksScreenState extends State<QuranBookmarksScreen> {
|
||||
bool _showLatin = true;
|
||||
bool _showTerjemahan = true;
|
||||
final Map<int, Future<Map<String, dynamic>?>> _surahFutureCache = {};
|
||||
final Map<dynamic, Future<_ResolvedBookmarkContent?>> _bookmarkFutureCache = {};
|
||||
final Map<dynamic, Future<_ResolvedBookmarkContent?>> _bookmarkFutureCache =
|
||||
{};
|
||||
|
||||
String _readingRoute(int surahId, int verseId) {
|
||||
final isSimple =
|
||||
@@ -54,9 +56,8 @@ class _QuranBookmarksScreenState extends State<QuranBookmarksScreen> {
|
||||
),
|
||||
builder: (ctx) => StatefulBuilder(
|
||||
builder: (context, setModalState) {
|
||||
final keyboardInset = MediaQuery.of(context).viewInsets.bottom;
|
||||
return Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 20, 16, 20 + keyboardInset),
|
||||
padding: bottomSheetContentPadding(context),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
@@ -147,7 +148,8 @@ class _QuranBookmarksScreenState extends State<QuranBookmarksScreen> {
|
||||
Future<_ResolvedBookmarkContent?> _getResolvedBookmarkContent(
|
||||
QuranBookmark bookmark,
|
||||
) {
|
||||
final bookmarkKey = bookmark.key ?? '${bookmark.surahId}_${bookmark.verseId}';
|
||||
final bookmarkKey =
|
||||
bookmark.key ?? '${bookmark.surahId}_${bookmark.verseId}';
|
||||
return _bookmarkFutureCache.putIfAbsent(
|
||||
bookmarkKey,
|
||||
() => _loadResolvedBookmarkContent(bookmark),
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'package:hive_flutter/hive_flutter.dart';
|
||||
import 'package:lucide_icons/lucide_icons.dart';
|
||||
import '../../../app/theme/app_colors.dart';
|
||||
import '../../../core/widgets/arabic_text.dart';
|
||||
import '../../../core/widgets/bottom_sheet_content_padding.dart';
|
||||
import '../../../data/local/hive_boxes.dart';
|
||||
import '../../../data/local/models/app_settings.dart';
|
||||
import '../../../data/services/muslim_api_service.dart';
|
||||
@@ -193,9 +194,8 @@ class _QuranEnrichmentScreenState extends State<QuranEnrichmentScreen>
|
||||
),
|
||||
builder: (ctx) => StatefulBuilder(
|
||||
builder: (context, setModalState) {
|
||||
final keyboardInset = MediaQuery.of(context).viewInsets.bottom;
|
||||
return Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 20, 16, 20 + keyboardInset),
|
||||
padding: bottomSheetContentPadding(context),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
||||
@@ -10,6 +10,7 @@ import 'package:intl/intl.dart';
|
||||
import '../../../app/theme/app_colors.dart';
|
||||
import '../../../core/services/app_audio_player.dart';
|
||||
import '../../../core/widgets/arabic_text.dart';
|
||||
import '../../../core/widgets/bottom_sheet_content_padding.dart';
|
||||
import '../../../data/local/hive_boxes.dart';
|
||||
import '../../../data/local/models/quran_bookmark.dart';
|
||||
import '../../../data/local/models/app_settings.dart';
|
||||
@@ -845,9 +846,8 @@ class _QuranReadingScreenState extends ConsumerState<QuranReadingScreen> {
|
||||
),
|
||||
builder: (ctx) => StatefulBuilder(
|
||||
builder: (context, setModalState) {
|
||||
final keyboardInset = MediaQuery.of(context).viewInsets.bottom;
|
||||
return Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 20, 16, 20 + keyboardInset),
|
||||
padding: bottomSheetContentPadding(context),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
||||
@@ -5,6 +5,7 @@ import 'package:lucide_icons/lucide_icons.dart';
|
||||
import 'package:hive_flutter/hive_flutter.dart';
|
||||
import '../../../app/theme/app_colors.dart';
|
||||
import '../../../core/widgets/arabic_text.dart';
|
||||
import '../../../core/widgets/bottom_sheet_content_padding.dart';
|
||||
import '../../../data/local/hive_boxes.dart';
|
||||
import '../../../data/local/models/app_settings.dart';
|
||||
import '../../../data/local/models/quran_bookmark.dart';
|
||||
@@ -55,9 +56,8 @@ class _QuranScreenState extends ConsumerState<QuranScreen> {
|
||||
),
|
||||
builder: (ctx) => StatefulBuilder(
|
||||
builder: (context, setModalState) {
|
||||
final keyboardInset = MediaQuery.of(context).viewInsets.bottom;
|
||||
return Padding(
|
||||
padding: EdgeInsets.fromLTRB(16, 20, 16, 20 + keyboardInset),
|
||||
padding: bottomSheetContentPadding(context),
|
||||
child: Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
|
||||
Reference in New Issue
Block a user