mirror of
https://github.com/aljazceru/mutiny-web.git
synced 2025-12-18 23:04:25 +01:00
only load nodemanager if user is approved
This commit is contained in:
100
src/state/megaStore.tsx
Normal file
100
src/state/megaStore.tsx
Normal file
@@ -0,0 +1,100 @@
|
||||
// Inspired by https://github.com/solidjs/solid-realworld/blob/main/src/store/index.js
|
||||
|
||||
import { ParentComponent, createContext, createEffect, useContext } from "solid-js";
|
||||
import { createStore } from "solid-js/store";
|
||||
import { setupNodeManager } from "~/logic/nodeManagerSetup";
|
||||
import { NodeManager } from "@mutinywallet/node-manager";
|
||||
|
||||
const MegaStoreContext = createContext<MegaStore>();
|
||||
|
||||
type UserStatus = undefined | "new_here" | "waitlisted" | "approved" | "paid"
|
||||
|
||||
export type MegaStore = [{
|
||||
waitlist_id: string | null;
|
||||
node_manager: NodeManager | undefined;
|
||||
user_status: UserStatus;
|
||||
}, {
|
||||
status(): Promise<UserStatus>;
|
||||
setupNodeManager(): Promise<void>;
|
||||
setWaitlistId(waitlist_id: string): void;
|
||||
}];
|
||||
|
||||
export const Provider: ParentComponent = (props) => {
|
||||
const [state, setState] = createStore({
|
||||
|
||||
waitlist_id: localStorage.getItem("waitlist_id"),
|
||||
node_manager: undefined as NodeManager | undefined,
|
||||
user_status: undefined as UserStatus,
|
||||
});
|
||||
|
||||
const actions = {
|
||||
async status(): Promise<UserStatus> {
|
||||
if (!state.waitlist_id) {
|
||||
return "new_here"
|
||||
}
|
||||
try {
|
||||
const res = await fetch(`https://waitlist.mutiny-waitlist.workers.dev/waitlist/${state.waitlist_id}`)
|
||||
const data = await res.json();
|
||||
|
||||
if (data.approval_date) {
|
||||
return "approved"
|
||||
} else {
|
||||
return "waitlisted"
|
||||
}
|
||||
|
||||
// TODO: handle paid status
|
||||
|
||||
} catch (e) {
|
||||
return "new_here"
|
||||
}
|
||||
|
||||
},
|
||||
async setupNodeManager(): Promise<void> {
|
||||
try {
|
||||
const nodeManager = await setupNodeManager()
|
||||
setState({ node_manager: nodeManager })
|
||||
} catch (e) {
|
||||
console.error(e)
|
||||
}
|
||||
},
|
||||
setWaitlistId(waitlist_id: string) {
|
||||
setState({ waitlist_id })
|
||||
}
|
||||
};
|
||||
|
||||
// Fetch status from remote on load
|
||||
createEffect(async () => {
|
||||
const status = await actions.status()
|
||||
setState({ user_status: status })
|
||||
})
|
||||
|
||||
// Only node manager when status is approved
|
||||
createEffect(async () => {
|
||||
if (state.user_status === "approved" && !state.node_manager) {
|
||||
console.log("running setup node manager...")
|
||||
await actions.setupNodeManager()
|
||||
}
|
||||
})
|
||||
|
||||
// Be reactive to changes in waitlist_id
|
||||
createEffect(() => {
|
||||
state.waitlist_id ? localStorage.setItem("waitlist_id", state.waitlist_id) : localStorage.removeItem("waitlist_id");
|
||||
});
|
||||
|
||||
const store = [state, actions] as MegaStore;
|
||||
|
||||
return (
|
||||
<MegaStoreContext.Provider value={store}>
|
||||
{props.children}
|
||||
</MegaStoreContext.Provider>
|
||||
)
|
||||
}
|
||||
|
||||
export function useMegaStore() {
|
||||
// This is a trick to narrow the typescript types: https://docs.solidjs.com/references/api-reference/component-apis/createContext
|
||||
const context = useContext(MegaStoreContext);
|
||||
if (!context) {
|
||||
throw new Error("useMegaStore: cannot find a MegaStoreContext")
|
||||
}
|
||||
return context;
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
import { NodeManager } from "@mutinywallet/node-manager";
|
||||
import { createContext, JSX, useContext, createResource, Resource } from "solid-js";
|
||||
import { setupNodeManager } from "~/logic/nodeManagerSetup";
|
||||
|
||||
const NodeManagerContext = createContext<{ nodeManager: Resource<NodeManager> }>();
|
||||
|
||||
export function NodeManagerProvider(props: { children: JSX.Element }) {
|
||||
const [nodeManager] = createResource(setupNodeManager);
|
||||
|
||||
const value = {
|
||||
nodeManager,
|
||||
};
|
||||
|
||||
return (
|
||||
<NodeManagerContext.Provider value={value}>
|
||||
{props.children}
|
||||
</NodeManagerContext.Provider>
|
||||
)
|
||||
}
|
||||
|
||||
export function useNodeManager() {
|
||||
// This is a trick to narrow the typescript types: https://docs.solidjs.com/references/api-reference/component-apis/createContext
|
||||
const context = useContext(NodeManagerContext);
|
||||
if (!context) {
|
||||
throw new Error("useNodeManager: cannot find a NodeManagerContext")
|
||||
}
|
||||
return context;
|
||||
}
|
||||
Reference in New Issue
Block a user