Created
April 8, 2023 10:47
-
-
Save kevincarpdev/ad6fb9acd1891f0a7e9a5188e3446d2a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import React, { useEffect } from 'react'; | |
| import { View, ScrollView, ActivityIndicator } from 'react-native'; | |
| import { Text } from 'react-native-paper'; | |
| import { Slider } from '@miblanchard/react-native-slider'; | |
| import { | |
| CONSTANT_COLOR as CC, | |
| CONSTANT_COLOR, | |
| GLOBAL_STYLE, | |
| GLOBAL_STYLE as GS, | |
| icons, | |
| } from '../../../assets'; | |
| import Moment from 'moment'; | |
| import { ticketFactory, gameSettings } from 'CanvasLotteryDemo'; | |
| import crashlytics from '@react-native-firebase/crashlytics'; | |
| import { | |
| BButton, | |
| BIcon, | |
| BImage, | |
| BListItem, | |
| BPageHeader, | |
| BSeparator, | |
| BSwitch, | |
| BTimer, | |
| Footer, | |
| GenerateQrCodeModal, | |
| InfoButton, | |
| Layout, | |
| SizedBox, | |
| CustomTrackSlider, | |
| BToggle, | |
| BModal, | |
| BModalHeader, | |
| BModalFooter, | |
| } from '../../../components'; | |
| // | |
| import { OptionSelectable, TransparentContainer } from './components'; | |
| // | |
| import { | |
| FavoritePayslipsView, | |
| ManualPlayView, | |
| QuickPlayView | |
| } from './views'; | |
| // | |
| import styles from './styles'; | |
| import { | |
| AddToFavoritesModal, | |
| ConfirmationModal, | |
| StatisticModal, | |
| } from './modals'; | |
| import { FavoriteCoupon, LotteryGame, LotteryGameSettings, Ticket } from '../../../types'; | |
| import LinearGradient from 'react-native-linear-gradient'; | |
| import { useNavigation } from '@react-navigation/native'; | |
| import { ApiClient } from '../../../api'; | |
| import { useMutation } from 'react-query'; | |
| import mobxStore, { CartTicket } from '../../../store/RootStore'; | |
| import { AxiosError } from 'axios'; | |
| import { useAuthContext } from '../../../context/auth/auth.context'; | |
| import { useGameFutureDraws } from '../../../hooks/useGameFutureDraws'; | |
| import moment from 'moment'; | |
| import { useAppContext } from '../../../context/auth/app.context'; | |
| import LoadingScreen from '../../Loading.screen'; | |
| import { | |
| getDCTotalCostDetails, | |
| getTabColor, | |
| getTotalCostOfTicket, | |
| isDCGame, | |
| isDCTimeZone, | |
| isMegaMillion, | |
| isPowerBall, | |
| isR2RGame, | |
| loadFavoriteCoupon, | |
| multidrawValueToMultidrawObject, | |
| sliderIndexToMultidrawObject, | |
| utilsGetBuyNowButtonEnabled, | |
| utilsGetDCFromIndex, | |
| utilsGetDrawDays, | |
| utilsGetUpdateSliderMaxValue, | |
| } from '../../../helpers/utils'; | |
| import ViewNumericalGameInfoModal from './modals/ViewNumericalGameInfoModal'; | |
| import MessageModal from './modals/MessageModal'; | |
| import { GameCardDrawResults } from '../../../components/Carousel/Carousel.component'; | |
| import { useLastDraw } from '../../../hooks/useLastDraw'; | |
| import GenericSuccessModal from '../../../components/Common/GenericSuccessModal'; | |
| // | |
| enum NUMERICAL_GAME_VIEW { | |
| MANUEL_PLAY = 'MANUEL_PLAY', | |
| QUICK_PLAY = 'QUICK_PLAY', | |
| SYSTEM_PLAY = 'SYSTEM_PLAY', | |
| FAVORITE_PAYSLIPS = 'FAVORITE_PAYSLIPS', | |
| } | |
| const ADVANCE_PLAYS = [ | |
| {label: "TODAY", value: "TOD", indexDay: null}, | |
| {label: "SUNDAY", value: "SUN", indexDay: 7}, | |
| {label: "MONDAY", value: "MON", indexDay: 1}, | |
| {label: "TUESDAY", value: "TUE", indexDay: 2}, | |
| {label: "WEDNESDAY", value: "WED", indexDay: 3}, | |
| {label: "THURSDAY", value: "THU", indexDay: 4}, | |
| {label: "FRIDAY", value: "FRI", indexDay: 5}, | |
| {label: "SATURDAY", value: "SAT", indexDay: 6} | |
| ]; | |
| export enum NumericalGameInnerActionTypes { | |
| editFavorite = 'editFavorite', | |
| buyNow_quick_play = 'buyNow_quick_play', | |
| } | |
| export interface MultiDrawTicketClient { | |
| value: number; | |
| sliderIndex: number; | |
| } | |
| const NumericalGameInnerScreen = ({ route }: any) => { | |
| const { | |
| item, | |
| gameId, | |
| quickPick, | |
| action, | |
| favoriteCoupon, | |
| cartItem | |
| }: { | |
| item: any; | |
| gameId: number; | |
| quickPick?: any; | |
| action: NumericalGameInnerActionTypes; | |
| favoriteCoupon: FavoriteCoupon; | |
| cartItem?: CartTicket; | |
| } = route.params; | |
| const navigation = useNavigation(); | |
| const { isAuthenticated, setShowLoginModal } = useAuthContext(); | |
| const { isAppDataLoading, appData } = useAppContext(); | |
| var config: LotteryGameSettings = gameSettings.getConfigForGame({ gameId: gameId }); | |
| const { data: gameLastDraw, fetch: refetchGameLastDraw } = useLastDraw(`${gameId}`, { config: undefined}); | |
| let lotteryGame: LotteryGame | null = null; | |
| if (appData && appData.response.lotteryGames) { | |
| lotteryGame = appData.response.lotteryGames[gameId]; | |
| } | |
| const [disableManualInput, setDisableManualInput] = | |
| React.useState<boolean>(false); | |
| const [ticket, setTicket] = React.useState<Ticket>( | |
| ticketFactory.createDefault({ gameId, config }), | |
| ); | |
| const [selectedFavoriteTicket, setSelectedFavoriteTicket] = | |
| React.useState<FavoriteCoupon | null>(null); | |
| const [currentCartItem, setCurrentCartItem] = | |
| React.useState<CartTicket | null>(null); | |
| const [verifyTicketObj, setVerifyTicketObj] = React.useState<any>(null); | |
| const [ticketOptions, setTicketOptions] = React.useState<any>([]); | |
| const [currentView, setCurrentView] = React.useState<NUMERICAL_GAME_VIEW>( | |
| NUMERICAL_GAME_VIEW.MANUEL_PLAY, | |
| ); | |
| const [multiDraws, setMultiDraws] = React.useState<MultiDrawTicketClient>({ | |
| value: 1, | |
| sliderIndex: 1, | |
| }); | |
| const [showGenerateQrCodeModal, setShowGenerateQrCodeModal] = | |
| React.useState(false); | |
| const [showFavoriteNumberModal, setShowFavoriteNumberModal] = | |
| React.useState(false); | |
| const [showGameInfoModal, setShowGameInfoModal] = React.useState(false); | |
| const [showMegaplierConfirmation, setShowMegaplierConfirmation] = React.useState<any>(null); | |
| const [showStatisticModal, setShowStatisticModal] = React.useState(false); | |
| // const [ticketTotal, setTicketTotal] = React.useState(0); | |
| const [disableTicketSubmit, setDisableTicketSubmit] = React.useState(false); | |
| const [showBuyConfirmationModal, setShowBuyConfirmationModal] = | |
| React.useState(false); | |
| const [showBuyMessageModal, setShowBuyMessageModal] = React.useState(false); | |
| const [showJTJConfirmationModal, setShowJTJConfirmationModal] = React.useState<any>(null); | |
| const [serialNumber, setSerialNumber] = React.useState<number | null>(null); | |
| const [isModified, setIsModified] = React.useState<boolean>(false); | |
| const [isScreenFocused, setIsScreenFocused] = React.useState<boolean>(false); | |
| const [showSuccessAddFavorite, setShowSuccessAddFavorite] = React.useState<boolean>(false); | |
| const [showSuccessMessage, setShowSuccessMessage] = React.useState<string>(""); | |
| const [cachedTicketPerPlays, setCachedTicketPerPlays] = React.useState<any>({ | |
| "MANUEL_PLAY": null, | |
| "QUICK_PLAY": null, | |
| "SYSTEM_PLAY": null, | |
| "FAVORITE_PAYSLIPS": null | |
| }); | |
| // let ticketActiveBoards = | |
| // ticket.boards.filter((entry) => | |
| // entry.panels.some((pEntry) => pEntry.selections.length > 0), | |
| // ).length || 0; | |
| const [advancePlay, setAdvancePlay] = React.useState<any>(ADVANCE_PLAYS[0].value); | |
| const [DRAW_TIMES, SET_DRAW_TIMES] = React.useState<any>([ | |
| {label:'DAY', value: 'MOR'}, | |
| {label:'NIGHT', value: 'EVE'}, | |
| {label:'BOTH', value: 'BOTH'} | |
| ]); | |
| const [drawTime, setDrawTime] = React.useState<any>(DRAW_TIMES[2].value); | |
| const [dcMultipleDrawsMaxValue, setDCMultipleDrawsMaxValue] = React.useState<number | null | undefined>(null); | |
| const [dcDetailsFrom, setDcDetailsFrom] = React.useState<any | null>(null); | |
| const [dcDetailsTo, setDcDetailsTo] = React.useState<any | null>(null); | |
| const [quickPickIndexSelected, setQuickIndexSelected] = React.useState<number | null>(null); | |
| // TO REVISIT | |
| const [dcDetailsFromIndex, setDcDetailsFromIndex] = React.useState<number>(0); | |
| const [dcDetailsToIndex, setDcDetailsToIndex] = React.useState<number>(0); | |
| const [displayTabs, setDisplayTabs] = React.useState<boolean>(true); | |
| let ticketActiveBoards = ticket | |
| .boards | |
| .filter((entry) => entry.panels.some((pEntry) => pEntry.selections.length > 0)).length || 0; | |
| let ticketNonCompletedBoards = ticket | |
| .boards | |
| .filter((entry) => entry.panels.some((pEntry) => pEntry.selections.length == 0)).length || 0; | |
| let ticketTotal = getTotalCostOfTicket(gameId, ticket, ticketOptions, config, multiDraws); | |
| const ticketCanBeSubmited = isAuthenticated && (ticketActiveBoards > 0 || ticketOptions.find((entry) => entry.canPlayAlone)); | |
| const isJTJ = (ticketOptions ?? []).find((entry) => entry.id === 'JTJ') != null ? true : false; | |
| var isSliderDisabled = false; | |
| if (isR2RGame(gameId)) { | |
| if (ticket && ticket.boards.length > 0 && ticket.boards[0].options?.length > 0) { | |
| const dailyDoubleOption = ticket.boards[0].options.find((e) => e.id == "DAILY DOUBLE"); | |
| if (dailyDoubleOption) { | |
| isSliderDisabled = true; | |
| } | |
| } | |
| } | |
| var isR2RBonusEnabled = false; | |
| if (ticketOptions.length > 0 && isR2RGame(gameId)) { | |
| const bonus = ticketOptions.find((e) => e.name == "Bonus" || e.id == "PowerPlay"); | |
| if (bonus) { | |
| isR2RBonusEnabled = true; | |
| } | |
| } | |
| let playDays: string[] = utilsGetDrawDays(gameId, appData, config); | |
| const canDisplayTotal = () => { | |
| var hideTotal = ticketNonCompletedBoards > 0 && !isJTJ; | |
| if (isR2RGame(gameId)) { | |
| const haveSomePanels = ticket.boards.filter((entry) => entry.panels.some((pEntry) => pEntry.selections.length > 0)).length || 0; | |
| if (haveSomePanels) { | |
| hideTotal = false; | |
| } | |
| } | |
| return !hideTotal; | |
| } | |
| useEffect(() => { | |
| if (action === 'editFavorite' && favoriteCoupon) { | |
| setSelectedFavoriteTicket(favoriteCoupon); | |
| const { multidraws, newTicketOptions, shouldDisableInput, newTicket } = | |
| loadFavoriteCoupon(gameId, config, favoriteCoupon); | |
| setMultiDraws(multidrawValueToMultidrawObject(multidraws, isDcGame(), isDrawTimeBoth(), isR2RGame(gameId))); | |
| setDisableManualInput(shouldDisableInput); | |
| newTicket.addOptions(newTicketOptions); | |
| setTicketOptions(newTicketOptions); | |
| setTicket(Object.create(newTicket)); | |
| setCurrentView(NUMERICAL_GAME_VIEW.FAVORITE_PAYSLIPS); | |
| } else if (action === 'buyNow_quick_play') { | |
| setCurrentView(NUMERICAL_GAME_VIEW.QUICK_PLAY); | |
| } else { | |
| setCurrentView(NUMERICAL_GAME_VIEW.MANUEL_PLAY); | |
| resetTicket(); | |
| } | |
| // eslint-disable-next-line react-hooks/exhaustive-deps | |
| }, [gameId]); | |
| useEffect(() => { | |
| // FOR CART -> REFACTORING NEEDED ! | |
| return navigation.addListener("focus", () => { | |
| if (cartItem && cartItem.ticket) { | |
| setCurrentCartItem(cartItem); | |
| handleSetUpCartTicket(); | |
| } | |
| setIsScreenFocused(true); | |
| setTimeout(() => { | |
| setIsScreenFocused(false); | |
| }, 1000); | |
| }); | |
| }, [navigation]); | |
| const handleSetUpCartTicket = () => { | |
| if (cartItem && cartItem.ticket) { | |
| const newTicket = cartItem.ticket; | |
| setDisableManualInput(cartItem.shouldDisableInput); | |
| newTicket.addOptions(cartItem.newOptions); | |
| setTicketOptions(cartItem.newOptions); | |
| if (cartItem.advancePlay) { | |
| newTicket.setDaySelection(advancePlay); | |
| setAdvancePlay(cartItem.advancePlay); | |
| } | |
| if (cartItem.drawTime) { | |
| newTicket.setTimePeriod(drawTime); | |
| setDrawTime(cartItem.drawTime); | |
| } | |
| if (cartItem.multiDraws) { | |
| if (isDcGame()) { | |
| setTimeout(() => { | |
| if (cartItem.multiDraws) { | |
| setMultiDraws(cartItem.multiDraws); | |
| } | |
| }, 500); | |
| } else { | |
| setMultiDraws(cartItem.multiDraws); | |
| } | |
| } | |
| setTicket(Object.create(newTicket)); | |
| setCurrentView(NUMERICAL_GAME_VIEW.MANUEL_PLAY); | |
| // UPDATE CACHED TEMP | |
| var temp = { | |
| "MANUEL_PLAY": null, | |
| "QUICK_PLAY": null, | |
| "SYSTEM_PLAY": null, | |
| "FAVORITE_PAYSLIPS": null | |
| }; | |
| temp[NUMERICAL_GAME_VIEW.MANUEL_PLAY.toString()] = {ticket: cartItem.ticket}; | |
| setCachedTicketPerPlays(temp); | |
| } | |
| } | |
| const updateCart = () => { | |
| if (currentCartItem && currentCartItem.ticket) { | |
| setCurrentCartItem(null); | |
| mobxStore.updateCart( | |
| currentCartItem.id, | |
| ticket, | |
| ticketOptions, | |
| disableManualInput, | |
| multiDraws, | |
| drawTime, | |
| advancePlay, | |
| isDcGame() ? dcDetailsFromIndex : null, | |
| isDcGame() ? dcDetailsToIndex : null, | |
| isDcGame() ? dcticketDrawOffset() : null, | |
| isDcGame() ? isDrawTimeBoth() : false | |
| ); | |
| resetTicket(); | |
| mobxStore.setGlobalToast({ | |
| mode: 'success', | |
| message: "Ticket updated", | |
| }); | |
| navigation.goBack(); | |
| } | |
| } | |
| useEffect(() => { | |
| if (isDcGame() && drawTime && advancePlay) { | |
| const updateMaxValue = getUpdateSliderMaxValue(advancePlay, drawTime); | |
| setDCMultipleDrawsMaxValue(updateMaxValue); | |
| const newValue = sliderIndexToMultidrawObject(1, isDcGame(), isDrawTimeBoth()); | |
| setMultiDraws(newValue); | |
| ticket.setMultipleDraws(newValue.value); | |
| ticket.setTimePeriod(drawTime); | |
| ticket.setDaySelection(advancePlay); | |
| } | |
| }, [drawTime, advancePlay]); | |
| const isDcGame = () => { | |
| return isDCGame(gameId); | |
| } | |
| const { data: gameFutureDraws, fetch: refetchGameFutureDraws } = | |
| useGameFutureDraws( | |
| { | |
| gameId: gameId, | |
| numberOfDraws: config.maxNumberOfMultipleDraws, | |
| includeActive: true, | |
| }, | |
| { config: undefined }, | |
| ); | |
| const getDCFromIndex = (dTime: string, adPlay: string) => { | |
| return utilsGetDCFromIndex(gameFutureDraws, dTime, adPlay); | |
| } | |
| useEffect(() => { | |
| if (isDcGame() && drawTime && advancePlay) { | |
| if (gameFutureDraws?.response?.draws?.items.length) { | |
| var newDcFromIndex = getDCFromIndex(drawTime, advancePlay); | |
| setDcDetailsFromIndex(newDcFromIndex); | |
| setDcDetailsFrom( | |
| moment.unix( | |
| gameFutureDraws?.response.draws.items[newDcFromIndex].draw?.drawDate as number | |
| ).format('MM/DD/yyyy hh:mm A') | |
| ); | |
| // TO | |
| var multiDrawsToUse = (multiDraws.value - 1) * 2; | |
| if (drawTime == "BOTH") { | |
| multiDrawsToUse = multiDraws.value - 1; | |
| } | |
| var newDcToIndex = (newDcFromIndex + multiDrawsToUse); | |
| if (newDcToIndex >= gameFutureDraws.response.draws.items.length) { | |
| console.log("herre "); | |
| newDcToIndex = gameFutureDraws?.response.draws.items.length - 1 | |
| } | |
| if (gameFutureDraws?.response.draws.items[newDcToIndex]?.draw) { | |
| setDcDetailsToIndex(newDcToIndex); | |
| setDcDetailsTo( | |
| moment.unix( | |
| gameFutureDraws?.response.draws.items[newDcToIndex].draw?.drawDate as number | |
| ).format('MM/DD/yyyy hh:mm A') | |
| ); | |
| } | |
| if (newDcFromIndex == gameFutureDraws?.response?.draws?.items.length - 1) { | |
| setDCMultipleDrawsMaxValue(null); | |
| } | |
| } | |
| } | |
| }, [multiDraws, gameFutureDraws]); | |
| const getCachedTicketByView = (view: NUMERICAL_GAME_VIEW) => { | |
| setDisableManualInput(false); | |
| //setSelectedFavoriteTicket(null); | |
| setIsModified(false); | |
| if (cachedTicketPerPlays[view.toString()] != null && cachedTicketPerPlays[view.toString()].ticket) { | |
| var cached = cachedTicketPerPlays[view.toString()]; | |
| var cachedTicket = cachedTicketPerPlays[view.toString()].ticket; | |
| if (isDcGame()) { | |
| const multipleDrawsachedTicket = cached.multiDraws ?? 2; // 2 DEFAULT VALUE FOR DC GAMES | |
| const isBoth = cached.drawTime == "BOTH" || cached.drawTime == null; | |
| const val = { | |
| value: multipleDrawsachedTicket, | |
| sliderIndex: multipleDrawsachedTicket === 1 ? 1 : (isBoth ? multipleDrawsachedTicket / 2 : multipleDrawsachedTicket), | |
| } | |
| if (cached.drawTime) { | |
| setDrawTime(cached.drawTime); | |
| } | |
| if (cached.advancePlay) { | |
| setAdvancePlay(cached.advancePlay); | |
| } | |
| setTimeout(() => { | |
| setMultiDraws(val); | |
| }, 750); | |
| } else { | |
| const multipleDrawsachedTicket = cached.multiDraws ?? 1; | |
| setMultiDraws(multidrawValueToMultidrawObject(multipleDrawsachedTicket, false, false, isR2RGame(gameId))); | |
| } | |
| if (cached.ticketOptions) { | |
| setTicketOptions(cached.ticketOptions); | |
| if ((cached.ticketOptions ?? []).find((entry) => entry.id === 'JTJ')) { | |
| setDisableManualInput(true); | |
| } else { | |
| setDisableManualInput(false); | |
| } | |
| } | |
| return cachedTicket; | |
| } else { | |
| if (isDcGame()) { | |
| setDrawTime(DRAW_TIMES[2].value); | |
| setAdvancePlay(ADVANCE_PLAYS[0].value); | |
| setTimeout(() => { | |
| setMultiDraws({ value: 2, sliderIndex: 1}); // DEFAULT FOR DC GAMES | |
| }, 750); | |
| } else { | |
| setMultiDraws({ value: 1, sliderIndex: 1}); // DEFAULT FOR OTHER GAMES | |
| } | |
| setTicketOptions([]); | |
| return ticketFactory.createDefault({ gameId, config }); | |
| } | |
| } | |
| const handleDailyDouble = (tic) => { | |
| if (isR2RGame(gameId)) { | |
| if (tic && tic.boards.length > 0 && tic.boards[0].options?.length > 0) { | |
| const dailyDoubleOption = tic.boards[0].options.find((e) => e.id == "DAILY DOUBLE"); | |
| if (dailyDoubleOption) { | |
| setMultiDraws({value: 2, sliderIndex: 2}); | |
| } | |
| } | |
| } | |
| } | |
| const renderNumericalGameView = () => { | |
| switch (currentView) { | |
| case NUMERICAL_GAME_VIEW.MANUEL_PLAY: | |
| return ( | |
| <ManualPlayView | |
| gameId={gameId} | |
| config={config} | |
| ticket={ticket} | |
| setTicket={(value) => { | |
| handleDailyDouble(value); | |
| setTicket(value); | |
| }} | |
| disableInput={disableManualInput} | |
| quickPick={quickPick} | |
| /> | |
| ); | |
| case NUMERICAL_GAME_VIEW.QUICK_PLAY: | |
| return ( | |
| <QuickPlayView | |
| gameId={gameId} | |
| config={config} | |
| ticket={ticket} | |
| setTicket={(value) => { | |
| handleDailyDouble(value); | |
| setTicket(value); | |
| }} | |
| setMultidraws={(newValue) => { | |
| if (isDcGame() && newValue.multipleDraws && newValue.drawTime) { | |
| setDrawTime(newValue.drawTime); | |
| setTimeout(() => { | |
| setMultiDraws(multidrawValueToMultidrawObject(newValue.multipleDraws, true, newValue.drawTime == "BOTH")); | |
| }, 750); | |
| } else { | |
| setMultiDraws(multidrawValueToMultidrawObject(newValue, false, false, isR2RGame(gameId))); | |
| } | |
| }} | |
| setTicketOptions={setTicketOptions} | |
| setDisableInput={setDisableManualInput} | |
| disableInput={disableManualInput} | |
| quickPickIndexSelected={quickPickIndexSelected} | |
| setQuickPickIndexSelected={(e) => { setQuickIndexSelected(e) }} | |
| /> | |
| ); | |
| case NUMERICAL_GAME_VIEW.SYSTEM_PLAY: | |
| return <></>; | |
| case NUMERICAL_GAME_VIEW.FAVORITE_PAYSLIPS: | |
| return ( | |
| <FavoritePayslipsView | |
| gameId={gameId} | |
| config={config} | |
| ticket={ticket} | |
| setTicket={(value) => { | |
| handleDailyDouble(value); | |
| setTicket(value); | |
| if (isDcGame()) { | |
| if (value && value.extraOptions && value.extraOptions.length > 0) { | |
| setDrawTime(value.extraOptions[0]); | |
| if (value.multipleDraws) { | |
| if (value.extraOptions[0] == "BOTH") { | |
| setTimeout(() => { | |
| setMultiDraws({ | |
| value: value.multipleDraws, | |
| sliderIndex: value.multipleDraws == 1 ? 1 : value.multipleDraws / 2 | |
| }); | |
| }, 750); | |
| } else { | |
| setTimeout(() => { | |
| setMultiDraws({value: value.multipleDraws, sliderIndex: value.multipleDraws}); | |
| }, 750); | |
| } | |
| } | |
| } | |
| } | |
| }} | |
| selectedFavoriteTicket={selectedFavoriteTicket} | |
| setSelectedFavoriteTicket={setSelectedFavoriteTicket} | |
| setMultidraws={(newValue) => { | |
| if (!isDcGame()) { | |
| setMultiDraws(multidrawValueToMultidrawObject(newValue, false, false, isR2RGame(gameId))); | |
| } | |
| }} | |
| setTicketOptions={setTicketOptions} | |
| setDisableInput={setDisableManualInput} | |
| disableInput={disableManualInput} | |
| isModified={isModified} | |
| setIsModified={setIsModified} | |
| isScreenFocused={isScreenFocused} | |
| /> | |
| ); | |
| } | |
| }; | |
| const saveCurrentTicketPerPlay = () => { | |
| if (ticket) { | |
| var temp = cachedTicketPerPlays; | |
| if (isDcGame()) { | |
| temp[currentView.toString()] = { | |
| ticket: ticket, | |
| ticketOptions: ticketOptions, | |
| multiDraws: multiDraws.value, | |
| drawTime: drawTime, | |
| advancePlay: advancePlay | |
| }; | |
| } else { | |
| temp[currentView.toString()] = { | |
| ticket: ticket, | |
| ticketOptions: ticketOptions, | |
| multiDraws: multiDraws.value | |
| }; | |
| } | |
| setCachedTicketPerPlays(temp); | |
| } | |
| } | |
| const resetTicket = () => { | |
| setDisplayTabs(false); | |
| config = gameSettings.getConfigForGame({ gameId: gameId }); | |
| const newT = ticketFactory.createDefault({ gameId, config }); | |
| setTicket(Object.create(newT)); | |
| var temp = { | |
| "MANUEL_PLAY": null, | |
| "QUICK_PLAY": null, | |
| "SYSTEM_PLAY": null, | |
| "FAVORITE_PAYSLIPS": null | |
| }; | |
| temp[currentView.toString()] = {ticket: newT}; | |
| setCachedTicketPerPlays(temp); | |
| setSelectedFavoriteTicket(null); | |
| setCurrentCartItem(null); | |
| setQuickIndexSelected(null); | |
| if (isDcGame()) { | |
| setMultiDraws(multidrawValueToMultidrawObject(2, true, true)); | |
| } else { | |
| setMultiDraws(multidrawValueToMultidrawObject(1, false, false, isR2RGame(gameId))); | |
| } | |
| setDisableTicketSubmit(false); | |
| setTicketOptions([]); | |
| setDisableManualInput(false); | |
| setIsModified(false); | |
| setTimeout(() => { | |
| setTicket(Object.create(ticketFactory.createDefault({ gameId, config }))); | |
| }, 500); | |
| if (isDcGame()) { | |
| setDrawTime(DRAW_TIMES[2].value); | |
| setAdvancePlay(ADVANCE_PLAYS[0].value); | |
| } | |
| setTimeout(() => { | |
| setDisplayTabs(true); | |
| }, 800); | |
| }; | |
| const [execPlayCoupon] = useMutation(ApiClient.playCoupon, { | |
| onMutate: () => { | |
| setDisableTicketSubmit(true); | |
| }, | |
| onSuccess: (data) => { | |
| resetTicket(); | |
| setShowBuyConfirmationModal(false); | |
| setTimeout(() => { | |
| setShowBuyMessageModal(true); | |
| }, 1000); | |
| crashlytics().log('coupon_played'); | |
| setSerialNumber(data?.response?.serialNumber); | |
| }, | |
| onError: (error: AxiosError<any>) => { | |
| if (error.response?.data?.error?.errorMessage.error) { | |
| mobxStore.setGlobalToast({ | |
| mode: 'danger', | |
| message: error.response?.data?.error?.errorMessage.error.errorMessage, | |
| fromModal: true, | |
| }); | |
| } | |
| setDisableTicketSubmit(false); | |
| crashlytics().log('error_while_coupon_play'); | |
| }, | |
| }); | |
| const [verifyCoupon] = useMutation(ApiClient.verifyCoupon, { | |
| onMutate: () => { | |
| setVerifyTicketObj(null); | |
| }, | |
| onSuccess: (data) => { | |
| setVerifyTicketObj(data.response); | |
| setShowBuyConfirmationModal(true); | |
| }, | |
| onError: (error: AxiosError<any>) => { | |
| setDisableTicketSubmit(false); | |
| if (error.response?.data?.error?.errorMessage.error) { | |
| mobxStore.setGlobalToast({ | |
| mode: 'danger', | |
| message: error.response?.data?.error?.errorMessage.error.errorMessage, | |
| }); | |
| } | |
| }, | |
| }); | |
| const handleCaseFavoriteModified = () => { | |
| if (currentView == NUMERICAL_GAME_VIEW.FAVORITE_PAYSLIPS && selectedFavoriteTicket) { | |
| setIsModified(true); | |
| } | |
| } | |
| // DC LOGICS STARTED | |
| const isDrawTimeBoth = () => { | |
| return drawTime == DRAW_TIMES[2].value; | |
| } | |
| const getUpdateSliderMaxValue = (adPlay: string, dTime: string) => { | |
| return utilsGetUpdateSliderMaxValue(adPlay, config.maxNumberOfMultipleDraws / 2); | |
| } | |
| const dcticketDrawOffset = () => { | |
| return isDCTimeZone() ? dcDetailsFromIndex : dcticketDrawOffsetOld(); | |
| } | |
| const dcticketDrawOffsetOld = () => { | |
| var offset = dcDetailsFromIndex; | |
| if (drawTime == "BOTH") { | |
| offset = offset - 1; | |
| } | |
| if (drawTime == "EVE") { | |
| offset = offset + 1; | |
| } | |
| if (drawTime == "MOR") { | |
| offset = offset - 1; | |
| } | |
| return offset < 0 ? 0 : offset; | |
| } | |
| // DC LOGICS ENDED | |
| const getTotalCostDetails = () => { | |
| return getDCTotalCostDetails(gameId, ticket, config, multiDraws); | |
| } | |
| const getBuyNowButtonEnabled = () => { | |
| return utilsGetBuyNowButtonEnabled(gameId, ticket, ticketOptions); | |
| } | |
| const handleTicketBuyNow = async () => { | |
| if (!isAuthenticated) { | |
| mobxStore.setShowLoginModal("login"); | |
| return; | |
| } | |
| if (!disableTicketSubmit) { | |
| if (!isR2RGame(gameId)) { | |
| ticket.addOptions(ticketOptions); // FYI: this will also remove any de-selected option | |
| } | |
| // Set Extra game options to ticket object | |
| let canPlayAlone = ticketOptions.find((entry) => entry.canPlayAlone); | |
| if (canPlayAlone && canPlayAlone.multipliers[canPlayAlone.value - 1]) { | |
| // map slider option number as an index that will give us the multiplier value | |
| const boardMultiplier = canPlayAlone.multipliers[canPlayAlone.value - 1].value; | |
| // If just jackpot clear boards otherwise for a smaller amount -> ticket.boards.length < boardMultiplier will fail | |
| if (canPlayAlone.id == "JTJ") { | |
| var tempJTJTicket = Object.create(ticket); | |
| // JTJ CASE NEEDS TO REVISIT | |
| tempJTJTicket.boards = []; | |
| if (tempJTJTicket.boards.length < boardMultiplier) { | |
| tempJTJTicket.appendBoards({ | |
| number: boardMultiplier - tempJTJTicket.boards.length, | |
| }); // -1 because there will always be 1 board entry on a ticket | |
| } | |
| tempJTJTicket.quickPick().then(async () => { | |
| tempJTJTicket.setMultipleDraws(multiDraws.value); | |
| var exportedTicked = await tempJTJTicket.exportTicket(); | |
| // TO REVISIT | |
| if (isDcGame()) { | |
| exportedTicked.participatingDraws.drawOffsets = [dcticketDrawOffset()]; | |
| } | |
| // END | |
| verifyCoupon({ | |
| ticket: { | |
| wager: { | |
| dbg: [exportedTicked], | |
| }, | |
| metadata: {}, | |
| }, | |
| }); | |
| }); | |
| return; | |
| } | |
| if (ticket.boards.length < boardMultiplier) { | |
| ticket.appendBoards({ | |
| number: boardMultiplier - ticket.boards.length, | |
| }); // -1 because there will always be 1 board entry on a ticket | |
| } | |
| ticket.quickPick().then(async () => { | |
| if (isDcGame() && isDrawTimeBoth()) { | |
| ticket.setMultipleDraws(multiDraws.value / 2); | |
| } else { | |
| ticket.setMultipleDraws(multiDraws.value); | |
| } | |
| var exportedTicked = await ticket.exportTicket(); | |
| // TO REVISIT | |
| if (isDcGame()) { | |
| exportedTicked.participatingDraws.drawOffsets = [dcticketDrawOffset()]; | |
| } | |
| // END | |
| verifyCoupon({ | |
| ticket: { | |
| wager: { | |
| dbg: [exportedTicked], | |
| }, | |
| metadata: {}, | |
| }, | |
| }); | |
| }); | |
| return; | |
| } else { | |
| var exportedTicked; | |
| if (isDcGame() && isDrawTimeBoth()) { | |
| ticket.setMultipleDraws(multiDraws.value / 2); | |
| exportedTicked = await ticket.exportTicket(); | |
| } else if (isR2RGame(gameId)){ | |
| ticket.setMultipleDraws(multiDraws.value); | |
| const tempJTJTicket = Object.create(ticket); | |
| tempJTJTicket.addOptions(ticketOptions); | |
| exportedTicked = await tempJTJTicket.exportTicket(); | |
| } else { | |
| ticket.setMultipleDraws(multiDraws.value); | |
| exportedTicked = await ticket.exportTicket(); | |
| } | |
| // TO REVISIT | |
| if (isDcGame()) { | |
| exportedTicked.participatingDraws.drawOffsets = [dcticketDrawOffset()]; | |
| } | |
| // END | |
| verifyCoupon({ | |
| ticket: { | |
| wager: { | |
| dbg: [exportedTicked], | |
| }, | |
| metadata: {}, | |
| }, | |
| }); | |
| } | |
| setShowBuyConfirmationModal(false); | |
| } else { | |
| console.log('nope'); | |
| } | |
| }; | |
| const range = (start, end) => Array.from(Array(end - start + 1).keys()).map((x) => x + start); | |
| const handleTicketAddToCart = () => { | |
| if (ticket) { | |
| mobxStore.addTicketToCart( | |
| ticket, | |
| ticketOptions, | |
| disableManualInput, | |
| multiDraws, | |
| drawTime, | |
| advancePlay, | |
| isDcGame() ? dcDetailsFromIndex : null, | |
| isDcGame() ? dcDetailsToIndex : null, | |
| isDcGame() ? dcticketDrawOffset() : null, | |
| isDcGame() ? isDrawTimeBoth() : false | |
| ); | |
| mobxStore.setGlobalToast({ | |
| mode: 'success', | |
| message: "Ticket added to your cart", | |
| }); | |
| navigation.goBack(); | |
| resetTicket(); | |
| } | |
| }; | |
| const appDataBannerItem = appData?.response?.bannerCollection[0]?.tiles.find( | |
| (entry) => entry.gameId === gameId.toString() | |
| ); | |
| if (isAppDataLoading) { | |
| return <LoadingScreen />; | |
| } | |
| const scrollViewRef = React.useRef(); | |
| const handleScrollToTop = () => { | |
| if (scrollViewRef?.current) { | |
| scrollViewRef.current.scrollTo({ y: 0, animated: true }); | |
| } | |
| }; | |
| useEffect(()=> { | |
| handleScrollToTop(); | |
| },[route]) | |
| const enablePowerPlayMM = () => { | |
| if (showMegaplierConfirmation && showMegaplierConfirmation.gameOption && showMegaplierConfirmation.optionCost) { | |
| const _ticketOptions = ticketOptions.filter( | |
| (option) => !option.canPlayAlone, | |
| ); | |
| setDisableManualInput(false); | |
| _ticketOptions.push(showMegaplierConfirmation); | |
| _ticketOptions.push({ | |
| ...showMegaplierConfirmation.gameOption, | |
| perPlaycost: showMegaplierConfirmation.optionCost, | |
| dperPlaycost: showMegaplierConfirmation.optionCost, | |
| }); | |
| setTicketOptions(_ticketOptions); | |
| ticket.addOptions(ticketOptions); | |
| setTicket(Object.create(ticket)); | |
| setShowMegaplierConfirmation(null); | |
| } else { | |
| setShowMegaplierConfirmation(null); | |
| } | |
| } | |
| const jackpotDisplay = () => { | |
| var text: string = (appData?.response?.menuGamesLists?.lotteryListOverview?.games?? []).find((e) => Number(e.gameId) == gameId)?.jackpotText ?? item?.jackpotText ?? config.jackpotReplacement; | |
| if (text.endsWith(".00")) { | |
| text = text.substring(0, text.length - 3); | |
| } | |
| return text; | |
| } | |
| return ( | |
| <React.Fragment> | |
| <Layout> | |
| <ScrollView contentInsetAdjustmentBehavior="automatic" ref={scrollViewRef}> | |
| <View style={{ paddingVertical: 20, paddingHorizontal: 15 }}> | |
| <BPageHeader | |
| title="Lottery games" | |
| onPress={() => { | |
| navigation.goBack(); | |
| }} | |
| hideCloseIcon | |
| /> | |
| {/* */} | |
| <TransparentContainer noPadding> | |
| <LinearGradient | |
| colors={[ | |
| config.gameColor, | |
| config.gameColor, | |
| config.gameBackgroundColor, | |
| ]} | |
| start={{ x: 0, y: 0 }} | |
| end={{ x: 1, y: 0 }} | |
| style={{ | |
| ...GLOBAL_STYLE.flex1, | |
| borderTopLeftRadius: 15, | |
| borderTopRightRadius: 15, | |
| position: 'relative', | |
| }}> | |
| <View style={{top: 0.0, right: 0.0, flexDirection: 'row'}}> | |
| <View style={{flex: 1, alignItems: "flex-end", marginTop: 10}}> | |
| <InfoButton onPress={() => setShowGameInfoModal(true) } /> | |
| </View> | |
| <SizedBox width={25} /> | |
| </View> | |
| <View style={{ padding: 15, paddingTop: -10 }}> | |
| <BImage | |
| source={{ uri: config.gameLogo }} | |
| style={{ | |
| height: 78, | |
| width: 200, | |
| marginTop: 10, | |
| resizeMode: 'contain', | |
| alignSelf: 'center', | |
| }} | |
| /> | |
| <SizedBox height={10} /> | |
| {/* ESTIMATED JACKPOT AMOUNT */} | |
| {(isPowerBall(gameId) || isMegaMillion(gameId)) && ( | |
| <Text style={{color: "white", fontSize: 15, fontWeight:"500", paddingBottom: 5, paddingTop: 5, textAlign: "center", textTransform: "uppercase"}}> | |
| {"Estimated Jackpot Amount"} | |
| </Text> | |
| )} | |
| <Text | |
| style={{ | |
| ...GS.FF_PoppinsSemiBold, | |
| fontSize: 32, | |
| lineHeight: 42, | |
| textAlign: 'center', | |
| color: 'white', | |
| }}> | |
| {jackpotDisplay()} | |
| </Text> | |
| {gameFutureDraws?.response.draws.items[0].draw.drawDate && ( | |
| <View style={styles.inlineText}> | |
| <Text | |
| style={[ | |
| styles.textSmall, | |
| styles.textBold, | |
| GS.txtWhite, | |
| ]}> | |
| Next draw: | |
| </Text> | |
| <SizedBox width={3.5} /> | |
| <Text style={[styles.textSmall, GS.txtWhite]}> | |
| {Moment.unix( | |
| gameFutureDraws?.response.draws.items[0].draw | |
| .drawDate as number, | |
| ).format('dddd DD/MM/yyyy hh:mm A')} | |
| </Text> | |
| </View> | |
| )} | |
| {/* DRAW DAYS */} | |
| <View style={{...styles.inlineText, marginStart:12, marginEnd: 12}}> | |
| <Text | |
| style={[styles.textSmall, styles.textBold, GS.txtWhite]}> | |
| Draw days: | |
| <Text style={{...styles.textSmall, color: "white", fontFamily: 'Poppins-Regular'}}> | |
| {" "}{playDays.length === 7 || | |
| playDays.length === 0 | |
| ? 'EVERYDAY' | |
| : playDays.join(' | ')} | |
| </Text> | |
| </Text> | |
| <SizedBox width={3.5} /> | |
| </View> | |
| {gameFutureDraws?.response.draws.items[0].draw.drawDate && ( | |
| <View style={{ marginTop: 15 }}> | |
| <Text | |
| style={[ | |
| styles.textSmall, | |
| styles.textBold, | |
| GS.txtWhite, | |
| GS.txtCenter, | |
| ]}> | |
| Time until draw | |
| </Text> | |
| <SizedBox height={12.5} /> | |
| {/* TIMER */} | |
| <BTimer | |
| expiryDate={Moment.unix( | |
| gameFutureDraws?.response.draws.items[0].draw | |
| .drawDate, | |
| )} | |
| onExpired={() => { | |
| if (isR2RGame(gameId)) { | |
| refetchGameFutureDraws(); | |
| refetchGameLastDraw(); | |
| } | |
| }} | |
| /> | |
| </View> | |
| )} | |
| {/* RECENT WINNING NUMBERS */} | |
| <View> | |
| <Text | |
| style={{ | |
| ...GLOBAL_STYLE.FF_PoppinsSemiBold, | |
| ...GLOBAL_STYLE.txtWhite, | |
| textTransform: 'uppercase', | |
| textAlign: 'center', | |
| marginTop: 15, | |
| }}> | |
| Recent Winning Numbers | |
| </Text> | |
| {lotteryGame && | |
| gameLastDraw?.response?.last?.items[0]?.draw?.results && ( | |
| <GameCardDrawResults | |
| gameSettings={lotteryGame} | |
| results={gameLastDraw.response.last.items[0].draw.results} | |
| /> | |
| )} | |
| {lotteryGame && | |
| gameLastDraw && | |
| lotteryGame.rules?.availableGameTypes?.length > 0 && | |
| gameLastDraw.response.last.items[0].draw.results[ | |
| lotteryGame.rules?.panels[0].boards.length | |
| ] && ( | |
| <View> | |
| <SizedBox height={5} /> | |
| <Text style={{ color: 'white', textAlign: 'center' }}> | |
| {`${ | |
| lotteryGame.rules.availableGameTypes[0].gameTypeName | |
| } ${ | |
| gameLastDraw.response.last.items[0].draw.results[ | |
| lotteryGame.rules.panels[0].boards.length | |
| ] | |
| }`} | |
| </Text> | |
| </View> | |
| )} | |
| { | |
| isR2RGame(gameId) && | |
| lotteryGame && | |
| gameLastDraw && | |
| lotteryGame.rules?.availableGameTypes?.length > 0 && | |
| lotteryGame.rules?.panels[0].boards.length > gameLastDraw.response.last.items[0].draw.results.length && | |
| gameLastDraw.response.last.items[0].draw.results[ | |
| gameLastDraw.response.last.items[0].draw.results.length - 1 | |
| ] && ( | |
| <View> | |
| <SizedBox height={5} /> | |
| <Text style={{ color: 'white', textAlign: 'center' }}> | |
| {`${ | |
| lotteryGame.rules.availableGameTypes[0].gameTypeName | |
| } ${ | |
| gameLastDraw.response.last.items[0].draw.results[ | |
| gameLastDraw.response.last.items[0].draw.results.length - 1 | |
| ] | |
| }`} | |
| </Text> | |
| </View> | |
| )} | |
| </View> | |
| </View> | |
| {/* */} | |
| <View style={[GS.row, GS.justifyBetween]}> | |
| <OptionSelectable | |
| isFirst | |
| isActive={currentView === NUMERICAL_GAME_VIEW.MANUEL_PLAY} | |
| title="Manual play" | |
| icon={icons.manualplay_symbol} | |
| onPress={() => { | |
| saveCurrentTicketPerPlay(); | |
| setCurrentView(NUMERICAL_GAME_VIEW.MANUEL_PLAY); | |
| const cachedTicket = getCachedTicketByView(NUMERICAL_GAME_VIEW.MANUEL_PLAY); | |
| setTicket(cachedTicket); | |
| }} | |
| activeTabColor={getTabColor(gameId, appData)?.tabActiveColor} | |
| inActiveTabColor={getTabColor(gameId, appData)?.tabInactiveColor} | |
| /> | |
| <OptionSelectable | |
| title="Quick play" | |
| isActive={currentView === NUMERICAL_GAME_VIEW.QUICK_PLAY} | |
| icon={icons.quickplay_symbol} | |
| onPress={() => { | |
| saveCurrentTicketPerPlay(); | |
| setCurrentView(NUMERICAL_GAME_VIEW.QUICK_PLAY); | |
| const cachedTicket = getCachedTicketByView(NUMERICAL_GAME_VIEW.QUICK_PLAY); | |
| setTicket(cachedTicket); | |
| }} | |
| activeTabColor={getTabColor(gameId, appData)?.tabActiveColor} | |
| inActiveTabColor={getTabColor(gameId, appData)?.tabInactiveColor} | |
| /> | |
| <OptionSelectable | |
| isLast | |
| isActive={ | |
| currentView === NUMERICAL_GAME_VIEW.FAVORITE_PAYSLIPS | |
| } | |
| disabled={!isAuthenticated} | |
| title="Favorite payslips" | |
| icon={icons.fav_symbol} | |
| onPress={() => { | |
| setIsModified(false); | |
| saveCurrentTicketPerPlay(); | |
| setCurrentView(NUMERICAL_GAME_VIEW.FAVORITE_PAYSLIPS); | |
| const cachedTicket = getCachedTicketByView(NUMERICAL_GAME_VIEW.FAVORITE_PAYSLIPS); | |
| setTicket(cachedTicket); | |
| }} | |
| activeTabColor={getTabColor(gameId, appData)?.tabActiveColor} | |
| inActiveTabColor={getTabColor(gameId, appData)?.tabInactiveColor} | |
| /> | |
| </View> | |
| </LinearGradient> | |
| {/* */} | |
| <View>{displayTabs ? renderNumericalGameView() : <><ActivityIndicator size={50} color={'white'} /></>}</View> | |
| </TransparentContainer> | |
| {/* ADVANCE PLAY */} | |
| {isDcGame() && ( | |
| <TransparentContainer> | |
| <Text style={{ marginBottom: 10, ...styles.containerTitle }}> | |
| Advance play | |
| </Text> | |
| <View style={[GS.row, GS.flexWrap, GS.alignCenter]}> | |
| {ADVANCE_PLAYS.map((item, index) => ( | |
| <View | |
| key={index} | |
| style={{ | |
| width: '33.3%', | |
| marginBottom: 12.5, | |
| paddingRight: 20, | |
| }}> | |
| <BToggle | |
| value={item.value === advancePlay} | |
| label={item.label} | |
| onValueChange={() => { | |
| setAdvancePlay(item.value); | |
| ticket.setDaySelection(item.value); | |
| setTicket(Object.create(ticket)); | |
| }} | |
| /> | |
| </View> | |
| ))} | |
| </View> | |
| </TransparentContainer> | |
| )} | |
| {/* DRAW TIME */} | |
| {isDcGame() && ( | |
| <TransparentContainer> | |
| <Text style={{ marginBottom: 15, ...styles.containerTitle }}> | |
| Draw time | |
| </Text> | |
| <View style={[GS.row, GS.alignCenter, GS.mb1]}> | |
| {DRAW_TIMES.map((item, index) => ( | |
| <View style={{ marginRight: 20 }} key={index}> | |
| <BToggle | |
| value={item.value === drawTime} | |
| label={item.label} | |
| onValueChange={() => { | |
| setQuickIndexSelected(null); | |
| handleCaseFavoriteModified(); | |
| setDrawTime(item.value); | |
| ticket.setTimePeriod(item.value); | |
| // TO CHECK - UPDATE TICKET MULTIPLE DRAWS | |
| const newValue = sliderIndexToMultidrawObject(multiDraws.sliderIndex, isDcGame(), item.value == DRAW_TIMES[2].value); | |
| setMultiDraws(newValue); | |
| ticket.setMultipleDraws(newValue.value); | |
| setTicket(Object.create(ticket)); | |
| }} | |
| /> | |
| </View> | |
| ))} | |
| </View> | |
| </TransparentContainer> | |
| )} | |
| {/* MULTI DRAWS */} | |
| <TransparentContainer> | |
| <Text style={{ marginBottom: 10, ...styles.containerTitle }}> | |
| Multi {isR2RGame(gameId) ? "Races" : "Draws"} | |
| </Text> | |
| <View style={[GS.row, GS.alignCenter]}> | |
| <Text style={[GS.FF_PoppinsSemiBold, { display: 'flex' }]}> | |
| {isDcGame() && !dcMultipleDrawsMaxValue ? "" : config.minNumberOfMultipleDraws} | |
| </Text> | |
| <View style={[GS.flex1, GS.px2, GS.positionRelative]}> | |
| {!isDcGame() && !isR2RGame(gameId) && ( | |
| <CustomTrackSlider | |
| range={range} | |
| maximumValue={config.maxNumberOfMultipleDraws / 2 + 1} | |
| /> | |
| )} | |
| {/* DC GAME SLIDER */} | |
| { isDcGame() && ( | |
| dcMultipleDrawsMaxValue ? ( | |
| <Slider | |
| animationType="spring" | |
| animateTransitions={false} | |
| minimumValue={config.minNumberOfMultipleDraws} | |
| step={1} | |
| maximumValue={dcMultipleDrawsMaxValue} | |
| value={multiDraws.sliderIndex} | |
| trackClickable={false} | |
| minimumTrackTintColor="rgba(0,0,0,.25)" | |
| maximumTrackTintColor="rgba(0,0,0,.25)" | |
| onValueChange={(value) => { | |
| handleCaseFavoriteModified(); | |
| const newValue = sliderIndexToMultidrawObject(value[0], isDcGame(), isDrawTimeBoth()); | |
| setMultiDraws(newValue); | |
| ticket.setMultipleDraws(newValue.value); | |
| }} | |
| trackStyle={styles.trackSlider} | |
| renderThumbComponent={() => ( | |
| <View style={styles.thumbSlider}> | |
| <Text | |
| style={{ | |
| fontSize: 10, | |
| ...GS.FF_PoppinsSemiBold, | |
| color: 'white', | |
| }}> | |
| {isDcGame() ? multiDraws.sliderIndex : multiDraws.value} | |
| </Text> | |
| </View> | |
| )} | |
| /> | |
| ) : ( | |
| <> | |
| <Text style={{ marginLeft: -8, ...styles.containerTitle, fontSize: 13 }}> | |
| Only one Day is available | |
| </Text> | |
| </> | |
| )) | |
| } | |
| {/* NOT DC GAME SLIDER */} | |
| {!isDcGame() && ( | |
| <Slider | |
| disabled={isSliderDisabled} | |
| animationType="spring" | |
| animateTransitions={false} | |
| minimumValue={config.minNumberOfMultipleDraws} | |
| step={1} | |
| maximumValue={isR2RGame(gameId) ? config.maxNumberOfMultipleDraws : config.maxNumberOfMultipleDraws / 2 + 1} | |
| value={multiDraws.sliderIndex} | |
| trackClickable={false} | |
| minimumTrackTintColor="rgba(0,0,0,.25)" | |
| maximumTrackTintColor="rgba(0,0,0,.25)" | |
| onValueChange={(value) => { | |
| handleCaseFavoriteModified(); | |
| const newMultiDrawsObject = sliderIndexToMultidrawObject(value[0], false, false, isR2RGame(gameId)); | |
| setMultiDraws(newMultiDrawsObject); | |
| ticket.setMultipleDraws(newMultiDrawsObject.value); | |
| }} | |
| trackStyle={styles.trackSlider} | |
| renderThumbComponent={() => ( | |
| <View style={{...styles.thumbSlider, backgroundColor: isSliderDisabled ? "#D3D3D3" : CONSTANT_COLOR.primary}}> | |
| <Text | |
| style={{ | |
| fontSize: 10, | |
| ...GS.FF_PoppinsSemiBold, | |
| color: 'white', | |
| }}> | |
| {multiDraws.value} | |
| </Text> | |
| </View> | |
| )} | |
| /> | |
| )} | |
| </View> | |
| <Text | |
| style={[ | |
| GS.FF_PoppinsSemiBold, | |
| { | |
| display: 'flex', | |
| }, | |
| ]}> | |
| {( | |
| isDcGame() && dcMultipleDrawsMaxValue ? dcMultipleDrawsMaxValue : | |
| (isDcGame() && !dcMultipleDrawsMaxValue) ? "" : | |
| config.maxNumberOfMultipleDraws | |
| )} | |
| </Text> | |
| </View> | |
| </TransparentContainer> | |
| {/* TICKET OPTIONS */} | |
| {config.availableOptions.map((gameOption, i) => { | |
| const selectedGameOptionObject = ticketOptions.find( | |
| (entry) => entry.id === gameOption.id, | |
| ); | |
| const gameOptionIsSelected = | |
| selectedGameOptionObject !== undefined; | |
| let boardColumns = | |
| config.minNumberOfBoards * config.board.panels.length; | |
| let optionCost = boardColumns; | |
| if (gameOption.operator === 'x') { | |
| optionCost *= gameOption.operand; | |
| } else if (gameOption.operator === '+') { | |
| optionCost += gameOption.operand; | |
| } | |
| if (gameOption.multipliers.length > 0) { | |
| let defaultOptionMultiplier = gameOption.multipliers.find( | |
| (entry) => entry.isDefault, | |
| ); | |
| if (defaultOptionMultiplier) { | |
| if (gameOption.operator === 'x') { | |
| optionCost *= defaultOptionMultiplier.value; | |
| } else if (gameOption.operator === '+') { | |
| optionCost += defaultOptionMultiplier.value; | |
| } | |
| } | |
| } | |
| return ( | |
| <TransparentContainer key={i}> | |
| <View style={[GS.row, GS.alignCenter]}> | |
| <View style={{ flexGrow: 1 }}> | |
| <Text style={styles.containerTitle}> | |
| {gameOption.name} | |
| </Text> | |
| </View> | |
| <View style={[GS.row, GS.alignCenter]}> | |
| <Text | |
| style={{ | |
| fontSize: 12, | |
| ...GS.FF_PoppinsSemiBold, | |
| textTransform: 'uppercase', | |
| }}> | |
| {`${isR2RGame(gameId) ? "": "$"}`} | |
| {gameOption.shortdescr.replace( | |
| '{cost}', | |
| optionCost.toFixed(2), | |
| )} | |
| </Text> | |
| <SizedBox width={10} /> | |
| <BSwitch | |
| onValueChange={(v) => { | |
| handleCaseFavoriteModified(); | |
| if (v) { | |
| if (gameOption.canPlayAlone) { | |
| if (gameOption.id == "JTJ") { | |
| // ASK FOR CONFIRMATION | |
| setShowJTJConfirmationModal([ | |
| { | |
| ...gameOption, | |
| perPlaycost: optionCost, | |
| dperPlaycost: optionCost, | |
| value: 1, | |
| }, | |
| ]); | |
| } else { | |
| setTicket( | |
| ticketFactory.createDefault({ gameId, config }), | |
| ); | |
| setDisableManualInput(true); | |
| setTicketOptions([ | |
| { | |
| ...gameOption, | |
| perPlaycost: optionCost, | |
| dperPlaycost: optionCost, | |
| value: 1, | |
| }, | |
| ]); | |
| } | |
| } else { | |
| if (gameOption.id == "PowerPlay" && isMegaMillion(gameId) && isJTJ) { | |
| // CONFIRMATION | |
| setShowMegaplierConfirmation({ | |
| gameOption: gameOption, | |
| optionCost: optionCost | |
| }); | |
| } else { | |
| // remove any other selected canPlayAlone options | |
| const _ticketOptions = ticketOptions.filter( | |
| (option) => !option.canPlayAlone, | |
| ); | |
| setDisableManualInput(false); | |
| _ticketOptions.push({ | |
| ...gameOption, | |
| perPlaycost: optionCost, | |
| dperPlaycost: optionCost, | |
| }); | |
| setTicketOptions(_ticketOptions); | |
| ticket.addOptions(ticketOptions); | |
| setTicket(Object.create(ticket)); | |
| } | |
| } | |
| } else { | |
| if (gameOption.id == "JTJ") { | |
| resetTicket(); | |
| } else { | |
| let optionToRemove = ticketOptions.find( | |
| (entry) => entry.id === gameOption.id, | |
| ); | |
| if (optionToRemove) { | |
| if (optionToRemove.canPlayAlone) { | |
| setDisableManualInput(false); | |
| } | |
| let optionIndex = | |
| ticketOptions.indexOf(optionToRemove); | |
| ticketOptions.splice(optionIndex, 1); | |
| setTicketOptions(ticketOptions); | |
| ticket.addOptions(ticketOptions); | |
| setTicket(Object.create(ticket)); | |
| } | |
| } | |
| } | |
| }} | |
| value={gameOptionIsSelected} | |
| size="small" | |
| /> | |
| </View> | |
| </View> | |
| {gameOptionIsSelected && | |
| gameOption.multipliers.length > 0 && ( | |
| <Slider | |
| minimumValue={1} | |
| step={1} | |
| maximumValue={gameOption.multipliers.length} | |
| value={selectedGameOptionObject.value || 1} | |
| trackClickable={false} | |
| minimumTrackTintColor="rgba(0,0,0,.25)" | |
| maximumTrackTintColor="rgba(0,0,0,.25)" | |
| onValueChange={(value) => { | |
| handleCaseFavoriteModified(); | |
| selectedGameOptionObject.perPlaycost = | |
| value[0] * selectedGameOptionObject.dperPlaycost; | |
| selectedGameOptionObject.value = value[0]; | |
| ticketOptions[ | |
| ticketOptions.indexOf(selectedGameOptionObject) | |
| ] = selectedGameOptionObject; | |
| setTicketOptions([...ticketOptions]); | |
| }} | |
| trackStyle={styles.trackSlider} | |
| renderThumbComponent={() => ( | |
| <View style={styles.thumbSlider}> | |
| <Text | |
| style={{ | |
| fontSize: 13, | |
| ...GS.FF_PoppinsSemiBold, | |
| color: 'white', | |
| }}> | |
| { | |
| ticketOptions[ | |
| ticketOptions.indexOf( | |
| selectedGameOptionObject, | |
| ) | |
| ].value | |
| } | |
| </Text> | |
| </View> | |
| )} | |
| /> | |
| )} | |
| </TransparentContainer> | |
| ); | |
| })} | |
| {/* DRAWS */} | |
| <TransparentContainer> | |
| {!isDcGame() && ( | |
| <> | |
| <Text style={{ marginBottom: 10, ...styles.containerTitle }}> | |
| Draws | |
| </Text> | |
| <BListItem | |
| label="From" | |
| value={moment | |
| .unix( | |
| gameFutureDraws?.response.draws.items[0].draw | |
| .drawDate as number, | |
| ) | |
| .format('MM/DD/yyyy hh:mm A')} | |
| bolder | |
| /> | |
| {gameFutureDraws?.response.draws.items[multiDraws.value - 1] && ( | |
| <BListItem | |
| label="To" | |
| value={moment | |
| .unix( | |
| gameFutureDraws?.response.draws.items[ | |
| multiDraws.value - 1 | |
| ].draw.drawDate, | |
| ) | |
| .format('MM/DD/yyyy hh:mm A')} | |
| bolder | |
| /> | |
| )} | |
| </> | |
| )} | |
| {isDcGame() && dcDetailsFrom && dcDetailsTo && ( | |
| <> | |
| <Text style={{ marginBottom: 10, ...styles.containerTitle }}> | |
| Draws | |
| </Text> | |
| <BListItem | |
| label="From" | |
| value={dcDetailsFrom} | |
| bolder | |
| /> | |
| <BListItem | |
| label="To" | |
| value={dcDetailsTo} | |
| bolder | |
| /> | |
| </> | |
| )} | |
| <BListItem | |
| label="No of draws" | |
| value={`X${multiDraws.value}`} | |
| bolder | |
| /> | |
| <Text style={{ marginVertical: 10, ...styles.containerTitle }}> | |
| Price details | |
| </Text> | |
| { | |
| (selectedFavoriteTicket && !isModified && currentView === NUMERICAL_GAME_VIEW.FAVORITE_PAYSLIPS) ? ( | |
| <BListItem | |
| key="fav_key" | |
| label=" FAVORITE:" | |
| value={selectedFavoriteTicket.description} | |
| bolder | |
| /> | |
| ) : ( | |
| <></> | |
| ) | |
| } | |
| {/* DC GAMES */} | |
| {isDcGame() && ( | |
| <> | |
| {getTotalCostDetails().plays.map((entry, i, data) => { | |
| return ( | |
| <BListItem | |
| key={i} | |
| label={entry.label} | |
| value={`$${entry.price.toFixed(2)}`} | |
| bolder | |
| /> | |
| ); | |
| })} | |
| <BListItem | |
| key={"total_grand"} | |
| label={config.gameName} | |
| value={`$${getTotalCostDetails().grandTotal.toFixed(2)}`} | |
| bolder | |
| /> | |
| </> | |
| )} | |
| {/* NOT DC GAMES */} | |
| {!isDcGame() && ( | |
| <> | |
| {ticketOptions.find((option) => option.id === 'JTJ') == null && ( | |
| isR2RGame(gameId) ? ( | |
| <BListItem | |
| label={`${ | |
| ticketActiveBoards > 1 ? ticketActiveBoards + ' X ' : '' | |
| } ${config.gameName}`} | |
| value={`$${(ticket.calculateCost()).toFixed(2)}`} | |
| bolder | |
| /> | |
| ) : ( | |
| <BListItem | |
| label={`${ | |
| ticketActiveBoards > 1 ? ticketActiveBoards + ' X ' : '' | |
| } ${config.gameName}`} | |
| value={`$${( | |
| (ticketActiveBoards || 1) * config.columnPrice | |
| ).toFixed(2)}`} | |
| bolder | |
| /> | |
| ) | |
| )} | |
| {ticketOptions.map((entry, i) => { | |
| const option = config.availableOptions.find( | |
| (configEntry) => entry.id === configEntry.id, | |
| ); | |
| if (!option) { | |
| return; | |
| } | |
| if (option.id === 'JTJ') { | |
| return ( | |
| <BListItem | |
| key={i} | |
| label={option.name} | |
| value={`${ | |
| multiDraws.value | |
| } x $${entry.perPlaycost.toFixed(2)}`} | |
| bolder | |
| /> | |
| ); | |
| } else if (isR2RGame(gameId)) { | |
| return ( | |
| <BListItem | |
| key={i} | |
| label={option.name} | |
| value={`$${(ticket.calculateCost()).toFixed(2)}`} | |
| bolder | |
| /> | |
| ); | |
| } else { | |
| return ( | |
| <BListItem | |
| key={i} | |
| label={option.name} | |
| value={`${ | |
| ticket.boards.length | |
| } x $${entry.perPlaycost.toFixed(2)}`} | |
| bolder | |
| /> | |
| ); | |
| } | |
| })} | |
| </> | |
| )} | |
| <BSeparator | |
| spaceless | |
| style={{ marginTop: 15, marginBottom: 10 }} | |
| /> | |
| <BListItem | |
| label="Total" | |
| value={ | |
| !getBuyNowButtonEnabled() ? "$0.00": | |
| (isDcGame() ? | |
| `$${getTotalCostDetails().grandTotal.toFixed(2)}` | |
| : | |
| isR2RGame(gameId) ? `$${(ticket.calculateCost() * (isR2RBonusEnabled ? 2 : 1)).toFixed(2)}` | |
| : `$${((canDisplayTotal()) ? ticketTotal : 0).toFixed(2)}`) | |
| } | |
| size="extraLarge" | |
| bolder | |
| /> | |
| <BSeparator | |
| spaceless | |
| style={{ marginTop: 10, marginBottom: 25 }} | |
| /> | |
| {(isR2RGame(gameId) ? ticket.calculateCost() > config.maxBetAmount : ticketTotal > config.maxBetAmount) && ( | |
| <Text style={{ marginBottom: 10, ...styles.containerTitle, color: "red", fontSize: 14 }}> | |
| {`Your participation cost is higher than the maximum allowed ($${config.maxBetAmount}). Please change your play selections and try again.`} | |
| </Text> | |
| )} | |
| {/* BUY NOW BUTTON */} | |
| <BButton | |
| title="Buy now" | |
| onPress={handleTicketBuyNow} | |
| mode="danger" | |
| disabled={ | |
| (ticketOptions.find((e) => e.id == "JTJ")) ? false | |
| : | |
| isR2RGame(gameId) ? | |
| !(getBuyNowButtonEnabled() && ticket.calculateCost() < config.maxBetAmount && ticket.calculateCost() >= 1) | |
| : | |
| !(getBuyNowButtonEnabled() && ticketTotal < config.maxBetAmount) | |
| } | |
| /> | |
| <SizedBox height={15} /> | |
| {/* ADD TO CART BUTTON */} | |
| <BButton | |
| title={currentCartItem ? "Update cart" : "Add to cart"} | |
| onPress={() => { | |
| if (currentCartItem && currentCartItem.ticket) { | |
| updateCart(); | |
| } else { | |
| handleTicketAddToCart(); | |
| } | |
| }} | |
| disabled={ | |
| isR2RGame(gameId) ? | |
| !(getBuyNowButtonEnabled() && ticket.calculateCost() < config.maxBetAmount && ticket.calculateCost() >= 1) | |
| : | |
| !(getBuyNowButtonEnabled() && ticketTotal < config.maxBetAmount) | |
| } | |
| mode="primary" | |
| /> | |
| <SizedBox height={15} /> | |
| {/* ADD TO FAVORITES */} | |
| <BButton | |
| title={currentView == NUMERICAL_GAME_VIEW.FAVORITE_PAYSLIPS && selectedFavoriteTicket ? "Update favorite" : "Add to favorites"} | |
| onPress={() => { | |
| if (isDcGame() && isDrawTimeBoth()) { | |
| ticket.setMultipleDraws(multiDraws.value / 2); | |
| } else { | |
| ticket.setMultipleDraws(multiDraws.value); | |
| } | |
| setShowFavoriteNumberModal(true) | |
| }} | |
| disabled={ | |
| isR2RGame(gameId) ? | |
| (!ticketCanBeSubmited || | |
| disableManualInput || | |
| !(getBuyNowButtonEnabled() && ticket.calculateCost() < config.maxBetAmount && ticket.calculateCost() >= 1) || | |
| isJTJ) | |
| : | |
| (!ticketCanBeSubmited || | |
| disableManualInput || | |
| !(getBuyNowButtonEnabled() && ticketTotal < config.maxBetAmount) || | |
| isJTJ) | |
| } | |
| /> | |
| <SizedBox height={20} /> | |
| </TransparentContainer> | |
| </View> | |
| <Footer/> | |
| </ScrollView> | |
| {/* GENERATE QR CODE MODAL */} | |
| {showGenerateQrCodeModal && ( | |
| <GenerateQrCodeModal | |
| isVisible={showGenerateQrCodeModal} | |
| onClose={() => setShowGenerateQrCodeModal(false)} | |
| /> | |
| )} | |
| {/* BUY CONFIRMATION MODAL */} | |
| {showBuyConfirmationModal && ( | |
| <ConfirmationModal | |
| isVisible={showBuyConfirmationModal} | |
| onClose={() => setShowBuyConfirmationModal(false)} | |
| logo={config.gameLogo} | |
| config={config} | |
| ticket={verifyTicketObj?.wager.dbg[0]} | |
| cost={verifyTicketObj?.wager.dbg[0].cost} | |
| participatingDraws={ | |
| verifyTicketObj?.wager.dbg[0].participatingDraws | |
| } | |
| onBuy={() => { | |
| if (verifyTicketObj) { | |
| execPlayCoupon({ ticket: verifyTicketObj }); | |
| } | |
| }} | |
| isDCGame={isDcGame()} | |
| /> | |
| )} | |
| {/* MESSAGE MODAL */} | |
| {showBuyMessageModal && ( | |
| <MessageModal | |
| isVisible={showBuyMessageModal} | |
| onClose={() => { | |
| setShowBuyMessageModal(false); | |
| setVerifyTicketObj(null); | |
| setSerialNumber(null); | |
| handleScrollToTop(); | |
| }} | |
| logo={config.gameLogo} | |
| ticket={verifyTicketObj?.wager.dbg[0]} | |
| cost={verifyTicketObj?.wager.dbg[0].cost} | |
| participatingDraws={ | |
| verifyTicketObj?.wager.dbg[0].participatingDraws | |
| } | |
| serialNumber={serialNumber} | |
| config={config} | |
| /> | |
| )} | |
| {/* JTJ CONFIRMATION TOGGLE */} | |
| {showJTJConfirmationModal && ( | |
| <JTJConfirmationModal | |
| isVisible={showJTJConfirmationModal != null} | |
| onNo={() => { | |
| setShowJTJConfirmationModal(null); | |
| }} | |
| onYes={() => { | |
| setTicket( | |
| ticketFactory.createDefault({ gameId, config }), | |
| ); | |
| setDisableManualInput(true); | |
| setTicketOptions(showJTJConfirmationModal); | |
| setShowJTJConfirmationModal(null); | |
| }} | |
| /> | |
| )} | |
| <AddToFavoritesModal | |
| ticket={ticket} | |
| ticketOptions={ticketOptions} | |
| isVisible={showFavoriteNumberModal} | |
| favoriteTicket={selectedFavoriteTicket} | |
| onClose={() => setShowFavoriteNumberModal((v) => !v)} | |
| onSuccess={() => { | |
| setIsModified(false); | |
| setShowSuccessMessage(`SUCCESSFULLY ${selectedFavoriteTicket ? 'UPDATED' : 'ADDED'} YOUR FAVORITE!`); | |
| setTimeout(() => { | |
| setShowSuccessAddFavorite(true); | |
| }, 750); | |
| }} | |
| fromNumericalGame={true} | |
| /> | |
| {showSuccessAddFavorite && ( | |
| <GenericSuccessModal | |
| isVisible={showSuccessAddFavorite} | |
| message={showSuccessMessage} | |
| onClose={() => { | |
| setShowSuccessMessage(""); | |
| setShowSuccessAddFavorite(false); | |
| }} | |
| /> | |
| )} | |
| {appDataBannerItem && showGameInfoModal && ( | |
| <ViewNumericalGameInfoModal | |
| isVisible={showGameInfoModal} | |
| onClose={() => { | |
| setShowGameInfoModal((v) => !v); | |
| }} | |
| game={appDataBannerItem} | |
| /> | |
| )} | |
| {showMegaplierConfirmation != null && isMegaMillion(gameId) && ( | |
| <MegaPlierConfirmationModal | |
| isVisible={showMegaplierConfirmation != null} | |
| onPositive={() => { | |
| enablePowerPlayMM(); | |
| }} | |
| onNegative={() => { | |
| setShowMegaplierConfirmation(null); | |
| }} | |
| onClose={() => { | |
| setShowMegaplierConfirmation(null); | |
| }} | |
| /> | |
| )} | |
| </Layout> | |
| </React.Fragment> | |
| ); | |
| }; | |
| interface IJTJConfirmationModal { | |
| isVisible: boolean; | |
| onNo: () => void; | |
| onYes: () => void; | |
| } | |
| const JTJConfirmationModal: React.FC<IJTJConfirmationModal> = ({ | |
| isVisible, | |
| onNo, | |
| onYes, | |
| }) => { | |
| return ( | |
| <BModal isVisible={isVisible} onClose={onNo}> | |
| <React.Fragment> | |
| <ScrollView showsVerticalScrollIndicator={false}> | |
| <BModalHeader> | |
| <Text | |
| style={[ | |
| GS.txtUpper, | |
| GS.FF_PoppinsSemiBold, | |
| GS.txtCenter, | |
| GS.py1, | |
| GS.txtWhite, | |
| ]}> | |
| Selecting Just The Jackpot will reset your current game board. Are you sure you want to continue? | |
| </Text> | |
| </BModalHeader> | |
| <BModalFooter style={[GS.row, GS.justifyCenter]}> | |
| <BButton | |
| onPress={onNo} | |
| title="No" | |
| type="outlined" | |
| /> | |
| <SizedBox width={10} /> | |
| <BButton | |
| title="Yes" | |
| onPress={onYes} | |
| mode="primary" | |
| /> | |
| </BModalFooter> | |
| </ScrollView> | |
| </React.Fragment> | |
| </BModal> | |
| ); | |
| }; | |
| interface IMegaplierConfirmation { | |
| isVisible: boolean; | |
| onClose: () => void; | |
| onPositive: () => void; | |
| onNegative: () => void; | |
| } | |
| const MegaPlierConfirmationModal: React.FC<IMegaplierConfirmation> = ({ | |
| isVisible, | |
| onClose, | |
| onPositive, | |
| onNegative | |
| }) => { | |
| return ( | |
| <BModal isVisible={isVisible} onClose={onClose}> | |
| <React.Fragment> | |
| <ScrollView showsVerticalScrollIndicator={false}> | |
| <BModalHeader> | |
| <Text | |
| style={[ | |
| GS.txtUpper, | |
| GS.FF_PoppinsSemiBold, | |
| GS.txtXl, | |
| GS.py1, | |
| GS.txtWhite, | |
| ]}> | |
| Confirmation | |
| </Text> | |
| </BModalHeader> | |
| <View style={[GS.px3, GS.py4]}> | |
| <Text | |
| style={[GS.txtCenter, GS.txtUpper, GS.txtSm, GS.mb4, GS.txtWhite]}> | |
| Selecting Megaplier will turn off Just The Jackpot. Are you sure you want to continue ? | |
| </Text> | |
| </View> | |
| <BModalFooter style={[GS.row, GS.justifyCenter]}> | |
| <BButton | |
| title="NO" | |
| onPress={onNegative} | |
| mode="primary" | |
| /> | |
| <SizedBox width={8} /> | |
| <BButton | |
| title="YES" | |
| onPress={onPositive} | |
| mode="danger" | |
| /> | |
| </BModalFooter> | |
| </ScrollView> | |
| </React.Fragment> | |
| </BModal> | |
| ); | |
| }; | |
| export default NumericalGameInnerScreen; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment