{"version":3,"file":"static/js/3160.dba3f502.chunk.js","mappings":"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","sources":["common/hooks/useDelayedState.ts","common/util/Array/getRandomItem.ts","common/util/Array/shuffle.ts","components/shared/CharacterComment/index.tsx","components/shared/Input/TextField.tsx","components/shared/Panel/VocabRoulette/components/CurrentCoinsArea.tsx","components/shared/Panel/VocabRoulette/components/OptionsCard.tsx","components/shared/Panel/VocabRoulette/components/SlotController.tsx","common/util/Array/distinct.ts","components/shared/Panel/VocabRoulette/Panel.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\r\n\r\nexport function useDelayedState(\r\n state: T,\r\n checkOpen: (state: T) => boolean,\r\n timeoutMilliSecond: number\r\n): { delayedState: T; delayedOpen: boolean } {\r\n const [delayedState, setDelayedState] = useState(state);\r\n useEffect(() => {\r\n if (checkOpen(state)) {\r\n // When it opens\r\n setDelayedState(state);\r\n return;\r\n }\r\n\r\n // When it closes\r\n const timeoutId = setTimeout(() => {\r\n setDelayedState(state);\r\n }, timeoutMilliSecond);\r\n return () => {\r\n clearTimeout(timeoutId);\r\n };\r\n }, [state, timeoutMilliSecond, checkOpen]);\r\n\r\n return { delayedState, delayedOpen: checkOpen(delayedState) };\r\n}\r\n","export function getRandomItem(arr: T[] | ReadonlyArray): T | undefined {\r\n return arr[Math.floor(Math.random() * arr.length)];\r\n}\r\n","export function shuffle([...array]: T[] | ReadonlyArray): T[] {\r\n let n = array.length,\r\n t,\r\n i;\r\n\r\n while (n) {\r\n i = Math.floor(Math.random() * n--);\r\n t = array[n];\r\n array[n] = array[i];\r\n array[i] = t;\r\n }\r\n\r\n return array;\r\n}\r\n","import { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { BaseCSSProperties } from \"@material-ui/core/styles/withStyles\";\r\nimport * as React from \"react\";\r\nimport * as consts from \"../../../common/consts\";\r\nimport { spaceBetween } from \"../../../common/util/Array/spaceBetween\";\r\nimport \"./CharacterComment.css\";\r\n\r\ntype TProps = {\r\n imgNumber: number;\r\n screenWidth: number;\r\n comment: string | React.ReactNode;\r\n style?: BaseCSSProperties;\r\n commentStyle?: BaseCSSProperties;\r\n imgStyle?: BaseCSSProperties;\r\n containerRef?: React.RefObject;\r\n className?: string;\r\n};\r\nexport default function CharacterComment(props: TProps) {\r\n const {\r\n imgNumber,\r\n screenWidth,\r\n comment,\r\n style,\r\n commentStyle,\r\n imgStyle,\r\n containerRef,\r\n className,\r\n } = props;\r\n const c = useStyles({ style, imgStyle, screenWidth, commentStyle });\r\n\r\n return (\r\n \r\n
\r\n \r\n
\r\n
\r\n
\r\n {comment}\r\n
\r\n
\r\n \r\n );\r\n}\r\nconst useStyles = makeStyles<\r\n Theme,\r\n {\r\n style?: BaseCSSProperties;\r\n imgStyle?: BaseCSSProperties;\r\n commentStyle?: BaseCSSProperties;\r\n screenWidth: number;\r\n }\r\n>({\r\n container: ({ style }) => ({ ...style }),\r\n ninjaPic: ({ imgStyle, screenWidth }) => ({\r\n width: (screenWidth * 2) / 10,\r\n ...imgStyle,\r\n }),\r\n comment: ({ screenWidth, commentStyle }) => ({\r\n width: screenWidth > 767 ? (screenWidth * 7) / 10 - 15 : \"100%\",\r\n ...commentStyle,\r\n }),\r\n});\r\n","import { InputBaseComponentProps } from \"@material-ui/core/InputBase\";\r\nimport MuiTextField, { TextFieldProps } from \"@material-ui/core/TextField\";\r\nimport { CSSProperties, useState } from \"react\";\r\n\r\nexport function TextField({\r\n onMouseDown,\r\n onFocus,\r\n inputProps,\r\n ...rest\r\n}: TextFieldProps) {\r\n const [inputStyle, setInputStyle] = useState(\r\n getInitialInputStyle(inputProps, rest.autoFocus)\r\n );\r\n\r\n return (\r\n {\r\n /**\r\n * Prevent iPhone screen from zooming automatically\r\n * Reference: https://stackoverflow.com/a/41487632\r\n */\r\n (\r\n ev.target as HTMLInputElement | HTMLTextAreaElement\r\n ).style.fontSize = \"16px\"; // Modify the real DOM directly before iPhone detects the font-size\r\n\r\n setInputStyle({ ...inputProps?.style, fontSize: 16 }); // Virtual DOM will also be changed\r\n\r\n onMouseDown?.(ev);\r\n }}\r\n onFocus={ev => {\r\n setInputStyle({ ...inputProps?.style });\r\n\r\n onFocus?.(ev);\r\n }}\r\n inputProps={{\r\n ...inputProps,\r\n style: { ...inputProps?.style, ...inputStyle },\r\n }}\r\n />\r\n );\r\n}\r\n\r\nexport function focusInputSafely(inputEl: HTMLInputElement) {\r\n const currentFontSize = inputEl.style.fontSize;\r\n inputEl.style.fontSize = \"16px\"; // Modify the real DOM directly before iPhone detects the font-size\r\n inputEl.focus();\r\n inputEl.style.fontSize = currentFontSize;\r\n}\r\n\r\nfunction getInitialInputStyle(\r\n inputProps: InputBaseComponentProps | undefined,\r\n autoFocus?: boolean\r\n): CSSProperties | undefined {\r\n if (autoFocus) {\r\n return { ...inputProps?.style, fontSize: 16 };\r\n }\r\n return inputProps?.style;\r\n}\r\n","import Card from \"@material-ui/core/Card\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { appsPublicImg } from \"../../../../../common/consts\";\r\n\r\nexport function CurrentCoinsArea({ coin }: { coin: number }) {\r\n // const { abTestKey, abTestSuccess } = useAbTest({\r\n // testName: \"coin-shop-button-label-in-roulette\",\r\n // keys: [\"Coin Shop\", \"Buy Coins\"],\r\n // });\r\n\r\n const c = useCoinAreaStyles();\r\n\r\n return (\r\n {\r\n // changeAppState(\"paymentPanelState\", { type: \"coin\" });\r\n // abTestSuccess();\r\n // }}\r\n >\r\n \r\n \r\n \r\n \r\n {coin.toLocaleString()}\r\n \r\n {\" coins\"}\r\n \r\n \r\n\r\n {/* \r\n {abTestKey}\r\n */}\r\n \r\n );\r\n}\r\nconst useCoinAreaStyles = makeStyles({\r\n coinArea: {\r\n marginTop: 15,\r\n marginRight: 10,\r\n display: \"flex\",\r\n alignItems: \"flex-start\",\r\n justifyContent: \"flex-end\",\r\n flexWrap: \"wrap\",\r\n width: \"100%\",\r\n },\r\n coinCard: {\r\n display: \"inline-flex\",\r\n alignItems: \"center\",\r\n minHeight: 45,\r\n paddingRight: 15,\r\n marginRight: 5,\r\n // cursor: \"pointer\",\r\n },\r\n coinImg: { width: 35, height: 35, marginLeft: 5, marginRight: 10 },\r\n // buyCoinButton: ({ abTestFetched }) => ({\r\n // maxHeight: 45,\r\n // minHeight: 45,\r\n // marginTop: 5,\r\n // marginRight: 10,\r\n // opacity: abTestFetched ? 1 : 0,\r\n // transition: \"all 500ms\",\r\n // }),\r\n});\r\n","import Card from \"@material-ui/core/Card\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { appsPublicImg } from \"../../../../../common/consts\";\r\nimport { vocab } from \"../../../../../types/vocab\";\r\nimport { theme } from \"../../../../zApps/Layout\";\r\nimport { PrimaryButton } from \"../../../Button/PrimaryButton\";\r\n\r\nexport function OptionsCard({\r\n kunaiYCenter,\r\n optionVocabs,\r\n correctVocab,\r\n isAnswerShown,\r\n currentKunaiIndex,\r\n}: {\r\n kunaiYCenter: number;\r\n optionVocabs: vocab[];\r\n correctVocab?: vocab;\r\n isAnswerShown: boolean;\r\n currentKunaiIndex: number;\r\n}) {\r\n const c = useRouletteCardStyles({ kunaiYCenter });\r\n return (\r\n \r\n \r\n {optionVocabs.map((v, i) => {\r\n const isCorrect = v.vocabId === correctVocab?.vocabId;\r\n return (\r\n \r\n {v.english}\r\n \r\n );\r\n })}\r\n \r\n );\r\n}\r\nconst useRouletteCardStyles = makeStyles(\r\n theme => ({\r\n rouletteArea: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n fontSize: \"large\",\r\n paddingRight: 30,\r\n marginRight: 5,\r\n position: \"relative\",\r\n overflow: \"visible\",\r\n width: \"calc(100% - 5px)\",\r\n backgroundColor: theme.palette.grey[200],\r\n },\r\n kunaiImg: ({ kunaiYCenter }) => ({\r\n position: \"absolute\",\r\n right: 0,\r\n top: kunaiYCenter - 10,\r\n zIndex: 1,\r\n height: 20,\r\n }),\r\n })\r\n);\r\n","import Card from \"@material-ui/core/Card\";\r\nimport Slider from \"@material-ui/core/Slider\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { changeAppState } from \"../../../../../common/appState\";\r\nimport { BLOB_URL } from \"../../../../../common/consts\";\r\nimport { distinct } from \"../../../../../common/util/Array/distinct\";\r\nimport { getRandomItem } from \"../../../../../common/util/Array/getRandomItem\";\r\nimport { shuffle } from \"../../../../../common/util/Array/shuffle\";\r\nimport { spaceBetween } from \"../../../../../common/util/Array/spaceBetween\";\r\nimport { fetchPost, fetchPostFormData } from \"../../../../../common/util/fetch\";\r\nimport { vocab, vocabGenre } from \"../../../../../types/vocab\";\r\nimport { theme } from \"../../../../zApps/Layout\";\r\nimport { SuccessButton } from \"../../../Button/SuccessButton\";\r\nimport { TextField } from \"../../../Input/TextField\";\r\nimport { User } from \"../../../User/types\";\r\n\r\nconst beginnerLimit = 35;\r\nconst superBeginnerTime = [0, 1, 3, 4, 6, 7, 12, 15, 20, 30, 31, 32, 34];\r\n\r\nconst initialKunaiYCenter = 25;\r\nexport const kunaiState = {\r\n yCenter: initialKunaiYCenter,\r\n speed: 0,\r\n maxSpeed: 30 as const,\r\n running: false,\r\n};\r\n\r\nconst timeStepMilliSecond = 50;\r\nexport let outsideState = { isWon: false };\r\nexport const correctSounds = [new Audio(), new Audio()] as const;\r\n\r\nexport function SlotController({\r\n isAnswerShown,\r\n setAnswerShown,\r\n coin,\r\n user,\r\n setKunaiYCenter,\r\n optionVocabs,\r\n setOptionVocabs,\r\n correctVocab,\r\n setCorrectVocab,\r\n allVocabs,\r\n allGenres,\r\n}: {\r\n isAnswerShown: boolean;\r\n setAnswerShown: (shown: boolean) => void;\r\n coin: number;\r\n user?: User;\r\n setKunaiYCenter: (y: number) => void;\r\n optionVocabs: vocab[];\r\n setOptionVocabs: (v: vocab[]) => void;\r\n correctVocab?: vocab;\r\n setCorrectVocab: (v?: vocab) => void;\r\n allVocabs: vocab[];\r\n allGenres: vocabGenre[];\r\n}) {\r\n const disabledInput = kunaiState.running || isAnswerShown;\r\n\r\n const getCoinsToBet = () => {\r\n if (!user) {\r\n return 0;\r\n }\r\n return Math.floor(user.coin / 3) || 1;\r\n };\r\n const [coinsToBet, setCoinsToBet] = useState(getCoinsToBet);\r\n\r\n const isCoinZero = !coin;\r\n useEffect(() => {\r\n if (isCoinZero) {\r\n return;\r\n }\r\n // When the user bought coins or logged in\r\n setCoinsToBet(getCoinsToBet());\r\n }, [isCoinZero]);\r\n\r\n useEffect(() => {\r\n if (coinsToBet > coin) {\r\n setCoinsToBet(coin);\r\n }\r\n }, [coinsToBet, coin]);\r\n\r\n const inputOnFocus = () => {\r\n if (!user) {\r\n changeAppState(\"signInPanelState\", {\r\n type: \"signUp\",\r\n });\r\n return;\r\n }\r\n };\r\n\r\n const c = useControllerStyles({ isAnswerShown });\r\n\r\n return (\r\n <>\r\n {isAnswerShown && }\r\n \r\n
\r\n {\r\n if (kunaiState.running || disabledInput) {\r\n return;\r\n }\r\n const numCoins = parseInt(ev.target.value);\r\n if (Number.isNaN(numCoins)) {\r\n setCoinsToBet(0);\r\n return;\r\n }\r\n const c = Math.max(0, Math.min(coin, numCoins));\r\n setCoinsToBet(c);\r\n }}\r\n onFocus={inputOnFocus}\r\n value={coinsToBet}\r\n inputProps={{ className: c.input }}\r\n />\r\n\r\n \r\n
\r\n\r\n \r\n
\r\n \r\n );\r\n}\r\nconst useControllerStyles = makeStyles({\r\n inputAndButtonContainer: {\r\n padding: 5,\r\n marginRight: 5,\r\n marginTop: ({ isAnswerShown }) => (isAnswerShown ? 0 : 15),\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n width: \"calc(100% - 5px)\",\r\n },\r\n inputContainer: {\r\n marginRight: 5,\r\n width: \"calc(100% - 10px)\",\r\n paddingRight: 15,\r\n paddingLeft: 15,\r\n paddingBottom: 5,\r\n height: 77,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n },\r\n input: { padding: 8 },\r\n});\r\n\r\nfunction MessageBelow({ coinsToBet }: { coinsToBet: number }) {\r\n const c = useMessageBelowStyles();\r\n return (\r\n
\r\n {outsideState.isWon ? (\r\n \r\n Congratulations!\r\n
\r\n \r\n {coinsToBet.toLocaleString()}\r\n {\" \"}\r\n coins became{\" \"}\r\n \r\n {(coinsToBet * 4).toLocaleString()}\r\n {\" \"}\r\n coins!\r\n
\r\n ) : (\r\n \r\n Sorry! You lost the coins!\r\n \r\n )}\r\n
\r\n );\r\n}\r\nconst useMessageBelowStyles = makeStyles({\r\n resultContainer: {\r\n padding: \"10px 0\",\r\n },\r\n\r\n successMessage: {\r\n color: theme.palette.success.dark,\r\n },\r\n\r\n resultCoinNum: {\r\n fontSize: \"large\",\r\n whiteSpace: \"nowrap\",\r\n },\r\n failedMessage: {\r\n color: theme.palette.secondary.main,\r\n },\r\n});\r\n\r\nfunction CoinSlider({\r\n coin,\r\n disabledInput,\r\n user,\r\n coinsToBet,\r\n setCoinsToBet,\r\n inputOnFocus,\r\n}: {\r\n coin: number;\r\n disabledInput: boolean;\r\n user?: User;\r\n coinsToBet: number;\r\n setCoinsToBet: (coin: number) => void;\r\n inputOnFocus: () => void;\r\n}) {\r\n const [sliderMaxValue, setSliderMaxValue] = useState(coin);\r\n useEffect(() => {\r\n if (!disabledInput) {\r\n setSliderMaxValue(coin);\r\n }\r\n }, [disabledInput, coin]);\r\n\r\n const c = useSliderStyles();\r\n\r\n return (\r\n <>\r\n {\r\n if (\r\n !user ||\r\n typeof newValue !== \"number\" ||\r\n disabledInput\r\n ) {\r\n return;\r\n }\r\n setCoinsToBet(\r\n Math.min(\r\n user.coin,\r\n Math.ceil((user.coin * newValue) / 100)\r\n )\r\n );\r\n }}\r\n className={c.slider}\r\n disabled={disabledInput}\r\n onFocus={inputOnFocus}\r\n />\r\n
\r\n
0
\r\n
\r\n {sliderMaxValue > 0\r\n ? sliderMaxValue.toLocaleString()\r\n : null}\r\n
\r\n
\r\n \r\n );\r\n}\r\nconst useSliderStyles = makeStyles({\r\n slider: { padding: 0 },\r\n sliderEdgeNumber: {\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n fontSize: \"xx-small\",\r\n width: \"100%\",\r\n },\r\n});\r\n\r\nfunction SlotButton({\r\n isAnswerShown,\r\n user,\r\n setKunaiYCenter,\r\n coinsToBet,\r\n setAnswerShown,\r\n getCoinsToBet,\r\n allVocabs,\r\n setOptionVocabs,\r\n setCorrectVocab,\r\n allGenres,\r\n correctVocab,\r\n optionVocabs,\r\n setCoinsToBet,\r\n}: {\r\n isAnswerShown: boolean;\r\n user?: User;\r\n setKunaiYCenter: (y: number) => void;\r\n coinsToBet: number;\r\n setAnswerShown: (shown: boolean) => void;\r\n getCoinsToBet: () => number;\r\n allVocabs: vocab[];\r\n setOptionVocabs: (v: vocab[]) => void;\r\n setCorrectVocab: (v?: vocab) => void;\r\n allGenres: vocabGenre[];\r\n correctVocab?: vocab;\r\n optionVocabs: vocab[];\r\n setCoinsToBet: (c: number) => void;\r\n}) {\r\n const isTopSpeed = kunaiState.speed >= kunaiState.maxSpeed;\r\n const isZeroSpeed = kunaiState.speed <= 0;\r\n\r\n const [slotRunning, setSlotRunning] = useState(false);\r\n useEffect(() => {\r\n if (slotRunning) {\r\n // Start running and continue to run\r\n const intervalId = setInterval(() => {\r\n if (kunaiState.speed < kunaiState.maxSpeed) {\r\n kunaiState.speed++;\r\n }\r\n const newTop = kunaiState.yCenter + kunaiState.speed;\r\n kunaiState.yCenter = newTop >= 200 ? 0 : newTop;\r\n setKunaiYCenter(kunaiState.yCenter);\r\n }, timeStepMilliSecond);\r\n return () => {\r\n clearInterval(intervalId);\r\n };\r\n }\r\n\r\n // Slow down and stop running\r\n const intervalId = setInterval(() => {\r\n if (kunaiState.speed <= 0) {\r\n // When kunai stops\r\n if (kunaiState.running && user) {\r\n fetchRouletteResult(\r\n user.userId,\r\n coinsToBet,\r\n user.roulettePlay + 1, // ルーレットスタート時点でDB側ではカウントアップされている。それに合わせてフロントが現在持っている1つ古い情報もカウントアップしてから照合する(スタート時点でカウントアップしないと、複数タブによる不正に対応できないため、このような設計になっている)\r\n outsideState.isWon\r\n );\r\n setTimeout(() => {\r\n setAnswerShown(true);\r\n kunaiState.running = false;\r\n correctSounds[outsideState.isWon ? 0 : 1].play();\r\n }, 700);\r\n }\r\n clearInterval(intervalId);\r\n }\r\n const isSuperBeginner =\r\n user && superBeginnerTime.includes(user.roulettePlay);\r\n const isBeginner =\r\n isSuperBeginner || (user && user.roulettePlay < beginnerLimit);\r\n const almostStopped = kunaiState.speed === 1;\r\n const superBeginnerOnWrongAnswer =\r\n isSuperBeginner && almostStopped && !outsideState.isWon;\r\n const beginnerOnCorrectAnswer =\r\n isBeginner && almostStopped && outsideState.isWon;\r\n if (\r\n !superBeginnerOnWrongAnswer &&\r\n (kunaiState.speed > 10 ||\r\n (kunaiState.speed > 2 && Math.random() < 0.4) ||\r\n Math.random() < 0.02 ||\r\n (beginnerOnCorrectAnswer && Math.random() < 0.05))\r\n ) {\r\n kunaiState.speed--;\r\n }\r\n const newTop = kunaiState.yCenter + kunaiState.speed;\r\n kunaiState.yCenter = newTop >= 200 ? 0 : newTop;\r\n setKunaiYCenter(kunaiState.yCenter);\r\n }, timeStepMilliSecond);\r\n return () => {\r\n clearInterval(intervalId);\r\n };\r\n }, [slotRunning]);\r\n\r\n const newGame = () => {\r\n if (allVocabs.length === 0) {\r\n return;\r\n }\r\n const targetGenreId = getRandomItem(\r\n distinct(allVocabs.map(v => v.genreId))\r\n );\r\n const options = shuffle(\r\n allVocabs.filter(v => v.genreId === targetGenreId)\r\n ).slice(0, 4);\r\n setOptionVocabs(options);\r\n const correctVocab = getRandomItem(options);\r\n setCorrectVocab(correctVocab);\r\n\r\n kunaiState.yCenter = initialKunaiYCenter;\r\n setKunaiYCenter(initialKunaiYCenter);\r\n\r\n const audio = new window.Audio();\r\n audio.src = `${BLOB_URL}/vocabulary-quiz/audio/${\r\n allGenres.find(g => g.genreId === targetGenreId)?.genreName\r\n }/Japanese-vocabulary${correctVocab?.vocabId}.m4a`;\r\n audio.play();\r\n };\r\n useEffect(() => {\r\n if (!correctVocab || optionVocabs.length === 0) {\r\n newGame();\r\n }\r\n }, [allVocabs]);\r\n\r\n const c = useButtonStyles();\r\n\r\n if (isAnswerShown) {\r\n return (\r\n {\r\n if (!user) {\r\n return;\r\n }\r\n setCoinsToBet(getCoinsToBet());\r\n setAnswerShown(false);\r\n newGame();\r\n }}\r\n >\r\n {\"Next\"}\r\n \r\n );\r\n }\r\n return (\r\n {\r\n if (!user) {\r\n changeAppState(\"signInPanelState\", {\r\n type: \"signUp\",\r\n });\r\n return;\r\n }\r\n if (user.coin === 0) {\r\n alertCoinShortage();\r\n return;\r\n }\r\n\r\n const nextRunningState = !slotRunning;\r\n if (nextRunningState) {\r\n kunaiState.running = true;\r\n const formData = new FormData();\r\n formData.append(\"userId\", user.userId.toString());\r\n formData.append(\"coinsToBet\", coinsToBet.toString());\r\n fetchPostFormData(\"api/Roulette/StartRoulette\", formData);\r\n }\r\n setSlotRunning(nextRunningState);\r\n }}\r\n disabled={\r\n (slotRunning && !isTopSpeed) || (!slotRunning && !isZeroSpeed)\r\n }\r\n >\r\n {slotRunning ? \"Stop!\" : \"Start Roulette!\"}\r\n \r\n );\r\n}\r\nconst useButtonStyles = makeStyles({\r\n nextButton: {\r\n fontSize: \"x-large\",\r\n lineHeight: 1.1,\r\n minHeight: 77,\r\n maxHeight: 77,\r\n minWidth: 146,\r\n maxWidth: 146,\r\n },\r\n startButton: {\r\n fontSize: \"x-large\",\r\n lineHeight: 1.1,\r\n minHeight: 77,\r\n maxHeight: 77,\r\n minWidth: 146,\r\n maxWidth: 146,\r\n },\r\n});\r\n\r\nfunction alertCoinShortage() {\r\n changeAppState(\"simpleDialogState\", {\r\n open: true,\r\n title: \"Sorry!\",\r\n message: `You don't have coins to play the roulette!`,\r\n buttonLabel: \"OK\",\r\n onButtonClick: () => {\r\n changeAppState(\"simpleDialogState\", {\r\n open: false,\r\n });\r\n // changeAppState(\"paymentPanelState\", {\r\n // type: \"coin\",\r\n // });\r\n },\r\n titleStyle: { color: theme.palette.secondary.main },\r\n });\r\n}\r\n\r\nasync function fetchRouletteResult(\r\n userId: number,\r\n betCoins: number,\r\n roulettePlayCount: number,\r\n isWon: boolean\r\n) {\r\n const result = await fetchPost<\r\n {\r\n userId: number;\r\n betCoins: number;\r\n roulettePlayCount: number;\r\n isWon: boolean;\r\n },\r\n User\r\n >(\"api/Roulette/RouletteResult\", {\r\n userId,\r\n betCoins,\r\n roulettePlayCount,\r\n isWon,\r\n });\r\n if (\"error\" in result) {\r\n return;\r\n }\r\n changeAppState(\"user\", result);\r\n}\r\n","export function distinct(array: T[] | ReadonlyArray): T[] {\r\n return Array.from(new Set(array));\r\n}\r\n","import { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { useEffect, useState } from \"react\";\r\nimport { connect } from \"react-redux\";\r\nimport { bindActionCreators } from \"redux\";\r\nimport { StopAnimation } from \"../../../../common/animation\";\r\nimport { useAppState } from \"../../../../common/appState\";\r\nimport { BLOB_URL } from \"../../../../common/consts\";\r\nimport { useDelayedState } from \"../../../../common/hooks/useDelayedState\";\r\nimport { useScreenSize } from \"../../../../common/hooks/useScreenSize\";\r\nimport { ApplicationState } from \"../../../../store/configureStore\";\r\nimport * as vocabStore from \"../../../../store/VocabQuizStore\";\r\nimport { vocab } from \"../../../../types/vocab\";\r\nimport ShurikenProgress from \"../../Animations/ShurikenProgress\";\r\nimport CharacterComment from \"../../CharacterComment\";\r\nimport { RightPanel } from \"../RightPanel\";\r\nimport { CurrentCoinsArea } from \"./components/CurrentCoinsArea\";\r\nimport { OptionsCard } from \"./components/OptionsCard\";\r\nimport {\r\n correctSounds,\r\n kunaiState,\r\n outsideState,\r\n SlotController,\r\n} from \"./components/SlotController\";\r\n\r\nconst transitionMilliseconds = 1000;\r\nconst panelWidth = 500;\r\n\r\nexport default function VocabRoulettePanel() {\r\n const [panelState, setPanelState] = useAppState(\"vocabRoulettePanelState\");\r\n const { delayedOpen } = useDelayedState(\r\n panelState,\r\n state => state.open,\r\n transitionMilliseconds + 15000 // To prevent canceling roulette\r\n );\r\n\r\n return (\r\n {\r\n setPanelState({ open: false });\r\n }}\r\n panelWidth={panelWidth}\r\n globalPanelState={panelState}\r\n transitionMilliseconds={transitionMilliseconds}\r\n >\r\n {delayedOpen && }\r\n \r\n );\r\n}\r\n\r\nexport function Content() {\r\n const c = useStyles();\r\n\r\n return (\r\n
\r\n

Vocab Roulette!

\r\n \r\n
\r\n );\r\n}\r\nconst useStyles = makeStyles({\r\n container: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n marginLeft: 5,\r\n },\r\n title: {\r\n padding: \"5px 20px\",\r\n marginBottom: 8,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n maxWidth: \"100%\",\r\n height: 48,\r\n fontWeight: \"bold\",\r\n },\r\n});\r\n\r\ntype GameProps = vocabStore.IVocabQuizState & vocabStore.ActionCreators;\r\n\r\nconst Game = connect(\r\n (state: ApplicationState) => state.vocabQuiz,\r\n dispatch => bindActionCreators(vocabStore.actionCreators, dispatch)\r\n)(function Game({\r\n loadAllGenres,\r\n loadAllVocabs,\r\n allGenres,\r\n allVocabs,\r\n}: GameProps) {\r\n const [correctVocab, setCorrectVocab] = useState(\r\n undefined\r\n );\r\n const [optionVocabs, setOptionVocabs] = useState([]);\r\n\r\n const [kunaiYCenter, setKunaiYCenter] = useState(kunaiState.yCenter);\r\n const { screenWidth } = useScreenSize();\r\n const [isAnswerShown, setAnswerShown] = useState(false);\r\n const [user] = useAppState(\"user\");\r\n const currentKunaiIndex = Math.floor(kunaiYCenter / 50);\r\n outsideState.isWon =\r\n optionVocabs.length === 4 &&\r\n optionVocabs[currentKunaiIndex].vocabId === correctVocab?.vocabId;\r\n\r\n useEffect(() => {\r\n correctSounds[0].src = BLOB_URL + \"/appsPublic/sound/correctSound.mp3\";\r\n correctSounds[1].src =\r\n BLOB_URL + \"/appsPublic/sound/incorrectSound.mp3\";\r\n correctSounds.forEach(s => s.load);\r\n }, []);\r\n\r\n useEffect(() => {\r\n loadAllGenres();\r\n loadAllVocabs();\r\n }, [loadAllGenres, loadAllVocabs]);\r\n\r\n const coin = user?.coin ?? 0;\r\n\r\n const c = useGameStyles({ isAnswerShown });\r\n\r\n if (allVocabs.length <= 0) {\r\n return ;\r\n }\r\n\r\n const characterCommentWidth = Math.min(450, screenWidth - 20);\r\n\r\n return (\r\n
\r\n \r\n\r\n \r\n If the roulette stops at the correct answer, the coins\r\n you bet will be 4× more!\r\n
\r\n If not, the coins will disappear!\r\n
\r\n }\r\n style={{ width: characterCommentWidth, marginTop: 10 }}\r\n />\r\n\r\n
\r\n
{correctVocab?.kanji}
\r\n
{`(${correctVocab?.hiragana})`}
\r\n
\r\n\r\n \r\n\r\n \r\n\r\n \r\n \r\n );\r\n});\r\nconst useGameStyles = makeStyles({\r\n container: {\r\n overflow: \"visible\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n marginBottom: 50,\r\n width: \"100%\",\r\n },\r\n japaneseContainer: {\r\n marginTop: 20,\r\n marginBottom: 10,\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n marginRight: 25,\r\n },\r\n});\r\n"],"names":["useDelayedState","state","checkOpen","timeoutMilliSecond","_useState","useState","_useState2","_slicedToArray","delayedState","setDelayedState","useEffect","timeoutId","setTimeout","clearTimeout","delayedOpen","getRandomItem","arr","Math","floor","random","length","shuffle","_ref","t","i","array","_toArray","slice","n","CharacterComment","props","imgNumber","screenWidth","comment","style","commentStyle","imgStyle","containerRef","className","c","useStyles","_jsxs","ref","spaceBetween","container","children","_jsx","src","concat","consts","alt","ninjaPic","makeStyles","_objectSpread","_ref2","width","_ref3","TextField","onMouseDown","onFocus","inputProps","rest","_objectWithoutProperties","_excluded","autoFocus","fontSize","getInitialInputStyle","inputStyle","setInputStyle","MuiTextField","ev","target","CurrentCoinsArea","coin","useCoinAreaStyles","coinArea","Card","coinCard","appsPublicImg","coinImg","toLocaleString","marginTop","marginRight","display","alignItems","justifyContent","flexWrap","minHeight","paddingRight","height","marginLeft","OptionsCard","kunaiYCenter","optionVocabs","correctVocab","isAnswerShown","currentKunaiIndex","useRouletteCardStyles","rouletteArea","kunaiImg","map","v","isCorrect","vocabId","PrimaryButton","fullWidth","margin","padding","flexDirection","maxHeight","opacity","border","theme","undefined","disabled","disableFocusRipple","english","position","overflow","backgroundColor","palette","grey","right","top","zIndex","beginnerLimit","superBeginnerTime","initialKunaiYCenter","kunaiState","yCenter","speed","maxSpeed","running","timeStepMilliSecond","outsideState","isWon","correctSounds","Audio","SlotController","setAnswerShown","user","setKunaiYCenter","setOptionVocabs","setCorrectVocab","allVocabs","allGenres","disabledInput","getCoinsToBet","coinsToBet","setCoinsToBet","isCoinZero","inputOnFocus","changeAppState","type","useControllerStyles","_Fragment","MessageBelow","inputAndButtonContainer","inputContainer","variant","required","label","onChange","numCoins","parseInt","value","Number","isNaN","max","min","input","CoinSlider","SlotButton","paddingLeft","paddingBottom","useMessageBelowStyles","resultContainer","successMessage","resultCoinNum","failedMessage","color","whiteSpace","_ref4","_useState3","_useState4","sliderMaxValue","setSliderMaxValue","useSliderStyles","Slider","event","newValue","ceil","slider","sliderEdgeNumber","_ref5","isTopSpeed","isZeroSpeed","_useState5","_useState6","slotRunning","setSlotRunning","intervalId","setInterval","newTop","clearInterval","_x","_x2","_x3","_x4","_fetchRouletteResult","apply","arguments","fetchRouletteResult","userId","roulettePlay","play","isSuperBeginner","includes","isBeginner","almostStopped","superBeginnerOnWrongAnswer","beginnerOnCorrectAnswer","newGame","_allGenres$find","targetGenreId","genreId","Array","from","Set","options","filter","audio","window","BLOB_URL","find","g","genreName","useButtonStyles","SuccessButton","nextButton","onClick","startButton","nextRunningState","formData","FormData","append","toString","fetchPostFormData","open","title","message","buttonLabel","onButtonClick","titleStyle","lineHeight","minWidth","maxWidth","_asyncToGenerator","_regeneratorRuntime","mark","_callee","betCoins","roulettePlayCount","result","wrap","_context","prev","next","fetchPost","sent","abrupt","stop","transitionMilliseconds","panelWidth","VocabRoulettePanel","_useAppState","useAppState","_useAppState2","panelState","setPanelState","RightPanel","panelName","onClose","globalPanelState","Content","Game","marginBottom","textOverflow","fontWeight","connect","vocabQuiz","dispatch","bindActionCreators","vocabStore","_user$coin","loadAllGenres","loadAllVocabs","useScreenSize","_useState7","_useState8","_useAppState3","forEach","s","load","useGameStyles","ShurikenProgress","size","characterCommentWidth","StopAnimation","japaneseContainer","kanji","hiragana","textAlign"],"sourceRoot":""}