插件擴展

2019-04-02 10:51 更新

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

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

擴展主入口模塊

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

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

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

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

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

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

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

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

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

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

  • unverified - 0 : 未登錄

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

  • logined - 2 : 登錄成功

  • online - 3 : 在線

  • busy - 4 : 忙碌

  • away - 5 : 離開

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

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

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

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

  • user  為當前接收消息的用戶的對象

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

  • user  為當前接收消息的用戶的對象

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

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

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

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

commands擴展支持的命令

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

contextMenuCreators為消息增加操作菜單

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

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

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

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

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

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

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

replaceViews :界面替換機制

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

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

// 主入口文件 index.js 
const UserAvatar = require('./user-avatar'); 
module.exports = {     
    replaceViews: {         
        'common/user-avatar': UserAvatar,     
    } 
};
// user-avatar.js 文件 
// 從全局擴展對象中引入模塊 
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

公眾號
微信公眾號

編程獅公眾號