THATMobile/lib/core/components/image/custom_image.dart
2026-02-26 10:39:42 +07:00

191 lines
5.6 KiB
Dart

import 'dart:io';
import 'dart:typed_data';
import 'package:baseproject/assets/images.dart';
import 'package:baseproject/core/common/utils.dart';
import 'package:baseproject/core/components/image/show_image.dart';
import 'package:baseproject/features/presentation/app/view/app.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_spinkit/flutter_spinkit.dart';
import 'package:flutter_svg/svg.dart';
// ignore: non_constant_identifier_names
Widget CustomImage({
String? imageUrl,
BoxFit? fit,
Widget? imageDefault,
File? file,
Uint8List? data,
double? width,
double? height,
double? radius,
Color? color,
bool isCrop = true,
bool isShowLoading = true,
bool viewImage = false,
String imageCropMode = 'crop',
ImageRepeat repeat = ImageRepeat.noRepeat,
}) {
var isViewImage = viewImage;
if (imageUrl != null && imageUrl.trim().isNotEmpty) {
if (imageUrl.contains("http")) {
switch (getMediaType(imageUrl)) {
default:
return GestureDetector(
onTap: () {
isViewImage == false ? null : showImage(navigatorKey!.currentState!.context, imageUrl);
},
child: CachedNetworkImage(
repeat: repeat,
imageUrl: isCrop
? Utils.thumbnailImage(imageUrl, width: width, height: height, mode: imageCropMode)
: imageUrl,
width: width,
height: height,
imageBuilder: (width != null && height != null)
? (BuildContext context, ImageProvider _imageUrl) {
return Container(
width: width,
height: height,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(radius ?? 0),
image: DecorationImage(
image: imageUrl.contains('.gif') ? NetworkImage(imageUrl) : _imageUrl,
fit: fit ?? BoxFit.contain),
),
// child: Image.network(imageUrl, fit: fit ?? BoxFit.contain),
);
}
: null,
placeholder: (_, __) => isShowLoading
? const SpinKitCircle(
color: Colors.white,
size: 50.0,
)
: const SizedBox(),
fit: fit,
errorWidget: (_, __, dynamic error) {
isViewImage = false;
return imageDefault ?? _buildImageDefault(fit, width, height, radius);
}),
);
}
} else if (imageUrl.contains('data')) {
return Image.file(
File(imageUrl),
fit: fit,
width: width,
height: height,
repeat: repeat,
);
} else {
return Image.asset(
imageUrl,
fit: fit,
width: width,
height: height,
color: color,
repeat: repeat,
);
}
} else if (file != null) {
return Image.file(
file,
fit: fit,
width: width,
height: height,
repeat: repeat,
);
} else if (data != null) {
return Image.memory(
data,
fit: fit,
width: width,
height: height,
repeat: repeat,
);
}
return imageDefault ?? _buildImageDefault(fit, width, height, radius);
}
Widget _buildImageDefault(BoxFit? fit, double? width, double? height, double? radius) {
return Container(
width: width,
height: height,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(radius ?? 0),
image: DecorationImage(
image: const AssetImage(Images.imageDefault),
fit: fit ?? BoxFit.contain,
),
),
);
}
MediaType getMediaType(String path) {
if (getVideo(path)) {
return MediaType.mp4;
} else if (path.contains('http')) {
if (path.contains('sticker')) {
return MediaType.sticker;
} else if (path.contains('svg')) {
return MediaType.svgNetwork;
} else if (path.contains('jpg') ||
path.contains('jpeg') ||
path.contains('JPG') ||
path.contains('png') ||
path.contains('.gif')) {
return MediaType.jpgNetwork;
} else if (path.contains('mp4')) {
return MediaType.mp4;
}
return MediaType.file;
} else if (path.contains("data")) {
return MediaType.file;
} else if (path.contains('svg')) {
return MediaType.svgLocal;
} else if (path.contains('png') || path.contains('jpg') || path.contains('JPG') || path.contains('jpeg')) {
return MediaType.pngLocal;
}
return MediaType.waiting;
}
enum MediaType { mp4, svgLocal, svgNetwork, pngLocal, pngNetwork, jpgNetwork, file, waiting, sticker }
bool getVideo(String path) =>
path.contains("mp4") || path.contains("MP4") || path.contains("MOV") || path.contains("mov");
Widget svgImage(String path,
{Color? color,
double? width,
double? height,
bool cacheColorFilter = false,
BoxFit fit = BoxFit.contain,
String? package}) {
if (path.contains("http")) {
if (path.contains('jpg') || path.contains('png')) {
return CustomImage(imageUrl: path, width: width, height: height, fit: fit);
}
return SvgPicture.network(
path,
cacheColorFilter: cacheColorFilter,
color: color,
width: width,
height: height,
fit: fit,
);
}
return SvgPicture.asset(
path,
cacheColorFilter: cacheColorFilter,
color: color,
width: width,
height: height,
fit: fit,
package: package,
);
}