Описание
Нужно отделить взаимодействия с хранилищами данных браузера в отдельный слой storage
. Для начала хватит взаимодействия с localStorage
.
Гипотеза решения
Описание на примере хранилища для announcements
.
Взаимодействие с хранилищем из любого места в коде должно происходить через вызов функции контроллера наподобие storage.announcements.get
для операций получения
, записи
и удаления
, внутри метода которого должен быть вызов общей функции с переданной моделью данных, включая ключ хранилища
, сериализатор
и десериализатор
.
Каждый конкретный контроллер описывает реализацию get
, set
и remove
.
Каждая конкретная модель описывает реализацию id
, serializer
и deserializer
.
Изменения в текущих компонентах
В композабле useAnnouncements
вызовы к хранилищу должны быть вынесены в слой storage
. Так же, композабл не должен принимать ключ, т.к. он будет храниться в соответствующей модели внутри слоя storage
.
Компонент MAnnoncements
соответственно, больше не должен хранить ключ для стора анонсов и передавать его в композабл.
Интерфейсы
interface CommonStorageModel<T> {
id: string; // ключ хранилища.
serializer: (object: T) => string; // сериализатор. вызывается при записи.
deserializer: (dto: string) => T; // десериализатор. вызывается при извлечении.
};
interface CommonStorageController<T> {
get: () => T; // получить данные.
set: (object: T) => void; // сохранить данные.
remove: () => void; // удалить данные.
};