importtype{SelectionPayload}from'./types'exporttypeMessageType='SELECTION_CHANGED'|'LOAD_SELECTION'|'CANCEL'exporttypeMessagePayloadMap={SELECTION_CHANGED:SelectionPayloadLOAD_SELECTION:undefinedCANCEL:undefined}exporttypeMessagePayload=MessagePayloadMap[MessageType]typeMessage={type:MessageTypepayload?:MessagePayload}typeEventHandler=(payload?:MessagePayload)=>voidconsteventHandlers=newMap<MessageType,EventHandler>()letinitialized=falseexportfunctionon(type:MessageType,handler:EventHandler):()=>void{eventHandlers.set(type,handler)if(!initialized){invokeEventHandler()initialized=true}return()=>{eventHandlers.delete(type)}}exportfunctionsend(type:MessageType,payload?:MessagePayload){constmessage:Message={type,payload}// UI Processif(typeofwindow!=='undefined'){window.parent.postMessage({pluginMessage:message},'*')return}// Main Processfigma.ui.postMessage(message)}functioninvokeEventHandler(){// UI Processif(typeofwindow!=='undefined'){window.onmessage=(event:MessageEvent)=>{constmessage=(event.dataas{pluginMessage?:Message})?.pluginMessageif(!message)returnconsthandler=eventHandlers.get(message.type)handler?.(message.payload)}return}// Main Processfigma.ui.onmessage=(message:Message)=>{consthandler=eventHandlers.get(message.type)handler?.(message.payload)}}
Leave a comment