// ignore_for_file: curly_braces_in_flow_control_structures import 'package:cached_network_image/cached_network_image.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_svg/svg.dart'; import 'package:hoshan/core/gen/assets.gen.dart'; import 'package:hoshan/core/services/api/dio_service.dart'; import 'package:hoshan/data/storage/shared_preferences_helper.dart'; import 'package:hoshan/ui/theme/cubit/theme_mode_cubit.dart'; import 'package:hoshan/ui/widgets/components/dialog/dialog_handler.dart'; import 'package:hoshan/ui/widgets/sections/loading/default_placeholder.dart'; import 'package:string_validator/string_validator.dart'; import 'package:cached_network_image_platform_interface/cached_network_image_platform_interface.dart'; class ImageNetwork extends StatefulWidget { final String? url; final String? baseUrl; final double radius; final double? width; final double? height; final bool showHero; final Widget? error; final Widget? placeholder; final BoxFit fit; final Color? color; final BlendMode? blendMode; const ImageNetwork( {super.key, required this.url, this.radius = 0, this.showHero = false, this.error, this.width, this.height, this.fit = BoxFit.cover, this.baseUrl, this.placeholder, this.color, this.blendMode}); @override State createState() => _ImageNetworkState(); } class _ImageNetworkState extends State { @override Widget build(BuildContext context) { bool inError = false; final token = AuthTokenStorage.getToken(); if (widget.url == null) return SizedBox( width: widget.width, height: widget.height, child: ClipRRect( borderRadius: BorderRadius.circular(widget.radius), child: Container( decoration: BoxDecoration(color: Theme.of(context).colorScheme.surface), child: (context.read().isDark() ? Assets.icon.launcherIcons.houshanIconWhie : Assets.icon.launcherIcons.houshanIconPrimary) .image(), ), ), ); final url = '${widget.baseUrl ?? (widget.url!.isURL() ? '' : DioService.baseURL)}${widget.url}'; if (widget.url!.isEmpty) return const SizedBox.shrink(); return GestureDetector( onTap: widget.showHero ? () { if (!inError) { DialogHandler(context: context) .showImageHero(image: widget.url!); } } : null, child: SizedBox( width: widget.width, height: widget.height, child: ClipRRect( borderRadius: BorderRadius.circular(widget.radius), child: widget.url!.split('.').last == 'svg' ? SvgPicture.network( widget.url!, fit: widget.fit, headers: url.startsWith(DioService.baseURL) ? { 'Authorization': "Bearer $token", } : null, placeholderBuilder: (context) => widget.placeholder ?? DefaultPlaceHolder( child: Container( height: MediaQuery.sizeOf(context).height, width: MediaQuery.sizeOf(context).width, color: Colors.white, ), ), errorBuilder: (context, url, error) { inError = true; if (kDebugMode) { print("Catch image with Url: $url Failed Error: $error"); } return widget.error ?? AspectRatio( aspectRatio: 1 / 1, child: Container( color: Theme.of(context).colorScheme.surface, child: Icon( Icons.image_not_supported_outlined, color: Theme.of(context).colorScheme.onSurface, ), ), ); }, ) : CachedNetworkImage( fit: widget.fit, color: widget.color, colorBlendMode: widget.blendMode, httpHeaders: url.startsWith(DioService.baseURL) ? { 'Authorization': "Bearer $token", } : null, imageRenderMethodForWeb: ImageRenderMethodForWeb.HttpGet, imageUrl: url, placeholder: (context, url) => widget.placeholder ?? DefaultPlaceHolder( child: Container( height: MediaQuery.sizeOf(context).height, width: MediaQuery.sizeOf(context).width, color: Colors.white, ), ), errorWidget: (context, url, error) { inError = true; if (kDebugMode) { print("Catch image with Url: $url Failed Error: $error"); } return widget.error ?? AspectRatio( aspectRatio: 1 / 1, child: Container( color: Theme.of(context).colorScheme.surface, child: Icon( Icons.image_not_supported_outlined, color: Theme.of(context).colorScheme.onSurface, ), ), ); }, ), ), ), ); } }