插件擴(kuò)展

2019-04-02 10:51 更新

插件擴(kuò)展通常不包含具體的界面,但可以在界面初始化及關(guān)鍵事件觸發(fā)時得到通知并執(zhí)行代碼。例如可以通過監(jiān)聽用戶發(fā)送消息,并在消息發(fā)送之前修改消息的內(nèi)容。

每一個插件擴(kuò)展需要提供一個入口模塊文件,在 package.json  文件中通過 main  屬性指定。如果不指定此文件則默認(rèn)使用擴(kuò)展包目錄的 index.js  文件作為主入口模塊文件。擴(kuò)展主入口模塊文件為一個 JavaScript 模塊,當(dāng)喧喧加載完畢時會逐個加載各個擴(kuò)展的主入口模塊。在擴(kuò)展主入口模塊中可以訪問全局?jǐn)U展對象 global.Xext 。擴(kuò)展主入口模塊應(yīng)該返回一個對象,該對象可以包含如下生命周期函數(shù):

擴(kuò)展主入口模塊

函數(shù)說明參數(shù)
onAttach(ext)當(dāng)擴(kuò)展被加載后調(diào)用,此時可以對擴(kuò)展進(jìn)行初始化
  • ext  為當(dāng)前被載入的擴(kuò)展對象

onReady(ext)當(dāng)界面加載完畢時調(diào)用,此時擴(kuò)展可以處理與界面相關(guān)操作。
  • ext  為當(dāng)前被載入的擴(kuò)展對象

onDetach(ext)當(dāng)擴(kuò)展被卸載時調(diào)用,此時應(yīng)該將擴(kuò)展使用的資源進(jìn)行釋放,例如銷毀定時器等
  • ext  為當(dāng)前被載入的擴(kuò)展對象

onUserLogin(user, error)當(dāng)用戶登錄完成時調(diào)用;
  • user  為登錄的用戶對象

  • error  當(dāng)?shù)卿浭r返回的錯誤信息

onUserLoginout(user)當(dāng)當(dāng)前登錄的退出登錄時調(diào)用
  • user  為退出登錄的用戶對象

onUserStatusChange(status, oldStatus, user)當(dāng)用戶狀態(tài)發(fā)生變化時調(diào)用
  • status  為用戶新的狀態(tài)代碼

  • oldStatus  為用戶之前的狀態(tài)代碼

  • user  為當(dāng)前狀態(tài)發(fā)生變化的用戶對象

用戶狀態(tài)代碼含義:

  • unverified - 0 : 未登錄

  • disconnect - 1 : 登錄過,但掉線了

  • logined - 2 : 登錄成功

  • online - 3 : 在線

  • busy - 4 : 忙碌

  • away - 5 : 離開

onSendChatMessages(messages, chat, user)當(dāng)用戶發(fā)送聊天消息時調(diào)用
  • messages  為用戶要發(fā)送出去的消息對象數(shù)組

  • chat  為用戶發(fā)送消息的會話對象

  • user  為當(dāng)前發(fā)送消息的用戶的對象

onReceiveChatMessages(messages, user)當(dāng)用戶接收到聊天消息時調(diào)用
  • messages  為用戶接收到的消息對象數(shù)組

  • user  為當(dāng)前接收消息的用戶的對象

onRenderChatMessageContent(content)當(dāng)在界面上需要轉(zhuǎn)化 markdown 格式的消息文本為 html 時會調(diào)用此回調(diào)方法
  • messages  為用戶接收到的消息對象數(shù)組

  • user  為當(dāng)前接收消息的用戶的對象

MainView當(dāng)作為內(nèi)嵌應(yīng)用時的 React 實現(xiàn)的界面主組件

MainView  應(yīng)該返回一個 React 組件類或組件函數(shù)。

replaceViews用于配置替換系統(tǒng)內(nèi)置界面組件

replaceViews  為一個對象,對象的鍵名為要替換的組件路徑,鍵值為要用來替換的 React 組件類或組件函數(shù)。

commands擴(kuò)展支持的命令

commands  為一個對象,對象的鍵名為響應(yīng)的命令名稱,鍵值為命令回調(diào)函數(shù)或者命令定義對象。

contextMenuCreators為消息增加操作菜單

