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 "./resource";
|
||||
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 viewStore from "./view";
|
||||
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