kopia lustrzana https://github.com/c9/core
345 wiersze
13 KiB
JavaScript
345 wiersze
13 KiB
JavaScript
/*global UserSnap _usersnapconfig*/
|
|
|
|
define(function(require, exports, module) {
|
|
main.consumes = [
|
|
"Plugin", "ui", "menus", "c9", "auth", "dialog.alert", "help", "info", "c9.analytics", "upgrade"
|
|
];
|
|
main.provides = ["help.support"];
|
|
return main;
|
|
|
|
function main(options, imports, register) {
|
|
var Plugin = imports.Plugin;
|
|
var ui = imports.ui;
|
|
var c9 = imports.c9;
|
|
var menus = imports.menus;
|
|
var auth = imports.auth;
|
|
var info = imports.info;
|
|
var analytics = imports["c9.analytics"];
|
|
var alert = imports["dialog.alert"].show;
|
|
var upgrade = imports.upgrade;
|
|
|
|
var attachmentSizeLimit = 1024 * 1024 * 2; // limit size of attachment to <= 2MB
|
|
|
|
/***** Initialization *****/
|
|
|
|
var plugin = new Plugin("Ajax.org", main.consumes);
|
|
var emit = plugin.getEmitter();
|
|
|
|
var form, confirmation, btnSend, btnClose, subject, description, win;
|
|
var attachment, confirmationMessage;
|
|
|
|
var baseurl = options.baseurl;
|
|
var FILEREADER_URL = "/api/provision/filereader-fallback/images";
|
|
var FILETICKET_URL = "/api/context/fileticket";
|
|
|
|
var SUBSCRIPTION_URL = "https://c9.io/account/billing";
|
|
|
|
var usApiKey = options.userSnapApiKey;
|
|
var screenshotSupport = options.screenshotSupport;
|
|
|
|
var loaded = false;
|
|
var c = 300;
|
|
function load() {
|
|
if (loaded) return false;
|
|
loaded = true;
|
|
|
|
menus.once("ready", function() {
|
|
analytics.identify(info.getUser());
|
|
|
|
menus.addItemByPath("Support/Get Premium Support", new ui.item({
|
|
onclick: function() {
|
|
// draw();
|
|
|
|
if (!info.getUser().premium) {
|
|
return upgrade.askUpgrade(
|
|
"This is a Premium Feature",
|
|
'Help is just a click away. Check out our <a href="https://c9.io/pricing" target="_blank">amazing premium plans</a>.',
|
|
function() {
|
|
emit("confirmAccountRedirect", {
|
|
source: "confirmation"
|
|
});
|
|
},
|
|
{ source: "upsell-webide-support", isHTML: true }
|
|
);
|
|
}
|
|
|
|
analytics.track("Initiated Support Request");
|
|
if (window.Intercom) {
|
|
window.Intercom('show');
|
|
}
|
|
else {
|
|
window.open('mailto:support@c9.io');
|
|
}
|
|
}
|
|
}), c += 100, plugin);
|
|
|
|
if (screenshotSupport)
|
|
initMenuWithScreenshotSupport();
|
|
});
|
|
|
|
}
|
|
|
|
/**
|
|
* Initializes the menu with Screenshot support (via UserSnap)
|
|
*/
|
|
function initMenuWithScreenshotSupport() {
|
|
menus.addItemByPath("Support/Get Premium Support With a Screenshot", new ui.item({
|
|
onclick: function() {
|
|
draw();
|
|
|
|
if (!info.getUser().premium) {
|
|
return upgrade.askUpgrade(
|
|
"This is a Premium Feature",
|
|
'Help is just a click away. Check out our <a href="https://c9.io/pricing" target="_blank">amazing premium plans</a>.',
|
|
function() {
|
|
emit("confirmAccountRedirect", {
|
|
source: "confirmation"
|
|
});
|
|
},
|
|
{ source: "upsell-webide-support", isHTML: true }
|
|
);
|
|
}
|
|
|
|
analytics.track("Initiated Support Request");
|
|
setTimeout(function wait() {
|
|
if (typeof UserSnap !== "undefined") {
|
|
var email = info.getUser().email;
|
|
UserSnap.setEmailBox(email);
|
|
UserSnap.openReportWindow();
|
|
}
|
|
else {
|
|
setTimeout(wait, 50);
|
|
}
|
|
}, 10);
|
|
},
|
|
class: "betafeedback"
|
|
}), c += 100, plugin);
|
|
}
|
|
|
|
var drawn = false;
|
|
function draw() {
|
|
if (drawn) return;
|
|
drawn = true;
|
|
|
|
_usersnapconfig = {
|
|
apiKey: usApiKey,
|
|
valign: "middle",
|
|
halign: "right",
|
|
tools: ["pen", "arrow", "note"],
|
|
lang: "en",
|
|
commentBox: true,
|
|
commentBoxPlaceholder: "Enter any feedback here. What steps did"
|
|
+ " you take? Is it reproducible in incognito mode?",
|
|
emailBox: true,
|
|
emailBoxPlaceholder: "Your email address",
|
|
emailRequired: true,
|
|
btnText: "Beta Feedback",
|
|
beforeSend: function(obj) {
|
|
obj.addInfo = {
|
|
userAgent: navigator.userAgent
|
|
};
|
|
},
|
|
errorHandler: function(errorMessage, errorCode) {
|
|
console.error("UserSnap Error Code: " + errorCode);
|
|
console.error("UserSnap Error Message: " + errorMessage);
|
|
},
|
|
mode: "report"
|
|
};
|
|
(function() {
|
|
var s = document.createElement("script");
|
|
s.type = "text/javascript";
|
|
s.async = true;
|
|
s.src = '//api.usersnap.com/load/' +
|
|
'e3d3b232-1c21-4961-b73d-fbc8dc7be1c3.js';
|
|
var x = document.getElementsByTagName('script')[0];
|
|
x.parentNode.insertBefore(s, x);
|
|
})();
|
|
|
|
// Create UI elements
|
|
var markup = require("text!./support.xml");
|
|
ui.insertMarkup(null, markup, plugin);
|
|
|
|
win = plugin.getElement("win");
|
|
form = plugin.getElement("form");
|
|
confirmation = plugin.getElement("confirmation");
|
|
btnSend = plugin.getElement("btnSend");
|
|
btnSend = plugin.getElement("btnSend");
|
|
btnClose = plugin.getElement("btnClose");
|
|
subject = plugin.getElement("subject");
|
|
description = plugin.getElement("description");
|
|
attachment = plugin.getElement("attachment");
|
|
confirmationMessage = plugin.getElement("confirmationMessage");
|
|
|
|
btnClose.on("click", function() { closeWindow(); });
|
|
btnSend.on("click", function() { fileTicket(); });
|
|
|
|
emit("draw");
|
|
}
|
|
|
|
/***** Methods *****/
|
|
|
|
/**
|
|
* fileTicket
|
|
*
|
|
* This function is called when pressing the Send button. It sends the contents
|
|
* of the form to the Zendesk Cloud9 account, creating a support ticket
|
|
* there.
|
|
*/
|
|
function fileTicket() {
|
|
btnSend.setAttribute("disabled", true);
|
|
var fileHandler = attachment.$ext.getElementsByTagName('input')[0].files[0];
|
|
if (fileHandler) { // there is an attachment
|
|
if (fileHandler.size > attachmentSizeLimit) {
|
|
alert("Upload failed", "Attachment size exceeds limit",
|
|
"Please limit the size of the attachment to less than 2 MB.");
|
|
// Reenable Send button and clear file chooser
|
|
btnSend.setAttribute("disabled", false);
|
|
clearFileChooser();
|
|
return;
|
|
}
|
|
|
|
if (window.FileReader) {
|
|
var reader = new FileReader();
|
|
reader.onload = (function (file) {
|
|
var attachedFile = {
|
|
binary: file.currentTarget.result,
|
|
name: fileHandler.name
|
|
};
|
|
sendTicketToServer(attachedFile);
|
|
});
|
|
reader.readAsBinaryString(fileHandler);
|
|
}
|
|
else { // Safari hack
|
|
auth.request(baseurl + FILEREADER_URL, {
|
|
method: "POST",
|
|
body: fileHandler,
|
|
headers: {
|
|
"Content-Type": "application/octet-stream",
|
|
"UP-FILENAME": fileHandler.name,
|
|
"UP-SIZE": fileHandler.size,
|
|
"UP-TYPE": fileHandler.type
|
|
}
|
|
}, function(err, data, res) {
|
|
if (res.status === 200) {
|
|
var attachedFile = {
|
|
binary: res.body,
|
|
name: fileHandler.name
|
|
};
|
|
sendTicketToServer(attachedFile);
|
|
}
|
|
else {
|
|
alert("Upload failed", "Uploading the file failed",
|
|
"The server responded with status " + res.status
|
|
+ ". Please try again.");
|
|
}
|
|
});
|
|
}
|
|
}
|
|
else { // no attachment
|
|
sendTicketToServer();
|
|
}
|
|
|
|
function sendTicketToServer(attachedFile) {
|
|
var postData = {
|
|
"subject": subject.getValue(),
|
|
"description": description.getValue(),
|
|
"projectName": c9.projectName,
|
|
"userAgent": navigator.userAgent
|
|
};
|
|
if (attachedFile) {
|
|
postData.attachmentName = attachedFile.name;
|
|
postData.attachmentBinary = attachedFile.binary;
|
|
}
|
|
var keys = Object.keys(postData);
|
|
var keyValueArray = keys.map(function (key) {
|
|
return encodeURIComponent(key) + "="
|
|
+ encodeURIComponent(postData[key]);
|
|
});
|
|
var postString = keyValueArray.join("&");
|
|
|
|
auth.request(baseurl + FILETICKET_URL, {
|
|
method: "POST",
|
|
body: postString,
|
|
contentType: "application/x-www-form-urlencoded"
|
|
}, function callback(err, data, res) {
|
|
if (err || res.status != 200) {
|
|
return alert("Error filing Zendesk ticket",
|
|
"Please email us at support@c9.io",
|
|
typeof data === "string"
|
|
? data : JSON.stringify(data));
|
|
}
|
|
|
|
// Show confirmation message
|
|
confirmationMessage.setAttribute("caption",
|
|
"<center>Thanks for your report.<br><br>"
|
|
+ "Our support team will get in touch<br>"
|
|
+ "with you as soon as possible at<br><b>"
|
|
+ apf.escapeXML(data["email"]) + "</b></center>");
|
|
|
|
form.setProperty("visible", false);
|
|
confirmation.setProperty("visible", true);
|
|
btnSend.hide();
|
|
btnClose.setCaption("Close");
|
|
});
|
|
}
|
|
}
|
|
|
|
function clearFileChooser() {
|
|
// Clear the file chooser. A bit hacky, but it works.
|
|
var fileChooser = document.getElementById("fileChooser");
|
|
fileChooser.innerHTML = fileChooser.innerHTML;
|
|
}
|
|
|
|
function closeWindow() {
|
|
win.hide();
|
|
|
|
// Set the "Report a bug" form back to it's original state
|
|
form.setProperty("visible", true);
|
|
confirmation.setProperty("visible", false);
|
|
btnSend.setAttribute("disabled", false);
|
|
btnSend.show();
|
|
btnClose.setCaption("Cancel");
|
|
subject.setValue("");
|
|
description.setValue("");
|
|
|
|
clearFileChooser();
|
|
}
|
|
|
|
/***** Lifecycle *****/
|
|
|
|
plugin.on("load", function() {
|
|
load();
|
|
});
|
|
plugin.on("enable", function() {
|
|
|
|
});
|
|
plugin.on("disable", function() {
|
|
|
|
});
|
|
plugin.on("unload", function() {
|
|
loaded = false;
|
|
drawn = false;
|
|
});
|
|
|
|
/***** Register and define API *****/
|
|
|
|
/**
|
|
* "File a ticket" module for Cloud9
|
|
*
|
|
* Inserts a menu item under the "Help" menu, which, upon being
|
|
* clicked displays a window where a user can file support ticket.
|
|
*/
|
|
plugin.freezePublicAPI({
|
|
_events: [
|
|
/**
|
|
* @event draw
|
|
*/
|
|
"draw"
|
|
]
|
|
});
|
|
|
|
register(null, {
|
|
"help.support": plugin
|
|
});
|
|
}
|
|
}); |