diff --git a/.eslintrc.json b/.eslintrc.json index bffb357..520cc3b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,3 @@ { - "extends": "next/core-web-vitals" + "extends": ["next/core-web-vitals", "prettier"] } diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..22065d2 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,38 @@ +//.prettierignore +README.md +.DS_Store +node_modules +/dist + +/tests/e2e/videos/ +/tests/e2e/screenshots/ + +.github +.next + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw* +.vscode + +# Lock File +package-lock.json +yarn.lock + +# autoGen +/autoGen +/public/cdn +/public/cdnimages \ No newline at end of file diff --git a/.prettierrc.toml b/.prettierrc.toml new file mode 100644 index 0000000..a6b5041 --- /dev/null +++ b/.prettierrc.toml @@ -0,0 +1,49 @@ +# .prettierrc.toml + +# 箭头函数只有一个参数的时候可以忽略括号 +arrowParens = "avoid" + +# 括号内部不要出现空格 +bracketSpacing = true + +# 行结束符使用 Unix 格式 +endOfLine = "lf" + +# true: Put > on the last line instead of at a new line +jsxBracketSameLine = false + +# 行宽 +printWidth = 100 + +# 换行方式 +proseWrap = "preserve" + +# 分号 +semi = false + +# 使用单引号 +singleQuote = true + +# 缩进 +tabWidth = 2 + +# 使用 tab 缩进 +useTabs = false + +# 后置逗号,多行对象、数组在最后一行增加逗号 +trailingComma = "es5" + +# 解析器,仅指定部分文件格式,避免影响其他语言功能 +[[overrides]] +files = "*.ts" +[overrides.options] +parser = "typescript" +[[overrides]] +files = "*.tsx" +[overrides.options] +parser = "typescript" + +[[overrides]] +files = "*.css" +[overrides.options] +parser = "css" diff --git a/.vscode/setting.json b/.vscode/setting.json new file mode 100644 index 0000000..1ca79c3 --- /dev/null +++ b/.vscode/setting.json @@ -0,0 +1,6 @@ +{ + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + } +} \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx index 76bd9fb..13e6011 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,9 +1,9 @@ "use client"; import "./globals.css"; import styles from "./page.module.css"; -import { SetStateAction, useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useMemo, useState } from "react"; import Link from "next/link"; -import { usePathname, useRouter } from "next/navigation"; +import { usePathname } from "next/navigation"; import { Button, Nav } from "@douyinfe/semi-ui"; import { OnSelectedData } from "@douyinfe/semi-ui/lib/es/navigation"; import { Layout as SeLayout } from "@douyinfe/semi-ui/lib/es/layout"; @@ -12,14 +12,13 @@ import { IconCustomerSupport, IconDoubleChevronLeft, IconDoubleChevronRight, - IconMoon, - IconSemiLogo, IconStar, - IconSun, IconVideoListStroked, IconHome, IconSetting, } from "@douyinfe/semi-icons"; import Image from "next/image"; +import ThemeButton from "./ui/ThemeButton"; +import { useSystemTheme, useTheme } from "./lib/utils"; export default function RootLayout({ children, @@ -36,13 +35,9 @@ export default function RootLayout({ const [openKeys, setOpenKeys] = useState(initOpenKeys); const [selectedKeys, setSelectedKeys] = useState([pathname.slice(1)]); const [isCollapsed, setIsCollapsed] = useState(false); - const [mode, setMode] = useState(typeof window !== 'undefined' && localStorage.getItem("mode") || "light"); - useEffect(() => { - localStorage.setItem("mode", mode); - if (mode === "dark") { - document.body.setAttribute("theme-mode", "dark"); - } - }, [mode]); + const [mode, setMode] = useState((typeof window !== 'undefined' && localStorage.getItem('mode')) || 'auto') + const systemTheme = useSystemTheme() + useTheme(mode,systemTheme) let navStyle = isCollapsed ? { height: "100%", overflow: "visible" } : { height: "100%" }; @@ -290,7 +285,9 @@ export default function RootLayout({ /> - {footer(mode, setMode)} + + + {children} @@ -300,44 +297,7 @@ export default function RootLayout({ ); } -function footer( - mode: string, - setMode: { - (value: SetStateAction): void; - (arg0: string): void; - } -) { - const switchMode = () => { - const body = document.body; - if (body.hasAttribute("theme-mode")) { - body.removeAttribute("theme-mode"); - setMode("light"); - } else { - body.setAttribute("theme-mode", "dark"); - setMode("dark"); - } - }; - return ( - -