2022-04-17 04:08:40 +03:00
|
|
|
import gateway, { GatewayEventType } from "./gateway";
|
|
|
|
|
|
|
|
export const channels = {
|
|
|
|
_handlers: [],
|
|
|
|
_value: [],
|
|
|
|
_didInit: false,
|
|
|
|
subscribe(handler) {
|
|
|
|
this._init();
|
|
|
|
|
|
|
|
const newLength = this._handlers.push(handler);
|
|
|
|
const handlerIndex = newLength - 1;
|
|
|
|
handler(this._value);
|
|
|
|
return () => {
|
|
|
|
this._handlers.splice(handlerIndex, 1);
|
|
|
|
};
|
|
|
|
},
|
|
|
|
_dispatchUpdate() {
|
|
|
|
this._handlers.forEach(e => {
|
|
|
|
e(this._value);
|
|
|
|
});
|
|
|
|
},
|
|
|
|
_init() {
|
|
|
|
window.__WAFFLE_CHANNELS_STORE = this;
|
|
|
|
|
|
|
|
if (this._didInit)
|
|
|
|
return;
|
|
|
|
|
|
|
|
this._didInit = true;
|
|
|
|
|
|
|
|
const channels = gateway.channels;
|
|
|
|
if (channels) {
|
|
|
|
this._value = channels;
|
|
|
|
}
|
|
|
|
|
|
|
|
gateway.subscribe(GatewayEventType.Ready, ({ channels }) => {
|
|
|
|
if (channels) {
|
|
|
|
this._value = channels;
|
|
|
|
}
|
|
|
|
|
|
|
|
this._dispatchUpdate();
|
|
|
|
});
|
|
|
|
gateway.subscribe(GatewayEventType.ChannelCreate, (channel) => {
|
|
|
|
this._value.push(channel);
|
|
|
|
|
|
|
|
this._dispatchUpdate();
|
|
|
|
});
|
|
|
|
gateway.subscribe(GatewayEventType.ChannelDelete, ({ id }) => {
|
|
|
|
const index = this._value.findIndex(e => e.id === id);
|
|
|
|
if (!index)
|
|
|
|
return;
|
|
|
|
|
2022-04-17 17:56:03 +03:00
|
|
|
this._value.splice(index, 1);
|
2022-04-17 04:08:40 +03:00
|
|
|
|
|
|
|
this._dispatchUpdate();
|
|
|
|
});
|
|
|
|
gateway.subscribe(GatewayEventType.ChannelUpdate, (data) => {
|
|
|
|
const index = this._value.findIndex(e => e.id === data.id);
|
|
|
|
if (!index)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (!this._value[index])
|
|
|
|
return;
|
|
|
|
|
|
|
|
this._value[index] = data;
|
|
|
|
|
|
|
|
this._dispatchUpdate();
|
|
|
|
});
|
|
|
|
}
|
|
|
|
};
|