From ba21e04bbe46e1c745d649ea221e0ea8d84f4d51 Mon Sep 17 00:00:00 2001 From: Grant Date: Wed, 8 Jan 2025 22:41:33 -0700 Subject: [PATCH 1/2] fix client eslint --- packages/client/.eslintrc.json | 25 ++++++++ packages/client/package.json | 3 - packages/client/src/components/App.tsx | 13 ++-- packages/client/src/components/AuthErrors.tsx | 6 +- packages/client/src/components/Chat/Chat.tsx | 2 +- .../src/components/Chat/OpenChatButton.tsx | 13 ++-- .../src/components/EventInfoOverlay.tsx | 3 +- .../src/components/Moderation/ModModal.tsx | 4 +- .../src/components/Profile/UserCard.tsx | 14 ++--- .../client/src/components/SidebarBase.tsx | 63 ++++++++++++++----- .../src/components/Templating/Template.tsx | 2 +- packages/client/src/contexts/AppContext.tsx | 5 +- packages/client/src/lib/canvasRenderer.ts | 3 +- packages/client/src/lib/router.ts | 2 +- packages/client/src/lib/template.ts | 1 + packages/client/src/lib/utils.ts | 4 +- packages/client/src/worker/render.worker.ts | 2 +- 17 files changed, 109 insertions(+), 56 deletions(-) create mode 100644 packages/client/.eslintrc.json diff --git a/packages/client/.eslintrc.json b/packages/client/.eslintrc.json new file mode 100644 index 0000000..e234a06 --- /dev/null +++ b/packages/client/.eslintrc.json @@ -0,0 +1,25 @@ +{ + "extends": ["react-app"], + "rules": { + "no-unused-vars": "off", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "caughtErrors": "all", + "caughtErrorsIgnorePattern": "^_", + "destructuredArrayIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "ignoreRestSiblings": true + } + ] + }, + "overrides": [ + { + "files": ["**/*.ts?(x)"], + "rules": {} + } + ] +} diff --git a/packages/client/package.json b/packages/client/package.json index 224394a..e59f9ef 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -13,9 +13,6 @@ "keywords": [], "author": "", "license": "ISC", - "eslintConfig": { - "extends": "react-app" - }, "dependencies": { "@fortawesome/free-solid-svg-icons": "^6.7.2", "@icons-pack/react-simple-icons": "^10.2.0", diff --git a/packages/client/src/components/App.tsx b/packages/client/src/components/App.tsx index 1ed9799..d0852d0 100644 --- a/packages/client/src/components/App.tsx +++ b/packages/client/src/components/App.tsx @@ -5,11 +5,10 @@ import { TemplateContext } from "../contexts/TemplateContext"; import { SettingsSidebar } from "./Settings/SettingsSidebar"; import { DebugModal } from "./Debug/DebugModal"; import { ToolbarWrapper } from "./Toolbar/ToolbarWrapper"; -import React, { lazy, useEffect } from "react"; +import { useEffect } from "react"; import { ChatContext } from "../contexts/ChatContext"; import "react-toastify/dist/ReactToastify.css"; -import { ToastContainer } from "react-toastify"; import { AuthErrors } from "./AuthErrors"; import "../lib/keybinds"; import { PixelWhoisSidebar } from "./PixelWhoisSidebar"; @@ -21,15 +20,15 @@ import { ModModal } from "./Moderation/ModModal"; import { DynamicModals } from "./DynamicModals"; import { ToastWrapper } from "./ToastWrapper"; -const Chat = lazy(() => import("./Chat/Chat")); +// const Chat = lazy(() => import("./Chat/Chat")); console.log("Client init with version " + __COMMIT_HASH__); -const DynamicallyLoadChat = () => { - const { loadChat } = useAppContext(); +// const DynamicallyLoadChat = () => { +// const { loadChat } = useAppContext(); - return {loadChat && }; -}; +// return {loadChat && }; +// }; // get access to context data const AppInner = () => { diff --git a/packages/client/src/components/AuthErrors.tsx b/packages/client/src/components/AuthErrors.tsx index 6a9d6ff..1325f3a 100644 --- a/packages/client/src/components/AuthErrors.tsx +++ b/packages/client/src/components/AuthErrors.tsx @@ -61,7 +61,7 @@ const BannedError = ({ return ( - {(onClose) => ( + {(_onClose) => ( <> Login Error @@ -96,7 +96,7 @@ const OPError = ({ params: URLSearchParams; }) => { const canRetry = params.has(Params.CAN_RETRY); - const [error, setError] = useState(params.get(Params.ERROR)); + const [error, _setError] = useState(params.get(Params.ERROR)); const [errorDesc, setErrorDesc] = useState(params.get(Params.ERROR_DESC)); useEffect(() => { @@ -110,7 +110,7 @@ const OPError = ({ return ( - {(onClose) => ( + {(_onClose) => ( <> Login Error diff --git a/packages/client/src/components/Chat/Chat.tsx b/packages/client/src/components/Chat/Chat.tsx index d270935..cc9b138 100644 --- a/packages/client/src/components/Chat/Chat.tsx +++ b/packages/client/src/components/Chat/Chat.tsx @@ -1,4 +1,4 @@ -import { useEffect, useRef, useState } from "react"; +import { useRef } from "react"; const Chat = () => { const ref = useRef(null); diff --git a/packages/client/src/components/Chat/OpenChatButton.tsx b/packages/client/src/components/Chat/OpenChatButton.tsx index 1f16221..92adfd5 100644 --- a/packages/client/src/components/Chat/OpenChatButton.tsx +++ b/packages/client/src/components/Chat/OpenChatButton.tsx @@ -1,4 +1,4 @@ -import { Badge, Button, Link } from "@nextui-org/react"; +import { Badge, Button } from "@nextui-org/react"; import { useChatContext } from "../../contexts/ChatContext"; import { useAppContext } from "../../contexts/AppContext"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -15,15 +15,12 @@ const OpenChatButton = () => { color="danger" size="sm" > - { - config?.chat?.element_host && - } + + )} ); }; diff --git a/packages/client/src/components/EventInfoOverlay.tsx b/packages/client/src/components/EventInfoOverlay.tsx index cc13e55..2951660 100644 --- a/packages/client/src/components/EventInfoOverlay.tsx +++ b/packages/client/src/components/EventInfoOverlay.tsx @@ -1,4 +1,3 @@ -import React, { useEffect, useRef } from "react"; import { useAppContext } from "../contexts/AppContext"; import { Button, Link } from "@nextui-org/react"; @@ -11,7 +10,7 @@ import { Button, Link } from "@nextui-org/react"; * * used by the canvas preview page to get people hyped up for the event (<7 days before) */ -export const EventInfoOverlay = ({ children }: React.PropsWithChildren) => { +export const EventInfoOverlay = () => { const { setInfoSidebar, setSettingsSidebar } = useAppContext(); return ( diff --git a/packages/client/src/components/Moderation/ModModal.tsx b/packages/client/src/components/Moderation/ModModal.tsx index b8af514..dc696fb 100644 --- a/packages/client/src/components/Moderation/ModModal.tsx +++ b/packages/client/src/components/Moderation/ModModal.tsx @@ -72,7 +72,7 @@ export const ModModal = () => { const doUndoArea = useCallback(() => { if (!selectedCoords) return; if ( - !confirm( + !window.confirm( `Are you sure you want to undo (${selectedCoords.start.join(",")}) -> (${selectedCoords.end.join(",")})\n\nThis will affect ~${(selectedCoords.end[0] - selectedCoords.start[0]) * (selectedCoords.end[1] - selectedCoords.start[1])} pixels!` ) ) { @@ -105,7 +105,7 @@ export const ModModal = () => { return ( - {(onClose) => ( + {(_onClose) => ( <> Mod Menu diff --git a/packages/client/src/components/Profile/UserCard.tsx b/packages/client/src/components/Profile/UserCard.tsx index 3e7b1b6..4939aae 100644 --- a/packages/client/src/components/Profile/UserCard.tsx +++ b/packages/client/src/components/Profile/UserCard.tsx @@ -1,6 +1,6 @@ import { faMessage, faWarning } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; -import { Avatar, Button, Link, Spinner, User } from "@nextui-org/react"; +import { Button, Link, Spinner, User } from "@nextui-org/react"; import { ClientConfig } from "@sc07-canvas/lib/src/net"; import { MouseEvent, useEffect, useMemo, useState } from "react"; import { toast } from "react-toastify"; @@ -74,7 +74,7 @@ export const UserCard = ({ user }: { user: IUser }) => { const name = useMemo(() => { if (!user || !user.sub) { - return 'Unknown' + return "Unknown"; } const regex = /^(.*)@/; @@ -84,19 +84,19 @@ export const UserCard = ({ user }: { user: IUser }) => { return match[1]; } - return 'Unknown' - }, [user]) + return "Unknown"; + }, [user]); return (
-
diff --git a/packages/client/src/components/SidebarBase.tsx b/packages/client/src/components/SidebarBase.tsx index 60c7e49..9458c24 100644 --- a/packages/client/src/components/SidebarBase.tsx +++ b/packages/client/src/components/SidebarBase.tsx @@ -1,8 +1,9 @@ -import { motion } from "framer-motion" +import { motion } from "framer-motion"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { IconProp } from "@fortawesome/fontawesome-svg-core"; import { Button, Divider } from "@nextui-org/react"; import { faXmark } from "@fortawesome/free-solid-svg-icons"; +import { JSX } from "react"; /** * Information sidebar @@ -11,26 +12,53 @@ import { faXmark } from "@fortawesome/free-solid-svg-icons"; * * @returns */ -export const SidebarBase = ({children, shown, icon, setSidebarShown, title, description, side}: { children: string | JSX.Element | JSX.Element[], icon: IconProp, shown: boolean, setSidebarShown: (value: boolean) => void, title: string, description: string, side: "Left" | "Right" }) => { +export const SidebarBase = ({ + children, + shown, + icon, + setSidebarShown, + title, + description, + side, +}: { + children: string | JSX.Element | JSX.Element[]; + icon: IconProp; + shown: boolean; + setSidebarShown: (value: boolean) => void; + title: string; + description: string; + side: "Left" | "Right"; +}) => { return (
@@ -41,10 +69,15 @@ export const SidebarBase = ({children, shown, icon, setSidebarShown, title, desc

{description}

-
- diff --git a/packages/client/src/components/Templating/Template.tsx b/packages/client/src/components/Templating/Template.tsx index e1026d9..7eced3f 100644 --- a/packages/client/src/components/Templating/Template.tsx +++ b/packages/client/src/components/Templating/Template.tsx @@ -56,7 +56,7 @@ export const Template = () => { templateHolderRef.style.setProperty("top", canvasY - offset[1] + "px"); }; - const handleMouseUp = (e: MouseEvent) => { + const handleMouseUp = (_e: MouseEvent) => { startLocation = undefined; Canvas.instance?.getPanZoom().panning.setEnabled(true); diff --git a/packages/client/src/contexts/AppContext.tsx b/packages/client/src/contexts/AppContext.tsx index 6651ad3..942f993 100644 --- a/packages/client/src/contexts/AppContext.tsx +++ b/packages/client/src/contexts/AppContext.tsx @@ -39,7 +39,7 @@ interface IAppContext { heatmapOverlay: IMapOverlay; setHeatmapOverlay: React.Dispatch>; pixelPulses: boolean; - setPixelPulses: (state: boolean) => void + setPixelPulses: (state: boolean) => void; profile?: string; // sub setProfile: (v?: string) => void; @@ -92,6 +92,7 @@ type AppContext = ConfigExists extends true export const useAppContext = () => useContext>(appContext as any); +// eslint-disable-next-line @typescript-eslint/no-redeclare export const AppContext = ({ children }: PropsWithChildren) => { const [config, setConfig] = useState(undefined as any); const [auth, setAuth] = useState(); @@ -125,7 +126,7 @@ export const AppContext = ({ children }: PropsWithChildren) => { opacity: 1, loading: false, }); - const [pixelPulses, setPixelPulses] = useState(false) + const [pixelPulses, setPixelPulses] = useState(false); const [profile, setProfile] = useState(); diff --git a/packages/client/src/lib/canvasRenderer.ts b/packages/client/src/lib/canvasRenderer.ts index 97be57e..785c404 100644 --- a/packages/client/src/lib/canvasRenderer.ts +++ b/packages/client/src/lib/canvasRenderer.ts @@ -13,6 +13,7 @@ const isWorker = () => { // @ts-ignore typeof WorkerGlobalScope !== "undefined" && // @ts-ignore + // eslint-disable-next-line no-restricted-globals self instanceof WorkerGlobalScope ); }; @@ -94,7 +95,7 @@ export class CanvasRenderer extends EventEmitter { } } - usePixels(pixels: CanvasPixel[], replace = false) { + usePixels(pixels: CanvasPixel[], _replace = false) { for (const pixel of pixels) { this.usePixel(pixel); } diff --git a/packages/client/src/lib/router.ts b/packages/client/src/lib/router.ts index 79497d7..7ff029f 100644 --- a/packages/client/src/lib/router.ts +++ b/packages/client/src/lib/router.ts @@ -63,7 +63,7 @@ class _Router extends EventEmitter { window.removeEventListener("hashchange", this._hashChange.bind(this)); } - _hashChange(e: HashChangeEvent) { + _hashChange(_e: HashChangeEvent) { const data = this.get(); console.info("[Router] Navigated", data); this.emit("navigate", data); diff --git a/packages/client/src/lib/template.ts b/packages/client/src/lib/template.ts index 75262f0..9f58777 100644 --- a/packages/client/src/lib/template.ts +++ b/packages/client/src/lib/template.ts @@ -34,6 +34,7 @@ const TemplateStyle = { "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALAAAACwCAYAAACvt+ReAAAE10lEQVR42u3d3bKjKBQGULDy/q/MXE1VdzqRH9kqZq2bqZn5JKAmErbm5JRSSbCw0pGTlb1VdttpoAS9AUpANgW1u0q2dGxTOo7faLu92TTa7vZlozz55P2/zRyQ7RXRj97+zsyWjm1GT97aGI9kR8aWaydwxIEg7g05ms0nvcnCsq8bzrVnvVNr2RyQzReP7eeO33bBp0We/E6NnJr0nJAR7UZOpR5x/LYEC9smrCyMrETMXErpvazd4fI9c3+VnW/2teze8Ss7qwAt7ZYJ50y13deqk/fBbVYb28iY8mLZvf9ebTcnlTgeOIWAZShJyi6bfX3YOH84sfOXF7oyW3amQrXs++vMarc3m7/048w+rJT957htlU/i3HCQ93J77R7N5o4vD+/ZUvmSkRvHdiSbOvqwt/2RbA7av6cdt+0Bqw8jlMDX9M9xq5WS71xKjS5VtmxbDvZ3JJsDsvnEsU09dq+GM75MPnl72s2VQZx1JehdA23pb8/YevdDax/KhWMrM84Vy2gs7dOXuJGSZMslYLTUWbsUtbT7nm25ibqlhPqp3Z7+po7+RuyHnj707t/S8fql8/XLyHzE2qPs7bJKyTxmCgFLcimSXTa7fdiwfPn3NDGbgtq9ezYNZke++JaAbApqdzj75zrw+9rd3lrekeye1vsljmZ7+5snZL/1q2clJw3uwxnZXlGPWP3VX3PgNSh9f/HaeaeXzk+FEpzNAdl88dhSQPanjttWeafX7lZq/ZRovQPqSLanDyWo3ci70XqyvXeutbQbeVdez91onkrmmVOII3c1RV02I+8Ei2g36sc/SuOVo+WSfKS/EdOfw/2wnii7bFYpmaWZA7M8lyLZZbOvD0sUf/4z7XyJ68n++f88PfyDTw9H9WHWI0W17JFHXmqv+WnHzcymjj7Utj2yvpwC9u/yx+3uc2Al1DWddtxelfnw7DJjxI9Kt14pSuM7flY2B2TzxWO73XF7/12IM8qMtXeuEmpDCfWEsR2dSvVOu4ZuWbCMxtJaf9gkHcjNKM3WVgBqlzGl7/7+HhlfrfQ9ejdaOXqSysreKquUzNLMgVmeS5Hsstlv9wMroY5lW7+4KH1Pyr6vQiihHnsquTSMy1Pf4/v3n6w58FxK3yf7VkpWQo35M7Ol4xPzvd0SnM0B2Rw9tq1y+f7Fp4fPOHlr/SgdYysHxta7H3pOyIh2/a1kfmMK0fqJ0rrd3Uq5nh6O3Q8peP8Obywre6usUjJLMwdmeS5Fsstma6Xkb8scSqjPyC5/3Fp+nfKbI0+hRq0vp45s72MsOaC/V2eXP26z5sBKqGta/rjNWgfuyfrh7Pix/cxx2w68Iy95CvWiS5wfzt7f/rKnvi2j8egpxC2fQr355TCiXU9972xrPVF22axSMo+aQkCUsCU7lyLZM7Lhn8BKqOf39xdL31PN+kOHSqhj+yF1ju0ppe+wE9h8jKW/xK1WQj1D5GM3I9mIH5vOF49tyifwij/AfOYndk8JNqLNiDJ/CWr3tOOmlMxjphB+gPn4VErp+4Jpn3VK2TOyYXM7pWTO+h4BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE/1H4IIqRgL4W2oAAAAAElFTkSuQmCC", }; +// eslint-disable-next-line @typescript-eslint/no-redeclare export type TemplateStyle = keyof typeof TemplateStyle; export const TemplateStyles = Object.keys(TemplateStyle); diff --git a/packages/client/src/lib/utils.ts b/packages/client/src/lib/utils.ts index 1eed9f6..dabb446 100644 --- a/packages/client/src/lib/utils.ts +++ b/packages/client/src/lib/utils.ts @@ -20,7 +20,7 @@ Debug._getRenderer = getRenderer; export const rgbToHex = (r: number, g: number, b: number) => { function componentToHex(c: number) { var hex = c.toString(16); - return hex.length == 1 ? "0" + hex : hex; + return hex.length === 1 ? "0" + hex : hex; } return ( @@ -54,7 +54,7 @@ export const api = async ( try { data = await req.json(); - } catch (e) { + } catch (_e) { /* empty */ } diff --git a/packages/client/src/worker/render.worker.ts b/packages/client/src/worker/render.worker.ts index 24cf6ad..7873b1b 100644 --- a/packages/client/src/worker/render.worker.ts +++ b/packages/client/src/worker/render.worker.ts @@ -12,7 +12,7 @@ renderer.on("ready", () => { postMessage({ type: "ready" }); }); -addEventListener("message", (req) => { +window.addEventListener("message", (req) => { switch (req.data.type) { case "canvas": { const canvas: OffscreenCanvas = req.data.canvas; -- GitLab From 198910c9e2582f1406ecc620e8115fee51f0aa60 Mon Sep 17 00:00:00 2001 From: Grant Date: Wed, 8 Jan 2025 22:43:31 -0700 Subject: [PATCH 2/2] add ci --- .gitlab-ci.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c8b1730..1990d72 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,10 +1,22 @@ stages: - - test + - lint - build + - test - deploy +eslint client: + stage: lint + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + changes: + - packages/client/src/**/* + image: node:23-alpine + script: + - npm i --include=dev + - npm -w packages/client run lint + eslint server: - stage: test + stage: lint rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" changes: -- GitLab