2024-11-15 19:44:26 +03:00

54 lines
1.7 KiB
TypeScript

"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>;
}
/* -------------------------------------------------------------------------- */
}