Files
chemmazz/client/.eslintcache
2021-01-29 15:55:07 +01:00

1 line
24 KiB
Plaintext

[{"/Users/domenico/dev/games-party/games-party/client/src/reportWebVitals.tsx":"1","/Users/domenico/dev/games-party/games-party/client/src/App.tsx":"2","/Users/domenico/dev/games-party/games-party/client/src/index.tsx":"3","/Users/domenico/dev/games-party/games-party/client/src/pages/LobbyPage.tsx":"4","/Users/domenico/dev/games-party/games-party/client/src/pages/PlayRoomPage.tsx":"5","/Users/domenico/dev/games-party/games-party/client/src/context/store.tsx":"6","/Users/domenico/dev/games-party/games-party/client/src/components/Player.tsx":"7","/Users/domenico/dev/games-party/games-party/client/src/components/StashManagementDrawer.tsx":"8","/Users/domenico/dev/games-party/games-party/client/src/context/stashManagementContext.tsx":"9","/Users/domenico/dev/games-party/games-party/client/src/components/Hand.tsx":"10","/Users/domenico/dev/games-party/games-party/client/src/components/Prompt.tsx":"11","/Users/domenico/dev/games-party/games-party/client/src/context/chatContext.tsx":"12"},{"size":362,"mtime":1609249563286,"results":"13","hashOfConfig":"14"},{"size":919,"mtime":1610987751265,"results":"15","hashOfConfig":"14"},{"size":504,"mtime":1609784519249,"results":"16","hashOfConfig":"14"},{"size":4531,"mtime":1610826307035,"results":"17","hashOfConfig":"14"},{"size":11671,"mtime":1611241493652,"results":"18","hashOfConfig":"14"},{"size":2713,"mtime":1611222742326,"results":"19","hashOfConfig":"14"},{"size":6545,"mtime":1611241128984,"results":"20","hashOfConfig":"14"},{"size":3492,"mtime":1610732080352,"results":"21","hashOfConfig":"14"},{"size":1366,"mtime":1610176599048,"results":"22","hashOfConfig":"14"},{"size":1005,"mtime":1610576678797,"results":"23","hashOfConfig":"14"},{"size":3854,"mtime":1610826192773,"results":"24","hashOfConfig":"14"},{"size":6310,"mtime":1611243735412,"results":"25","hashOfConfig":"14"},{"filePath":"26","messages":"27","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"28"},"1ynk1tg",{"filePath":"29","messages":"30","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"28"},{"filePath":"31","messages":"32","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"28"},{"filePath":"33","messages":"34","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"28"},{"filePath":"35","messages":"36","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"37","usedDeprecatedRules":"28"},{"filePath":"38","messages":"39","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"28"},{"filePath":"40","messages":"41","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"28"},{"filePath":"42","messages":"43","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"28"},{"filePath":"44","messages":"45","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"28"},{"filePath":"46","messages":"47","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"28"},{"filePath":"48","messages":"49","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"50"},{"filePath":"51","messages":"52","errorCount":0,"warningCount":2,"fixableErrorCount":0,"fixableWarningCount":0,"source":"53","usedDeprecatedRules":"28"},"/Users/domenico/dev/games-party/games-party/client/src/reportWebVitals.tsx",[],["54","55"],"/Users/domenico/dev/games-party/games-party/client/src/App.tsx",[],"/Users/domenico/dev/games-party/games-party/client/src/index.tsx",[],"/Users/domenico/dev/games-party/games-party/client/src/pages/LobbyPage.tsx",[],"/Users/domenico/dev/games-party/games-party/client/src/pages/PlayRoomPage.tsx",["56"],"import { useCallback, useContext, useEffect, useState } from 'react';\nimport { Badge, Layout, Row, Col, Space, Typography, Button, message, Statistic } from 'antd';\nimport { PauseCircleOutlined, PlaySquareOutlined } from '@ant-design/icons';\nimport { FullScreen, useFullScreenHandle } from \"react-full-screen\";\nimport { useLocation } from 'wouter';\n\nimport { GameContext } from '../context/store';\nimport { StashManagementProvider } from '../context/stashManagementContext';\n\nimport StashManagementDrawer from '../components/StashManagementDrawer';\nimport Player from '../components/Player';\nimport Hand from '../components/Hand';\nimport Prompt from '../components/Prompt';\n\nconst { Content } = Layout;\nconst { Title } = Typography;\n\nconst PlayRoomPage = ({ params }) => {\n const roomId = params.roomId;\n const { state, dispatch } = useContext(GameContext);\n const [, setLocation] = useLocation();\n const fullScreenHandle = useFullScreenHandle();\n\n const [isRoomOwner, setIsRoomOwner] = useState(false);\n const [thisPlayerHand, setThisPlayerHand] = useState([]);\n const [thisPlayerPrompt, setThisPlayerPrompt] = useState([]);\n const [thisPlayerScore, setThisPlayerScore] = useState();\n\n useEffect(() => {\n console.log('Room id:', roomId);\n console.log('Global state:', state);\n console.log('Current user:', state.session?.display_name, state.session?.user_id);\n\n const joinRoom = async () => {\n if (state.room === null) {\n console.log('Room not joined yet:', state.gameState.user_id, state.gameState.display_name);\n try {\n const room = await state.client.joinById(roomId, {\n user_id: state.session?.user_id,\n display_name: state.session?.display_name\n });\n dispatch({ type: 'JOIN_ROOM', payload: room });\n } catch (error) {\n message.error('Stanza non tovata');\n setLocation('/');\n }\n } else {\n console.log('Registering room handlers');\n state.room.onStateChange((newState) => {\n console.log('Room state changed:', newState);\n dispatch({ type: 'GAME_STATE', payload: { ...newState } });\n const isOwner = newState.roomOwner === state.session?.user_id;\n setIsRoomOwner(isOwner);\n });\n\n state.room.onMessage('notification', (msg) => {\n console.log('Message received from server:', msg);\n const msg_type = msg.type || 'info';\n message[msg_type](msg.text);\n });\n }\n };\n joinRoom();\n\n return () => {\n if (state.room) {\n console.log('Removing room listeners...');\n state.room.removeAllListeners();\n dispatch({ type: 'LEAVE_ROOM' });\n }\n }\n }, [state.room]);\n\n useEffect(() => {\n if (state.room === null) return;\n\n // Setting the current player reference\n const p = state.gameState.players.get(state.room.sessionId);\n if (p !== undefined) {\n console.log('Setting current player hand:', p, p.hand);\n setThisPlayerHand(p.hand);\n setThisPlayerPrompt(p.prompt);\n setThisPlayerScore(p.score);\n }\n }, [state.room, state.gameState]);\n\n const handleStartGame = useCallback(() => {\n state.room.send('admin', { command: 'start-game' });\n }, [state.room]);\n\n const handlePauseGame = useCallback(() => {\n state.room.send('admin', { command: 'pause-game' });\n }, [state.room]);\n\n const handleResumeGame = useCallback(() => {\n state.room.send('resume-game', {});\n }, [state.room]);\n\n return (\n <FullScreen handle={fullScreenHandle}>\n <StashManagementProvider>\n <Layout className='play-room'>\n <Content>\n <Row justify=\"center\">\n <Col flex=\"auto\" className={`main-scene bg-${state.gameState.bg}`}>\n {isRoomOwner && (\n <Space className=\"admin-commands\">\n {!state.gameState.running && (\n <Button icon={<PlaySquareOutlined />} type=\"link\" size=\"large\" onClick={handleStartGame} />\n )}\n\n {(state.gameState.running && state.gameState.paused) && (\n <Button icon={<PlaySquareOutlined />} type=\"link\" size=\"large\" onClick={handleResumeGame} />\n )}\n\n {(state.gameState.running && !state.gameState.paused) && (\n <Button icon={<PauseCircleOutlined />} type=\"link\" size=\"large\" onClick={handlePauseGame} />\n )}\n </Space>\n )}\n\n {(state.gameState.running && !state.gameState.paused) && (\n <Space direction=\"vertical\" align=\"center\" style={{ width: '100%' }} size=\"large\">\n <Statistic title=\"Piatto\" value={state.gameState.pot} />\n\n <Space direction=\"horizontal\" align=\"baseline\" split=\"VS\" size=\"large\" className=\"the-ring\">\n <div className=\"player\">\n <div className=\"picture\" id=\"player\">\n <div className=\"badges\">\n <Player player={state.gameState.player1} displayAdminMenu={false} />\n <div className=\"lives\">\n <i className=\"fas fa-heart\" title=\"1 Vita\"></i>\n <i className=\"fas fa-heart\" title=\"1 Vita\"></i>\n <i className=\"fas fa-heart\" title=\"1 Vita\"></i>\n </div>\n\n <div className=\"status\"></div>\n </div>\n </div>\n <div className=\"name\">\n {state.gameState.player1.displayName} (Banco)\n {(state.gameState.player1.prompt && state.gameState.player1.prompt.visible) && (<Badge status=\"processing\" />)}\n </div>\n <Hand cards={state.gameState.player1.hand} showHole={false} />\n </div>\n\n <div className=\"player\">\n <div className=\"picture\" id=\"player\">\n <Player player={state.gameState.player2} displayAdminMenu={false} />\n <div className=\"badges\">\n <div className=\"lives\">\n <i className=\"fas fa-heart\" title=\"1 Vita\"></i>\n <i className=\"fas fa-heart\" title=\"1 Vita\"></i>\n <i className=\"fas fa-heart\" title=\"1 Vita\"></i>\n </div>\n\n <div className=\"status\"></div>\n </div>\n </div>\n <div className=\"name\">\n {state.gameState.player2.displayName}\n {(state.gameState.player2.prompt && state.gameState.player2.prompt.visible) && (<Badge status=\"processing\" />)}\n </div>\n <Hand cards={state.gameState.player2.hand} showHole={false} />\n <Statistic title=\"Scommessa\" value={state.gameState.currentBet} />\n </div>\n </Space>\n </Space>\n )}\n\n </Col>\n <Col className=\"players\" xs={4} md={6} lg={8} xl={10}>\n <Title level={4}>In gioco</Title>\n <Space size={12} wrap>\n {Array.from<any>(state.gameState.players.values()).filter((player, index) => {\n return player.playing;\n }).map((player, index) => (\n <Player key={index} player={player} displayAdminMenu={isRoomOwner} />\n ))}\n </Space>\n\n <Title level={4}>Spettatori</Title>\n <Space size={12} wrap>\n {Array.from<any>(state.gameState.players.values()).filter((player, index) => {\n return !player.playing;\n }).map((player, index) => (\n <Player key={index} player={player} displayAdminMenu={isRoomOwner} />\n ))}\n </Space>\n </Col>\n </Row>\n\n <Row>\n <Col className=\"game-controls\" span={24}>\n <Space direction=\"vertical\" style={{ width: \"100%\" }}>\n {/* <Button onClick={fullScreenHandle.enter}>Full screen</Button> */}\n <Row>\n <Col flex={2}>\n <Hand cards={thisPlayerHand} showHole={true} />\n </Col>\n <Col flex={2}>\n <Space direction=\"vertical\">\n {thisPlayerHand.length > 0 && <Statistic title=\"Il tuo punteggio:\" value={thisPlayerScore} />}\n <Prompt prompt={thisPlayerPrompt} />\n </Space>\n </Col>\n </Row>\n </Space>\n </Col>\n </Row>\n <StashManagementDrawer />\n </Content>\n </Layout>\n </StashManagementProvider>\n </FullScreen >\n );\n}\n\nexport default PlayRoomPage;\n","/Users/domenico/dev/games-party/games-party/client/src/context/store.tsx",[],"/Users/domenico/dev/games-party/games-party/client/src/components/Player.tsx",[],"/Users/domenico/dev/games-party/games-party/client/src/components/StashManagementDrawer.tsx",[],"/Users/domenico/dev/games-party/games-party/client/src/context/stashManagementContext.tsx",[],"/Users/domenico/dev/games-party/games-party/client/src/components/Hand.tsx",[],"/Users/domenico/dev/games-party/games-party/client/src/components/Prompt.tsx",[],["57","58"],"/Users/domenico/dev/games-party/games-party/client/src/context/chatContext.tsx",["59","60"],"import { createContext, useContext, useRef, useState, ReactNode, useEffect, MutableRefObject, useCallback } from 'react';\nimport SimplePeer from 'simple-peer';\n\nimport { GameContext } from './store';\n\n\nexport interface IPlayer {\n sessionId: string;\n}\n\nexport interface IChatContext {\n audio: boolean;\n video: boolean;\n\n toggleAudio: () => void;\n toggleVideo: () => void;\n\n callPlayer: (player: IPlayer, room: any) => void;\n streamsRef: MutableRefObject<Record<string, MediaStream>> | null;\n}\n\nexport const ChatContext = createContext<IChatContext>({\n audio: false,\n video: true,\n\n toggleAudio: () => console.warn('No implementation provided'),\n toggleVideo: () => console.warn('No implementation provided'),\n callPlayer: (player, room) => console.warn('No implementation provided', player, room),\n streamsRef: null\n});\n\nexport const useChatContext = () => useContext(ChatContext);\n\ntype Props = {\n children: ReactNode;\n};\n\nexport const ChatProvider = ({ children }: Props) => {\n const [chatInitialized, setChatInitialized] = useState<boolean>(false);\n const { state } = useContext(GameContext);\n const [audioEnabled, setAudioEnabled] = useState<boolean>(false);\n const [videoEnabled, setVideoEnabled] = useState<boolean>(false);\n\n const peersRef = useRef<Record<string, SimplePeer.Instance>>({});\n const streamsRef = useRef<Record<string, MediaStream>>({});\n\n const setupVideoStream = async () => {\n if (state.room === null) return null;\n const stream = await navigator.mediaDevices.getUserMedia({\n video: true,\n audio: false\n });\n streamsRef.current[state.room.sessionId] = stream;\n console.log('Got self stream:', state.room.sessionId, streamsRef.current);\n return stream;\n };\n\n const toggleAudio = () => {\n setAudioEnabled(!audioEnabled);\n }\n\n const toggleVideo = () => {\n setVideoEnabled(!videoEnabled);\n }\n\n const callPlayer = (player: IPlayer, stream: any) => {\n console.log('Calling player....', player, player.sessionId, stream);\n const existingPeer = peersRef.current[player.sessionId];\n if (!existingPeer) {\n console.log('Creating peer for player:', player.sessionId);\n const peer = createPeer(player.sessionId, state.room.sessionId, stream);\n peersRef.current[player.sessionId] = peer;\n } else {\n console.log('Player is already connected', player.sessionId, existingPeer);\n }\n }\n\n const callRoomParticipants = async () => {\n const stream = await setupVideoStream();\n console.log('Calling room participants:', state.gameState.players.values((p) => { return p.sessionId }));\n state.gameState.players.forEach((player) => {\n if (player.sessionId === state.room.sessionId) return;\n callPlayer(player, stream);\n });\n };\n\n const createPeer = (userToSignal, callerId, stream) => {\n const peer = new SimplePeer({\n initiator: true,\n trickle: false,\n stream,\n });\n\n peer.on(\"signal\", signal => {\n state.room.send('webrtc', {\n command: 'call-player', payload: {\n 'callerId': callerId,\n 'targetId': userToSignal,\n 'signal': signal\n }\n });\n });\n\n peer.on('connect', () => {\n console.log('[webrtc] WEBRTC PEER CONNECTED! (1)');\n });\n\n peer.on('stream', stream => {\n console.log('[webrtc] Got remote stream (1)', userToSignal, stream);\n streamsRef.current[userToSignal] = stream;\n });\n\n return peer;\n }\n\n const addPeer = (incomingSignal, callerId, stream) => {\n const peer = new SimplePeer({\n initiator: false,\n trickle: false,\n stream\n })\n\n peer.on(\"signal\", signal => {\n state.room.send('webrtc', {\n command: 'answer-call', payload: {\n 'callerId': state.room.sessionId,\n 'targetId': callerId,\n 'signal': signal\n }\n });\n });\n\n peer.on('connect', () => {\n console.log('[webrtc] WEBRTC PEER CONNECTED! (2)');\n });\n\n peer.signal(incomingSignal);\n return peer;\n }\n\n useEffect(() => {\n if (chatInitialized || state.room === null || state.gameState.players.size === 0) return;\n console.log('[webrtc] Initializing chat');\n setChatInitialized(true);\n\n console.log('[webrtc] Registering incoming-call handler', state.room);\n\n state.room.onMessage('answer-call', msg => {\n console.log('[webrtc] Receiving answer-call:', msg);\n const peer = peersRef.current[msg.callerId];\n peer.signal(msg.signal);\n });\n\n state.room.onMessage('incoming-call', (msg) => {\n const stream = streamsRef.current[state.room.sessionId];\n console.log('[webrtc] Answering incoming call:', msg, stream);\n const peer = addPeer(msg.signal, msg.callerId, stream);\n peer.on('stream', stream => {\n console.log('[webrtc] Got remote stream (2)', msg.callerId);\n streamsRef.current[msg.callerId] = stream;\n });\n peersRef.current[msg.callerId] = peer;\n });\n\n callRoomParticipants();\n\n return () => {\n console.log('[webrtc] Disposing ChatProvider');\n // if (state.room || state.gameState.players.size > 0) {\n // console.log('[webrtc] Removing listeners for incoming-message')\n // state.room.removeAllListeners('incoming-message');\n // state.room.removeAllListeners('answer-call');\n\n // streamsRef.current = {};\n // setChatInitialized(false);\n // }\n }\n }, [state.room, state.gameState.players]);\n\n return (\n <ChatContext.Provider value={{\n audio: audioEnabled,\n video: videoEnabled,\n toggleAudio,\n toggleVideo,\n callPlayer,\n streamsRef\n }}>\n {children}\n </ChatContext.Provider>\n )\n}\n",{"ruleId":"61","replacedBy":"62"},{"ruleId":"63","replacedBy":"64"},{"ruleId":"65","severity":1,"message":"66","line":72,"column":8,"nodeType":"67","endLine":72,"endColumn":20,"suggestions":"68"},{"ruleId":"61","replacedBy":"69"},{"ruleId":"63","replacedBy":"70"},{"ruleId":"71","severity":1,"message":"72","line":1,"column":95,"nodeType":"73","messageId":"74","endLine":1,"endColumn":106},{"ruleId":"65","severity":1,"message":"75","line":178,"column":8,"nodeType":"67","endLine":178,"endColumn":45,"suggestions":"76"},"no-native-reassign",["77"],"no-negated-in-lhs",["78"],"react-hooks/exhaustive-deps","React Hook useEffect has missing dependencies: 'dispatch', 'roomId', 'setLocation', and 'state'. Either include them or remove the dependency array.","ArrayExpression",["79"],["77"],["78"],"@typescript-eslint/no-unused-vars","'useCallback' is defined but never used.","Identifier","unusedVar","React Hook useEffect has missing dependencies: 'addPeer', 'callRoomParticipants', and 'chatInitialized'. Either include them or remove the dependency array.",["80"],"no-global-assign","no-unsafe-negation",{"desc":"81","fix":"82"},{"desc":"83","fix":"84"},"Update the dependencies array to be: [dispatch, roomId, setLocation, state, state.room]",{"range":"85","text":"86"},"Update the dependencies array to be: [state.room, state.gameState.players, chatInitialized, callRoomParticipants, addPeer]",{"range":"87","text":"88"},[3030,3042],"[dispatch, roomId, setLocation, state, state.room]",[5979,6016],"[state.room, state.gameState.players, chatInitialized, callRoomParticipants, addPeer]"]