Untitled
unknown
plain_text
a year ago
27 kB
3
Indexable
// ignore_for_file: avoid_dynamic_calls, strict_raw_type
import 'package:clean/user_app/core/constants/extensions/widget_extensions.dart';
import 'package:clean/user_app/data/models/bet_slip/bet_slip_item/bet_slip_item.dart';
import 'package:clean/user_app/presentation/notifiers/spin_win/spin_win_notifier.dart';
import 'package:clean/user_app/presentation/resources/fonts_manager.dart';
import 'package:clean/user_app/presentation/resources/values_manager.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
// ignore_for_file: argument_type_not_assignable , list_element_type_not_assignable , invalid_assignment , return_of_invalid_type_from_closure,non_bool_operand
class OverlayView extends StatefulWidget {
const OverlayView({super.key});
@override
State<OverlayView> createState() => _OverlayViewState();
}
class _OverlayViewState extends State<OverlayView> {
late Size size;
late SpinAndWinNotifier _spinNotifier;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
_spinNotifier = Provider.of<SpinAndWinNotifier>(context, listen: false);
return _overlayView();
}
double overlayRightPadding = 0;
double overlayTopPadding = 0;
double largeNumberHeight = 85;
double largeNumberWidth = 80;
Widget _overlayView() => Selector<SpinAndWinNotifier, ValueListenable<bool>>(
selector: (_, SpinAndWinNotifier provider) => provider.value,
builder: (
BuildContext context,
ValueListenable<bool> value,
Widget? child,
) =>
ValueListenableBuilder<bool>(
valueListenable: value,
builder: (BuildContext context, bool value, Widget? child) {
if (value) {
return Container(
color: Colors.black54,
width: double.maxFinite,
height: double.maxFinite,
child: _overlayItem(),
).center();
} else {
return Container();
}
},
),
);
Widget _overlayItem() {
_spinNotifier.checkIfNumberInMid();
bool isTop = int.parse(
_spinNotifier.numbers[_spinNotifier.currentNumberIndex]['number'],
) %
3 ==
0;
String number = _spinNotifier.slectedNumber;
//double height = MediaQuery.sizeOf(context).height;
overlayRightPadding = MediaQuery.sizeOf(context).width / 2.5;
overlayTopPadding = 30;
return Stack(
children: <Widget>[
SizedBox(
height: largeNumberHeight * 3.5,
child: SingleChildScrollView(
child: SizedBox(
width: double.maxFinite,
height: largeNumberHeight * 3.5,
child: Stack(
clipBehavior: Clip.none,
children: <Widget>[
Positioned(
top: overlayTopPadding,
bottom: 0,
right: overlayRightPadding,
child: IgnorePointer(child: _overlaySide(isTop)),
),
if (!_spinNotifier.zeroClick)
Consumer<SpinAndWinNotifier>(
builder: (
BuildContext context,
SpinAndWinNotifier myType,
Widget? child,
) =>
_points(number, isTop),
),
Positioned(
top: 15,
right: 10,
child: GestureDetector(
onTap: () {
_spinNotifier.setValueNotifier(false);
_spinNotifier.setZeroClick(false);
},
child: const Icon(
Icons.close,
size: AppSize.s40,
),
),
),
],
),
),
),
),
],
);
}
Widget _overlaySide(bool isTop) {
bool lessThan3 = false;
bool lessThan36 = false;
if (!_spinNotifier.zeroClick) {
lessThan3 = (int.parse(_spinNotifier.slectedNumber) >= 0 &&
int.parse(_spinNotifier.slectedNumber) <= 3);
lessThan36 = (int.parse(_spinNotifier.slectedNumber) >= 34 &&
int.parse(_spinNotifier.slectedNumber) <= 36);
}
if (_spinNotifier.zeroClick) {
return _leftSideOverlay();
} else {
return lessThan3 || lessThan36
? lessThan36
? _rightSideOverlay()
: _leftSideOverlay()
: __midSideOverlay(isTop);
}
}
Column __midSideOverlay(bool isTop) => Column(
children: <Widget>[
Row(
children: <Widget>[
_largeNumberOverlay(
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex - 4
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex - 3
: _spinNotifier.currentNumberIndex - 5
: _spinNotifier.currentNumberIndex - 3]['number'],
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex - 4
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex - 3
: _spinNotifier.currentNumberIndex - 5
: _spinNotifier.currentNumberIndex - 3]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex - 1
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex
: _spinNotifier.currentNumberIndex - 2
: _spinNotifier.currentNumberIndex]['number'],
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex - 1
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex
: _spinNotifier.currentNumberIndex - 2
: _spinNotifier.currentNumberIndex]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex + 2
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 3
: _spinNotifier.currentNumberIndex + 1
: _spinNotifier.currentNumberIndex + 3]['number'],
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex + 2
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 3
: _spinNotifier.currentNumberIndex + 1
: _spinNotifier.currentNumberIndex + 3]['color'],
false,
),
],
),
Row(
children: <Widget>[
_largeNumberOverlay(
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex - 3
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex - 2
: _spinNotifier.currentNumberIndex - 4
: _spinNotifier.currentNumberIndex - 2]['number'],
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex - 3
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex - 2
: _spinNotifier.currentNumberIndex - 4
: _spinNotifier.currentNumberIndex - 2]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 1
: _spinNotifier.currentNumberIndex - 1
: _spinNotifier.currentNumberIndex + 1]['number'],
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 1
: _spinNotifier.currentNumberIndex - 1
: _spinNotifier.currentNumberIndex + 1]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex + 3
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 4
: _spinNotifier.currentNumberIndex + 2
: _spinNotifier.currentNumberIndex + 4]['number'],
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex + 3
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 4
: _spinNotifier.currentNumberIndex + 2
: _spinNotifier.currentNumberIndex + 4]['color'],
false,
),
],
),
Row(
children: <Widget>[
_largeNumberOverlay(
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex - 2
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex - 1
: _spinNotifier.currentNumberIndex - 3
: _spinNotifier.currentNumberIndex - 1]['number'],
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex - 2
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex - 1
: _spinNotifier.currentNumberIndex - 3
: _spinNotifier.currentNumberIndex - 1]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex + 1
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 2
: _spinNotifier.currentNumberIndex
: _spinNotifier.currentNumberIndex + 2]['number'],
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex + 1
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 2
: _spinNotifier.currentNumberIndex
: _spinNotifier.currentNumberIndex + 2]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex + 4
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 5
: _spinNotifier.currentNumberIndex + 3
: _spinNotifier.currentNumberIndex + 5]['number'],
_spinNotifier.numbers[_spinNotifier.isMid
? _spinNotifier.currentNumberIndex + 4
: _spinNotifier.currentNumberIndex >= 4
? isTop
? _spinNotifier.currentNumberIndex + 5
: _spinNotifier.currentNumberIndex + 3
: _spinNotifier.currentNumberIndex + 5]['color'],
false,
),
],
),
],
);
Widget _points(String number, bool isTop) {
int num = 0;
try {
num = int.parse(number);
} catch (e) {
num = 0;
}
double? right =
num < 34 ? overlayRightPadding + largeNumberWidth : overlayRightPadding;
double? top = _spinNotifier.zeroClick
? overlayTopPadding + 150
: isTop
? overlayTopPadding
: _spinNotifier.isMid
? overlayTopPadding + largeNumberHeight
: overlayTopPadding + largeNumberHeight * 2;
return Positioned(
top: top - 10,
right: right - 20,
child: _pointsIcons(number),
);
}
Widget _leftSideOverlay() => Stack(
children: <Widget>[
Row(
children: <Widget>[
Align(
alignment: Alignment.topCenter,
child: Container(
height: largeNumberHeight * 3,
width: 70,
decoration: BoxDecoration(
color: Colors.green.shade900,
border: Border.all(color: Colors.white, width: 1.8),
),
child: const Text(
'0',
style: TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
),
).center(),
),
),
Column(
children: <Widget>[
_largeNumberOverlay(
_spinNotifier.numbers[0]['number'],
_spinNotifier.numbers[0]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[1]['number'],
_spinNotifier.numbers[1]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[2]['number'],
_spinNotifier.numbers[2]['color'],
false,
),
],
),
if (_spinNotifier.currentNumberIndex <= 2 &&
!_spinNotifier.zeroClick)
Column(
children: <Widget>[
_largeNumberOverlay(
_spinNotifier.numbers[3]['number'],
_spinNotifier.numbers[3]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[4]['number'],
_spinNotifier.numbers[4]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[5]['number'],
_spinNotifier.numbers[5]['color'],
false,
),
],
),
],
),
if (_spinNotifier.zeroClick)
Consumer<SpinAndWinNotifier>(
builder: (
BuildContext context,
SpinAndWinNotifier myType,
Widget? child,
) =>
_pointsIconsZero('0'),
),
],
);
Row _rightSideOverlay() => Row(
children: <Widget>[
Column(
children: <Widget>[
_largeNumberOverlay(
_spinNotifier.numbers[30]['number'],
_spinNotifier.numbers[30]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[31]['number'],
_spinNotifier.numbers[31]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[32]['number'],
_spinNotifier.numbers[32]['color'],
false,
),
],
),
Column(
children: <Widget>[
_largeNumberOverlay(
_spinNotifier.numbers[33]['number'],
_spinNotifier.numbers[33]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[34]['number'],
_spinNotifier.numbers[34]['color'],
false,
),
_largeNumberOverlay(
_spinNotifier.numbers[35]['number'],
_spinNotifier.numbers[35]['color'],
false,
),
],
),
],
);
Widget _largeNumberOverlay(
String number,
Color color,
bool show,
) {
int currentNumber = int.parse(
_spinNotifier.numbers[_spinNotifier.currentNumberIndex]['number'],
);
bool isTop = currentNumber % 3 == 0;
return _spinNotifier.value.value &&
_spinNotifier.slectedNumber == number &&
!_spinNotifier.zeroClick &&
_spinNotifier.currentNumberIndex > 3
? _numbersGraterthan3(color, number, isTop)
: _spinNotifier.slectedNumber == number && !_spinNotifier.zeroClick
? _stackOfZeroSelctedNumber(color, number, isTop)
: Container(
height: largeNumberHeight,
width: largeNumberWidth,
decoration: BoxDecoration(
color: color,
border: Border.all(color: Colors.white, width: 1.2),
),
child: Text(
number,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: FontSize.s12,
),
).center(),
);
}
Widget _stackOfZeroSelctedNumber(Color color, String number, bool isTop) =>
Consumer<SpinAndWinNotifier>(
builder:
(BuildContext context, SpinAndWinNotifier myType, Widget? child) =>
Stack(
clipBehavior: Clip.none,
children: <Widget>[
Container(
height: largeNumberHeight,
width: largeNumberWidth,
decoration: BoxDecoration(
color: color,
border: Border.all(color: Colors.white, width: 1.2),
),
child: Text(
number,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: FontSize.s12,
),
).center(),
),
],
),
);
Widget _numbersGraterthan3(Color color, String number, bool isTop) =>
Container(
height: largeNumberHeight,
width: largeNumberWidth,
decoration: BoxDecoration(
color: color,
border: Border.all(color: Colors.white, width: 1.2),
),
child: Text(
number,
textAlign: TextAlign.center,
style: const TextStyle(
color: Colors.white,
fontWeight: FontWeight.bold,
fontSize: FontSize.s12,
),
).center(),
);
_pointsIcons(String number) {
List<Widget> stakeList = <Widget>[];
for (final BetSlipItem betSlipItem in _spinNotifier.spinBets) {
List location = betSlipItem.locations;
for (final element in location) {
if (!_spinNotifier.zeroClick) {
_checkParent(element, number, stakeList, betSlipItem);
}
}
}
return Container(
color: Colors.transparent,
height: largeNumberHeight * 2,
width: largeNumberWidth * 2,
child: Stack(
children: stakeList,
),
);
}
_pointsIconsZero(
String number,
) {
List<Widget> stakeList = <Widget>[];
for (final BetSlipItem betSlipItem in _spinNotifier.spinBets) {
List location = betSlipItem.locations;
for (final element in location) {
if (_spinNotifier.zeroClick) {
__checkZeroParent(element, stakeList, betSlipItem);
}
}
}
return SizedBox(
height: largeNumberHeight * 3.2,
width: 100,
child: Stack(
children: stakeList,
),
);
}
void __checkZeroParent(
element,
List<Widget> stakeList,
BetSlipItem betSlipItem,
) {
if (element['parent'].toString() == '2' &&
element['position'].toString().toLowerCase() == 'l') {
stakeList.add(
Positioned(
right: 20,
top: 115,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == '3' &&
element['position'].toString().toLowerCase() == 'l') {
stakeList.add(
Positioned(
right: 20,
top: 35,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == '0' &&
element['position'].toString().toLowerCase() == 'c') {
stakeList.add(
Positioned(
left: 20,
bottom: 90,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == '1' &&
element['position'].toString().toLowerCase() == 'l') {
stakeList.add(
Positioned(
right: 20,
bottom: 45,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == '1' &&
element['position'].toString().toLowerCase() == 'bl') {
stakeList.add(
Positioned(
right: 20,
bottom: 2,
child: _pointCircle(betSlipItem),
),
);
}
}
void _checkParent(
element,
String number,
List<Widget> stakeList,
BetSlipItem betSlipItem,
) {
if (element['parent'].toString() == number &&
element['position'].toString().toLowerCase() == 'c') {
stakeList.add(
Positioned(
right: 67,
top: 20,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == number &&
element['position'].toString().toLowerCase() == 'tl') {
stakeList.add(
Positioned(
top: 0,
left: 50,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == number &&
element['position'].toString().toLowerCase() == 't') {
stakeList.add(
Positioned(
top: 0,
left: 90,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == number &&
element['position'].toString().toLowerCase() == 'tr') {
stakeList.add(
Positioned(
top: 0,
right: 10,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == number &&
element['position'].toString().toLowerCase() == 'r') {
stakeList.add(
Positioned(
top: 40,
right: 10,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == number &&
element['position'].toString().toLowerCase() == 'bl') {
stakeList.add(
Positioned(
bottom: 70,
left: 50,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == number &&
element['position'].toString().toLowerCase() == 'br') {
stakeList.add(
Positioned(
bottom: 70,
right: 12,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == number &&
element['position'].toString().toLowerCase() == 'b') {
stakeList.add(
Positioned(
bottom: 70,
left: 90,
child: _pointCircle(betSlipItem),
),
);
}
if (element['parent'].toString() == number &&
element['position'].toString().toLowerCase() == 'l') {
stakeList.add(
Positioned(
top: 40,
left: 50,
child: _pointCircle(betSlipItem),
),
);
}
}
GestureDetector _pointCircle(BetSlipItem betSlipItem) => GestureDetector(
onTap: () {
_spinNotifier.betslipAction(
betSlipItem,
);
},
child: Container(
color: Colors.transparent,
constraints: const BoxConstraints(maxWidth: 30, maxHeight: 30),
child: Container(
constraints: const BoxConstraints(maxWidth: 20, maxHeight: 20),
child: CircleAvatar(
radius: 10,
backgroundColor: _spinNotifier.isBetExist(betSlipItem)
? Colors.green
: Colors.white,
child: Icon(
_spinNotifier.isBetExist(betSlipItem)
? Icons.check_circle
: Icons.circle,
color: _spinNotifier.isBetExist(betSlipItem)
? Colors.white
: Colors.grey,
size: 14,
),
),
),
),
);
}
Editor is loading...
Leave a Comment