import Failure from "core/failure"; import {debounce} from "lodash"; import { UpdateUserArtifacts } from "user/domain/userModel"; import { User } from "../domain/userEntity"; import { UserStore } from "../domain/userStore"; type UpdateUserStore = Pick< UserStore, "user" | "updateUser" | "setUser" >; const deboucedTask = debounce((task) => Promise.resolve(task()), 500); type K = keyof User | undefined; type Payload = T extends undefined ? undefined : User[NonNullable]; const updateUserUseCase = ( store: UpdateUserStore, updateBy: (user: User, ...payload: T extends undefined ? [] : [Payload]) => UpdateUserArtifacts, ...payload: T extends undefined ? []: [Payload] ) => { const updateArtifacts = store.user ? updateBy(store.user, ...payload) : store.user; if (updateArtifacts) { store.setUser(updateArtifacts.user); return deboucedTask(() => store.updateUser(updateArtifacts.diff)); } return Promise.reject(new Failure({message: 'mutation unknown or user object is not exists', key: "failures.user.empty"})); }; export { updateUserUseCase }; export type { UpdateUserStore };