Skip to content

Commit

Permalink
refactor: use zustand for global store instead of contexts
Browse files Browse the repository at this point in the history
  • Loading branch information
sehnryr committed Nov 8, 2024
1 parent 78b0fac commit e423e45
Show file tree
Hide file tree
Showing 10 changed files with 60 additions and 149 deletions.
3 changes: 2 additions & 1 deletion deno.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
"react-icons": "npm:[email protected]",
"react-router-dom": "npm:[email protected]",
"tailwindcss": "npm:[email protected]",
"vite": "npm:[email protected]"
"vite": "npm:[email protected]",
"zustand": "npm:[email protected]"
},
"nodeModulesDir": "auto"
}
14 changes: 12 additions & 2 deletions deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

35 changes: 3 additions & 32 deletions src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,6 @@ import ExtensionBrowse from "./pages/Browse/ExtensionBrowse.tsx";
import Extensions from "./pages/Extensions.tsx";
import More from "./pages/More.tsx";
import MangaDetails from "./pages/MangaDetails.tsx";
import { ExtensionsContextProvider } from "./context/extensions.ts";
import { RepositoryUrlContextProvider } from "./context/repositoryUrl.ts";
import { ManifestsContextProvider } from "./context/manifests.ts";

const router = createBrowserRouter([
{
Expand Down Expand Up @@ -82,36 +79,10 @@ function Layout() {
);
}

class ContextBuilder {
private contexts: React.FC<{ children: React.ReactNode }>[] = [];

add(context: React.FC) {
this.contexts.push(context);
return this;
}

build(children: React.ReactNode) {
return this.contexts.reduceRight(
(acc, Context) => <Context>{acc}</Context>,
children,
);
}
}

export default function App() {
const Context = ({ children }: { children: React.ReactNode }) => {
return new ContextBuilder()
.add(ExtensionsContextProvider)
.add(RepositoryUrlContextProvider)
.add(ManifestsContextProvider)
.build(children);
};

return (
<Context>
<div className="flex flex-col h-screen">
<RouterProvider router={router} />
</div>
</Context>
<div className="flex flex-col h-screen">
<RouterProvider router={router} />
</div>
);
}
36 changes: 0 additions & 36 deletions src/context/extensions.ts

This file was deleted.

23 changes: 0 additions & 23 deletions src/context/manifests.ts

This file was deleted.

43 changes: 0 additions & 43 deletions src/context/repositoryUrl.ts

This file was deleted.

4 changes: 2 additions & 2 deletions src/pages/Browse/Browse.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { Link } from "react-router-dom";

import { useExtensions } from "../../context/extensions.ts";
import { useStore } from "../../services/store.service.ts";

export default function Browse() {
const { extensions } = useExtensions();
const extensions = useStore((state) => state.extensions);

const Icon = ({ src, alt }: { src: string; alt: string }) => (
<figure className="w-12 h-12">
Expand Down
4 changes: 2 additions & 2 deletions src/pages/Browse/ExtensionBrowse.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ import { Extension } from "../../types/extension.ts";
import { Manga } from "../../types/manga.ts";
import { getMangaList } from "../../services/extensions.service.ts";
import MangaImage from "../../components/Manga/MangaImage.tsx";
import { useExtensions } from "../../context/extensions.ts";
import { useStore } from "../../services/store.service.ts";

export default function ExtensionBrowse() {
const { extensionId } = useParams();
const { extensions } = useExtensions();
const extensions = useStore((state) => state.extensions);

const extension = extensions.find((extension) =>
extension.id === extensionId
Expand Down
14 changes: 7 additions & 7 deletions src/pages/Extensions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import {
uninstallExtension,
} from "../services/tauri.service.ts";
import { FiDownload, FiTrash2 } from "react-icons/fi";

import { useExtensions } from "../context/extensions.ts";
import { useRepositoryUrl } from "../context/repositoryUrl.ts";
import { useManifests } from "../context/manifests.ts";
import { useStore } from "../services/store.service.ts";

export default function Extensions() {
const { extensions, setExtensions } = useExtensions();
const { repositoryUrl, setRepositoryUrl } = useRepositoryUrl();
const { manifests, setManifests } = useManifests();
const extensions = useStore((state) => state.extensions);
const setExtensions = useStore((state) => state.setExtensions);
const repositoryUrl = useStore((state) => state.repositoryUrl);
const setRepositoryUrl = useStore((state) => state.setRepositoryUrl);
const manifests = useStore((state) => state.manifests);
const setManifests = useStore((state) => state.setManifests);

// Fetch repository extensions when repositoryUrl changes
useEffect(() => {
Expand Down
33 changes: 32 additions & 1 deletion src/services/store.service.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,34 @@
import { Store } from "@tauri-apps/plugin-store";
import { create } from "zustand";
import { Extension } from "../types/extension.ts";
import { Manifest } from "../types/manifest.ts";

export const storeService = await Store.load("app_data.json");
const appData = await Store.load("app_data.json");

// Load the repository URL from the app data store
const repositoryUrl = await appData.get<string>("extensionRepositoryUrl") ?? "";

interface StoreState {
extensions: Extension[];
setExtensions: (extensions: Extension[]) => void;

repositoryUrl: string;
setRepositoryUrl: (repositoryUrl: string) => void;

manifests: Manifest[];
setManifests: (manifests: Manifest[]) => void;
}

export const useStore = create<StoreState>()((set) => ({
extensions: new Array<Extension>(),
setExtensions: (extensions: Extension[]) => set({ extensions }),

repositoryUrl: repositoryUrl,
setRepositoryUrl: (repositoryUrl: string) => {
set({ repositoryUrl });
appData.set("extensionRepositoryUrl", repositoryUrl);
},

manifests: new Array<Manifest>(),
setManifests: (manifests: Manifest[]) => set({ manifests }),
}));

0 comments on commit e423e45

Please sign in to comment.