gitscope
← marzneshin / v0.6.1 / dashboard/src/modules/users/components/dialogs/mutation/sections/expiration-method/expiration-method.strategy.ts
https://dev.kronoz.win/r/marzneshin.git
dashboard/src/modules/users/components/dialogs/mutation/sections/expiration-method/expiration-method.strategy.ts · TypeScript
Blame Raw
 1import { useFormContext } from "react-hook-form";
 2import { ExpireStrategy } from "@marzneshin/modules/users";
 3
 4abstract class ExpirationMethodStrategy {
 5    protected abstract strategy: string;
 6    protected abstract applyFieldValues(form: ReturnType<typeof useFormContext>): void;
 7
 8    protected clearErrors(form: ReturnType<typeof useFormContext>) {
 9        form.clearErrors("expire_date");
10        form.clearErrors("usage_duration");
11        form.clearErrors("activation_deadline");
12    }
13
14    /**
15     * Applied the rules on the form's fields, called by component
16     *
17     * @param form - form object from the context
18     */
19    public apply(form: ReturnType<typeof useFormContext>) {
20        form.setValue("expire_strategy", this.strategy);
21        this.applyFieldValues(form)
22        this.clearErrors(form)
23    }
24}
25
26export class FirstUseStrategy extends ExpirationMethodStrategy {
27    strategy = "start_on_first_use";
28
29    protected applyFieldValues(form: ReturnType<typeof useFormContext>) {
30        form.setValue("expire", undefined);
31    }
32}
33
34export class NeverStrategy extends ExpirationMethodStrategy {
35    strategy = "never";
36
37    protected applyFieldValues(form: ReturnType<typeof useFormContext>) {
38        form.setValue("expire_date", undefined);
39        form.setValue("activation_deadline", undefined);
40        form.setValue("usage_duration", undefined);
41    }
42}
43
44export class FixedStrategy extends ExpirationMethodStrategy {
45    strategy = "fixed_date";
46
47    protected applyFieldValues(form: ReturnType<typeof useFormContext>) {
48        form.setValue("usage_duration", undefined);
49        form.setValue("activation_deadline", undefined);
50    }
51}
52
53export const strategies: { [key in ExpireStrategy]: ExpirationMethodStrategy } = {
54    start_on_first_use: new FirstUseStrategy(),
55    never: new NeverStrategy(),
56    fixed_date: new FixedStrategy(),
57};