parent
98ec5ef5c5
commit
8cb7af0c01
@ -1,21 +0,0 @@ |
|||||||
// const remixLib = require('remix-lib')
|
|
||||||
|
|
||||||
class PluginManagerApi { |
|
||||||
constructor (pluginManagerComponent) { |
|
||||||
this.component = pluginManagerComponent |
|
||||||
pluginManagerComponent.event.on('activation', (item) => this.event.emit('activation', item)) // listen by appManager
|
|
||||||
pluginManagerComponent.event.on('deactivation', (item) => this.event.emit('deactivation', item)) // listen by appManager
|
|
||||||
} |
|
||||||
|
|
||||||
init (data) { |
|
||||||
for (var m in data.modules) { |
|
||||||
this.renderItem(m) |
|
||||||
} |
|
||||||
|
|
||||||
for (var n in data.plugins) { |
|
||||||
this.renderItem(n) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
module.exports = PluginManagerApi |
|
@ -1,10 +1,10 @@ |
|||||||
// API
|
// API
|
||||||
class VerticalIconsApi { |
class VerticalIconsApi { |
||||||
|
|
||||||
constructor (verticalIconsComponent, pluginManagerComponent) { |
constructor (verticalIconsComponent, appManager) { |
||||||
this.component = verticalIconsComponent |
this.component = verticalIconsComponent |
||||||
pluginManagerComponent.event.on('requestContainer', (mod, content) => verticalIconsComponent.addIcon(mod)) |
appManager.event.on('requestContainer', (mod, content) => verticalIconsComponent.addIcon(mod)) |
||||||
pluginManagerComponent.event.on('removingItem', (mod) => verticalIconsComponent.removeIcon(mod)) |
appManager.event.on('removingItem', (mod) => verticalIconsComponent.removeIcon(mod)) |
||||||
} |
} |
||||||
} |
} |
||||||
module.exports = VerticalIconsApi |
module.exports = VerticalIconsApi |
||||||
|
@ -0,0 +1,250 @@ |
|||||||
|
import { EventEmitter } from 'events' |
||||||
|
|
||||||
|
export class Store { |
||||||
|
|
||||||
|
/** |
||||||
|
* Instanciate the store from `localStorage` first |
||||||
|
* @template T |
||||||
|
* @param {string} name The name of the store |
||||||
|
* @param {T} initialState The initial state used if state is not available in `localStorage` |
||||||
|
*/ |
||||||
|
static fromLocal(name, initialState) { |
||||||
|
const fromLocal = localStorage.getItem(name) |
||||||
|
const intial = fromLocal ? JSON.parse(fromLocal) : initialState |
||||||
|
return new Store(name, intial) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a Store that hold the state of the component |
||||||
|
* @template T |
||||||
|
* @param {string} name The name of the store |
||||||
|
* @param {T} initialState The initial state of the store |
||||||
|
*/ |
||||||
|
constructor(name, initialState) { |
||||||
|
this.event = new EventEmitter() |
||||||
|
this.name = name |
||||||
|
this.state = initialState |
||||||
|
} |
||||||
|
|
||||||
|
/** Listen on event from the store */ |
||||||
|
get on() { |
||||||
|
return this.event.on; |
||||||
|
} |
||||||
|
|
||||||
|
/** Liste once on event from the store */ |
||||||
|
get once() { |
||||||
|
return this.event.once; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Update one field of the state |
||||||
|
* @param {Partial<T>} state The part of the state updated |
||||||
|
*/ |
||||||
|
/* |
||||||
|
update(state) { |
||||||
|
this.state = { ...this.state, ...state } |
||||||
|
} |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Get one field of the state |
||||||
|
* @template Key key of `this.state` |
||||||
|
* @param {Key} key A key of the state |
||||||
|
*/ |
||||||
|
get(key) { |
||||||
|
return this.state.entities[key] |
||||||
|
} |
||||||
|
|
||||||
|
/** Reset the state its initial value */ |
||||||
|
reset() { |
||||||
|
this.state = this.initialState |
||||||
|
} |
||||||
|
|
||||||
|
/** Dispatch an event with the new state */ |
||||||
|
dispatch() { |
||||||
|
this.event.emit('newState', this.state) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* An entity inside a collection |
||||||
|
* @typedef {Object} EntityState |
||||||
|
* @property {string[]} ids The list of IDs of the entity in the state |
||||||
|
* @property {string[]} actives The list of IDs of the activated entities |
||||||
|
* @property {Object} entities A map of ids and entities |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export class EntityStore extends Store { |
||||||
|
|
||||||
|
/** |
||||||
|
* Instanciate the store from `localStorage` first |
||||||
|
* @param {string} name The name of the store |
||||||
|
* @param {EntityState} initialState The initial state used if state is not available in `localStorage` |
||||||
|
*/ |
||||||
|
static fromLocal(name, initialState) { |
||||||
|
const fromLocal = localStorage.getItem(name) |
||||||
|
const intial = fromLocal ? JSON.parse(fromLocal) : initialState |
||||||
|
return new EntityStore(name, intial) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Create a entity Store that hold a map entity of the same model |
||||||
|
* @param {string} name The name of the store |
||||||
|
* @param {EntityState} initialState The initial state used if state is not available in `localStorage` |
||||||
|
*/ |
||||||
|
constructor(name, initialState) { |
||||||
|
super(name, initialState) |
||||||
|
} |
||||||
|
|
||||||
|
////////////
|
||||||
|
// GETTER //
|
||||||
|
////////////
|
||||||
|
|
||||||
|
/** Tne entities as a Map */ |
||||||
|
get entities() { |
||||||
|
return this.state.entities |
||||||
|
} |
||||||
|
|
||||||
|
/** List of all the ids */ |
||||||
|
get ids() { |
||||||
|
return this.state.ids |
||||||
|
} |
||||||
|
|
||||||
|
/** List of all active ID */ |
||||||
|
get actives() { |
||||||
|
return this.state.actives |
||||||
|
} |
||||||
|
|
||||||
|
/** Return the length of the entity collection */ |
||||||
|
get length() { |
||||||
|
return this.state.ids.length |
||||||
|
} |
||||||
|
|
||||||
|
/////////////
|
||||||
|
// SETTERS //
|
||||||
|
/////////////
|
||||||
|
|
||||||
|
/** |
||||||
|
* Add a new entity to the state |
||||||
|
* @param {Object} entity |
||||||
|
*/ |
||||||
|
add(id, entity) { |
||||||
|
this.state.entities[id] = entity |
||||||
|
this.state.ids.push(id) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Remove an entity from the state |
||||||
|
* @param {(string|number)} id The id of the entity to remove |
||||||
|
*/ |
||||||
|
remove(id) { |
||||||
|
delete this.state.entities[id] |
||||||
|
this.state.ids.splice(this.state.ids.indexOf(id), 1) |
||||||
|
this.state.actives.splice(this.state.ids.indexOf(id), 1) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Update one entity of the state |
||||||
|
* @param {(string|number)} id The id of the entity to update |
||||||
|
* @param {Object} update The fields to update in the entity |
||||||
|
*/ |
||||||
|
/* |
||||||
|
updateOne(id, update) { |
||||||
|
this.state.entities[id] = { |
||||||
|
...this.state.entities[id], |
||||||
|
...update |
||||||
|
} |
||||||
|
} |
||||||
|
*/ |
||||||
|
|
||||||
|
/** |
||||||
|
* Activate one or several entity from the state |
||||||
|
* @param {((string|number))} ids An id or a list of id to activate |
||||||
|
*/ |
||||||
|
activate(id) { |
||||||
|
this.state.actives.push(id) |
||||||
|
this.event.emit('activate', id) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Deactivate one or several entity from the state |
||||||
|
* @param {(string|number))} ids An id or a list of id to deactivate |
||||||
|
*/ |
||||||
|
deactivate(id) { |
||||||
|
this.state.actives.splice(this.state.actives.indexOf(id), 1) |
||||||
|
this.event.emit('deactivate', id) |
||||||
|
} |
||||||
|
|
||||||
|
///////////
|
||||||
|
// QUERY //
|
||||||
|
///////////
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get one entity |
||||||
|
* @param {(string|number)} id The id of the entity to get |
||||||
|
*/ |
||||||
|
getOne(id) { |
||||||
|
return this.state.entities[id] |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Get many entities as an array |
||||||
|
* @param {(string|number)[]} ids An array of id of entity to get |
||||||
|
*/ |
||||||
|
getMany(ids) { |
||||||
|
return ids.map(id => this.state.entities[id]) |
||||||
|
} |
||||||
|
|
||||||
|
/** Get all the entities as an array */ |
||||||
|
getAll() { |
||||||
|
return this.state.ids.map(id => this.state.entities[id]) |
||||||
|
} |
||||||
|
|
||||||
|
/** Get all active entities */ |
||||||
|
getActives() { |
||||||
|
return this.state.actives.map(id => this.state.entities[id]) |
||||||
|
} |
||||||
|
|
||||||
|
////////////////
|
||||||
|
// CONDITIONS //
|
||||||
|
////////////////
|
||||||
|
|
||||||
|
/** |
||||||
|
* Is the entity active |
||||||
|
* @param {(string|number)} id The id of the entity to check |
||||||
|
*/ |
||||||
|
isActive(id) { |
||||||
|
return this.state.actives.includes(id) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Is this id inside the store |
||||||
|
* @param {(string|number)} id The id of the entity to check |
||||||
|
*/ |
||||||
|
hasEntity(id) { |
||||||
|
return this.state.ids.includes(id) |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Is the state empty |
||||||
|
* @param {(string|number)} id The id of the entity to check |
||||||
|
*/ |
||||||
|
isEmpty() { |
||||||
|
return this.state.ids.length === 0 |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Store the state of the stores into LocalStorage |
||||||
|
* @param {Store[]} stores The list of stores to store into `localStorage` |
||||||
|
*/ |
||||||
|
function localState(stores) { |
||||||
|
stores.forEach(store => { |
||||||
|
const name = store.name |
||||||
|
store.on('newState', (state) => { |
||||||
|
localStorage.setItem(name, JSON.stringify(state)) |
||||||
|
}) |
||||||
|
}) |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
import { AppManagerApi } from 'remix-plugin' |
||||||
|
import { EventEmitter } from 'events' |
||||||
|
|
||||||
|
export class RemixAppManager extends AppManagerApi { |
||||||
|
|
||||||
|
constructor (store) { |
||||||
|
super(null) |
||||||
|
this.store = store |
||||||
|
this.event = new EventEmitter() |
||||||
|
} |
||||||
|
|
||||||
|
doActivate (name) { |
||||||
|
this.activateOne(name) |
||||||
|
// temp
|
||||||
|
this.store.activate(name) |
||||||
|
// promise ?
|
||||||
|
const entity = this.getEntity(name) |
||||||
|
if (entity.profile.icon && entity.api.render && typeof entity.api.render === 'function') { |
||||||
|
this.event.emit('requestContainer', entity.profile, entity.api.render())
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
doDeactivate (name) { |
||||||
|
this.deactivateOne(name) |
||||||
|
// temp
|
||||||
|
this.store.deactivate(name) |
||||||
|
// promise ?
|
||||||
|
const entity = this.getEntity(name) |
||||||
|
if (entity.profile.icon && entity.api.render && typeof entity.api.render === 'function') { |
||||||
|
this.event.emit('removingItem', entity.profile) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
setActive (name, isActive) { |
||||||
|
isActive ? this.store.activate(name) : this.store.deactivate(name) |
||||||
|
} |
||||||
|
|
||||||
|
getEntity (entityName) { |
||||||
|
return this.store.get(entityName) |
||||||
|
} |
||||||
|
|
||||||
|
addEntity (entity) { |
||||||
|
this.store.add(entity.profile.name, entity) |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue