184 lines
3.9 KiB
JavaScript
184 lines
3.9 KiB
JavaScript
export 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<int> Channel id (NULL uses get())
|
|
*
|
|
* @return status<boolean> 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) 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<array> Channels data
|
|
*
|
|
* @return udpated<boolean> 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<int> Channel ID
|
|
* NULL: current channel || from URL (and set current)
|
|
*
|
|
* @return channel<array> 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<int> Channel ID
|
|
*
|
|
* @return fetched<bool> 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;
|
|
|
|
}
|
|
|
|
} |