library; import 'dart:async'; import 'dart:io'; import 'package:dio/dio.dart'; import 'package:dio_cookie_manager/dio_cookie_manager.dart'; import 'package:fikoyt_ui/core/fikoyt_device_info.dart'; import 'package:fikoyt_ui/core/http_overrides.dart'; import 'package:fikoyt_ui/fikoyt_ui.dart'; import 'package:fikoyt_ui/migration/dio/dio.dart'; import 'package:fikoyt_ui/ui/dialogs/fiko_dialog_ayarlari.dart'; import 'package:fikoyt_ui/ui/fikoyt_card.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart' hide Intent; import 'package:flutter/services.dart'; import 'package:mobile_device_identifier/mobile_device_identifier.dart'; import 'package:path_provider/path_provider.dart'; import 'package:receive_intent/receive_intent.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:socket_io_client/socket_io_client.dart' as IO; import 'package:timezone/data/latest.dart' as tz; import 'package:flutter_acrylic/flutter_acrylic.dart'; import 'package:uuid/uuid.dart'; import 'package:cookie_jar/cookie_jar.dart'; import 'package:http/http.dart' as http; // ignore: constant_identifier_names // enum TemaModu { ACIK, KOYU, SISTEM } enum TemaModu { ACIK(0, "Açık Tema", "🔆", ThemeMode.light), KOYU(1, "Koyu Tema", "🌙", ThemeMode.dark), SISTEM(-1, "Sistem Teması", "⚡", ThemeMode.system); const TemaModu(this.value, this.ismi, this.simge, this.temaModu); final int value; final String ismi; final String simge; final ThemeMode temaModu; // List tumu() => [EkOdemeTuru.IKRAMIYE, EkOdemeTuru.PRIM, EkOdemeTuru.YOL, EkOdemeTuru.YEMEK, EkOdemeTuru.SEYYANEN, EkOdemeTuru.DIGER]; } class ServisYoneticisi { final Map _servisler = {}; // Getter T? getServis() { return _servisler[T] as T?; } // Setter void setServis(T servis) { _servisler[T] = servis; } } class FikoYTCoreService { static FikoYTEventSystem events = FikoYTEventSystem(); static GlobalKey navigatorKey = GlobalKey(); static FikoYTServiceSettings serviceSettings = FikoYTServiceSettings(); static TemaModu temaModu = TemaModu.SISTEM; static Rx parlaklik = Brightness.light.obs; static final ServisYoneticisi servisler = ServisYoneticisi(); static final Map globals = {}; /// static final AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher'); static final InitializationSettings initializationSettings = InitializationSettings(android: initializationSettingsAndroid); static final FlutterLocalNotificationsPlugin notificationPlugin = FlutterLocalNotificationsPlugin(); /// static late IO.Socket socket; static Rx wsBagli = Rx(false); static Rx internetBagli = Rx(false); /// static init({FikoYTServiceSettings? settings}) async { FikoYTCoreService.serviceSettings = settings ?? FikoYTServiceSettings(); WidgetsFlutterBinding.ensureInitialized(); await SystemChrome.setPreferredOrientations(serviceSettings.deviceOrientation); HttpOverrides.global = HttpSSlIptalUzerineYaz(); tz.initializeTimeZones(); /** */ dio?.interceptors.add( InterceptorsWrapper( onRequest: (options, handler) { options.extra["withCredentials"] = true; return handler.next(options); }, ), ); final appDocDir = await getApplicationDocumentsDirectory(); final cookieJar = PersistCookieJar( storage: FileStorage( '${appDocDir.path}/.cookies/', ), ); // print('${appDocDir.path}/.cookies/'); dio?.interceptors.add(CookieManager(cookieJar)); /** */ /// // try { // await FikoYTTranslationManager.loadFromFiles([ // "packages/fikoyt_ui/assets/translate/app_tr.json", // "packages/fikoyt_ui/assets/translate/app_us.json", // ...(FikoYTCoreService.serviceSettings.appSettings.translationFiles ?? []), // ]); // } on Exception catch (e) { // print(e.toString()); // } /// await SystemChrome.setEnabledSystemUIMode(serviceSettings.systemUiMode, overlays: serviceSettings.systemUiOverlay); /// if (!Platform.isAndroid) { await initializeNotifications(); /// await onInitialIntent(); } /// if (serviceSettings.connectWebSocket) { socket = IO.io( serviceSettings.fikoytWebSocketUrl, IO.OptionBuilder() .setTransports(['websocket']) .enableReconnection() .setExtraHeaders({ "uygulama": serviceSettings.appSettings.uygulamaIsmi, "cihaz_uuid": await FikoYTCoreService.getDeviceID() ?? "", }) .enableAutoConnect() // for Flutter or Dart VM // .disableAutoConnect() // disable auto-connection // .setExtraHeaders({'foo': 'bar'}) // optional .build(), ); Connectivity().onConnectivityChanged.listen((List result) { if (result[0] == ConnectivityResult.none) { internetBagli.value = false; } else { internetBagli.value = true; } }); /// if (serviceSettings.socketMiddleWare != null) { serviceSettings.socketMiddleWare!(socket); socket.onConnect((data) { // print("bağlandıııııııııııı"); wsBagli.value = true; }); socket.onDisconnect((data) { // print("koptuuuuuuuuuuuuuuuuuuuuu"); wsBagli.value = false; }); } socket.connect(); } return FikoYTCoreService; } static Future ioEmit(String event, dynamic data, {Function? ack, bool binary = false}) async { Map FikoYTData = { "FikoYT": { "kullanici_kimlik": null, "cihaz_kimlik": await getDeviceID() ?? "", "cihaz_tipi": "desktop", "uygulama": FikoYTCoreService.serviceSettings.appSettings.uygulamaIsmi, "cihaz_bilgi": await getDeviceInfo(), ...(FikoYTCoreService.serviceSettings.socketDataMiddleWare ?? {}), }, }; data = [data, FikoYTData]; return socket.emitWithAckAsync(event, data, ack: ack, binary: binary); } /// static initializeNotifications() async { if (!Platform.isAndroid) return; await FlutterLocalNotificationsPlugin().initialize( initializationSettings, onDidReceiveNotificationResponse: serviceSettings.notificatinSettings.onDidReceiveNotificationResponse, onDidReceiveBackgroundNotificationResponse: serviceSettings.notificatinSettings.onDidReceiveBackNotificationResponse, ); for (var i = 0; i < serviceSettings.notificatinSettings.channels.length; i++) { final AndroidNotificationChannel channel = serviceSettings.notificatinSettings.channels[i]; await notificationPlugin .resolvePlatformSpecificImplementation() ?.createNotificationChannel(channel); } } /// static onInitialIntent() async { if (Platform.isWindows == false) { try { final receivedIntent = await ReceiveIntent.getInitialIntent(); serviceSettings.onInitialIntent(receivedIntent); } on PlatformException { // Handle exception } } } /// static uygulamaCalistir() async { if (!kIsWeb) { if (Platform.isWindows || Platform.isLinux || Platform.isMacOS) { await Window.initialize(); await Window.setEffect(effect: WindowEffect.aero, color: Colors.transparent, dark: true); doWhenWindowReady(() async { // const initialSize = Size(600, 450); // appWindow.minSize = initialSize; // appWindow.size = initialSize;appWindow // appWindow.alignment = Alignment.center; // appWindow.maximize(); // await loadWindowSizeAndPosition(); appWindow.alignment = Alignment.center; appWindow.show(); }); runApp(FikoYTApp()); } else { runApp(FikoYTApp()); } } else { runApp(FikoYTApp()); } } static Future getDeviceID() async { final prefs = await SharedPreferences.getInstance(); String? id = prefs.getString("device_id"); if (id == null) { id = ObjectId().oid; await prefs.setString("device_id", id); } return id; } static Future getDeviceInfo() async { return await getAllDeviceInfo(); } Future gercektenInternetVarMi() async { try { final response = await http.get(Uri.parse('https://google.com')).timeout(Duration(seconds: 5)); if (response.statusCode == 200) { return true; } else { return false; } } catch (e) { return false; } } static Future getCustomDirectoryWindows(String subDirectoryName) async { String executablePath; int lastSeparatorIndex; String executableDir; executablePath = Platform.resolvedExecutable; lastSeparatorIndex = executablePath.lastIndexOf(Platform.pathSeparator); executableDir = executablePath.substring(0, lastSeparatorIndex); // Uygulamanın belgeler dizinini al final directory = executableDir; // Alt klasörün yolunu oluştur final customDirectory = Directory('$directory${Platform.pathSeparator}$subDirectoryName'); // Eğer alt klasör mevcut değilse oluştur if (!await customDirectory.exists()) { await customDirectory.create(recursive: true); } return customDirectory; } static Future getCustomDirectoryAndroid(String subDirectoryName) async { // Uygulamanın belgeler dizinini al final directory = await getApplicationDocumentsDirectory(); // Alt klasörün yolunu oluştur final customDirectory = Directory('${directory.path}${Platform.pathSeparator}$subDirectoryName'); // Eğer alt klasör mevcut değilse oluştur if (!await customDirectory.exists()) { await customDirectory.create(recursive: true); } return customDirectory; } static Future programYolu({String ekYol = ""}) async { String executableDir; if (Platform.isWindows) { executableDir = (await getCustomDirectoryWindows(ekYol)).path + Platform.pathSeparator; } else if (Platform.isAndroid) { executableDir = (await getCustomDirectoryAndroid(ekYol)).path + Platform.pathSeparator; } else { executableDir = (await getCustomDirectoryAndroid(ekYol)).path + Platform.pathSeparator; } return executableDir; } /// static Future dialogGoster(BuildContext context, Widget? icerik, FikoDialogAyarlari? ayarlar) { final ayar = ayarlar ?? FikoDialogAyarlari(); return showGeneralDialog( context: context, barrierDismissible: true, barrierLabel: MaterialLocalizations.of(context).modalBarrierDismissLabel, transitionDuration: const Duration(milliseconds: 1000), pageBuilder: (context, animation, secondaryAnimation) { return SafeArea( child: FadeTransition( opacity: animation, child: ScaleTransition( scale: Tween(begin: 0.7, end: 1.0).animate( CurvedAnimation(parent: animation, curve: Curves.easeOutBack), ), child: LayoutBuilder( builder: (context, constraints) { final maxHeight = constraints.maxHeight * 0.9; return Center( child: Material( color: Colors.transparent, child: ConstrainedBox( constraints: BoxConstraints(maxHeight: maxHeight), child: SingleChildScrollView( physics: const BouncingScrollPhysics(), child: Column( mainAxisSize: MainAxisSize.min, children: [ if (icerik != null) icerik, ...?ayar.icerik, ], ), ), ), ), ); }, ), ), ), ); }, ); } static Future tarihSec( BuildContext context, { Widget? icerik, FikoDialogAyarlari? ayarlar, DateTime? varsayilanTarih, bool? tarihSilinebilsin = true, }) { DateTime? rslt = varsayilanTarih; return FikoYTCoreService.dialogGoster( context, FikoYTCard( children: [ Center(child: Text(ayarlar?.baslikSimge ?? '🗓️', style: TextStyle(fontSize: 54))), Center( child: FikoYTButton( text: ayarlar?.baslik ?? 'Tarih Seç', tema: Theme.of(context).extension()?.copyWith( textStrokeColor: Colors.transparent, textColor: Theme.of(context).extension()?.textColor, ), ), ), Divider(height: 4), CalendarDatePicker( initialDate: varsayilanTarih ?? DateTime.now(), firstDate: DateTime(-10000), lastDate: DateTime(10000), currentDate: rslt, onDateChanged: (value) { rslt = value; }, ), Column( children: [ const Divider(height: 1, thickness: 1), SizedBox( height: 30, child: Row( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end, children: [ TextButton( onPressed: () { Navigator.pop(context, rslt); }, child: const Text("Kapat", style: TextStyle(color: Colors.redAccent)), ), ], ), ), ], ), ], ), ayarlar, ); } /// Dialog Göster static Future dialogGoster1(BuildContext context, Widget? icerik, FikoDialogAyarlari? ayarlar) { var ayar = ayarlar ?? FikoDialogAyarlari(); return showDialog( context: context, barrierDismissible: ayarlar?.arkaPlanaTiklanincaKapansin ?? true, builder: (_) => AlertDialog( insetPadding: const EdgeInsets.only(top: 42, left: 10, right: 10), titlePadding: const EdgeInsets.symmetric(horizontal: 5, vertical: 0), iconPadding: EdgeInsets.zero, buttonPadding: EdgeInsets.zero, contentPadding: const EdgeInsets.all(5), actionsPadding: const EdgeInsets.only(bottom: 5), alignment: ayar.konumlandirma, shape: const RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(5))), scrollable: true, actionsAlignment: MainAxisAlignment.center, title: Column( mainAxisSize: MainAxisSize.min, children: [ SizedBox( height: 32, child: Row( // mainAxisAlignment: MainAxisAlignment.center, // crossAxisAlignment: CrossAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ // if (ayar.baslik.runtimeType == IconData) // Icon( // ayar.baslikSimge, // size: 18, // ), if (ayar.baslik.runtimeType == String) Text( ayar.baslikSimge as String, style: TextStyle(fontSize: 16, color: Theme.of(context).extension()?.textColor), ), const SizedBox(width: 5), Expanded( child: Text( ayar.baslik, style: TextStyle( color: Theme.of(context).extension()?.textColor, fontSize: 16, decoration: TextDecoration.none, fontWeight: FontWeight.w500, ), ), ), if (ayar.baslikButonlar.isNotEmpty) ...List.from(ayar.baslikButonlar), MaterialButton( minWidth: 18, onPressed: () { Navigator.pop(context); }, color: Colors.red, textColor: Colors.white, padding: const EdgeInsets.all(3), shape: const CircleBorder(), child: const Icon(Icons.close, size: 14), ), ], ), ), const Divider(thickness: 1, height: 1), ], ), actions: [ Column( children: [ const Divider(height: 1, thickness: 1), SizedBox( height: 30, child: Row( crossAxisAlignment: CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end, children: [ if (ayar.altButonlar.isNotEmpty) ...List.from(ayar.altButonlar), if (ayar.altButonlar.isEmpty) TextButton( onPressed: () { Navigator.pop(context); }, child: const Text("Kapat", style: TextStyle(color: Colors.redAccent)), ), ], ), ), ], ), ], content: SingleChildScrollView( child: Container(constraints: ayar.olculendirme, child: icerik ?? const SizedBox.shrink()), ), ), ); } } class _DialogIcerik extends StatelessWidget { final Widget? icerik; final FikoDialogAyarlari ayar; const _DialogIcerik({required this.icerik, required this.ayar}); @override Widget build(BuildContext context) { return Material(color: Colors.transparent, child: icerik ?? const SizedBox.shrink()); } } class Debouncer { final int milliseconds; Timer? _timer; Debouncer({required this.milliseconds}); void run(VoidCallback action) { if (_timer != null) { _timer!.cancel(); } _timer = Timer(Duration(milliseconds: milliseconds), action); } } class FikoYTServiceSettings { final List deviceOrientation; final String fikoytServerUrl; final String fikoytServerIstekOnEk; final String fikoytWebSocketUrl; final bool connectWebSocket; final SystemUiMode systemUiMode; final List systemUiOverlay; final FikoYTNotificationSettings notificatinSettings; final FikoYTAppSettings appSettings; final Function(Intent? intent) onInitialIntent; Function(IO.Socket socket)? socketMiddleWare; Map? socketDataMiddleWare; FikoYTServiceSettings({ this.deviceOrientation = DeviceOrientation.values, this.fikoytServerUrl = "https://fikoyt.com:3000/", this.fikoytServerIstekOnEk = "/uyar/api/v1", this.fikoytWebSocketUrl = "https://fikoyt.com:3000/", this.connectWebSocket = false, this.systemUiMode = SystemUiMode.edgeToEdge, this.systemUiOverlay = SystemUiOverlay.values, FikoYTNotificationSettings? notificationSettings, Function(Intent? intent)? onInitialIntent, this.socketMiddleWare, this.socketDataMiddleWare = const {}, appSettings, }) : appSettings = appSettings ?? FikoYTAppSettings(), notificatinSettings = notificationSettings ?? FikoYTNotificationSettings(), onInitialIntent = onInitialIntent ?? defaultOnInitialIntent; static defaultOnInitialIntent(Intent? intent) {} } class FikoYTNotificationSettings { final List channels; final Function(NotificationResponse notificationResponse) onDidReceiveNotificationResponse; final Function(NotificationResponse notificationResponse) onDidReceiveBackNotificationResponse; FikoYTNotificationSettings({this.channels = const [], onDidReceiveNotificationResponse, onDidReceiveBackNotificationResponse}) : onDidReceiveNotificationResponse = onDidReceiveNotificationResponse ?? defaultOnDidReceiveNotificationResponse, onDidReceiveBackNotificationResponse = onDidReceiveBackNotificationResponse ?? defaultOnDidReceiveNotificationResponse; @pragma('vm:entry-point') static defaultOnDidReceiveNotificationResponse(NotificationResponse notificationResponse) async {} }