Files
iiEsaywebUIapp/lib/features/chat/views/chat_page_helpers.dart

69 lines
1.6 KiB
Dart
Raw Normal View History

2025-08-10 01:20:45 +05:30
import 'package:flutter/material.dart';
import '../../../shared/theme/theme_extensions.dart';
class PressableScale extends StatefulWidget {
final Widget child;
final VoidCallback? onTap;
final BorderRadius? borderRadius;
const PressableScale({
super.key,
required this.child,
this.onTap,
this.borderRadius,
});
@override
State<PressableScale> createState() => _PressableScaleState();
}
class _PressableScaleState extends State<PressableScale>
with SingleTickerProviderStateMixin {
late AnimationController _controller;
late Animation<double> _scale;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: AnimationDuration.fast,
lowerBound: 0.0,
upperBound: 1.0,
);
_scale = Tween<double>(begin: 1.0, end: 0.98).animate(
CurvedAnimation(parent: _controller, curve: AnimationCurves.easeInOut),
);
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
void _onTapDown(TapDownDetails _) => _controller.forward();
void _onTapUp(TapUpDetails _) => _controller.reverse();
void _onTapCancel() => _controller.reverse();
@override
Widget build(BuildContext context) {
return GestureDetector(
onTapDown: _onTapDown,
onTapUp: _onTapUp,
onTapCancel: _onTapCancel,
onTap: widget.onTap,
child: ScaleTransition(
scale: _scale,
child: ClipRRect(
borderRadius:
widget.borderRadius ??
BorderRadius.circular(AppBorderRadius.card),
child: widget.child,
),
),
);
}
}