stonex

Форк
0
/
ModifiersWorker.ts 
51 строка · 2.1 Кб
1
import { getAllMethodsFromModule } from './helpers/module'
2
import { StonexModule } from './StonexModule'
3
import { Store } from './StonexStore'
4

5
export declare type StoreModifier<MP, D = ModuleModifier> = (store: Store<MP> | null) => (void | D)
6
export declare type ModuleModifier<D = ActionModifier> = (module: StonexModule) => (void | D)
7
export declare type ActionModifier = (args: any[], moduleName: string, methodName: string) => false | any
8

9
export declare type Modifier<MP> = StoreModifier<MP>
10

11
/**
12
 * Internal class which usings only in StonexStore code
13
 * Allows to convert outer modifiers to Action/Module/Store specific modifiers
14
 *
15
 */
16
export class ModifiersWorker {
17

18
  public static getModuleModifiers<MP> (modifiers: Array<Modifier<MP>>, storeInstance: Store<MP>): ModuleModifier[] {
19
    return modifiers.reduce((moduleModifiers: ModuleModifier[], modifier) => {
20
      const moduleModifier: ModuleModifier | any = modifier(storeInstance)
21
      if (typeof moduleModifier === 'function') {
22
        moduleModifiers.push(moduleModifier)
23
      }
24
      return moduleModifiers
25
    },[])
26
  }
27

28
  public static getActionModifiers (moduleModifiers: ModuleModifier[], moduleInstance: StonexModule): ActionModifier[] {
29
    return moduleModifiers.reduce((actionModifiers: ActionModifier[], moduleModifier: ModuleModifier) => {
30
      const actionModifier: ActionModifier | any = moduleModifier(moduleInstance)
31
      if (typeof actionModifier === 'function') {
32
        actionModifiers.push(actionModifier)
33
      }
34
      return actionModifiers
35
    }, [])
36
  }
37

38
  public static attachActionModifiersToModule (actionModifiers: ActionModifier[], moduleInstance: StonexModule): void {
39
    getAllMethodsFromModule(moduleInstance).forEach(methodName => {
40
      const closuredMethod = moduleInstance[methodName]
41
      moduleInstance[methodName] = (...args: any[]) => {
42
        for (const modifier of actionModifiers) {
43
          if (modifier(args, moduleInstance.moduleName, methodName) === false) {
44
            return null
45
          }
46
        }
47
        return closuredMethod.apply(moduleInstance, args)
48
      }
49
    })
50
  }
51
}
52

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.