contextMenuCreators  為一個菜單生成對象數(shù)組,對象數(shù)組為每個菜單生成對象。菜單生成對象包括 match  屬性用于定義匹配的菜單類型,creator 屬性用于生成菜單項目的函數(shù)。

urlInspectors網(wǎng)址解釋器,可以將消息中的網(wǎng)址渲染成卡片形式

urlInspectors  為一個對象數(shù)組,每個對象包含有 test  屬性為正則表達(dá)式用于匹配要解釋的 url 地址,inspector  為回調(diào)函數(shù)(function(url: string) )用于生成 URL 對應(yīng)的卡片參數(shù)。

下面為一個簡單等插件擴(kuò)展主入口模塊示例:

// 從全局?jǐn)U展對象中引入模塊 
const {   
    app,   
    components,   
    utils 
} = global.Xext; 
// 用于存儲計時器標(biāo)志 
let timerTask = null; 
module.exports = {     
    onAttach: (ext) => {         
        // 擴(kuò)展加載完畢了, 此時設(shè)置一個計時器,在加載完成 10 秒中之后在界面上顯示一個消息         
        timerTask = setTimeout(() => {             
            alert('擴(kuò)展加載完成已經(jīng) 10 秒鐘了,剛剛加載等擴(kuò)展名稱是:' + ext.displayName);         
        });     
     },     
     
     onDetach: (ext) => {         
         // 擴(kuò)展將被卸載,此時應(yīng)該清理計時器         
         clearTimeout(timerTask);         
         timerTask = null;     
     },     
     onUserLogin: (user, error) => {         
         // 當(dāng)用戶登錄時在此處可以進(jìn)行相關(guān)操作,下面以顯示當(dāng)前登錄等結(jié)果和用戶名為例         
         if (user && !error) { // 表示登錄成功             
             components.Modal.alert('用戶登錄成功了,用戶名稱是:' + user.displayName);         
         } else {             
             components.Modal.alert('用戶登錄失敗了。');         
         }     
     }, 
}

應(yīng)用的插件機(jī)制

當(dāng)一個擴(kuò)展類型為 app (應(yīng)用)時,同樣可以在 package.json  文件中使用 main  屬性指定一個主入口模塊文件,從而使得一個應(yīng)用擴(kuò)展具備插件擴(kuò)展的機(jī)制。同理,也可以將此方式理解為一個包含應(yīng)用界面的插件。

replaceViews :界面替換機(jī)制

在主入口模塊中可以使用 replaceViews  字段指定一個對象來替換喧喧默認(rèn)的界面組件,這些組件在  /app/views 目錄下。replaceViews  對象的鍵名為要替換的組件路徑,鍵值為要用來替換的 React 組件類或組件函數(shù)。通過界面替換機(jī)制,可以使用插件的形式來定制喧喧的界面,例如將官方的登錄界面替換為自己的實現(xiàn)。

下面的例子將展示使用自定義的 React 組件來替換官方的用戶頭像組件。這樣可以將官方的圓形用戶頭像替換為方形的頭像。更加詳細(xì)的代碼參考官方例子  replace-user-avatar-example。

// 主入口文件 index.js 
const UserAvatar = require('./user-avatar'); 
module.exports = {     
    replaceViews: {         
        'common/user-avatar': UserAvatar,     
    } 
};
// user-avatar.js 文件 
// 從全局?jǐn)U展對象中引入模塊 
const {     
    views,     
    components,     
    utils,     
    nodeModules, 
} = global.Xext; 
const {React} = nodeModules; 
const {PropTypes, Component} = React; 
const {StatusDot} = views.common; 
const {Avatar, Emojione} = components; 
const {HtmlHelper} = utils; 
let todayTime = new Date(); 
todayTime.setHours(0, 0, 0, 0); 
todayTime = todayTime.getTime();
 
class UserAvatar extends Component {     
    render() {         
        const user = this.props.user;         
        const className = this.props.className;         
        const showStatusDot = this.props.showStatusDot;    
             
        // 使用 react 形式返回新的用戶頭像     
    } 
} 
UserAvatar.propTypes = {     
    user: PropTypes.object,     
    className: PropTypes.string,     
    showStatusDot: PropTypes.bool, 
};
UserAvatar.defaultProps = {     
    className: null,     
    showStatusDot: null,     
    user: null, 
}; 
module.exports = UserAvatar;


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號