82 lines
1.7 KiB
Dart
82 lines
1.7 KiB
Dart
import 'package:flutter/widgets.dart';
|
|
|
|
import '../config/app_bubble_behavior.dart';
|
|
import '../config/app_bubble_shape.dart';
|
|
|
|
const double kBubbleBigRadius = 20;
|
|
const double kBubbleSmallRadius = 4;
|
|
|
|
const Radius _big = Radius.circular(kBubbleBigRadius);
|
|
const Radius _small = Radius.circular(kBubbleSmallRadius);
|
|
|
|
BorderRadius computeBubbleRadius({
|
|
required bool isMe,
|
|
required bool isTop,
|
|
required bool isBottom,
|
|
required BubbleStyle style,
|
|
required BubbleBehavior behavior,
|
|
bool hasPhotoWithCaption = false,
|
|
bool hasMultiplePhotosNoCaption = false,
|
|
}) {
|
|
final isSingle = isTop && isBottom;
|
|
|
|
if (hasPhotoWithCaption && (isTop || isBottom)) {
|
|
return BorderRadius.only(
|
|
topLeft: _big,
|
|
topRight: _big,
|
|
bottomLeft: isMe ? _big : _small,
|
|
bottomRight: _small,
|
|
);
|
|
}
|
|
|
|
if (hasMultiplePhotosNoCaption && isBottom) {
|
|
return BorderRadius.only(
|
|
topLeft: isMe ? _big : _small,
|
|
topRight: _small,
|
|
bottomLeft: isMe ? _big : _small,
|
|
bottomRight: isMe ? _small : _big,
|
|
);
|
|
}
|
|
|
|
final base = style == BubbleStyle.desktop ? _small : _big;
|
|
Radius tl = base, tr = base, bl = base, br = base;
|
|
|
|
if (behavior == BubbleBehavior.immutable || isSingle) {
|
|
return BorderRadius.only(
|
|
topLeft: tl,
|
|
topRight: tr,
|
|
bottomLeft: bl,
|
|
bottomRight: br,
|
|
);
|
|
}
|
|
|
|
if (isTop) {
|
|
if (isMe) {
|
|
br = _small;
|
|
} else {
|
|
bl = _small;
|
|
}
|
|
} else if (isBottom) {
|
|
if (isMe) {
|
|
tr = _small;
|
|
} else {
|
|
tl = _small;
|
|
}
|
|
} else {
|
|
if (isMe) {
|
|
tr = _small;
|
|
br = _small;
|
|
} else {
|
|
tl = _small;
|
|
bl = _small;
|
|
}
|
|
}
|
|
|
|
return BorderRadius.only(
|
|
topLeft: tl,
|
|
topRight: tr,
|
|
bottomLeft: bl,
|
|
bottomRight: br,
|
|
);
|
|
}
|