{"version":3,"file":"static/js/1107.9227f521.chunk.js","mappings":"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","sources":["common/hooks/useAbTest.ts","common/util/Array/getRandomItem.ts","components/shared/CharacterComment/index.tsx","components/shared/Dialog/CenterDialog.tsx","components/shared/Dialog/ResultXpDialog/GuestUser.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\r\nimport { sendPost, sleepAsync } from \"../functions\";\r\nimport { getRandomItem } from \"../util/Array/getRandomItem\";\r\n\r\nexport function useAbTest>({\r\n testName,\r\n keys,\r\n initialKey,\r\n open = true,\r\n}: {\r\n testName: string; // max length is 200 (DB column limit)\r\n keys: T; // max length of each string is 200 (DB column limit)\r\n initialKey?: T[number];\r\n open?: boolean;\r\n}) {\r\n const [key, setKey] = useState(initialKey);\r\n const [isAlreadySuccess, setAlreadySuccess] = useState(false);\r\n\r\n useEffect(() => {\r\n if (!open) {\r\n setKey(initialKey);\r\n return;\r\n }\r\n fetchKey(testName, keys).then(key => {\r\n setKey(key);\r\n setAlreadySuccess(false);\r\n });\r\n }, [testName, ...keys, open, initialKey]);\r\n\r\n return {\r\n abTestSuccess: () => {\r\n if (key && !isAlreadySuccess) {\r\n setAlreadySuccess(true);\r\n fetchSuccess(testName, key);\r\n }\r\n },\r\n abTestKey: key,\r\n };\r\n}\r\n\r\nconst noFetch =\r\n location.href.includes(\"://localhost\") || localStorage.getItem(\"isAdmin\");\r\n\r\nasync function fetchKey>(\r\n testName: string,\r\n keys: T\r\n): Promise {\r\n try {\r\n if (noFetch) {\r\n console.log(\"GetAbTestKey\", {\r\n testName,\r\n keys,\r\n });\r\n if (testName.length > 200) {\r\n alert(\r\n \"AB test error! Maximum length of testName is 200! It's because of the DB table's column setting!\"\r\n );\r\n }\r\n const tooLongKey = keys.find(k => k.length > 200);\r\n if (tooLongKey) {\r\n alert(\r\n \"AB test error! A too long AB test key is included! Test Name:\" +\r\n testName +\r\n \" Key:\" +\r\n tooLongKey +\r\n \" It's because of the DB table's column setting!\"\r\n );\r\n }\r\n await sleepAsync(500);\r\n return getRandomItem(keys) ?? keys[0];\r\n }\r\n\r\n const { key } = await sendPost<\r\n { testName: string; keys: T },\r\n { key: T[number] }\r\n >(\r\n {\r\n testName,\r\n keys,\r\n },\r\n `/api/SystemBase/GetAbTestKey`\r\n );\r\n return key;\r\n } catch {\r\n return getRandomItem(keys) ?? keys[0];\r\n }\r\n}\r\n\r\nfunction fetchSuccess(testName: string, key: string) {\r\n if (noFetch) {\r\n console.log(\"AbTestSuccess\", {\r\n testName,\r\n key,\r\n });\r\n return;\r\n }\r\n sendPost(\r\n {\r\n testName,\r\n key,\r\n },\r\n `/api/SystemBase/AbTestSuccess`\r\n );\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","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 Button from \"@material-ui/core/Button\";\r\nimport Card from \"@material-ui/core/Card\";\r\nimport { makeStyles, Theme } from \"@material-ui/core/styles\";\r\nimport { BaseCSSProperties } from \"@material-ui/core/styles/withStyles\";\r\nimport CloseIcon from \"@material-ui/icons/Close\";\r\nimport { ReactNode, useEffect, useState } from \"react\";\r\nimport { AppState } from \"../../../common/appState\";\r\nimport { useOpenAnimationFinished } from \"../../../common/hooks/panelAndDialog/useOpenAnimationFinished\";\r\nimport { usePanelAndDialogOpenOrder } from \"../../../common/hooks/panelAndDialog/usePanelAndDialogOpenOrder\";\r\nimport { spaceBetween } from \"../../../common/util/Array/spaceBetween\";\r\nimport { zIndex } from \"../../zApps/Layout/zIndex\";\r\nimport ShurikenProgress from \"../Animations/ShurikenProgress\";\r\n\r\nexport function CenterDialog({\r\n open,\r\n transitionMilliseconds = 0,\r\n style,\r\n className,\r\n darkLayerStyle,\r\n children,\r\n onClose,\r\n withoutCloseButton,\r\n globalDialogState,\r\n isChildrenUnmounted,\r\n}: {\r\n open: boolean;\r\n transitionMilliseconds?: number;\r\n style?: BaseCSSProperties;\r\n className?: string;\r\n darkLayerStyle?: BaseCSSProperties;\r\n children: ReactNode;\r\n onClose?: () => void;\r\n withoutCloseButton?: boolean;\r\n globalDialogState?: AppState[keyof AppState]; // When the dialog's global state changed, zIndex increases (especially when targetId changes)\r\n isChildrenUnmounted?: boolean;\r\n}) {\r\n const { openedOrder } = usePanelAndDialogOpenOrder(\r\n globalDialogState,\r\n open,\r\n transitionMilliseconds\r\n );\r\n\r\n const c = useResultDialogStyles({\r\n transitionDuration: `${transitionMilliseconds}ms`,\r\n style,\r\n darkLayerStyle,\r\n openedOrder,\r\n });\r\n\r\n const [isContentShown, setIsContentShown] = useState(false);\r\n\r\n useEffect(() => {\r\n if (open && !isContentShown) {\r\n // when it opens\r\n setTimeout(() => {\r\n setIsContentShown(open);\r\n }, 10);\r\n return;\r\n }\r\n\r\n if (!open && isContentShown) {\r\n // when it closes\r\n setTimeout(() => {\r\n setIsContentShown(false);\r\n }, transitionMilliseconds);\r\n }\r\n }, [open, transitionMilliseconds]);\r\n\r\n const isCompletelyOpened = open && isContentShown;\r\n const { isOpenAnimationFinished } = useOpenAnimationFinished(\r\n isCompletelyOpened,\r\n transitionMilliseconds\r\n );\r\n\r\n if (!open && !isContentShown) {\r\n return null;\r\n }\r\n\r\n return (\r\n \r\n {\r\n ev.stopPropagation();\r\n }}\r\n >\r\n {!withoutCloseButton && (\r\n \r\n \r\n \r\n )}\r\n {isChildrenUnmounted && open ? (\r\n \r\n ) : (\r\n children\r\n )}\r\n \r\n \r\n );\r\n}\r\n\r\nconst useResultDialogStyles = makeStyles<\r\n Theme,\r\n {\r\n transitionDuration: string;\r\n style?: BaseCSSProperties;\r\n darkLayerStyle?: BaseCSSProperties;\r\n openedOrder: number; // 0 to 30, The last opened panel or dialog is 0.\r\n }\r\n>(({ palette }) => ({\r\n darkLayer: ({ transitionDuration, darkLayerStyle, openedOrder }) => ({\r\n position: \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: \"100%\",\r\n height: \"100%\",\r\n backgroundColor: \"rgba(0,0,0,0.7)\",\r\n display: \"flex\",\r\n justifyContent: \"center\",\r\n alignItems: \"center\",\r\n transitionProperty: \"opacity\",\r\n transitionDuration,\r\n zIndex: zIndex.panelAndDialog.darkLayer(openedOrder),\r\n ...darkLayerStyle,\r\n }),\r\n opacity0: { opacity: 0 },\r\n opacity1: { opacity: 1 },\r\n card: ({ style, openedOrder }) => ({\r\n width: \"100%\",\r\n maxWidth: 350,\r\n height: \"100%\",\r\n maxHeight: 350,\r\n backgroundColor: \"white\",\r\n borderRadius: 16,\r\n zIndex: zIndex.panelAndDialog.panelOrDialog(openedOrder),\r\n ...style,\r\n }),\r\n closeButton: {\r\n borderRadius: \"50%\",\r\n maxWidth: 28,\r\n maxHeight: 28,\r\n minWidth: 28,\r\n minHeight: 28,\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n backgroundColor: palette.success.main,\r\n \"&:hover\": {\r\n backgroundColor: palette.success.light,\r\n },\r\n color: \"white\",\r\n lineHeight: 1,\r\n marginLeft: \"auto\",\r\n marginTop: 3,\r\n marginRight: 3,\r\n padding: 0,\r\n },\r\n closeIcon: { width: 20, height: 20 },\r\n}));\r\n","import Card from \"@material-ui/core/Card\";\r\nimport { makeStyles } from \"@material-ui/core/styles\";\r\nimport { ReactNode, useEffect, useState } from \"react\";\r\nimport {\r\n changeAppState,\r\n getAppState,\r\n useAppState,\r\n} from \"../../../../common/appState\";\r\nimport { useAbTest } from \"../../../../common/hooks/useAbTest\";\r\nimport { useScreenSize } from \"../../../../common/hooks/useScreenSize\";\r\nimport { spaceBetween } from \"../../../../common/util/Array/spaceBetween\";\r\nimport ShurikenProgress from \"../../Animations/ShurikenProgress\";\r\nimport CharacterComment from \"../../CharacterComment\";\r\nimport { CenterDialog } from \"../CenterDialog\";\r\nimport { AddXpParams, GuestUserXpDialogState } from \"./types\";\r\n\r\nconst setGuestResultDialogState = (state: GuestUserXpDialogState) => {\r\n changeAppState(\"guestUserXpDialogState\", state);\r\n};\r\n\r\nexport async function addGuestXp(params: AddXpParams) {\r\n setGuestResultDialogState(params);\r\n\r\n const { xpBeforeSignUp } = getAppState();\r\n\r\n const previousXp = xpBeforeSignUp;\r\n const nextXp = Math.min(params.xpToAdd + xpBeforeSignUp, 5000);\r\n\r\n changeAppState(\"xpBeforeSignUp\", nextXp);\r\n\r\n const [previousLevel, expectedLevel] = await Promise.all([\r\n fetchLevelFromXp(previousXp),\r\n fetchLevelFromXp(nextXp),\r\n ]);\r\n\r\n setGuestResultDialogState({\r\n ...params,\r\n previousLevel,\r\n expectedLevel,\r\n });\r\n}\r\n\r\nconst closedState = {\r\n onCloseCallBack: undefined,\r\n xpToAdd: 0,\r\n topSmallMessage: \"\",\r\n abTestName: \"\",\r\n previousLevel: undefined,\r\n expectedLevel: undefined,\r\n};\r\n\r\nexport default function ResultXpDialogWrapper() {\r\n const [globalDialogState] = useAppState(\"guestUserXpDialogState\");\r\n\r\n const open = globalDialogState !== \"close\";\r\n\r\n const [lazyState, setLazyState] =\r\n useState>(closedState);\r\n\r\n useEffect(() => {\r\n if (open) {\r\n setLazyState(globalDialogState);\r\n return;\r\n }\r\n const timeoutId = setTimeout(() => {\r\n // Wait until the animation finishes\r\n setLazyState(closedState);\r\n }, 500);\r\n return () => {\r\n clearTimeout(timeoutId);\r\n };\r\n }, [globalDialogState]);\r\n\r\n const {\r\n onCloseCallBack,\r\n xpToAdd,\r\n topSmallMessage,\r\n abTestName,\r\n previousLevel,\r\n expectedLevel,\r\n } = lazyState;\r\n\r\n return (\r\n {\r\n setGuestResultDialogState(\"close\");\r\n onCloseCallBack?.();\r\n }}\r\n xpToAdd={xpToAdd}\r\n topSmallMessage={topSmallMessage}\r\n abTestName={abTestName}\r\n previousLevel={previousLevel}\r\n expectedLevel={expectedLevel}\r\n globalDialogState={globalDialogState}\r\n />\r\n );\r\n}\r\n\r\nconst btnLabelAbTestKeys = [\r\n \"Create a free account\",\r\n \"Free lifetime account\",\r\n \"Save your progress\",\r\n \"Sign up\",\r\n \"Sign in\",\r\n \"Lingual Ninja Account\",\r\n \"Manage your progress\",\r\n \"Check your Japanese level\",\r\n \"Sign up free\",\r\n \"Sign up for a free account\",\r\n];\r\nconst charCommentAbTestKeys = [\r\n \"Receive the XP by making a free lifetime account!\",\r\n \"Receive the XP by making a Lingual Ninja Account!\",\r\n];\r\nconst keysSeparator = \"__\";\r\nconst abTestKeys = btnLabelAbTestKeys.flatMap(btnKey =>\r\n charCommentAbTestKeys.map(\r\n commentKey => `${btnKey}${keysSeparator}${commentKey}`\r\n )\r\n);\r\n\r\nfunction ResultXpDialog_GuestUser({\r\n open,\r\n onClose,\r\n xpToAdd,\r\n topSmallMessage,\r\n abTestName,\r\n previousLevel,\r\n expectedLevel,\r\n globalDialogState,\r\n}: {\r\n open: boolean;\r\n onClose: () => void;\r\n xpToAdd: number;\r\n topSmallMessage: ReactNode;\r\n abTestName: string;\r\n previousLevel?: number;\r\n expectedLevel?: number;\r\n globalDialogState: GuestUserXpDialogState;\r\n}) {\r\n const c = useGuestResultDialogStyles();\r\n const { screenWidth } = useScreenSize();\r\n\r\n const { abTestKey, abTestSuccess } = useAbTest({\r\n testName: `${abTestName}-ButtonLabel-and-CharacterComment`,\r\n keys: abTestKeys,\r\n open,\r\n });\r\n\r\n const [buttonLabel, characterComment] = abTestKey\r\n ? abTestKey.split(keysSeparator)\r\n : [undefined, undefined];\r\n\r\n const isLevelUp =\r\n previousLevel != null &&\r\n expectedLevel != null &&\r\n previousLevel < expectedLevel;\r\n\r\n return (\r\n \r\n
\r\n {isLevelUp && (\r\n \r\n LEVEL UP!\r\n \r\n )}\r\n
\r\n {topSmallMessage}\r\n

\r\n You got {xpToAdd} XP!\r\n

\r\n
\r\n\r\n \r\n {characterComment || (\r\n \r\n )}\r\n
\r\n }\r\n style={{ margin: 0 }}\r\n />\r\n\r\n
\r\n {\r\n ev.stopPropagation();\r\n onClose();\r\n changeAppState(\"signInPanelState\", {\r\n type: \"signUp\",\r\n });\r\n abTestSuccess();\r\n }}\r\n >\r\n {buttonLabel || (\r\n \r\n )}\r\n \r\n
\r\n\r\n \r\n \r\n \r\n );\r\n}\r\nconst useGuestResultDialogStyles = makeStyles(theme => ({\r\n container: {\r\n margin: \"0 10px\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n height: 308,\r\n position: \"relative\",\r\n },\r\n xp: { color: theme.palette.secondary.main },\r\n levelUp: {\r\n position: \"absolute\",\r\n top: -20,\r\n left: -5,\r\n backgroundColor: theme.palette.secondary.main,\r\n color: \"white\",\r\n padding: 5,\r\n transform: \"rotate(-15deg)\",\r\n },\r\n}));\r\n\r\nfunction ExpectedLevelCard({ expectedLevel }: { expectedLevel?: number }) {\r\n const c = useExpectedLevelCardStyles();\r\n const [xpBeforeSignUp] = useAppState(\"xpBeforeSignUp\");\r\n\r\n return (\r\n \r\n Now you have {xpBeforeSignUp} XP, and you'll be Lv.{expectedLevel}\r\n
\r\n if you make an account.\r\n \r\n );\r\n}\r\nconst useExpectedLevelCardStyles = makeStyles(theme => ({\r\n card: {\r\n backgroundColor: theme.palette.grey[200],\r\n borderRadius: 10,\r\n padding: \"5px 10px\",\r\n transition: \"500ms\",\r\n textAlign: \"center\",\r\n width: \"100%\",\r\n },\r\n}));\r\n\r\nasync function fetchLevelFromXp(xp: number): Promise {\r\n const res = await fetch(`api/User/GetLevelFromXp?xp=${xp}`);\r\n return res.json();\r\n}\r\n"],"names":["useAbTest","_ref","testName","keys","initialKey","_ref$open","open","_useState","useState","_useState2","_slicedToArray","key","setKey","_useState3","_useState4","isAlreadySuccess","setAlreadySuccess","useEffect","_x","_x2","_fetchKey","apply","arguments","fetchKey","then","concat","_toConsumableArray","abTestSuccess","noFetch","console","log","sendPost","fetchSuccess","abTestKey","location","href","includes","localStorage","getItem","_asyncToGenerator","_regeneratorRuntime","mark","_callee","_getRandomItem","tooLongKey","_yield$sendPost","_getRandomItem2","wrap","_context","prev","next","length","alert","find","k","sleepAsync","abrupt","getRandomItem","sent","t0","stop","arr","Math","floor","random","CharacterComment","props","imgNumber","screenWidth","comment","style","commentStyle","imgStyle","containerRef","className","c","useStyles","_jsxs","ref","spaceBetween","container","children","_jsx","src","consts","alt","ninjaPic","makeStyles","_objectSpread","_ref2","width","_ref3","CenterDialog","_ref$transitionMillis","transitionMilliseconds","darkLayerStyle","onClose","withoutCloseButton","globalDialogState","isChildrenUnmounted","openedOrder","usePanelAndDialogOpenOrder","useResultDialogStyles","transitionDuration","isContentShown","setIsContentShown","setTimeout","isCompletelyOpened","isOpenAnimationFinished","useOpenAnimationFinished","darkLayer","opacity1","opacity0","onClick","undefined","Card","card","ev","stopPropagation","Button","variant","closeButton","CloseIcon","closeIcon","ShurikenProgress","size","height","palette","position","top","left","backgroundColor","display","justifyContent","alignItems","transitionProperty","zIndex","opacity","_ref4","maxWidth","maxHeight","borderRadius","minWidth","minHeight","success","main","light","color","lineHeight","marginLeft","marginTop","marginRight","padding","setGuestResultDialogState","state","changeAppState","addGuestXp","_addGuestXp","params","_getAppState","xpBeforeSignUp","previousXp","nextXp","_yield$Promise$all","_yield$Promise$all2","previousLevel","expectedLevel","getAppState","min","xpToAdd","Promise","all","fetchLevelFromXp","closedState","onCloseCallBack","topSmallMessage","abTestName","ResultXpDialogWrapper","_useAppState","useAppState","lazyState","setLazyState","timeoutId","clearTimeout","ResultXpDialog_GuestUser","charCommentAbTestKeys","keysSeparator","abTestKeys","flatMap","btnKey","map","commentKey","useGuestResultDialogStyles","useScreenSize","_useAbTest","split","buttonLabel","characterComment","isLevelUp","levelUp","xp","margin","type","ExpectedLevelCard","theme","flexDirection","secondary","transform","useExpectedLevelCardStyles","_useAppState3","grey","transition","textAlign","_fetchLevelFromXp","_callee2","res","_context2","fetch","json"],"sourceRoot":""}