import 'package:flutter/material.dart'; import 'package:yumi/ui_kit/widgets/svga/sc_svga_asset_widget.dart'; class SCSpecialIdAssets { static const String roomId = 'sc_images/general/room_id.svga'; static const String roomOwnerId = 'sc_images/general/room_id_custom.svga'; static const String userId = 'sc_images/general/user_id.svga'; static const String userIdLarge = 'sc_images/general/user_id_4.svga'; } class SCSpecialIdBadge extends StatelessWidget { const SCSpecialIdBadge({ super.key, required this.idText, this.showAnimated = false, this.assetPath, this.animationWidth = 120, this.animationHeight = 28, this.textPadding = EdgeInsets.zero, this.animationTextStyle, this.normalTextStyle, this.normalPrefix = 'ID:', this.showCopyIcon = false, this.copyIconAssetPath = 'sc_images/room/sc_icon_user_card_copy_id.png', this.copyIconSize = 12, this.copyIconSpacing = 5, this.copyIconColor, this.loop = true, this.active = true, this.animationFit = BoxFit.fill, }); final String idText; final bool showAnimated; final String? assetPath; final double animationWidth; final double animationHeight; final EdgeInsetsGeometry textPadding; final TextStyle? animationTextStyle; final TextStyle? normalTextStyle; final String normalPrefix; final bool showCopyIcon; final String copyIconAssetPath; final double copyIconSize; final double copyIconSpacing; final Color? copyIconColor; final bool loop; final bool active; final BoxFit animationFit; @override Widget build(BuildContext context) { final normalizedId = idText.trim(); final shouldAnimate = showAnimated && (assetPath?.isNotEmpty ?? false) && normalizedId.isNotEmpty; final children = [ shouldAnimate ? _buildAnimatedBadge(normalizedId) : _buildPlainBadge(normalizedId), ]; if (showCopyIcon) { children.add(SizedBox(width: copyIconSpacing)); children.add( Image.asset( copyIconAssetPath, width: copyIconSize, height: copyIconSize, color: copyIconColor, ), ); } return Row( mainAxisSize: MainAxisSize.min, textDirection: TextDirection.ltr, children: children, ); } Widget _buildAnimatedBadge(String normalizedId) { return SizedBox( width: animationWidth, height: animationHeight, child: Stack( clipBehavior: Clip.none, children: [ Positioned.fill( child: SCSvgaAssetWidget( assetPath: assetPath!, width: animationWidth, height: animationHeight, active: active, loop: loop, fit: animationFit, fallback: const SizedBox.shrink(), ), ), Positioned.fill( child: Padding( padding: textPadding, child: Align( alignment: Alignment.centerLeft, child: FittedBox( fit: BoxFit.scaleDown, alignment: Alignment.centerLeft, child: Text( normalizedId, maxLines: 1, overflow: TextOverflow.visible, style: animationTextStyle ?? const TextStyle( color: Colors.white, fontSize: 12, fontWeight: FontWeight.w700, ), ), ), ), ), ), ], ), ); } Widget _buildPlainBadge(String normalizedId) { return Text( '$normalPrefix$normalizedId', maxLines: 1, overflow: TextOverflow.ellipsis, style: normalTextStyle ?? const TextStyle( color: Colors.white, fontSize: 12, fontWeight: FontWeight.w600, ), ); } }