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