mirror of
				https://github.com/Vomitblood/stort.git
				synced 2025-11-04 20:57:22 +08:00 
			
		
		
		
	paths global state storage
This commit is contained in:
		
							parent
							
								
									93ee012fee
								
							
						
					
					
						commit
						515ea481ed
					
				
							
								
								
									
										18
									
								
								package.json
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								package.json
									
									
									
									
									
								
							| 
						 | 
					@ -14,25 +14,25 @@
 | 
				
			||||||
    "@emotion/react": "^11.13.0",
 | 
					    "@emotion/react": "^11.13.0",
 | 
				
			||||||
    "@emotion/server": "^11.11.0",
 | 
					    "@emotion/server": "^11.11.0",
 | 
				
			||||||
    "@emotion/styled": "^11.13.0",
 | 
					    "@emotion/styled": "^11.13.0",
 | 
				
			||||||
    "@mui/icons-material": "^5.16.5",
 | 
					    "@mui/icons-material": "^5.16.6",
 | 
				
			||||||
    "@mui/material": "^5.16.5",
 | 
					    "@mui/material": "^5.16.6",
 | 
				
			||||||
    "@tauri-apps/api": "^1.6.0",
 | 
					    "@tauri-apps/api": "^1.6.0",
 | 
				
			||||||
    "@types/lodash": "^4.17.7",
 | 
					    "@types/lodash": "^4.17.7",
 | 
				
			||||||
    "jotai": "^2.9.1",
 | 
					    "jotai": "^2.9.1",
 | 
				
			||||||
    "lodash": "^4.17.21",
 | 
					    "lodash": "^4.17.21",
 | 
				
			||||||
    "lowdb": "^7.0.1",
 | 
					    "lowdb": "^7.0.1",
 | 
				
			||||||
    "next": "14.2.5",
 | 
					    "next": "14.2.5",
 | 
				
			||||||
    "react": "^18",
 | 
					    "react": "^18.3.1",
 | 
				
			||||||
    "react-dom": "^18",
 | 
					    "react-dom": "^18.3.1",
 | 
				
			||||||
    "zustand": "^4.5.4"
 | 
					    "zustand": "^4.5.4"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "devDependencies": {
 | 
					  "devDependencies": {
 | 
				
			||||||
    "@tauri-apps/cli": "^1.6.0",
 | 
					    "@tauri-apps/cli": "^1.6.0",
 | 
				
			||||||
    "@types/node": "^20",
 | 
					    "@types/node": "^20.14.14",
 | 
				
			||||||
    "@types/react": "^18",
 | 
					    "@types/react": "^18.3.3",
 | 
				
			||||||
    "@types/react-dom": "^18",
 | 
					    "@types/react-dom": "^18.3.0",
 | 
				
			||||||
    "eslint": "^8",
 | 
					    "eslint": "^8.57.0",
 | 
				
			||||||
    "eslint-config-next": "14.2.5",
 | 
					    "eslint-config-next": "14.2.5",
 | 
				
			||||||
    "typescript": "^5"
 | 
					    "typescript": "^5.5.4"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -62,6 +62,16 @@
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "updater": {
 | 
					    "updater": {
 | 
				
			||||||
      "active": false
 | 
					      "active": false
 | 
				
			||||||
    }
 | 
					    },
 | 
				
			||||||
 | 
					    "windows": [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        "decorations": false,
 | 
				
			||||||
 | 
					        "fullscreen": false,
 | 
				
			||||||
 | 
					        "height": 600,
 | 
				
			||||||
 | 
					        "resizable": true,
 | 
				
			||||||
 | 
					        "title": "Stort",
 | 
				
			||||||
 | 
					        "width": 800
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
							
								
								
									
										12
									
								
								src/components/Generic/Initialization.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/components/Generic/Initialization.tsx
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					import { useEffect } from "react";
 | 
				
			||||||
 | 
					import { usePathStore } from "../../lib/store/zustand/path";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const Initialization = () => {
 | 
				
			||||||
 | 
					  const setPaths = usePathStore((state) => state.setPaths);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  useEffect(() => {
 | 
				
			||||||
 | 
					    setPaths();
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return null;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
							
								
								
									
										10
									
								
								src/components/Generic/Layout.tsx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								src/components/Generic/Layout.tsx
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,10 @@
 | 
				
			||||||
 | 
					import { Box } from "@mui/material";
 | 
				
			||||||
 | 
					import { HeaderBar } from "../HeaderBar/HeaderBar";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const Layout = () => {
 | 
				
			||||||
 | 
					  return (
 | 
				
			||||||
 | 
					    <Box>
 | 
				
			||||||
 | 
					      <HeaderBar />
 | 
				
			||||||
 | 
					    </Box>
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -1,40 +0,0 @@
 | 
				
			||||||
export const getConfigDirectory = async () => {
 | 
					 | 
				
			||||||
  const { configDir } = await import("@tauri-apps/api/path");
 | 
					 | 
				
			||||||
  return (await configDir()) + "stort/";
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const pathBase = "stort/";
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
export const getPaths = async () => {
 | 
					 | 
				
			||||||
  const {
 | 
					 | 
				
			||||||
    cacheDir,
 | 
					 | 
				
			||||||
    configDir,
 | 
					 | 
				
			||||||
    dataDir,
 | 
					 | 
				
			||||||
    desktopDir,
 | 
					 | 
				
			||||||
    documentDir,
 | 
					 | 
				
			||||||
    downloadDir,
 | 
					 | 
				
			||||||
    executableDir,
 | 
					 | 
				
			||||||
    fontDir,
 | 
					 | 
				
			||||||
    homeDir,
 | 
					 | 
				
			||||||
    logDir,
 | 
					 | 
				
			||||||
    pictureDir,
 | 
					 | 
				
			||||||
    templateDir,
 | 
					 | 
				
			||||||
    videoDir,
 | 
					 | 
				
			||||||
  } = await import("@tauri-apps/api/path");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return {
 | 
					 | 
				
			||||||
    cacheDirectory: (await cacheDir()) + pathBase,
 | 
					 | 
				
			||||||
    configDirectory: (await configDir()) + pathBase,
 | 
					 | 
				
			||||||
    dataDirectory: (await dataDir()) + pathBase,
 | 
					 | 
				
			||||||
    desktopDirectory: (await desktopDir()) + pathBase,
 | 
					 | 
				
			||||||
    documentDirectory: (await documentDir()) + pathBase,
 | 
					 | 
				
			||||||
    downloadDirectory: (await downloadDir()) + pathBase,
 | 
					 | 
				
			||||||
    executableDirectory: (await executableDir()) + pathBase,
 | 
					 | 
				
			||||||
    fontDirectory: (await fontDir()) + pathBase,
 | 
					 | 
				
			||||||
    homeDirectory: (await homeDir()) + pathBase,
 | 
					 | 
				
			||||||
    logDirectory: (await logDir()) + pathBase,
 | 
					 | 
				
			||||||
    pictureDirectory: (await pictureDir()) + pathBase,
 | 
					 | 
				
			||||||
    templateDirectory: (await templateDir()) + pathBase,
 | 
					 | 
				
			||||||
    videoDirectory: (await videoDir()) + pathBase,
 | 
					 | 
				
			||||||
  };
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
| 
						 | 
					@ -1,14 +1,93 @@
 | 
				
			||||||
import { create } from "zustand";
 | 
					import { create } from "zustand";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type PathType = {
 | 
					type Paths = {
 | 
				
			||||||
 | 
					  audioDirectory: string;
 | 
				
			||||||
 | 
					  cacheDirectory: string;
 | 
				
			||||||
  configDirectory: string;
 | 
					  configDirectory: string;
 | 
				
			||||||
 | 
					  dataDirectory: string;
 | 
				
			||||||
 | 
					  desktopDirectory: string;
 | 
				
			||||||
 | 
					  documentDirectory: string;
 | 
				
			||||||
 | 
					  downloadDirectory: string;
 | 
				
			||||||
 | 
					  executableDirectory: string;
 | 
				
			||||||
 | 
					  fontDirectory: string;
 | 
				
			||||||
 | 
					  homeDirectory: string;
 | 
				
			||||||
 | 
					  logDirectory: string;
 | 
				
			||||||
 | 
					  pictureDirectory: string;
 | 
				
			||||||
 | 
					  templateDirectory: string;
 | 
				
			||||||
 | 
					  videoDirectory: string;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const getPaths = async () => {
 | 
					type PathStore = {
 | 
				
			||||||
  const { configDir } = await import("@tauri-apps/api/path");
 | 
					  paths: Paths;
 | 
				
			||||||
  return (await configDir()) + "stort/";
 | 
					  setPaths: () => Promise<void>;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export const usePathStore = create<PathType>((set) => ({
 | 
					const programTrailingPath = "stort/";
 | 
				
			||||||
  configDirectory: getPaths(),
 | 
					
 | 
				
			||||||
 | 
					const initializePaths = async (): Promise<Paths> => {
 | 
				
			||||||
 | 
					  try {
 | 
				
			||||||
 | 
					    const {
 | 
				
			||||||
 | 
					      audioDir,
 | 
				
			||||||
 | 
					      cacheDir,
 | 
				
			||||||
 | 
					      configDir,
 | 
				
			||||||
 | 
					      dataDir,
 | 
				
			||||||
 | 
					      desktopDir,
 | 
				
			||||||
 | 
					      documentDir,
 | 
				
			||||||
 | 
					      downloadDir,
 | 
				
			||||||
 | 
					      executableDir,
 | 
				
			||||||
 | 
					      fontDir,
 | 
				
			||||||
 | 
					      homeDir,
 | 
				
			||||||
 | 
					      logDir,
 | 
				
			||||||
 | 
					      pictureDir,
 | 
				
			||||||
 | 
					      templateDir,
 | 
				
			||||||
 | 
					      videoDir,
 | 
				
			||||||
 | 
					    } = await import("@tauri-apps/api/path");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      audioDirectory: await audioDir(),
 | 
				
			||||||
 | 
					      cacheDirectory: (await cacheDir()) + programTrailingPath,
 | 
				
			||||||
 | 
					      configDirectory: (await configDir()) + programTrailingPath,
 | 
				
			||||||
 | 
					      dataDirectory: (await dataDir()) + programTrailingPath,
 | 
				
			||||||
 | 
					      desktopDirectory: await desktopDir(),
 | 
				
			||||||
 | 
					      documentDirectory: await documentDir(),
 | 
				
			||||||
 | 
					      downloadDirectory: await downloadDir(),
 | 
				
			||||||
 | 
					      executableDirectory: await executableDir(),
 | 
				
			||||||
 | 
					      fontDirectory: await fontDir(),
 | 
				
			||||||
 | 
					      homeDirectory: await homeDir(),
 | 
				
			||||||
 | 
					      logDirectory: await logDir(),
 | 
				
			||||||
 | 
					      pictureDirectory: await pictureDir(),
 | 
				
			||||||
 | 
					      templateDirectory: await templateDir(),
 | 
				
			||||||
 | 
					      videoDirectory: await videoDir(),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  } catch (error) {
 | 
				
			||||||
 | 
					    console.error("Error initializing paths:", error);
 | 
				
			||||||
 | 
					    throw error;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export const usePathStore = create<PathStore>((set) => ({
 | 
				
			||||||
 | 
					  paths: {
 | 
				
			||||||
 | 
					    audioDirectory: "",
 | 
				
			||||||
 | 
					    cacheDirectory: "",
 | 
				
			||||||
 | 
					    configDirectory: "",
 | 
				
			||||||
 | 
					    dataDirectory: "",
 | 
				
			||||||
 | 
					    desktopDirectory: "",
 | 
				
			||||||
 | 
					    documentDirectory: "",
 | 
				
			||||||
 | 
					    downloadDirectory: "",
 | 
				
			||||||
 | 
					    executableDirectory: "",
 | 
				
			||||||
 | 
					    fontDirectory: "",
 | 
				
			||||||
 | 
					    homeDirectory: "",
 | 
				
			||||||
 | 
					    logDirectory: "",
 | 
				
			||||||
 | 
					    pictureDirectory: "",
 | 
				
			||||||
 | 
					    templateDirectory: "",
 | 
				
			||||||
 | 
					    videoDirectory: "",
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  setPaths: async () => {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      const paths = await initializePaths();
 | 
				
			||||||
 | 
					      set({ paths });
 | 
				
			||||||
 | 
					    } catch (error) {
 | 
				
			||||||
 | 
					      console.error("Failed to set paths:", error);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
}));
 | 
					}));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,8 @@
 | 
				
			||||||
import { CacheProvider, EmotionCache } from "@emotion/react";
 | 
					import { CacheProvider, EmotionCache } from "@emotion/react";
 | 
				
			||||||
import CssBaseline from "@mui/material/CssBaseline";
 | 
					import { CssBaseline } from "@mui/material";
 | 
				
			||||||
import { AppProps } from "next/app";
 | 
					import { AppProps } from "next/app";
 | 
				
			||||||
import Head from "next/head";
 | 
					import Head from "next/head";
 | 
				
			||||||
 | 
					import { Initialization } from "../components/Generic/Initialization";
 | 
				
			||||||
import { UserThemeProvider } from "../contexts/ThemeContext";
 | 
					import { UserThemeProvider } from "../contexts/ThemeContext";
 | 
				
			||||||
import createEmotionCache from "../lib/createEmotionCache";
 | 
					import createEmotionCache from "../lib/createEmotionCache";
 | 
				
			||||||
import "../styles/global.css";
 | 
					import "../styles/global.css";
 | 
				
			||||||
| 
						 | 
					@ -23,6 +24,7 @@ export default function MyApp(props: MyAppProps) {
 | 
				
			||||||
      </Head>
 | 
					      </Head>
 | 
				
			||||||
      <UserThemeProvider>
 | 
					      <UserThemeProvider>
 | 
				
			||||||
        {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}
 | 
					        {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}
 | 
				
			||||||
 | 
					        <Initialization />
 | 
				
			||||||
        <CssBaseline />
 | 
					        <CssBaseline />
 | 
				
			||||||
        <Component {...pageProps} />
 | 
					        <Component {...pageProps} />
 | 
				
			||||||
      </UserThemeProvider>
 | 
					      </UserThemeProvider>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -20,15 +20,8 @@ export default function MyDocument({ emotionStyleTags }: MyDocumentProps) {
 | 
				
			||||||
  const theme = useTheme();
 | 
					  const theme = useTheme();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Html lang='en'>
 | 
					    <Html lang="en">
 | 
				
			||||||
      <Head>
 | 
					      <Head>{emotionStyleTags}</Head>
 | 
				
			||||||
        {/* PWA primary color */}
 | 
					 | 
				
			||||||
        <meta name='theme-color' content={theme.palette.primary.main} />
 | 
					 | 
				
			||||||
        <link rel='shortcut icon' href='/favicon.png' />
 | 
					 | 
				
			||||||
        <link rel='manifest' href='/manifest.json' />
 | 
					 | 
				
			||||||
        <meta name='emotion-insertion-point' content='' />
 | 
					 | 
				
			||||||
        {emotionStyleTags}
 | 
					 | 
				
			||||||
      </Head>
 | 
					 | 
				
			||||||
      <body>
 | 
					      <body>
 | 
				
			||||||
        <Main />
 | 
					        <Main />
 | 
				
			||||||
        <NextScript />
 | 
					        <NextScript />
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,6 @@
 | 
				
			||||||
import { Box } from "@mui/material";
 | 
					 | 
				
			||||||
import { useAtom } from "jotai";
 | 
					import { useAtom } from "jotai";
 | 
				
			||||||
 | 
					import { Layout } from "../components/Generic/Layout";
 | 
				
			||||||
import { LoadingScreen } from "../components/Generic/LoadingScreen";
 | 
					import { LoadingScreen } from "../components/Generic/LoadingScreen";
 | 
				
			||||||
import { HeaderBar } from "../components/HeaderBar/HeaderBar";
 | 
					 | 
				
			||||||
import { loadingAtom } from "../lib/store/jotai/loading";
 | 
					import { loadingAtom } from "../lib/store/jotai/loading";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function Home() {
 | 
					export default function Home() {
 | 
				
			||||||
| 
						 | 
					@ -10,10 +9,6 @@ export default function Home() {
 | 
				
			||||||
  if (loading) {
 | 
					  if (loading) {
 | 
				
			||||||
    return <LoadingScreen loadingText="Loading..." />;
 | 
					    return <LoadingScreen loadingText="Loading..." />;
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    return (
 | 
					    return <Layout />;
 | 
				
			||||||
      <Box>
 | 
					 | 
				
			||||||
        <HeaderBar />
 | 
					 | 
				
			||||||
      </Box>
 | 
					 | 
				
			||||||
    );
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,27 +1,18 @@
 | 
				
			||||||
"use client";
 | 
					"use client";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import { BugReport } from "@mui/icons-material";
 | 
					import { BugReport } from "@mui/icons-material";
 | 
				
			||||||
import { Box, Button, IconButton, Typography } from "@mui/material";
 | 
					import { Box, Button, IconButton, TextField, Typography } from "@mui/material";
 | 
				
			||||||
import { useRouter } from "next/router";
 | 
					import { useRouter } from "next/router";
 | 
				
			||||||
import { useEffect, useState } from "react";
 | 
					import { useState } from "react";
 | 
				
			||||||
import { getConfigDirectory } from "../lib/path";
 | 
					 | 
				
			||||||
import { usePathStore } from "../lib/store/zustand/path";
 | 
					import { usePathStore } from "../lib/store/zustand/path";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default function Testing() {
 | 
					export default function Testing() {
 | 
				
			||||||
  const router = useRouter();
 | 
					  const router = useRouter();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const configPath = usePathStore((state) => state.configDirectory);
 | 
					  const paths = usePathStore((state) => state.paths);
 | 
				
			||||||
  const dataPath = usePathStore((state) => state.dataDirectory);
 | 
					 | 
				
			||||||
  const cachePath = usePathStore((state) => state.cacheDirectory);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const [text, setText] = useState("");
 | 
					  const [text, setText] = useState("");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  useEffect(() => {
 | 
					 | 
				
			||||||
    getConfigDirectory().then((configDirectory) => {
 | 
					 | 
				
			||||||
      setText(configDirectory);
 | 
					 | 
				
			||||||
    });
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return (
 | 
					  return (
 | 
				
			||||||
    <Box>
 | 
					    <Box>
 | 
				
			||||||
      <IconButton
 | 
					      <IconButton
 | 
				
			||||||
| 
						 | 
					@ -32,16 +23,14 @@ export default function Testing() {
 | 
				
			||||||
        <BugReport />
 | 
					        <BugReport />
 | 
				
			||||||
      </IconButton>
 | 
					      </IconButton>
 | 
				
			||||||
      <Button
 | 
					      <Button
 | 
				
			||||||
        onClick={() => {
 | 
					        onClick={async () => {
 | 
				
			||||||
          console.log(text);
 | 
					          console.log(paths);
 | 
				
			||||||
          console.log(configPath);
 | 
					 | 
				
			||||||
          console.log(dataPath);
 | 
					 | 
				
			||||||
          console.log(cachePath);
 | 
					 | 
				
			||||||
        }}
 | 
					        }}
 | 
				
			||||||
      >
 | 
					      >
 | 
				
			||||||
        Button
 | 
					        Button
 | 
				
			||||||
      </Button>
 | 
					      </Button>
 | 
				
			||||||
      <Typography>{text}</Typography>
 | 
					      <Typography>{text}</Typography>
 | 
				
			||||||
 | 
					      <TextField rows={10} />
 | 
				
			||||||
    </Box>
 | 
					    </Box>
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue