diff --git a/.gitignore b/.gitignore index ef0c08e..8dc72a4 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,5 @@ node_modules .DS_Store vendor/ + +.idea \ No newline at end of file diff --git a/README.md b/README.md index 5253cfc..f4df5bc 100644 --- a/README.md +++ b/README.md @@ -19,11 +19,11 @@ Installation ## Screenshots -![SC closed](./sc_3_closed.png) +![SC closed](./screenshots/sc_3_closed.png) -![SC open](./sc_3_open.png) +![SC open](./screenshots/sc_3_open.png) -![Options SC](./sc_2-options.png) +![Options SC](./screenshots/sc_4-options.png) ## Development instructions @@ -55,10 +55,11 @@ gulp watch ### Load unpacked in Chrome -1. Go to `Settings` -> `Extensions` -2. Enable `Developer mode` -3. Click `Load unpacked extension...` -4. Select repository directory +1. Clone repository to disk +2. Go to `Settings` -> `Extensions` +3. Enable `Developer mode` +4. Click `Load unpacked extension...` +5. Select repository directory ### Issues diff --git a/assets/js/UrlHelper.js b/assets/js/UrlHelper.js index 52e3b06..5043592 100644 --- a/assets/js/UrlHelper.js +++ b/assets/js/UrlHelper.js @@ -1,7 +1,6 @@ class UrlHelper { - static getDomainFromUrl(url) - { + static getDomainFromUrl(url) { var parts = url.split('/'); return parts[0] + "//" + parts[2]; diff --git a/assets/js/WakaTime.js b/assets/js/WakaTime.js index 97d2820..efee8c4 100644 --- a/assets/js/WakaTime.js +++ b/assets/js/WakaTime.js @@ -1,9 +1,7 @@ -var UrlHelper = require('./UrlHelper'); - -var $ = require('jquery'); - -var currentTimestamp = require('./helpers/currentTimestamp'); -var changeExtensionIcon = require('./helpers/changeExtensionIcon'); +import UrlHelper from './UrlHelper.js'; +import $ from 'jquery'; +import currentTimestamp from './helpers/currentTimestamp.js'; +import changeExtensionIcon from './helpers/changeExtensionIcon.js'; class WakaTime { @@ -18,16 +16,15 @@ class WakaTime { /** * Checks if the user is logged in. * - * @return $.promise() + * @returns {*} */ - checkAuth() - { + checkAuth() { var deferredObject = $.Deferred(); $.ajax({ url: this.currentUserApiUrl, dataType: 'json', - success: (data) => { + success: (data) => { deferredObject.resolve(data.data); @@ -46,14 +43,11 @@ class WakaTime { /** * Depending on various factors detects the current active tab URL or domain, * and sends it to WakaTime for logging. - * - * @return null */ - recordHeartbeat() - { + recordHeartbeat() { this.checkAuth().done(data => { - if(data !== false){ + if (data !== false) { // User is logged in. // Change extension icon to default color. @@ -61,8 +55,7 @@ class WakaTime { chrome.idle.queryState(this.detectionIntervalInSeconds, (newState) => { - if(newState === 'active') - { + if (newState === 'active') { // Get current tab URL. chrome.tabs.query({active: true}, (tabs) => { this.sendHeartbeat(tabs[0].url); @@ -83,13 +76,13 @@ class WakaTime { /** * Creates payload for the heartbeat and returns it as JSON. * - * @param string entity - * @param string type 'domain' or 'url' - * @param boolean debug = false - * @return JSON + * @param entity + * @param type + * @param debug + * @returns {*} + * @private */ - _preparePayload(entity, type, debug = false) - { + _preparePayload(entity, type, debug = false) { return JSON.stringify({ entity: entity, type: type, @@ -98,18 +91,19 @@ class WakaTime { }); } + /** * Returns a promise with logging type variable. * - * @return $.promise + * @returns {*} + * @private */ - _getLoggingType() - { + _getLoggingType() { var deferredObject = $.Deferred(); chrome.storage.sync.get({ loggingType: this.loggingType - }, function(items) { + }, function (items) { deferredObject.resolve(items.loggingType); }); @@ -120,20 +114,21 @@ class WakaTime { * Given the entity and logging type it creates a payload and * sends an ajax post request to the API. * - * @param string entity - * @return null + * @param entity */ - sendHeartbeat(entity) - { + sendHeartbeat(entity) { + + var payload = null; + this._getLoggingType().done((loggingType) => { // Get only the domain from the entity. // And send that in heartbeat - if(loggingType == 'domain') { + if (loggingType == 'domain') { var domain = UrlHelper.getDomainFromUrl(entity); - var payload = this._preparePayload(domain, 'domain'); + payload = this._preparePayload(domain, 'domain'); console.log(payload); @@ -142,7 +137,7 @@ class WakaTime { } // Send entity in heartbeat else if (loggingType == 'url') { - var payload = this._preparePayload(entity, 'url'); + payload = this._preparePayload(entity, 'url'); console.log(payload); @@ -155,9 +150,9 @@ class WakaTime { /** * Sends AJAX request with payload to the heartbeat API as JSON. * - * @param JSON payload - * @param string method = 'POST' - * @return $.promise + * @param payload + * @param method + * @returns {*} */ sendAjaxRequestToApi(payload, method = 'POST') { @@ -169,7 +164,7 @@ class WakaTime { contentType: 'application/json', method: method, data: payload, - success: (response) => { + success: (response) => { deferredObject.resolve(this); diff --git a/assets/js/app.js b/assets/js/app.js index b00cd30..8eb8340 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -2,8 +2,8 @@ global.jQuery = require('jquery'); require('bootstrap'); -var React = require('react'); -var WakaTime = require('./components/WakaTime.react'); +import React from 'react'; +import WakaTime from './components/WakaTime.react.js'; React.render( , diff --git a/assets/js/components/MainList.react.js b/assets/js/components/MainList.react.js index 0b1a404..f7e92ed 100644 --- a/assets/js/components/MainList.react.js +++ b/assets/js/components/MainList.react.js @@ -1,53 +1,51 @@ -var React = require('react'); +import React from 'react'; -class MainList extends React.Component -{ - componentDidMount() - { +class MainList extends React.Component { + componentDidMount() { } - _openOptionsPage() - { - if (chrome.runtime.openOptionsPage) { - // New way to open options pages, if supported (Chrome 42+). - chrome.runtime.openOptionsPage(); - } else { - // Reasonable fallback. - window.open(chrome.runtime.getURL('options.html')); - } + _openOptionsPage() { + if (chrome.runtime.openOptionsPage) { + // New way to open options pages, if supported (Chrome 42+). + chrome.runtime.openOptionsPage(); + } else { + // Reasonable fallback. + window.open(chrome.runtime.getURL('options.html')); + } } - render() - { + render() { var loginLogoutButton = () => { - if(this.props.loggedIn === true) - { + if (this.props.loggedIn === true) { return (
- - Custom Rules - - - Dashboard - - - Logout - + + + Custom Rules + + + + Dashboard + + + + Logout +
); } return ( - Login + + Login ); }; var signedInAs = () => { - if(this.props.loggedIn === true) - { + if (this.props.loggedIn === true) { return (
@@ -56,7 +54,9 @@ class MainList extends React.Component
- Signed in as {this.props.user.full_name}
+ Signed in as + {this.props.user.full_name} +
{this.props.user.email}
@@ -66,14 +66,15 @@ class MainList extends React.Component } }; - return( + return (
{signedInAs()}
- Options + + Options {loginLogoutButton()} diff --git a/assets/js/components/Navbar.react.js b/assets/js/components/Navbar.react.js index 3c8af6a..c88e042 100644 --- a/assets/js/components/Navbar.react.js +++ b/assets/js/components/Navbar.react.js @@ -1,6 +1,6 @@ -var React = require('react'); +import React from 'react'; -class Navbar extends React.Component{ +class Navbar extends React.Component { render() { return ( diff --git a/assets/js/components/WakaTime.react.js b/assets/js/components/WakaTime.react.js index 55ccd8a..cd31cb9 100644 --- a/assets/js/components/WakaTime.react.js +++ b/assets/js/components/WakaTime.react.js @@ -1,15 +1,11 @@ -var React = require("react"); -var $ = require('jquery'); +import React from "react"; +import $ from 'jquery'; +import NavBar from './NavBar.react.js'; +import MainList from './MainList.react.js'; +import changeExtensionIcon from '../helpers/changeExtensionIcon.js'; +import WakaTimeOriginal from '../WakaTime.js'; -var NavBar = require('./NavBar.react'); -var MainList = require('./MainList.react'); - -var changeExtensionIcon = require('../helpers/changeExtensionIcon'); - -var WakaTimeOriginal = require('../WakaTime'); - -class WakaTime extends React.Component -{ +class WakaTime extends React.Component { logoutUserUrl = 'https://wakatime.com/logout'; state = { @@ -21,56 +17,49 @@ class WakaTime extends React.Component loggedIn: false }; - componentDidMount() - { - chrome.storage.sync.get({ - theme: 'light' - }, function(items) { - if(items.theme == 'light') { - changeExtensionIcon(); - } - else { - changeExtensionIcon('white'); - } - }); + componentDidMount() { + chrome.storage.sync.get({ + theme: 'light' + }, function (items) { + if (items.theme == 'light') { + changeExtensionIcon(); + } + else { + changeExtensionIcon('white'); + } + }); - var wakatime = new WakaTimeOriginal; + var wakatime = new WakaTimeOriginal; - wakatime.checkAuth().done(data => { + wakatime.checkAuth().done(data => { - if(data !== false){ + if (data !== false) { - this.setState({ - user: { - full_name: data.full_name, - email: data.email, - photo: data.photo - }, - loggedIn: true - }); + this.setState({ + user: { + full_name: data.full_name, + email: data.email, + photo: data.photo + }, + loggedIn: true + }); - changeExtensionIcon(); - - } - else { - - changeExtensionIcon('red'); - - //TODO: Redirect user to wakatime login page. - // - } - }); + changeExtensionIcon(); + } + else { + changeExtensionIcon('red'); + } + }); } - logoutUser() - { + logoutUser() { var deferredObject = $.Deferred(); $.ajax({ url: this.logoutUserUrl, method: 'GET', - success: () => { + success: () => { deferredObject.resolve(this); @@ -86,8 +75,7 @@ class WakaTime extends React.Component return deferredObject.promise(); } - _logoutUser() - { + _logoutUser() { this.logoutUser().done(() => { this.setState({ @@ -104,9 +92,8 @@ class WakaTime extends React.Component }); } - render() - { - return( + render() { + return (
diff --git a/assets/js/events.js b/assets/js/events.js index d16e988..900d87b 100644 --- a/assets/js/events.js +++ b/assets/js/events.js @@ -1,4 +1,4 @@ -var WakaTime = require('./WakaTime'); +import WakaTime from "./WakaTime.js"; /** * Whenever an alarms sets off, this function @@ -29,15 +29,15 @@ chrome.alarms.create('heartbeatAlarm', {periodInMinutes: 2}); /** * Whenever a active tab is changed it records a heartbeat with that tab url. */ -chrome.tabs.onActivated.addListener(function(activeInfo) { +chrome.tabs.onActivated.addListener(function (activeInfo) { - chrome.tabs.get(activeInfo.tabId, function(tab) { + chrome.tabs.get(activeInfo.tabId, function (tab) { - console.log('recording a heartbeat - active tab changed'); + console.log('recording a heartbeat - active tab changed'); - var wakatime = new WakaTime; + var wakatime = new WakaTime; - wakatime.recordHeartbeat(); + wakatime.recordHeartbeat(); }); }); @@ -46,15 +46,13 @@ chrome.tabs.onActivated.addListener(function(activeInfo) { * Whenever any tab is updated it checks if the updated tab is the tab that is * currently active and if it is, then it records a heartbeat. */ -chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { +chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { - if(changeInfo.status === 'complete') - { + if (changeInfo.status === 'complete') { // Get current tab URL. chrome.tabs.query({active: true}, (tabs) => { // If tab updated is the same as active tab - if(tabId == tabs[0].id) - { + if (tabId == tabs[0].id) { console.log('recording a heartbeat - tab updated'); var wakatime = new WakaTime; diff --git a/assets/js/helpers/changeExtensionIcon.js b/assets/js/helpers/changeExtensionIcon.js index 0b9310f..82e2b51 100644 --- a/assets/js/helpers/changeExtensionIcon.js +++ b/assets/js/helpers/changeExtensionIcon.js @@ -1,13 +1,10 @@ /** * It changes the extension icon color. * Supported values are: 'red', 'white' and ''. - * - * @param string color = '' - * @return null */ export default function changeExtensionIcon(color = '') { - if(color !== ''){ + if (color !== '') { color = '-' + color; } diff --git a/assets/js/helpers/currentTimestamp.js b/assets/js/helpers/currentTimestamp.js index 7a9c124..e441a49 100644 --- a/assets/js/helpers/currentTimestamp.js +++ b/assets/js/helpers/currentTimestamp.js @@ -1,7 +1,5 @@ /** * Returns UNIX timestamp - * - * @return integer */ export default function(){ return Math.round((new Date()).getTime() / 1000); diff --git a/assets/js/options.js b/assets/js/options.js index 450d4c5..43a68f0 100644 --- a/assets/js/options.js +++ b/assets/js/options.js @@ -2,16 +2,13 @@ global.jQuery = require('jquery'); require('bootstrap'); -var $ = require('jquery'); +import $ from "jquery"; -function detectCheckedRadio(name) -{ - for(var i = 0; i < document.getElementsByName(name).length; i++) - { +function detectCheckedRadio(name) { + for (var i = 0; i < document.getElementsByName(name).length; i ++) { var button = document.getElementsByName(name)[i]; - if(button.checked === true) - { + if (button.checked === true) { return button.value; } } @@ -19,45 +16,45 @@ function detectCheckedRadio(name) // Saves options to chrome.storage.sync. function save_options(e) { - e.preventDefault(); + e.preventDefault(); - var theme = document.getElementById('theme').value; - var blacklist = document.getElementById('blacklist').value; - var loggingType = detectCheckedRadio('loggingType'); + var theme = document.getElementById('theme').value; + var blacklist = document.getElementById('blacklist').value; + var loggingType = detectCheckedRadio('loggingType'); - chrome.storage.sync.set({ - theme: theme, - blacklist: blacklist, - loggingType: loggingType - }, function() { - // Update status to let user know options were saved. - var status = $('#status'); - status.html('Well done! Options have been saved.'); + chrome.storage.sync.set({ + theme: theme, + blacklist: blacklist, + loggingType: loggingType + }, function () { + // Update status to let user know options were saved. + var status = $('#status'); + status.html('Well done! Options have been saved.'); - status.fadeIn(1500, function() { - setTimeout(function() { - status.fadeOut(1500, function() { - status.html(''); + status.fadeIn(1500, function () { + setTimeout(function () { + status.fadeOut(1500, function () { + status.html(''); + }); + }, 750); }); - }, 750); - }); - }); + }); } // Restores select box and checkbox state using the preferences // stored in chrome.storage. function restore_options() { - // Use default value color = 'red' and likesColor = true. - chrome.storage.sync.get({ - theme: 'light', - blacklist: '', - loggingType: 'domain' - }, function(items) { - document.getElementById('theme').value = items.theme; - document.getElementById('blacklist').value = items.blacklist; - document.getElementById(items.loggingType + 'Type').checked = true; - }); + // Use default value color = 'red' and likesColor = true. + chrome.storage.sync.get({ + theme: 'light', + blacklist: '', + loggingType: 'domain' + }, function (items) { + document.getElementById('theme').value = items.theme; + document.getElementById('blacklist').value = items.blacklist; + document.getElementById(items.loggingType + 'Type').checked = true; + }); } document.addEventListener('DOMContentLoaded', restore_options); diff --git a/public/js/bundle.js b/public/js/bundle.js index 9854f8d..94f65f0 100644 --- a/public/js/bundle.js +++ b/public/js/bundle.js @@ -3,16 +3,23 @@ /* This is a fix for Bootstrap requiring jQuery */ 'use strict'; +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); + +var _componentsWakaTimeReactJs = require('./components/WakaTime.react.js'); + +var _componentsWakaTimeReactJs2 = _interopRequireDefault(_componentsWakaTimeReactJs); + global.jQuery = require('jquery'); require('bootstrap'); -var React = require('react'); -var WakaTime = require('./components/WakaTime.react'); - -React.render(React.createElement(WakaTime, null), document.getElementById('wakatime')); +_react2['default'].render(_react2['default'].createElement(_componentsWakaTimeReactJs2['default'], null), document.getElementById('wakatime')); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"./components/WakaTime.react":6,"bootstrap":9,"jquery":22,"react":178}],2:[function(require,module,exports){ +},{"./components/WakaTime.react.js":6,"bootstrap":9,"jquery":22,"react":178}],2:[function(require,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -52,14 +59,25 @@ Object.defineProperty(exports, '__esModule', { var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } -var UrlHelper = require('./UrlHelper'); +var _UrlHelperJs = require('./UrlHelper.js'); -var $ = require('jquery'); +var _UrlHelperJs2 = _interopRequireDefault(_UrlHelperJs); -var currentTimestamp = require('./helpers/currentTimestamp'); -var changeExtensionIcon = require('./helpers/changeExtensionIcon'); +var _jquery = require('jquery'); + +var _jquery2 = _interopRequireDefault(_jquery); + +var _helpersCurrentTimestampJs = require('./helpers/currentTimestamp.js'); + +var _helpersCurrentTimestampJs2 = _interopRequireDefault(_helpersCurrentTimestampJs); + +var _helpersChangeExtensionIconJs = require('./helpers/changeExtensionIcon.js'); + +var _helpersChangeExtensionIconJs2 = _interopRequireDefault(_helpersChangeExtensionIconJs); var WakaTime = (function () { function WakaTime() { @@ -73,12 +91,18 @@ var WakaTime = (function () { _createClass(WakaTime, [{ key: 'checkAuth', + + /** + * Checks if the user is logged in. + * + * @returns {*} + */ value: function checkAuth() { var _this = this; - var deferredObject = $.Deferred(); + var deferredObject = _jquery2['default'].Deferred(); - $.ajax({ + _jquery2['default'].ajax({ url: this.currentUserApiUrl, dataType: 'json', success: function success(data) { @@ -97,6 +121,11 @@ var WakaTime = (function () { } }, { key: 'recordHeartbeat', + + /** + * Depending on various factors detects the current active tab URL or domain, + * and sends it to WakaTime for logging. + */ value: function recordHeartbeat() { var _this2 = this; @@ -104,22 +133,15 @@ var WakaTime = (function () { if (data !== false) { - console.log('user is logged id.'); // User is logged in. - changeExtensionIcon(); - - console.log('recording heartbeat.'); + // Change extension icon to default color. + (0, _helpersChangeExtensionIconJs2['default'])(); chrome.idle.queryState(_this2.detectionIntervalInSeconds, function (newState) { - console.log(newState); - if (newState === 'active') { - // Get current tab URL. chrome.tabs.query({ active: true }, function (tabs) { - console.log(tabs[0].url); - _this2.sendHeartbeat(tabs[0].url); }); } @@ -127,31 +149,44 @@ var WakaTime = (function () { } else { // User is not logged in. - changeExtensionIcon('red'); - - console.log('user is not logged id.'); - - //TODO: Redirect user to wakatime login page. - // + // Change extension icon to red color. + (0, _helpersChangeExtensionIconJs2['default'])('red'); } }); } }, { key: '_preparePayload', + + /** + * Creates payload for the heartbeat and returns it as JSON. + * + * @param entity + * @param type + * @param debug + * @returns {*} + * @private + */ value: function _preparePayload(entity, type) { var debug = arguments[2] === undefined ? false : arguments[2]; return JSON.stringify({ entity: entity, type: type, - time: currentTimestamp(), + time: (0, _helpersCurrentTimestampJs2['default'])(), is_debugging: debug }); } }, { key: '_getLoggingType', + + /** + * Returns a promise with logging type variable. + * + * @returns {*} + * @private + */ value: function _getLoggingType() { - var deferredObject = $.Deferred(); + var deferredObject = _jquery2['default'].Deferred(); chrome.storage.sync.get({ loggingType: this.loggingType @@ -163,48 +198,60 @@ var WakaTime = (function () { } }, { key: 'sendHeartbeat', + + /** + * Given the entity and logging type it creates a payload and + * sends an ajax post request to the API. + * + * @param entity + */ value: function sendHeartbeat(entity) { var _this3 = this; + var payload = null; + this._getLoggingType().done(function (loggingType) { + // Get only the domain from the entity. + // And send that in heartbeat if (loggingType == 'domain') { - console.log('sending entity with type domain'); - // Get only the domain from the entity. - // And send that in heartbeat - console.log(UrlHelper.getDomainFromUrl(entity)); + var domain = _UrlHelperJs2['default'].getDomainFromUrl(entity); - var domain = UrlHelper.getDomainFromUrl(entity); - - var payload = _this3._preparePayload(domain, 'domain'); + payload = _this3._preparePayload(domain, 'domain'); console.log(payload); - //this.sendAjaxRequestToApi(payload); - } else if (loggingType == 'url') { - console.log('sending entity with type url'); - - // Send entity in heartbeat - - var payload = _this3._preparePayload(entity, 'url'); + _this3.sendAjaxRequestToApi(payload); + } + // Send entity in heartbeat + else if (loggingType == 'url') { + payload = _this3._preparePayload(entity, 'url'); console.log(payload); - //this.sendAjaxRequestToApi(payload); + _this3.sendAjaxRequestToApi(payload); } }); } }, { key: 'sendAjaxRequestToApi', + + /** + * Sends AJAX request with payload to the heartbeat API as JSON. + * + * @param payload + * @param method + * @returns {*} + */ value: function sendAjaxRequestToApi(payload) { var _this4 = this; var method = arguments[1] === undefined ? 'POST' : arguments[1]; - var deferredObject = $.Deferred(); + var deferredObject = _jquery2['default'].Deferred(); - $.ajax({ + _jquery2['default'].ajax({ url: this.heartbeatApiUrl, dataType: 'json', contentType: 'application/json', @@ -235,7 +282,7 @@ module.exports = exports['default']; //default -},{"./UrlHelper":2,"./helpers/changeExtensionIcon":7,"./helpers/currentTimestamp":8,"jquery":22}],4:[function(require,module,exports){ +},{"./UrlHelper.js":2,"./helpers/changeExtensionIcon.js":7,"./helpers/currentTimestamp.js":8,"jquery":22}],4:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -244,11 +291,15 @@ Object.defineProperty(exports, '__esModule', { var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } -var React = require('react'); +var _react = require('react'); + +var _react2 = _interopRequireDefault(_react); var MainList = (function (_React$Component) { function MainList() { @@ -282,64 +333,64 @@ var MainList = (function (_React$Component) { var loginLogoutButton = function loginLogoutButton() { if (_this.props.loggedIn === true) { - return React.createElement( + return _react2['default'].createElement( 'div', null, - React.createElement( + _react2['default'].createElement( 'a', { target: '_blank', href: 'https://wakatime.com/settings/rules', className: 'list-group-item' }, - React.createElement('i', { className: 'fa fa-fw fa-filter' }), - ' Custom Rules' + _react2['default'].createElement('i', { className: 'fa fa-fw fa-filter' }), + 'Custom Rules' ), - React.createElement( + _react2['default'].createElement( 'a', { target: '_blank', href: 'https://wakatime.com/dashboard', className: 'list-group-item' }, - React.createElement('i', { className: 'fa fa-fw fa-tachometer' }), - ' Dashboard' + _react2['default'].createElement('i', { className: 'fa fa-fw fa-tachometer' }), + 'Dashboard' ), - React.createElement( + _react2['default'].createElement( 'a', { href: '#', className: 'list-group-item', onClick: _this.props.logoutUser }, - React.createElement('i', { className: 'fa fa-fw fa-sign-out' }), - ' Logout' + _react2['default'].createElement('i', { className: 'fa fa-fw fa-sign-out' }), + 'Logout' ) ); } - return React.createElement( + return _react2['default'].createElement( 'a', { target: '_blank', href: 'https://wakatime.com/login', className: 'list-group-item' }, - React.createElement('i', { className: 'fa fa-fw fa-sign-in' }), - ' Login' + _react2['default'].createElement('i', { className: 'fa fa-fw fa-sign-in' }), + 'Login' ); }; var signedInAs = function signedInAs() { if (_this.props.loggedIn === true) { - return React.createElement( + return _react2['default'].createElement( 'div', { className: 'panel panel-default' }, - React.createElement( + _react2['default'].createElement( 'div', { className: 'panel-body' }, - React.createElement( + _react2['default'].createElement( 'div', { className: 'row' }, - React.createElement( + _react2['default'].createElement( 'div', { className: 'col-xs-2' }, - React.createElement('img', { className: 'img-circle', width: '48', height: '48', src: _this.props.user.photo }) + _react2['default'].createElement('img', { className: 'img-circle', width: '48', height: '48', src: _this.props.user.photo }) ), - React.createElement( + _react2['default'].createElement( 'div', { className: 'col-xs-10' }, - 'Signed in as ', - React.createElement( + 'Signed in as', + _react2['default'].createElement( 'b', null, _this.props.user.full_name ), - React.createElement('br', null), + _react2['default'].createElement('br', null), _this.props.user.email ) ) @@ -348,18 +399,18 @@ var MainList = (function (_React$Component) { } }; - return React.createElement( + return _react2['default'].createElement( 'div', null, signedInAs(), - React.createElement( + _react2['default'].createElement( 'div', { className: 'list-group' }, - React.createElement( + _react2['default'].createElement( 'a', { href: '#', className: 'list-group-item', onClick: this._openOptionsPage }, - React.createElement('i', { className: 'fa fa-fw fa-cogs' }), - ' Options' + _react2['default'].createElement('i', { className: 'fa fa-fw fa-cogs' }), + 'Options' ), loginLogoutButton() ) @@ -368,7 +419,7 @@ var MainList = (function (_React$Component) { }]); return MainList; -})(React.Component); +})(_react2['default'].Component); exports['default'] = MainList; module.exports = exports['default']; @@ -382,11 +433,15 @@ Object.defineProperty(exports, "__esModule", { var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } -var React = require("react"); +var _react = require("react"); + +var _react2 = _interopRequireDefault(_react); var Navbar = (function (_React$Component) { function Navbar() { @@ -402,68 +457,68 @@ var Navbar = (function (_React$Component) { _createClass(Navbar, [{ key: "render", value: function render() { - return React.createElement( + return _react2["default"].createElement( "nav", { className: "navbar navbar-default", role: "navigation" }, - React.createElement( + _react2["default"].createElement( "div", { className: "container-fluid" }, - React.createElement( + _react2["default"].createElement( "div", { className: "navbar-header" }, - React.createElement( + _react2["default"].createElement( "button", { type: "button", className: "navbar-toggle collapsed", "data-toggle": "collapse", "data-target": "#bs-example-navbar-collapse-1" }, - React.createElement( + _react2["default"].createElement( "span", { className: "sr-only" }, "Toggle navigation" ), - React.createElement("i", { className: "fa fa-fw fa-cogs" }) + _react2["default"].createElement("i", { className: "fa fa-fw fa-cogs" }) ), - React.createElement( + _react2["default"].createElement( "a", { target: "_blank", className: "navbar-brand", href: "https://wakatime.com" }, "WakaTime", - React.createElement("img", { src: "graphics/wakatime-logo-48.png" }) + _react2["default"].createElement("img", { src: "graphics/wakatime-logo-48.png" }) ) ), - React.createElement( + _react2["default"].createElement( "div", { className: "collapse navbar-collapse", id: "bs-example-navbar-collapse-1" }, - React.createElement( + _react2["default"].createElement( "ul", { className: "nav navbar-nav" }, - React.createElement( + _react2["default"].createElement( "li", { className: "dropdown" }, - React.createElement( + _react2["default"].createElement( "a", { href: "#", className: "dropdown-toggle", "data-toggle": "dropdown", role: "button", "aria-expanded": "false" }, - React.createElement("i", { className: "fa fa-fw fa-info" }), + _react2["default"].createElement("i", { className: "fa fa-fw fa-info" }), "About", - React.createElement("span", { className: "caret" }) + _react2["default"].createElement("span", { className: "caret" }) ), - React.createElement( + _react2["default"].createElement( "ul", { className: "dropdown-menu", role: "menu" }, - React.createElement( + _react2["default"].createElement( "li", null, - React.createElement( + _react2["default"].createElement( "a", { target: "_blank", href: "https://github.com/wakatime/chrome-wakatime/issues" }, - React.createElement("i", { className: "fa fa-fw fa-bug" }), + _react2["default"].createElement("i", { className: "fa fa-fw fa-bug" }), "Report an Issue" ) ), - React.createElement( + _react2["default"].createElement( "li", null, - React.createElement( + _react2["default"].createElement( "a", { target: "_blank", href: "https://github.com/wakatime/chrome-wakatime" }, - React.createElement("i", { className: "fa fa-fw fa-github" }), + _react2["default"].createElement("i", { className: "fa fa-fw fa-github" }), "View on GitHub" ) ) @@ -477,7 +532,7 @@ var Navbar = (function (_React$Component) { }]); return Navbar; -})(React.Component); +})(_react2["default"].Component); exports["default"] = Navbar; module.exports = exports["default"]; @@ -491,19 +546,35 @@ Object.defineProperty(exports, '__esModule', { var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) subClass.__proto__ = superClass; } -var React = require('react'); -var $ = require('jquery'); +var _react = require('react'); -var NavBar = require('./NavBar.react'); -var MainList = require('./MainList.react'); +var _react2 = _interopRequireDefault(_react); -var changeExtensionIcon = require('../helpers/changeExtensionIcon'); +var _jquery = require('jquery'); -var WakaTimeOriginal = require('../WakaTime'); +var _jquery2 = _interopRequireDefault(_jquery); + +var _NavBarReactJs = require('./NavBar.react.js'); + +var _NavBarReactJs2 = _interopRequireDefault(_NavBarReactJs); + +var _MainListReactJs = require('./MainList.react.js'); + +var _MainListReactJs2 = _interopRequireDefault(_MainListReactJs); + +var _helpersChangeExtensionIconJs = require('../helpers/changeExtensionIcon.js'); + +var _helpersChangeExtensionIconJs2 = _interopRequireDefault(_helpersChangeExtensionIconJs); + +var _WakaTimeJs = require('../WakaTime.js'); + +var _WakaTimeJs2 = _interopRequireDefault(_WakaTimeJs); var WakaTime = (function (_React$Component) { function WakaTime() { @@ -535,13 +606,13 @@ var WakaTime = (function (_React$Component) { theme: 'light' }, function (items) { if (items.theme == 'light') { - changeExtensionIcon(); + (0, _helpersChangeExtensionIconJs2['default'])(); } else { - changeExtensionIcon('white'); + (0, _helpersChangeExtensionIconJs2['default'])('white'); } }); - var wakatime = new WakaTimeOriginal(); + var wakatime = new _WakaTimeJs2['default'](); wakatime.checkAuth().done(function (data) { @@ -556,13 +627,9 @@ var WakaTime = (function (_React$Component) { loggedIn: true }); - changeExtensionIcon(); + (0, _helpersChangeExtensionIconJs2['default'])(); } else { - - changeExtensionIcon('red'); - - //TODO: Redirect user to wakatime login page. - // + (0, _helpersChangeExtensionIconJs2['default'])('red'); } }); } @@ -571,9 +638,9 @@ var WakaTime = (function (_React$Component) { value: function logoutUser() { var _this2 = this; - var deferredObject = $.Deferred(); + var deferredObject = _jquery2['default'].Deferred(); - $.ajax({ + _jquery2['default'].ajax({ url: this.logoutUserUrl, method: 'GET', success: function success() { @@ -606,26 +673,26 @@ var WakaTime = (function (_React$Component) { loggedIn: false }); - changeExtensionIcon('red'); + (0, _helpersChangeExtensionIconJs2['default'])('red'); }); } }, { key: 'render', value: function render() { - return React.createElement( + return _react2['default'].createElement( 'div', null, - React.createElement(NavBar, null), - React.createElement( + _react2['default'].createElement(_NavBarReactJs2['default'], null), + _react2['default'].createElement( 'div', { className: 'container' }, - React.createElement( + _react2['default'].createElement( 'div', { className: 'row' }, - React.createElement( + _react2['default'].createElement( 'div', { className: 'col-md-12' }, - React.createElement(MainList, { user: this.state.user, logoutUser: this._logoutUser.bind(this), loggedIn: this.state.loggedIn }) + _react2['default'].createElement(_MainListReactJs2['default'], { user: this.state.user, logoutUser: this._logoutUser.bind(this), loggedIn: this.state.loggedIn }) ) ) ) @@ -634,18 +701,15 @@ var WakaTime = (function (_React$Component) { }]); return WakaTime; -})(React.Component); +})(_react2['default'].Component); exports['default'] = WakaTime; module.exports = exports['default']; -},{"../WakaTime":3,"../helpers/changeExtensionIcon":7,"./MainList.react":4,"./NavBar.react":5,"jquery":22,"react":178}],7:[function(require,module,exports){ +},{"../WakaTime.js":3,"../helpers/changeExtensionIcon.js":7,"./MainList.react.js":4,"./NavBar.react.js":5,"jquery":22,"react":178}],7:[function(require,module,exports){ /** * It changes the extension icon color. * Supported values are: 'red', 'white' and ''. - * - * @param string color = '' - * @return null */ 'use strict'; @@ -671,14 +735,17 @@ function changeExtensionIcon() { module.exports = exports['default']; },{}],8:[function(require,module,exports){ +/** + * Returns UNIX timestamp + */ "use strict"; Object.defineProperty(exports, "__esModule", { - value: true + value: true }); exports["default"] = function () { - return Math.round(new Date().getTime() / 1000); + return Math.round(new Date().getTime() / 1000); }; module.exports = exports["default"]; diff --git a/public/js/events.js b/public/js/events.js index fe722b6..b6cc437 100644 --- a/public/js/events.js +++ b/public/js/events.js @@ -1,7 +1,11 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;oWell done! Options have been saved.'); + chrome.storage.sync.set({ + theme: theme, + blacklist: blacklist, + loggingType: loggingType + }, function () { + // Update status to let user know options were saved. + var status = (0, _jquery2['default'])('#status'); + status.html('Well done! Options have been saved.'); - status.fadeIn(1500, function () { - setTimeout(function () { - status.fadeOut(1500, function () { - status.html(''); + status.fadeIn(1500, function () { + setTimeout(function () { + status.fadeOut(1500, function () { + status.html(''); + }); + }, 750); }); - }, 750); }); - }); } // Restores select box and checkbox state using the preferences // stored in chrome.storage. function restore_options() { - // Use default value color = 'red' and likesColor = true. - chrome.storage.sync.get({ - theme: 'light', - blacklist: '', - loggingType: 'domain' - }, function (items) { - document.getElementById('theme').value = items.theme; - document.getElementById('blacklist').value = items.blacklist; - document.getElementById(items.loggingType + 'Type').checked = true; - }); + // Use default value color = 'red' and likesColor = true. + chrome.storage.sync.get({ + theme: 'light', + blacklist: '', + loggingType: 'domain' + }, function (items) { + document.getElementById('theme').value = items.theme; + document.getElementById('blacklist').value = items.blacklist; + document.getElementById(items.loggingType + 'Type').checked = true; + }); } document.addEventListener('DOMContentLoaded', restore_options); diff --git a/sc_1.png b/screenshots/sc_1.png similarity index 100% rename from sc_1.png rename to screenshots/sc_1.png diff --git a/sc_2-options.png b/screenshots/sc_2-options.png similarity index 100% rename from sc_2-options.png rename to screenshots/sc_2-options.png diff --git a/sc_3_closed.png b/screenshots/sc_3_closed.png similarity index 100% rename from sc_3_closed.png rename to screenshots/sc_3_closed.png diff --git a/sc_3_open.png b/screenshots/sc_3_open.png similarity index 100% rename from sc_3_open.png rename to screenshots/sc_3_open.png diff --git a/screenshots/sc_4-options.png b/screenshots/sc_4-options.png new file mode 100644 index 0000000..b122735 Binary files /dev/null and b/screenshots/sc_4-options.png differ