-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path.eslintcache
1 lines (1 loc) · 19.2 KB
/
.eslintcache
1
[{"/home/kalp/Desktop/WebD/My/RT-Board/client/src/index.js":"1","/home/kalp/Desktop/WebD/My/RT-Board/client/src/App.js":"2","/home/kalp/Desktop/WebD/My/RT-Board/client/src/reportWebVitals.js":"3","/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/Toolbar/Toolbar.js":"4","/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/Canvas/Canvas.js":"5","/home/kalp/Desktop/WebD/My/RT-Board/client/src/helperFunctions.js":"6","/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/PencilOptions/PencilOptions.js":"7","/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/EraserOptions/EraserOptions.js":"8","/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/Join/Join.js":"9","/home/kalp/Desktop/WebD/My/RT-Board/client/src/services/config.js":"10","/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/Board/Board.js":"11"},{"size":500,"mtime":1611908416057,"results":"12","hashOfConfig":"13"},{"size":348,"mtime":1612411764791,"results":"14","hashOfConfig":"13"},{"size":362,"mtime":1611908416057,"results":"15","hashOfConfig":"13"},{"size":6897,"mtime":1613794387934,"results":"16","hashOfConfig":"13"},{"size":2416,"mtime":1613882274060,"results":"17","hashOfConfig":"13"},{"size":3602,"mtime":1613882194684,"results":"18","hashOfConfig":"13"},{"size":1488,"mtime":1612411764795,"results":"19","hashOfConfig":"13"},{"size":586,"mtime":1612411764791,"results":"20","hashOfConfig":"13"},{"size":1119,"mtime":1612510324467,"results":"21","hashOfConfig":"13"},{"size":134,"mtime":1612535392944,"results":"22","hashOfConfig":"13"},{"size":3205,"mtime":1613882531655,"results":"23","hashOfConfig":"13"},{"filePath":"24","messages":"25","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"26"},"1ih9ce2",{"filePath":"27","messages":"28","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"26"},{"filePath":"29","messages":"30","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"26"},{"filePath":"31","messages":"32","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"33","usedDeprecatedRules":"26"},{"filePath":"34","messages":"35","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"36","usedDeprecatedRules":"26"},{"filePath":"37","messages":"38","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"26"},{"filePath":"39","messages":"40","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"41"},{"filePath":"42","messages":"43","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"26"},{"filePath":"44","messages":"45","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"26"},{"filePath":"46","messages":"47","errorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"usedDeprecatedRules":"26"},{"filePath":"48","messages":"49","errorCount":0,"warningCount":1,"fixableErrorCount":0,"fixableWarningCount":0,"source":"50","usedDeprecatedRules":"26"},"/home/kalp/Desktop/WebD/My/RT-Board/client/src/index.js",[],["51","52"],"/home/kalp/Desktop/WebD/My/RT-Board/client/src/App.js",[],"/home/kalp/Desktop/WebD/My/RT-Board/client/src/reportWebVitals.js",[],"/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/Toolbar/Toolbar.js",["53"],"import React, { useState, useEffect } from 'react';\nimport PencilOptions from '../PencilOptions/PencilOptions';\nimport EraserOptions from '../EraserOptions/EraserOptions';\nimport {ReactComponent as PencilSVG} from '../../assets/svg/pencil.svg';\nimport {ReactComponent as EraserSVG} from '../../assets/svg/eraser.svg';\nimport {ReactComponent as StickyNoteSVG} from '../../assets/svg/stickyNote.svg';\nimport {ReactComponent as DownloadSVG} from '../../assets/svg/download.svg';\nimport {ReactComponent as UploadPhotoSVG} from '../../assets/svg/uploadPhoto.svg';\nimport {ReactComponent as UndoSVG} from '../../assets/svg/undo.svg';\nimport {ReactComponent as RedoSVG} from '../../assets/svg/redo.svg';\nimport {ReactComponent as ToolExpanderSVG} from '../../assets/svg/toolExpander.svg';\nimport {ReactComponent as ExitSVG} from '../../assets/svg/exit.svg';\nimport { Undo, Redo, Redraw, createBox } from '../../helperFunctions';\nimport './Toolbar.css';\n\n\nconst Toolbar = ({history, socket, undoStack, redoStack}) => {\n\tconst [selectedTool, setSelectedTool] = useState(null);\n\tconst [showPencilOptions, setShowPencilOptions] = useState(false);\n\tconst [showEraserOptions, setShowEraserOptions] = useState(false);\n\tconst createSticky = (event) => {\n\t\tconst writingPad = createBox();\n\t\tconst textArea = document.createElement('textarea');\n\t\twritingPad.appendChild(textArea);\n\t\ttextArea.id = Date.now();\n\t\tif(socket)\n\t\t\tsocket.emit('createSticky', {id: textArea.id});\n\t\ttextArea.addEventListener('input', (event) => {\n\t\t\tif(socket)\n\t\t\t\tsocket.emit('stickychange', {id: textArea.id, data: event.target.value});\n\t\t});\n\t};\n\n\tconst handleExit = () => {\n\t\tconst allCloseButtons = document.querySelectorAll('.close');\n\t\tfor(let i = 0; i < allCloseButtons.length; ++i){\n\t\t\tallCloseButtons[i].click();\n\t\t}\n\t\thistory.push('/');\n\t};\n\n\tlet currentPencilColor = '#000000';\n\t\n\tuseEffect(() => {\n\t\tconst pencil = document.getElementById('pencil');\n\t\tconst eraser = document.getElementById('eraser');\n\t\tconst undo = document.getElementById('undo');\n\t\tconst redo = document.getElementById('redo');\n\t\tconst board = document.getElementById('board');\n\t\tconst ctx = board.getContext('2d');\n\t\t\n\t\tpencil.addEventListener('click', () => {\n\t\t\tsetSelectedTool('pencil');\n\t\t\tsetShowEraserOptions(false);\n\t\t\tsetShowPencilOptions(false);\n\t\t\tpencil.classList.add('selectedTool');\n\t\t\teraser.classList.remove('selectedTool');\n\t\t\tctx.lineWidth = document.getElementById('rangeInputPencil').value;\n\t\t\tctx.strokeStyle = currentPencilColor;\n\t\t});\n\n\t\teraser.addEventListener('click', () => {\n\t\t\tsetSelectedTool('eraser');\n\t\t\tsetShowEraserOptions(false);\n\t\t\tsetShowPencilOptions(false);\n\t\t\teraser.classList.add('selectedTool');\n\t\t\tpencil.classList.remove('selectedTool');\n\t\t\tctx.lineWidth = document.getElementById('rangeInputEraser').value;\n\t\t\tcurrentPencilColor = ctx.strokeStyle;\n\t\t\tctx.strokeStyle = \"#ffffff\";\n\t\t});\n\n\t\tundo.addEventListener('click', (event) => {\n\t\t\tUndo(undoStack, redoStack);\n\t\t\tRedraw(ctx, board, undoStack);\n\t\t\tif(socket) socket.emit('undo');\n\t\t});\n\n\t\tredo.addEventListener('click', (event) => {\n\t\t\tRedo(undoStack, redoStack);\n\t\t\tRedraw(ctx, board, undoStack);\n\t\t\tif(socket) socket.emit('redo');\n\t\t});\n\n\t\tconst pencilExpander = document.getElementById('pencilExpander');\n\t\tconst eraserExpander = document.getElementById('eraserExpander');\n\t\tpencilExpander.style.visibility = \"visible\";\n\t\tpencilExpander.addEventListener('click', () => setShowPencilOptions(true));\n\t\teraserExpander.addEventListener('click', () => setShowEraserOptions(true));\n\t\tboard.addEventListener('mousedown', () => {\n\t\t\tsetShowPencilOptions(false);\n\t\t\tsetShowEraserOptions(false);\n\t\t});\n\n\t\tconst downloadTool = document.getElementById('downloadScreenshot');\n\t\tdownloadTool.addEventListener('click', (event) => {\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.download = Date.now();\n\t\t\ta.href = board.toDataURL(\"image/png\");\n\t\t\ta.click();\n\t\t\ta.remove();\n\t\t});\n\n\t\tconst uploadImageSVG = document.getElementById('uploadImageSVG');\n\t\tuploadImageSVG.addEventListener('click', () => {\n\t\t\tconst uploadImageDiv = document.getElementById('uploadImageDiv');\n\t\t\tuploadImageDiv.style.display = \"flex\";\n\t\t\tconst shareImageButton = document.getElementById('shareImageButton');\n\t\t\tshareImageButton.addEventListener('click', (event) => {\n\t\t\t\tconst imageURL = document.getElementById('uploadedImage');\n\t\t\t\tif(!imageURL.value)\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\telse{\n\t\t\t\t\tconst writingPad = createBox();\n\t\t\t\t\tconst img = document.createElement('img');\n\t\t\t\t\timg.src = imageURL.value;\n\t\t\t\t\timageURL.value = \"\";\n\t\t\t\t\twritingPad.appendChild(img);\n\t\t\t\t\tuploadImageDiv.style.display = \"none\";\n\t\t\t\t\tif(socket)\n\t\t\t\t\t\tsocket.emit('shareImage', img.src);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t}, []);\n\n\tuseEffect(() => {\n\t\tif(selectedTool){\n\t\t\tconst selectableTools = document.getElementsByClassName(\"toolExpanderSVG\");\n\t\t\tfor(let i = 0; i < selectableTools.length; ++i){\n\t\t\t\tif(selectableTools[i].id === (selectedTool + 'Expander')){\n\t\t\t\t\tselectableTools[i].style.visibility = \"visible\";\n\t\t\t\t} else {\n\t\t\t\t\tselectableTools[i].style.visibility = \"hidden\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, [selectedTool]);\n\n\tuseEffect(() => {\n\t\tconst pencilOptions = document.getElementsByClassName('pencilOptions')[0];\n\t\tconst eraserOptions = document.getElementsByClassName('eraserOptions')[0];\n\t\t\n\t\tif(showPencilOptions)\n\t\t\tpencilOptions.style.visibility = \"visible\";\n\t\telse\n\t\t\tpencilOptions.style.visibility = \"hidden\";\n\t\t\n\t\tif(showEraserOptions)\n\t\t\teraserOptions.style.visibility = \"visible\";\n\t\telse\n\t\t\teraserOptions.style.visibility = \"hidden\";\n\t}, [showPencilOptions, showEraserOptions]);\t\n\n\treturn (\n\t\t<div className={\"toolbar\"}>\n\t\t\t<div className={\"tool expanderDiv\"}>\n\t\t\t\t<PencilSVG title=\"Pencil\" id = {\"pencil\"} className={\"selectedTool\"}/>\n\t\t\t\t<ToolExpanderSVG id = {\"pencilExpander\"} className={\"toolExpanderSVG\"} />\n\t\t\t\t<PencilOptions className={\"pencilOptions\"}/>\n\t\t\t</div>\n\t\t\t<div className={\"tool expanderDiv\"}>\n\t\t\t\t<EraserSVG title=\"Eraser\" id = {\"eraser\"} />\n\t\t\t\t<ToolExpanderSVG id = {\"eraserExpander\"} className={\"toolExpanderSVG\"} />\n\t\t\t\t<EraserOptions className={\"eraserOptions\"}/>\n\t\t\t</div>\n\t\t\t<StickyNoteSVG onClick={createSticky} title=\"Sticky Note\" style= {{width: \"auto\"}} className={\"tool\"} />\n\t\t\t<div className={\"tool\"}>\n\t\t\t\t<UploadPhotoSVG id={\"uploadImageSVG\"} title=\"Share Image\" />\n\t\t\t\t<div id={\"uploadImageDiv\"} className={\"uploadImageDiv\"}>\n\t\t\t\t\t<input id={\"uploadedImage\"} type=\"text\" placeholder=\"Enter image URL\"/>\n\t\t\t\t\t<button id={\"shareImageButton\"} className=\"button\">Share</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<DownloadSVG title=\"Download Screenshot\" id={\"downloadScreenshot\"} style = {{width: \"auto\"}} className={\"tool\"} />\n\t\t\t<UndoSVG title=\"Undo\" id={\"undo\"} className={\"tool\"} />\n\t\t\t<RedoSVG title=\"Redo\" id={\"redo\"} className={\"tool\"} />\n\t\t\t<ExitSVG style={{width: \"auto\"}} title=\"Leave\" onClick={handleExit} id={\"exit\"} className={\"tool\"} />\n\t\t</div>\n\t);\n};\n\nexport default Toolbar;","/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/Canvas/Canvas.js",["54"],"import React, { useEffect } from 'react';\nimport {createTypeSpace} from '../../helperFunctions.js';\n\nconst Canvas = ({socket, undoStack, redoStack}) => {\n\tuseEffect(() => {\n\t\tconst board = document.getElementsByTagName('canvas')[0];\n\t\tboard.height = window.innerHeight;\n\t\tboard.width = window.innerWidth;\n\t\tconst ctx = board.getContext('2d');\n\t\tctx.lineWidth = 3;\n\t\tctx.lineJoin = \"round\";\n\t\tctx.lineCap = \"round\";\n\t\tctx.imageSmoothingEnabled = true;\n\t\tctx.imageSmoothingQuality = \"high\";\n\t\tctx.miterlimit = 1;\n\t\tctx.fillStyle = \"#ffffff\";\n\t\tctx.fillRect(0, 0, board.width, board.height);\n\n\t\tlet isMouseDown = false;\n\n\t\tboard.addEventListener('mousedown', (event) => {\n\t\t\tredoStack.length = 0;\n\t\t\tctx.beginPath();\n\t\t\tconst {top} = board.getBoundingClientRect();\n\t\t\tctx.moveTo(event.clientX, event.clientY - top);\n\t\t\tisMouseDown = true;\n\t\t\tlet point = {\n\t\t\t\tx: event.clientX,\n\t\t\t\ty: event.clientY - top,\n\t\t\t\tidentifier: \"mousedown\",\n\t\t\t\tcolor: ctx.strokeStyle,\n\t\t\t\twidth: ctx.lineWidth\n\t\t\t};\n\t\t\tundoStack.push(point);\n\t\t\tif(socket)\n\t\t\t\tsocket.emit('mousedown', point);\n\t\t});\n\n\t\tboard.addEventListener(\"mousemove\", (event) => {\n\t\t\tif(isMouseDown){\n\t\t\t\tlet {top} = board.getBoundingClientRect();\n\t\t\t\tctx.lineTo(event.clientX, event.clientY - top);\n\t\t\t\tctx.stroke();\n\t\t\t\tlet point = {\n\t\t\t\t\tx: event.clientX,\n\t\t\t\t\ty: event.clientY - top,\n\t\t\t\t\tidentifier: \"mousemove\",\n\t\t\t\t\tcolor: ctx.strokeStyle,\n\t\t\t\t\twidth: ctx.lineWidth\n\t\t\t\t};\n\t\t\t\tundoStack.push(point);\n\t\t\t\tif(socket)\n\t\t\t\t\tsocket.emit('mousemove', point);\n\t\t\t}\n\t\t});\n\n\t\tboard.addEventListener(\"mouseup\", (event) => {\n\t\t\tisMouseDown = false;\n\t\t});\n\n\t\tboard.addEventListener('dblclick', (event) => {\n\t\t\tconst {typeDiv, textArea, closeButton} = createTypeSpace(ctx, board, event.clientX, event.clientY);\n\t\t\ttextArea.id = Date.now();\n\t\t\ttextArea.style.color = ctx.strokeStyle;\n\t\t\ttypeDiv.id = textArea.id + \"Div\";\n\t\t\tcloseButton.addEventListener('click', () => {\n\t\t\t\ttypeDiv.remove();\n\t\t\t\tif(socket)\n\t\t\t\t\tsocket.emit('removetypespace', typeDiv.id);\n\t\t\t});\n\t\t\tif(socket)\n\t\t\t\tsocket.emit('createtypespace', {id: textArea.id, x : event.clientX, y : event.clientY, color: ctx.strokeStyle});\n\t\t\ttextArea.addEventListener('input', (event) => {\n\t\t\t\tif(socket)\n\t\t\t\t\tsocket.emit('typespacechange', {id: textArea.id, data: event.target.value});\n\t\t\t});\n\t\t});\n\n\t}, []);\n\treturn (\n\t\t<div>\n\t\t\t<canvas id = {\"board\"} className={\"board\"}></canvas>\n\t\t</div>\n\t);\n};\n\nexport default Canvas;","/home/kalp/Desktop/WebD/My/RT-Board/client/src/helperFunctions.js",[],"/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/PencilOptions/PencilOptions.js",[],["55","56"],"/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/EraserOptions/EraserOptions.js",[],"/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/Join/Join.js",[],"/home/kalp/Desktop/WebD/My/RT-Board/client/src/services/config.js",[],"/home/kalp/Desktop/WebD/My/RT-Board/client/src/components/Board/Board.js",["57"],"import React, {useEffect} from 'react';\nimport queryString from 'query-string';\nimport io from 'socket.io-client';\nimport {apiURL} from '../../services/config.js';\nimport Toolbar from '../Toolbar/Toolbar';\nimport Canvas from '../Canvas/Canvas';\nimport { Undo, Redo, Redraw, createBox, createTypeSpace } from '../../helperFunctions';\n\nlet socket;\n\nconst Board = ({history, location}) => {\n\tlet undoStack = [], redoStack = [];\n\tsocket = io(apiURL);\n\tuseEffect(() => {\n\t\tconst {room} = queryString.parse(location.search);\n\t\tsocket.emit('join', {room});\n\t\tconst board = document.getElementById('board');\n\t\tconst ctx = board.getContext('2d');\n\t\tsocket.on('onmousedown', point => {\n\t\t\tlet currentCtxSpecs = {\n\t\t\t\tcolor: ctx.strokeStyle,\n\t\t\t\twidth: ctx.lineWidth\n\t\t\t};\n\t\t\tconst {x, y, color, width} = point;\n\t\t\tctx.lineWidth = width;\n\t\t\tctx.strokeStyle = color;\n\t\t\tctx.beginPath();\n\t\t\tctx.moveTo(x, y);\n\t\t\tundoStack.push(point);\n\t\t\tctx.strokeStyle = currentCtxSpecs.color;\n\t\t\tctx.lineWidth = currentCtxSpecs.width;\n\t\t});\n\n\t\tsocket.on('onmousemove', point => {\n\t\t\tlet currentCtxSpecs = {\n\t\t\t\tcolor: ctx.strokeStyle,\n\t\t\t\twidth: ctx.lineWidth\n\t\t\t}\n\t\t\tconst {x, y, color, width} = point;\n\t\t\tctx.lineWidth = width;\n\t\t\tctx.strokeStyle = color;\n\t\t\tctx.lineTo(x, y);\n\t\t\tctx.stroke();\n\t\t\tundoStack.push(point);\n\t\t\tctx.strokeStyle = currentCtxSpecs.color;\n\t\t\tctx.lineWidth = currentCtxSpecs.width;\n\t\t});\n\n\t\tsocket.on('onundo', () => {\n\t\t\tUndo(undoStack, redoStack);\n\t\t\tRedraw(ctx, board, undoStack);\n\t\t});\n\n\t\tsocket.on('onredo', () => {\n\t\t\tRedo(undoStack, redoStack);\n\t\t\tRedraw(ctx, board, undoStack);\n\t\t});\n\n\t\tsocket.on('oncreatesticky', ({id}) => {\n\t\t\tconst writingPad = createBox();\n\t\t\tconst textArea = document.createElement('textarea');\n\t\t\twritingPad.appendChild(textArea);\n\t\t\ttextArea.id = id;\n\t\t\ttextArea.addEventListener('input', (event) => {\n\t\t\t\tsocket.emit('stickychange', {id, data: event.target.value});\n\t\t\t});\n\t\t});\n\n\t\tsocket.on('onstickychange', ({id, data}) => {\n\t\t\tconst textArea = document.getElementById(id);\n\t\t\ttextArea.value = data;\n\t\t});\n\n\t\tsocket.on('oncreatetypespace', ({id, x, y, color}) => {\n\t\t\tconst {typeDiv, textArea, closeButton} = createTypeSpace(ctx, board, x, y);\n\t\t\ttextArea.id = id;\n\t\t\ttextArea.style.color = color;\n\t\t\ttypeDiv.id = id + \"Div\";\n\t\t\tcloseButton.addEventListener('click', () => {\n\t\t\t\ttypeDiv.remove();\n\t\t\t\tsocket.emit('removetypespace', typeDiv.id);\n\t\t\t});\n\t\t\ttextArea.addEventListener('input', (event) => {\n\t\t\t\tsocket.emit('typespacechange', {id, data: event.target.value});\n\t\t\t});\n\t\t});\n\n\t\tsocket.on('ontypespacechange', ({id, data}) => {\n\t\t\tconst textArea = document.getElementById(id);\n\t\t\ttextArea.value = data;\n\t\t});\n\n\t\tsocket.on('onremovetypespace', id => {\n\t\t\tconst typeDiv = document.getElementById(id);\n\t\t\ttypeDiv.remove();\n\t\t})\n\n\t\tsocket.on('onshareimage', url => {\n\t\t\tconst writingPad = createBox();\n\t\t\tconst img = document.createElement('img');\n\t\t\timg.src = url;\n\t\t\twritingPad.appendChild(img);\n\t\t});\n\n\t}, []);\n\treturn (\n\t <div className=\"App\">\n\t <Toolbar history={history} socket={socket} undoStack={undoStack} redoStack={redoStack}/>\n\t <Canvas socket={socket} undoStack={undoStack} redoStack={redoStack}/>\n\t </div>\n\t);\n};\n\nexport default Board;",{"ruleId":"58","replacedBy":"59"},{"ruleId":"60","replacedBy":"61"},{"ruleId":"62","severity":1,"message":"63","line":69,"column":25,"nodeType":"64","endLine":69,"endColumn":40},{"ruleId":"62","severity":1,"message":"65","line":79,"column":5,"nodeType":"66","endLine":79,"endColumn":7,"suggestions":"67"},{"ruleId":"58","replacedBy":"68"},{"ruleId":"60","replacedBy":"69"},{"ruleId":"62","severity":1,"message":"70","line":105,"column":5,"nodeType":"66","endLine":105,"endColumn":7,"suggestions":"71"},"no-native-reassign",["72"],"no-negated-in-lhs",["73"],"react-hooks/exhaustive-deps","Assignments to the 'currentPencilColor' variable from inside React Hook useEffect will be lost after each render. To preserve the value over time, store it in a useRef Hook and keep the mutable value in the '.current' property. Otherwise, you can move this variable directly inside useEffect.","MemberExpression","React Hook useEffect has missing dependencies: 'redoStack', 'socket', and 'undoStack'. Either include them or remove the dependency array.","ArrayExpression",["74"],["72"],["73"],"React Hook useEffect has missing dependencies: 'location.search', 'redoStack', and 'undoStack'. Either include them or remove the dependency array.",["75"],"no-global-assign","no-unsafe-negation",{"desc":"76","fix":"77"},{"desc":"78","fix":"79"},"Update the dependencies array to be: [redoStack, socket, undoStack]",{"range":"80","text":"81"},"Update the dependencies array to be: [location.search, redoStack, undoStack]",{"range":"82","text":"83"},[2298,2300],"[redoStack, socket, undoStack]",[2949,2951],"[location.search, redoStack, undoStack]"]