// ignore_for_file: library_private_types_in_public_api import 'dart:async'; import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; import 'package:fikoyt_akcali/apps/finans/model/ayarlar/model_ayarlar.dart'; import 'package:fikoyt_akcali/core/fikoyt.service.dart'; import 'package:fikoyt_akcali/core/widgets/fiko_ui/fiko_button/fiko_button.dart'; import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:get/get.dart'; import 'package:vrouter/vrouter.dart'; import 'package:fikoyt_akcali/core/Extensions/fiko_tarih.dart'; import '../../../../core/widgets/base_page/base_page_view.dart'; import '../../../../core/widgets/draggable_home.dart'; import '../../../../core/widgets/fikoyt_elastic/fikoyt_elastic.dart'; import '../../base_page_mesaici_view.dart'; import '../../widgets/kullanici_bilgi_navigasyon/kullanici_bilgi_navigasyon.dart'; import '../../widgets/uygulama_baslik/uygulama_baslik.dart'; class PageMesaiciYedeklemeLogic extends GetxController { // final FikoYTMesaiciService servisMesaici = Get.put(FikoYTMesaiciService()); RxBool gosterVeriEkleyici = false.obs; RxBool simdiYedekleniyor = false.obs; RxBool dosyadanYukleniyor = false.obs; RxString yuklenenItem = "".obs; /** */ @override void onInit() { // TODO: implement onInit super.onInit(); } } class PageMesaiciYedekleme extends StatefulWidget { const PageMesaiciYedekleme({super.key}); @override _PageMesaiciYedeklemeState createState() => _PageMesaiciYedeklemeState(); } // enum YedeklemePeriyot { GUNLUK, HAFTALIK, AYLIK, YOK } class _PageMesaiciYedeklemeState extends State { PageMesaiciYedeklemeLogic logic = Get.put(PageMesaiciYedeklemeLogic()); BasePageLogic basePageLogic = Get.put(BasePageLogic()); BasePageMesaiciLogic basePageMesaiciLogic = Get.put(BasePageMesaiciLogic()); //---> // final GlobalKey globalKeysAktifGun = GlobalKey(); // final scrollController = ScrollController(); //---> // YedeklemePeriyot? _yedeklemePeriyot = YedeklemePeriyot.GUNLUK; @override void initState() { super.initState(); // WidgetsBinding.instance.addPostFrameCallback((_) async { // await Future.delayed(const Duration(milliseconds: 1000)); // RenderObject? aktifAyObject = globalKeysAktifGun.currentContext?.findRenderObject(); // // print(globalKeysAktifAy); // if (aktifAyObject != null) { // basePageLogic.scrollController.position.ensureVisible( // aktifAyObject, // alignment: 0.1, // How far into view the item should be scrolled (between 0 and 1). // duration: const Duration(seconds: 1), // ); // } // }); } @override void dispose() { Get.delete(); // scrollController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { SchedulerBinding.instance.addPostFrameCallback((_) { basePageLogic.subTitle.value = "🗄️ Hareketler"; // print(context.vRouter.pathParameters["ay"]); }); ScreenSizeTypes screenType = FikoYTElastic.getScreenSizeType(context); [ // ScreenSizeTypes.small, ScreenSizeTypes.mini, ScreenSizeTypes.extraMini ].contains(screenType); return DraggableHome( scrollController: basePageLogic.scrollController, leading: const UygulamaBaslikSol(), title: UygulamaBaslikOrta(), actions: const [ UygulamaBaslikSag(), ], headerWidget: Visibility( visible: FikoYTService.servisMesaici.vtHatasi.value == false, child: PageView( children: [ Container( color: Colors.transparent, //Colors.orange, height: 300 - kToolbarHeight - 10, margin: const EdgeInsets.only(top: kToolbarHeight, bottom: 10, right: 10, left: 10), child: KullaniciBilgiNavigasyon( simge: const Text( "📱", style: TextStyle( fontSize: 54, ), ), ), ), ], ), ), bodyColor: Colors.transparent, body: [ Visibility( visible: FikoYTService.servisMesaici.vtHatasi.value == false, child: Column( children: [ const Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: Divider( indent: 20.0, endIndent: 10.0, thickness: 1, ), ), Text( "Yedekleme Periyodu", style: TextStyle(color: Colors.blueGrey, fontSize: 14), ), Expanded( child: Divider( indent: 10.0, endIndent: 20.0, thickness: 1, ), ), ], ), ListTile( title: const Text('Yok'), leading: Radio( value: YedeklemePeriyot.YOK, groupValue: FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot, onChanged: (YedeklemePeriyot? value) { setState(() { FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot = value!; FikoYTService.servisMesaici.ayarlarModel?.refresh(); }); }, ), onTap: () { setState(() { FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot = YedeklemePeriyot.YOK; FikoYTService.servisMesaici.ayarlarModel?.refresh(); }); }, ), ListTile( title: const Text('Günlük'), leading: Radio( value: YedeklemePeriyot.GUNLUK, groupValue: FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot, onChanged: (YedeklemePeriyot? value) { setState(() { FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot = value!; FikoYTService.servisMesaici.ayarlarModel?.refresh(); }); }, ), onTap: () { setState(() { FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot = YedeklemePeriyot.GUNLUK; FikoYTService.servisMesaici.ayarlarModel?.refresh(); }); }, ), ListTile( title: const Text('Haftalık'), leading: Radio( value: YedeklemePeriyot.HAFTALIK, groupValue: FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot, onChanged: (YedeklemePeriyot? value) { setState(() { FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot = value!; FikoYTService.servisMesaici.ayarlarModel?.refresh(); }); }, ), onTap: () { setState(() { FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot = YedeklemePeriyot.HAFTALIK; FikoYTService.servisMesaici.ayarlarModel?.refresh(); }); }, ), ListTile( title: const Text('Aylık'), leading: Radio( value: YedeklemePeriyot.AYLIK, groupValue: FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot, onChanged: (YedeklemePeriyot? value) { setState(() { FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot = value!; FikoYTService.servisMesaici.ayarlarModel?.refresh(); }); }, ), onTap: () { setState(() { FikoYTService.servisMesaici.ayarlarModel?.value.yedeklemePeriyot = YedeklemePeriyot.AYLIK; FikoYTService.servisMesaici.ayarlarModel?.refresh(); }); }, ), ], ), ), Visibility( visible: FikoYTService.servisMesaici.vtHatasi.value == true, child: Padding( padding: const EdgeInsets.all(5), child: FikoButton1( text: "Veritabanında Bir Hata Tespit Edildi. Eğer Daha Önceden Yedeğiniz Var İse Bu Yedeklerden Geri Yükleme Yapabilirsiniz.Yok İse Sıfırla Butonuna Basınız.", textColor: Colors.red, textStrokeColor: Colors.transparent, ), ), ), /** */ Visibility( visible: FikoYTService.servisMesaici.vtHatasi.value == false, child: Padding( padding: const EdgeInsets.all(5), child: FikoButton1( text: Obx( () => AnimatedCrossFade( firstChild: const Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "🗃️ Şimdi Yedekle", style: TextStyle( color: Colors.black, fontSize: 12, ), ), ], ), secondChild: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Container( width: 18, height: 18, padding: const EdgeInsets.all(4.0), child: const CircularProgressIndicator( color: Colors.blue, strokeWidth: 3, ), ), ], ), crossFadeState: logic.simdiYedekleniyor.value ? CrossFadeState.showSecond : CrossFadeState.showFirst, duration: const Duration(milliseconds: 500), ), ), textSize: 11, radius: 20, edgePadding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), backColor: Colors.white, textColor: Colors.green, textStrokeColor: Colors.transparent, borderColor: Colors.blue, onPressed: () async { if (logic.simdiYedekleniyor.isTrue) return; logic.simdiYedekleniyor.value = true; logic.simdiYedekleniyor.refresh(); try { FikoYTService.servisMesaici.isar?.copyToFile('${await FikoYTService.programYolu(ekYol: 'yedekler')}${DateTime.now().formatla('dd_MM_yyyy HH_mm_ss')}.FikoYedek'); SnackBar snck = const SnackBar( content: Text('Dosya Kaydedildi'), duration: Duration(seconds: 2), // SnackBar'ın ekranda kalma süresi ); ScaffoldMessenger.of(context).showSnackBar(snck); } catch (e) { print(e); SnackBar snck = const SnackBar( content: Text('Bir Hata Oluştu'), backgroundColor: Colors.red, duration: Duration(seconds: 2), // SnackBar'ın ekranda kalma süresi ); ScaffoldMessenger.of(context).showSnackBar(snck); } finally { await Future.delayed(const Duration(milliseconds: 1000)); logic.simdiYedekleniyor.value = false; logic.simdiYedekleniyor.refresh(); FikoYTService.servisMesaici.aktifCalisma?.refresh(); FikoYTService.servisMesaici.ayarlarModel?.refresh(); } // FikoYTService.servisMesaici.isar.copyToFile('${await FikoYTService.programYolu()}selam.db'); // FikoYTService.servisMesaici.isar.copyToFile('${await FikoYTService.programYolu(ekYol: 'yedekler')}${DateTime.now().formatla('dd_MM_yyyy HH_mm_ss')}.FikoYedek'); // print(DateTime.now()); }, ), ), /** */ ), /** */ Padding( padding: const EdgeInsets.all(5), child: FikoButton1( text: Obx( () => AnimatedCrossFade( firstChild: const Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Text( "📁 Dosyadan Yükle", style: TextStyle( color: Colors.black, fontSize: 12, ), ), ], ), secondChild: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Container( width: 18, height: 18, padding: const EdgeInsets.all(4.0), child: const CircularProgressIndicator( color: Colors.blue, strokeWidth: 3, ), ), ], ), crossFadeState: logic.dosyadanYukleniyor.value ? CrossFadeState.showSecond : CrossFadeState.showFirst, duration: const Duration(milliseconds: 500), ), ), textSize: 11, radius: 20, edgePadding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), backColor: Colors.white, textColor: Colors.green, textStrokeColor: Colors.transparent, borderColor: Colors.blue, onPressed: () async { if (logic.dosyadanYukleniyor.isTrue) return; logic.dosyadanYukleniyor.value = true; logic.dosyadanYukleniyor.refresh(); try { // Dosya seçme FilePickerResult? result = await FilePicker.platform.pickFiles( dialogTitle: 'Kayıt dosyasını seçin', type: FileType.any, // allowedExtensions: ['json'], // Sadece JSON dosyalarını seçtir ); if (result != null && result.files.single.path != null) { // Dosya yolunu al String filePath = result.files.single.path!; if (filePath.endsWith(".FikoYedek") == false) { SnackBar snck = const SnackBar( content: Text('Dosya Bu Programı Desteklemiyor'), backgroundColor: Colors.red, duration: Duration(seconds: 2), // SnackBar'ın ekranda kalma süresi ); ScaffoldMessenger.of(context).showSnackBar(snck); return; } // Dosyanın içeriğini oku /** */ FikoYTService.servisMesaici.arkaPlanServis.invoke("mesaici.servis.durdur"); await FikoYTService.servisMesaici.isar?.close(); File file = File(filePath); await file.copy('${await FikoYTService.programYolu(ekYol: 'databases')}FikoYT.db.isar'); await FikoYTService.servisMesaici.isar_init(); await FikoYTService.servisMesaici.ayarlar_init(); await FikoYTService.servisMesaici.aktifCalisma_init(); await FikoYTService.servisMesaici.arkaPlanServisInit(); SnackBar snck = const SnackBar( content: Text('Yedek Yüklendi'), duration: Duration(seconds: 2), // SnackBar'ın ekranda kalma süresi ); ScaffoldMessenger.of(context).showSnackBar(snck); if (FikoYTService.servisMesaici.vtHatasi.value == false) { await Future.delayed(const Duration(milliseconds: 1000)); context.vRouter.to("/mesaici"); } } else {} } catch (e) { print(e); SnackBar snck = const SnackBar( content: Text('Bir Hata Oluştu'), backgroundColor: Colors.red, duration: Duration(seconds: 2), // SnackBar'ın ekranda kalma süresi ); ScaffoldMessenger.of(context).showSnackBar(snck); } finally { await Future.delayed(const Duration(milliseconds: 1000)); logic.dosyadanYukleniyor.value = false; logic.dosyadanYukleniyor.refresh(); FikoYTService.servisMesaici.ayarlarModel?.refresh(); FikoYTService.servisMesaici.aktifCalisma?.refresh(); } }, ), /** */ ), /** */ Visibility( visible: FikoYTService.servisMesaici.vtHatasi.value == false, child: Padding( padding: const EdgeInsets.all(5), child: FikoButton1( text: "Yedekleri Geri Yüklemeden Önce Mevcut Verilerinizi Kaybetmemeniz İçin Yeni Yedek Almanızı Tavsiye Ederiz.", textColor: Colors.deepOrange, textStrokeColor: Colors.transparent, fontWeight: FontWeight.normal, ), ), ), /** */ Row( mainAxisAlignment: MainAxisAlignment.center, children: [ const Expanded( child: Divider( indent: 0.0, endIndent: 10.0, thickness: 1, ), ), const Text( "📦 Alınan Yedekler", style: TextStyle(color: Colors.blueGrey, fontSize: 14), ), const Expanded( child: Divider( indent: 10.0, endIndent: 0.0, thickness: 1, ), ), FikoButton1( text: "♻️", onPressed: () async { // Directory yedekKlasoru = Directory(await FikoYTService.programYolu(ekYol: 'yedekler')); // print(yedekKlasoru.listSync()); FikoYTService.servisMesaici.aktifCalisma?.refresh(); }, ), const SizedBox( width: 10, ) ], ), /** */ Obx( () { FikoYTService.servisMesaici.aktifCalisma?.value; return FutureBuilder( future: Future.sync( () async { return Directory(await FikoYTService.programYolu(ekYol: 'yedekler')).listSync().toList()..sort((l, r) => r.statSync().modified.compareTo(l.statSync().modified)); }, ), builder: (context, snapshot) { if (snapshot.hasData) { final dosyalar = snapshot.data; // if (todos!.isNotEmpty) { return AnimatedSwitcher( duration: const Duration(milliseconds: 750), transitionBuilder: (Widget child, Animation animation) { return FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, axisAlignment: 2, // fixedCrossAxisSizeFactor: 1, axis: Axis.vertical, child: child, ), ); }, child: AnimatedCrossFade( key: const ValueKey("Dosyalar"), duration: const Duration(milliseconds: 300), crossFadeState: dosyalar!.isNotEmpty ? CrossFadeState.showFirst : CrossFadeState.showSecond, firstChild: ListView.separated( padding: const EdgeInsets.symmetric(vertical: 10.0), physics: const BouncingScrollPhysics(), shrinkWrap: true, itemCount: dosyalar.length, separatorBuilder: (context, index) => const SizedBox( height: 5, ), itemBuilder: (context, index) { final dosya = dosyalar[index]; return Dismissible( direction: DismissDirection.endToStart, // this will only allow slide to left. dismissThresholds: const {DismissDirection.endToStart: 0.4}, key: ValueKey(dosya.statSync().modified.formatla("dd.MM.yyyy HH:mm:ss EEEE")), background: Row( children: [ const Spacer(), FikoButton1( text: const Icon( Icons.delete, color: Colors.red, size: 14, ), ), ], ), confirmDismiss: (direction) async { return true; }, onDismissed: (direction) async { dosyalar.removeAt(index); await dosya.delete(); FikoYTService.servisMesaici.aktifCalisma?.refresh(); }, child: FikoButton1( backColor: Colors.white, borderColor: Colors.black12, edgePadding: const EdgeInsets.symmetric(vertical: 2, horizontal: 5), text: Obx( () => AnimatedCrossFade( firstChild: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.start, children: [ const Text("📅"), Text( // key: DateTime.now().formatla("dd.MM.yyyy EEEE") == gun.tarih!.formatla("dd.MM.yyyy EEEE") ? globalKeysAktifGun : null, dosya.statSync().modified.formatla("dd.MM.yyyy HH:mm:ss EEEE"), ), ], ), secondChild: Row( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ Container( width: 18, height: 18, padding: const EdgeInsets.all(4.0), child: const CircularProgressIndicator( color: Colors.blue, strokeWidth: 3, ), ), ], ), crossFadeState: logic.yuklenenItem.value == dosya.statSync().modified.formatla("dd.MM.yyyy HH:mm:ss EEEE") ? CrossFadeState.showSecond : CrossFadeState.showFirst, duration: const Duration(milliseconds: 500), ), ), onPressed: () async { if (logic.yuklenenItem.value == dosya.statSync().modified.formatla("dd.MM.yyyy HH:mm:ss EEEE")) return; logic.yuklenenItem.value = dosya.statSync().modified.formatla("dd.MM.yyyy HH:mm:ss EEEE"); logic.yuklenenItem.refresh(); try { String filePath = dosya.absolute.path; // Dosyanın içeriğini oku /** */ FikoYTService.servisMesaici.arkaPlanServis.invoke("mesaici.servis.durdur"); await FikoYTService.servisMesaici.isar?.close(); File file = File(filePath); await file.copy('${await FikoYTService.programYolu(ekYol: 'databases')}FikoYT.db.isar'); await FikoYTService.servisMesaici.isar_init(); await FikoYTService.servisMesaici.ayarlar_init(); await FikoYTService.servisMesaici.aktifCalisma_init(); await FikoYTService.servisMesaici.arkaPlanServisInit(); SnackBar snck = const SnackBar( content: Text('Yedek Yüklendi'), duration: Duration(seconds: 2), // SnackBar'ın ekranda kalma süresi ); ScaffoldMessenger.of(context).showSnackBar(snck); if (FikoYTService.servisMesaici.vtHatasi.value == false) { await Future.delayed(const Duration(milliseconds: 1000)); context.vRouter.to("/mesaici"); } } catch (e) { print(e); SnackBar snck = const SnackBar( content: Text('Bir Hata Oluştu'), backgroundColor: Colors.red, duration: Duration(seconds: 2), // SnackBar'ın ekranda kalma süresi ); ScaffoldMessenger.of(context).showSnackBar(snck); } finally { await Future.delayed(const Duration(milliseconds: 1000)); logic.yuklenenItem.value = ""; logic.yuklenenItem.refresh(); FikoYTService.servisMesaici.aktifCalisma?.refresh(); } }, onLongPress: () async { await FikoYTService.servisMesaici.isar?.close(); File file = File("${await FikoYTService.programYolu(ekYol: 'databases')}FikoYT.db.isar"); String? outputPath = await FilePicker.platform.saveFile( dialogTitle: 'Kayıt dosyası nereye kaydedilsin?', fileName: 'FikoYT.db.isar', bytes: file.readAsBytesSync(), ); print(outputPath); // await file.copy(outputPath!); SnackBar snck = const SnackBar( content: Text('Oldu Oldu'), backgroundColor: Colors.red, duration: Duration(seconds: 2), // SnackBar'ın ekranda kalma süresi ); ScaffoldMessenger.of(context).showSnackBar(snck); }, ), ); }, ), secondChild: Padding( padding: const EdgeInsets.only(top: 30.0), child: Stack( children: [ Card( child: Container( height: 100.0, ), ), const FractionalTranslation( translation: Offset(0.0, -0.4), child: Align( alignment: FractionalOffset(0.5, 0.0), child: CircleAvatar( // backgroundColor: Colors.redAccent.shade200, radius: 25.0, child: Text( "🗄️", style: TextStyle(fontSize: 24), ), ), ), ), Padding( padding: const EdgeInsets.only(top: 48), child: Align( alignment: const FractionalOffset(0.5, 0.5), child: Text( "Herhangi Bir Yedek Kaydınız Bulunamadı", style: TextStyle(fontSize: 16, fontWeight: FontWeight.w300, color: Colors.blueAccent.shade400), textAlign: TextAlign.center, ), ), ), ], ), ), ), ); } return const CircularProgressIndicator(); }, ); }, ), ], headerExpandedHeight: 315, // stretchMaxHeight: 100, fullyStretchable: false, backgroundColor: Colors.grey.shade200, centerTitle: true, alwaysShowLeadingAndAction: true, appBarColor: Colors.blue.shade500, alwaysShowTitle: true, curvedBodyRadius: 0, onStretchTrigger: () async { context.vRouter.to("/"); }, ); } }