export default class ChannelController{ /* (1) Construct default attributes * ---------------------------------------------------------*/ constructor(){ /* (1) Set default active channel */ this.current = null; /* (2) Initialize channel list */ this.list = [ { id: -1, link: 'me', label: 'My data', sub: '0 online', icon: 'group', room: [] }, { id: -2, link: null, label: 'add', sub: null, icon: 'add', room: [], add: 1 } ]; /* (3) Initialize channel data 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){ if( channel_id == -2 ) return gs.get.popup.show('channel.create'); console.log(`channel.nav(${channel_id})`); /* (1) Get channel data */ var channel = this.get(channel_id); /* (2) Try to load channel data */ if( !this.load(channel.id) ) return false; /* (3) Navigate vue-router */ gs.get.router.push(`/channel/${channel.link}`); /* (4) Load rooms */ gs.get.room.dump(channel.room); /* (5) Default open first 'text' room */ gs.get.room.nav('text', gs.get.room.text.list[0].id); /* (6) Update active element */ this.current = channel.id; /* (7) Log channel */ console.log(`[channel.current] ${channel.link} (${channel.label})`); return true; } /* (3) Dump/Update channel data * * @channels Channels data * * @return udpated Whether channels have been updated * ---------------------------------------------------------*/ dump(channels){ console.log(`channel.dump([${channels instanceof Array?channels.length:0}])`); /* (1) Check @channels type */ if( !(channels instanceof Array) ) return false; /* (2) Store LAST item */ let last_item = this.list.pop(); /* (3) Clear list (except FIRST) */ this.list.splice(1); /* (4) Apply new channels */ for(let c of channels) this.list.push(c); /* (5) Restore LAST */ this.list.push(last_item); 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]; } /* (5) Fetch channel data * * @channel_id Channel ID * * @return fetched Whether channel data have been fetched * ---------------------------------------------------------*/ load(channel_id=null){ console.log(`channel.load(${channel_id})`); /* (1) Exit if invalid @channel_id */ if( isNaN(channel_id) ) return false; /* (2) Call API to get data */ setTimeout(() => { this.buffer = require('../mockup/api-channel-init.json'); }, 500); return true; } }