{"version":3,"sources":["api/mahjong-api.ts","components/common/Page.styled.tsx","components/game/Meld.styled.tsx","components/game/constants.ts","components/game/default.svg","components/game/Tile.tsx","features/scoring/create/constants.ts","components/game/Meld.tsx","features/scoring/list/Hand.styled.tsx","features/scoring/list/Hand.tsx","components/login/icon_mobile_google_login.png","components/common/Buttons.styled.tsx","features/scoring/list/List.styled.tsx","features/scoring/list/List.tsx","features/scoring/rules/List.styled.tsx","components/common/List.styled.tsx","features/scoring/rules/Tiles.tsx","features/scoring/rules/Melds.tsx","features/scoring/rules/List.tsx","components/game/MeldButton.styled.tsx","components/game/MeldButton.tsx","features/scoring/create/sections/Tray.styled.tsx","features/scoring/create/sections/Tray.tsx","features/scoring/create/sections/Melded.tsx","components/game/TileButton.tsx","features/scoring/create/sections/Concealed.tsx","features/scoring/create/sections/OutOn.tsx","features/scoring/create/sections/Flowers.tsx","features/scoring/create/sections/SeatWind.tsx","features/scoring/create/sections/RoundWind.tsx","features/scoring/create/Hand.styled.tsx","features/scoring/create/Hand.tsx","features/scoring/create/input/TileBoard.styled.tsx","features/scoring/create/input/MeldTypeButtons.tsx","features/scoring/create/input/InputRow.tsx","features/scoring/create/input/TileBoard.tsx","features/scoring/melding.ts","components/game/PointsBreakdown.styled.tsx","components/game/PointsBreakdown.tsx","features/profile/DiscardStyle.tsx","features/scoring/create/Calculator.styled.tsx","features/scoring/create/Calculator.tsx","components/common/Sliding.styled.tsx","features/scoring/Scoring.tsx","features/scoring/service.ts","components/common/Loader.tsx","features/scoring/index.tsx","components/common/icon/t9batty.png","components/common/icon/t9dog1.png","components/common/icon/t9ducky.png","components/common/icon/t9elephant.png","components/common/icon/t9foxy.png","components/common/icon/t9froggy.png","components/common/icon/t9kitty.png","components/common/icon/Icon.tsx","components/common/icon/t9lion.png","components/common/icon/t9panda.png","components/common/icon/t9penguin.png","components/common/Image.styled.tsx","features/game/Avatar.styled.tsx","features/game/Avatar.tsx","features/match/Players.styled.tsx","features/match/Players.tsx","features/match/Lobby.styled.tsx","features/match/Details.styled.tsx","features/match/Details.tsx","features/match/List.tsx","components/common/Form.styled.tsx","features/match/Create.styled.tsx","features/match/Create.tsx","features/match/View.styled.tsx","features/match/View.tsx","components/common/buttons/MotdButton.styled.tsx","components/common/buttons/MotdButton.tsx","features/match/Lobby.tsx","features/auth/selector.ts","features/match/service.ts","features/match/index.tsx","components/common/NoMatch.tsx","app/hooks.ts","features/profile/service.ts","features/auth/reducer.ts","theme.ts","components/common/ConnectedThemeProvider.tsx","i18n/ConnectedIntlProvider.tsx","features/home/service.ts","features/community/service.ts","features/motd/service.ts","features/game/reducer.ts","features/match/match-utility.ts","app/store.ts","components/common/r3f/Canvas.tsx","components/three/c1.svg","components/three/c2.svg","components/three/c3.svg","components/three/c4.svg","components/three/c5.svg","components/three/c6.svg","components/three/c7.svg","components/three/c8.svg","components/three/c9.svg","components/three/d1.svg","components/three/d2.svg","components/three/d3.svg","components/three/d4.svg","components/three/d5.svg","components/three/d6.svg","components/three/d7.svg","components/three/d8.svg","components/three/d9.svg","components/three/b1.svg","components/three/b2.svg","components/three/b3.svg","components/three/b4.svg","components/three/b5.svg","components/three/b6.svg","components/three/b7.svg","components/three/b8.svg","components/three/b9.svg","components/three/f1.svg","components/three/f2.svg","components/three/f3.svg","components/three/f4.svg","components/three/s1.svg","components/three/s2.svg","components/three/s3.svg","components/three/s4.svg","components/three/lookup.ts","components/three/e.svg","components/three/s.svg","components/three/w.svg","components/three/n.svg","components/three/rd.svg","components/three/gd.svg","components/three/wd.svg","components/three/BaseTile.tsx","components/three/GestureTile.tsx","features/home/Tile.tsx","features/home/TableTop.tsx","components/common/r3f/Html.tsx","features/home/Home.styled.tsx","features/home/Title.tsx","features/home/Display.tsx","components/nav/Language.tsx","features/home/Statistics.tsx","features/home/Home.tsx","image/ios.png","image/android.png","image/safari.png","image/chrome.png","image/firefox.png","features/home/index.tsx","features/game/seating/hand/Discards.tsx","features/game/seating/OpponentStatus.styled.tsx","features/game/Action.styled.tsx","features/game/Action.tsx","features/game/seating/Capture.styled.tsx","sound/chow.mp3","sound/pung.mp3","sound/kong.mp3","features/game/seating/Capture.tsx","features/game/seating/OpponentStatus.tsx","features/game/seating/hand/Ruler.tsx","features/game/seating/hand/Flowers.tsx","features/game/seating/hand/Wall.tsx","features/game/frame.ts","features/game/seating/hand/Meld.tsx","features/game/seating/hand/Melded.tsx","components/three/TapTile.tsx","features/game/seating/hand/Concealed.tsx","features/game/seating/hand/Discard.tsx","features/game/seating/hand/Drawn.tsx","features/game/seating/OpponentSeat.tsx","features/game/seating/PlayerStatus.styled.tsx","features/game/seating/PlayerStatus.tsx","features/game/seating/Timer.tsx","features/game/seating/PlayerSeat.tsx","features/game/options/Options.styled.tsx","features/game/options/CaptureOptions.tsx","features/game/options/TurnOptions.tsx","features/game/options/Options.tsx","features/game/seating/Seats.tsx","features/game/Game.styled.tsx","features/game/TableTop.tsx","features/game/MatchInfo.styled.tsx","features/game/MatchInfo.tsx","features/game/Loader.tsx","features/game/scene/BackWall.tsx","features/game/scene/Ground.tsx","features/game/Game.tsx","features/game/selector.ts","features/game/service.ts","features/game/display/GameOver.styled.tsx","features/game/display/SelfPickWin.tsx","features/game/display/CaptureWin.tsx","features/game/display/Draw.tsx","features/game/display/Display.styled.tsx","features/game/display/GameOver.tsx","features/game/display/MatchOver.styled.tsx","features/game/display/MatchOver.tsx","features/game/display/MatchHistory.tsx","features/game/display/Display.tsx","features/game/index.tsx","features/about/About.tsx","features/calculator/index.tsx","background.png","App.styled.tsx","features/profile/Profile.styled.tsx","components/common/Info.styled.tsx","features/profile/TurnTime.tsx","features/profile/Profile.tsx","features/profile/index.tsx","features/community/List.tsx","features/community/View.tsx","features/community/GameResults.tsx","features/community/Community.tsx","features/community/index.tsx","features/motd/GameDayResults.tsx","features/motd/MatchOfTheDay.tsx","features/motd/index.tsx","components/nav/TopNav.styled.tsx","components/nav/TopNav.tsx","components/nav/index.tsx","App.tsx","serviceWorker.ts","global.ts","index.tsx"],"names":["CaptureKind","Face","Kind","MatchStatus","MeldKind","Pattern","ResultKind","Wind","ContentType","Module","styled","div","theme","heading","Page","Backdrop","Footer","Header","title","primary","Panel","FixedPanel","MainPanel","Card","PanelContent","Col","Row","Item","props","selected","light","WideItem","Description","text","PageDescription","Container","tileCodePositions","x","y","getPos","code","getImageX","ratio","getImageY","getImageWidth","getImageHeight","getBackgroundWidth","getBackgroundHeight","windCodes","Map","East","South","West","North","nextWind","Tile","bgImage","offset","defaultProps","onClick","Section","Meld","codes","map","t","i","OutOn","Drawn","Hand","melded","flowers","concealed","outOn","drawn","id","tiles","sort","a","b","Button","button","active","ActionButton","SocialButton","GoogleImg","Table","table","Tr","tr","Th","th","Td","td","THead","thead","TBody","tbody","List","examples","requests","deleteSample","editSample","data","React","useMemo","columns","Cell","r","row","original","get","seatWind","hand","result","totalPoints","size","useTable","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","headerGroup","getHeaderGroupProps","headers","column","getHeaderProps","render","getRowProps","cells","cell","getCellProps","TdNoWrap","RulesPanel","RuleRow","RuleBox","RuleName","RuleTitle","RulePoints","RuleDescription","Examples","ExampleItem","Tiles","winds","characters","bamboos","dots","dragons","Melds","RuleDisplay","pattern","ec","rules","meldRules","generalRules","specialRules","to","p","MeldButton","className","single","Name","Tray","children","name","isActive","Melded","onTrayClick","melds","m","TileButton","disabled","Concealed","tile","Flowers","d","includes","SeatWind","wind","RoundWind","roundWind","activeSection","undefined","onMeldClick","onTileClick","setRoundWind","setSeatWind","setFlowers","find","f","remaining","filter","add","added","concat","Board","SideBoard","Pad","ButtonGroup","MeldTypeButtons","meldKind","activeButtonClick","Chow","Pung","Kong","InputRow","TileBoard","onCalculate","useState","kind","setKind","getNextNumber","getNextTile","all","Bamboo","number","Dot","Character","compare","points","DiscardStyle","PointsBreakdown","matchedRules","InputPanel","Calculator","callToAction","isEdit","setIsEdit","setConcealed","setMelded","setOutOn","section","setSection","useEffect","s","index","meld","pong","createPung","kong","createKong","chow","second","third","createChow","Pane","SlidingPane","Scoring","navigate","create","update","content","path","element","isOpen","onRequestClose","apiUrl","window","_env_","API_URL","tag","calculationApi","createApi","reducerPath","tagTypes","baseQuery","fetchBaseQuery","baseUrl","endpoints","builder","getAllTiles","query","getAllRules","getAllCalculations","providesTags","calculations","type","getCalculationById","error","createCalculation","mutation","body","url","method","clientId","invalidatesTags","updateCalculation","deleteCalculation","calculate","useGetAllCalculationsQuery","useGetCalculationByIdQuery","useGetAllRulesQuery","useGetAllTilesQuery","useCreateCalculationMutation","useUpdateCalculationMutation","useDeleteCalculationMutation","useCalculateMutation","Loader","useNavigate","match","useMatch","editId","params","calculationId","isFindLoading","isLoading","findResponse","deleteStatus","updateSample","updateStatus","createSample","createStatus","isTileLoading","isRulesLoading","rulesResponse","skip","isGetLoading","getResponse","handleCreate","payload","unwrap","response","handleUpdate","idMap","bat","dog","duck","elephant","fox","frog","kitty","Image","img","IconBack","Overlay","Avatar","image","draggable","src","alt","referrerPolicy","Players","players","openSlots","length","player","imageUrl","Array","fill","os","ActionSection","SectionName","SectionBody","Main","MatchList","ActionList","Info","DetailsText","Wrapper","MatchDetails","rounds","settings","totalRounds","status","matches","viewMatch","deleteMatch","Details","clients","Input","input","Player","label","select","Spot","Select","ViewLabel","Create","turnTime","openSpots","minPoints","replayDealerWins","createMatch","useForm","defaultValues","register","handleSubmit","defaultValue","value","PlayerName","Match","playerMap","joinMatch","startMatch","playMatch","canJoin","canStart","canPlay","createdAt","v","c","Small","Motd","MotdButton","Lobby","isView","matchPlayers","req","playVsBots","values","selectClientId","state","client","selectConnectionId","connectionId","selectLocale","locale","selectColor","color","selectProfileImage","imagePath","selectProfileEmail","email","selectPlayerId","playerId","selectTurnTime","selectDiscardStyle","discardStyle","matchesTag","curMatchTag","matchApi","prepareHeaders","getState","set","findMatches","getMatch","q","getMatchGameResults","continueMatch","useFindMatchesQuery","useGetMatchQuery","useCreateMatchMutation","useStartMatchMutation","useJoinMatchMutation","useDeleteMatchMutation","useContinueMatchMutation","usePlayMatchMutation","useGetMatchGameResultsQuery","useSelector","pathname","useLocation","isCreate","playStatus","refetchOnFocus","refetchOnMountOrArgChange","refetchOnReconnect","routeMatch","matchId","isSuccess","reduce","Waiting","createdBy","handleCreateMatch","handleJoinMatch","handleStartMatch","Started","NoMatch","useAppDispatch","useDispatch","DiscardStyleSelector","style","updateDiscardStyle","Gesture","Tap","profileApi","profile","credentials","statistics","signOut","useProfileQuery","useStatisticsQuery","useSignOutMutation","resetProfile","util","resetApiState","initialState","uuidv4","clientSlice","createSlice","reducers","updateConnectionId","action","updateLocale","resetClientId","updateColor","updateTurnTime","logout","userId","firstName","lastName","extraReducers","addMatcher","matchFulfilled","actions","dark","ConnectedThemeProvider","customTheme","messages","en","cn","defaultLocale","homeApi","statistic","useStatisticQuery","communityApi","findPlayers","findGameResults","results","gameId","getPlayer","useFindPlayersQuery","useGetPlayerQuery","useFindGameResultsQuery","templateApi","getMatchTemplate","year","month","day","playTemplate","draw","useDrawMutation","useGetMatchTemplateQuery","usePlayTemplateMutation","currentFrame","previousFrames","bufferFrames","gameSlice","updateGameFrame","push","nextFrame","shift","nextFrameClear","latestFrame","lastRound","history","slice","lastGame","games","getLatestFrame","connection","HubConnectionBuilder","configureLogging","LogLevel","Debug","withUrl","transport","HttpTransportType","WebSockets","withAutomaticReconnect","build","callbacks","withCallbacks","user","msg","dispatch","frame","JSON","parse","refetch","initiate","signal","signalMiddleware","shouldConnectionStartImmediately","start","then","console","log","catch","err","toString","persistConfig","key","version","storage","blacklist","gamePersistConfig","rootReducer","combineReducers","reducer","persistReducer","gameReducer","clientReducer","persistedReducer","store","configureStore","middleware","getDefaultMiddleware","serializableCheck","ignoredActions","FLUSH","REHYDRATE","PAUSE","PERSIST","PURGE","REGISTER","setupListeners","Canvas","dpr","c1","c2","c3","c4","c5","c6","c7","c8","c9","b1","b2","b3","b4","b5","b6","b7","b8","b9","d1","d2","d3","d4","d5","d6","d7","d8","d9","f1","f2","f3","f4","seasons","s1","s2","s3","s4","tilePaths","BaseTile","scale","hovered","hover","texture","useLoader","THREE","front","back","minFilter","useTheme","RoundedBox","radius","smoothness","position","args","onPointerOver","event","onPointerOut","attachArray","flatShading","clearcoat","metalness","reflectivity","clearcoatRoughness","attach","side","toneMapped","transparent","GestureTile","allowDrag","shouldReset","startDrag","endDrag","rotateX","rotateY","positionZ","factor","useThree","viewport","useSpring","z","api","bind","useGesture","onDrag","down","first","last","movement","mx","my","allowMove","immediate","drag","bounds","left","right","bottom","mouseOnly","group","springRef","useSpringRef","transitionRef","from","ref","Math","PI","useChain","TableTop","receiveShadow","rotation","Color","Html","rest","Frame","TitleText","Scene","SupportedImage","Title","camera","lookAt","Vector3","posY","center","count","half","floor","Display","devicePixelRatio","fallback","OrbitControls","PerspectiveCamera","makeDefault","fov","Language","Statistics","googleAuthUrl","GOOGLE_AUTH_URL","Home","l","Discards","discards","chunks","chunk","ch","j","Label","Column","Badge","ActionFrame","ActionText","ActionTile","Action","actionType","actionValue","lastDiscard","posZ","transform","CaptureText","Capture","captureRequest","useSound","chowFx","pungFx","pung","kongFx","meldIds","OpponentStatus","captureRotation","pos","end","duration","Ruler","useRef","zPos","Wall","frontCount","backCount","e","DiscardRequestType","isDrawReq","requestType","requestClientId","isStartReq","isDiscardReq","activeClientId","getMatchResult","matchResults","mr","cId","getLastDiscard","getActionValue","requestValue","getParts","seat","MeldSet","meldWith","sorted","splice","TapTile","tapped","startTap","setSelected","handleTap","onRest","dragId","setDragId","onConcealedClick","posZRef","rotXRef","Discard","isDiscardRequest","discardZ","discardR","OpponentSeat","allDiscards","isDrawRequest","wallCount","discardPlayerId","concealedCount","meldedCount","totalCount","ceil","shownDiscards","claimedBy","TimerFrame","Urgent","PlayerStatus","Timer","message","PlayerSeat","sequence","showTimer","Start","CaptureOptions","options","capture","opt","TurnOptions","win","o","Win","turnClick","Options","isStart","turnOptions","captureOptions","selfKong","selfPick","config","slow","enabled","setEnabled","Seats","discard","seats","others","Object","keys","rightWind","oppositeWind","opposite","leftWind","getSeats","allRemaining","walls","remainder","getTurnOptions","isDiscard","allOptions","getCaptureOptions","isPlayerActive","isActivePlayer","isCaptureReq","isComplete","accumulator","obj","tileId","ViewPort","visible","LoadingText","brown","dd","h","ChangeView","MatchInfo","round","remainingCount","showHistory","goToLobby","rotX","topDown","setTopDown","handleViewClick","useFrame","lerp","BackWall","chair","Ground","Game","enableControls","intensity","selectGameFrame","game","gameApi","discardTile","captureTile","useDiscardTileMutation","useCaptureTileMutation","useSelfKongMutation","useSelfPickMutation","WinnerRow","CardRow","ScoreCard","BaseButton","Score","Total","SelfPickWin","currentScore","winnerScore","winningSeat","losingSeats","winningPoints","getScore","CaptureWin","winningSeats","losingSeat","loserScore","totalLost","Draw","Results","TdPlayer","animated","GameOver","isSelfPick","SelfPick","isDraw","MatchOver","goToMotd","k","MatchHistory","hideHistory","summary","numGameCols","cols","_","currentValue","shouldShowHistory","goToNewMatch","opacity","matchComplete","timerRef","refresh","useCallback","setTimeout","current","clearTimeout","matchResponse","shouldShowFrame","setShowHistory","pr","About","ccr","PageContainer","background","ComponentWrapper","Menu","Data","Email","ColorPicker","TurnTime","colors","Profile","gameWinPct","gamesPlayed","gamesWon","gameWinPctRnd","Number","EPSILON","matchWinPct","matchesPlayed","matchesWon","matchWinPctRnd","onChangeComplete","hex","profileLoading","isError","statsLoading","handlePlay","viewPlayer","View","GameResults","gameResults","Community","isFindGameResultsLoading","GameDayResults","Date","lastFrame","Fragment","colSpan","MatchOfTheDay","date","prevResults","play","routeYear","routeMonth","routeDay","parseInt","motdRequest","getFullYear","getMonth","getDate","isFetching","template","matchTemplateId","previousResults","NavBar","TopBar","TitlePlayer","NavItem","TopNav","ReactGA","initialize","App","pageview","location","search","Boolean","hostname","GlobalStyles","createGlobalStyle","persistor","persistStore","ReactDOM","StrictMode","loading","document","getElementById","navigator","serviceWorker","ready","registration","unregister"],"mappings":"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","file":"static/js/main.be65a728.chunk.js","sourcesContent":["/* eslint-disable */\n/* tslint:disable */\n/*\n * ---------------------------------------------------------------\n * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ##\n * ## ##\n * ## AUTHOR: acacode ##\n * ## SOURCE: https://github.com/acacode/swagger-typescript-api ##\n * ---------------------------------------------------------------\n */\n\nexport interface Calculation {\n /** @format int32 */\n id: number;\n\n /** @format date-time */\n createdAt: string;\n\n /** @format date-time */\n updatedAt?: string | null;\n\n /** @format date-time */\n deletedAt?: string | null;\n createdBy?: string | null;\n updatedBy?: string | null;\n deletedBy?: string | null;\n hand: Hand;\n outOn: Tile;\n seatWind: Wind;\n roundWind: Wind;\n\n /** @format int32 */\n turn?: number | null;\n result?: HandResult;\n}\n\nexport enum CaptureKind {\n Win = \"Win\",\n Kong = \"Kong\",\n Pung = \"Pung\",\n Chow = \"Chow\",\n Pass = \"Pass\",\n Draw = \"Draw\",\n ActiveDraw = \"ActiveDraw\",\n}\n\nexport interface CaptureRequest {\n /** @format int32 */\n matchId: number;\n\n /** @format int32 */\n tileId: number;\n kind: CaptureKind;\n meldIds: number[];\n codes: string[];\n}\n\nexport interface ContinueMatchRequest {\n /** @format int32 */\n matchId: number;\n}\n\nexport interface CreateCalculationRequest {\n outOn: Tile;\n flowers: Tile[];\n concealed: Tile[];\n melded: Meld[];\n seatWind: Wind;\n roundWind: Wind;\n}\n\nexport interface CreateCalculationResponse {\n /** @format int32 */\n id: number;\n}\n\nexport interface CreateMatchRequest {\n name: string;\n\n /** @format int32 */\n rounds: number;\n\n /** @format int32 */\n openSpots: number;\n\n /** @format int32 */\n minPoints: number;\n replayDealerWins: boolean;\n\n /** @format int32 */\n turnTime: number;\n\n /** @format int32 */\n matchTemplateId?: number | null;\n\n /** @format int32 */\n playerId?: number | null;\n}\n\nexport interface CreateMatchResponse {\n errors?: Record;\n\n /** @format int32 */\n id?: number;\n}\n\nexport interface Discard {\n tile?: Tile;\n discardPlayerId?: string | null;\n\n /** @format date-time */\n discardTime?: string;\n claimedBy?: string | null;\n\n /** @format int32 */\n frameId?: number | null;\n}\n\nexport interface DiscardRequest {\n /** @format int32 */\n matchId: number;\n\n /** @format int32 */\n tileId?: number;\n}\n\nexport interface DrawTileRequest {\n /** @format int32 */\n matchId: number;\n}\n\nexport enum Face {\n E = \"E\",\n S = \"S\",\n W = \"W\",\n N = \"N\",\n RD = \"RD\",\n GD = \"GD\",\n WD = \"WD\",\n Wild = \"Wild\",\n Hidden = \"Hidden\",\n C1 = \"C1\",\n C2 = \"C2\",\n C3 = \"C3\",\n C4 = \"C4\",\n C5 = \"C5\",\n C6 = \"C6\",\n C7 = \"C7\",\n C8 = \"C8\",\n C9 = \"C9\",\n D1 = \"D1\",\n D2 = \"D2\",\n D3 = \"D3\",\n D4 = \"D4\",\n D5 = \"D5\",\n D6 = \"D6\",\n D7 = \"D7\",\n D8 = \"D8\",\n D9 = \"D9\",\n B1 = \"B1\",\n B2 = \"B2\",\n B3 = \"B3\",\n B4 = \"B4\",\n B5 = \"B5\",\n B6 = \"B6\",\n B7 = \"B7\",\n B8 = \"B8\",\n B9 = \"B9\",\n F1 = \"F1\",\n F2 = \"F2\",\n F3 = \"F3\",\n F4 = \"F4\",\n S1 = \"S1\",\n S2 = \"S2\",\n S3 = \"S3\",\n S4 = \"S4\",\n}\n\nexport interface FindCalculationsResponse {\n calculations?: Calculation[] | null;\n}\n\nexport interface FindGameFramesResponse {\n frames?: GameFrame[] | null;\n}\n\nexport interface FindGameResultsResponse {\n results: GameResult[];\n}\n\nexport interface FindMatchesResponse {\n matches?: Match[] | null;\n}\n\nexport interface FindPlayerSummariesResponse {\n players?: PlayerSummary[] | null;\n}\n\nexport interface Game {\n /** @format int32 */\n id: number;\n\n /** @format date-time */\n createdAt: string;\n\n /** @format date-time */\n updatedAt?: string | null;\n\n /** @format date-time */\n deletedAt?: string | null;\n createdBy?: string | null;\n updatedBy?: string | null;\n deletedBy?: string | null;\n tileSet?: WallTileSet;\n discards?: Discard[] | null;\n seats?: Record;\n activeClientId?: string | null;\n wind?: Wind;\n isComplete?: boolean;\n\n /** @format int32 */\n matchId?: number;\n currentFrame?: GameFrame;\n lastDiscard?: Discard;\n}\n\nexport interface GameDayResult {\n /** @format int32 */\n year: number;\n\n /** @format int32 */\n month: number;\n\n /** @format int32 */\n day: number;\n clientId: string;\n player?: Player;\n\n /** @format int32 */\n points: number;\n lastFrame?: GameFrame;\n}\n\nexport interface GameFrame {\n /** @format int32 */\n matchId?: number;\n\n /** @format int32 */\n gameId?: number;\n requestClientId: string;\n\n /** @format int32 */\n sequence: number;\n requestType: string;\n requestValue: string;\n isComplete: boolean;\n\n /** @format int32 */\n wallCount: number;\n discards: Discard[];\n activeClientId: string;\n seats: Record;\n wind: Wind;\n matchComplete: boolean;\n captureOptions?: Record;\n}\n\nexport interface GameResult {\n /** @format int32 */\n matchId?: number;\n\n /** @format int32 */\n gameId?: number;\n clientId?: string | null;\n player?: Player;\n\n /** @format int32 */\n points?: number;\n}\n\nexport interface GetMatchResponse {\n match?: Match;\n}\n\nexport interface GetMatchTemplateResponse {\n /** @format int32 */\n id?: number;\n template?: MatchTemplate;\n results?: GameResult[] | null;\n previousResults?: GameDayResult[] | null;\n}\n\nexport interface GetPlayerStatisticsResponse {\n /** @format int32 */\n gamesPlayed?: number;\n\n /** @format int32 */\n gamesWon?: number;\n\n /** @format int32 */\n matchesPlayed?: number;\n\n /** @format int32 */\n matchesWon?: number;\n}\n\nexport interface GetPlayerSummaryResponse {\n player?: PlayerSummary;\n}\n\nexport interface GetProfileResponse {\n email: string;\n imagePath: string;\n firstName?: string | null;\n lastName?: string | null;\n locale?: string | null;\n userId?: string | null;\n\n /** @format int32 */\n playerId?: number;\n}\n\nexport interface GetRulesResponse {\n rules?: Rule[] | null;\n meldRules?: Rule[] | null;\n specialRules?: Rule[] | null;\n generalRules?: Rule[] | null;\n}\n\nexport interface GetStatisticsResponse {\n errors?: Record;\n\n /** @format int32 */\n players?: number;\n\n /** @format int32 */\n games?: number;\n}\n\nexport interface GetTilesResponse {\n winds: Tile[];\n characters: Tile[];\n bamboos: Tile[];\n dots: Tile[];\n dragons: Tile[];\n flowers: Tile[];\n}\n\nexport interface Hand {\n flowers: Tile[];\n concealed: Tile[];\n melded: Meld[];\n drawn?: Tile;\n}\n\nexport interface HandResult {\n matchedRules?: PatternMatchResult[] | null;\n kind?: ResultKind;\n\n /** @format int32 */\n totalPoints?: number;\n}\n\nexport interface History {\n rounds?: Round[] | null;\n}\n\nexport interface JoinMatchRequest {\n /** @format int32 */\n matchId: number;\n\n /** @format int32 */\n playerId?: number | null;\n}\n\nexport enum Kind {\n Character = \"Character\",\n Bamboo = \"Bamboo\",\n Dot = \"Dot\",\n Wind = \"Wind\",\n Dragon = \"Dragon\",\n Wild = \"Wild\",\n Flower = \"Flower\",\n Unknown = \"Unknown\",\n}\n\nexport interface Match {\n /** @format int32 */\n id: number;\n\n /** @format date-time */\n createdAt: string;\n\n /** @format date-time */\n updatedAt?: string | null;\n\n /** @format date-time */\n deletedAt?: string | null;\n createdBy?: string | null;\n updatedBy?: string | null;\n deletedBy?: string | null;\n name?: string | null;\n settings?: MatchSettings;\n history?: History;\n\n /** @format int32 */\n matchTemplateId?: number | null;\n clients?: MatchClient[] | null;\n status?: MatchStatus;\n result?: MatchResult;\n}\n\nexport interface MatchClient {\n clientId: string;\n player?: Player;\n}\n\nexport interface MatchResult {\n gameResults?: GameResult[] | null;\n}\n\nexport interface MatchSettings {\n /** @format int32 */\n totalRounds?: number;\n replayDealerWins?: boolean;\n\n /** @format int32 */\n minPoints?: number;\n\n /** @format int32 */\n turnTime?: number;\n}\n\nexport enum MatchStatus {\n Waiting = \"Waiting\",\n Started = \"Started\",\n Completed = \"Completed\",\n}\n\nexport interface MatchTemplate {\n /** @format int32 */\n id: number;\n\n /** @format date-time */\n createdAt: string;\n\n /** @format date-time */\n updatedAt?: string | null;\n\n /** @format date-time */\n deletedAt?: string | null;\n createdBy?: string | null;\n updatedBy?: string | null;\n deletedBy?: string | null;\n\n /** @format int32 */\n year?: number;\n\n /** @format int32 */\n month?: number;\n\n /** @format int32 */\n day?: number;\n games?: Game[] | null;\n round?: Wind;\n seat?: Wind;\n}\n\nexport interface Meld {\n isHidden?: boolean;\n isConcealed?: boolean;\n meldKind?: MeldKind;\n tiles: Tile[];\n code: string;\n meldWith?: Tile;\n}\n\nexport enum MeldKind {\n Chow = \"Chow\",\n Pung = \"Pung\",\n Kong = \"Kong\",\n Eye = \"Eye\",\n}\n\nexport enum Pattern {\n Kongs = \"Kongs\",\n Winds = \"Winds\",\n Honors = \"Honors\",\n TwoConcealedPungs = \"TwoConcealedPungs\",\n ThreeConcealedPungs = \"ThreeConcealedPungs\",\n FourConcealedPungs = \"FourConcealedPungs\",\n FiveConcealedPungs = \"FiveConcealedPungs\",\n WarriorEyes = \"WarriorEyes\",\n PairPungOut = \"PairPungOut\",\n SingleTileOut = \"SingleTileOut\",\n FourToOne = \"FourToOne\",\n AllConcealed = \"AllConcealed\",\n AllConcealedSelfPick = \"AllConcealedSelfPick\",\n AllRevealed = \"AllRevealed\",\n NoTouchOneNine = \"NoTouchOneNine\",\n PureOneSuit = \"PureOneSuit\",\n MixedOneSuit = \"MixedOneSuit\",\n TwoSuits = \"TwoSuits\",\n AllChows = \"AllChows\",\n AllChowsNoHonorsNoFlowers = \"AllChowsNoHonorsNoFlowers\",\n AllPungs = \"AllPungs\",\n PureOneNine = \"PureOneNine\",\n MixedOneNine = \"MixedOneNine\",\n ConnectedOneNine = \"ConnectedOneNine\",\n TwoBrothers = \"TwoBrothers\",\n ThreeBrothers = \"ThreeBrothers\",\n FiveHouses = \"FiveHouses\",\n SmallThreeWinds = \"SmallThreeWinds\",\n LargeThreeWinds = \"LargeThreeWinds\",\n SmallFourWinds = \"SmallFourWinds\",\n LargeFourWinds = \"LargeFourWinds\",\n MixedDragon = \"MixedDragon\",\n MixedConcealedDragon = \"MixedConcealedDragon\",\n PureDragon = \"PureDragon\",\n PureConcealedDragon = \"PureConcealedDragon\",\n MixedTwoSisters = \"MixedTwoSisters\",\n MixedThreeSisters = \"MixedThreeSisters\",\n PureTwoSisters = \"PureTwoSisters\",\n PureThreeSisters = \"PureThreeSisters\",\n PureFourSisters = \"PureFourSisters\",\n SmallThreeDragons = \"SmallThreeDragons\",\n LargeThreeDragons = \"LargeThreeDragons\",\n SelfPick = \"SelfPick\",\n NoHonors = \"NoHonors\",\n NoHonorsNoFlowers = \"NoHonorsNoFlowers\",\n Flowers = \"Flowers\",\n NoFlowers = \"NoFlowers\",\n LiguLigu = \"LiguLigu\",\n ThirteenOrphans = \"ThirteenOrphans\",\n SixteenNoMelds = \"SixteenNoMelds\",\n ThreeNoMelds = \"ThreeNoMelds\",\n Dealer = \"Dealer\",\n}\n\nexport interface PatternMatchResult {\n pattern: Pattern;\n\n /** @format int32 */\n points: number;\n}\n\nexport interface PlayMatchRequest {\n /** @format int32 */\n playerId?: number | null;\n\n /** @format int32 */\n turnTime?: number;\n}\n\nexport interface PlayMatchTemplateRequest {\n /** @format int32 */\n playerId?: number | null;\n\n /** @format int32 */\n turnTime?: number;\n\n /** @format int32 */\n matchTemplateId?: number;\n}\n\nexport interface Player {\n /** @format int32 */\n id: number;\n\n /** @format date-time */\n createdAt: string;\n\n /** @format date-time */\n updatedAt?: string | null;\n\n /** @format date-time */\n deletedAt?: string | null;\n createdBy?: string | null;\n updatedBy?: string | null;\n deletedBy?: string | null;\n name?: string | null;\n imageUrl?: string | null;\n email?: string | null;\n userId?: string | null;\n}\n\nexport interface PlayerSummary {\n /** @format int32 */\n id: number;\n\n /** @format date-time */\n createdAt: string;\n\n /** @format date-time */\n updatedAt?: string | null;\n\n /** @format date-time */\n deletedAt?: string | null;\n createdBy?: string | null;\n updatedBy?: string | null;\n deletedBy?: string | null;\n name?: string | null;\n imageUrl?: string | null;\n email?: string | null;\n userId?: string | null;\n\n /** @format int32 */\n gamesWon?: number;\n\n /** @format int32 */\n gamesPlayed?: number;\n}\n\nexport enum ResultKind {\n Win = \"Win\",\n Lose = \"Lose\",\n Draw = \"Draw\",\n SelfPick = \"SelfPick\",\n}\n\nexport interface Round {\n wind?: Wind;\n games?: Game[] | null;\n}\n\nexport interface Rule {\n pattern?: Pattern;\n examples?: Calculation[] | null;\n}\n\nexport interface Seat {\n clientId: string;\n wind: Wind;\n player?: Player;\n hand: Hand;\n outOn?: Tile;\n result?: HandResult;\n options: TurnRequest[];\n}\n\nexport interface StartMatchRequest {\n /** @format int32 */\n matchId: number;\n}\n\nexport interface Tile {\n /** @format int32 */\n id: number;\n face: Face;\n\n /** @format int32 */\n number?: number | null;\n code: string;\n kind: Kind;\n}\n\nexport interface TurnRequest {\n /** @format int32 */\n matchId: number;\n kind: CaptureKind;\n meldIds: number[];\n codes: string[];\n}\n\nexport interface UpdateCalculationRequest {\n outOn: Tile;\n flowers: Tile[];\n concealed: Tile[];\n melded: Meld[];\n seatWind: Wind;\n roundWind: Wind;\n\n /** @format int32 */\n id?: number;\n}\n\nexport interface UpdatePlayerByUserIdRequest {\n userId?: string | null;\n name?: string | null;\n email?: string | null;\n imageUrl?: string | null;\n clientId?: string | null;\n}\n\nexport interface WallTileSet {\n tiles?: Tile[] | null;\n\n /** @format int32 */\n skip?: number;\n\n /** @format int32 */\n wallCount?: number;\n hasDealt?: boolean;\n}\n\nexport enum Wind {\n East = \"East\",\n South = \"South\",\n West = \"West\",\n North = \"North\",\n}\n\nexport type QueryParamsType = Record;\nexport type ResponseFormat = keyof Omit;\n\nexport interface FullRequestParams extends Omit {\n /** set parameter to `true` for call `securityWorker` for this request */\n secure?: boolean;\n /** request path */\n path: string;\n /** content type of request body */\n type?: ContentType;\n /** query params */\n query?: QueryParamsType;\n /** format of response (i.e. response.json() -> format: \"json\") */\n format?: ResponseFormat;\n /** request body */\n body?: unknown;\n /** base url */\n baseUrl?: string;\n /** request cancellation token */\n cancelToken?: CancelToken;\n}\n\nexport type RequestParams = Omit;\n\nexport interface ApiConfig {\n baseUrl?: string;\n baseApiParams?: Omit;\n securityWorker?: (securityData: SecurityDataType | null) => Promise | RequestParams | void;\n customFetch?: typeof fetch;\n}\n\nexport interface HttpResponse extends Response {\n data: D;\n error: E;\n}\n\ntype CancelToken = Symbol | string | number;\n\nexport enum ContentType {\n Json = \"application/json\",\n FormData = \"multipart/form-data\",\n UrlEncoded = \"application/x-www-form-urlencoded\",\n}\n\nexport class HttpClient {\n public baseUrl: string = \"\";\n private securityData: SecurityDataType | null = null;\n private securityWorker?: ApiConfig[\"securityWorker\"];\n private abortControllers = new Map();\n private customFetch = (...fetchParams: Parameters) => fetch(...fetchParams);\n\n private baseApiParams: RequestParams = {\n credentials: \"same-origin\",\n headers: {},\n redirect: \"follow\",\n referrerPolicy: \"no-referrer\",\n };\n\n constructor(apiConfig: ApiConfig = {}) {\n Object.assign(this, apiConfig);\n }\n\n public setSecurityData = (data: SecurityDataType | null) => {\n this.securityData = data;\n };\n\n private encodeQueryParam(key: string, value: any) {\n const encodedKey = encodeURIComponent(key);\n return `${encodedKey}=${encodeURIComponent(typeof value === \"number\" ? value : `${value}`)}`;\n }\n\n private addQueryParam(query: QueryParamsType, key: string) {\n return this.encodeQueryParam(key, query[key]);\n }\n\n private addArrayQueryParam(query: QueryParamsType, key: string) {\n const value = query[key];\n return value.map((v: any) => this.encodeQueryParam(key, v)).join(\"&\");\n }\n\n protected toQueryString(rawQuery?: QueryParamsType): string {\n const query = rawQuery || {};\n const keys = Object.keys(query).filter((key) => \"undefined\" !== typeof query[key]);\n return keys\n .map((key) => (Array.isArray(query[key]) ? this.addArrayQueryParam(query, key) : this.addQueryParam(query, key)))\n .join(\"&\");\n }\n\n protected addQueryParams(rawQuery?: QueryParamsType): string {\n const queryString = this.toQueryString(rawQuery);\n return queryString ? `?${queryString}` : \"\";\n }\n\n private contentFormatters: Record any> = {\n [ContentType.Json]: (input: any) =>\n input !== null && (typeof input === \"object\" || typeof input === \"string\") ? JSON.stringify(input) : input,\n [ContentType.FormData]: (input: any) =>\n Object.keys(input || {}).reduce((formData, key) => {\n const property = input[key];\n formData.append(\n key,\n property instanceof Blob\n ? property\n : typeof property === \"object\" && property !== null\n ? JSON.stringify(property)\n : `${property}`,\n );\n return formData;\n }, new FormData()),\n [ContentType.UrlEncoded]: (input: any) => this.toQueryString(input),\n };\n\n private mergeRequestParams(params1: RequestParams, params2?: RequestParams): RequestParams {\n return {\n ...this.baseApiParams,\n ...params1,\n ...(params2 || {}),\n headers: {\n ...(this.baseApiParams.headers || {}),\n ...(params1.headers || {}),\n ...((params2 && params2.headers) || {}),\n },\n };\n }\n\n private createAbortSignal = (cancelToken: CancelToken): AbortSignal | undefined => {\n if (this.abortControllers.has(cancelToken)) {\n const abortController = this.abortControllers.get(cancelToken);\n if (abortController) {\n return abortController.signal;\n }\n return void 0;\n }\n\n const abortController = new AbortController();\n this.abortControllers.set(cancelToken, abortController);\n return abortController.signal;\n };\n\n public abortRequest = (cancelToken: CancelToken) => {\n const abortController = this.abortControllers.get(cancelToken);\n\n if (abortController) {\n abortController.abort();\n this.abortControllers.delete(cancelToken);\n }\n };\n\n public request = async ({\n body,\n secure,\n path,\n type,\n query,\n format,\n baseUrl,\n cancelToken,\n ...params\n }: FullRequestParams): Promise> => {\n const secureParams =\n ((typeof secure === \"boolean\" ? secure : this.baseApiParams.secure) &&\n this.securityWorker &&\n (await this.securityWorker(this.securityData))) ||\n {};\n const requestParams = this.mergeRequestParams(params, secureParams);\n const queryString = query && this.toQueryString(query);\n const payloadFormatter = this.contentFormatters[type || ContentType.Json];\n const responseFormat = format || requestParams.format;\n\n return this.customFetch(`${baseUrl || this.baseUrl || \"\"}${path}${queryString ? `?${queryString}` : \"\"}`, {\n ...requestParams,\n headers: {\n ...(type && type !== ContentType.FormData ? { \"Content-Type\": type } : {}),\n ...(requestParams.headers || {}),\n },\n signal: cancelToken ? this.createAbortSignal(cancelToken) : void 0,\n body: typeof body === \"undefined\" || body === null ? null : payloadFormatter(body),\n }).then(async (response) => {\n const r = response as HttpResponse;\n r.data = null as unknown as T;\n r.error = null as unknown as E;\n\n const data = !responseFormat\n ? r\n : await response[responseFormat]()\n .then((data) => {\n if (r.ok) {\n r.data = data;\n } else {\n r.error = data;\n }\n return r;\n })\n .catch((e) => {\n r.error = e;\n return r;\n });\n\n if (cancelToken) {\n this.abortControllers.delete(cancelToken);\n }\n\n if (!response.ok) throw data;\n return data;\n });\n };\n}\n\n/**\n * @title Mahjong API\n * @version v1\n */\nexport class Api extends HttpClient {\n api = {\n /**\n * No description\n *\n * @tags Auth\n * @name AuthExternalLoginCreate\n * @request POST:/api/auth/external-login\n * @secure\n */\n authExternalLoginCreate: (\n query?: { provider?: string; returnUrl?: string; clientId?: string },\n params: RequestParams = {},\n ) =>\n this.request({\n path: `/api/auth/external-login`,\n method: \"POST\",\n query: query,\n secure: true,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Auth\n * @name AuthExternalAuthCallbackList\n * @request GET:/api/auth/external-auth-callback\n * @secure\n */\n authExternalAuthCallbackList: (query?: { returnUrl?: string; clientId?: string }, params: RequestParams = {}) =>\n this.request({\n path: `/api/auth/external-auth-callback`,\n method: \"GET\",\n query: query,\n secure: true,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Calculation\n * @name CalculationsTilesList\n * @summary Finds all the sample mahjong hands\n * @request GET:/api/calculations/tiles\n * @secure\n */\n calculationsTilesList: (params: RequestParams = {}) =>\n this.request({\n path: `/api/calculations/tiles`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Calculation\n * @name CalculationsRulesList\n * @summary Find all the rules for calculation\n * @request GET:/api/calculations/rules\n * @secure\n */\n calculationsRulesList: (params: RequestParams = {}) =>\n this.request({\n path: `/api/calculations/rules`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Calculation\n * @name CalculationsList\n * @summary Finds all the calculations\n * @request GET:/api/calculations\n * @secure\n */\n calculationsList: (params: RequestParams = {}) =>\n this.request({\n path: `/api/calculations`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Calculation\n * @name CalculationsCreate\n * @summary Create a new sample mahjong hand\n * @request POST:/api/calculations\n * @secure\n */\n calculationsCreate: (data: CreateCalculationRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/calculations`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Calculation\n * @name CalculationsUpdate\n * @summary Update a sample mahjong hand\n * @request PUT:/api/calculations\n * @secure\n */\n calculationsUpdate: (data: UpdateCalculationRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/calculations`,\n method: \"PUT\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Calculation\n * @name CalculationsDetail\n * @summary Gets the mahjong hand calculation by id\n * @request GET:/api/calculations/{id}\n * @secure\n */\n calculationsDetail: (id: number, params: RequestParams = {}) =>\n this.request({\n path: `/api/calculations/${id}`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Calculation\n * @name CalculationsDelete\n * @request DELETE:/api/calculations/{id}\n * @secure\n */\n calculationsDelete: (id: number, params: RequestParams = {}) =>\n this.request({\n path: `/api/calculations/${id}`,\n method: \"DELETE\",\n secure: true,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Calculation\n * @name CalculationsCalculateCreate\n * @summary Calculate a hand\n * @request POST:/api/calculations/calculate\n * @secure\n */\n calculationsCalculateCreate: (data: CreateCalculationRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/calculations/calculate`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Community\n * @name CommunityFindList\n * @summary Find all the players\n * @request GET:/api/community/find\n * @secure\n */\n communityFindList: (params: RequestParams = {}) =>\n this.request({\n path: `/api/community/find`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Community\n * @name CommunityGamesList\n * @summary Find best game results\n * @request GET:/api/community/games\n * @secure\n */\n communityGamesList: (params: RequestParams = {}) =>\n this.request({\n path: `/api/community/games`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Community\n * @name CommunityPlayerPartialUpdate\n * @summary Update a player information\n * @request PATCH:/api/community/player/{id}\n * @secure\n */\n communityPlayerPartialUpdate: (id: string, data: UpdatePlayerByUserIdRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/community/player/${id}`,\n method: \"PATCH\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Community\n * @name CommunityPlayerDetail\n * @summary Get a player\n * @request GET:/api/community/player/{id}\n * @secure\n */\n communityPlayerDetail: (id: number, params: RequestParams = {}) =>\n this.request({\n path: `/api/community/player/${id}`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Home\n * @name HomeStatisticsList\n * @summary Gets the current statistics\n * @request GET:/api/home/statistics\n * @secure\n */\n homeStatisticsList: (params: RequestParams = {}) =>\n this.request({\n path: `/api/home/statistics`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchCreateCreate\n * @summary Creates a match to allow others to join\n * @request POST:/api/match/create\n * @secure\n */\n matchCreateCreate: (data: CreateMatchRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/create`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchContinueCreate\n * @summary Continues a match\n * @request POST:/api/match/continue\n * @secure\n */\n matchContinueCreate: (data: ContinueMatchRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/continue`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchDelete\n * @summary Deletes a match by id\n * @request DELETE:/api/match/{id}\n * @secure\n */\n matchDelete: (id: number, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/${id}`,\n method: \"DELETE\",\n secure: true,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name GetMatch\n * @summary Get a match by id\n * @request GET:/api/match/{id}\n * @secure\n */\n getMatch: (id: number, query?: { connectionId?: string }, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/${id}`,\n method: \"GET\",\n query: query,\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchInActiveDelete\n * @summary Deletes inActive matches that has lasted for more than 2 hrs\n * @request DELETE:/api/match/inActive\n * @secure\n */\n matchInActiveDelete: (params: RequestParams = {}) =>\n this.request({\n path: `/api/match/inActive`,\n method: \"DELETE\",\n secure: true,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchFindDetail\n * @summary Finds all the active matches, this includes matches that are awaiting players as well as matches that has started\n * @request GET:/api/match/find/{playerId}\n * @secure\n */\n matchFindDetail: (playerId: string, query?: { playerId?: number }, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/find/${playerId}`,\n method: \"GET\",\n query: query,\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchStartCreate\n * @summary Start a match, automatically uses Bots for missing players\n * @request POST:/api/match/start\n * @secure\n */\n matchStartCreate: (data: StartMatchRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/start`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchPlayCreate\n * @summary Creates and starts a match with bots\n * @request POST:/api/match/play\n * @secure\n */\n matchPlayCreate: (data: PlayMatchRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/play`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchJoinCreate\n * @summary Join a match\n * @request POST:/api/match/join\n * @secure\n */\n matchJoinCreate: (data: JoinMatchRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/join`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchCaptureCreate\n * @summary Try to capture a discard tile and meld with concealed tiles\n * @request POST:/api/match/capture\n * @secure\n */\n matchCaptureCreate: (data: CaptureRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/capture`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchDiscardCreate\n * @summary Discard a tile from concealed\n * @request POST:/api/match/discard\n * @secure\n */\n matchDiscardCreate: (data: DiscardRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/discard`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchDrawCreate\n * @summary Draw a tile from the wall into your concealed hand\n * @request POST:/api/match/draw\n * @secure\n */\n matchDrawCreate: (data: DrawTileRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/draw`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchSelfPickCreate\n * @summary Win from concealed tiles and the last drawn tile\n * @request POST:/api/match/self-pick\n * @secure\n */\n matchSelfPickCreate: (data: TurnRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/self-pick`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchConcealedKongCreate\n * @summary Creates a concealed kong for the player on their turn based on a Pung and a matching concealed tile\n * @request POST:/api/match/concealed-kong\n * @secure\n */\n matchConcealedKongCreate: (data: TurnRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/concealed-kong`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchHiddenKongCreate\n * @summary Creates a hidden kong for the player on their turn based on 4 tiles with the same face\n * @request POST:/api/match/hidden-kong\n * @secure\n */\n matchHiddenKongCreate: (data: TurnRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/hidden-kong`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchDetail\n * @summary Get all the frames for a specific game in a match\n * @request GET:/api/match/{matchId}/{gameId}\n * @secure\n */\n matchDetail: (matchId: number, gameId: number, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/${matchId}/${gameId}`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchResultsDetail\n * @summary Get all the game results for a specific match\n * @request GET:/api/match/{matchId}/results\n * @secure\n */\n matchResultsDetail: (matchId: number, params: RequestParams = {}) =>\n this.request({\n path: `/api/match/${matchId}/results`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Match\n * @name MatchGenerateResultsCreate\n * @summary Regenerate results from frames\n * @request POST:/api/match/generate/results\n * @secure\n */\n matchGenerateResultsCreate: (params: RequestParams = {}) =>\n this.request({\n path: `/api/match/generate/results`,\n method: \"POST\",\n secure: true,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags MatchTemplate\n * @name TemplateDetail\n * @summary Get match of the day\n * @request GET:/api/template/{year}/{month}/{day}\n * @secure\n */\n templateDetail: (year: number, month: number, day: number, params: RequestParams = {}) =>\n this.request({\n path: `/api/template/${year}/${month}/${day}`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags MatchTemplate\n * @name TemplatePlayCreate\n * @summary Creates and starts a match based on a template\n * @request POST:/api/template/play\n * @secure\n */\n templatePlayCreate: (data: PlayMatchTemplateRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/template/play`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags MatchTemplate\n * @name TemplateDrawCreate\n * @summary Draw a tile from the wall into the active player's concealed hand\n * @request POST:/api/template/draw\n * @secure\n */\n templateDrawCreate: (data: DrawTileRequest, params: RequestParams = {}) =>\n this.request({\n path: `/api/template/draw`,\n method: \"POST\",\n body: data,\n secure: true,\n type: ContentType.Json,\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Profile\n * @name ProfileStatisticsList\n * @summary Gets the statistics for the player\n * @request GET:/api/profile/statistics\n * @secure\n */\n profileStatisticsList: (params: RequestParams = {}) =>\n this.request({\n path: `/api/profile/statistics`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Profile\n * @name ProfileList\n * @summary Gets the profile information for the player\n * @request GET:/api/profile\n * @secure\n */\n profileList: (params: RequestParams = {}) =>\n this.request({\n path: `/api/profile`,\n method: \"GET\",\n secure: true,\n format: \"json\",\n ...params,\n }),\n\n /**\n * No description\n *\n * @tags Profile\n * @name ProfileSignOutCreate\n * @request POST:/api/profile/sign-out\n * @secure\n */\n profileSignOutCreate: (params: RequestParams = {}) =>\n this.request({\n path: `/api/profile/sign-out`,\n method: \"POST\",\n secure: true,\n ...params,\n }),\n };\n}\n","import styled from \"styled-components\";\n\nexport const Frame = styled.div`\n position: relative;\n width: 100vw;\n height: 100vh;\n background-color: #e3f2fd;\n`;\n\nexport const Module = styled.div`\n width: 100vw;\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n justify-content: space-between;\n font-family: ${({ theme }) => theme.heading};\n background-color: rgba(0, 0, 0, 0.4);\n`;\n\nexport const Page = styled.div`\n display: flex;\n flex-direction: column;\n`;\n\nexport const Backdrop = styled.div`\n margin-top: 2rem;\n margin-left: 1rem;\n margin-right: 1rem;\n background-color: rgba(0, 0, 0, 0.4);\n display: flex;\n flex-direction: row;\n align-items: center;\n flex-wrap: wrap;\n justify-content: center;\n padding: 1rem;\n border-radius: 1rem;\n`;\n\nexport const Footer = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n background-color: #282828;\n`;\n\nexport const Header = styled.div`\n font-family: ${({ theme }) => theme.title};\n color: ${({ theme }) => theme.primary};\n font-size: 2.5rem;\n display: flex;\n flex-direction: row;\n justify-content: center;\n padding: 0.25rem;\n width: 100%;\n`;\n\nexport const Title = styled.div`\n font-family: ${({ theme }) => theme.title};\n color: ${({ theme }) => theme.primary};\n font-size: 2.5rem;\n display: flex;\n flex-direction: row;\n justify-content: center;\n`;\n\nexport const Panel = styled.div`\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n align-items: center;\n justify-content: space-between;\n`;\n\nexport const FixedPanel = styled.div`\n width: 300px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 0.2rem;\n margin: 0.2rem;\n`;\n\nexport const MainPanel = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n`;\n\nexport const Card = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 0.2rem;\n margin: 0.2rem;\n`;\n\nexport const PanelContent = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n`;\n\nexport const PanelFooter = styled.div`\n padding-top: 1rem;\n`;\n\nexport const Col = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n align-items: stretch;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n`;\n\nexport const Row = styled.div`\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n`;\n\nexport const Item = styled.div<{ selected?: boolean }>`\n margin-top: 0.3rem;\n border-radius: 6px;\n border-style: solid;\n border-width: 2px;\n padding: 0.2rem;\n margin-left: 0.1rem;\n margin-right: 0.1ren;\n min-width: 4rem;\n cursor: pointer;\n color: ${(props) =>\n props.selected ? props.theme.primary : props.theme.light};\n`;\n\nexport const WideItem = styled.div<{ selected?: boolean }>`\n margin-top: 0.3rem;\n border-radius: 6px;\n border-style: solid;\n border-width: 2px;\n padding-left: 0.75rem;\n padding-right: 0.75rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-left: 0.1rem;\n margin-right: 0.1ren;\n min-width: 4rem;\n cursor: pointer;\n color: ${(props) =>\n props.selected ? props.theme.primary : props.theme.light};\n`;\n\nexport const Description = styled.div`\n font-family: ${({ theme }) => theme.text};\n text-transform: none;\n font-weight: 100;\n padding: 1rem;\n`;\n\nexport const PageDescription = styled(Description)`\n text-align: left;\n line-height: 1.4;\n`;\n","import styled from \"styled-components\";\n\nexport const Container = styled.div`\n display: flex;\n justify-content: center;\n border-radius: 4px;\n border-bottom: solid;\n border-color: ${({ theme }) => theme.primary};\n margin-right: 0.5rem;\n padding-bottom: 0.2rem;\n margin-top: 0.2rem;\n`;\n","import { Wind } from \"../../api/mahjong-api\";\n\nconst winds = {\n \"🀀\": { x: 6, y: 3 },\n \"🀁\": { x: 5, y: 3 },\n \"🀂\": { x: 7, y: 3 },\n \"🀃\": { x: 4, y: 3 },\n};\nconst dragons = {\n \"🀄\": { x: 2, y: 4 },\n \"🀅\": { x: 1, y: 4 },\n \"🀆\": { x: 0, y: 4 },\n};\nconst characters = {\n \"🀇\": { x: 0, y: 0 },\n \"🀈\": { x: 1, y: 0 },\n \"🀉\": { x: 2, y: 0 },\n \"🀊\": { x: 3, y: 0 },\n \"🀋\": { x: 4, y: 0 },\n \"🀌\": { x: 5, y: 0 },\n \"🀍\": { x: 6, y: 0 },\n \"🀎\": { x: 7, y: 0 },\n \"🀏\": { x: 8, y: 0 },\n};\nconst bamboos = {\n \"🀐\": { x: 0, y: 1 },\n \"🀑\": { x: 1, y: 1 },\n \"🀒\": { x: 2, y: 1 },\n \"🀓\": { x: 3, y: 1 },\n \"🀔\": { x: 4, y: 1 },\n \"🀕\": { x: 5, y: 1 },\n \"🀖\": { x: 6, y: 1 },\n \"🀗\": { x: 7, y: 1 },\n \"🀘\": { x: 8, y: 1 },\n};\nconst dots = {\n \"🀙\": { x: 0, y: 2 },\n \"🀚\": { x: 1, y: 2 },\n \"🀛\": { x: 2, y: 2 },\n \"🀜\": { x: 3, y: 2 },\n \"🀝\": { x: 4, y: 2 },\n \"🀞\": { x: 5, y: 2 },\n \"🀟\": { x: 6, y: 2 },\n \"🀠\": { x: 7, y: 2 },\n \"🀡\": { x: 8, y: 2 },\n};\nconst flowers = {\n \"🀢\": { x: 0, y: 3 },\n \"🀣\": { x: 1, y: 3 },\n \"🀤\": { x: 2, y: 3 },\n \"🀥\": { x: 3, y: 3 },\n};\nconst seasons = {\n \"🀦\": { x: 3, y: 4 },\n \"🀧\": { x: 4, y: 4 },\n \"🀨\": { x: 5, y: 4 },\n \"🀩\": { x: 6, y: 4 },\n};\n\nexport const tileCodePositions: { [code: string]: { x: number; y: number } } = {\n ...winds,\n ...dragons,\n ...characters,\n ...bamboos,\n ...dots,\n ...flowers,\n ...seasons,\n};\n\nexport const tileWidth = 67;\nexport const tileHeight = 87;\n\nconst imageWidth = 768;\nconst imageHeight = 580;\nconst yAdjustment = 117;\n\nconst getPos = (code: string) => tileCodePositions[code];\n\nexport const getImageX = (code: string, ratio: number = 1) =>\n getPos(code).x * ratio * (2 + tileWidth) + ratio;\n\nexport const getImageY = (code: string, ratio: number = 1) =>\n (getPos(code).y * (2 + tileHeight) + yAdjustment) * ratio;\n\nexport const getImageWidth = (ratio: number = 1) => tileWidth * ratio;\n\nexport const getImageHeight = (ratio: number = 1) => tileHeight * ratio;\n\nexport const getBackgroundWidth = (ratio: number = 1) => imageWidth * ratio;\n\nexport const getBackgroundHeight = (ratio: number = 1) => imageHeight * ratio;\n\nexport const windCodes = new Map([\n [Wind.East, \"🀀\"],\n [Wind.South, \"🀁\"],\n [Wind.West, \"🀂\"],\n [Wind.North, \"🀃\"],\n]);\n\nexport const nextWind = new Map([\n [Wind.East, Wind.South],\n [Wind.South, Wind.West],\n [Wind.West, Wind.North],\n [Wind.North, Wind.East],\n]);\n","export default __webpack_public_path__ + \"static/media/default.3095fec9.svg\";","import styled from \"styled-components\";\n\nimport {\n getImageX,\n getImageY,\n getImageWidth,\n getImageHeight,\n getBackgroundWidth,\n getBackgroundHeight,\n} from \"./constants\";\n\nimport bgImage from \"./default.svg\";\n\nexport const getTileImage = (code: string, ratio: number) => ({\n backgroundImage: `url(${bgImage})`,\n backgroundPosition: `-${getImageX(code, ratio)}px -${getImageY(\n code,\n ratio\n )}px`,\n width: `${getImageWidth(ratio)}px`,\n height: `${getImageHeight(ratio)}px`,\n backgroundSize: `${getBackgroundWidth(ratio)}px, ${getBackgroundHeight(\n ratio\n )}px`,\n});\n\nexport const Tile = styled.div<{\n code: string;\n ratio?: number;\n offset?: number;\n}>`\n background-image: url(${bgImage});\n background-position-x: ${(props) =>\n `-${getImageX(props.code, props.ratio)}px`};\n background-position-y: ${(props) =>\n `-${getImageY(props.code, props.ratio)}px`};\n width: ${(props) => `${getImageWidth(props.ratio)}px`};\n height: ${(props) => `${getImageHeight(props.ratio)}px`};\n background-size: ${(props) =>\n `${getBackgroundWidth(props.ratio)}px, ${getBackgroundHeight(\n props.ratio\n )}px`};\n padding: 0px;\n display: inline-block;\n margin-left: ${(props) => `${props.offset ? -20 * (props.ratio || 1) : 0}px`};\n background-color: #ffffff;\n border: \"1px solid rgba(40, 167, 69, 0.5\";\n border-radius: ${(props) => `${(props.ratio || 1) * 0.5}`}rem;\n`;\n\nTile.defaultProps = {\n onClick: () => {},\n ratio: 1,\n};\n","export enum Section {\n Concealed = \"Concealed\",\n Melded = \"Melded\",\n Flowers = \"Flowers\",\n OutOn = \"OutOn\",\n Seat = \"Seat\",\n Round = \"Round\",\n}\n","import React from \"react\";\nimport { Container } from \"./Meld.styled\";\n\nimport { Tile } from \"./Tile\";\n\ntype Props = {\n codes?: string[];\n ratio?: number;\n};\n\nexport const Meld = ({ codes = [], ratio = 1 }: Props) => (\n \n {codes.map((t, i) => (\n \n ))}\n \n);\n","import styled from \"styled-components\";\n\nexport const OutOn = styled.div`\n display: flex;\n justify-content: center;\n border-radius: 4px;\n border-bottom: solid;\n border-color: red;\n margin-left: 0.5rem;\n margin-top: 0.2rem;\n padding-bottom: 0.2rem;\n`;\n\nexport const Drawn = styled.div`\n display: flex;\n justify-content: center;\n border-radius: 4px;\n border-bottom: solid;\n border-color: green;\n margin-left: 0.5rem;\n margin-top: 0.2rem;\n padding-bottom: 0.2rem;\n`;\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: row;\n`;\n","import React from \"react\";\n\nimport { Meld, Tile } from \"../../../api/mahjong-api\";\nimport { Col, Row } from \"../../../components/common/Page.styled\";\nimport { Meld as M } from \"../../../components/game/Meld\";\nimport { Tile as T } from \"../../../components/game/Tile\";\nimport { Drawn, OutOn } from \"./Hand.styled\";\n\ntype Props = {\n flowers?: Tile[];\n melded?: Meld[];\n concealed?: Tile[];\n outOn?: Tile;\n drawn?: Tile;\n ratio?: number;\n};\n\nconst Hand = ({\n melded = [],\n flowers = [],\n concealed = [],\n outOn,\n drawn,\n ratio = 0.7,\n}: Props) => (\n \n \n {flowers.map((t, i) => (\n \n ))}\n \n \n {melded.map((t, i) => (\n t.code)} ratio={ratio} />\n ))}\n\n {[...concealed]\n .sort((a, b) => a.id - b.id)\n .map((t, i) => (\n \n ))}\n {outOn && (\n \n \n \n )}\n {drawn && (\n \n \n \n )}\n \n \n);\n\nexport default Hand;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAMAAAAOusbgAAABLFBMVEUAAAD///////////////////////////////////////////////////////////////8ZdtL/PQBMr1D/wQf/8+//VR//59//YTA1h9j/t59iuWbp9eni7vr/++//bz/0+vTS69O74b14w3tYtFqpzO7/6KJuvnH/ySj/ShD/z7+a0p3/rI//0UVWmt4ge8Ww3LIzlI7/noD/kW92vGH/eU95r+Xx9eLc7+FEkNv/89H/28+l16eEyIb/3niLxXRHqV3/1FT/xRf/sAb/ggP/UAHx9/2axOz/+OAnftVAjcnH5sj/8MH/7LK83a7S4a3/5JNGpGr/hV9XsExoskSVtjOruCn/YSHYvRf/agLU5ve31PGLuuj/w68piKmPzZJ4sz68uiPovhD/oAUFXwR9AAAAEHRSTlMA3+8/vyBvXxCvn8+Pf1AwwrUxOAAABKpJREFUaN7lm4laGjEQgE122RPagUWQQxCk0io9rb2t2tr7vu/7/d+h2ErjCslMluyWfv0fwJ+ZTI5NxjltPMvNBzZjHPZgoe0XHMubSxfL8RlMhPmONZcOnmNzUMJ9N5eCFUjYRt1WwIFOYJnS2qBJ6JrQMkgAc7OOVqinSXjOhikIEpeZw2EqeCHjcAUsl224Au5oar08GCKvl+YQBBmm+ygD+BvmIxyMwo/QvC4Yx83aK8xUb/bmI5ASyDjnOKQEP6r0MkBIZ1Z5DFIk9KTiPCCktHo6kDLOtIV1tb6+UamUhlQW2uv1q+QCmzzMDCjMD9onSoc4sVGvAgV7krcABFbbJQkbq+Rk6ye6XikpqNQTJTvAoxVaVE1PtgUI1XaJwHN0rC3NyhqIipouaFtrT2qtl8icQ0OmB1xdKGmwoE43owdcrZS02KCHHJr0LsyTR9ky7EWwaHN4wbQXgpE3BwrWjXuBe4TSqpcmcaI9+FQdKuavrp5ry7z4im0rBnjSutEexP78fL2i5wUbz/TzCdpVye4hvCgelun6eJIHMJFzwkvOtQ9S3owtxVX5rBNeYq45yFi5eYtes1W6Fziyehwvl3cRb0Is5dnyUXnIj1t4nvVxlEO8U97j5ruR2JwXfNWOeLe8zy660dIRe6MHMlbKI37VWAVM4ilqa6csGKa7DiaxFLV1o3yA3TdgFFd+jr9SjrECRsnLi3olLm7BOEU192q1DyAhkG9N12Pek6AhFlyQL5ohSDgZE19PJj4FEph8Gh+PiR8mE9+Xi4EmvpJMXAMJXC7GawuKOCCDKob/Tmw+1ZxWXHcNFxdQp9OjZOLLCebxTkz81PACEv69JTOgbRI3WonEd+RnnzxIiG+L3x4DiWNx8XuQUJB+R8QPAq+iZSBRi2+MimOmBfj29P1lFEUdesB4bYGlOOw9HXnfvoiGLJMDFhwDGZ7ieNva976OfnMGUD4W4yyqvmF8JNdfo316TUBYpM5i8JWfMA/30vwy+kNjCfHWitRMO9hH2+voIH2l+XaNvFCDhXymvori9JuKeC8XyQFz7AqkER2iITVfqhXpAfvYG0gnOkxPUtvXorPEgMWDnwdylqMxGp0JP3AvNWdPIzuiIIdeNzV70Tj9bqzIls7s/7xnMfMiSLEJ701nooksX+tcWho6mw+uHUjK9gHzHcLTqsdBzlqkwfZnsREryFEuUVt9HfOoxGq3QU5AuzZuNvTNtUXiTblt0PzsNOINkcefxObt+4v0V3umNmuN8/mL+GMIHrJ+ba+1tNoUbMTc7dG0vSeghuk+8TW/ULxbF8kvISJkjG4DHd0OYAToM66++vyTZG/mDhB4sCmxvtjqAIGJzXQ2UGh2N3tjFbX1eAkosCmbEy5115b7v9LeOL+51hUFhSZ6ttoxMm9AEXghpAibwSajYZtgem1VudlsJEvQOjfbTXvuLLdHpt4QmtmsYqJNMFNzqNdjba7N2fs3GrsNpdtO1r9f4NmGK8gFGYcrsFhirTU3HW4iNUO0NHWYcbQCKwA6PMC1dHKuTQzW8Uw5hdvnSKwx67//z3QjPMsp+HbIfgfJmB3kXUs/0p9r//ll+OSXAQAAAABJRU5ErkJggg==\"","import styled from \"styled-components\";\nimport GoogleImg from \"../login/icon_mobile_google_login.png\";\n\nexport const Button = styled.button<{ active?: boolean }>`\n padding: 4px 16px;\n color: #00291f;\n font-family: ${({ theme }) => theme.heading};\n background-color: ${({ theme, active }) =>\n active ? \"white\" : theme.primary};\n letter-spacing: 1.25px;\n border-radius: 4px;\n border: none;\n &:hover {\n background-color: #dee4ed;\n box-shadow: 0 3px #999;\n }\n &:active {\n background-color: #dee4ed;\n box-shadow: 0 3px #666;\n transform: translateY(2px);\n }\n`;\n\nexport const ButtonGroup = styled.div`\n display: flex;\n flex-direction: column;\n padding: 4px 16px;\n color: #00291f;\n letter-spacing: 1.25px;\n border-radius: 4px;\n border: none;\n`;\n\nexport const ActionButton = styled.button`\n margin: 0.5rem;\n text-transform: uppercase;\n font-family: ${({ theme }) => theme.heading};\n font-size: 1.2rem;\n padding: 8px 8px;\n width: 220px;\n color: #00291f;\n background-color: ${({ theme }) => theme.primary};\n letter-spacing: 1.25px;\n border-radius: 4px;\n border: none;\n box-shadow: 0 3px #999;\n &:hover {\n background-color: #dee4ed;\n transform: translateY(-2px);\n }\n &:active {\n background-color: #dee4ed;\n box-shadow: 0 1px #666;\n transform: translateY(2px);\n }\n`;\n\nexport const SocialButton = styled.button`\n margin-top: 0.5rem;\n width: 3rem;\n height: 3rem;\n background-color: transparent;\n border: none;\n background-image: url(${GoogleImg});\n background-size: cover;\n`;\n","import styled from \"styled-components\";\n\nexport const Container = styled.div`\n background-color: rgba(0, 0, 0, 0.5);\n overflow-y: scroll;\n height: 100%;\n`;\nexport const Table = styled.table`\n margin-top: 5px;\n width: 100%;\n`;\n\nexport const Tr = styled.tr``;\nexport const Th = styled.th`\n padding: 0.5rem;\n`;\nexport const Td = styled.td`\n height: 3rem;\n`;\nexport const THead = styled.thead`\n background-color: rgba(255, 255, 255, 0.5);\n height: 2rem;\n color: #282828;\n`;\n\nexport const TBody = styled.tbody``;\n","import React from \"react\";\nimport { Calculation } from \"../../../api/mahjong-api\";\nimport ListHand from \"./Hand\";\nimport { Button } from \"../../../components/common/Buttons.styled\";\nimport { Delete } from \"@styled-icons/material-sharp\";\nimport { Tile } from \"../../../components/game/Tile\";\nimport { windCodes } from \"../../../components/game/constants\";\nimport { CellProps, useTable } from \"react-table\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Container, Table, Td, THead, Tr, TBody, Th } from \"./List.styled\";\n\nexport type Props = {\n examples?: Calculation[];\n deleteSample?: (id: number) => void;\n editSample?: (id: number) => void;\n};\n\nexport const List = ({\n examples: requests = [],\n deleteSample = () => {},\n editSample = () => {},\n}: Props) => {\n const data = React.useMemo(() => requests, [requests]);\n\n const columns = React.useMemo(\n () => [\n {\n Header: ,\n id: \"id\",\n Cell: (r: CellProps) => r.row.original.id,\n },\n {\n Header: ,\n id: \"seat\",\n Cell: (r: CellProps) => (\n \n ),\n },\n {\n Header: ,\n id: \"hand\",\n Cell: (r: CellProps) => (\n \n ),\n },\n {\n Header: ,\n id: \"score\",\n Cell: (r: CellProps) => (\n <>{r.row.original.result?.totalPoints}\n ),\n },\n {\n Header: \"\",\n id: \"action\",\n Cell: (r: CellProps) => (\n <>\n \n deleteSample(r.row.original.id)} />\n \n ),\n },\n ],\n [deleteSample, editSample]\n );\n\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =\n useTable({\n columns,\n data,\n });\n return (\n \n \n \n {headerGroups.map((headerGroup) => (\n \n {headerGroup.headers.map((column) => (\n \n ))}\n \n ))}\n \n \n {rows.map((row, i) => {\n prepareRow(row);\n return (\n \n {row.cells.map((cell) => {\n return (\n \n );\n })}\n \n );\n })}\n \n
{column.render(\"Header\")}
{cell.render(\"Cell\")}
\n
\n );\n};\nexport default List;\n","import styled from \"styled-components\";\n\nexport const Table = styled.table`\n margin-top: 5px;\n width: 100%;\n`;\n\nexport const Tr = styled.tr``;\nexport const Th = styled.th`\n font-family: ${({ theme }) => theme.text};\n`;\nexport const Td = styled.td`\n font-family: ${({ theme }) => theme.text};\n text-transform: none;\n font-weight: 100;\n padding: 0.2rem;\n`;\n\nexport const TdNoWrap = styled.td`\n font-family: ${({ theme }) => theme.text};\n text-transform: none;\n font-weight: 100;\n white-space: nowrap;\n padding: 0.2rem;\n`;\n\nexport const THead = styled.thead`\n background-color: rgba(255, 255, 255, 0.5);\n height: 2rem;\n color: #282828;\n`;\n\nexport const RulesPanel = styled.div`\n width: 380px;\n display: flex;\n flex-direction: column;\n padding: 0.2rem;\n margin: 0.2rem;\n padding-top: 2rem;\n`;\n\nexport const TBody = styled.tbody``;\n\nexport const RuleRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n justify-content: center;\n`;\n\nexport const RuleBox = styled.div`\n display: flex;\n flex-direction: column;\n border-color: ${({ theme }) => theme.primary};\n border-radius: 0.5rem;\n border-style: solid;\n border-width: 2px;\n margin: 1rem;\n width: 23rem;\n text-transform: none;\n`;\n\nexport const RuleName = styled.div`\n padding-left: 1rem;\n flex-grow: 1;\n color: black;\n display: flex;\n`;\n\nexport const RuleTitle = styled.div`\n background-color: ${({ theme }) => theme.primary};\n border-top-left-radius: 0.4rem;\n border-top-right-radius: 0.4rem;\n color: black;\n display: flex;\n`;\n\nexport const RulePoints = styled.div`\n display: flex;\n flex-grow: 1;\n padding-right: 1rem;\n justify-content: end;\n`;\n\nexport const RuleDescription = styled.div`\n display: flex;\n font-size: 0.8rem;\n padding: 0.2rem;\n font-family: ${({ theme }) => theme.text};\n`;\n\nexport const Examples = styled.div`\n display: flex;\n flex-direction: column;\n padding: 0.2rem;\n`;\n\nexport const ExampleItem = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n margin-bottom: 0.2rem;\n`;\n\nexport const Points = styled.div`\n width: 5rem;\n`;\n","import styled from \"styled-components\";\n\nexport const Container = styled.div`\n color: white;\n overflow-y: scroll;\n height: 100%;\n`;\nexport const Table = styled.table`\n margin-top: 5px;\n width: 100%;\n border-collapse: collapse;\n`;\n\nexport const Tr = styled.tr`\n &:hover {\n background-color: rgba(255, 255, 255, 0.5);\n }\n`;\nexport const Td = styled.td`\n height: 3rem;\n`;\nexport const THead = styled.thead`\n height: 2rem;\n font-size: 0.75rem;\n border-bottom: 1px solid white;\n`;\n","import React from \"react\";\nimport { GetTilesResponse } from \"../../../api/mahjong-api\";\nimport { PageDescription as Description } from \"../../../components/common/Page.styled\";\nimport { Tile } from \"../../../components/game/Tile\";\nimport { TdNoWrap as Td, RulesPanel as Panel } from \"./List.styled\";\n\ntype Props = {\n tiles?: GetTilesResponse;\n};\n\nconst Tiles = ({ tiles }: Props) => {\n const { winds, characters, bamboos, dots, flowers, dragons } = tiles || {};\n return (\n \n Tiles\n \n There are 144 tiles in total, split into 3 suits, dragons, winds and\n flowers.\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
Winds\n {winds?.map((t, i) => (\n \n ))}\n x4
Dragons\n {dragons?.map((t, i) => (\n \n ))}\n x4
Characters\n {characters?.map((t, i) => (\n \n ))}\n x4
Bamboos\n {bamboos?.map((t, i) => (\n \n ))}\n x4
Dots\n {dots?.map((t, i) => (\n \n ))}\n x4
Flowers\n {flowers?.map((t, i) => (\n \n ))}\n x1
\n
\n );\n};\n\nexport default Tiles;\n","import React from \"react\";\nimport { PageDescription as Description } from \"../../../components/common/Page.styled\";\nimport { Td, RulesPanel as Panel } from \"./List.styled\";\n\nconst Melds = () => (\n \n
\n Melds\n \n Tiles can be melded together into sets which can form the basis of a\n standard winning hand with 5 melds and 1 eye.\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
ChowThree consecative tiles of the same suit
EyeTwo of the same tile
PongThree of the same tile
KongFour of the same tile
\n
\n);\n\nexport default Melds;\n","import React from \"react\";\nimport {\n GetRulesResponse,\n GetTilesResponse,\n Rule,\n} from \"../../../api/mahjong-api\";\nimport { FormattedMessage } from \"react-intl\";\nimport {\n ExampleItem,\n Examples,\n RuleBox,\n RuleDescription,\n RuleName,\n RulePoints,\n RuleRow,\n RuleTitle,\n} from \"./List.styled\";\nimport Hand from \"../list/Hand\";\nimport { Container } from \"../../../components/common/List.styled\";\nimport {\n Row,\n Col,\n Header,\n Backdrop,\n Panel,\n PageDescription as Description,\n} from \"../../../components/common/Page.styled\";\nimport { RulesPanel } from \"./List.styled\";\nimport Tiles from \"./Tiles\";\nimport Melds from \"./Melds\";\nimport { NavLink } from \"react-router-dom\";\nimport { ActionButton as Button } from \"../../../components/common/Buttons.styled\";\n\nexport type Props = {\n tiles?: GetTilesResponse;\n rules?: GetRulesResponse;\n};\n\nexport type RuleProps = {\n r: Rule;\n};\n\nconst RuleDisplay = ({ r }: RuleProps) => (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n {r.examples?.map((ec) => (\n \n \n \n ))}\n \n \n \n);\n\nexport const List = ({ rules, tiles }: Props) => {\n const meldRules = rules?.meldRules || [];\n const generalRules = rules?.generalRules || [];\n const specialRules = rules?.specialRules || [];\n return (\n \n \n
\n \n
\n \n \n \n \n
\n \n \n \n Scoring\n \n A winning hand must be either based on 5 melds and an eye or\n adhere to a special hand pattern.\n
\n Points are calculated by matching the winning hand to all the\n applicable rules and summed together.\n
\n
\n \n Try out scoring with our calculator.\n \n \n \n \n
\n \n \n \n Meld Rules\n \n These are rules based on one or multiple melds which follow a\n pattern. The melds can be concealed or revealed from capturing a\n discarded tile.\n \n \n {meldRules.map((r) => (\n \n ))}\n \n \n \n General Rules\n \n These apply to both meld based or special hands.\n \n \n {generalRules.map((r) => (\n \n ))}\n \n\n \n \n Special Rules\n \n These are special hands not based on standard melds that must be\n all concealed.\n \n \n {specialRules.map((r) => (\n \n ))}\n \n \n
\n
\n );\n};\nexport default List;\n","import styled from \"styled-components\";\n\nimport { getImageHeight } from \"./constants\";\n\nexport const Container = styled.div`\n padding: 0px 5px 0px 0px;\n display: inline-block;\n color: ${(props) => props.theme.primary} !important;\n height: ${(p) => `${getImageHeight(p.ratio)}px`};\n border-radius: ${(props: { ratio: number }) => `${props.ratio * 0.5}`}rem;\n &:hover {\n background-color: #dee4ed;\n box-shadow: 0 ${(props) => `${props.ratio * 9}`}px #999;\n }\n &:active {\n background-color: #dee4ed;\n box-shadow: 0 ${(props) => `${props.ratio * 5}`}px #666;\n transform: translateY(${(props) => `${props.ratio * 4}`}px);\n }\n`;\n","import React from \"react\";\n\nimport { Tile as ITile } from \"../../api/mahjong-api\";\nimport { Tile } from \"./Tile\";\n\nimport { Container } from \"./MeldButton.styled\";\n\ntype Props = {\n onClick?: () => void;\n tiles?: ITile[];\n ratio?: number;\n className?: string;\n};\n\nexport const MeldButton = ({\n onClick = () => {},\n tiles = [],\n ratio = 1,\n className = \"\",\n}: Props) => (\n \n {tiles &&\n tiles.map((t, i) => (\n \n ))}\n \n);\n","import styled from \"styled-components\";\n\nexport const Container = styled.div<{ active?: boolean; single?: boolean }>`\n border: solid;\n border-radius: 4px;\n border-color: ${({ active, theme }) => (active ? \"white\" : theme.primary)};\n flex-direction: column;\n display: flex;\n min-height: 4rem;\n margin: 0.2rem;\n flex-grow: ${({ single }) => (single ? 0 : 1)};\n`;\n\nexport const Name = styled.div<{ active?: boolean; single?: boolean }>`\n background-color: ${({ active, theme }) =>\n active ? \"white\" : theme.primary};\n color: black;\n font-size: 0.8rem;\n padding-left: ${({ single }) => (single ? \"0.2rem\" : \"1rem\")};\n padding-right: ${({ single }) => (single ? \"0.2rem\" : \"1rem\")};\n`;\n\nexport const Tiles = styled.div`\n display: flex;\n flex-wrap: wrap;\n padding: 0.3rem;\n`;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Container, Name, Tiles } from \"./Tray.styled\";\n\ntype TrayProps = {\n name: string;\n className?: string;\n children?: Object;\n isActive?: boolean;\n single?: boolean;\n onClick?: () => void;\n color?: string;\n};\n\nexport const Tray = ({\n children,\n name,\n single = false,\n onClick = () => {},\n isActive,\n}: TrayProps) => (\n \n \n \n \n {children}\n \n);\n","import React from \"react\";\nimport { MeldButton } from \"../../../../components/game/MeldButton\";\nimport { Tray } from \"./Tray\";\nimport { Meld } from \"../../../../api/mahjong-api\";\nimport { Section } from \"../constants\";\n\ntype Props = {\n melds: Meld[];\n onClick: (id: string) => void;\n onTrayClick: (id: Section) => void;\n isActive: boolean;\n};\n\nconst Melded = (props: Props) => (\n props.onTrayClick(Section.Melded)}\n isActive={props.isActive}\n >\n {props.melds.map((m, i) => (\n props.onClick(m.code)}\n />\n ))}\n \n);\n\nexport default Melded;\n","import styled from \"styled-components\";\nimport { Tile } from \"./Tile\";\n\nexport const TileButton = styled(Tile)<{ disabled?: boolean }>`\n &:hover {\n background-color: #dee4ed;\n box-shadow: 0 ${(props) => `${(props.ratio || 1) * 9}`}px #999;\n }\n &:active {\n background-color: #dee4ed;\n box-shadow: 0 ${(props) => `${(props.ratio || 1) * 5}`}px #666;\n transform: translateY(${(props) => `${(props.ratio || 1) * 4}`}px);\n }\n background-color: ${({ disabled }) => (disabled ? \"grey\" : \"none\")};\n`;\n\nexport const Test = styled(Tile)`\n background-color: #dee4ed;\n box-shadow: 10px -10px #999;\n &:active {\n background-color: #dee4ed;\n box-shadow: 0 ${(props) => `${(props.ratio || 1) * 5}`}px #666;\n transform: translateY(${(props) => `${(props.ratio || 1) * 4}`}px);\n }\n`;\n\nTileButton.defaultProps = {\n ratio: 1,\n};\n","import React from \"react\";\nimport { Tile } from \"../../../../api/mahjong-api\";\nimport { TileButton } from \"../../../../components/game/TileButton\";\nimport { SectionProps } from \"../Hand\";\nimport { Section } from \"../constants\";\nimport { Tray } from \"./Tray\";\n\ntype TilesProp = SectionProps & {\n tiles: Tile[];\n};\n\nconst Concealed = ({\n onClick,\n onTrayClick = () => {},\n isActive,\n tiles,\n}: TilesProp) => (\n onTrayClick(Section.Concealed)}\n isActive={isActive}\n >\n {tiles.map((t, i) => (\n onClick(i)}\n />\n ))}\n \n);\n\nexport default Concealed;\n","import React from \"react\";\nimport { Tile } from \"../../../../api/mahjong-api\";\nimport { TileButton } from \"../../../../components/game/TileButton\";\nimport { SectionProps } from \"../Hand\";\nimport { Section } from \"../constants\";\nimport { Tray } from \"./Tray\";\n\ntype TileProps = SectionProps & {\n tile?: Tile;\n};\n\nconst OutOn = ({\n tile,\n onClick = () => {},\n onTrayClick = () => {},\n isActive,\n}: TileProps) => {\n if (!tile) {\n return (\n onTrayClick(Section.OutOn)}\n isActive={isActive}\n />\n );\n }\n return (\n onTrayClick(Section.OutOn)}\n isActive={isActive}\n >\n onClick(tile.id)}\n />\n \n );\n};\n\nexport default OutOn;\n","import React from \"react\";\nimport { Tile } from \"../../../../api/mahjong-api\";\nimport { TileButton } from \"../../../../components/game/TileButton\";\nimport { SectionProps } from \"../Hand\";\nimport { Section } from \"../constants\";\nimport { Tray } from \"./Tray\";\n\ntype TilesProp = SectionProps & {\n tiles: Tile[];\n flowers: Tile[];\n};\n\nconst Flowers = ({ onClick, isActive, tiles, flowers }: TilesProp) => (\n \n {flowers.map((t, i) => (\n d.code).includes(t.code)}\n onClick={() => onClick(t.id)}\n />\n ))}\n \n);\n\nexport default Flowers;\n","import React from \"react\";\nimport { Wind } from \"../../../../api/mahjong-api\";\nimport { windCodes } from \"../../../../components/game/constants\";\nimport { TileButton } from \"../../../../components/game/TileButton\";\nimport { SectionProps } from \"../Hand\";\nimport { Tray } from \"./Tray\";\n\ntype WindProps = SectionProps & {\n wind: Wind;\n};\n\nconst SeatWind = ({ wind, isActive, onClick }: WindProps) => (\n \n {wind && (\n onClick(0)}\n />\n )}\n \n);\n\nexport default SeatWind;\n","import React from \"react\";\nimport { Wind } from \"../../../../api/mahjong-api\";\nimport { windCodes } from \"../../../../components/game/constants\";\nimport { TileButton } from \"../../../../components/game/TileButton\";\nimport { SectionProps } from \"../Hand\";\nimport { Tray } from \"./Tray\";\n\ntype WindProps = SectionProps & {\n wind: Wind;\n};\n\nconst RoundWind = ({ isActive = false, wind, onClick }: WindProps) => (\n \n {wind && (\n onClick(0)}\n code={windCodes.get(wind) || \"\"}\n />\n )}\n \n);\n\nexport default RoundWind;\n","import styled from \"styled-components\";\n\nexport const Row = styled.div`\n display: flex;\n flex-direction: row;\n align-content: stretch;\n flex-wrap: wrap;\n`;\n\nexport const Container = styled.div`\n display: flex;\n flex-direction: column;\n padding: 0.5rem;\n`;\n","import React from \"react\";\n\nimport { GetTilesResponse, Meld, Tile, Wind } from \"../../../api/mahjong-api\";\nimport { Section } from \"./constants\";\nimport MeldedSection from \"./sections/Melded\";\nimport ConcealedSection from \"./sections/Concealed\";\nimport OutOnSection from \"./sections/OutOn\";\nimport FlowersSection from \"./sections/Flowers\";\nimport SeatWindSection from \"./sections/SeatWind\";\nimport RoundWindSection from \"./sections/RoundWind\";\nimport { Container, Row } from \"./Hand.styled\";\nimport { nextWind } from \"../../../components/game/constants\";\n\nexport type TileSelected = (s: Section, id: number) => void;\n\nexport type SectionProps = {\n onClick: (id: number) => void;\n onTrayClick?: (id: Section) => void;\n isActive?: boolean;\n};\n\ntype Props = {\n flowers?: Tile[];\n melded?: Meld[];\n concealed?: Tile[];\n outOn?: Tile;\n onMeldClick?: (id: string) => void;\n onTileClick?: TileSelected;\n showEmptyTray?: boolean;\n seatWind?: Wind;\n roundWind?: Wind;\n tiles?: GetTilesResponse;\n onTrayClick?: (id: Section) => void;\n setRoundWind?: (wind: Wind) => void;\n setSeatWind?: (wind: Wind) => void;\n setFlowers?: (flowers: Tile[]) => void;\n activeSection?: string;\n};\n\nconst Hand = ({\n seatWind = Wind.East,\n roundWind = Wind.East,\n activeSection = Section.Concealed,\n melded = [],\n flowers = [],\n concealed = [],\n outOn = undefined,\n tiles,\n onMeldClick = () => {},\n onTrayClick = () => {},\n onTileClick = () => {},\n setRoundWind = () => {},\n setSeatWind = () => {},\n setFlowers = () => {},\n}: Props) => (\n \n \n setRoundWind(nextWind.get(roundWind) || Wind.East)}\n />\n setSeatWind(nextWind.get(seatWind) || Wind.East)}\n />\n {\n const found = flowers.find((f) => f.id === id);\n if (found) {\n const remaining = flowers.filter((f) => f.id !== id);\n setFlowers(remaining);\n } else {\n const add = tiles?.flowers.find((f) => f.id === id);\n if (add) {\n const added = flowers.concat([add]);\n setFlowers(added);\n }\n }\n }}\n />\n \n \n \n \n \n onTileClick(Section.Concealed, i)}\n onTrayClick={onTrayClick}\n />\n onTileClick(Section.OutOn, i)}\n onTrayClick={onTrayClick}\n />\n \n \n);\n\nexport default Hand;\n","import styled from \"styled-components\";\n\nexport const Board = styled.div`\n height: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n flex-grow: 0;\n`;\n\nexport const SideBoard = styled.div`\n height: 100%;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: center;\n flex-grow: 0;\n padding-bottom: 1rem;\n`;\n\nexport const Row = styled.div`\n height: 100%;\n display: flex;\n flex-direction: row;\n justify-content: center;\n flex-grow: 0;\n`;\n\nexport const Pad = styled.div`\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: center;\n width: 120px;\n`;\n\nexport const ButtonGroup = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n padding: 4px 16px;\n color: #00291f;\n letter-spacing: 1.25px;\n border-radius: 4px;\n border: none;\n`;\n","import React from \"react\";\n\nimport { MeldKind } from \"../../../../api/mahjong-api\";\nimport { Button } from \"../../../../components/common/Buttons.styled\";\nimport { ButtonGroup } from \"./TileBoard.styled\";\n\ntype Props = {\n meldKind: MeldKind;\n activeButtonClick: (type: MeldKind) => void;\n};\n\nexport const MeldTypeButtons = ({ meldKind, activeButtonClick }: Props) => (\n \n activeButtonClick(MeldKind.Chow)}\n >\n {MeldKind.Chow}\n \n activeButtonClick(MeldKind.Pung)}\n >\n {MeldKind.Pung}\n \n activeButtonClick(MeldKind.Kong)}\n >\n {MeldKind.Kong}\n \n \n);\n","import React from \"react\";\nimport { TileButton } from \"../../../../components/game/TileButton\";\n\nimport { Tile } from \"../../../../api/mahjong-api\";\n\ntype TileListProps = {\n tiles: Tile[];\n onClick: (tile: Tile) => void;\n};\n\nconst InputRow = (props: TileListProps) => (\n <>\n {props.tiles.map((t, i) => (\n props.onClick(t)}\n ratio={0.5}\n />\n ))}\n \n);\n\nexport default InputRow;\n","import React, { useState } from \"react\";\nimport { FormattedMessage } from \"react-intl\";\n\nimport { GetTilesResponse, MeldKind, Tile } from \"../../../../api/mahjong-api\";\nimport { ActionButton } from \"../../../../components/common/Buttons.styled\";\nimport { Card } from \"../../../../components/common/Page.styled\";\nimport { Section } from \"../constants\";\nimport { MeldTypeButtons } from \"./MeldTypeButtons\";\nimport { Board, Pad, SideBoard } from \"./TileBoard.styled\";\nimport InputRow from \"./InputRow\";\n\nexport type Selection = {\n tile: Tile;\n kind?: MeldKind;\n};\n\ntype Props = {\n tiles: GetTilesResponse;\n section: Section;\n onClick: (tile: Selection) => void;\n onCalculate: () => void;\n};\n\nexport const TileBoard = ({\n tiles: { winds, characters, bamboos, dots, dragons },\n onClick,\n onCalculate,\n}: Props) => {\n const [kind, setKind] = useState(MeldKind.Pung);\n\n const onTileClick = (tile: Tile) => onClick({ tile, kind });\n return (\n \n setKind(m)} />\n\n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n );\n};\n","import {\n GetTilesResponse,\n Kind,\n Meld,\n MeldKind,\n Tile,\n} from \"../../api/mahjong-api\";\n\nexport const createPung = (tile: Tile): Meld => ({\n tiles: [tile, tile, tile],\n code: `${tile.code}${tile.code}${tile.code}`,\n meldKind: MeldKind.Pung,\n});\n\nexport const createKong = (tile: Tile): Meld => ({\n tiles: [tile, tile, tile, tile],\n code: `${tile.code}${tile.code}${tile.code}${tile.code}`,\n meldKind: MeldKind.Kong,\n});\n\nexport const createChow = (tile: Tile, all: GetTilesResponse): Meld => {\n const second = getNextTile(tile, all);\n const third = getNextTile(second, all);\n return {\n tiles: [tile, second, third],\n code: `${tile.code}${second.code}${third.code}`,\n meldKind: MeldKind.Chow,\n };\n};\n\nexport const getNextNumber = (i: number) => (i < 9 ? i + 1 : 1);\n\nexport const getNextTile = (tile: Tile, all: GetTilesResponse) => {\n switch (tile.kind) {\n case Kind.Bamboo: {\n return all.bamboos[getNextNumber(tile.number || 1) - 1];\n }\n case Kind.Dot: {\n return all.dots[getNextNumber(tile.number || 1) - 1];\n }\n case Kind.Character: {\n return all.characters[getNextNumber(tile.number || 1) - 1];\n }\n }\n return tile;\n};\n","import styled from \"styled-components\";\n\nexport const Frame = styled.div`\n padding: 1rem 1rem;\n display: flex;\n flex-direction: column;\n flex: 1;\n font-weight: normal;\n`;\n\nexport const Table = styled.table`\n margin-top: 0.5rem;\n min-width: 300px;\n padding: 1rem;\n background-color: rgba(0, 0, 0, 0.4);\n color: white;\n`;\n\nexport const Tr = styled.tr``;\nexport const Td = styled.td``;\nexport const THead = styled.thead``;\n","import React from \"react\";\nimport { CellProps, useTable } from \"react-table\";\nimport { FormattedMessage } from \"react-intl\";\nimport { HandResult, PatternMatchResult } from \"../../api/mahjong-api\";\nimport { Table, THead, Tr, Td } from \"./PointsBreakdown.styled\";\n\ntype Props = {\n result?: HandResult;\n};\n\nfunction compare(a: PatternMatchResult, b: PatternMatchResult) {\n if (a.points < b.points) {\n return 1;\n }\n if (a.points > b.points) {\n return -1;\n }\n return 0;\n}\n\nexport const PointsBreakdown = ({\n result = { matchedRules: [] },\n}: Props) => {\n const data = React.useMemo(\n () => [...(result?.matchedRules || [])].sort(compare),\n [result.matchedRules]\n );\n\n const columns = React.useMemo(\n () => [\n {\n Header: ,\n id: \"points\",\n Cell: (r: CellProps) => r.row.original.points,\n },\n {\n Header: \"Rule\",\n id: \"rule\",\n Cell: (r: CellProps) => ,\n },\n ],\n []\n );\n\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =\n useTable({\n columns,\n data,\n });\n\n return (\n \n \n {headerGroups.map((headerGroup) => (\n \n {headerGroup.headers.map((column) => (\n \n ))}\n \n ))}\n \n \n {rows.map((row, i) => {\n prepareRow(row);\n return (\n \n {row.cells.map((cell) => {\n return ;\n })}\n \n );\n })}\n \n
{column.render(\"Header\")}
{cell.render(\"Cell\")}
\n );\n};\n","import React from \"react\";\nimport { WideItem as Item, Col } from \"../../components/common/Page.styled\";\nimport { SwipeUp } from \"@styled-icons/fluentui-system-filled/\";\nimport { CursorClick } from \"@styled-icons/heroicons-outline/\";\nimport { FormattedMessage } from \"react-intl\";\n\nexport enum DiscardStyle {\n Gesture,\n Tap,\n}\n\ntype Props = {\n style?: DiscardStyle;\n updateDiscardStyle?: (l: DiscardStyle) => void;\n};\n\nexport const DiscardStyleSelector = ({\n style,\n updateDiscardStyle = () => {},\n}: Props) => (\n \n updateDiscardStyle(DiscardStyle.Gesture)}\n >\n \n \n updateDiscardStyle(DiscardStyle.Tap)}\n >\n \n \n \n);\n\nexport default DiscardStyleSelector;\n","import styled from \"styled-components\";\n\nexport const InputPanel = styled.div`\n display: flex;\n flex-direction: column;\n align-items: stretch;\n align-content: flex-start;\n`;\n","import React, { useEffect, useState } from \"react\";\n\nimport {\n CreateCalculationRequest,\n Calculation,\n GetTilesResponse,\n Meld,\n MeldKind,\n Tile,\n Wind,\n} from \"../../../api/mahjong-api\";\nimport Hand from \"./Hand\";\nimport { TileBoard, Selection } from \"./input/TileBoard\";\nimport { Button } from \"../../../components/common/Buttons.styled\";\nimport { Section } from \"./constants\";\nimport { Card, Row } from \"../../../components/common/Page.styled\";\nimport { createChow, createKong, createPung } from \"../melding\";\nimport { PointsBreakdown } from \"../../../components/game/PointsBreakdown\";\nimport { InputPanel } from \"./Calculator.styled\";\n\nexport type Props = {\n data?: Calculation;\n tiles: GetTilesResponse;\n title?: string;\n callToAction?: (req: CreateCalculationRequest) => void;\n};\n\nconst Calculator = ({ tiles, data, callToAction = () => {} }: Props) => {\n const [isEdit, setIsEdit] = useState(\n data?.result === null || data?.result === undefined\n );\n const [concealed, setConcealed] = useState(\n data?.hand.concealed || []\n );\n const [flowers, setFlowers] = useState(data?.hand.flowers || []);\n const [melded, setMelded] = useState(data?.hand.melded || []);\n const [outOn, setOutOn] = useState(data?.outOn);\n const [seatWind, setSeatWind] = useState(data?.seatWind || Wind.East);\n const [roundWind, setRoundWind] = useState(\n data?.roundWind || Wind.East\n );\n const [section, setSection] = useState
(Section.Concealed);\n\n useEffect(() => {\n setConcealed(data?.hand?.concealed || []);\n setFlowers(data?.hand?.flowers || []);\n setMelded(data?.hand?.melded || []);\n setOutOn(data?.outOn);\n setSeatWind(data?.seatWind || Wind.East);\n setRoundWind(data?.roundWind || Wind.East);\n setIsEdit(data?.result === null || data?.result === undefined);\n }, [data]);\n\n const onTileBoardClicked = ({ tile, kind }: Selection) => {\n switch (section) {\n case Section.Concealed:\n setConcealed(concealed.concat(tile));\n break;\n case Section.Flowers:\n setFlowers(flowers.concat(tile));\n break;\n case Section.Melded:\n if (kind === MeldKind.Pung) {\n const pong = createPung(tile);\n setMelded(melded.concat(pong));\n } else if (kind === MeldKind.Kong) {\n const kong = createKong(tile);\n setMelded(melded.concat(kong));\n } else if (kind === MeldKind.Chow) {\n const chow = createChow(tile, tiles);\n setMelded(melded.concat(chow));\n }\n break;\n case Section.OutOn:\n setOutOn(tile);\n break;\n }\n };\n const onTrayClick = (s: Section) => {\n setSection(s);\n };\n const onSaveClick = () => {\n if (outOn) {\n callToAction({\n outOn,\n flowers,\n concealed,\n melded,\n seatWind,\n roundWind,\n });\n }\n };\n const onRemoveTileClick = (s: Section, index: number) => {\n switch (s) {\n case Section.Concealed:\n const remaining = concealed.filter((t, i) => i !== index);\n setConcealed(remaining);\n break;\n case Section.OutOn:\n setOutOn(undefined);\n break;\n }\n };\n\n const onRemoveMeldClick = (meld: string) => {\n switch (section) {\n case Section.Melded:\n const remaining = melded.filter((m) => m.code !== meld);\n setMelded(remaining);\n break;\n }\n };\n\n return (\n \n \n \n {isEdit ? (\n \n ) : (\n \n \n \n \n )}\n \n \n );\n};\n\nexport default Calculator;\n","import SlidingPane from \"react-sliding-pane\";\nimport styled from \"styled-components\";\n\nexport const Pane = styled(SlidingPane)`\n background-color: #282828;\n\n & .slide-pane__header {\n background: #282828;\n }\n\n & .slide-pane__content {\n padding-left: 2rem;\n padding-right: 2rem;\n padding-top: 0;\n padding-bottom: 0;\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n }\n\n & .slide-pane__title {\n text-transform: uppercase;\n font-size: 2rem;\n padding-left: 5rem;\n color: ${({ theme }) => theme.primary};\n }\n`;\n","import React from \"react\";\nimport { Footer, Page } from \"../../components/common/Page.styled\";\nimport List, { Props as ListProps } from \"./list/List\";\nimport Rules from \"./rules/List\";\nimport { ActionButton as Button } from \"../../components/common/Buttons.styled\";\nimport { FormattedMessage } from \"react-intl\";\nimport Calculator, { Props as CreateProps } from \"./create/Calculator\";\nimport {\n GetRulesResponse,\n UpdateCalculationRequest,\n} from \"../../api/mahjong-api\";\nimport { Pane } from \"../../components/common/Sliding.styled\";\nimport { NavigateFunction, Route, Routes } from \"react-router-dom\";\nimport { Helmet } from \"react-helmet-async\";\n\ntype Props = CreateProps &\n ListProps & {\n rules?: GetRulesResponse;\n navigate?: NavigateFunction;\n update?: (req: UpdateCalculationRequest) => void;\n };\n\nconst Scoring = ({\n tiles,\n rules,\n navigate = () => {},\n callToAction: create,\n update,\n deleteSample,\n editSample,\n data,\n examples,\n}: Props) => (\n \n \n Mahjong Spot - Scoring\n \n \n \n }\n onRequestClose={() => {\n navigate(\"/scoring/examples\");\n }}\n >\n \n \n }\n />\n }\n onRequestClose={() => {\n navigate(\"/scoring/examples\");\n }}\n >\n \n \n }\n />\n \n \n \n \n
\n \n\n \n
\n \n }\n />\n } />\n
\n
\n);\n\nexport default Scoring;\n","import { createApi, fetchBaseQuery } from \"@reduxjs/toolkit/query/react\";\nimport {\n Calculation,\n CreateCalculationRequest,\n CreateCalculationResponse,\n FindCalculationsResponse,\n GetRulesResponse,\n GetTilesResponse,\n UpdateCalculationRequest,\n} from \"../../api/mahjong-api\";\n\nconst apiUrl = window._env_.API_URL;\nconst tag = \"Calculations\";\n// Define a service using a base URL and expected endpoints\nexport const calculationApi = createApi({\n reducerPath: \"calculationsApi\",\n tagTypes: [tag],\n baseQuery: fetchBaseQuery({\n baseUrl: `${apiUrl}/api/calculations`,\n }),\n endpoints: (builder) => ({\n getAllTiles: builder.query({\n query: () => `/tiles`,\n }),\n getAllRules: builder.query({\n query: () => `/rules`,\n }),\n getAllCalculations: builder.query({\n query: () => ``,\n providesTags: (result) => {\n const { calculations } = result || {};\n return calculations\n ? [\n ...calculations.map(({ id }) => ({ type: tag, id } as const)),\n { type: tag, id: \"LIST\" },\n ]\n : [{ type: tag, id: \"LIST\" }];\n },\n }),\n getCalculationById: builder.query({\n query: (id) => `/${id}`,\n providesTags: (result, error, id) => [{ type: tag, id }],\n }),\n createCalculation: builder.mutation<\n CreateCalculationResponse,\n CreateCalculationRequest\n >({\n query: (body) => ({\n url: ``,\n body,\n method: \"POST\",\n headers: { clientId: \"test\" },\n }),\n invalidatesTags: [{ type: tag, id: \"LIST\" }],\n }),\n updateCalculation: builder.mutation({\n query: (body) => ({\n url: ``,\n body,\n method: \"PUT\",\n headers: { clientId: \"test\" },\n }),\n invalidatesTags: (result, error, { id }) => [{ type: tag, id }],\n }),\n deleteCalculation: builder.mutation({\n query: (id) => ({\n url: `/${id}`,\n method: \"DELETE\",\n headers: { clientId: \"test\" },\n }),\n invalidatesTags: (result, error, id) => [{ type: tag, id }],\n }),\n calculate: builder.mutation({\n query: (body) => ({\n url: `/calculate`,\n method: \"POST\",\n body,\n headers: { clientId: \"test\" },\n }),\n }),\n }),\n});\n\n// Export hooks for usage in functional components, which are\n// auto-generated based on the defined endpoints\nexport const {\n useGetAllCalculationsQuery,\n useGetCalculationByIdQuery,\n useGetAllRulesQuery,\n useGetAllTilesQuery,\n useCreateCalculationMutation,\n useUpdateCalculationMutation,\n useDeleteCalculationMutation,\n useCalculateMutation,\n} = calculationApi;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { PanelContent } from \"./Page.styled\";\n\nconst Loader = () => (\n \n \n \n);\nexport default Loader;\n","import React from \"react\";\nimport \"react-sliding-pane/dist/react-sliding-pane.css\";\nimport { useMatch, useNavigate } from \"react-router-dom\";\nimport Scoring from \"./Scoring\";\nimport {\n useCreateCalculationMutation,\n useDeleteCalculationMutation,\n useGetAllCalculationsQuery,\n useGetAllRulesQuery,\n useGetAllTilesQuery,\n useGetCalculationByIdQuery,\n useUpdateCalculationMutation,\n} from \"./service\";\nimport Loader from \"../../components/common/Loader\";\nimport {\n CreateCalculationRequest,\n UpdateCalculationRequest,\n} from \"../../api/mahjong-api\";\n\nconst Container = () => {\n const navigate = useNavigate();\n const match = useMatch(\"/scoring/examples/edit/:calculationId\");\n const editId = +(match?.params.calculationId || \"\");\n const { isLoading: isFindLoading, data: findResponse } =\n useGetAllCalculationsQuery();\n const [deleteSample, deleteStatus] = useDeleteCalculationMutation();\n const [updateSample, updateStatus] = useUpdateCalculationMutation();\n const [createSample, createStatus] = useCreateCalculationMutation();\n const { isLoading: isTileLoading, data: tiles } = useGetAllTilesQuery();\n const { isLoading: isRulesLoading, data: rulesResponse } =\n useGetAllRulesQuery();\n const { isLoading: isGetLoading, data: getResponse } =\n useGetCalculationByIdQuery(editId, { skip: !editId });\n\n const handleCreate = async (payload: CreateCalculationRequest) => {\n const response = await createSample(payload).unwrap();\n navigate(`/scoring/examples/edit/${response.id}`);\n };\n\n const handleUpdate = async (payload: UpdateCalculationRequest) => {\n await updateSample(payload);\n navigate(\"/scoring/examples\");\n };\n if (\n createStatus.isLoading ||\n updateStatus.isLoading ||\n deleteStatus.isLoading ||\n isFindLoading ||\n isTileLoading ||\n isRulesLoading ||\n isGetLoading\n ) {\n return ;\n }\n\n const requests = findResponse?.calculations || [];\n\n return tiles ? (\n handleCreate({ ...data })}\n update={(data) => handleUpdate({ ...data, id: +editId })}\n deleteSample={(id) => deleteSample(id)}\n editSample={(id: number) => navigate(`examples/edit/${id}`)}\n examples={requests}\n />\n ) : null;\n};\n\nexport default Container;\n","export default __webpack_public_path__ + \"static/media/t9batty.980d7df8.png\";","export default __webpack_public_path__ + \"static/media/t9dog1.f257c391.png\";","export default __webpack_public_path__ + \"static/media/t9ducky.2faad680.png\";","export default __webpack_public_path__ + \"static/media/t9elephant.3b10df35.png\";","export default __webpack_public_path__ + \"static/media/t9foxy.e645db7e.png\";","export default __webpack_public_path__ + \"static/media/t9froggy.1498a2e9.png\";","export default __webpack_public_path__ + \"static/media/t9kitty.ba44775b.png\";","import styled from \"styled-components\";\n\nimport bat from \"./t9batty.png\";\nimport dog from \"./t9dog1.png\";\nimport duck from \"./t9ducky.png\";\nimport elephant from \"./t9elephant.png\";\nimport fox from \"./t9foxy.png\";\nimport frog from \"./t9froggy.png\";\nimport kitty from \"./t9kitty.png\";\nimport lion from \"./t9lion.png\";\nimport panda from \"./t9panda.png\";\nimport penguin from \"./t9penguin.png\";\n\nexport const idMap: { [id: string]: string } = {\n \"bot-t9lion\": lion,\n \"bot-t9batty\": bat,\n \"bot-t9dog1\": dog,\n \"bot-t9ducky\": duck,\n \"bot-t9elephant\": elephant,\n \"bot-t9foxy\": fox,\n \"bot-t9froggy\": frog,\n \"bot-t9kitty\": kitty,\n \"bot-t9panda\": panda,\n \"bot-t9penguin\": penguin,\n};\n\nexport const Icon = styled.div<{\n id: string;\n ratio?: number;\n}>`\n background-image: ${(props) => `url(${idMap[props.id]})`};\n padding: 0px;\n width: 6rem;\n height: 6rem;\n background-size: cover;\n display: inline-block;\n background-color: #ffffff;\n border: \"1px solid rgba(40, 167, 69, 0.5\";\n border-radius: ${(props) => `${(props.ratio || 1) * 0.5}`}rem;\n display: flex;\n flex-direction: column-reverse;\n`;\n","export default __webpack_public_path__ + \"static/media/t9lion.49ec4b57.png\";","export default __webpack_public_path__ + \"static/media/t9panda.1789cbf3.png\";","export default __webpack_public_path__ + \"static/media/t9penguin.67a6f0f8.png\";","import styled from \"styled-components\";\n\nexport const Image = styled.img<{\n ratio?: number;\n}>`\n width: ${(props) => `${6 * (props.ratio || 1)}rem`};\n height: ${(props) => `${6 * (props.ratio || 1)}rem`};\n object-fit: fill;\n user-select: none;\n`;\n","import styled from \"styled-components\";\n\nexport const IconBack = styled.div`\n background-color: transparent;\n padding: 0.3rem;\n`;\n\nexport const Overlay = styled.div`\n bottom: 1rem;\n position: absolute;\n z-index: 100;\n width: 87%;\n`;\n","import React from \"react\";\nimport { idMap } from \"../../components/common/icon/Icon\";\nimport { Image } from \"../../components/common/Image.styled\";\nimport { UserCircle } from \"@styled-icons/boxicons-regular\";\nimport { IconBack, Overlay } from \"./Avatar.styled\";\n\nexport type Props = {\n ratio?: number;\n image?: string;\n children?: JSX.Element | JSX.Element[];\n};\n\nconst Avatar = ({ image = \"\", ratio = 1, children }: Props) => {\n return (\n \n {image && image.includes(\"bot\") && (\n \"\"\n )}\n {image && !image.includes(\"bot\") && (\n \n )}\n {!image && }\n {children}\n \n );\n};\nexport default Avatar;\n","import styled from \"styled-components\";\n\nexport const Container = styled.div`\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n min-width: 120px;\n`;\n","import React from \"react\";\nimport Avatar from \"../game/Avatar\";\nimport { MatchClient } from \"../../api/mahjong-api\";\nimport { Container } from \"./Players.styled\";\n\nexport type Props = {\n players?: MatchClient[];\n};\n\nexport const Players = ({ players = [] }: Props) => {\n const openSlots = 4 - players.length;\n return (\n \n {players?.map((p) => (\n \n ))}\n {Array(openSlots)\n .fill(openSlots)\n .map((os, i) => (\n
OPEN
\n ))}\n
\n );\n};\n\nexport default Players;\n","import styled from \"styled-components\";\n\nexport const Section = styled.div`\n border-radius: 0.4rem;\n color: black;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n flex-grow: 1;\n border-style: solid;\n border-width: 1px;\n border-color: ${({ theme }) => theme.primary};\n margin: 0.5rem;\n`;\n\nexport const ActionSection = styled(Section)`\n width: 17rem;\n`\n\nexport const SectionName = styled.div`\n padding-left: 1rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n background-color: ${({ theme }) => theme.primary};\n border-top-left-radius: 0.4rem;\n border-top-right-radius: 0.4rem;\n color: black;\n display: flex;\n`;\n\nexport const SectionBody = styled.div`\n color: white;\n text-transform: none;\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n`;\nexport const Main = styled.div`\n display: flex;\n flex-direction: column;\n overflow-y: scroll;\n flex-wrap: wrap-reverse;\n flex-grow: 2;\n`;\n\nexport const MatchList = styled.div`\n display: flex;\n flex-direction: column;\n flex-grow: 3;\n`;\n\nexport const ActionList = styled.div`\n display: flex;\n flex-direction: row;\n flex-grow: 1;\n justify-content: center;\n flex-wrap: wrap;\n`;\n\nexport const ActionDesc = styled.div`\n width: 230px;\n font-size: 0.75rem;\n padding: 0.5rem;\n`;\n\nexport const Info = styled.div`\n font-size: 0.75rem;\n`;\n","import styled from \"styled-components\";\n\nexport const DetailsText = styled.div`\n font-family: ${({ theme }) => theme.text};\n text-transform: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n display: flex;\n margin: 0.2rem;\n font-weight: 100;\n`;\n\nexport const Wrapper = styled.div`\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n justify-content: space-around;\n`","import React from \"react\";\nimport { Match } from \"../../api/mahjong-api\";\nimport { FormattedMessage } from \"react-intl\";\nimport { DetailsText, Wrapper } from \"./Details.styled\";\n\nexport type Props = {\n match?: Match;\n};\n\nexport const MatchDetails = ({ match }: Props) => {\n const rounds = match?.settings?.totalRounds || 0;\n return (\n \n {match?.name}\n {match?.status}\n \n {rounds} {\" \"}\n {rounds > 1 ? : }\n \n \n );\n};\n\nexport default MatchDetails;\n","import React from \"react\";\nimport { Match } from \"../../api/mahjong-api\";\nimport {\n Container,\n Table,\n Tr,\n Td,\n THead,\n} from \"../../components/common/List.styled\";\nimport { useTable, CellProps } from \"react-table\";\nimport { FormattedMessage } from \"react-intl\";\nimport Players from \"./Players\";\nimport { ArrowRightCircle } from \"@styled-icons/bootstrap\";\nimport { Info } from \"./Lobby.styled\";\nimport Details from \"./Details\";\n\nexport type Props = {\n matches: Match[];\n viewMatch?: (id: number) => void;\n deleteMatch?: (id: number) => void;\n};\n\nexport const List = ({\n matches,\n viewMatch = () => {},\n deleteMatch = () => {},\n}: Props) => {\n const data = React.useMemo(() => matches, [matches]);\n const columns = React.useMemo(\n () => [\n {\n Header: ,\n id: \"id\",\n Cell: (r: CellProps) => {r.row.original.id || \"\"},\n },\n {\n Header: ,\n id: \"name\",\n Cell: (r: CellProps) =>
,\n },\n {\n Header: ,\n id: \"players\",\n Cell: (r: CellProps) => (\n \n ),\n },\n {\n Header: \"...\",\n id: \"action\",\n Cell: (r: CellProps) => ,\n },\n ],\n []\n );\n\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =\n useTable({\n columns,\n data,\n });\n return (\n \n \n \n {headerGroups.map((headerGroup) => (\n \n {headerGroup.headers.map((column) => (\n \n ))}\n \n ))}\n \n \n {rows.map((row, i) => {\n prepareRow(row);\n return (\n viewMatch(row.original.id || 0)}\n >\n {row.cells.map((cell) => {\n return (\n \n );\n })}\n \n );\n })}\n \n
{column.render(\"Header\")}
{cell.render(\"Cell\")}
\n
\n );\n};\nexport default List;\n","import styled from \"styled-components\";\n\nexport const Input = styled.input`\n display: block;\n box-sizing: border-box;\n width: 100%;\n border-radius: 4px;\n border: 1px solid green;\n padding: 10px 15px;\n font-size: 1.5rem;\n`;\n\nexport const Label = styled.label`\n line-height: 2;\n text-align: left;\n display: block;\n margin-bottom: 0px;\n margin-top: 0px;\n color: white;\n font-size: 1rem;\n`;\n\nexport const Select = styled.select`\n width: 100%;\n height: 35px;\n background: white;\n color: gray;\n padding-left: 5px;\n font-size: 14px;\n border: none;\n border-radius: 4px;\n\n option {\n color: black;\n background: white;\n display: flex;\n white-space: pre;\n min-height: 20px;\n padding: 0px 2px 1px;\n }\n`;\n","import styled from \"styled-components\";\n\nexport const Player = styled.div`\n font-size: 1rem;\n padding-bottom: 0.5rem;\n`;\n\nexport const Spot = styled.div`\n border: solid;\n border-color: ${({ theme }) => theme.primary};\n border-radius: 4px;\n border-width: 4px;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 0.5rem;\n width: 8rem;\n`;\n\nexport const Players = styled.div`\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: space-around;\n padding-top: 0.5rem;\n`;\n\nexport const Select = styled.select`\n display: flex;\n border-radius: 4px;\n font-size: 1.5rem;\n padding: 10px 15px;\n width: 100%;\n`;\n\nexport const Label = styled.label`\n display: flex;\n font-size: 1.7rem;\n`;\n\nexport const Table = styled.table`\n width: 80%;\n`;\n\nexport const ViewLabel = styled.div`\n background-color: ${({ theme }) => theme.primary};\n color: black;\n text-transform: uppercase;\n font-size: 0.8rem;\n margin-bottom: 0.5rem;\n width: 16rem;\n white-space: nowrap;\n padding: 0.2rem;\n`;\n","import React from \"react\";\nimport { useForm, SubmitHandler } from \"react-hook-form\";\nimport { CreateMatchRequest } from \"../../api/mahjong-api\";\nimport {\n Card,\n Col,\n MainPanel,\n Panel,\n} from \"../../components/common/Page.styled\";\nimport { ActionButton as Button } from \"../../components/common/Buttons.styled\";\nimport { Input } from \"../../components/common/Form.styled\";\nimport { FormattedMessage } from \"react-intl\";\nimport { ViewLabel as Label, Select } from \"./Create.styled\";\n\nexport type Props = {\n data?: CreateMatchRequest;\n createMatch?: (req: CreateMatchRequest) => void;\n};\n\nconst Create = ({\n data = {\n turnTime: 10,\n name: \"\",\n rounds: 1,\n openSpots: 3,\n minPoints: 1,\n replayDealerWins: false,\n },\n createMatch = () => {},\n}: Props) => {\n const { register, handleSubmit } = useForm({\n defaultValues: { ...data },\n });\n const onSubmit: SubmitHandler = (data) => {\n createMatch(data);\n };\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Create;\n","import styled from \"styled-components\";\n\nexport const PlayerName = styled.div`\n font-family: ${({ theme }) => theme.text};\n text-transform: none;\n white-space: nowrap;\n text-overflow: ellipsis;\n display: flex;\n margin: 0.2rem;\n font-weight: 100;\n`;","import React from \"react\";\nimport { Match as IMatch } from \"../../api/mahjong-api\";\nimport {\n Panel,\n Col,\n MainPanel,\n Card,\n} from \"../../components/common/Page.styled\";\nimport { ActionButton as Button } from \"../../components/common/Buttons.styled\";\nimport { FormattedDate, FormattedMessage, FormattedTime } from \"react-intl\";\nimport { PlayerMap } from \"../game/Game\";\nimport { Player, Players, Spot } from \"./Create.styled\";\nimport Avatar from \"../game/Avatar\";\nimport { ViewLabel as Label } from \"./Create.styled\";\nimport { PlayerName } from \"./View.styled\";\n\nexport type Props = {\n match: IMatch;\n playerMap?: PlayerMap;\n joinMatch?: () => void;\n startMatch?: () => void;\n playMatch?: () => void;\n canJoin?: boolean;\n canStart?: boolean;\n canPlay?: boolean;\n};\n\nconst Match = ({\n match,\n playerMap = {},\n joinMatch = () => {},\n startMatch = () => {},\n playMatch = () => {},\n canJoin = false,\n canStart = false,\n canPlay = false,\n}: Props) => {\n const { name, settings, createdAt, clients } = match;\n const v = clients || [];\n return (\n \n \n \n \n {v.map((c, i) => (\n \n \n \n \n \n {playerMap[c.clientId]?.name || \"Guest\"}\n \n ))}\n \n \n \n \n \n {name}\n \n \n \n {settings?.totalRounds}\n \n \n \n {\" \"}\n \n \n \n {canJoin && (\n \n )}\n {canPlay && (\n \n )}\n {canStart && (\n \n )}\n \n \n \n \n );\n};\n\nexport default Match;\n","import styled from \"styled-components\";\n\nexport const Small = styled.div`\n width: 2rem;\n font-size: 0.5rem;\n`;\n\nexport const Motd = styled.div`\n display: flex;\n flex-direction: row;\n align-items: center;\n justify-content: center;\n`;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\n\nimport {\n ActionButton as Button,\n } from \"../Buttons.styled\";\nimport { Motd, Small } from \"./MotdButton.styled\";\n\ntype Props = {\n onClick?: () => void;\n}\n\nconst MotdButton = ({onClick = () => {}}: Props) => (\n \n);\n\nexport default MotdButton;","import React from \"react\";\nimport \"react-sliding-pane/dist/react-sliding-pane.css\";\nimport List from \"./List\";\nimport Create from \"./Create\";\nimport View from \"./View\";\nimport { ActionButton as Button } from \"../../components/common/Buttons.styled\";\nimport { Description, Module } from \"../../components/common/Page.styled\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Pane } from \"../../components/common/Sliding.styled\";\nimport { CreateMatchRequest } from \"../../api/mahjong-api\";\nimport { Props as ViewProps } from \"./View\";\nimport { Props as CreateProps } from \"./Create\";\nimport { Props as ListProps } from \"./List\";\nimport { PlayerMap } from \"../game/Game\";\nimport {\n ActionList,\n Main,\n MatchList,\n Section,\n ActionSection,\n SectionBody,\n SectionName,\n} from \"./Lobby.styled\";\nimport { NavigateFunction, NavLink } from \"react-router-dom\";\nimport { Helmet } from \"react-helmet-async\";\nimport MotdButton from \"../../components/common/buttons/MotdButton\";\n\ntype Props = ViewProps &\n CreateProps &\n ListProps & {\n isOpen?: boolean;\n isView?: boolean;\n matchPlayers?: PlayerMap;\n navigate?: NavigateFunction;\n playVsBots?: () => void;\n };\nconst Lobby = ({\n isOpen = false,\n isView = false,\n canJoin = false,\n canPlay = false,\n canStart = false,\n matches = [],\n match = { id: 0, createdAt: \"\" },\n matchPlayers = {},\n navigate = () => {},\n createMatch = (req: CreateMatchRequest) => {},\n deleteMatch = (id: number) => {},\n viewMatch = (id: number) => {},\n joinMatch = () => {},\n startMatch = () => {},\n playMatch = () => {},\n playVsBots = () => {},\n}: Props) => {\n return (\n \n \n Mahjong Spot - Lobby\n \n \n\n \n }\n onRequestClose={() => {\n navigate(\"/match/\");\n }}\n >\n {isView ? (\n \n ) : (\n \n )}\n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n
\n
\n
\n
\n );\n};\n\nexport default Lobby;\n","import { RootState } from \"../../app/store\";\n\n// Other code such as selectors can use the imported `RootState` type\nexport const selectClientId = (state: RootState) => state.client.clientId;\n\nexport const selectConnectionId = (state: RootState) =>\n state.client.connectionId;\n\nexport const selectLocale = (state: RootState) => state.client.locale;\n\nexport const selectColor = (state: RootState) => state.client.color;\n\nexport const selectProfileImage = (state: RootState) => state.client.imagePath;\n\nexport const selectProfileEmail = (state: RootState) => state.client.email;\n\nexport const selectPlayerId = (state: RootState) => state.client.playerId;\n\nexport const selectTurnTime = (state: RootState) => state.client.turnTime;\n\nexport const selectDiscardStyle = (state: RootState) =>\n state.client.discardStyle;\n","import { createApi, fetchBaseQuery } from \"@reduxjs/toolkit/query/react\";\nimport {\n ContinueMatchRequest,\n CreateMatchRequest,\n CreateMatchResponse,\n FindMatchesResponse,\n GetMatchResponse,\n JoinMatchRequest,\n PlayMatchRequest,\n StartMatchRequest,\n FindGameResultsResponse,\n} from \"../../api/mahjong-api\";\nimport { RootState } from \"../../app/store\";\nimport { selectClientId } from \"../auth/selector\";\n\nconst apiUrl = window._env_.API_URL;\nconst matchesTag = \"Matches\";\nconst curMatchTag = \"Current\";\nconst curPlayersTag = \"Players\";\n// Define a service using a base URL and expected endpoints\nexport const matchApi = createApi({\n reducerPath: \"matchesApi\",\n tagTypes: [matchesTag, curMatchTag, curPlayersTag],\n baseQuery: fetchBaseQuery({\n baseUrl: `${apiUrl}/api/match`,\n prepareHeaders: (headers, { getState }) => {\n headers.set(\"clientId\", selectClientId(getState() as RootState));\n return headers;\n },\n }),\n endpoints: (builder) => ({\n findMatches: builder.query({\n query: (id) => (id ? `/find/${id}` : `/find`),\n providesTags: (result) => {\n const { matches } = result || {};\n return matches\n ? [\n ...matches.map(({ id }) => ({ type: matchesTag, id } as const)),\n { type: matchesTag, id: \"LIST\" },\n ]\n : [{ type: matchesTag, id: \"LIST\" }];\n },\n }),\n getMatch: builder.query<\n GetMatchResponse,\n { id: number; connectionId: string }\n >({\n query: ({ id, connectionId }) => `/${id}?connectionId=${connectionId}`,\n providesTags: (result, error, q) => [{ type: curMatchTag }],\n }),\n getMatchGameResults: builder.query({\n query: (id) => `/${id}/results`,\n }),\n createMatch: builder.mutation({\n query: (body) => ({\n url: `/create`,\n body,\n method: \"POST\",\n }),\n invalidatesTags: [{ type: matchesTag, id: \"LIST\" }],\n }),\n startMatch: builder.mutation({\n query: (body) => ({\n url: `/start`,\n body,\n method: \"POST\",\n }),\n }),\n continueMatch: builder.mutation({\n query: (body) => ({\n url: `/continue`,\n body,\n method: \"POST\",\n }),\n }),\n joinMatch: builder.mutation({\n query: (body) => ({\n url: `/join`,\n body,\n method: \"POST\",\n }),\n }),\n playMatch: builder.mutation({\n query: (body) => ({\n url: `/play`,\n body,\n method: \"POST\",\n }),\n }),\n deleteMatch: builder.mutation({\n query: (id) => ({\n url: `/${id}`,\n method: \"DELETE\",\n }),\n }),\n }),\n});\n\n// Export hooks for usage in functional components, which are\n// auto-generated based on the defined endpoints\nexport const {\n useFindMatchesQuery,\n useGetMatchQuery,\n useCreateMatchMutation,\n useStartMatchMutation,\n useJoinMatchMutation,\n useDeleteMatchMutation,\n useContinueMatchMutation,\n usePlayMatchMutation,\n useGetMatchGameResultsQuery,\n endpoints,\n} = matchApi;\n","import React, { useEffect } from \"react\";\nimport \"react-sliding-pane/dist/react-sliding-pane.css\";\nimport { useLocation, useMatch, useNavigate } from \"react-router-dom\";\nimport Lobby from \"./Lobby\";\nimport {\n useCreateMatchMutation,\n useDeleteMatchMutation,\n useFindMatchesQuery,\n useGetMatchQuery,\n useJoinMatchMutation,\n usePlayMatchMutation,\n useStartMatchMutation,\n} from \"./service\";\nimport Loader from \"../../components/common/Loader\";\nimport { useSelector } from \"react-redux\";\nimport {\n selectClientId,\n selectConnectionId,\n selectPlayerId,\n selectTurnTime,\n} from \"../auth/selector\";\nimport { CreateMatchRequest, Match, MatchStatus } from \"../../api/mahjong-api\";\nimport { PlayerMap } from \"../game/Game\";\n\nconst Container = () => {\n const clientId = useSelector(selectClientId);\n const connectionId = useSelector(selectConnectionId);\n const playerId = useSelector(selectPlayerId);\n const turnTime = useSelector(selectTurnTime);\n\n const { pathname } = useLocation();\n const navigate = useNavigate();\n\n const isCreate = pathname.includes(\"create\");\n const isView = pathname.includes(\"view\");\n\n const isOpen = isCreate || isView;\n const [playMatch, playStatus] = usePlayMatchMutation();\n const [createMatch, createStatus] = useCreateMatchMutation();\n const { isLoading: isFindLoading, data } = useFindMatchesQuery(playerId, {\n refetchOnFocus: true,\n refetchOnMountOrArgChange: true,\n refetchOnReconnect: true,\n });\n const [deleteMatch] = useDeleteMatchMutation();\n const matches = data?.matches || [];\n const routeMatch = useMatch(\"/match/view/:matchId\");\n const matchId = +(routeMatch?.params.matchId || \"\");\n\n const [joinMatch] = useJoinMatchMutation();\n const [startMatch] = useStartMatchMutation();\n\n useEffect(() => {\n if (playStatus.isSuccess) {\n navigate(`/game/${playStatus.data.id}`);\n }\n }, [playStatus.isSuccess, navigate, playStatus?.data?.id]);\n\n const { data: getResponse, isLoading: isGetLoading } = useGetMatchQuery(\n {\n id: matchId,\n connectionId,\n },\n { skip: !matchId, refetchOnMountOrArgChange: true }\n );\n\n const init: PlayerMap = {};\n const playerMap = getResponse?.match?.clients?.reduce((s, c) => {\n if (c.player) {\n s[c.clientId] = c.player;\n }\n return s;\n }, init);\n let match: Match = {\n id: 0,\n createdAt: \"\",\n status: MatchStatus.Waiting,\n createdBy: \"\",\n };\n\n if (getResponse?.match) {\n match = getResponse.match;\n }\n if (createStatus.isLoading || isFindLoading || isGetLoading) {\n return ;\n }\n\n const handleCreateMatch = async (payload: CreateMatchRequest) => {\n const response = await createMatch({ ...payload, playerId }).unwrap();\n navigate(`/match/view/${response.id}`);\n };\n\n const handleJoinMatch = async () => {\n await joinMatch({ matchId, playerId });\n navigate(`/game/${matchId}`);\n };\n const handleStartMatch = async () => {\n await startMatch({ matchId });\n navigate(`/game/${matchId}`);\n };\n\n const canStart =\n match?.createdBy === clientId && match.status === MatchStatus.Waiting;\n\n const canJoin =\n match?.createdBy !== clientId && match?.status === MatchStatus.Waiting;\n\n const canPlay =\n match?.status === MatchStatus.Started &&\n match?.clients?.map((c) => c.clientId).includes(clientId);\n\n return (\n navigate(`view/${id}`)}\n playMatch={() => navigate(`/game/${matchId}`)}\n playVsBots={() => playMatch({ playerId: playerId, turnTime: turnTime })}\n joinMatch={() => handleJoinMatch()}\n startMatch={() => handleStartMatch()}\n />\n );\n};\n\nexport default Container;\n","import React from \"react\";\n\nconst NoMatch = () =>
Page not found
;\nexport default NoMatch;\n","import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\nimport type { RootState, AppDispatch } from './store';\n\n// Use throughout your app instead of plain `useDispatch` and `useSelector`\nexport const useAppDispatch = () => useDispatch();\nexport const useAppSelector: TypedUseSelectorHook = useSelector;\n","import { createApi, fetchBaseQuery } from \"@reduxjs/toolkit/query/react\";\nimport {\n GetPlayerStatisticsResponse,\n GetProfileResponse,\n} from \"../../api/mahjong-api\";\n\nconst apiUrl = window._env_.API_URL;\n// Define a service using a base URL and expected endpoints\nexport const profileApi = createApi({\n reducerPath: \"profileApi\",\n baseQuery: fetchBaseQuery({\n baseUrl: `${apiUrl}/api/profile`,\n }),\n endpoints: (builder) => ({\n profile: builder.query({\n query: () => ({\n url: \"\",\n method: \"GET\",\n credentials: \"include\",\n }),\n }),\n statistics: builder.query({\n query: () => ({\n url: \"/statistics\",\n method: \"GET\",\n credentials: \"include\",\n }),\n }),\n signOut: builder.mutation({\n query: () => ({\n url: \"/sign-out\",\n method: \"POST\",\n credentials: \"include\",\n }),\n }),\n }),\n});\n\n// Export hooks for usage in functional components, which are\n// auto-generated based on the defined endpoints\nexport const { useProfileQuery, useStatisticsQuery, useSignOutMutation } =\n profileApi;\n\nexport const selectProfile = profileApi.endpoints.profile.select();\nexport const resetProfile = profileApi.util.resetApiState;\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { v4 as uuidv4 } from \"uuid\";\nimport { DiscardStyle } from \"../profile/DiscardStyle\";\nimport { profileApi } from \"../profile/service\";\n\n// Define a type for the slice state\ninterface ClientState {\n clientId: string;\n connectionId: string;\n locale: string;\n color: string;\n discardStyle: DiscardStyle;\n turnTime: number;\n imagePath?: string;\n firstName?: string;\n lastName?: string;\n email?: string;\n userId?: string;\n playerId?: number;\n}\n\n// Define the initial state using that type\nconst initialState: ClientState = {\n clientId: `guest-${uuidv4()}`,\n connectionId: \"\",\n locale: \"en\",\n color: \"#7fd8d4\",\n turnTime: 10,\n discardStyle: DiscardStyle.Gesture,\n};\n\nexport const clientSlice = createSlice({\n name: \"client\",\n // `createSlice` will infer the state type from the `initialState` argument\n initialState,\n reducers: {\n updateConnectionId(state, action: PayloadAction) {\n state.connectionId = action.payload;\n },\n updateLocale(state, action: PayloadAction) {\n state.locale = action.payload;\n },\n resetClientId(state) {\n state.clientId = `guest-${uuidv4()}`;\n },\n updateColor(state, action: PayloadAction) {\n state.color = action.payload;\n },\n updateTurnTime(state, action: PayloadAction) {\n state.turnTime = action.payload;\n },\n updateDiscardStyle(state, action: PayloadAction) {\n state.discardStyle = action.payload;\n },\n logout(state) {\n state.imagePath = undefined;\n state.userId = undefined;\n state.playerId = undefined;\n state.email = undefined;\n state.firstName = undefined;\n state.lastName = undefined;\n },\n },\n extraReducers: (b) => {\n b.addMatcher(\n profileApi.endpoints.profile.matchFulfilled,\n (state, { payload }) => {\n state.imagePath = payload.imagePath;\n state.userId = payload.userId || undefined;\n state.playerId = payload.playerId || undefined;\n state.email = payload.email || undefined;\n state.firstName = payload.firstName || undefined;\n state.lastName = payload.lastName || undefined;\n }\n );\n },\n});\n\nexport const {\n updateConnectionId,\n updateLocale,\n resetClientId,\n updateColor,\n updateTurnTime,\n updateDiscardStyle,\n logout,\n} = clientSlice.actions;\n\nexport default clientSlice.reducer;\n","import { DefaultTheme } from \"styled-components\";\n\nconst theme: DefaultTheme = {\n primary: \"#7fd8d4\",\n dark: \"#000000\",\n light: \"#ffffff\",\n text: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif',\n title: \"Bungee Shade\",\n heading: \"Audiowide\"\n};\n\nexport { theme };\n","import React from \"react\";\nimport { theme } from \"../../theme\";\nimport { ThemeProvider } from \"styled-components\";\nimport { useSelector } from \"react-redux\";\nimport { selectColor } from \"../../features/auth/selector\";\n\nconst ConnectedThemeProvider: React.FC<{}> = ({ children }) => {\n const color = useSelector(selectColor);\n let customTheme = theme;\n if (color) {\n customTheme = {...theme, primary: color};\n }\n\n return (\n \n {children}\n \n );\n };\n \n export default ConnectedThemeProvider;","import { IntlProvider } from \"react-intl\";\nimport { useSelector } from \"react-redux\";\nimport { selectLocale } from \"../features/auth/selector\";\nimport en from \"./en.json\";\nimport cn from \"./cn.json\";\ntype Props = {};\nconst defaultLocale = \"en\";\nconst Wrapper: React.FC = ({ children }) => {\n const locale = useSelector(selectLocale);\n let messages = en;\n if (locale !== defaultLocale) {\n messages = cn;\n }\n\n return (\n \n {children}\n \n );\n};\n\nexport default Wrapper;\n","import { createApi, fetchBaseQuery } from \"@reduxjs/toolkit/query/react\";\nimport { GetStatisticsResponse } from \"../../api/mahjong-api\";\n\nconst apiUrl = window._env_.API_URL;\n// Define a service using a base URL and expected endpoints\nexport const homeApi = createApi({\n reducerPath: \"homeApi\",\n baseQuery: fetchBaseQuery({\n baseUrl: `${apiUrl}/api/home`,\n }),\n endpoints: (builder) => ({\n statistic: builder.query({\n query: () => \"statistics\",\n }),\n }),\n});\n\n// Export hooks for usage in functional components, which are\n// auto-generated based on the defined endpoints\nexport const { useStatisticQuery } = homeApi;\n","import { createApi, fetchBaseQuery } from \"@reduxjs/toolkit/query/react\";\nimport {\n FindGameResultsResponse,\n FindPlayerSummariesResponse,\n GetPlayerSummaryResponse,\n} from \"../../api/mahjong-api\";\nimport { RootState } from \"../../app/store\";\nimport { selectClientId } from \"../auth/selector\";\n\nconst apiUrl = window._env_.API_URL;\nconst tag = \"Community\";\n// Define a service using a base URL and expected endpoints\nexport const communityApi = createApi({\n reducerPath: \"communityApi\",\n tagTypes: [tag],\n baseQuery: fetchBaseQuery({\n baseUrl: `${apiUrl}/api/community`,\n prepareHeaders: (headers, { getState }) => {\n headers.set(\"clientId\", selectClientId(getState() as RootState));\n return headers;\n },\n }),\n endpoints: (builder) => ({\n findPlayers: builder.query({\n query: () => `/find`,\n providesTags: (result) => {\n const { players } = result || {};\n return players\n ? [\n ...players.map(({ id }) => ({ type: tag, id } as const)),\n { type: tag, id: \"LIST\" },\n ]\n : [{ type: tag, id: \"LIST\" }];\n },\n }),\n findGameResults: builder.query({\n query: () => `/games`,\n providesTags: (result) => {\n const { results } = result || {};\n return results\n ? [\n ...results.map(({ gameId }) => ({ type: tag, gameId } as const)),\n { type: tag, id: \"GAMES\" },\n ]\n : [{ type: tag, id: \"GAMES\" }];\n },\n }),\n getPlayer: builder.query({\n query: (id) => `/player/${id}`,\n providesTags: (result, error, q) => [{ type: tag, id: q }],\n }),\n }),\n});\n\n// Export hooks for usage in functional components, which are\n// auto-generated based on the defined endpoints\nexport const {\n useFindPlayersQuery,\n useGetPlayerQuery,\n useFindGameResultsQuery,\n} = communityApi;\n","import { createApi, fetchBaseQuery } from \"@reduxjs/toolkit/query/react\";\nimport {\n CreateMatchResponse,\n DrawTileRequest,\n GetMatchTemplateResponse,\n PlayMatchTemplateRequest,\n} from \"../../api/mahjong-api\";\nimport { RootState } from \"../../app/store\";\nimport { selectClientId } from \"../auth/selector\";\n\nconst apiUrl = window._env_.API_URL;\nconst tag = \"Templates\";\n// Define a service using a base URL and expected endpoints\nexport const templateApi = createApi({\n reducerPath: \"templateApi\",\n tagTypes: [tag],\n baseQuery: fetchBaseQuery({\n baseUrl: `${apiUrl}/api/template`,\n prepareHeaders: (headers, { getState }) => {\n headers.set(\"clientId\", selectClientId(getState() as RootState));\n return headers;\n },\n }),\n endpoints: (builder) => ({\n getMatchTemplate: builder.query<\n GetMatchTemplateResponse,\n { month: number; day: number; year: number }\n >({\n query: ({ year, month, day }) => `/${year}/${month}/${day}`,\n }),\n playTemplate: builder.mutation<\n CreateMatchResponse,\n PlayMatchTemplateRequest\n >({\n query: (body) => ({\n url: `/play`,\n method: \"POST\",\n body,\n }),\n }),\n draw: builder.mutation({\n query: (body) => ({\n url: `/draw`,\n body,\n method: \"POST\",\n }),\n }),\n }),\n});\n\n// Export hooks for usage in functional components, which are\n// auto-generated based on the defined endpoints\nexport const {\n useDrawMutation,\n useGetMatchTemplateQuery,\n usePlayTemplateMutation,\n} = templateApi;\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { GameFrame } from \"../../api/mahjong-api\";\nimport { getLatestFrame } from \"../match/match-utility\";\nimport { matchApi } from \"../match/service\";\n\n// Define a type for the slice state\ninterface GameState {\n currentFrame?: GameFrame;\n previousFrames: GameFrame[];\n bufferFrames: GameFrame[];\n}\n\n// Define the initial state using that type\nconst initialState: GameState = {\n currentFrame: undefined,\n previousFrames: [],\n bufferFrames: [],\n};\n\nexport const gameSlice = createSlice({\n name: \"game\",\n // `createSlice` will infer the state type from the `initialState` argument\n initialState,\n reducers: {\n // Use the PayloadAction type to declare the contents of `action.payload`\n updateGameFrame: (state, action: PayloadAction) => {\n // state.previousFrames.unshift(action.payload);\n // state.currentFrame = action.payload;\n state.bufferFrames.push(action.payload);\n },\n nextFrame: (state) => {\n if (state.bufferFrames.length) {\n state.currentFrame = state.bufferFrames.shift();\n }\n },\n nextFrameClear: (state) => {\n if (state.bufferFrames.length) {\n state.currentFrame = state.bufferFrames.shift();\n } else {\n state.currentFrame = undefined;\n }\n },\n },\n extraReducers: (builder) => {\n // Add reducers for additional action types here, and handle loading state as needed\n builder.addMatcher(\n matchApi.endpoints.getMatch.matchFulfilled,\n (state, action) => {\n const latestFrame = getLatestFrame(action.payload.match);\n if (latestFrame) {\n state.currentFrame = latestFrame;\n state.bufferFrames = [];\n }\n }\n );\n },\n});\n\nexport const { updateGameFrame, nextFrame, nextFrameClear } = gameSlice.actions;\n\nexport default gameSlice.reducer;\n","import { GameFrame, Match } from \"../../api/mahjong-api\";\n\nexport const getLatestFrame = (match?: Match): GameFrame | undefined => {\n const lastRound = match?.history?.rounds?.slice(-1)[0];\n const lastGame = lastRound?.games?.slice(-1)[0];\n const frame = lastGame?.currentFrame;\n return frame;\n};\n","import { combineReducers, configureStore } from \"@reduxjs/toolkit\";\nimport { setupListeners } from \"@reduxjs/toolkit/query\";\nimport { calculationApi } from \"../features/scoring/service\";\nimport { endpoints, matchApi } from \"../features/match/service\";\nimport { homeApi } from \"../features/home/service\";\nimport { profileApi } from \"../features/profile/service\";\nimport { communityApi } from \"../features/community/service\";\nimport { templateApi } from \"../features/motd/service\";\nimport gameReducer, { updateGameFrame } from \"../features/game/reducer\";\nimport { updateConnectionId } from \"../features/auth/reducer\";\nimport clientReducer from \"../features/auth/reducer\";\nimport {\n persistReducer,\n FLUSH,\n REHYDRATE,\n PAUSE,\n PERSIST,\n PURGE,\n REGISTER,\n} from \"redux-persist\";\nimport storage from \"redux-persist/lib/storage\";\nimport {\n AnyAction,\n HttpTransportType,\n HubConnectionBuilder,\n LogLevel,\n SignalAction,\n SignalDispatch,\n signalMiddleware,\n withCallbacks,\n} from \"redux-signalr\";\nimport { GameFrame } from \"../api/mahjong-api\";\n\nexport type AppDispatch = typeof store.dispatch;\nexport type RootState = ReturnType;\n\nexport type Action = SignalAction<\n ReturnValue,\n RootState,\n AnyAction\n>;\n\nexport type Dispatch = SignalDispatch<\n RootState,\n Action\n>;\n\nconst apiUrl = window._env_.API_URL;\nconst connection = new HubConnectionBuilder()\n .configureLogging(LogLevel.Debug)\n .withUrl(`${apiUrl}/gameHub`, {\n transport: HttpTransportType.WebSockets,\n })\n .withAutomaticReconnect()\n .build();\n\nconst callbacks = withCallbacks()\n .add(\"ReceiveMessage\", (user: string, msg: string) => (dispatch) => {\n const frame: GameFrame = JSON.parse(msg);\n dispatch(updateGameFrame(frame));\n })\n .add(\"UpdateConnectionId\", (connectionId: string) => (dispatch) => {\n dispatch(updateConnectionId(connectionId));\n })\n .add(\"UpdateLobby\", () => (dispatch) => {\n const { refetch } = dispatch(endpoints.findMatches.initiate(undefined));\n refetch();\n });\n\nexport const signal = signalMiddleware({\n callbacks,\n connection,\n shouldConnectionStartImmediately: false,\n});\n\nconnection\n .start()\n .then(() =>\n console.log(`Connection started with id ${connection.connectionId}`)\n )\n .catch((err) => console.error(err.toString()));\n\nconst persistConfig = {\n key: \"root\",\n version: 1,\n storage,\n blacklist: [\n matchApi.reducerPath,\n calculationApi.reducerPath,\n homeApi.reducerPath,\n communityApi.reducerPath,\n templateApi.reducerPath,\n \"game\",\n ],\n};\n\nconst gamePersistConfig = {\n key: \"game\",\n storage: storage,\n blacklist: [\"previousFrames\", \"bufferFrames\"],\n};\n\nconst rootReducer = combineReducers({\n [homeApi.reducerPath]: homeApi.reducer,\n [calculationApi.reducerPath]: calculationApi.reducer,\n [matchApi.reducerPath]: matchApi.reducer,\n [profileApi.reducerPath]: profileApi.reducer,\n [communityApi.reducerPath]: communityApi.reducer,\n [templateApi.reducerPath]: templateApi.reducer,\n game: persistReducer(gamePersistConfig, gameReducer),\n client: clientReducer,\n});\n\nconst persistedReducer = persistReducer(persistConfig, rootReducer);\n\nexport const store = configureStore({\n reducer: persistedReducer,\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n serializableCheck: {\n ignoredActions: [FLUSH, REHYDRATE, PAUSE, PERSIST, PURGE, REGISTER],\n },\n })\n .concat(homeApi.middleware)\n .concat(calculationApi.middleware)\n .concat(matchApi.middleware)\n .concat(profileApi.middleware)\n .concat(communityApi.middleware)\n .concat(templateApi.middleware)\n .concat(signal),\n});\n\nsetupListeners(store.dispatch);\n","import React, { PropsWithChildren } from \"react\";\nimport ThemeProvider from \"../ConnectedThemeProvider\";\nimport IntlProvider from \"../../../i18n/ConnectedIntlProvider\";\nimport { store } from \"../../../app/store\";\nimport { Provider } from \"react-redux\";\nimport { Canvas as R3FCanvas, Dpr } from \"@react-three/fiber\";\n\ntype Props = {\n dpr?: Dpr;\n}\n\nconst Canvas = ({ children, dpr }: PropsWithChildren) => (\n \n \n \n \n {children}\n \n \n \n \n);\n \n export default Canvas;","export default __webpack_public_path__ + \"static/media/c1.31c950f2.svg\";","export default __webpack_public_path__ + \"static/media/c2.6f9514ee.svg\";","export default __webpack_public_path__ + \"static/media/c3.1113dd0d.svg\";","export default __webpack_public_path__ + \"static/media/c4.c0d0e9b0.svg\";","export default __webpack_public_path__ + \"static/media/c5.31ff565d.svg\";","export default __webpack_public_path__ + \"static/media/c6.ca3f9bef.svg\";","export default __webpack_public_path__ + \"static/media/c7.58370092.svg\";","export default __webpack_public_path__ + \"static/media/c8.6b350db0.svg\";","export default __webpack_public_path__ + \"static/media/c9.5ae3182f.svg\";","export default __webpack_public_path__ + \"static/media/d1.5e91ef06.svg\";","export default __webpack_public_path__ + \"static/media/d2.1ac242c0.svg\";","export default __webpack_public_path__ + \"static/media/d3.6a797920.svg\";","export default __webpack_public_path__ + \"static/media/d4.b41aeb12.svg\";","export default __webpack_public_path__ + \"static/media/d5.0174164b.svg\";","export default __webpack_public_path__ + \"static/media/d6.9fed6b1e.svg\";","export default __webpack_public_path__ + \"static/media/d7.db64d468.svg\";","export default __webpack_public_path__ + \"static/media/d8.18b3e9d7.svg\";","export default __webpack_public_path__ + \"static/media/d9.acbfb901.svg\";","export default __webpack_public_path__ + \"static/media/b1.b0e130a1.svg\";","export default __webpack_public_path__ + \"static/media/b2.9f6d5505.svg\";","export default __webpack_public_path__ + \"static/media/b3.d5a029f4.svg\";","export default __webpack_public_path__ + \"static/media/b4.4aff3088.svg\";","export default __webpack_public_path__ + \"static/media/b5.eb7d6095.svg\";","export default __webpack_public_path__ + \"static/media/b6.710f24ec.svg\";","export default __webpack_public_path__ + \"static/media/b7.627ba696.svg\";","export default __webpack_public_path__ + \"static/media/b8.6203339a.svg\";","export default __webpack_public_path__ + \"static/media/b9.888ceac0.svg\";","export default __webpack_public_path__ + \"static/media/f1.a580e060.svg\";","export default __webpack_public_path__ + \"static/media/f2.2dcd141b.svg\";","export default __webpack_public_path__ + \"static/media/f3.7ce08181.svg\";","export default __webpack_public_path__ + \"static/media/f4.15d38637.svg\";","export default __webpack_public_path__ + \"static/media/s1.783c5d93.svg\";","export default __webpack_public_path__ + \"static/media/s2.0fdded57.svg\";","export default __webpack_public_path__ + \"static/media/s3.27b37c53.svg\";","export default __webpack_public_path__ + \"static/media/s4.887e272c.svg\";","import c1 from \"./c1.svg\";\nimport c2 from \"./c2.svg\";\nimport c3 from \"./c3.svg\";\nimport c4 from \"./c4.svg\";\nimport c5 from \"./c5.svg\";\nimport c6 from \"./c6.svg\";\nimport c7 from \"./c7.svg\";\nimport c8 from \"./c8.svg\";\nimport c9 from \"./c9.svg\";\n\nimport d1 from \"./d1.svg\";\nimport d2 from \"./d2.svg\";\nimport d3 from \"./d3.svg\";\nimport d4 from \"./d4.svg\";\nimport d5 from \"./d5.svg\";\nimport d6 from \"./d6.svg\";\nimport d7 from \"./d7.svg\";\nimport d8 from \"./d8.svg\";\nimport d9 from \"./d9.svg\";\n\nimport b1 from \"./b1.svg\";\nimport b2 from \"./b2.svg\";\nimport b3 from \"./b3.svg\";\nimport b4 from \"./b4.svg\";\nimport b5 from \"./b5.svg\";\nimport b6 from \"./b6.svg\";\nimport b7 from \"./b7.svg\";\nimport b8 from \"./b8.svg\";\nimport b9 from \"./b9.svg\";\n\nimport f1 from \"./f1.svg\";\nimport f2 from \"./f2.svg\";\nimport f3 from \"./f3.svg\";\nimport f4 from \"./f4.svg\";\nimport s1 from \"./s1.svg\";\nimport s2 from \"./s2.svg\";\nimport s3 from \"./s3.svg\";\nimport s4 from \"./s4.svg\";\n\nimport e from \"./e.svg\";\nimport s from \"./s.svg\";\nimport w from \"./w.svg\";\nimport n from \"./n.svg\";\nimport rd from \"./rd.svg\";\nimport gd from \"./gd.svg\";\nimport wd from \"./wd.svg\";\n\nconst winds = {\n \"🀀\": e,\n \"🀁\": s,\n \"🀂\": w,\n \"🀃\": n,\n};\nconst dragons = {\n \"🀄\": rd,\n \"🀅\": gd,\n \"🀆\": wd,\n};\nconst characters = {\n \"🀇\": c1,\n \"🀈\": c2,\n \"🀉\": c3,\n \"🀊\": c4,\n \"🀋\": c5,\n \"🀌\": c6,\n \"🀍\": c7,\n \"🀎\": c8,\n \"🀏\": c9,\n};\nconst bamboos = {\n \"🀐\": b1,\n \"🀑\": b2,\n \"🀒\": b3,\n \"🀓\": b4,\n \"🀔\": b5,\n \"🀕\": b6,\n \"🀖\": b7,\n \"🀗\": b8,\n \"🀘\": b9,\n};\nconst dots = {\n \"🀙\": d1,\n \"🀚\": d2,\n \"🀛\": d3,\n \"🀜\": d4,\n \"🀝\": d5,\n \"🀞\": d6,\n \"🀟\": d7,\n \"🀠\": d8,\n \"🀡\": d9,\n};\nconst flowers = {\n \"🀢\": f1,\n \"🀣\": f2,\n \"🀤\": f3,\n \"🀥\": f4,\n};\nconst seasons = {\n \"🀦\": s1,\n \"🀧\": s2,\n \"🀨\": s3,\n \"🀩\": s4,\n};\n\nexport const tilePaths: Record = {\n ...winds,\n ...dragons,\n ...characters,\n ...bamboos,\n ...dots,\n ...flowers,\n ...seasons,\n};\n","export default __webpack_public_path__ + \"static/media/e.0bd660fb.svg\";","export default __webpack_public_path__ + \"static/media/s.cec58492.svg\";","export default __webpack_public_path__ + \"static/media/w.0c0694d6.svg\";","export default __webpack_public_path__ + \"static/media/n.e85168aa.svg\";","export default __webpack_public_path__ + \"static/media/rd.186f5312.svg\";","export default __webpack_public_path__ + \"static/media/gd.134fe2e8.svg\";","export default __webpack_public_path__ + \"static/media/wd.6c359a34.svg\";","import React, { useState } from \"react\";\nimport * as THREE from \"three\";\n\nimport { RoundedBox } from \"@react-three/drei\";\nimport { useLoader } from \"@react-three/fiber\";\nimport { tilePaths } from \"./lookup\";\nimport { useTheme } from \"styled-components\";\nexport type Props = {\n code: string;\n x: number;\n scale?: number;\n isActive?: boolean;\n};\n\nfunction BaseTile({ x: start = 0, isActive = false, code, scale = 1 }: Props) {\n const [hovered, hover] = useState(false);\n const texture = useLoader(THREE.TextureLoader, tilePaths[code]);\n const front = new THREE.Vector3(start, 0, -(scale * 0.275));\n const back = new THREE.Vector3(start, 0, -(scale * 0.45));\n const img = new THREE.Vector3(start + 0.025, 0, scale * 0.001);\n texture.minFilter = THREE.LinearFilter;\n\n const theme = useTheme();\n return (\n <>\n hover(true)}\n onPointerOut={(event) => hover(false)}\n >\n \n \n \n hover(true)}\n onPointerOut={(event) => hover(false)}\n >\n \n \n \n \n \n \n \n \n );\n}\n\nexport default BaseTile;\n","import React, { useEffect } from \"react\";\nimport * as THREE from \"three\";\n\nimport { useLoader, useThree } from \"@react-three/fiber\";\nimport { tilePaths } from \"./lookup\";\nimport { animated, SpringValue, useSpring } from \"@react-spring/three\";\nimport { useGesture } from \"@use-gesture/react\";\nimport BaseTile from \"./BaseTile\";\nexport type Props = {\n code: string;\n x: number;\n scale?: number;\n isActive?: boolean;\n allowDrag?: boolean;\n shouldReset?: boolean;\n startDrag?: () => void;\n endDrag?: () => void;\n onClick?: () => void;\n rotateX?: number | SpringValue;\n rotateY?: number | SpringValue;\n positionZ?: number | SpringValue;\n};\n\nfunction GestureTile({\n x: start = 0,\n isActive = false,\n allowDrag = false,\n shouldReset = true,\n startDrag = () => {},\n endDrag = () => {},\n code,\n scale = 1,\n onClick = () => {},\n rotateX = 0,\n rotateY = 0,\n positionZ = 0,\n}: Props) {\n const { viewport } = useThree();\n const { factor } = viewport;\n const [{ x, y, z }, api] = useSpring(() => ({ x: 0, y: 0, z: positionZ }));\n const dragConfig = {\n bounds: { left: 0, right: 0, bottom: 0 },\n };\n const bind = useGesture(\n {\n onDrag: ({ down, first, last, movement: [mx, my] }) => {\n const allowMove = isActive && allowDrag;\n if (allowMove && my < -150 && last) {\n onClick();\n endDrag();\n api.start({\n x: 10 - start,\n y: 0,\n z: -1.5,\n });\n } else {\n if (down && first) {\n startDrag();\n } else if (!down && last) {\n endDrag();\n }\n api.start({\n x: down && allowMove ? mx / factor : 0,\n y: down && allowMove ? -my / factor : 0,\n z: 0,\n immediate: down,\n });\n }\n },\n },\n { drag: dragConfig, hover: { mouseOnly: true } }\n );\n\n const texture = useLoader(THREE.TextureLoader, tilePaths[code]);\n texture.minFilter = THREE.LinearFilter;\n\n useEffect(() => {\n if (!isActive && shouldReset) {\n api.start({ x: 0, y: 0, z: 0 });\n }\n }, [isActive, api, shouldReset]);\n return (\n \n \n \n );\n}\n\nexport default GestureTile;\n","import React from \"react\";\nimport { useSpring, useChain, useSpringRef } from \"@react-spring/three\";\n\nimport GestureTile from \"../../components/three/GestureTile\";\nexport type Props = {\n code: string;\n x: number;\n scale?: number;\n onClick?: () => void;\n};\n\nfunction Tile({ x = 0, code, scale = 1, onClick = () => {} }: Props) {\n const springRef = useSpringRef();\n const transitionRef = useSpringRef();\n\n const { positionZ } = useSpring({\n from: { positionZ: -15 },\n to: { positionZ: 0 },\n ref: springRef,\n });\n const { rotateX } = useSpring({\n from: { rotateX: Math.PI / 2 },\n to: { rotateX: 0 },\n ref: transitionRef,\n });\n\n useChain([springRef, transitionRef]);\n\n return (\n \n );\n}\n\nexport default Tile;\n","import { RoundedBox } from \"@react-three/drei\";\nimport React from \"react\";\nimport { Color } from \"three\";\n\nconst TableTop = () => {\n return (\n \n \n \n \n \n \n );\n};\n\nexport default TableTop;\n","import React, { PropsWithChildren } from \"react\";\nimport { Html as R3FHtml} from \"@react-three/drei\";\nimport ThemeProvider from \"../ConnectedThemeProvider\";\nimport { HtmlProps } from \"@react-three/drei/web/Html\";\nimport IntlProvider from \"../../../i18n/ConnectedIntlProvider\";\nimport { store } from \"../../../app/store\";\nimport { Provider } from \"react-redux\";\n\nconst Html = ({ children, ...rest}: PropsWithChildren) => (\n \n \n \n \n {children}\n \n \n \n \n);\n \n export default Html;","import styled from \"styled-components\";\nimport { Image } from \"../../components/common/Image.styled\";\n\nexport const Frame = styled.div`\n background-color: rgba(0, 0, 0, 0.2);\n text-transform: uppercase;\n font-family: ${({ theme }) => theme.heading};\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100vw;\n flex-wrap: wrap;\n background-position: center;\n background-repeat: no-repeat;\n background-size: cover;\n`;\n\nexport const TitleText = styled.div`\n text-transform: uppercase;\n width: 15rem;\n font-family: ${({ theme }) => theme.title};\n font-size: 2.6rem;\n color: ${({ theme }) => theme.primary};\n`;\n\nexport const Info = styled.div`\n font-size: 0.75rem;\n`;\n\nexport const Scene = styled.div`\n height: 200px;\n canvas {\n touch-action: none;\n }\n`;\n\nexport const SupportedImage = styled(Image)`\n margin: 0.5rem;\n`;\n","import React from \"react\";\nimport Html from \"../../components/common/r3f/Html\";\nimport { useThree } from \"@react-three/fiber\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Vector3 } from \"three\";\nimport { TitleText } from \"./Home.styled\";\nimport { animated } from \"@react-spring/three\";\nimport { useSpring } from \"@react-spring/core\";\n\nconst Title = () => {\n const { camera } = useThree();\n camera.lookAt(new Vector3(0, -7, 0));\n const { posY } = useSpring({\n from: { posY: 12 },\n to: { posY: 4.5 },\n });\n return (\n \n \n \n \n \n \n \n );\n};\n\nexport default Title;\n","import React, { Suspense } from \"react\";\nimport Canvas from \"../../components/common/r3f/Canvas\";\nimport Tile from \"./Tile\";\nimport { OrbitControls, PerspectiveCamera } from \"@react-three/drei\";\nimport TableTop from \"./TableTop\";\nimport Title from \"./Title\";\nimport { ThemeProvider } from \"styled-components\";\nimport { theme } from \"../../theme\";\nimport { Scene } from \"./Home.styled\";\nconst ratio = 2;\nconst tiles = [\n \"🀀\",\n \"🀁\",\n \"🀂\",\n \"🀃\",\n \"🀄\",\n \"🀅\",\n \"🀆\",\n \"🀇\",\n \"🀏\",\n \"🀙\",\n \"🀡\",\n \"🀐\",\n \"🀘\",\n];\nconst count = tiles.length + 1;\nconst half = Math.floor(count / 2);\n\nexport const Display = () => {\n return (\n \n \n \n \n \n \n <TableTop />\n\n <Suspense fallback={null}>\n <group position={[0, -6, -2]}>\n {[...(tiles || [])]?.map((t, i) => (\n <Tile\n x={(-half + i) * 1.2 * ratio + 2}\n code={t}\n key={`${i}`}\n scale={ratio}\n />\n ))}\n </group>\n </Suspense>\n <OrbitControls />\n <PerspectiveCamera makeDefault fov={40} position={[0, 8, 33]} />\n </ThemeProvider>\n </Canvas>\n </Scene>\n );\n};\n\nexport default Display;\n","import React from \"react\";\nimport { Row, Item } from \"../common/Page.styled\";\n\ntype Props = {\n locale?: string;\n selectLocale?: (l: string) => void;\n};\n\nexport const Language = ({ locale, selectLocale = () => {} }: Props) => (\n <Row>\n <Item selected={locale === \"en\"} onClick={() => selectLocale(\"en\")}>\n EN\n </Item>\n <Item selected={locale === \"cn\"} onClick={() => selectLocale(\"cn\")}>\n 中文\n </Item>\n </Row>\n);\n\nexport default Language;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { GetStatisticsResponse } from \"../../api/mahjong-api\";\nimport { Info } from \"./Home.styled\";\n\ntype Props = {\n statistics?: GetStatisticsResponse;\n}\n\nconst Statistics = ({ statistics }: Props) => (\n <>\n <Info>\n <FormattedMessage\n id=\"TotalGamesPlayed\"\n values={{ count: statistics?.games }}\n />\n </Info>\n <Info>\n <FormattedMessage\n id=\"TotalActivePlayers\"\n values={{ count: statistics?.players }}\n />\n </Info>\n </>\n);\n\nexport default Statistics;","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { NavLink } from \"react-router-dom\";\nimport { GetStatisticsResponse } from \"../../api/mahjong-api\";\nimport Display from \"./Display\";\nimport { SupportedImage as Image } from \"./Home.styled\";\nimport {\n ActionButton as Button,\n SocialButton,\n} from \"../../components/common/Buttons.styled\";\nimport Language from \"../../components/nav/Language\";\nimport { Helmet } from \"react-helmet-async\";\nimport MotdButton from \"../../components/common/buttons/MotdButton\";\nimport Statistics from \"./Statistics\";\nimport {\n Col,\n Row,\n Page,\n Backdrop,\n PageDescription as Description,\n FixedPanel as Panel,\n} from \"../../components/common/Page.styled\";\nimport ios from \"../../image/ios.png\";\nimport android from \"../../image/android.png\";\nimport chrome from \"../../image/chrome.png\";\nimport firefox from \"../../image/firefox.png\";\nimport safari from \"../../image/safari.png\";\nconst googleAuthUrl = window._env_.GOOGLE_AUTH_URL;\n\nexport type Props = {\n clientId?: string;\n locale?: string;\n statistics?: GetStatisticsResponse;\n playVsBots?: () => void;\n selectLocale?: (l: string) => void;\n};\n\nconst Home = ({\n clientId = \"\",\n statistics,\n locale = \"en\",\n playVsBots = () => {},\n selectLocale = () => {},\n}: Props) => (\n <Page>\n <Helmet>\n <title>Mahjong Spot - Home\n \n \n\n \n \n \n \n \n \n \n
\n \n
\n
\n \n \n \n
\n
\n \n \n \n
\n\n
\n \n \n
\n
\n \n \n Learn To Play\n \n 16 tile mahjong game based on classic multiplayer mahjong mechanics.\n Check out the rules on how to score, or jump right to the calculator\n and use it with your in person games.\n \n \n \n
\n \n \n \n
\n
\n \n \n \n
\n
\n
\n \n \n Play Everywhere!\n \n Designed to be responsive so that it can be enjoyed on a phone, tablet\n or large monitors.\n \n \n \n \n Mobile\n \n \n \n \n \n \n Desktop\n \n \n \n \n \n \n \n \n \n \n Customize\n \n Sign in to customize! Pick the tile color, turn time and the choice of\n discarding with gesture or tap.\n \n \n \n
\n \n \n
\n
\n \n);\n\nexport default Home;\n","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAAACXBIWXMAAAsTAAALEwEAmpwYAAADC0lEQVR4nO2ZXYhNURTHfzFPQ0kh5sPX0yAPPvIg0SWZaWZkHiSvRLijvA6SFC8oHoZIpJR8k5kh3siDFx5oGCmGJpE03Em4Y7Z2rVun0z7n7Hvnnnv26Pzr/7L2Wvuu/7lrr33O3pAihROoB9qBe8ArYAhQZeaQzN0DZIG6cgqoBc4A+RgSj+Jf4Cowa7Qi1gM/EhCgfNQ5tJYqYrc8kaRFKM+/o0u7KDQBww4krwxidJVYrwkXykkF8Dsww0bIOQeSVRHUzSeyxbpYUsrHvFRO6AJXY4S7woT0OJCgsmRXmJA3DiSoLPk6TEjOgQSVJXWugVBjjIFIOjGVCvEh7Il0AzOBwxF+L4DbwC3gOTAS4a/H+2T++8D7uEtrn/hkAsYfAPMMc84F7gTEPAEaDDGtwLu4hPwErgGfDGPaXiVzLAX2AvuBFWIbB1zwxbwFJsj4BuAkcAxY7nkAuTiEBPErMEnijxhK6bSMVQMDHrsWq7HN5z8MrJWx83EIuQtMBjp89qMSuyYktk18DnpsW8TWafDvBx7Kv1Z2ITfEZ4/P3mTx9PQa0VhpeAA1wE3gVwnVUFYh88X+OCRWL1yk6xVsOV9zmAg0AieAD0kImSP2lyGxH8VnquHU5JCh21VJCY9UUshisXeHxD4Sn4YQnwHgEtDsyediJYVsNSxkP4+Lz2bLkukQ/02VFKL/CY1pwBdD3KB8eWpc99gzsud8NsRcFv+2SgoZkW6ksVAWfaG2nwJLZGyZ7zN6o9jXyRpSwl7Pbt9ZSSFKdvtFnnmqPbu2xgJDJ+r3nCCOB2ZLV9NvARqrgT9xCHkGbAeuBIz/Bk7Jrlwv57YZefUI2iO+AQeAVeJfKxur7RFtSUJcZCCSTkylQnxw+ahUGY5OA9HnQILKkrpN//8HdFkHElSW3BEmpC6hK7ZiGXmIrXHWgURVBAufz6Gocbx7DQLTsUSjw1dvLRSJdgcvQ7OUiBbZeFwop2ZGiSnyBptEN8vLm7DV5actdLvbKV+EvTHdpeRk7i75rcgWmyIF8eEfinF2n/iWXaMAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAABtklEQVR4nO2WvUoDQRDHFwRBQQR9BC2srUSQOHMiRsQuLyD4ABai3qzcS2hhZ2MTQcyOiKKCjb6ChaBgKm2VoKBE1pyJHzk3H/cV3B8MHLtzt/O//e/dCGGxWCyaXD7XJRrEy+e6m8mPHGK4JMbblZOpflOudzQ9oHP1PSItSIUXkrEsGTZMucS4U8nFM5EWXIWjkuGVGN6IYZMYz0lhUTKWdOjryhjs+sWX1lRmRKQFr5AZ1rbwizNHAa7oEIZEGpAM81LBU8PF+0GMj7LgzCVaPLEzSQwv1cL0Waiehzrxc17B8zrjRCLFe2quVzLcfC1weX+8b3XPGQwSUG+eGK+X8mM9sQsghsVftlC4JRVsB9omcB4WEhCAp836/o84jl2AVPgQlgBiuI9dgCUuJMPsx59UYdFVmK2Nh+b/sg7Tei3jtwSfX4u7qAVQwHotE/ymotoBrDtuBUi7A2gt1BL2ELP9Cv1zC1Gn/4ldhVn9IB104MxELcANWC90ohIQGx0vgL55td2A9r3eLDWvtl88Ren1RjFZInHLmLACksbuQNKYWoDQW4SwMbUAsbUIFovFIuLkHXF9GoteFQKSAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","export default \"data:image/png;base64,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\"","import React, { useEffect } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { useAppDispatch } from \"../../app/hooks\";\nimport Loader from \"../../components/common/Loader\";\nimport { updateLocale } from \"../auth/reducer\";\nimport {\n selectClientId,\n selectLocale,\n selectProfileImage,\n selectTurnTime,\n} from \"../auth/selector\";\nimport { usePlayMatchMutation } from \"../match/service\";\nimport Home from \"./Home\";\nimport { useStatisticQuery } from \"./service\";\nimport { useSelector } from \"react-redux\";\n\nconst Container = () => {\n const image = useSelector(selectProfileImage);\n const { data: statistics, isLoading } = useStatisticQuery();\n const navigate = useNavigate();\n const [playMatch, playStatus] = usePlayMatchMutation();\n const dispatch = useAppDispatch();\n const clientId = useSelector(selectClientId);\n const turnTime = useSelector(selectTurnTime);\n const locale = useSelector(selectLocale);\n\n useEffect(() => {\n if (image) {\n navigate(\"/profile\");\n }\n }, [navigate, image]);\n\n useEffect(() => {\n if (playStatus.isSuccess) {\n navigate(`/game/${playStatus.data.id}`);\n }\n }, [playStatus.isSuccess, navigate, playStatus?.data?.id]);\n\n if (isLoading) {\n return ;\n } else {\n return (\n dispatch(updateLocale(l))}\n locale={locale}\n statistics={statistics}\n playVsBots={() => playMatch({ turnTime: turnTime })}\n clientId={clientId}\n />\n );\n }\n};\n\nexport default Container;\n","import React from \"react\";\nimport * as THREE from \"three\";\nimport { Discard } from \"../../../../api/mahjong-api\";\nimport GestureTile from \"../../../../components/three/GestureTile\";\n\nexport type WallProps = JSX.IntrinsicElements[\"mesh\"] & {\n discards?: Discard[];\n ratio?: number;\n};\n\nconst Discards = ({ discards = [], ratio = 1.3 }: WallProps) => {\n const chunkSize = 8;\n const chunks = [];\n for (let i = 0; i < discards.length; i += chunkSize) {\n const chunk = discards.slice(i, i + chunkSize);\n chunks.push(chunk);\n }\n return (\n <>\n {chunks.map((ch, j) => (\n \n {ch?.map((c, i) => (\n \n ))}\n \n ))}\n \n );\n};\nexport default Discards;\n","import styled from \"styled-components\";\n\nexport const Right = styled.div`\n transform: rotate(-90deg);\n`;\n\nexport const Left = styled.div`\n transform: rotate(90deg);\n`;\n\nexport const Opposite = styled.div`\n transform: rotate(180deg);\n`;\n\nexport const Label = styled.div`\n background-color: ${({ theme }) => theme.primary};\n width: 100%;\n color: black;\n text-transform: uppercase;\n font-size: 1rem;\n display: flex;\n margin-bottom: 0.5rem;\n padding-left: 1.5rem;\n padding-right: 1.5rem;\n justify-content: center;\n`;\n\nexport const Frame = styled.div`\n background-color: rgba(0, 0, 0, 0.6);\n border-style: solid;\n display: flex;\n border-radius: 1rem;\n flex-direction: row;\n padding: 0.3rem;\n user-select: none;\n`;\n\nexport const Column = styled.div`\n flex-direction: column;\n display: flex;\n flex-grow: 1;\n font-size: 2rem;\n text-transform: uppercase;\n align-items: center;\n`;\n\nexport const Row = styled.div`\n display: flex;\n background-color: rgba(0, 0, 0, 0.6);\n`;\n\nexport const Badge = styled.div`\n font-size: 1.5rem;\n`;\n","import styled from \"styled-components\";\n\nexport const ActionFrame = styled.div`\n background-color: rgba(0, 0, 0, 0.75);\n min-height: 50px;\n display: flex;\n border-radius: 2rem;\n justify-content: center;\n align-items: center;\n padding: 0.5rem;\n border: 1px solid ${({ theme }) => theme.primary};\n user-select: none;\n`;\n\nexport const ActionText = styled.div`\n text-transform: uppercase;\n display: flex;\n font-size: 2rem;\n padding: 1rem;\n color: ${({ theme }) => theme.primary};\n`;\n\nexport const ActionTile = styled.div`\n padding: 1rem;\n`;\n","import React from \"react\";\nimport Html from \"../../components/common/r3f/Html\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Discard } from \"../../api/mahjong-api\";\nimport { Tile } from \"../../components/game/Tile\";\nimport { ActionFrame, ActionText, ActionTile } from \"./Action.styled\";\nimport { animated, useSpring } from \"@react-spring/three\";\n\nexport type Props = {\n clientId?: string;\n actionType?: string;\n actionValue?: Record;\n lastDiscard?: Discard;\n rotation?: number;\n};\n\nconst Action = ({\n actionType,\n actionValue = {},\n lastDiscard,\n rotation = Math.PI,\n}: Props) => {\n const { posZ } = useSpring({\n from: { posZ: 1 },\n to: { posZ: -2 },\n });\n if (actionType?.includes(\"Capture\")) {\n return null;\n }\n\n return (\n \n \n \n \n \n \n {actionType?.includes(\"Discard\") && lastDiscard?.tile?.code && (\n \n \n \n )}\n \n \n \n );\n};\n\nexport default Action;\n","import styled from \"styled-components\";\n\nexport const CaptureText = styled.div`\n background-color: rgba(0, 0, 0, 0.7);\n border: 0.2rem solid ${({ theme }) => theme.primary};\n text-transform: uppercase;\n display: flex;\n flex-direction: column;\n font-size: 3rem;\n padding: 1.5rem;\n color: ${({ theme }) => theme.primary};\n border-radius: 3rem;\n user-select: none;\n`;\n","export default __webpack_public_path__ + \"static/media/chow.c08cf5da.mp3\";","export default __webpack_public_path__ + \"static/media/pung.59f3185f.mp3\";","export default __webpack_public_path__ + \"static/media/kong.8b24efd1.mp3\";","import Html from \"../../../components/common/r3f/Html\";\nimport { FormattedMessage } from \"react-intl\";\nimport { CaptureKind, CaptureRequest } from \"../../../api/mahjong-api\";\nimport { Meld } from \"../../../components/game/Meld\";\nimport { Props as ActionProps } from \"../Action\";\nimport { useSpring, animated } from \"@react-spring/three\";\nimport { CaptureText } from \"./Capture.styled\";\nimport useSound from \"use-sound\";\nimport chowFx from \"../../../sound/chow.mp3\";\nimport pungFx from \"../../../sound/pung.mp3\";\nimport kongFx from \"../../../sound/kong.mp3\";\n\ntype Props = {\n action?: ActionProps;\n rotation?: number;\n};\n\nconst Capture = ({ action, rotation = Math.PI }: Props) => {\n const captureRequest = action?.actionValue as unknown as CaptureRequest;\n\n const { posZ } = useSpring({\n from: { posZ: 1 },\n to: { posZ: -7 },\n });\n\n const { scale } = useSpring({\n from: { scale: 1 },\n to: { scale: 2 },\n });\n const [chow] = useSound(chowFx);\n const [pung] = useSound(pungFx);\n const [kong] = useSound(kongFx);\n\n if (!captureRequest) {\n return null;\n }\n\n if (captureRequest.kind === CaptureKind.Chow) {\n chow();\n } else if (captureRequest.kind === CaptureKind.Pung) {\n pung();\n } else if (captureRequest.kind === CaptureKind.Kong) {\n kong();\n }\n\n return (\n \n \n {action?.actionType?.includes(\"Capture\") &&\n captureRequest?.meldIds?.length > 0 && (\n \n \n \n \n )}\n \n \n );\n};\n\nexport default Capture;\n","import React from \"react\";\nimport * as THREE from \"three\";\n\nimport Html from \"../../../components/common/r3f/Html\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Row, Column, Frame, Label, Badge } from \"./OpponentStatus.styled\";\nimport Avatar from \"../Avatar\";\nimport { Tile } from \"../../../components/game/Tile\";\nimport { windCodes } from \"../../../components/game/constants\";\nimport Action, { Props as ActionProps } from \"../Action\";\nimport Capture from \"./Capture\";\nimport { Wind } from \"../../../api/mahjong-api\";\nimport { Timer as Icon } from \"@styled-icons/boxicons-regular\";\nimport CountUp from \"react-countup\";\n\ntype Props = {\n action?: ActionProps;\n name?: string;\n image?: string;\n points?: number;\n wind: Wind;\n captureRotation?: number;\n turnTime?: number;\n};\n\nfunction OpponentStatus({\n points = 0,\n wind,\n name,\n image,\n action,\n captureRotation,\n turnTime = 10,\n}: Props) {\n const pos = new THREE.Vector3(0, 3.75, 4.5);\n return (\n \n \n {action && (\n \n )}\n\n \n \n \n {name}\n \n \n \n \n \n \n \n {points}\n \n \n \n \n {(action?.actionType?.includes(\"Draw\") ||\n action?.actionType?.includes(\"Capture\")) && (\n \n )}\n \n \n \n \n \n \n \n );\n}\n\nexport default OpponentStatus;\n","import React, { useRef } from \"react\";\nimport * as THREE from \"three\";\n\nimport { RoundedBox } from \"@react-three/drei\";\nimport { useTheme } from \"styled-components\";\nexport type Props = {\n isOpen?: boolean;\n scale?: number;\n};\n\nfunction Ruler({ scale }: Props) {\n const theme = useTheme();\n const ref = useRef(null!);\n const front = new THREE.Vector3(0, -0.8, -1.5);\n return (\n \n \n \n \n );\n}\n\nexport default Ruler;\n","import React from \"react\";\nimport * as THREE from \"three\";\nimport { Tile } from \"../../../../api/mahjong-api\";\nimport GestureTile from \"../../../../components/three/GestureTile\";\n\ntype Props = JSX.IntrinsicElements[\"mesh\"] & {\n flowers: Tile[];\n ratio?: number;\n zPos?: number;\n};\n\nconst Flowers = ({ flowers = [], ratio = 1, zPos = -2.5 }: Props) => {\n let count = flowers.length || 0;\n const half = Math.floor(count / 2);\n return (\n <>\n \n {flowers?.map((c, i) => (\n \n ))}\n \n \n );\n};\nexport default Flowers;\n","import React from \"react\";\nimport GestureTile from \"../../../../components/three/GestureTile\";\n\nexport type Props = {\n count?: number;\n};\n\nconst Wall = ({ count = 0 }: Props) => {\n const half = Math.floor(count / 2);\n const remainder = count % 2;\n const frontCount = half;\n const backCount = half + remainder;\n return (\n \n \n {[...Array(frontCount)].map((e, i) => (\n \n ))}\n \n \n {[...Array(backCount)].map((e, i) => (\n \n ))}\n \n \n );\n};\nexport default Wall;\n","import {\n CaptureRequest,\n Discard,\n GameFrame,\n GameResult,\n Meld,\n Seat,\n Tile,\n TurnRequest,\n Wind,\n} from \"../../api/mahjong-api\";\nimport { nextWind } from \"../../components/game/constants\";\n\nconst DrawRequestType =\n \"Server.Services.Interfaces.Contracts.Games.DrawTileRequest\";\nconst DiscardRequestType =\n \"Server.Services.Interfaces.Contracts.Games.DiscardRequest\";\nconst CaptureRequestType =\n \"Server.Services.Interfaces.Contracts.Games.CaptureRequest\";\nconst StartRequestType =\n \"Server.Services.Interfaces.Contracts.Matches.StartMatchRequest\";\n\nexport const isDrawReq = (frame?: GameFrame, clientId?: string) =>\n frame?.requestType === DrawRequestType && frame?.requestClientId === clientId;\n\nexport const isCaptureReq = (frame?: GameFrame, clientId?: string) =>\n frame?.requestType === CaptureRequestType &&\n frame?.requestClientId === clientId;\n\nexport const isStartReq = (frame?: GameFrame) =>\n frame?.requestType === StartRequestType;\nexport const isActivePlayer = (\n frame?: GameFrame,\n clientId: string = \"\"\n): boolean =>\n frame?.activeClientId === clientId &&\n !frame?.requestType.includes(\"Discard\") &&\n !frame?.requestType.includes(\"StartMatch\");\n\nexport const isDiscardReq = (frame?: GameFrame, clientId?: string) =>\n frame?.requestType === DiscardRequestType &&\n frame?.activeClientId === clientId;\n\nexport const getCaptureOptions = (\n clientId: string,\n frame?: GameFrame\n): CaptureRequest[] => {\n const isDiscard = frame?.requestType === DiscardRequestType;\n let captureOptions: CaptureRequest[] = [];\n if (frame?.discards?.length && isDiscard) {\n const allOptions = frame?.captureOptions || {};\n if (Object.keys(allOptions).includes(clientId)) {\n captureOptions = allOptions[clientId];\n }\n }\n return captureOptions;\n};\n\nexport const getTurnOptions = (\n clientId: string,\n frame?: GameFrame\n): TurnRequest[] => {\n const seats = frame?.seats || {};\n const turnOptions = seats[clientId].options;\n return turnOptions;\n};\n\nexport const getActiveClientSeat = (frame?: GameFrame): Seat | undefined => {\n const seats = frame?.seats || {};\n return seats && frame?.activeClientId\n ? seats[frame.activeClientId]\n : undefined;\n};\n\nexport type MatchResult = {\n [key: string]: number;\n};\n\nexport const getMatchResult = (\n matchResults: GameResult[],\n gameId?: number\n): MatchResult => {\n const init: MatchResult = {};\n\n const summary = matchResults\n .filter((mr) => mr.gameId !== gameId)\n .reduce((s, c) => {\n const cId: string = c.clientId || \"\";\n if (cId in s) {\n s[cId] += c.points || 0;\n } else {\n s[cId] = c.points || 0;\n }\n return s;\n }, init);\n\n return summary;\n};\n\nexport const getLastDiscard = (discards: Discard[] = []) =>\n discards.length ? discards[discards.length - 1] : undefined;\n\nexport const getActionValue = (frame?: GameFrame) =>\n JSON.parse(frame?.requestValue || \"\");\n\nexport const getSeats = (frame: GameFrame, clientId: string) => {\n const seats = frame?.seats || {};\n const seat = seats[clientId];\n\n const others = Object.keys(seats)\n .filter((s) => s !== clientId)\n .map((o) => seats[o]);\n const rightWind = nextWind.get(seat.wind);\n const right = others.find((o) => o.wind === rightWind);\n const oppositeWind = nextWind.get(rightWind || Wind.East);\n const opposite = others.find((o) => o.wind === oppositeWind);\n const leftWind = nextWind.get(oppositeWind || Wind.East);\n const left = others.find((o) => o.wind === leftWind);\n return [seat, right, opposite, left];\n};\n\nexport const getParts = (\n seat: Seat\n): {\n wind: Wind;\n flowers: Tile[];\n concealed: Tile[];\n melded: Meld[];\n drawn?: Tile;\n} => ({\n wind: seat.wind,\n flowers: seat.hand.flowers,\n concealed: seat.hand.concealed,\n melded: seat.hand.melded,\n drawn: seat.hand.drawn,\n});\n","import React from \"react\";\nimport { Meld, MeldKind } from \"../../../../api/mahjong-api\";\nimport Tile from \"../../../../components/three/GestureTile\";\n\ntype Props = JSX.IntrinsicElements[\"mesh\"] & {\n meld: Meld;\n x?: number;\n ratio?: number;\n};\n\nconst MeldSet = ({ meld, ratio = 1, x = 0 }: Props) => {\n let pos = x;\n\n if (meld.meldKind === MeldKind.Chow && meld.meldWith) {\n const sorted = meld.tiles.filter((t) => t.id !== meld.meldWith?.id);\n sorted.splice(1, 0, meld.meldWith);\n return (\n <>\n {sorted.map((c, j) => (\n \n ))}\n \n );\n } else {\n return (\n <>\n {meld.tiles.map((c, j) => (\n \n ))}\n \n );\n }\n};\n\nexport default MeldSet;\n","import React from \"react\";\nimport { Meld } from \"../../../../api/mahjong-api\";\nimport MeldSet from \"./Meld\";\n\ntype Props = JSX.IntrinsicElements[\"mesh\"] & {\n melded: Meld[];\n x?: number;\n ratio?: number;\n};\n\nconst Melded = ({ melded, ratio = 1, x = 0 }: Props) => {\n let pos = x;\n return (\n <>\n {melded?.map((m, i) => {\n const result = (\n \n );\n pos += m.tiles.length;\n return result;\n })}\n \n );\n};\n\nexport default Melded;\n","import React, { useEffect, useState } from \"react\";\nimport * as THREE from \"three\";\n\nimport { useLoader } from \"@react-three/fiber\";\nimport { tilePaths } from \"./lookup\";\nimport { animated, SpringValue, useSpring } from \"@react-spring/three\";\nimport BaseTile from \"./BaseTile\";\nexport type Props = {\n code: string;\n x: number;\n scale?: number;\n isActive?: boolean;\n tapped?: boolean;\n shouldReset?: boolean;\n startTap?: () => void;\n onClick?: () => void;\n rotateX?: number | SpringValue;\n rotateY?: number | SpringValue;\n positionZ?: number | SpringValue;\n};\n\nfunction TapTile({\n x: start = 0,\n isActive = false,\n tapped = false,\n shouldReset = true,\n startTap = () => {},\n code,\n scale = 1,\n onClick = () => {},\n rotateX = 0,\n rotateY = 0,\n positionZ = 0,\n}: Props) {\n const [{ x, y, z }, api] = useSpring(() => ({ x: 0, y: 0, z: positionZ }));\n\n const texture = useLoader(THREE.TextureLoader, tilePaths[code]);\n const [selected, setSelected] = useState(false);\n texture.minFilter = THREE.LinearFilter;\n useEffect(() => {\n if ((!isActive && shouldReset) || !tapped) {\n setSelected(false);\n api.start({ x: 0, y: 0, z: 0 });\n }\n }, [isActive, api, shouldReset, tapped]);\n\n const handleTap = () => {\n if (!isActive) {\n setSelected(false);\n api.start({ x: 0, y: 0, z: 0 });\n return;\n }\n\n if (!selected) {\n setSelected(true);\n startTap();\n api.start({\n x: 0,\n y: 3,\n z: 0,\n });\n } else {\n setSelected(false);\n api.start({\n x: 10 - start,\n y: 0,\n z: -1.5,\n onRest: () => onClick(),\n });\n }\n };\n return (\n handleTap()}\n rotation-x={rotateX}\n rotation-y={rotateY}\n position-x={x}\n position-z={z}\n position-y={y}\n >\n \n \n );\n}\n\nexport default TapTile;\n","import React from \"react\";\nimport { useSpring, useChain, useSpringRef } from \"@react-spring/three\";\nimport { Tile } from \"../../../../api/mahjong-api\";\nimport GestureTile from \"../../../../components/three/GestureTile\";\nimport { useSelector } from \"react-redux\";\nimport { selectDiscardStyle } from \"../../../auth/selector\";\nimport { DiscardStyle } from \"../../../profile/DiscardStyle\";\nimport TapTile from \"../../../../components/three/TapTile\";\n\ntype Props = JSX.IntrinsicElements[\"mesh\"] & {\n dragId?: number;\n setDragId?: (id: number) => void;\n isActive?: boolean;\n x?: number;\n concealed: Tile[];\n ratio?: number;\n onConcealedClick?: (tileId: number) => void;\n};\n\nconst Concealed = ({\n concealed,\n isActive = false,\n dragId = -1,\n setDragId = (id: number) => {},\n ratio = 1,\n x = 0,\n onConcealedClick = () => {},\n}: Props) => {\n const posZRef = useSpringRef();\n const rotXRef = useSpringRef();\n const discardStyle = useSelector(selectDiscardStyle);\n\n const { positionZ } = useSpring({\n from: { positionZ: -15 },\n to: { positionZ: 0 },\n ref: posZRef,\n });\n\n const { rotateX } = useSpring({\n from: { rotateX: Math.PI / 2 },\n to: { rotateX: 0 },\n ref: rotXRef,\n });\n\n useChain([posZRef, rotXRef]);\n let pos = x;\n\n if (discardStyle === DiscardStyle.Tap) {\n return (\n <>\n {[...(concealed || [])]\n .sort((a, b) => a.id - b.id)\n ?.map((t, i) => (\n setDragId(t.id)}\n isActive={isActive}\n x={pos++ * 1.2 * ratio + 1}\n code={t.code}\n key={`${t.id}`}\n scale={ratio}\n positionZ={positionZ}\n rotateX={rotateX}\n onClick={() => onConcealedClick(t.id)}\n />\n ))}\n \n );\n } else {\n return (\n <>\n {[...(concealed || [])]\n .sort((a, b) => a.id - b.id)\n ?.map((t, i) => (\n setDragId(t.id)}\n endDrag={() => setDragId(-1)}\n isActive={isActive}\n x={pos++ * 1.2 * ratio + 1}\n code={t.code}\n key={`${t.id}`}\n scale={ratio}\n positionZ={positionZ}\n rotateX={rotateX}\n onClick={() => onConcealedClick(t.id)}\n />\n ))}\n \n );\n }\n};\n\nexport default Concealed;\n","import React from \"react\";\nimport { useSpring } from \"@react-spring/three\";\nimport { Tile } from \"../../../../api/mahjong-api\";\nimport GestureTile from \"../../../../components/three/GestureTile\";\n\ntype Props = JSX.IntrinsicElements[\"mesh\"] & {\n lastDiscard?: Tile;\n isDiscardRequest?: boolean;\n ratio?: number;\n x?: number;\n};\n\nconst Discard = ({\n lastDiscard,\n ratio = 1,\n isDiscardRequest,\n x = 0,\n}: Props) => {\n const { discardZ } = useSpring({\n from: { discardZ: -1.5 },\n to: { discardZ: -4.5 },\n });\n const { discardR } = useSpring({\n from: { discardR: 0 },\n to: { discardR: -Math.PI / 2 },\n });\n\n return (\n <>\n {isDiscardRequest && lastDiscard?.id && (\n \n )}\n \n );\n};\nexport default Discard;\n","import React from \"react\";\n\nimport { useSpring, useChain, useSpringRef } from \"@react-spring/three\";\nimport GestureTile from \"../../../../components/three/GestureTile\";\nimport { useSelector } from \"react-redux\";\nimport { selectDiscardStyle } from \"../../../auth/selector\";\nimport TapTile from \"../../../../components/three/TapTile\";\nimport { DiscardStyle } from \"../../../profile/DiscardStyle\";\nexport type Props = {\n isActive?: boolean;\n dragId?: number;\n setDragId?: (id: number) => void;\n code: string;\n x: number;\n scale?: number;\n onClick?: () => void;\n};\n\nconst Tile = ({\n isActive = false,\n x = 0,\n code,\n scale = 1,\n onClick,\n dragId = -1,\n setDragId = () => {},\n}: Props) => {\n const springRef = useSpringRef();\n const transitionRef = useSpringRef();\n\n const { positionZ } = useSpring({\n from: { positionZ: -5 },\n to: { positionZ: 0 },\n ref: springRef,\n });\n const { rotateX } = useSpring({\n from: { rotateX: Math.PI / 2 },\n to: { rotateX: 0 },\n ref: transitionRef,\n });\n\n const discardStyle = useSelector(selectDiscardStyle);\n useChain([springRef, transitionRef]);\n\n if (discardStyle === DiscardStyle.Tap) {\n return (\n setDragId(0)}\n isActive={isActive}\n rotateX={rotateX}\n positionZ={positionZ}\n x={x}\n code={code}\n scale={scale}\n onClick={onClick}\n />\n );\n } else {\n return (\n setDragId(0)}\n endDrag={() => setDragId(-1)}\n isActive={isActive}\n rotateX={rotateX}\n positionZ={positionZ}\n x={x}\n code={code}\n scale={scale}\n onClick={onClick}\n />\n );\n }\n};\n\nexport default Tile;\n","import React from \"react\";\nimport {\n Discard as IDiscard,\n Tile,\n Seat,\n Player,\n} from \"../../../api/mahjong-api\";\nimport Discards from \"./hand/Discards\";\nimport OpponentStatus from \"./OpponentStatus\";\nimport Ruler from \"./hand/Ruler\";\nimport Flowers from \"./hand/Flowers\";\nimport Wall from \"./hand/Wall\";\nimport { getLastDiscard, getParts } from \"../frame\";\nimport Melded from \"./hand/Melded\";\nimport Concealed from \"./hand/Concealed\";\nimport Discard from \"./hand/Discard\";\nimport Drawn from \"./hand/Drawn\";\nimport { Props as ActionProps } from \"../Action\";\n\nexport type SeatProps = JSX.IntrinsicElements[\"mesh\"] & {\n turnTime?: number;\n action?: ActionProps;\n seat: Seat;\n outOn?: Tile;\n isDrawRequest?: boolean;\n isDiscardRequest?: boolean;\n ratio?: number;\n allDiscards?: IDiscard[];\n isOpen?: boolean;\n player?: Player;\n wallCount?: number;\n points?: number;\n captureRotation?: number;\n};\n\nconst OpponentSeat = ({\n turnTime = 10,\n action,\n seat,\n ratio = 1.3,\n rotation,\n position,\n allDiscards = [],\n isDrawRequest = false,\n isDiscardRequest = false,\n points = 0,\n isOpen = false,\n player,\n wallCount,\n captureRotation,\n}: SeatProps) => {\n const { wind, flowers, concealed, melded, drawn } = getParts(seat);\n\n const discards = allDiscards.filter(\n (d) => d.discardPlayerId === seat?.clientId\n );\n const lastDiscard = getLastDiscard(discards);\n\n const concealedCount = concealed.length;\n const meldedCount = melded.reduce((a, b) => a + b.tiles.length, 0);\n const totalCount = concealedCount + meldedCount;\n const half = Math.ceil(totalCount / 2);\n const shownDiscards = discards.filter(\n (d) =>\n !(isDiscardRequest && d.tile?.id === lastDiscard?.tile?.id) &&\n !d.claimedBy\n );\n const start = -(half + 2);\n return (\n \n \n \n \n \n\n \n \n \n {isDrawRequest && drawn && (\n \n )}\n \n \n );\n};\nexport default OpponentSeat;\n","import styled from \"styled-components\";\n\nexport const Right = styled.div`\n transform: rotate(-90deg);\n`;\n\nexport const Left = styled.div`\n transform: rotate(90deg);\n`;\n\nexport const Opposite = styled.div`\n transform: rotate(180deg);\n`;\n\nexport const Frame = styled.div`\n background-color: rgba(0, 0, 0, 0.6);\n width: 100vw;\n display: flex;\n flex-direction: row;\n justify-content: space-around;\n border-radius: 0rem;\n font-size: 0.9rem;\n padding-top: 0.3rem;\n padding-bottom: 0.3rem;\n padding-left: 2rem;\n padding-right: 2rem;\n border-radius: 2rem;\n user-select: none;\n`;\n\nexport const TimerFrame = styled.div`\n background-color: rgba(0, 0, 0, 0.6);\n display: flex;\n align-items: center;\n border-radius: 3rem;\n padding: 0.5rem;\n min-width: 4rem;\n white-space: nowrap;\n user-select: none;\n`;\n\nexport const Urgent = styled.div`\n color: ${({ theme }) => theme.primary};\n margin-right: 1rem;\n`;\n\nexport const Column = styled.div`\n flex-direction: column;\n flex-grow: 1;\n font-size: 2.5rem;\n text-transform: uppercase;\n`;\n","import React from \"react\";\nimport * as THREE from \"three\";\n\nimport Html from \"../../../components/common/r3f/Html\";\nimport { Wind } from \"../../../api/mahjong-api\";\nimport { Frame } from \"./PlayerStatus.styled\";\nimport { FormattedMessage } from \"react-intl\";\n\nexport type Props = {\n name?: string;\n image?: string;\n points?: number;\n wind: Wind;\n remainingCount?: number;\n isActive?: boolean;\n};\n\nfunction PlayerStatus({ points = 0, wind = Wind.East, name = \"Guest\" }: Props) {\n const back = new THREE.Vector3(0, -2, 0);\n return (\n \n \n
\n {name || \"Guest\"} : {wind} \n
\n
\n : {points}\n
\n \n \n );\n}\n\nexport default PlayerStatus;\n","import React from \"react\";\nimport * as THREE from \"three\";\n\nimport Html from \"../../../components/common/r3f/Html\";\nimport { FormattedMessage } from \"react-intl\";\nimport { TimerFrame, Urgent } from \"./PlayerStatus.styled\";\nimport { Timer as Icon } from \"@styled-icons/boxicons-regular\";\nimport CountUp from \"react-countup\";\n\nexport type Props = {\n turnTime?: number;\n message?: string;\n};\n\nfunction Timer({ message, turnTime = 10 }: Props) {\n const back = new THREE.Vector3(0, 4, 0);\n return (\n \n \n \n \n \n \n {message && }\n \n \n );\n}\n\nexport default Timer;\n","import React, { useEffect, useState } from \"react\";\nimport Discards from \"./hand/Discards\";\nimport Ruler from \"./hand/Ruler\";\nimport Flowers from \"./hand/Flowers\";\nimport PlayerStatus from \"./PlayerStatus\";\nimport Wall from \"./hand/Wall\";\nimport { getLastDiscard, getParts } from \"../frame\";\nimport Melded from \"./hand/Melded\";\nimport Concealed from \"./hand/Concealed\";\nimport Discard from \"./hand/Discard\";\nimport { SeatProps as BaseSeatProps } from \"./OpponentSeat\";\nimport Timer from \"./Timer\";\nimport Drawn from \"./hand/Drawn\";\n\nexport type SeatProps = BaseSeatProps &\n JSX.IntrinsicElements[\"mesh\"] & {\n turnTime?: number;\n isActive?: boolean;\n showTimer?: boolean;\n sequence?: number;\n onConcealedClick?: (tileId: number) => void;\n };\n\nconst PlayerSeat = ({\n turnTime = 10,\n sequence = 1,\n seat,\n ratio = 1,\n rotation,\n position,\n allDiscards = [],\n isDrawRequest = false,\n isDiscardRequest = false,\n isOpen = false,\n player,\n wallCount,\n isActive = false,\n showTimer = false,\n points = 0,\n onConcealedClick,\n}: SeatProps) => {\n const { wind, flowers, concealed, melded, drawn } = getParts(seat);\n\n const discards = allDiscards.filter(\n (d) => d.discardPlayerId === seat?.clientId\n );\n const lastDiscard = getLastDiscard(discards);\n const meldedCount = melded.reduce((a, b) => a + b.tiles.length, 0);\n const totalCount = concealed.length + meldedCount;\n const half = Math.ceil(totalCount / 2);\n const shownDiscards = discards.filter(\n (d) =>\n !(isDiscardRequest && d.tile?.id === lastDiscard?.tile?.id) &&\n !d.claimedBy\n );\n const start = -(half + 2.5);\n\n const [dragId, setDragId] = useState(-1);\n\n useEffect(() => setDragId(-1), [isActive]);\n return (\n \n \n \n \n {showTimer && (\n \n )}\n \n \n \n \n {isDrawRequest && drawn && (\n onConcealedClick && onConcealedClick(drawn.id)}\n />\n )}\n \n \n );\n};\nexport default PlayerSeat;\n","import styled from \"styled-components\";\n\nexport const Wrapper = styled.div`\n background-color: rgba(0, 0, 0, 0.5);\n min-height: 50px;\n display: flex;\n border-style: solid;\n border-color: ${({ theme }) => theme.primary};\n border-radius: 3rem;\n border-width: 0.5rem;\n justify-content: space-evenly;\n cursor: pointer;\n user-select: none;\n`;\n\nexport const Start = styled.div`\n padding: 1rem;\n font-size: 1.5rem;\n &:hover {\n color: ${({ theme }) => theme.primary};\n }\n &:active {\n font-size: 1.75rem;\n }\n`;\n\nexport const Button = styled.button`\n font-family: ${({ theme }) => theme.heading};\n text-transform: uppercase;\n font-size: 1.8rem;\n white-space: nowrap;\n padding: 1rem;\n color: ${({ theme }) => theme.primary};\n background-color: rgba(0, 0, 0, 0);\n letter-spacing: 1.25px;\n border-radius: 4px;\n border: none;\n cursor: pointer;\n &:hover {\n color: white;\n }\n &:active {\n transform: translateY(0.4rem);\n }\n`;\n","import React from \"react\";\nimport { CaptureRequest } from \"../../../api/mahjong-api\";\nimport { Wrapper, Button } from \"./Options.styled\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Meld } from \"../../../components/game/Meld\";\n\nexport type Props = {\n options: CaptureRequest[];\n capture?: (request: CaptureRequest) => void;\n};\n\nconst CaptureOptions = ({ options, capture = () => {} }: Props) => {\n return (\n \n {options.map((opt, i) => (\n \n ))}\n \n );\n};\nexport default CaptureOptions;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { CaptureKind, TurnRequest } from \"../../../api/mahjong-api\";\nimport { Wrapper, Button } from \"./Options.styled\";\nimport { Meld } from \"../../../components/game/Meld\";\n\nexport type Props = {\n options: TurnRequest[];\n kong?: (tr: TurnRequest) => void;\n win?: (tr: TurnRequest) => void;\n};\n\nconst TurnOptions = ({\n options,\n kong = () => {},\n win = () => {},\n}: Props) => {\n const turnClick = (o: TurnRequest) => {\n switch (o.kind) {\n case CaptureKind.Kong:\n kong(o);\n break;\n case CaptureKind.Win:\n win(o);\n break;\n }\n };\n return (\n \n {options.map((opt, i) => (\n \n ))}\n \n );\n};\nexport default TurnOptions;\n","import { CaptureRequest, TurnRequest } from \"../../../api/mahjong-api\";\nimport CaptureOptions from \"./CaptureOptions\";\nimport TurnOptions from \"./TurnOptions\";\nimport { FormattedMessage } from \"react-intl\";\n\nimport Html from \"../../../components/common/r3f/Html\";\nimport { animated, useSpring } from \"@react-spring/three\";\nimport { useEffect, useState } from \"react\";\nimport { config } from \"@react-spring/web\";\nimport { Wrapper, Start } from \"./Options.styled\";\n\nexport type OptionsActionProps = {\n draw?: () => void;\n capture?: (request: CaptureRequest) => void;\n selfKong?: (request: TurnRequest) => void;\n selfPick?: (request: TurnRequest) => void;\n};\n\ntype Props = OptionsActionProps & {\n isStart?: boolean;\n turnOptions?: TurnRequest[];\n captureOptions?: CaptureRequest[];\n};\n\nexport const Options = ({\n isStart = false,\n turnOptions = [],\n captureOptions = [],\n draw = () => {},\n capture = () => {},\n selfKong = () => {},\n selfPick = () => {},\n}: Props) => {\n const [{ scale, y }, api] = useSpring(() => ({\n scale: 2.5,\n y: 0,\n config: config.slow,\n }));\n const [enabled, setEnabled] = useState(true);\n const handleCapture = (req: CaptureRequest) => {\n setEnabled(false);\n capture(req);\n };\n\n const handleKong = (req: TurnRequest) => {\n setEnabled(false);\n selfKong(req);\n };\n\n const handleWin = (req: TurnRequest) => {\n setEnabled(false);\n selfPick(req);\n };\n\n const handleStart = () => {\n setEnabled(false);\n draw();\n };\n\n useEffect(() => {\n if (!enabled) {\n api.start({ scale: 1, y: 50 });\n }\n }, [enabled, api]);\n\n return (\n \n \n {isStart && turnOptions.length > 0 && (\n \n handleStart()}>\n \n \n \n )}\n {captureOptions.length > 1 && (\n \n )}\n {!isStart && turnOptions.length > 0 && (\n \n )}\n \n \n );\n};\n\nexport default Options;\n","import React from \"react\";\nimport { GameFrame, GameResult } from \"../../../api/mahjong-api\";\nimport OpponentSeat from \"./OpponentSeat\";\nimport PlayerSeat from \"./PlayerSeat\";\nimport { PlayerMap } from \"../Game\";\nimport { Props as ActionProps } from \"../Action\";\nimport {\n isActivePlayer,\n isDiscardReq,\n isDrawReq,\n getActionValue,\n getCaptureOptions,\n getLastDiscard,\n getTurnOptions,\n getSeats,\n isCaptureReq,\n isStartReq,\n} from \"../frame\";\nimport Options, { OptionsActionProps } from \"../options/Options\";\n\nexport type Props = OptionsActionProps & {\n clientId: string;\n turnTime?: number;\n playerMap?: PlayerMap;\n matchResults?: GameResult[];\n frame?: GameFrame;\n discard?: (tileId: number) => void;\n};\n\nconst Seats = ({\n turnTime = 10,\n frame,\n clientId,\n matchResults = [],\n playerMap = {},\n draw = () => {},\n capture = () => {},\n selfKong = () => {},\n selfPick = () => {},\n discard = () => {},\n}: Props) => {\n if (!frame) {\n return null;\n }\n\n const [seat, right, opposite, left] = getSeats(frame, clientId);\n\n if (!seat || !right || !left || !opposite) {\n return null;\n }\n\n const allDiscards = frame?.discards || [];\n\n const allRemaining = frame?.wallCount || 0;\n const wallLength = 24;\n const walls = Math.floor(allRemaining / wallLength);\n const remainder = allRemaining % wallLength;\n\n const turnOptions = getTurnOptions(clientId, frame);\n const captureOptions = getCaptureOptions(clientId, frame);\n const action: ActionProps = {\n actionType: frame?.requestType,\n actionValue: getActionValue(frame),\n lastDiscard: getLastDiscard(frame?.discards || []),\n clientId: frame?.requestClientId,\n };\n const isPlayerActive = isActivePlayer(frame, clientId);\n\n const showTimer =\n !isStartReq(frame) &&\n (isDrawReq(frame, clientId) ||\n isCaptureReq(frame, clientId) ||\n turnOptions.length > 0 ||\n captureOptions.length > 1);\n return (\n \n {!frame?.isComplete && (\n \n )}\n\n {/* Opposite, pushed back and turned 180 on Y */}\n mr.clientId === opposite?.clientId)\n .reduce((accumulator, obj) => {\n return accumulator + (obj.points || 0);\n }, 0)}\n position={[0, 1, -15]}\n rotation={[0, Math.PI, 0]}\n isDrawRequest={isDrawReq(frame, opposite?.clientId)}\n allDiscards={allDiscards}\n isDiscardRequest={isDiscardReq(frame, opposite?.clientId)}\n wallCount={walls >= 2 ? wallLength : walls === 1 ? remainder : 0}\n />\n\n {/* Left, pushed back and turned -90 on Y */}\n mr.clientId === left?.clientId)\n .reduce((accumulator, obj) => {\n return accumulator + (obj.points || 0);\n }, 0)}\n position={[-16, 1, 0]}\n rotation={[0, -Math.PI / 2, 0]}\n isDrawRequest={isDrawReq(frame, left?.clientId)}\n allDiscards={allDiscards}\n isDiscardRequest={isDiscardReq(frame, left?.clientId)}\n wallCount={walls >= 1 ? wallLength : remainder}\n captureRotation={Math.PI / 2}\n />\n\n {/* Right, pushed back and turned -90 on Y */}\n mr.clientId === right?.clientId)\n .reduce((accumulator, obj) => {\n return accumulator + (obj.points || 0);\n }, 0)}\n isDrawRequest={isDrawReq(frame, right?.clientId)}\n position={[16, 1, 0]}\n rotation={[0, Math.PI / 2, 0]}\n allDiscards={allDiscards}\n isDiscardRequest={isDiscardReq(frame, right?.clientId)}\n wallCount={walls === 3 ? wallLength : walls === 2 ? remainder : 0}\n captureRotation={-Math.PI / 2}\n />\n\n {/* Client First person view hand */}\n mr.clientId === clientId)\n .reduce((accumulator, obj) => {\n return accumulator + (obj.points || 0);\n }, 0)}\n ratio={1.3}\n isDrawRequest={isDrawReq(frame, clientId)}\n position={[0, 1.1, 16.5]}\n rotation={[0, 0, 0]}\n allDiscards={allDiscards}\n onConcealedClick={(tileId) => isPlayerActive && discard(tileId)}\n isDiscardRequest={isDiscardReq(frame, clientId)}\n isActive={isPlayerActive}\n wallCount={walls === 3 ? remainder : 0}\n showTimer={showTimer}\n />\n \n );\n};\nexport default Seats;\n","import styled from \"styled-components\";\n\nexport const ViewPort = styled.div<{ visible?: boolean }>`\n background-color: transparent;\n width: 100vw;\n height: 50vw;\n margin-left: 0px;\n margin-right: 0px;\n display: ${({ visible }) => (visible ? \"flex\" : \"none\")};\n flex-direction: column;\n z-index: 90;\n user-select: none;\n canvas {\n touch-action: none;\n }\n`;\n\nexport const TitleText = styled.div`\n text-transform: uppercase;\n font-family: ${({ theme }) => theme.title};\n font-size: 3rem;\n color: black;\n`;\n\nexport const LoadingText = styled.div`\n white-space: nowrap;\n`;\n\nexport const Wrapper = styled.div<{ visible?: boolean }>`\n display: ${({ visible }) => (visible ? \"flex\" : \"none\")};\n height: 100vh;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n`;\n","import { RoundedBox } from \"@react-three/drei\";\nimport { Color } from \"three\";\n\nconst TableTop = () => {\n const brown = new Color(0x362419);\n const w = 38;\n const d = 1.2;\n const dd = 1.2;\n const h = 0.2;\n const p = 18.5;\n const r = 0.3;\n\n return (\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default TableTop;\n","import styled from \"styled-components\";\n\nexport const Frame = styled.div`\n background-color: rgba(0, 0, 0, 0.6);\n display: flex;\n border-radius: 1rem;\n flex-direction: row;\n user-select: none;\n`;\n\nexport const Title = styled.div`\n font-family: ${({ theme }) => theme.title};\n color: black;\n font-size: 2.5rem;\n display: flex;\n flex-direction: row;\n justify-content: center;\n`;\n\nexport const ChangeView = styled.div`\n background-color: rgba(0, 0, 0, 0.5);\n min-height: 50px;\n display: flex;\n border-style: solid;\n border-color: ${({ theme }) => theme.primary};\n border-radius: 3rem;\n border-width: 0.5rem;\n justify-content: space-evenly;\n user-select: none;\n`;\n","import React, { useState } from \"react\";\nimport * as THREE from \"three\";\nimport Html from \"../../components/common/r3f/Html\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Wind } from \"../../api/mahjong-api\";\nimport { Column, Label } from \"./seating/OpponentStatus.styled\";\nimport { ChangeView, Frame } from \"./MatchInfo.styled\";\nimport { ConferenceRoom } from \"@styled-icons/fluentui-system-filled\";\nimport { StreetView } from \"@styled-icons/boxicons-regular\";\nimport { useFrame } from \"@react-three/fiber\";\nimport { Vector3 } from \"three\";\n\ntype Props = {\n round?: Wind;\n gameId?: number;\n matchId?: number;\n remainingCount?: number;\n showHistory?: () => void;\n goToLobby?: () => void;\n};\n\nconst MatchInfo = ({\n round,\n gameId,\n matchId,\n remainingCount,\n showHistory = () => {},\n goToLobby,\n}: Props) => {\n let position = new THREE.Vector3(15.5, 11.5, 0);\n let rotX = 0;\n const [topDown, setTopDown] = useState(false);\n\n const handleViewClick = () => {\n if (topDown) {\n setTopDown(false);\n rotX = 0;\n } else {\n setTopDown(true);\n rotX = Math.PI / 2;\n }\n };\n\n useFrame((state) => {\n if (topDown) {\n state.camera.lookAt(new Vector3(0, 0, 0));\n state.camera.position.lerp(new Vector3(0, 30, 12), 0.1);\n } else {\n state.camera.lookAt(new Vector3(0, 0, 0));\n state.camera.position.lerp(new Vector3(0, 16, 32), 0.1);\n }\n });\n\n return (\n <>\n {topDown && (\n \n \n handleViewClick()} />\n \n \n )}\n \n \n {matchId && (\n {\n showHistory();\n }}\n >\n \n {matchId}\n \n )}\n {round && (\n \n \n \n \n )}\n {(gameId || 0) > 0 && (\n \n \n {gameId}\n \n )}\n {remainingCount && (\n \n \n {remainingCount}\n \n )}\n \n \n handleViewClick()} />\n \n \n \n \n \n \n \n \n );\n};\n\nexport default MatchInfo;\n","import Html from \"../../components/common/r3f/Html\";\nimport { FormattedMessage } from \"react-intl\";\nimport { LoadingText } from \"./Game.styled\";\n\nconst Loader = () => {\n return (\n \n \n \n \n \n );\n};\n\nexport default Loader;\n","import React from \"react\";\nimport { RoundedBox } from \"@react-three/drei\";\nimport { Color } from \"three\";\nconst brown = new Color(0x362419);\nconst width = 180;\nconst BackWall = () => {\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default BackWall;\n","import { RoundedBox } from \"@react-three/drei\";\nimport React from \"react\";\nimport { Color } from \"three\";\nconst chair = new Color(0x2a2a26);\n\nconst Ground = () => {\n return (\n <>\n \n \n \n \n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default Ground;\n","import React, { Suspense } from \"react\";\nimport { GameFrame, GameResult, Player } from \"../../api/mahjong-api\";\nimport Seats from \"./seating/Seats\";\nimport { LoadingText, ViewPort } from \"./Game.styled\";\nimport Canvas from \"../../components/common/r3f/Canvas\";\nimport { OrbitControls, PerspectiveCamera } from \"@react-three/drei\";\nimport TableTop from \"./TableTop\";\nimport Html from \"../../components/common/r3f/Html\";\nimport MatchInfo from \"./MatchInfo\";\nimport { TitleText } from \"./Game.styled\";\nimport { tilePaths } from \"../../components/three/lookup\";\nimport Tile from \"../../components/three/GestureTile\";\nimport Loader from \"./Loader\";\nimport BackWall from \"./scene/BackWall\";\nimport Ground from \"./scene/Ground\";\nimport { OptionsActionProps } from \"./options/Options\";\nimport { FormattedMessage } from \"react-intl\";\n\nexport type PlayerMap = { [key: string]: Player };\n\ntype Props = OptionsActionProps & {\n frame?: GameFrame;\n clientId: string;\n playerMap?: PlayerMap;\n matchResults?: GameResult[];\n enableControls?: boolean;\n turnTime?: number;\n discard?: (tileId: number) => void;\n continueMatch?: () => void;\n goToLobby?: () => void;\n visible?: boolean;\n};\n\nconst Game = ({\n frame,\n clientId,\n turnTime = 10,\n playerMap = {},\n matchResults = [],\n enableControls = false,\n draw,\n discard,\n capture,\n selfKong,\n selfPick,\n goToLobby,\n visible = false,\n}: Props) => {\n return (\n \n \n {enableControls && }\n \n \n \n \n \n \n \n \n \n {!frame && (\n \n \n \n \n \n )}\n\n \n\n }>\n {visible && (\n \n )}\n \n {Object.keys(tilePaths).map((c, i) => (\n \n ))}\n \n \n\n \n \n \n );\n};\n\nexport default Game;\n","import { RootState } from \"../../app/store\";\n\n// Other code such as selectors can use the imported `RootState` type\nexport const selectGameFrame = (state: RootState) => state.game.currentFrame;\n\nexport const selectHasNextFrame = (state: RootState) =>\n state.game.bufferFrames.length > 0;\n","import { createApi, fetchBaseQuery } from \"@reduxjs/toolkit/query/react\";\nimport {\n DiscardRequest,\n CaptureRequest,\n TurnRequest,\n DrawTileRequest,\n} from \"../../api/mahjong-api\";\nimport { RootState } from \"../../app/store\";\nimport { selectClientId } from \"../auth/selector\";\n\nconst apiUrl = window._env_.API_URL;\nconst tag = \"Matches\";\n// Define a service using a base URL and expected endpoints\nexport const gameApi = createApi({\n reducerPath: \"matchesApi\",\n tagTypes: [tag],\n baseQuery: fetchBaseQuery({\n baseUrl: `${apiUrl}/api/match`,\n prepareHeaders: (headers, { getState }) => {\n headers.set(\"clientId\", selectClientId(getState() as RootState));\n return headers;\n },\n }),\n endpoints: (builder) => ({\n discardTile: builder.mutation({\n query: (body) => ({\n url: `/discard`,\n body,\n method: \"POST\",\n }),\n }),\n captureTile: builder.mutation({\n query: (body) => ({\n url: `/capture`,\n body,\n method: \"POST\",\n }),\n }),\n selfPick: builder.mutation({\n query: (body) => ({\n url: `/self-pick`,\n body,\n method: \"POST\",\n }),\n }),\n selfKong: builder.mutation({\n query: (body) => ({\n url: `/concealed-kong`,\n body,\n method: \"POST\",\n }),\n }),\n draw: builder.mutation({\n query: (body) => ({\n url: `/draw`,\n body,\n method: \"POST\",\n }),\n }),\n }),\n});\n\n// Export hooks for usage in functional components, which are\n// auto-generated based on the defined endpoints\nexport const {\n useDiscardTileMutation,\n useCaptureTileMutation,\n useSelfKongMutation,\n useSelfPickMutation,\n useDrawMutation,\n} = gameApi;\n","import styled from \"styled-components\";\nimport { Button as BaseButton } from \"../../../components/common/Buttons.styled\";\n\nexport const Frame = styled.div`\n width: 100vw;\n min-height: 55vw;\n font-weight: bolder;\n background-color: rgba(0, 0, 0, 0.75);\n font-size: 2rem;\n display: flex;\n flex-direction: column;\n justify-content: center;\n padding: 2rem;\n`;\n\nexport const Row = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n font-size: 0.7rem;\n align-items: center;\n`;\n\nexport const WinnerRow = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n font-size: 1rem;\n align-items: center;\n margin-bottom: 0.3rem;\n`;\n\nexport const CardRow = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n font-size: 0.7rem;\n align-items: top;\n`;\n\nexport const ScoreCard = styled.div`\n border-radius: 5px;\n font-weight: bolder;\n color: ${({ theme }) => theme.primary};\n display: flex;\n flex-direction: column;\n padding-bottom: 1rem;\n margin-right: 1rem;\n`;\n\nexport const Card = styled.div`\n border-radius: 4px;\n font-weight: bolder;\n color: ${({ theme }) => theme.primary};\n font-size: 1rem;\n display: flex;\n flex-direction: column;\n justify-content: space-evenly;\n`;\n\nexport const Button = styled(BaseButton)`\n text-transform: uppercase;\n padding-left: 2rem;\n padding-right: 2rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-size: 1.5rem;\n`;\n\nexport const Score = styled.div`\n padding: 0.25rem;\n font-size: 1rem;\n`;\n\nexport const Total = styled.div`\n margin-top: 0.5rem;\n font-size: 1.2rem;\n background-color: rgba(255, 255, 255, 0.25);\n`;\n\nexport const Column = styled.div`\n display: flex;\n flex-direction: column;\n`;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { GameFrame } from \"../../../api/mahjong-api\";\nimport { PointsBreakdown } from \"../../../components/game/PointsBreakdown\";\nimport Hand from \"../../scoring/list/Hand\";\nimport Avatar from \"../Avatar\";\nimport { MatchResult } from \"../frame\";\nimport { PlayerMap } from \"../Game\";\nimport { Card, Row, Score, ScoreCard, Total } from \"./GameOver.styled\";\n\nexport type Props = {\n frame?: GameFrame;\n clientId?: string;\n playerMap: PlayerMap;\n currentScore?: MatchResult;\n};\n\nconst SelfPickWin = ({ frame, playerMap, currentScore = {} }: Props) => {\n const clientId = frame?.requestClientId;\n const seats = frame?.seats || {};\n const winnerScore = currentScore[clientId || \"\"] || 0;\n const winningSeat = frame?.seats[clientId || \"\"];\n const losingSeats = Object.values(seats).filter(\n (s) => s.clientId !== clientId\n );\n const player = playerMap[clientId || \"\"];\n const result = winningSeat?.result;\n const hand = winningSeat?.hand;\n const winningPoints = winningSeat?.result?.totalPoints || 0;\n return (\n \n \n \n \n \n \n \n \n \n \n {result && }\n \n\n \n \n \n \n {winnerScore}+{winningPoints}={winnerScore + winningPoints}\n \n \n \n \n {losingSeats.map((s) => (\n \n \n {currentScore[s.clientId] || 0}\n {s.result?.totalPoints}=\n {(currentScore[s.clientId] || 0) + (s.result?.totalPoints || 0)}\n \n ))}\n \n \n \n );\n};\n\nexport default SelfPickWin;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { GameFrame, ResultKind } from \"../../../api/mahjong-api\";\nimport { PointsBreakdown } from \"../../../components/game/PointsBreakdown\";\nimport Hand from \"../../scoring/list/Hand\";\nimport Avatar from \"../Avatar\";\nimport { getLastDiscard, MatchResult } from \"../frame\";\nimport { PlayerMap } from \"../Game\";\nimport {\n Card,\n CardRow,\n Column,\n Row,\n Score,\n WinnerRow,\n} from \"./GameOver.styled\";\n\nexport type Props = {\n frame?: GameFrame;\n currentScore?: MatchResult;\n playerMap: PlayerMap;\n};\n\nconst getScore = (result: MatchResult, clientId: string) => {\n const hasResult = Object.keys(result).includes(clientId);\n return hasResult ? result[clientId] : 0;\n};\n\nconst CaptureWin = ({ frame, playerMap, currentScore = {} }: Props) => {\n const seats = frame?.seats || {};\n const winningSeats = Object.values(seats).filter(\n (s) => s.result?.kind === ResultKind.Win\n );\n const discard = getLastDiscard(frame?.discards);\n const losingSeat = Object.values(seats).find(\n (s) => s.clientId === discard?.discardPlayerId\n );\n const loserScore = currentScore[losingSeat?.clientId || \"\"] || 0;\n const totalLost = winningSeats.reduce(\n (s, d) => (d.result?.totalPoints || 0) + s,\n 0\n );\n return (\n \n {winningSeats.map(({ result, hand, outOn, clientId }) => (\n \n \n \n {result && }\n \n \n \n \n \n \n \n \n \n \n {getScore(currentScore, clientId)} + {result?.totalPoints} ={\" \"}\n {getScore(currentScore, clientId) + (result?.totalPoints || 0)}\n \n \n \n ))}\n \n \n \n {loserScore} - {totalLost} = {loserScore - totalLost}\n \n \n );\n};\n\nexport default CaptureWin;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Card, Row } from \"./GameOver.styled\";\n\nconst Draw = () => {\n return (\n \n \n \n \n \n );\n};\n\nexport default Draw;\n","import styled from \"styled-components\";\nimport { animated } from \"@react-spring/web\";\n\nexport const MatchStatus = styled.div`\n background-color: transparent;\n border-style: solid;\n border-color: ${({ theme }) => theme.primary};\n display: flex;\n flex-direction: column;\n border-radius: 4px;\n`;\nexport const Column = styled.div`\n flex-direction: column;\n flex-grow: 1;\n font-size: 2.5rem;\n text-transform: uppercase;\n`;\n\nexport const Label = styled.div`\n background-color: ${({ theme }) => theme.primary};\n color: black;\n text-transform: uppercase;\n font-size: 1rem;\n margin-bottom: 0.5rem;\n`;\n\nexport const Results = styled.tbody`\n font-size: 0.7rem;\n`;\n\nexport const TdPlayer = styled.td`\n height: 3rem;\n width: 10rem;\n`;\n\nexport const Overlay = styled(animated.div)`\n position: absolute;\n z-index: 10000;\n`;\n\nexport const Title = styled.div`\n text-transform: uppercase;\n font-family: ${({ theme }) => theme.title};\n font-size: 2rem;\n padding-bottom: 0.5rem;\n color: ${({ theme }) => theme.primary};\n`;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { GameFrame, ResultKind } from \"../../../api/mahjong-api\";\nimport { Frame, Card, Row, Button } from \"./GameOver.styled\";\nimport SelfPickWin from \"./SelfPickWin\";\nimport CaptureWin from \"./CaptureWin\";\nimport { PlayerMap } from \"../Game\";\nimport { MatchResult } from \"../frame\";\nimport Draw from \"./Draw\";\nimport { Title } from \"./Display.styled\";\n\nexport type Props = {\n frame?: GameFrame;\n currentScore?: MatchResult;\n playerMap: PlayerMap;\n continueMatch?: () => void;\n};\n\nconst GameOver = ({\n playerMap,\n frame,\n currentScore,\n continueMatch,\n}: Props) => {\n const clientId = frame?.requestClientId;\n const winningSeat = frame?.seats[clientId || \"\"];\n const isSelfPick = winningSeat?.result?.kind === ResultKind.SelfPick;\n const isDraw = winningSeat?.result?.kind === ResultKind.Draw;\n return (\n \n <FormattedMessage id=\"GameOver\" />\n \n {isSelfPick && (\n \n )}\n {isDraw && }\n {!isSelfPick && !isDraw && (\n \n )}\n \n \n \n \n \n \n \n );\n};\n\nexport default GameOver;\n","import styled from \"styled-components\";\nimport { Button as BaseButton } from \"../../../components/common/Buttons.styled\";\n\nexport const Row = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n`;\nexport const Card = styled.div`\n border-radius: 4px;\n font-weight: bolder;\n color: ${({ theme }) => theme.primary};\n display: flex;\n flex-direction: column;\n padding: 0rem;\n`;\n\nexport const Button = styled(BaseButton)`\n text-transform: uppercase;\n padding-left: 2rem;\n padding-right: 2rem;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n font-size: 1rem;\n margin: 0.25rem;\n`;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { ActionButton as Button } from \"../../../components/common/Buttons.styled\";\nimport Avatar from \"../Avatar\";\nimport { PlayerMap } from \"../Game\";\nimport { Card, Row } from \"./MatchOver.styled\";\nimport { Frame } from \"./GameOver.styled\";\nimport { MatchResult } from \"../frame\";\nimport { Title } from \"./Display.styled\";\nimport MotdButton from \"../../../components/common/buttons/MotdButton\";\n\nexport type Props = {\n playerMap: PlayerMap;\n result: MatchResult;\n showHistory?: () => void;\n goToLobby?: () => void;\n goToMotd?: () => void;\n};\n\nconst MatchOver = ({\n result,\n playerMap = {},\n showHistory = () => {},\n goToLobby,\n goToMotd = () => {},\n}: Props) => {\n return (\n \n \n <FormattedMessage id=\"MatchOver\" />\n \n \n {Object.keys(result).map((k) => (\n \n \n {result[k]}\n \n ))}\n \n \n \n \n \n \n \n \n \n );\n};\n\nexport default MatchOver;\n","import React, { useMemo } from \"react\";\nimport { Table, Tr, Td, THead } from \"../../../components/common/List.styled\";\nimport { useTable, CellProps } from \"react-table\";\nimport { Frame } from \"./GameOver.styled\";\nimport { GameResult } from \"../../../api/mahjong-api\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Label, Results, TdPlayer } from \"./Display.styled\";\nimport { Button } from \"./GameOver.styled\";\nimport { Row } from \"../../../components/common/Page.styled\";\nimport Avatar from \"../Avatar\";\nimport { PlayerMap } from \"../Game\";\n\ntype Props = {\n playerMap: PlayerMap;\n matchResults?: GameResult[];\n hideHistory?: () => void;\n};\n\ntype HistoryRow = {\n clientId: string;\n results: GameResult[];\n};\n\nconst MatchHistory = ({\n playerMap = {},\n matchResults = [],\n hideHistory = () => {},\n}: Props) => {\n const init: { [key: string]: GameResult[] } = {};\n const summary = matchResults.reduce((s, c) => {\n const cId: string = c.clientId || \"\";\n if (cId in s) {\n s[cId].push(c);\n } else {\n s[cId] = [c];\n }\n return s;\n }, init);\n const history: HistoryRow[] = Object.keys(summary).map((s) => {\n return { clientId: s, results: summary[s] };\n });\n\n const data = useMemo(() => history, [history]);\n const numGameCols = matchResults.length / 4;\n const cols = useMemo(\n () => [\n {\n Header: ,\n id: \"player\",\n Cell: (r: CellProps) => (\n \n ),\n },\n ],\n [playerMap]\n );\n [...Array(numGameCols)].map((_, i) =>\n cols.push({\n Header: <> {(i + 1).toString()},\n id: `game${i}`,\n Cell: (r: CellProps) => (\n <>{r.row.original.results[i].points?.toString() || \"\"}\n ),\n })\n );\n cols.push({\n Header: ,\n id: \"score\",\n Cell: (r: CellProps) => (\n <>\n {r.row.original.results\n .reduce(\n (accumulator, currentValue) =>\n accumulator + (currentValue?.points || 0),\n 0\n )\n .toString()}\n \n ),\n });\n const columns = React.useMemo(() => cols, [cols]);\n\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =\n useTable({\n columns,\n data,\n });\n\n return (\n \n \n \n \n {headerGroups.map((headerGroup) => (\n \n {headerGroup.headers.map((column) => (\n \n ))}\n \n ))}\n \n \n {rows.map((row, i) => {\n prepareRow(row);\n return (\n \n {row.cells.map((cell) => {\n return i === 0 ? (\n \n {cell.render(\"Cell\")}\n \n ) : (\n \n );\n })}\n \n );\n })}\n \n
{column.render(\"Header\")}
{cell.render(\"Cell\")}
\n \n \n \n \n );\n};\n\nexport default MatchHistory;\n","import React from \"react\";\nimport { GameFrame, GameResult } from \"../../../api/mahjong-api\";\nimport { PlayerMap } from \"../Game\";\nimport GameOver from \"./GameOver\";\nimport MatchOver from \"./MatchOver\";\nimport { getMatchResult } from \"../frame\";\nimport MatchHistory from \"./MatchHistory\";\nimport { Overlay } from \"./Display.styled\";\nimport { useSpring } from \"@react-spring/web\";\n\nexport type Props = {\n frame?: GameFrame;\n clientId?: string;\n playerMap?: PlayerMap;\n shouldShowHistory?: boolean;\n matchResults?: GameResult[];\n showHistory?: () => void;\n hideHistory?: () => void;\n continueMatch?: () => void;\n goToLobby?: () => void;\n goToNewMatch?: () => void;\n goToMotd?: () => void;\n};\n\nconst Display = ({\n frame,\n playerMap = {},\n shouldShowHistory,\n matchResults = [],\n hideHistory = () => {},\n showHistory = () => {},\n continueMatch = () => {},\n goToMotd = () => {},\n goToLobby,\n goToNewMatch,\n}: Props) => {\n const props = useSpring({\n from: { opacity: 0 },\n to: { opacity: 1 },\n });\n\n return (\n \n {shouldShowHistory && (\n hideHistory()}\n />\n )}\n\n {!shouldShowHistory && frame?.isComplete && !frame?.matchComplete && (\n \n )}\n {!shouldShowHistory && frame?.isComplete && frame?.matchComplete && (\n \n )}\n \n );\n};\nexport default Display;\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { useLocation, useMatch, useNavigate } from \"react-router-dom\";\nimport { selectClientId, selectConnectionId } from \"../auth/selector\";\nimport Game, { PlayerMap } from \"./Game\";\nimport { selectGameFrame } from \"./selector\";\nimport {\n useCaptureTileMutation,\n useDiscardTileMutation,\n useSelfKongMutation,\n useSelfPickMutation,\n} from \"./service\";\nimport { useDrawMutation } from \"../motd/service\";\nimport {\n useContinueMatchMutation,\n useGetMatchQuery,\n useGetMatchGameResultsQuery,\n} from \"../match/service\";\nimport { useAppDispatch } from \"../../app/hooks\";\nimport { nextFrame } from \"./reducer\";\nimport Display from \"./display/Display\";\nimport { Wrapper } from \"./Game.styled\";\n\nconst Container = () => {\n const frame = useSelector(selectGameFrame);\n const clientId = useSelector(selectClientId);\n const { pathname } = useLocation();\n const dispatch = useAppDispatch();\n\n const timerRef = useRef();\n\n const refresh = useCallback(() => {\n dispatch(nextFrame());\n return setTimeout(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = refresh();\n }, 1000);\n }, [dispatch]);\n\n useEffect(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n timerRef.current = refresh();\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, [refresh]);\n\n const routeMatch = useMatch(\"/game/:matchId\");\n const connectionId = useSelector(selectConnectionId);\n const matchId = +(routeMatch?.params.matchId || \"\");\n const { data: matchResponse } = useGetMatchQuery(\n { id: matchId, connectionId },\n { skip: !matchId, refetchOnMountOrArgChange: true }\n );\n const { data: matchResults, refetch } = useGetMatchGameResultsQuery(matchId);\n const [discardTile] = useDiscardTileMutation();\n const [capture] = useCaptureTileMutation();\n const [selfKong] = useSelfKongMutation();\n const [selfPick] = useSelfPickMutation();\n const [continueMatch] = useContinueMatchMutation();\n const [draw] = useDrawMutation();\n\n const navigate = useNavigate();\n const visible = pathname.includes(\"game\");\n\n const init: PlayerMap = {};\n const playerMap = matchResponse?.match?.clients?.reduce((s, c) => {\n if (c.player) {\n s[c.clientId] = c.player;\n }\n return s;\n }, init);\n\n useEffect(() => {\n if (frame?.isComplete && !frame?.matchComplete) {\n refetch();\n }\n }, [frame?.isComplete, frame?.matchComplete, refetch]);\n\n const shouldShowFrame = frame?.matchId === matchId;\n\n const [showHistory, setShowHistory] = useState(false);\n return (\n \n discardTile({ tileId, matchId })}\n draw={() => draw({ matchId })}\n capture={(pr) => capture(pr)}\n selfKong={(r) => selfKong(r)}\n selfPick={(r) => selfPick(r)}\n continueMatch={() => continueMatch({ matchId })}\n goToLobby={() => navigate(\"/match\")}\n visible={visible}\n />\n\n {visible && shouldShowFrame && frame?.isComplete && (\n setShowHistory(true)}\n hideHistory={() => setShowHistory(false)}\n continueMatch={() => continueMatch({ matchId })}\n goToLobby={() => navigate(\"/match\")}\n goToNewMatch={() => navigate(\"/match/create\")}\n goToMotd={() => navigate(\"/motd\")}\n />\n )}\n \n );\n};\n\nexport default Container;\n","import React from \"react\";\nimport { Helmet } from \"react-helmet-async\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Container } from \"../../components/common/List.styled\";\nimport { Header, Module } from \"../../components/common/Page.styled\";\n\nconst About = () => (\n \n \n Mahjong Spot - About\n \n \n\n
\n \n
\n \n
\n);\n\nexport default About;\n","import React from \"react\";\nimport { Helmet } from \"react-helmet-async\";\nimport Loader from \"../../components/common/Loader\";\nimport { Module } from \"../../components/common/Page.styled\";\nimport Calculator from \"../scoring/create/Calculator\";\nimport { useCalculateMutation, useGetAllTilesQuery } from \"../scoring/service\";\n\nconst Container = () => {\n const { isLoading: isTileLoading, data: tiles } = useGetAllTilesQuery();\n const [calculate, { data }] = useCalculateMutation();\n if (isTileLoading || !tiles) {\n return ;\n }\n return (\n \n \n Mahjong Spot - Calculator\n \n \n\n calculate(ccr)}\n />\n \n );\n};\n\nexport default Container;\n","export default __webpack_public_path__ + \"static/media/background.214231d2.png\";","import styled from \"styled-components\";\nimport { Menu } from \"@styled-icons/heroicons-outline\";\nimport background from \"./background.png\";\n\nexport const PageContainer = styled.div`\n position: relative;\n background-image: url(${background});\n background-size: cover;\n background-repeat: no-repeat;\n width: 100vw;\n`;\n\nexport const AppMenu = styled(Menu)`\n &:hover {\n color: black;\n }\n`;\n\nexport const ComponentWrapper = styled.div`\n display: flex;\n flex-direction: column;\n overflow: scroll;\n width: 100vw;\n height: 100vh;\n`;\n","import styled from \"styled-components\";\n\nexport const Data = styled.div`\n font-size: 0.7rem;\n padding: 0.3rem;\n`;\n\nexport const Email = styled.div`\n padding-top: 1rem;\n font-size: 0.5rem;\n font-family: ${({ theme }) => theme.text};\n`;\n\nexport const ColorPicker = styled.div`\n display: flex;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n`;\n\nexport const Section = styled.div`\n display: flex;\n height: 150px;\n align-items: center;\n justify-content: center;\n flex-direction: column;\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n`;\n","import styled from \"styled-components\";\n\nexport const Label = styled.div`\n background-color: ${({ theme }) => theme.primary};\n color: black;\n text-transform: uppercase;\n font-size: 0.8rem;\n margin-bottom: 0.5rem;\n min-width: 5rem;\n display: flex;\n white-space: nowrap;\n align-items: center;\n justify-content: center;\n flex-grow: 1;\n padding: 0.2rem;\n`;\n\nexport const Frame = styled.div`\n background-color: transparent;\n border-style: solid;\n border-color: ${({ theme }) => theme.primary};\n display: flex;\n flex-direction: row;\n border-radius: 4px;\n border-width: 0.4rem;\n`;\n\nexport const Row = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: center;\n font-size: 0.7rem;\n align-items: center;\n padding-bottom: 1rem;\n`;\n\nexport const Column = styled.div`\n flex-direction: column;\n flex-grow: 1;\n font-size: 2.5rem;\n text-transform: uppercase;\n`;\n","import React from \"react\";\nimport { Row, Item } from \"../../components/common/Page.styled\";\n\ntype Props = {\n turnTime?: number;\n selectTurnTime?: (l: number) => void;\n};\n\nexport const TurnTime = ({ turnTime, selectTurnTime = () => {} }: Props) => (\n \n selectTurnTime(10)}>\n 10\n \n selectTurnTime(20)}>\n 20\n \n selectTurnTime(30)}>\n 30\n \n \n);\n\nexport default TurnTime;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { NavLink } from \"react-router-dom\";\nimport {\n GetPlayerStatisticsResponse,\n GetProfileResponse,\n} from \"../../api/mahjong-api\";\nimport { TitleText } from \"../home/Home.styled\";\nimport { ActionButton as Button } from \"../../components/common/Buttons.styled\";\nimport { ColorPicker, Data, Email, Section } from \"./Profile.styled\";\nimport { Column, Label, Row } from \"../../components/common/Info.styled\";\nimport Language from \"../../components/nav/Language\";\nimport { Helmet } from \"react-helmet-async\";\nimport { CirclePicker } from \"react-color\";\nimport Avatar from \"../game/Avatar\";\nimport MotdButton from \"../../components/common/buttons/MotdButton\";\nimport TurnTime from \"./TurnTime\";\nimport DiscardStyleSelector, { DiscardStyle } from \"./DiscardStyle\";\nimport {\n Page,\n Backdrop,\n FixedPanel as Panel,\n} from \"../../components/common/Page.styled\";\n\nconst colors = [\n \"#f44336\",\n \"#e91e63\",\n \"#9c27b0\",\n \"#673ab7\",\n \"#3f51b5\",\n \"#2196f3\",\n \"#03a9f4\",\n \"#00bcd4\",\n \"#009688\",\n \"#4caf50\",\n \"#8bc34a\",\n \"#cddc39\",\n \"#ffeb3b\",\n \"#ffc107\",\n \"#ff9800\",\n \"#ff5722\",\n \"#795548\",\n \"#7fd8d4\",\n];\n\nexport type Props = {\n locale?: string;\n turnTime?: number;\n profile?: GetProfileResponse;\n statistics?: GetPlayerStatisticsResponse;\n discardStyle?: DiscardStyle;\n playVsBots?: () => void;\n logout?: () => void;\n selectLocale?: (l: string) => void;\n updateTurnTime?: (t: number) => void;\n updateColor?: (c: string) => void;\n updateDiscardStyle?: (d: DiscardStyle) => void;\n};\n\nconst Profile = ({\n locale = \"en\",\n turnTime = 10,\n profile,\n statistics,\n discardStyle = DiscardStyle.Gesture,\n logout,\n playVsBots = () => {},\n selectLocale = () => {},\n updateTurnTime = () => {},\n updateColor = () => {},\n updateDiscardStyle = () => {},\n}: Props) => {\n const gameWinPct =\n (statistics?.gamesPlayed\n ? (statistics?.gamesWon ?? 0) / statistics?.gamesPlayed\n : 0) * 100;\n const gameWinPctRnd = Math.round((gameWinPct + Number.EPSILON) * 100) / 100;\n\n const matchWinPct =\n (statistics?.matchesPlayed\n ? (statistics?.matchesWon ?? 0) / statistics?.matchesPlayed\n : 0) * 100;\n\n const matchWinPctRnd = Math.round((matchWinPct + Number.EPSILON) * 100) / 100;\n return (\n \n \n Mahjong Spot - Profile\n \n \n \n \n \n \n \n {profile?.email}\n \n {profile?.firstName} {profile?.lastName} ({profile?.locale})\n \n \n \n \n \n {statistics?.gamesPlayed}\n \n \n \n {statistics?.gamesWon}\n \n \n \n {gameWinPctRnd}\n \n \n \n \n \n {statistics?.matchesPlayed}\n \n \n \n {statistics?.matchesWon}\n \n \n \n {matchWinPctRnd}\n \n \n \n \n
\n \n
\n
\n \n \n \n
\n\n
\n \n \n \n
\n
\n
\n \n \n \n
\n \n
\n
\n \n \n \n
\n updateColor(color.hex)}\n />\n
\n
\n
\n \n \n
\n \n
\n
\n \n \n
\n \n
\n
\n
\n \n \n \n
\n );\n};\n\nexport default Profile;\n","import React, { useEffect } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport Loader from \"../../components/common/Loader\";\nimport { usePlayMatchMutation } from \"../match/service\";\nimport { logout, updateTurnTime } from \"../auth/reducer\";\nimport { updateLocale, updateColor, updateDiscardStyle } from \"../auth/reducer\";\nimport Profile from \"./Profile\";\nimport {\n resetProfile,\n useProfileQuery,\n useSignOutMutation,\n useStatisticsQuery,\n} from \"../profile/service\";\nimport { resetClientId } from \"../auth/reducer\";\nimport { useAppDispatch } from \"../../app/hooks\";\nimport {\n selectDiscardStyle,\n selectLocale,\n selectTurnTime,\n} from \"../auth/selector\";\nimport { useSelector } from \"react-redux\";\n\nconst Container = () => {\n const navigate = useNavigate();\n const {\n data: profile,\n isLoading: profileLoading,\n isError,\n } = useProfileQuery();\n const { data: statistics, isLoading: statsLoading } = useStatisticsQuery();\n const [playMatch] = usePlayMatchMutation();\n const [signOut] = useSignOutMutation();\n const dispatch = useAppDispatch();\n const turnTime = useSelector(selectTurnTime);\n const discardStyle = useSelector(selectDiscardStyle);\n\n const handlePlay = async () => {\n const response = await playMatch({\n playerId: profile?.playerId,\n turnTime: turnTime,\n }).unwrap();\n navigate(`/game/${response.id}`);\n };\n\n useEffect(() => {\n if (isError) {\n signOut();\n dispatch(logout());\n dispatch(resetProfile());\n navigate(\"/\");\n }\n }, [isError, signOut, navigate, dispatch]);\n\n const onLogout = () => {\n signOut();\n dispatch(resetClientId());\n dispatch(logout());\n dispatch(resetProfile());\n navigate(\"/\");\n };\n\n const locale = useSelector(selectLocale);\n if (profileLoading || statsLoading) {\n return ;\n } else {\n return (\n dispatch(updateLocale(l))}\n updateColor={(c) => dispatch(updateColor(c))}\n updateTurnTime={(c) => dispatch(updateTurnTime(c))}\n updateDiscardStyle={(d) => dispatch(updateDiscardStyle(d))}\n logout={onLogout}\n statistics={statistics}\n profile={profile}\n playVsBots={handlePlay}\n />\n );\n }\n};\n\nexport default Container;\n","import React from \"react\";\nimport { PlayerSummary } from \"../../api/mahjong-api\";\nimport {\n Container,\n Table,\n Tr,\n Td,\n THead,\n} from \"../../components/common/List.styled\";\nimport { useTable, CellProps } from \"react-table\";\nimport { FormattedMessage } from \"react-intl\";\nimport Avatar from \"../game/Avatar\";\n\nexport type Props = {\n players: PlayerSummary[];\n viewPlayer?: (id: number) => void;\n};\n\nexport const List = ({ players, viewPlayer = () => {} }: Props) => {\n const data = React.useMemo(() => players, [players]);\n const columns = React.useMemo(\n () => [\n {\n Header: ,\n id: \"image\",\n Cell: (r: CellProps) => (\n \n ),\n },\n {\n id: \"name\",\n Cell: (r: CellProps) => r.row.original.name || \"\",\n },\n {\n Header: ,\n id: \"gamesWon\",\n Cell: (r: CellProps) => r.row.original.gamesWon || \"\",\n },\n {\n Header: ,\n id: \"gamesPlayed\",\n Cell: (r: CellProps) => r.row.original.gamesPlayed || \"\",\n },\n ],\n []\n );\n\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =\n useTable({\n columns,\n data,\n });\n return (\n \n \n \n {headerGroups.map((headerGroup) => (\n \n {headerGroup.headers.map((column) => (\n \n ))}\n \n ))}\n \n \n {rows.map((row, i) => {\n prepareRow(row);\n return (\n viewPlayer(row.original.id)}\n >\n {row.cells.map((cell) => {\n return (\n \n );\n })}\n \n );\n })}\n \n
{column.render(\"Header\")}
{cell.render(\"Cell\")}
\n
\n );\n};\nexport default List;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { PlayerSummary } from \"../../api/mahjong-api\";\nimport {\n Panel,\n Col,\n MainPanel,\n Card,\n} from \"../../components/common/Page.styled\";\nimport Avatar from \"../game/Avatar\";\nimport { ViewLabel as Label } from \"../match/Create.styled\";\n\ntype Props = {\n player?: PlayerSummary;\n};\nconst View = ({ player }: Props) => (\n \n \n \n \n \n {player?.name}\n \n \n \n \n \n \n \n {player?.gamesPlayed}\n \n \n \n {player?.gamesWon}\n \n \n \n \n);\n\nexport default View;\n","import React from \"react\";\nimport { GameResult } from \"../../api/mahjong-api\";\nimport {\n Container,\n Table,\n Tr,\n Td,\n THead,\n} from \"../../components/common/List.styled\";\nimport { useTable, CellProps } from \"react-table\";\nimport { FormattedMessage } from \"react-intl\";\nimport Avatar from \"../game/Avatar\";\n\ntype Props = {\n gameResults?: GameResult[];\n viewPlayer?: (id: number) => void;\n};\n\nexport const GameResults = ({\n gameResults = [],\n viewPlayer = () => {},\n}: Props) => {\n const data = React.useMemo(() => gameResults, [gameResults]);\n const columns = React.useMemo(\n () => [\n {\n Header: ,\n id: \"player\",\n Cell: (r: CellProps) => (\n \n ),\n },\n {\n id: \"name\",\n Cell: (r: CellProps) => r.row.original.player?.name || \"\",\n },\n {\n Header: ,\n id: \"match\",\n Cell: (r: CellProps) => r.row.original.matchId || \"\",\n },\n {\n Header: ,\n id: \"points\",\n Cell: (r: CellProps) => r.row.original.points || \"\",\n },\n ],\n []\n );\n\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =\n useTable({\n columns,\n data,\n });\n return (\n \n \n \n {headerGroups.map((headerGroup) => (\n \n {headerGroup.headers.map((column) => (\n \n ))}\n \n ))}\n \n \n {rows.map((row, i) => {\n prepareRow(row);\n return (\n viewPlayer(row.original?.player?.id || 0)}\n >\n {row.cells.map((cell) => {\n return (\n \n );\n })}\n \n );\n })}\n \n
{column.render(\"Header\")}
{cell.render(\"Cell\")}
\n
\n );\n};\nexport default GameResults;\n","import React from \"react\";\nimport \"react-sliding-pane/dist/react-sliding-pane.css\";\nimport List from \"./List\";\nimport { Module } from \"../../components/common/Page.styled\";\nimport { Props as ListProps } from \"./List\";\nimport { NavigateFunction } from \"react-router-dom\";\nimport { FindGameResultsResponse, PlayerSummary } from \"../../api/mahjong-api\";\nimport { Main, Section, SectionName } from \"../match/Lobby.styled\";\nimport { FormattedMessage } from \"react-intl\";\nimport { Pane } from \"../../components/common/Sliding.styled\";\nimport View from \"./View\";\nimport GameResults from \"./GameResults\";\nimport { Helmet } from \"react-helmet-async\";\n\ntype Props = ListProps & {\n player?: PlayerSummary;\n pathname?: string;\n gameResults?: FindGameResultsResponse;\n navigate?: NavigateFunction;\n};\nconst Community = ({\n players = [],\n player,\n gameResults,\n pathname = \"\",\n navigate = () => {},\n viewPlayer = (id: number) => {},\n}: Props) => {\n return (\n \n \n Mahjong Spot - Community\n \n \n\n {\n navigate(\"/community\");\n }}\n >\n \n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n
\n );\n};\n\nexport default Community;\n","import React from \"react\";\nimport \"react-sliding-pane/dist/react-sliding-pane.css\";\nimport { useMatch, useNavigate, useLocation } from \"react-router-dom\";\nimport Community from \"./Community\";\nimport {\n useFindGameResultsQuery,\n useFindPlayersQuery,\n useGetPlayerQuery,\n} from \"./service\";\nimport Loader from \"../../components/common/Loader\";\nimport { Player } from \"../../api/mahjong-api\";\n\nconst Container = () => {\n const navigate = useNavigate();\n const { pathname } = useLocation();\n const { isLoading: isFindLoading, data } = useFindPlayersQuery();\n const { isLoading: isFindGameResultsLoading, data: gameResults } =\n useFindGameResultsQuery();\n\n const players = data?.players || [];\n\n const routeMatch = useMatch(\"/community/view/:playerId\");\n const playerId = +(routeMatch?.params.playerId || \"\");\n\n const { data: getResponse, isLoading: isGetLoading } = useGetPlayerQuery(\n playerId,\n { skip: !playerId }\n );\n let player: Player = {\n id: 0,\n createdAt: \"\",\n createdBy: \"\",\n };\n\n if (getResponse?.player) {\n player = getResponse.player;\n }\n if (isFindLoading || isGetLoading || isFindGameResultsLoading) {\n return ;\n }\n\n return (\n navigate(`view/${id}`)}\n />\n );\n};\n\nexport default Container;\n","import React from \"react\";\nimport { GameDayResult } from \"../../api/mahjong-api\";\nimport {\n Container,\n Table,\n Tr,\n Td,\n THead,\n} from \"../../components/common/List.styled\";\nimport { useTable, CellProps } from \"react-table\";\nimport { FormattedDate, FormattedMessage } from \"react-intl\";\nimport Avatar from \"../game/Avatar\";\nimport Hand from \"../scoring/list/Hand\";\nimport { Col, Description } from \"../../components/common/Page.styled\";\n\ntype Props = {\n gameResults?: GameDayResult[];\n};\n\nexport const GameDayResults = ({ gameResults = [] }: Props) => {\n const data = React.useMemo(() => gameResults, [gameResults]);\n const columns = React.useMemo(\n () => [\n {\n Header: ,\n id: \"match\",\n Cell: (r: CellProps) => (\n \n \n \n ),\n },\n {\n Header: ,\n id: \"player\",\n Cell: (r: CellProps) => (\n \n ),\n },\n {\n id: \"name\",\n Cell: (r: CellProps) =>\n r.row.original.player?.name || \"\",\n },\n {\n Header: ,\n id: \"points\",\n Cell: (r: CellProps) => r.row.original.points || \"\",\n },\n ],\n []\n );\n\n const { getTableProps, getTableBodyProps, headerGroups, rows, prepareRow } =\n useTable({\n columns,\n data,\n });\n return (\n \n \n \n {headerGroups.map((headerGroup) => (\n \n {headerGroup.headers.map((column) => (\n \n ))}\n \n ))}\n \n \n {rows.map((row, i) => {\n prepareRow(row);\n const seat = row.original.lastFrame?.seats[row.original.clientId];\n return (\n \n \n {row.cells.map((cell) => {\n return (\n \n );\n })}\n \n\n \n \n \n \n \n \n \n );\n })}\n \n
{column.render(\"Header\")}
{cell.render(\"Cell\")}
\n
\n
\n );\n};\nexport default GameDayResults;\n","import React from \"react\";\nimport { Helmet } from \"react-helmet-async\";\nimport { FormattedDate, FormattedMessage } from \"react-intl\";\nimport { GameDayResult, GameResult, Wind } from \"../../api/mahjong-api\";\nimport { ActionButton as Button } from \"../../components/common/Buttons.styled\";\nimport { Label } from \"../../components/common/Info.styled\";\nimport {\n Col,\n Description,\n Header,\n Module,\n Row,\n} from \"../../components/common/Page.styled\";\nimport GameResults from \"../community/GameResults\";\nimport { Section, SectionName } from \"../match/Lobby.styled\";\nimport GameDayResults from \"./GameDayResults\";\n\nexport type Props = {\n date: Date;\n results?: GameResult[];\n prevResults?: GameDayResult[];\n seat?: Wind;\n round?: Wind;\n play?: () => void;\n};\n\nconst MatchOfTheDay = ({\n seat = Wind.East,\n round = Wind.East,\n date,\n results = [],\n prevResults = [],\n play = () => {},\n}: Props) => (\n \n \n Mahjong Spot - Match Of The Day\n \n \n
\n \n
\n \n \n \n
\n \n
\n \n \n \n \n \n \n \n \n \n
\n \n \n \n
\n \n
\n
\n \n \n \n \n
\n
\n \n \n \n \n
\n
\n);\n\nexport default MatchOfTheDay;\n","import React, { useEffect } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { useMatch, useNavigate } from \"react-router-dom\";\nimport Loader from \"../../components/common/Loader\";\nimport { selectPlayerId, selectTurnTime } from \"../auth/selector\";\nimport MatchOfTheDay from \"./MatchOfTheDay\";\nimport { useGetMatchTemplateQuery, usePlayTemplateMutation } from \"./service\";\n\nconst Container = () => {\n const routeMatch = useMatch(\"/motd/:year/:month/:day\");\n const routeYear = routeMatch?.params.year;\n const routeMonth = routeMatch?.params.month;\n const routeDay = routeMatch?.params.day;\n\n const date =\n routeYear && routeMonth && routeDay\n ? new Date(\n parseInt(routeYear),\n parseInt(routeMonth) - 1,\n parseInt(routeDay),\n 0,\n 0,\n 0,\n 0\n )\n : new Date();\n const navigate = useNavigate();\n\n const playerId = useSelector(selectPlayerId);\n const turnTime = useSelector(selectTurnTime);\n const motdRequest = {\n year: date.getFullYear(),\n month: date.getMonth() + 1,\n day: date.getDate(),\n };\n\n const { data, isFetching } = useGetMatchTemplateQuery(motdRequest, {\n refetchOnFocus: true,\n refetchOnMountOrArgChange: true,\n refetchOnReconnect: true,\n });\n const [playMatch, playStatus] = usePlayTemplateMutation();\n\n useEffect(() => {\n if (playStatus.isSuccess) {\n navigate(`/game/${playStatus.data.id}`);\n }\n }, [playStatus.isSuccess, navigate, playStatus?.data?.id]);\n\n if (isFetching) {\n return ;\n }\n return (\n \n playMatch({\n playerId: playerId,\n matchTemplateId: data?.id,\n turnTime: turnTime,\n })\n }\n results={data?.results || []}\n prevResults={data?.previousResults || []}\n />\n );\n};\n\nexport default Container;\n","import styled from \"styled-components\";\nimport GoogleImg from \"../login/icon_mobile_google_login.png\";\n\nexport const NavBar = styled.div`\n display: flex;\n flex-wrap: wrap;\n flex-direction: row;\n justify-content: center;\n padding: 0.25rem;\n`;\n\nexport const TopBar = styled.div`\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n align-items: center;\n background-color: rgba(0, 0, 0, 0.6);\n`;\n\nexport const TitleText = styled.div`\n text-transform: uppercase;\n font-family: ${({ theme }) => theme.title};\n font-size: 1.3rem;\n color: ${({ theme }) => theme.primary};;\n padding: 0.75rem;\n`;\n\nexport const TitlePlayer = styled.div`\n color: ${({ theme }) => theme.primary};;\n display: flex;\n justify-content: center;\n align-items: center;\n padding-right: 0.5rem;\n`;\n\nexport const SocialButton = styled.button`\n width: 2.2rem;\n height: 2.2rem;\n background-color: transparent;\n border: none;\n background-image: url(${GoogleImg});\n background-size: cover;\n`;\n\nexport const NavItem = styled.div<{ active?: boolean }>`\n display: flex;\n flex-direction: row;\n justify-content: center;\n align-items: center;\n padding-left: 0.25rem;\n color: ${({ theme }) => theme.primary};;\n cursor: pointer;\n margin: 0.2rem;\n border-bottom: ${({ active, theme }) =>\n active ? `1px solid ${theme.primary}` : \"1px solid transparent\"};\n &:hover {\n border-bottom: 1px solid ${({ theme }) => theme.primary};;\n }\n`;\n\nexport const Email = styled.div`\n text-overflow: ellipsis;\n font-size: 0.5rem;\n cursor: pointer;\n text-decoration: underline;\n`;\n","import React from \"react\";\nimport { FormattedMessage } from \"react-intl\";\nimport { NavigateFunction } from \"react-router-dom\";\nimport Avatar from \"../../features/game/Avatar\";\nimport {\n NavBar,\n NavItem,\n TopBar,\n TitleText,\n TitlePlayer,\n SocialButton,\n} from \"./TopNav.styled\";\n\ntype Props = {\n clientId?: string;\n email?: string;\n pathname?: string;\n imageUrl?: string;\n navigate?: NavigateFunction;\n};\n\nconst googleAuthUrl = window._env_.GOOGLE_AUTH_URL;\n\nexport const TopNav = ({\n clientId,\n pathname = \"\",\n email = \"\",\n imageUrl = \"\",\n navigate = () => {},\n}: Props) => (\n \n \n navigate(\"/\")}>\n \n \n \n \n navigate(\"/match\")}\n >\n \n \n navigate(\"/scoring\")}\n >\n \n \n navigate(\"/calculator\")}\n >\n \n \n navigate(\"/community\")}\n >\n \n \n \n \n {!email && (\n
\n \n \n )}\n {imageUrl &&
navigate(\"/profile\")} >
}\n
\n
\n);\n\nexport default TopNav;\n","import React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { useLocation, useNavigate } from \"react-router-dom\";\nimport {\n selectClientId,\n selectProfileEmail,\n selectProfileImage,\n} from \"../../features/auth/selector\";\nimport TopNav from \"./TopNav\";\n\nconst Container = () => {\n const image = useSelector(selectProfileImage);\n const email = useSelector(selectProfileEmail);\n const { pathname } = useLocation();\n const navigate = useNavigate();\n const clientId = useSelector(selectClientId);\n\n return (\n \n );\n};\n\nexport default Container;\n","import React, { useEffect } from \"react\";\nimport Scoring from \"./features/scoring\";\nimport Match from \"./features/match\";\nimport { Route, Routes } from \"react-router\";\nimport NoMatch from \"./components/common/NoMatch\";\nimport Home from \"./features/home\";\nimport Game from \"./features/game\";\nimport About from \"./features/about/About\";\nimport Calculator from \"./features/calculator\";\nimport { ComponentWrapper, PageContainer } from \"./App.styled\";\nimport { Frame } from \"./features/home/Home.styled\";\nimport Profile from \"./features/profile\";\nimport Community from \"./features/community\";\nimport ReactGA from \"react-ga\";\nimport MatchOfTheDay from \"./features/motd\";\nimport TopNav from \"./components/nav\";\nimport { Helmet } from \"react-helmet-async\";\nconst TRACKING_ID = \"G-YR6KTN1YXX\";\n\nReactGA.initialize(TRACKING_ID);\n\ndeclare global {\n interface Window {\n _env_: any;\n }\n}\n\nfunction App() {\n useEffect(() => {\n ReactGA.pageview(window.location.pathname + window.location.search);\n }, []);\n\n return (\n \n \n \n \n } />\n \n Mahjong Spot - Play Mahjong\n \n \n } />\n \n \n \n }>\n }>\n }>\n }>\n }>\n }>\n }>\n } />\n \n \n }\n />\n \n \n \n );\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\ntype Config = {\n onSuccess?: (registration: ServiceWorkerRegistration) => void;\n onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport function register(config?: Config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl: string, config?: Config) {\n navigator.serviceWorker\n .register(swUrl)\n .then((registration) => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch((error) => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl: string, config?: Config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then((response) => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then((registration) => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then((registration) => {\n registration.unregister();\n })\n .catch((error) => {\n console.error(error.message);\n });\n }\n}\n","import { createGlobalStyle } from \"styled-components\";\n\nexport const GlobalStyles = createGlobalStyle`\n html, body {\n margin: 0;\n padding: 0;\n }\n\n *, *::after, *::before {\n box-sizing: border-box;\n }\n\n body {\n display: flex;\n justify-content: center;\n align-items: center;\n background: ${({ theme }) => theme.dark};\n color: ${({ theme }) => theme.light};\n text-rendering: optimizeLegibility;\n font-family: ${({ theme }) => theme.text};\n }\n\n h1 {\n font-size: 2rem;\n text-align: center;\n text-transform: uppercase;\n }\n\n img {\n border-radius: 5px;\n height: auto;\n width: 10rem;\n }\n\n div {\n text-align: center;\n }\n\n small {\n display: block;\n }\n\n a {\n color: ${({ theme }) => theme.primary};\n text-decoration: none;\n }\n\n :root {\n /* Colors: */\n --primary-color: #1f68fa;\n --light-text-color: #f5f6f7;\n --light-placeholder-color: #ced4de;\n --dark-text-color: #2d3747;\n\n /* Shadows: */\n --shadow-dilute: 5px 5px 25px 0 rgba(46, 61, 73, 0.2);\n --shadow-conc: 2px 4px 8px 0 rgba(46, 61, 73, 0.2);\n\n /* Misc: */\n --transition: all 0.2s ease-in-out;\n}\n`;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport App from \"./App\";\nimport { store } from \"./app/store\";\nimport { Provider } from \"react-redux\";\nimport * as serviceWorker from \"./serviceWorker\";\nimport { BrowserRouter } from \"react-router-dom\";\n\nimport { PersistGate } from \"redux-persist/integration/react\";\nimport { persistStore } from \"redux-persist\";\nimport { GlobalStyles } from \"./global\";\nimport ThemeProvider from \"./components/common/ConnectedThemeProvider\";\nimport IntlProvider from \"./i18n/ConnectedIntlProvider\";\nimport { HelmetProvider } from \"react-helmet-async\";\n\nconst persistor = persistStore(store);\nReactDOM.render(\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}