| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- var
- /**
- * @type {number} next period to wait before next retry in case of failure, in seconds
- **/
- NEXT_RETRY = 5
- /**
- * @type {SlackChan|SlackIms|SlackGroup}
- **/
- ,SELECTED_ROOM = null
- ;
- /**
- * @param {SlackChan|SlackIms|SlackGroup} room
- * @param {function(boolean)} cb
- **/
- function fetchHistory(room, cb) {
- var xhr = new XMLHttpRequest();
- xhr.open('GET', 'api?room=' +room.id, true);
- xhr.send(null);
- }
- function poll(callback) {
- var xhr = new XMLHttpRequest();
- xhr.timeout = 1000 * 60 * 1; // 3 min timeout
- xhr.onreadystatechange = function(e) {
- if (xhr.readyState === 4) {
- if (xhr.status === 0) {
- poll(callback); // retry on timeout
- NEXT_RETRY = 5;
- return;
- }
- var resp = null
- ,success = Math.floor(xhr.status / 100) === 2;
- if (success) {
- NEXT_RETRY = 5;
- resp = xhr.response;
- try {
- resp = JSON.parse(/** @type {string} */ (resp));
- } catch (e) {
- resp = null;
- }
- } else {
- NEXT_RETRY += Math.floor(NEXT_RETRY /2);
- NEXT_RETRY = Math.min(60, NEXT_RETRY);
- }
- callback(success, resp);
- }
- };
- xhr.open('GET', 'api?v=' +SLACK.lastServerVersion, true);
- xhr.send(null);
- }
- /**
- * @param {boolean} success
- * @param {*} response
- **/
- function onPollResponse(success, response) {
- if (success) {
- if (response) {
- SLACK.update(response);
- }
- startPolling();
- } else {
- setTimeout(startPolling, NEXT_RETRY * 1000);
- }
- }
- function startPolling() {
- poll(onPollResponse);
- }
- /**
- * @param {SlackChan|SlackIms|SlackGroup} room
- **/
- function selectRoom(room) {
- if (SELECTED_ROOM)
- unselectRoom();
- document.getElementById(room.id).classList.add(R.klass.selected);
- document.body.classList.remove(R.klass.noRoomSelected);
- SELECTED_ROOM = room;
- onRoomSelected();
- if (SELECTED_ROOM.lastRead && !SLACK.history[SELECTED_ROOM.id]) {
- fetchHistory(SELECTED_ROOM, function(success) {
- if (!success) {
- // TODO handle error
- }
- });
- }
- }
- function unselectRoom() {
- document.getElementById(SELECTED_ROOM.id).classList.remove(R.klass.selected);
- }
|