// import react import ApiSignal from './Api'; import UserSignal from './User'; import Signal, { effect } from '../signal'; import { current as TeamSignal } from './Teams'; // create signal const ChannelsSignal = new Signal.State([]); export const loading = new Signal.State(true); export const current = new Signal.State(null); /** * on channel * * @param channel */ export const onRemove = (channel) => { // remove channel ChannelsSignal.set([ ...(ChannelsSignal.get().filter((c) => c.id !== channel.id)), ]); }; /** * on channel * * @param channel */ export const onUpdate = (channel) => { // team const team = TeamSignal.get(); // check channel team matches if (channel.team !== team?.id) return; // found const found = ChannelsSignal.get().find((c) => c.id === channel.id); // if found if (found) { // update found Object.keys(channel).forEach((key) => { // set to found found[key] = channel[key]; }); // set/get ChannelsSignal.set([...ChannelsSignal.get()]); } else { ChannelsSignal.set([ ...ChannelsSignal.get(), channel, ]) } }; /** * delete channel * * @param channel */ export const onDelete = (channel) => { // team const team = TeamSignal.get(); // check channel team matches if (channel.team !== team?.id) return; // found ChannelsSignal.set([ ...(ChannelsSignal.get().filter((c) => c.id !== channel.id)), ]); }; // effect effect(async () => { // api const api = ApiSignal.get(); const user = UserSignal.get(); const team = TeamSignal.get(); // check current if (current.get() === team?.id) return; // set current current.set(team?.id); // check current if (!team?.id) return; // check user if (!user) { // unset channels ChannelsSignal.set([]); } else { // load channels const data = await api.Channel.list({ team : team?.id, limit : 1000, }); // sort data.channels by new Date(createdAt) asc data.channels.sort((a, b) => new Date(a.createdAt) - new Date(b.createdAt)); // set channels ChannelsSignal.set(data.channels); } // on update api.socket.on('channel.update', onUpdate); api.socket.on('channel.delete', onDelete); // return return () => { // on update api.socket.removeListener('channel.update', onUpdate); api.socket.removeListener('channel.delete', onDelete); }; }); /** * export api signal */ export default ChannelsSignal;