60 lines
2.0 KiB
TypeScript
60 lines
2.0 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";
|
|
|
|
/**
|
|
* Base class for all viewmodels. It provides
|
|
* - dependency injection: To get closes di which serves from di provider
|
|
* - rerender method: to rerender your component manually
|
|
* - produce method: to produce your vm dynamically by passing and attaching dependencies to it
|
|
*/
|
|
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>;
|
|
}
|
|
|
|
/* -------------------------------------------------------------------------- */
|
|
}
|