mirror of https://github.com/usememos/memos
refactor: migrate resource store to v2
parent
46900f9807
commit
dcd68bc5f4
@ -1,3 +1,2 @@
|
|||||||
export * from "./memo";
|
export * from "./memo";
|
||||||
export * from "./resource";
|
|
||||||
export * from "./memoFilter";
|
export * from "./memoFilter";
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
import { create } from "zustand";
|
|
||||||
import { combine } from "zustand/middleware";
|
|
||||||
import { resourceServiceClient } from "@/grpcweb";
|
|
||||||
import { CreateResourceRequest, Resource, UpdateResourceRequest } from "@/types/proto/api/v1/resource_service";
|
|
||||||
|
|
||||||
interface State {
|
|
||||||
resourceMapByName: Record<string, Resource>;
|
|
||||||
}
|
|
||||||
|
|
||||||
const getDefaultState = (): State => ({
|
|
||||||
resourceMapByName: {},
|
|
||||||
});
|
|
||||||
|
|
||||||
export const useResourceStore = create(
|
|
||||||
combine(getDefaultState(), (set, get) => ({
|
|
||||||
setState: (state: State) => set(state),
|
|
||||||
getState: () => get(),
|
|
||||||
fetchResourceByName: async (name: string) => {
|
|
||||||
const resource = await resourceServiceClient.getResource({
|
|
||||||
name,
|
|
||||||
});
|
|
||||||
const resourceMap = get().resourceMapByName;
|
|
||||||
resourceMap[resource.name] = resource;
|
|
||||||
set({ resourceMapByName: resourceMap });
|
|
||||||
return resource;
|
|
||||||
},
|
|
||||||
getResourceByName: (name: string) => {
|
|
||||||
const resourceMap = get().resourceMapByName;
|
|
||||||
return Object.values(resourceMap).find((r) => r.name === name);
|
|
||||||
},
|
|
||||||
async createResource(create: CreateResourceRequest): Promise<Resource> {
|
|
||||||
const resource = await resourceServiceClient.createResource(create);
|
|
||||||
const resourceMap = get().resourceMapByName;
|
|
||||||
resourceMap[resource.name] = resource;
|
|
||||||
return resource;
|
|
||||||
},
|
|
||||||
async updateResource(update: UpdateResourceRequest): Promise<Resource> {
|
|
||||||
const resource = await resourceServiceClient.updateResource(update);
|
|
||||||
const resourceMap = get().resourceMapByName;
|
|
||||||
resourceMap[resource.name] = resource;
|
|
||||||
return resource;
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
);
|
|
@ -1,5 +1,6 @@
|
|||||||
|
import resourceStore from "./resource";
|
||||||
import userStore from "./user";
|
import userStore from "./user";
|
||||||
import viewStore from "./view";
|
import viewStore from "./view";
|
||||||
import workspaceStore from "./workspace";
|
import workspaceStore from "./workspace";
|
||||||
|
|
||||||
export { workspaceStore, userStore, viewStore };
|
export { resourceStore, workspaceStore, userStore, viewStore };
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
import { makeAutoObservable } from "mobx";
|
||||||
|
import { resourceServiceClient } from "@/grpcweb";
|
||||||
|
import { CreateResourceRequest, Resource, UpdateResourceRequest } from "@/types/proto/api/v1/resource_service";
|
||||||
|
|
||||||
|
class LocalState {
|
||||||
|
resourceMapByName: Record<string, Resource> = {};
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
makeAutoObservable(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
setPartial(partial: Partial<LocalState>) {
|
||||||
|
Object.assign(this, partial);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const resourceStore = (() => {
|
||||||
|
const state = new LocalState();
|
||||||
|
|
||||||
|
const fetchResourceByName = async (name: string) => {
|
||||||
|
const resource = await resourceServiceClient.getResource({
|
||||||
|
name,
|
||||||
|
});
|
||||||
|
const resourceMap = { ...state.resourceMapByName };
|
||||||
|
resourceMap[resource.name] = resource;
|
||||||
|
state.setPartial({ resourceMapByName: resourceMap });
|
||||||
|
return resource;
|
||||||
|
};
|
||||||
|
|
||||||
|
const getResourceByName = (name: string) => {
|
||||||
|
return Object.values(state.resourceMapByName).find((r) => r.name === name);
|
||||||
|
};
|
||||||
|
|
||||||
|
const createResource = async (create: CreateResourceRequest): Promise<Resource> => {
|
||||||
|
const resource = await resourceServiceClient.createResource(create);
|
||||||
|
const resourceMap = { ...state.resourceMapByName };
|
||||||
|
resourceMap[resource.name] = resource;
|
||||||
|
state.setPartial({ resourceMapByName: resourceMap });
|
||||||
|
return resource;
|
||||||
|
};
|
||||||
|
|
||||||
|
const updateResource = async (update: UpdateResourceRequest): Promise<Resource> => {
|
||||||
|
const resource = await resourceServiceClient.updateResource(update);
|
||||||
|
const resourceMap = { ...state.resourceMapByName };
|
||||||
|
resourceMap[resource.name] = resource;
|
||||||
|
state.setPartial({ resourceMapByName: resourceMap });
|
||||||
|
return resource;
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
state,
|
||||||
|
fetchResourceByName,
|
||||||
|
getResourceByName,
|
||||||
|
createResource,
|
||||||
|
updateResource,
|
||||||
|
};
|
||||||
|
})();
|
||||||
|
|
||||||
|
export default resourceStore;
|
Loading…
Reference in New Issue