Browse Source

Refactor Storage events

pull/5559/head
Artur Arseniev 3 years ago
parent
commit
b4caa1db41
  1. 70
      src/storage_manager/index.ts
  2. 39
      src/storage_manager/types.ts

70
src/storage_manager/index.ts

@ -19,18 +19,7 @@
* storageManager.add(...);
* ```
*
* ## Available Events
* * `storage:start` - Before the storage request is started
* * `storage:start:store` - Before the store request. The object to store is passed as an argument (which you can edit)
* * `storage:start:load` - Before the load request. Items to load are passed as an argument (which you can edit)
* * `storage:load` - Triggered when something was loaded from the storage, loaded object passed as an argument
* * `storage:store` - Triggered when something is stored to the storage, stored object passed as an argument
* * `storage:end` - After the storage request is ended
* * `storage:end:store` - After the store request
* * `storage:end:load` - After the load request
* * `storage:error` - On any error on storage request, passes the error as an argument
* * `storage:error:store` - Error on store request, passes the error as an argument
* * `storage:error:load` - Error on load request, passes the error as an argument
* {REPLACE_EVENTS}
*
* ## Methods
* * [getConfig](#getconfig)
@ -58,26 +47,13 @@ import LocalStorage from './model/LocalStorage';
import RemoteStorage from './model/RemoteStorage';
import EditorModel from '../editor/model/Editor';
import IStorage, { StorageOptions, ProjectData } from './model/IStorage';
import StorageEvents from './types';
export type * from './model/IStorage';
export type StorageEvent =
| 'storage:start'
| 'storage:start:store'
| 'storage:start:load'
| 'storage:load'
| 'storage:store'
| 'storage:end'
| 'storage:end:store'
| 'storage:end:load'
| 'storage:error'
| 'storage:error:store'
| 'storage:error:load';
const eventStart = 'storage:start';
const eventAfter = 'storage:after';
const eventEnd = 'storage:end';
const eventError = 'storage:error';
export type StorageEvent = `${StorageEvents}`;
type StorageEventType = 'store' | 'load';
const STORAGE_LOCAL = 'local';
const STORAGE_REMOTE = 'remote';
@ -86,6 +62,7 @@ export default class StorageManager extends Module<
StorageManagerConfig & { name?: string; _disable?: boolean; currentStorage?: string }
> {
storages: Record<string, IStorage> = {};
events = StorageEvents;
constructor(em: EditorModel) {
super(em, 'StorageManager', defaults);
@ -315,7 +292,7 @@ export default class StorageManager extends Module<
result = (onLoad && (await onLoad(result, editor))) || result;
}
this.onAfter(ev, result, response);
this.onEnd(ev, result);
this.onEnd(ev, result, response);
} catch (error) {
this.onError(ev, error);
throw error;
@ -347,11 +324,12 @@ export default class StorageManager extends Module<
* On start callback
* @private
*/
onStart(ctx: string, data?: ProjectData) {
onStart(type: StorageEventType, data?: ProjectData) {
const { em } = this;
if (em) {
em.trigger(eventStart);
ctx && em.trigger(`${eventStart}:${ctx}`, data);
const ev = type === 'load' ? StorageEvents.startLoad : StorageEvents.startStore;
em.trigger(StorageEvents.start, type, data);
em.trigger(ev, data);
}
}
@ -359,12 +337,14 @@ export default class StorageManager extends Module<
* On after callback (before passing data to the callback)
* @private
*/
onAfter(ctx: string, data: ProjectData, response: any) {
onAfter(type: StorageEventType, data: ProjectData, response: any) {
const { em } = this;
if (em) {
em.trigger(eventAfter);
em.trigger(`${eventAfter}:${ctx}`, data, response);
em.trigger(`storage:${ctx}`, data, response);
const evAfter = type === 'load' ? StorageEvents.afterLoad : StorageEvents.afterStore;
em.trigger(StorageEvents.after);
em.trigger(evAfter, data, response);
const ev = type === 'load' ? StorageEvents.load : StorageEvents.store;
em.trigger(ev, data, response);
}
}
@ -372,11 +352,12 @@ export default class StorageManager extends Module<
* On end callback
* @private
*/
onEnd(ctx: string, data: ProjectData) {
onEnd(type: StorageEventType, data: ProjectData, response?: any) {
const { em } = this;
if (em) {
em.trigger(eventEnd);
ctx && em.trigger(`${eventEnd}:${ctx}`, data);
const ev = type === 'load' ? StorageEvents.endLoad : StorageEvents.endStore;
em.trigger(StorageEvents.end, type, data, response);
em.trigger(ev, data, response);
}
}
@ -384,12 +365,13 @@ export default class StorageManager extends Module<
* On error callback
* @private
*/
onError(ctx: string, data: any) {
onError(type: StorageEventType, error: any) {
const { em } = this;
if (em) {
em.trigger(eventError, data);
ctx && em.trigger(`${eventError}:${ctx}`, data);
this.onEnd(ctx, data);
const ev = type === 'load' ? StorageEvents.errorLoad : StorageEvents.errorStore;
em.trigger(StorageEvents.error, error, type);
em.trigger(ev, error);
this.onEnd(type, error);
}
}

39
src/storage_manager/types.ts

@ -1,18 +1,9 @@
/**{START_EVENTS}*/
export enum StorageEvents {
/**
* @event `canvas:spot` Spots updated.
* @example
* editor.on('canvas:spot', () => {
* console.log('Spots', editor.Canvas.getSpots());
* });
*/
spot = 'canvas:spot',
/**
* @event `storage:start` Storage request start.
* @example
* editor.on('storage:start', () => {
* editor.on('storage:start', (type) => {
* console.log('Storage start');
* });
*/
@ -22,7 +13,7 @@ export enum StorageEvents {
* @event `storage:start:store` Storage store request start.
* The project JSON object to store is passed as an argument (which you can edit).
* @example
* editor.on('storage:start:store', () => {
* editor.on('storage:start:store', (data) => {
* console.log('Storage start store');
* });
*/
@ -41,7 +32,7 @@ export enum StorageEvents {
* @event `storage:load` Storage loaded the project.
* The loaded project is passed as an argument.
* @example
* editor.on('storage:load', () => {
* editor.on('storage:load', (data, res) => {
* console.log('Storage loaded the project');
* });
*/
@ -51,16 +42,28 @@ export enum StorageEvents {
* @event `storage:store` Storage stored the project.
* The stored project is passed as an argument.
* @example
* editor.on('storage:store', () => {
* editor.on('storage:store', (data, res) => {
* console.log('Storage stored the project');
* });
*/
store = 'storage:store',
/**
* @event `storage:after` Storage request completed.
* @example
* editor.on('storage:after', (type) => {
* console.log('Storage request completed');
* });
*/
after = 'storage:after',
afterStore = 'storage:after:store',
afterLoad = 'storage:after:load',
/**
* @event `storage:end` Storage request ended.
* This event triggers also in case of errors.
* @example
* editor.on('storage:end', () => {
* editor.on('storage:end', (type) => {
* console.log('Storage request ended');
* });
*/
@ -68,6 +71,7 @@ export enum StorageEvents {
/**
* @event `storage:end:store` Storage store request ended.
* This event triggers also in case of errors.
* @example
* editor.on('storage:end:store', () => {
* console.log('Storage store request ended');
@ -77,6 +81,7 @@ export enum StorageEvents {
/**
* @event `storage:end:load` Storage load request ended.
* This event triggers also in case of errors.
* @example
* editor.on('storage:end:load', () => {
* console.log('Storage load request ended');
@ -87,7 +92,7 @@ export enum StorageEvents {
/**
* @event `storage:error` Error on storage request.
* @example
* editor.on('storage:error', () => {
* editor.on('storage:error', (err) => {
* console.log('Storage error');
* });
*/
@ -96,7 +101,7 @@ export enum StorageEvents {
/**
* @event `storage:error:store` Error on store request.
* @example
* editor.on('storage:error:store', () => {
* editor.on('storage:error:store', (err) => {
* console.log('Error on store');
* });
*/
@ -105,7 +110,7 @@ export enum StorageEvents {
/**
* @event `storage:error:load` Error on load request.
* @example
* editor.on('storage:error:load', () => {
* editor.on('storage:error:load', (err) => {
* console.log('Error on load');
* });
*/

Loading…
Cancel
Save