diff --git a/.eslintrc.cjs b/.eslintrc.cjs index e536c8db..a0a6a08e 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -1,5 +1,5 @@ module.exports = { - extends: ["next/core-web-vitals", "plugin:import/recommended"], + extends: ["next/core-web-vitals", "plugin:import/recommended", "plugin:react/recommended"], root: true, settings: { "import/resolver": { @@ -8,11 +8,12 @@ module.exports = { }, plugins: ["unused-imports"], rules: { - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": "off", "unused-imports/no-unused-imports": "error", "import/named": "off", "import/no-anonymous-default-export": "off", "import/no-named-as-default": "off", + "react/react-in-jsx-scope": "off", + "react-hooks/exhaustive-deps": "off", + "import/no-named-as-default-member": "off", }, } diff --git a/package.json b/package.json index 874adc73..f567be67 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "docker:db": "docker-compose -f docker-compose.db.yml up -d", "spell-check": "cspell lint . --no-progress", "analyze": "NODE_ENV=production ANALYZE=true BUNDLE_ANALYZE=browser next build", - "postinstall": "prisma generate" + "postinstall": "prisma generate", + "lint": "next lint" }, "lint-staged": { "*.{js,jsx,ts,tsx}": [ @@ -187,6 +188,7 @@ "eslint": "8.42.0", "eslint-config-next": "13.4.4", "eslint-plugin-import": "2.27.5", + "eslint-plugin-react": "7.32.2", "eslint-plugin-unused-imports": "2.0.0", "husky": "8.0.3", "lint-staged": "13.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2994b8e..787e2dd6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -478,6 +478,9 @@ devDependencies: eslint-plugin-import: specifier: 2.27.5 version: 2.27.5(@typescript-eslint/parser@5.59.8)(eslint-import-resolver-typescript@3.5.5)(eslint@8.42.0) + eslint-plugin-react: + specifier: 7.32.2 + version: 7.32.2(eslint@8.42.0) eslint-plugin-unused-imports: specifier: 2.0.0 version: 2.0.0(eslint@8.42.0) @@ -6439,7 +6442,7 @@ packages: dev: true /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} /configstore@5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} diff --git a/src/app/(home)/page.tsx b/src/app/(home)/page.tsx index 4187e3c4..d0dec091 100644 --- a/src/app/(home)/page.tsx +++ b/src/app/(home)/page.tsx @@ -288,6 +288,7 @@ async function Home() { href={getSiteLink({ subdomain: "xlog" })} role="button" className="button is-black rounded-lg" + rel="noreferrer" > {t(`features.${feature.title}.extra.button`)} diff --git a/src/app/dashboard/[subdomain]/editor/page.tsx b/src/app/dashboard/[subdomain]/editor/page.tsx index 148f6577..598a7b8b 100644 --- a/src/app/dashboard/[subdomain]/editor/page.tsx +++ b/src/app/dashboard/[subdomain]/editor/page.tsx @@ -6,7 +6,6 @@ import { nanoid } from "nanoid" import { useParams, useRouter, useSearchParams } from "next/navigation" import { ChangeEvent, - FC, memo, useCallback, useEffect, @@ -729,16 +728,7 @@ export default function SubdomainEditor() { ) } -const EditorExtraProperties: FC<{ - updateValue: (key: K, value: Values[K]) => void - isPost: boolean - - subdomain: string - defaultSlug: string - userTags: string[] - - openAdvancedOptions: () => void -}> = memo( +const EditorExtraProperties = memo( ({ isPost, updateValue, @@ -746,6 +736,15 @@ const EditorExtraProperties: FC<{ defaultSlug, userTags, openAdvancedOptions, + }: { + updateValue: (key: K, value: Values[K]) => void + isPost: boolean + + subdomain: string + defaultSlug: string + userTags: string[] + + openAdvancedOptions: () => void }) => { const values = useEditorState( (state) => @@ -918,13 +917,17 @@ const EditorExtraProperties: FC<{ EditorExtraProperties.displayName = "EditorExtraProperties" -const EditorAdvancedOptions: FC<{ - updateValue: (key: K, value: Values[K]) => void +const EditorAdvancedOptions = memo( + ({ + updateValue, + isAdvancedOptionsOpen, + setIsAdvancedOptionsOpen, + }: { + updateValue: (key: K, value: Values[K]) => void - isAdvancedOptionsOpen: boolean - setIsAdvancedOptionsOpen: (state: boolean) => void -}> = memo( - ({ updateValue, isAdvancedOptionsOpen, setIsAdvancedOptionsOpen }) => { + isAdvancedOptionsOpen: boolean + setIsAdvancedOptionsOpen: (state: boolean) => void + }) => { const values = useEditorState( (state) => pick(state, ["disableAISummary"]), shallow, diff --git a/src/app/dashboard/[subdomain]/settings/navigation/page.tsx b/src/app/dashboard/[subdomain]/settings/navigation/page.tsx index d1bc9b2e..47f6ca40 100644 --- a/src/app/dashboard/[subdomain]/settings/navigation/page.tsx +++ b/src/app/dashboard/[subdomain]/settings/navigation/page.tsx @@ -18,11 +18,15 @@ type UpdateItem = (id: string, newItem: Partial) => void type RemoveItem = (id: string) => void -const SortableNavigationItem: React.FC<{ +const SortableNavigationItem = ({ + item, + updateItem, + removeItem, +}: { item: SiteNavigationItem updateItem: UpdateItem removeItem: RemoveItem -}> = ({ item, updateItem, removeItem }) => { +}) => { const { t } = useTranslation("dashboard") return (
@@ -172,6 +176,7 @@ export default function SiteSettingsNavigationPage() { /> ) })} + {/* eslint-disable-next-line react/no-unknown-property */}