mirror of
https://github.com/Vomitblood/stort.git
synced 2024-11-26 13:55:27 +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