"use client"; import { useDI } from "@/bootstrap/di/di-context"; import { NoOverride } from "@/bootstrap/helpers/type-helper"; import IBaseVM from "@/bootstrap/helpers/vm/i-base-vm"; import { useState } from "react"; export default abstract class BaseVM< IVM, DEP extends object | undefined = undefined, > implements IBaseVM<IVM> { /* ------------------------------ Dependencies ------------------------------ */ protected deps!: DEP; /* -------------------------------- Abstracts ------------------------------- */ abstract useVM(): IVM; /* -------------------------------------------------------------------------- */ produce(dep?: DEP) { if (dep) this.deps = dep; return this; } /* --------------------------------- Getters -------------------------------- */ /** * You can pass your rerender method after calling useRerender on your vm * so you can access to it in any method */ protected rerender?: () => void; /* -------------------------------------------------------------------------- */ protected get di() { return useDI(); } /* -------------------------------------------------------------------------- */ /** * You can use this hook in your useVm method to get rerender method * @returns Rerender Method that when ever you call it you can rerender your component * for showing new values */ protected useRerender(): NoOverride<() => void> { // eslint-disable-next-line @typescript-eslint/no-unused-vars const [_, reState] = useState(false); const rerender = () => reState((prev) => !prev); return rerender as NoOverride<() => void>; } /* -------------------------------------------------------------------------- */ }