Commit 7fc5514f authored by leadream's avatar leadream

add webhook

parent 04d41f04
export const sendNotification = ({webhookUrl, data}, prUrl, version, message) => {
return fetch(`https://figma-handoff-cors.herokuapp.com/${webhookUrl}`, {
headers: {
'content-type': 'application/json'
},
body: data
.replace(/\$prUrl/g, prUrl)
.replace(/\$version/g, version)
.replace(/\$message/g, message),
method: 'POST'
})
.then(response => response.json())
}
...@@ -93,26 +93,33 @@ ...@@ -93,26 +93,33 @@
/*! no static exports found */ /*! no static exports found */
/***/ (function(module, exports) { /***/ (function(module, exports) {
figma.showUI(__html__, { width: 320, height: 320 }); figma.showUI(__html__, { width: 320, height: 436 });
// get github settings // get github settings
function getGithubSettings() { function getLocalData(key) {
return figma.clientStorage.getAsync('githubData'); return figma.clientStorage.getAsync(key);
} }
// set github settings // set github settings
function setGithubSettings(data) { function setLocalData(key, data) {
figma.clientStorage.setAsync('githubData', data); figma.clientStorage.setAsync(key, data);
} }
// send github data to UI // send github data to UI
function init() { function init() {
getGithubSettings() getLocalData('githubData')
.then(githubData => { .then(githubData => {
figma.ui.postMessage({ type: 'githubDataGot', githubData }); figma.ui.postMessage({ type: 'githubDataGot', githubData });
}); });
getLocalData('webhookData')
.then(webhookData => {
figma.ui.postMessage({ type: 'webhookDataGot', webhookData });
});
} }
figma.ui.onmessage = msg => { figma.ui.onmessage = msg => {
switch (msg.type) { switch (msg.type) {
case 'setGithubData': case 'setGithubData':
setGithubSettings(msg.githubData); setLocalData('githubData', msg.githubData);
break;
case 'setWebhookData':
setLocalData('webhookData', msg.webhookData);
break; break;
case 'cancel': case 'cancel':
figma.closePlugin(); figma.closePlugin();
...@@ -125,4 +132,4 @@ init(); ...@@ -125,4 +132,4 @@ init();
/***/ }) /***/ })
/******/ }); /******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7O0FDbEZBLHdCQUF3QiwwQkFBMEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG9DQUFvQztBQUNsRSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImNvZGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuIFx0XHRcdHJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzO1xuIFx0XHR9XG4gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4gXHRcdHZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHtcbiBcdFx0XHRpOiBtb2R1bGVJZCxcbiBcdFx0XHRsOiBmYWxzZSxcbiBcdFx0XHRleHBvcnRzOiB7fVxuIFx0XHR9O1xuXG4gXHRcdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuIFx0XHRtb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuIFx0XHQvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkXG4gXHRcdG1vZHVsZS5sID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uZCA9IGZ1bmN0aW9uKGV4cG9ydHMsIG5hbWUsIGdldHRlcikge1xuIFx0XHRpZighX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIG5hbWUpKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBnZXR0ZXIgfSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbiBcdF9fd2VicGFja19yZXF1aXJlX18uciA9IGZ1bmN0aW9uKGV4cG9ydHMpIHtcbiBcdFx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG4gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG4gXHRcdH1cbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbiBcdH07XG5cbiBcdC8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4gXHQvLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbiBcdC8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuIFx0Ly8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcbiBcdFx0aWYobW9kZSAmIDEpIHZhbHVlID0gX193ZWJwYWNrX3JlcXVpcmVfXyh2YWx1ZSk7XG4gXHRcdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG4gXHRcdGlmKChtb2RlICYgNCkgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAmJiB2YWx1ZS5fX2VzTW9kdWxlKSByZXR1cm4gdmFsdWU7XG4gXHRcdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShucywgJ2RlZmF1bHQnLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2YWx1ZSB9KTtcbiBcdFx0aWYobW9kZSAmIDIgJiYgdHlwZW9mIHZhbHVlICE9ICdzdHJpbmcnKSBmb3IodmFyIGtleSBpbiB2YWx1ZSkgX193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBrZXksIGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gdmFsdWVba2V5XTsgfS5iaW5kKG51bGwsIGtleSkpO1xuIFx0XHRyZXR1cm4gbnM7XG4gXHR9O1xuXG4gXHQvLyBnZXREZWZhdWx0RXhwb3J0IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbm9uLWhhcm1vbnkgbW9kdWxlc1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5uID0gZnVuY3Rpb24obW9kdWxlKSB7XG4gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuIFx0XHRcdGZ1bmN0aW9uIGdldERlZmF1bHQoKSB7IHJldHVybiBtb2R1bGVbJ2RlZmF1bHQnXTsgfSA6XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0TW9kdWxlRXhwb3J0cygpIHsgcmV0dXJuIG1vZHVsZTsgfTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuIFx0XHRyZXR1cm4gZ2V0dGVyO1xuIFx0fTtcblxuIFx0Ly8gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSBmdW5jdGlvbihvYmplY3QsIHByb3BlcnR5KSB7IHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eSk7IH07XG5cbiBcdC8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBcIlwiO1xuXG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gXCIuL3NyYy9jb2RlLnRzXCIpO1xuIiwiZmlnbWEuc2hvd1VJKF9faHRtbF9fLCB7IHdpZHRoOiAzMjAsIGhlaWdodDogMzIwIH0pO1xuLy8gZ2V0IGdpdGh1YiBzZXR0aW5nc1xuZnVuY3Rpb24gZ2V0R2l0aHViU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIGZpZ21hLmNsaWVudFN0b3JhZ2UuZ2V0QXN5bmMoJ2dpdGh1YkRhdGEnKTtcbn1cbi8vIHNldCBnaXRodWIgc2V0dGluZ3NcbmZ1bmN0aW9uIHNldEdpdGh1YlNldHRpbmdzKGRhdGEpIHtcbiAgICBmaWdtYS5jbGllbnRTdG9yYWdlLnNldEFzeW5jKCdnaXRodWJEYXRhJywgZGF0YSk7XG59XG4vLyBzZW5kIGdpdGh1YiBkYXRhIHRvIFVJXG5mdW5jdGlvbiBpbml0KCkge1xuICAgIGdldEdpdGh1YlNldHRpbmdzKClcbiAgICAgICAgLnRoZW4oZ2l0aHViRGF0YSA9PiB7XG4gICAgICAgIGZpZ21hLnVpLnBvc3RNZXNzYWdlKHsgdHlwZTogJ2dpdGh1YkRhdGFHb3QnLCBnaXRodWJEYXRhIH0pO1xuICAgIH0pO1xufVxuZmlnbWEudWkub25tZXNzYWdlID0gbXNnID0+IHtcbiAgICBzd2l0Y2ggKG1zZy50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3NldEdpdGh1YkRhdGEnOlxuICAgICAgICAgICAgc2V0R2l0aHViU2V0dGluZ3MobXNnLmdpdGh1YkRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICAgICAgICBmaWdtYS5jbG9zZVBsdWdpbigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufTtcbmluaXQoKTtcbiJdLCJzb3VyY2VSb290IjoiIn0= //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtRQUFBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBOzs7UUFHQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMENBQTBDLGdDQUFnQztRQUMxRTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLHdEQUF3RCxrQkFBa0I7UUFDMUU7UUFDQSxpREFBaUQsY0FBYztRQUMvRDs7UUFFQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EseUNBQXlDLGlDQUFpQztRQUMxRSxnSEFBZ0gsbUJBQW1CLEVBQUU7UUFDckk7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwyQkFBMkIsMEJBQTBCLEVBQUU7UUFDdkQsaUNBQWlDLGVBQWU7UUFDaEQ7UUFDQTtRQUNBOztRQUVBO1FBQ0Esc0RBQXNELCtEQUErRDs7UUFFckg7UUFDQTs7O1FBR0E7UUFDQTs7Ozs7Ozs7Ozs7O0FDbEZBLHdCQUF3QiwwQkFBMEI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG9DQUFvQztBQUNsRSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDhCQUE4QixzQ0FBc0M7QUFDcEUsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJjb2RlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvY29kZS50c1wiKTtcbiIsImZpZ21hLnNob3dVSShfX2h0bWxfXywgeyB3aWR0aDogMzIwLCBoZWlnaHQ6IDQzNiB9KTtcbi8vIGdldCBnaXRodWIgc2V0dGluZ3NcbmZ1bmN0aW9uIGdldExvY2FsRGF0YShrZXkpIHtcbiAgICByZXR1cm4gZmlnbWEuY2xpZW50U3RvcmFnZS5nZXRBc3luYyhrZXkpO1xufVxuLy8gc2V0IGdpdGh1YiBzZXR0aW5nc1xuZnVuY3Rpb24gc2V0TG9jYWxEYXRhKGtleSwgZGF0YSkge1xuICAgIGZpZ21hLmNsaWVudFN0b3JhZ2Uuc2V0QXN5bmMoa2V5LCBkYXRhKTtcbn1cbi8vIHNlbmQgZ2l0aHViIGRhdGEgdG8gVUlcbmZ1bmN0aW9uIGluaXQoKSB7XG4gICAgZ2V0TG9jYWxEYXRhKCdnaXRodWJEYXRhJylcbiAgICAgICAgLnRoZW4oZ2l0aHViRGF0YSA9PiB7XG4gICAgICAgIGZpZ21hLnVpLnBvc3RNZXNzYWdlKHsgdHlwZTogJ2dpdGh1YkRhdGFHb3QnLCBnaXRodWJEYXRhIH0pO1xuICAgIH0pO1xuICAgIGdldExvY2FsRGF0YSgnd2ViaG9va0RhdGEnKVxuICAgICAgICAudGhlbih3ZWJob29rRGF0YSA9PiB7XG4gICAgICAgIGZpZ21hLnVpLnBvc3RNZXNzYWdlKHsgdHlwZTogJ3dlYmhvb2tEYXRhR290Jywgd2ViaG9va0RhdGEgfSk7XG4gICAgfSk7XG59XG5maWdtYS51aS5vbm1lc3NhZ2UgPSBtc2cgPT4ge1xuICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgICAgY2FzZSAnc2V0R2l0aHViRGF0YSc6XG4gICAgICAgICAgICBzZXRMb2NhbERhdGEoJ2dpdGh1YkRhdGEnLCBtc2cuZ2l0aHViRGF0YSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc2V0V2ViaG9va0RhdGEnOlxuICAgICAgICAgICAgc2V0TG9jYWxEYXRhKCd3ZWJob29rRGF0YScsIG1zZy53ZWJob29rRGF0YSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgICAgICAgIGZpZ21hLmNsb3NlUGx1Z2luKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG59O1xuaW5pdCgpO1xuIl0sInNvdXJjZVJvb3QiOiIifQ==
\ No newline at end of file \ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
figma.showUI(__html__, { width: 320, height: 320 }) figma.showUI(__html__, { width: 320, height: 436 })
// get github settings // get github settings
function getGithubSettings () { function getLocalData (key) {
return figma.clientStorage.getAsync('githubData') return figma.clientStorage.getAsync(key)
} }
// set github settings // set github settings
function setGithubSettings (data) { function setLocalData (key, data) {
figma.clientStorage.setAsync('githubData', data) figma.clientStorage.setAsync(key, data)
} }
// send github data to UI // send github data to UI
function init () { function init () {
getGithubSettings() getLocalData('githubData')
.then(githubData => { .then(githubData => {
figma.ui.postMessage({ type: 'githubDataGot', githubData }) figma.ui.postMessage({ type: 'githubDataGot', githubData })
}) })
getLocalData('webhookData')
.then(webhookData => {
figma.ui.postMessage({ type: 'webhookDataGot', webhookData })
})
} }
figma.ui.onmessage = msg => { figma.ui.onmessage = msg => {
switch (msg.type) { switch (msg.type) {
case 'setGithubData': case 'setGithubData':
setGithubSettings(msg.githubData) setLocalData('githubData', msg.githubData)
break
case 'setWebhookData':
setLocalData('webhookData', msg.webhookData)
break break
case 'cancel': case 'cancel':
figma.closePlugin() figma.closePlugin()
......
...@@ -49,7 +49,7 @@ export default class Settings extends React.Component<Props> { ...@@ -49,7 +49,7 @@ export default class Settings extends React.Component<Props> {
} }
} }
render () { render () {
const { visible } = this.props const { visible, githubData } = this.props
const { githubRepo, githubToken, warning } = this.state const { githubRepo, githubToken, warning } = this.state
return ( return (
<div className={!visible ? 'hide' : ''}> <div className={!visible ? 'hide' : ''}>
...@@ -84,7 +84,9 @@ export default class Settings extends React.Component<Props> { ...@@ -84,7 +84,9 @@ export default class Settings extends React.Component<Props> {
/> />
</div> </div>
<div className="form-item"> <div className="form-item">
<button className='button button--primary button-block' onClick={this.handleSubmit}>Go</button> <button className='button button--primary button-block' onClick={this.handleSubmit}>
{githubData ? 'Update' : 'Go'}
</button>
</div> </div>
<div className="setting-footer form-item type type--pos-medium-normal"> <div className="setting-footer form-item type type--pos-medium-normal">
developed by <a href="https://github.com/leadream" target="_blank">Leadream</a> developed by <a href="https://github.com/leadream" target="_blank">Leadream</a>
......
import * as React from 'react' import * as React from 'react'
import Webhook from './Webhook'
import { getContent, getCommit, updatePackage, createPullRequest, createBranch } from '../../api/github' import { getContent, getCommit, updatePackage, createPullRequest, createBranch } from '../../api/github'
import { sendNotification } from '../../api/webhook'
import { versionValue } from '../../utils/helper' import { versionValue } from '../../utils/helper'
declare function require(path: string): any declare function require(path: string): any
export interface Props { export interface Props {
onSucceed: () => void; onSucceed: () => void;
githubData: {owner?: string, name?: string, githubToken?: string}; githubData: {owner?: string, name?: string, githubToken?: string};
webhookData: {webhookUrl: string, data: string};
visible: boolean; visible: boolean;
} }
...@@ -23,7 +25,8 @@ export default class Settings extends React.Component<Props> { ...@@ -23,7 +25,8 @@ export default class Settings extends React.Component<Props> {
currentVersion: '', currentVersion: '',
currentVersionTip: '', currentVersionTip: '',
resultTip: '', resultTip: '',
prUrl: '' prUrl: '',
webhookData: null
} }
getVersion = async (githubData) => { getVersion = async (githubData) => {
const { contents, sha } = await getContent('package.json', githubData) const { contents, sha } = await getContent('package.json', githubData)
...@@ -61,6 +64,12 @@ export default class Settings extends React.Component<Props> { ...@@ -61,6 +64,12 @@ export default class Settings extends React.Component<Props> {
const { name, value } = e.target const { name, value } = e.target
this.setState({[name]: value}) this.setState({[name]: value})
} }
handleWebhookFilled = (webhookUrl, data) => {
const noData = !webhookUrl && !data
this.setState({
webhookData: noData? null : {webhookUrl, data}
})
}
validate = (callback) => { validate = (callback) => {
const { version, message, currentVersion } = this.state const { version, message, currentVersion } = this.state
// TODO: should validate async // TODO: should validate async
...@@ -91,26 +100,24 @@ export default class Settings extends React.Component<Props> { ...@@ -91,26 +100,24 @@ export default class Settings extends React.Component<Props> {
}) })
callback && callback() callback && callback()
} }
handleSubmit = () => { handleSubmit = async () => {
this.validate(() => { this.validate(async () => {
this.setState({isPushing: true}) this.setState({isPushing: true})
this.createBranch()
.then(({branchName}) => { const { branchName } = await this.createBranch()
this.changeVersion(branchName) await this.changeVersion(branchName)
.then(() => { const { html_url } = await this.createCommitAndPR(branchName)
this.createCommitAndPR(branchName)
.then(({html_url}) => { const { version, message, webhookData } = this.state
this.props.onSucceed() webhookData && sendNotification(webhookData, html_url, version, message)
this.setState({
version: '', this.setState({
message: '', version: '',
isPushing: false, message: '',
resultTip: 'Pushing successfully! You can now go to Github and merge this PR. Then your icons will be published to NPM automatically.', isPushing: false,
prUrl: html_url resultTip: 'Pushing successfully! You can now go to Github and merge this PR. Then your icons will be published to NPM automatically.',
}) prUrl: html_url
}) })
})
})
}) })
} }
onCancel = () => { onCancel = () => {
...@@ -122,7 +129,7 @@ export default class Settings extends React.Component<Props> { ...@@ -122,7 +129,7 @@ export default class Settings extends React.Component<Props> {
} }
} }
render () { render () {
const { visible } = this.props const { visible, webhookData } = this.props
const { isPushing, version, message, versionTip, messageTip, currentVersionTip, resultTip, prUrl } = this.state const { isPushing, version, message, versionTip, messageTip, currentVersionTip, resultTip, prUrl } = this.state
return ( return (
<div className={'updator ' + (!visible ? 'hide' : '')}> <div className={'updator ' + (!visible ? 'hide' : '')}>
...@@ -171,6 +178,11 @@ export default class Settings extends React.Component<Props> { ...@@ -171,6 +178,11 @@ export default class Settings extends React.Component<Props> {
<div className="type type--pos-medium-normal help-tip">{messageTip}</div> <div className="type type--pos-medium-normal help-tip">{messageTip}</div>
} }
</div> </div>
<Webhook
hidden={resultTip}
onFilled={this.handleWebhookFilled}
webhookData={webhookData}
/>
<div className={'form-item '+(resultTip ? 'hide' : '')}> <div className={'form-item '+(resultTip ? 'hide' : '')}>
<button <button
onClick={this.handleSubmit} onClick={this.handleSubmit}
...@@ -190,4 +202,4 @@ export default class Settings extends React.Component<Props> { ...@@ -190,4 +202,4 @@ export default class Settings extends React.Component<Props> {
</div> </div>
) )
} }
} }
\ No newline at end of file
import * as React from 'react'
export interface Props {
hidden: boolean;
webhookData: {webhookUrl: string, data: string};
onFilled: (webhookUrl, data) => void;
}
export default ({hidden, onFilled, webhookData}) => {
const [visible, setVisible] = React.useState(false)
const [webhookUrl, setWebhookUrl] = React.useState('')
const [data, setData] = React.useState('')
const toggle = e => {
setVisible(e.target.checked)
}
const handleChange = e => {
const { value, name } = e.target
name==='webhookUrl' ? setWebhookUrl(value) : setData(value)
}
React.useEffect(() => {
if (!visible) {
onFilled()
parent.postMessage({ pluginMessage: { type: 'setWebhookData', webhookData: '' } }, '*')
}
if (visible && webhookUrl && data) {
onFilled(webhookUrl, data)
parent.postMessage({ pluginMessage: { type: 'setWebhookData', webhookData: {webhookUrl, data} } }, '*')
}
}, [visible, webhookUrl, data])
React.useEffect(() => {
const { webhookUrl: url, data: message } = webhookData || { webhookUrl: '', data: '' }
if (url && message) {
setVisible(true)
setWebhookUrl(url)
setData(message)
}
}, [webhookData])
return (
!hidden &&
<React.Fragment>
<div className="checkbox">
<input id="visible" type="checkbox" className="checkbox__box" onChange={toggle} checked={visible}/>
<label htmlFor="visible" className="checkbox__label">Send a message to Slack/Lark</label>
</div>
<div className={visible ? '' : 'hide'}>
<div className="form-item">
<input
name="webhookUrl"
className="input"
placeholder="Webhook link"
value={webhookUrl}
onChange={handleChange}
/>
</div>
<div className="form-item">
<textarea
rows={2}
name="data"
className="textarea"
placeholder="Message data (json)"
value={data}
onChange={handleChange}
/>
<div className="type type--pos-medium-normal">You can use variables $prUrl, $version, $message in the content.</div>
</div>
</div>
</React.Fragment>
)
}
...@@ -47,7 +47,7 @@ a{ ...@@ -47,7 +47,7 @@ a{
color: #18a0fb color: #18a0fb
} }
.container{ .container-with-tab{
padding-top: 20px; padding-top: 20px;
} }
......
...@@ -11,6 +11,7 @@ class App extends React.Component { ...@@ -11,6 +11,7 @@ class App extends React.Component {
state = { state = {
updatorVisible: false, updatorVisible: false,
githubData: null, githubData: null,
webhookData: null,
settingSwitch: false, settingSwitch: false,
isDone: false isDone: false
} }
...@@ -30,7 +31,7 @@ class App extends React.Component { ...@@ -30,7 +31,7 @@ class App extends React.Component {
} }
} }
componentDidMount () { componentDidMount () {
// 所有的消息接收集中在这里 // receive messages here
window.onmessage = async (event) => { window.onmessage = async (event) => {
const msg = event.data.pluginMessage const msg = event.data.pluginMessage
switch (msg.type) { switch (msg.type) {
...@@ -42,14 +43,22 @@ class App extends React.Component { ...@@ -42,14 +43,22 @@ class App extends React.Component {
}) })
} }
break break
case 'webhookDataGot':
if (msg.webhookData) {
this.setState({
webhookData: msg.webhookData
})
}
break
} }
} }
} }
render() { render() {
const { updatorVisible, githubData, settingSwitch, isDone } = this.state const { updatorVisible, githubData, webhookData, settingSwitch, isDone } = this.state
const tabVisible = githubData&&!isDone
return ( return (
<div className="container"> <div className={'container '+ (!tabVisible ? '' : 'container-with-tab')}>
<div className={'bar-adjust '+ ((githubData&&!isDone) ? '' : 'hide')}> <div className={'bar-adjust '+ (tabVisible ? '' : 'hide')}>
<div <div
className={'adjust-item type type--pos-medium-bold '+(updatorVisible ? '' : 'active')} className={'adjust-item type type--pos-medium-bold '+(updatorVisible ? '' : 'active')}
onClick={e => this.toggleView()} onClick={e => this.toggleView()}
...@@ -72,7 +81,9 @@ class App extends React.Component { ...@@ -72,7 +81,9 @@ class App extends React.Component {
<Updator <Updator
onSucceed={this.onSucceed} onSucceed={this.onSucceed}
visible={updatorVisible} visible={updatorVisible}
githubData={githubData}/> githubData={githubData}
webhookData={webhookData}
/>
</div> </div>
) )
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment