FIX Telegram Mime image share

This commit is contained in:
Dwindi Ramadhana
2026-03-22 19:37:49 +07:00
parent e34dd6cf06
commit c32b56c00e
19 changed files with 942 additions and 24 deletions

View File

@@ -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,

View 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,
);
}

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,

View File

@@ -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),

View File

@@ -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,

View File

@@ -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,

View File

@@ -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,