Untitled

 avatar
unknown
plain_text
5 months ago
27 kB
2
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