export default class ChannelController{ /* (1) Construct default attributes * ---------------------------------------------------------*/ constructor(){ /* (1) Set default active channel */ this.current = null; /* (2) Initialize channel list */ this.list = []; /* (3) Current channel buffer */ this._buffer = {}; } /* (2) Channel navigation * * @channel_id Channel id (NULL uses get()) * * @return status Whether the navigation has been successful * ---------------------------------------------------------*/ nav(channel_id=null){ // console.log(`channel.nav(${channel_id})`); /* (1) Get channel data */ var channel = this.get(channel_id); /* (2) Navigate vue-router */ gs.get.router.push(`/channel/${channel.link}`); /* (3) Update current id */ this.current = channel.id; /* (4) Update buffer */ this._buffer = {}; for( let c of this.list ) if( c.id === this.current ) this._buffer = c; /* (5) Load rooms */ gs.get.room.fetch(); /* (6) Open channel websocket */ gs.get.content.ws_connect(); /* (6) Log channel */ // console.log(`[channel.current] ${channel.link} (${channel.label})`); return true; } /* (3) Dump/Update channel data * * @channels Channels data * @append Whether to keep old data and only push new * * @return udpated Whether channels have been updated * ---------------------------------------------------------*/ dump(channels, append=false){ // console.log(`channel.dump([${channels instanceof Array?channels.length:0}])`); /* (1) Check @channels type */ if( !(channels instanceof Array) ) return false; /* (2) Clear list () */ if( append !== true ) this.list.splice(0); /* (3) Apply new channels */ for(let c of channels){ // add 'users' field (will be filled by GET channel/cid) !( c.users instanceof Array ) && ( c.users = [] ); this.list.push(c); } return true; } /* (4) Get channel data * * @channel_id Channel ID * NULL: current channel || from URL (and set current) * * @return channel Channel data * ---------------------------------------------------------*/ get(channel_id=null){ // console.log(`channel.get(${channel_id})`); if( channel_id === null ){ /* (1) Get @current channel ---------------------------------------------------------*/ /* (1) If @current is set */ if( !isNaN(this.current) ){ /* (2) Return matching id in list */ for( let c of this.list ){ if( c.id === this.current ) return c; // exit point } } /* (2) Get from URL ---------------------------------------------------------*/ /* (1) If vue-router has @link param */ if( gs.get.router.history.current.params.link ){ /* (2) Extract @link */ let link = gs.get.router.history.current.params.link; /* (3) Return matching link in list */ for( let c of this.list ){ if( c.link === link ){ this.current = c.id; // set @current return c; // exit point } } } } /* (3) Get channel data ---------------------------------------------------------*/ /* (1) Return channel matching id */ for( let c of this.list ) if( c.id === channel_id ) return c; // exit point /* (2) Return default: if ID not found */ this.current = this.list[0].id; return this.list[0]; } /* (6) Fetch channel data * ---------------------------------------------------------*/ fetch(){ api.call('GET /channel', {}, function(rs){ /* (1) Check errors */ if( rs.error !== 0 || rs.channels == null ) return; /* (2) Dump data */ this.dump(rs.channels); /* (3) Find if @link matches */ var redirect_id = null; for( let c of this.list ){ if( c.link === window.initial_link ){ redirect_id = c.id; break; } } /* (4) Emulate navigatation from URL */ // console.log(`[restore.channel] ${redirect_id}`); this.nav(redirect_id); }.bind(this), auth.token); } /* (7) Create a new channel * * @name channel name * @link channel URI link * * @return created Whether the channel has been created * ---------------------------------------------------------*/ create(name=null, link=null){ /* (1) Manage invalid @link */ if( typeof link !== 'string' ) return false; /* (2) Manage invalid @name */ if( typeof name !== 'string' ) return false; /* (3) Try to create room in API */ api.call('POST /channel', { link: link, name: name }, function(rs){ /* (1) Hide popup */ gs.get.popup.hide(); /* (2) Manage error */ if( rs.error !== 0 ) return false; }.bind(this), auth.token); return true; } /* (8) Removes the current channel * * @return removed Whether the channel has been removed * ---------------------------------------------------------*/ remove(){ /* (2) Try to remove channel in API */ api.call(`DELETE /channel/${gs.get.content.cid}`, {}, function(rs){ /* (1) Hide popup */ gs.get.popup.hide(); }.bind(this), auth.token); return true; } /* (9) Invite a friend to the current channel * * @username Username * ---------------------------------------------------------*/ invite(username=null) { /* (1) Manage invalid @username */ if( typeof username !== 'string' ) return false; /* (2) Try to remove channel in API */ api.call(`POST /channel/subscribe/${gs.get.content.cid}/${username}`, {}, function(rs){ /* (1) Hide popup */ gs.get.popup.hide(); }.bind(this), auth.token); return true; } /* (10) Leave the current channel * ---------------------------------------------------------*/ leave(){ /* (1) Try to leave channel in API */ api.call(`DELETE /channel/subscribe/${gs.get.content.cid}`, {}, function(rs){ /* (1) Hide popup */ gs.get.popup.hide(); /* (2) Reload channels */ this.fetch(); }.bind(this), auth.token); return true; } }