Перейти до основного вмісту

Сховище

інформація

Сховище призначене для зберігання та опису функцій реактивних змін даних предметної області. Кожне сховище відіграє роль state management власної предметної області. Якщо картограф здійснює зберігання та обробку даних довготривалого чи середньотривалого використання, то сховище фокусується на даних короткочасного зберігання.

Архітектура

Першочергово документ "Сховище" повинен бути зареєстрований в точці входу предметної області, яка повинна бути зареєстрована в відповідному сервісі. Виклик функцій сховища або отримання стану самого сховища можуть бути описані в представленнях, а самі представлення використані в відповідних сторінках графічного інтерфейсу.

При запуску програми веб-клієнта відбудеться завантаження бізнес-схеми в ядро відображень формуючи знімок бізнес-схеми. Після чого відбувається візуалізація сторінки запиту. Якщо на сторінці запиту наявні представлення з використанням сховища - отримання стану сховища, виконання функцій сховища тощо, то ці дані будуть надані, а функції виконані.

примітка

Сховище дозволяє описувати як початковий стан, так і перелік методів по зміні цього стану, використовуйте ці методи лише для зміни даних стану, не створюючи складну логіку з похідною обробкою цих даних. Обробку цих даних здійсніть в допоміжних загальних функціях, або в контролерах чи продюсерах.

Склад

Склад опису сховища складається з деталей роботи сховища та опису структури сховища, яке складається з переліку методів по зміні стану сховища та опису початкового стану сховища.

Деталі роботи сховища

import type {Zustand} from '~types'

type StorageKind = 'localStorage' | 'sessionStorage';
type PersistenceKind = 'persist' | 'vanish';

type Store<S = any, T = any> = {
actions: Zustand.Actions<S, T>;
storage?: StorageKind; // default 'localStorage'
persistence?: PersistenceKind; // default 'persist'
partiality?: (state: S) => S; // default undefined
version?: number; // default 1
skipHydration?: boolean; // default true
};

де:

  • StorageKind - тип постійного місця зберігання даних сховища. Використовується, якщо persistence = persist. Використовується, якщо стан сховища необхідно зберігати між сеансами взаємодії користувача з графічним інтерфейсом.
  • PersistenceKind - ознака постійного зберігання стану сховища - persist - потребує постійного зберігання, vanish - не потребує.
  • Store - тип структури опису сховища предметної області.
    • actions - перелік методів та опис початкового стану сховища.
    • storage - тип сховища, який дорівнює StorageKind
    • persistence - тип зберігання стану сховища, який дорівнює PersistenceKind.
    • partiality - дозволяє робити часткові partial оновлення стану. Вона перетворює setState так, що вона приймає частковий об'єкт стану, який потім злито з поточним станом, замінюючи будь-які властивості, які вказані в об'єкті.
    • version - версія сховища.
    • skipHydration - пропустити гідратацію, повинно бути true, якщо використовується ssr чи ssg.

Опис методів та початкового стану

В ядрі відображення за створення сховища відповідає бібліотека zustand, оскільки вона є досить популярною, та може бути використана при побудові графічних інтерфейсів в нативних мобільних та декстопних застосунках. Деталі по опису методів та створення початкового стану сховища описується в бібліотеці zustand.

Реалізація

import {setStore} from "@x-fiber/display";

type Store = {
userId: string;
setUserId: (userId: string) => void;
};

export const BusUsersAggStore = setStore<Store>({
storage: "localStorage",
persistence: "persist",
version: 1,
actions: (setState) => {
return {
userId: "",
setUserId: (userId) => {
return setState(() => {
return {userId};
});
},
};
},
});

де:

  • Store - тип структури сховища.
  • BusUsersAggStore - реалізація опису сховища предметної області.
    • storage - тип постійного зберігання - localStorage.
    • persistence - опція зберігання стану в місці постійного зберігання.
    • version - версія сховища.
    • actions - перелік методів по роботі зі станом сховища.

Реєстрація

Для використання методів сховища або стан сховища необхідно зареєструвати документ "Сховище" в точці входу в предметну область pointer. Наприклад, для модуля BusUsersAgg, необхідно використовувати функцію setPointer для створення опису точки входу, та зареєструвати в цій структурі документ "Сховище".

import {setPointer} from "@x-fiber/display";
import {BusUsersAggStore} from "./BusUsers.store";

type BusDomains = 'BusUsersAgg' | 'BusUsersAuthSpec'

export const BusUsersAggPointer = setPointer<BusDomains>("BusUsersAgg", {
store: BusUsersAggStore,
// ... other documents
});

Використання

import {setView} from "@x-fiber/display";
import styles from "./signup-form.module.scss";

type Views = 'SignupForm' | 'LoginForm' | 'ResetPasswordForm';
type AppServices = 'BusinessAdmin' | 'SystemAdmin';
type BusDomains = 'BusUsersAgg' | 'BusUsersAuthSpec' | 'BusUsersLog';
type SignupFormProps = {
className?: string
}

export const BusUsersAggSignupFormView = setView<Views, SignupFormProps>(
'SignupForm',
(agents: Agents, context: Context, props: SignupFormProps) => {
const {getStore} = agents.schemaAgent;

const store = getStore<AppServices, BusDomains>(
"BusinessAdmin",
"BusUsersAgg"
)();

return (
<section className={styles.wrapper}>
// signup form ...
</section>
);
}
);

де:

  • Типи:
    • Views - перелік представлень конкретної предметної області.
    • AppServices - перелік сервісів.
    • BusDomains - перелік предметних областей сервісу.
    • SignupFormProps - перелік властивостей, які може приймати представлення.
  • Структури:
    • BusUsersAggSignupFormView - структура представлення.
      • SignupForm - назва представлення.
      • getStore - виклик сховища предметної області.
      • store - обʼєкт з доступом до стану та переліку методів по зміні стану сховища.
      • <section className={styles.wrapper}>... - html структура графічного компонента.