Minor optimizations.

This commit is contained in:
Mario Basic
2015-06-07 21:53:47 +02:00
parent 7e1d3b3595
commit a2ed4e5acd
20 changed files with 450 additions and 393 deletions

2
.gitignore vendored
View File

@@ -27,3 +27,5 @@ node_modules
.DS_Store .DS_Store
vendor/ vendor/
.idea

View File

@@ -19,11 +19,11 @@ Installation
## Screenshots ## 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 ## Development instructions
@@ -55,10 +55,11 @@ gulp watch
### Load unpacked in Chrome ### Load unpacked in Chrome
1. Go to `Settings` -> `Extensions` 1. Clone repository to disk
2. Enable `Developer mode` 2. Go to `Settings` -> `Extensions`
3. Click `Load unpacked extension...` 3. Enable `Developer mode`
4. Select repository directory 4. Click `Load unpacked extension...`
5. Select repository directory
### Issues ### Issues

View File

@@ -1,7 +1,6 @@
class UrlHelper { class UrlHelper {
static getDomainFromUrl(url) static getDomainFromUrl(url) {
{
var parts = url.split('/'); var parts = url.split('/');
return parts[0] + "//" + parts[2]; return parts[0] + "//" + parts[2];

View File

@@ -1,9 +1,7 @@
var UrlHelper = require('./UrlHelper'); import UrlHelper from './UrlHelper.js';
import $ from 'jquery';
var $ = require('jquery'); import currentTimestamp from './helpers/currentTimestamp.js';
import changeExtensionIcon from './helpers/changeExtensionIcon.js';
var currentTimestamp = require('./helpers/currentTimestamp');
var changeExtensionIcon = require('./helpers/changeExtensionIcon');
class WakaTime { class WakaTime {
@@ -18,16 +16,15 @@ class WakaTime {
/** /**
* Checks if the user is logged in. * Checks if the user is logged in.
* *
* @return $.promise() * @returns {*}
*/ */
checkAuth() checkAuth() {
{
var deferredObject = $.Deferred(); var deferredObject = $.Deferred();
$.ajax({ $.ajax({
url: this.currentUserApiUrl, url: this.currentUserApiUrl,
dataType: 'json', dataType: 'json',
success: (data) => { success: (data) => {
deferredObject.resolve(data.data); deferredObject.resolve(data.data);
@@ -46,14 +43,11 @@ class WakaTime {
/** /**
* Depending on various factors detects the current active tab URL or domain, * Depending on various factors detects the current active tab URL or domain,
* and sends it to WakaTime for logging. * and sends it to WakaTime for logging.
*
* @return null
*/ */
recordHeartbeat() recordHeartbeat() {
{
this.checkAuth().done(data => { this.checkAuth().done(data => {
if(data !== false){ if (data !== false) {
// User is logged in. // User is logged in.
// Change extension icon to default color. // Change extension icon to default color.
@@ -61,8 +55,7 @@ class WakaTime {
chrome.idle.queryState(this.detectionIntervalInSeconds, (newState) => { chrome.idle.queryState(this.detectionIntervalInSeconds, (newState) => {
if(newState === 'active') if (newState === 'active') {
{
// Get current tab URL. // Get current tab URL.
chrome.tabs.query({active: true}, (tabs) => { chrome.tabs.query({active: true}, (tabs) => {
this.sendHeartbeat(tabs[0].url); this.sendHeartbeat(tabs[0].url);
@@ -83,13 +76,13 @@ class WakaTime {
/** /**
* Creates payload for the heartbeat and returns it as JSON. * Creates payload for the heartbeat and returns it as JSON.
* *
* @param string entity * @param entity
* @param string type 'domain' or 'url' * @param type
* @param boolean debug = false * @param debug
* @return JSON * @returns {*}
* @private
*/ */
_preparePayload(entity, type, debug = false) _preparePayload(entity, type, debug = false) {
{
return JSON.stringify({ return JSON.stringify({
entity: entity, entity: entity,
type: type, type: type,
@@ -98,18 +91,19 @@ class WakaTime {
}); });
} }
/** /**
* Returns a promise with logging type variable. * Returns a promise with logging type variable.
* *
* @return $.promise * @returns {*}
* @private
*/ */
_getLoggingType() _getLoggingType() {
{
var deferredObject = $.Deferred(); var deferredObject = $.Deferred();
chrome.storage.sync.get({ chrome.storage.sync.get({
loggingType: this.loggingType loggingType: this.loggingType
}, function(items) { }, function (items) {
deferredObject.resolve(items.loggingType); deferredObject.resolve(items.loggingType);
}); });
@@ -120,20 +114,21 @@ class WakaTime {
* Given the entity and logging type it creates a payload and * Given the entity and logging type it creates a payload and
* sends an ajax post request to the API. * sends an ajax post request to the API.
* *
* @param string entity * @param entity
* @return null
*/ */
sendHeartbeat(entity) sendHeartbeat(entity) {
{
var payload = null;
this._getLoggingType().done((loggingType) => { this._getLoggingType().done((loggingType) => {
// Get only the domain from the entity. // Get only the domain from the entity.
// And send that in heartbeat // And send that in heartbeat
if(loggingType == 'domain') { if (loggingType == 'domain') {
var domain = UrlHelper.getDomainFromUrl(entity); var domain = UrlHelper.getDomainFromUrl(entity);
var payload = this._preparePayload(domain, 'domain'); payload = this._preparePayload(domain, 'domain');
console.log(payload); console.log(payload);
@@ -142,7 +137,7 @@ class WakaTime {
} }
// Send entity in heartbeat // Send entity in heartbeat
else if (loggingType == 'url') { else if (loggingType == 'url') {
var payload = this._preparePayload(entity, 'url'); payload = this._preparePayload(entity, 'url');
console.log(payload); console.log(payload);
@@ -155,9 +150,9 @@ class WakaTime {
/** /**
* Sends AJAX request with payload to the heartbeat API as JSON. * Sends AJAX request with payload to the heartbeat API as JSON.
* *
* @param JSON payload * @param payload
* @param string method = 'POST' * @param method
* @return $.promise * @returns {*}
*/ */
sendAjaxRequestToApi(payload, method = 'POST') { sendAjaxRequestToApi(payload, method = 'POST') {
@@ -169,7 +164,7 @@ class WakaTime {
contentType: 'application/json', contentType: 'application/json',
method: method, method: method,
data: payload, data: payload,
success: (response) => { success: (response) => {
deferredObject.resolve(this); deferredObject.resolve(this);

View File

@@ -2,8 +2,8 @@
global.jQuery = require('jquery'); global.jQuery = require('jquery');
require('bootstrap'); require('bootstrap');
var React = require('react'); import React from 'react';
var WakaTime = require('./components/WakaTime.react'); import WakaTime from './components/WakaTime.react.js';
React.render( React.render(
<WakaTime />, <WakaTime />,

View File

@@ -1,53 +1,51 @@
var React = require('react'); import React from 'react';
class MainList extends React.Component class MainList extends React.Component {
{ componentDidMount() {
componentDidMount()
{
} }
_openOptionsPage() _openOptionsPage() {
{ if (chrome.runtime.openOptionsPage) {
if (chrome.runtime.openOptionsPage) { // New way to open options pages, if supported (Chrome 42+).
// New way to open options pages, if supported (Chrome 42+). chrome.runtime.openOptionsPage();
chrome.runtime.openOptionsPage(); } else {
} else { // Reasonable fallback.
// Reasonable fallback. window.open(chrome.runtime.getURL('options.html'));
window.open(chrome.runtime.getURL('options.html')); }
}
} }
render() render() {
{
var loginLogoutButton = () => { var loginLogoutButton = () => {
if(this.props.loggedIn === true) if (this.props.loggedIn === true) {
{
return ( return (
<div> <div>
<a target="_blank" href="https://wakatime.com/settings/rules" className="list-group-item"> <a target="_blank" href="https://wakatime.com/settings/rules" className="list-group-item">
<i className="fa fa-fw fa-filter"></i> Custom Rules <i className="fa fa-fw fa-filter"></i>
</a> Custom Rules
<a target="_blank" href="https://wakatime.com/dashboard" className="list-group-item"> </a>
<i className="fa fa-fw fa-tachometer"></i> Dashboard <a target="_blank" href="https://wakatime.com/dashboard" className="list-group-item">
</a> <i className="fa fa-fw fa-tachometer"></i>
<a href="#" className="list-group-item" onClick={this.props.logoutUser}> Dashboard
<i className="fa fa-fw fa-sign-out"></i> Logout </a>
</a> <a href="#" className="list-group-item" onClick={this.props.logoutUser}>
<i className="fa fa-fw fa-sign-out"></i>
Logout
</a>
</div> </div>
); );
} }
return ( return (
<a target="_blank" href="https://wakatime.com/login" className="list-group-item"> <a target="_blank" href="https://wakatime.com/login" className="list-group-item">
<i className="fa fa-fw fa-sign-in"></i> Login <i className="fa fa-fw fa-sign-in"></i>
Login
</a> </a>
); );
}; };
var signedInAs = () => { var signedInAs = () => {
if(this.props.loggedIn === true) if (this.props.loggedIn === true) {
{
return ( return (
<div className="panel panel-default"> <div className="panel panel-default">
<div className="panel-body"> <div className="panel-body">
@@ -56,7 +54,9 @@ class MainList extends React.Component
<img className="img-circle" width="48" height="48" src={this.props.user.photo} /> <img className="img-circle" width="48" height="48" src={this.props.user.photo} />
</div> </div>
<div className="col-xs-10"> <div className="col-xs-10">
Signed in as <b>{this.props.user.full_name}</b><br /> Signed in as
<b>{this.props.user.full_name}</b>
<br />
{this.props.user.email} {this.props.user.email}
</div> </div>
</div> </div>
@@ -66,14 +66,15 @@ class MainList extends React.Component
} }
}; };
return( return (
<div> <div>
{signedInAs()} {signedInAs()}
<div className="list-group"> <div className="list-group">
<a href="#" className="list-group-item" onClick={this._openOptionsPage}> <a href="#" className="list-group-item" onClick={this._openOptionsPage}>
<i className="fa fa-fw fa-cogs"></i> Options <i className="fa fa-fw fa-cogs"></i>
Options
</a> </a>
{loginLogoutButton()} {loginLogoutButton()}

View File

@@ -1,6 +1,6 @@
var React = require('react'); import React from 'react';
class Navbar extends React.Component{ class Navbar extends React.Component {
render() { render() {
return ( return (

View File

@@ -1,15 +1,11 @@
var React = require("react"); import React from "react";
var $ = require('jquery'); 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'); class WakaTime extends React.Component {
var MainList = require('./MainList.react');
var changeExtensionIcon = require('../helpers/changeExtensionIcon');
var WakaTimeOriginal = require('../WakaTime');
class WakaTime extends React.Component
{
logoutUserUrl = 'https://wakatime.com/logout'; logoutUserUrl = 'https://wakatime.com/logout';
state = { state = {
@@ -21,56 +17,49 @@ class WakaTime extends React.Component
loggedIn: false loggedIn: false
}; };
componentDidMount() componentDidMount() {
{ chrome.storage.sync.get({
chrome.storage.sync.get({ theme: 'light'
theme: 'light' }, function (items) {
}, function(items) { if (items.theme == 'light') {
if(items.theme == 'light') { changeExtensionIcon();
changeExtensionIcon(); }
} else {
else { changeExtensionIcon('white');
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({ this.setState({
user: { user: {
full_name: data.full_name, full_name: data.full_name,
email: data.email, email: data.email,
photo: data.photo photo: data.photo
}, },
loggedIn: true loggedIn: true
}); });
changeExtensionIcon(); changeExtensionIcon();
}
} else {
else { changeExtensionIcon('red');
}
changeExtensionIcon('red'); });
//TODO: Redirect user to wakatime login page.
//
}
});
} }
logoutUser() logoutUser() {
{
var deferredObject = $.Deferred(); var deferredObject = $.Deferred();
$.ajax({ $.ajax({
url: this.logoutUserUrl, url: this.logoutUserUrl,
method: 'GET', method: 'GET',
success: () => { success: () => {
deferredObject.resolve(this); deferredObject.resolve(this);
@@ -86,8 +75,7 @@ class WakaTime extends React.Component
return deferredObject.promise(); return deferredObject.promise();
} }
_logoutUser() _logoutUser() {
{
this.logoutUser().done(() => { this.logoutUser().done(() => {
this.setState({ this.setState({
@@ -104,9 +92,8 @@ class WakaTime extends React.Component
}); });
} }
render() render() {
{ return (
return(
<div> <div>
<NavBar /> <NavBar />
<div className="container"> <div className="container">

View File

@@ -1,4 +1,4 @@
var WakaTime = require('./WakaTime'); import WakaTime from "./WakaTime.js";
/** /**
* Whenever an alarms sets off, this function * 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. * 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 * 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. * 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. // Get current tab URL.
chrome.tabs.query({active: true}, (tabs) => { chrome.tabs.query({active: true}, (tabs) => {
// If tab updated is the same as active tab // 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'); console.log('recording a heartbeat - tab updated');
var wakatime = new WakaTime; var wakatime = new WakaTime;

View File

@@ -1,13 +1,10 @@
/** /**
* It changes the extension icon color. * It changes the extension icon color.
* Supported values are: 'red', 'white' and ''. * Supported values are: 'red', 'white' and ''.
*
* @param string color = ''
* @return null
*/ */
export default function changeExtensionIcon(color = '') { export default function changeExtensionIcon(color = '') {
if(color !== ''){ if (color !== '') {
color = '-' + color; color = '-' + color;
} }

View File

@@ -1,7 +1,5 @@
/** /**
* Returns UNIX timestamp * Returns UNIX timestamp
*
* @return integer
*/ */
export default function(){ export default function(){
return Math.round((new Date()).getTime() / 1000); return Math.round((new Date()).getTime() / 1000);

View File

@@ -2,16 +2,13 @@
global.jQuery = require('jquery'); global.jQuery = require('jquery');
require('bootstrap'); require('bootstrap');
var $ = require('jquery'); import $ from "jquery";
function detectCheckedRadio(name) function detectCheckedRadio(name) {
{ for (var i = 0; i < document.getElementsByName(name).length; i ++) {
for(var i = 0; i < document.getElementsByName(name).length; i++)
{
var button = document.getElementsByName(name)[i]; var button = document.getElementsByName(name)[i];
if(button.checked === true) if (button.checked === true) {
{
return button.value; return button.value;
} }
} }
@@ -19,45 +16,45 @@ function detectCheckedRadio(name)
// Saves options to chrome.storage.sync. // Saves options to chrome.storage.sync.
function save_options(e) { function save_options(e) {
e.preventDefault(); e.preventDefault();
var theme = document.getElementById('theme').value; var theme = document.getElementById('theme').value;
var blacklist = document.getElementById('blacklist').value; var blacklist = document.getElementById('blacklist').value;
var loggingType = detectCheckedRadio('loggingType'); var loggingType = detectCheckedRadio('loggingType');
chrome.storage.sync.set({ chrome.storage.sync.set({
theme: theme, theme: theme,
blacklist: blacklist, blacklist: blacklist,
loggingType: loggingType loggingType: loggingType
}, function() { }, function () {
// Update status to let user know options were saved. // Update status to let user know options were saved.
var status = $('#status'); var status = $('#status');
status.html('<strong>Well done!</strong> Options have been saved.'); status.html('<strong>Well done!</strong> Options have been saved.');
status.fadeIn(1500, function() { status.fadeIn(1500, function () {
setTimeout(function() { setTimeout(function () {
status.fadeOut(1500, function() { status.fadeOut(1500, function () {
status.html(''); status.html('');
});
}, 750);
}); });
}, 750);
});
}); });
} }
// Restores select box and checkbox state using the preferences // Restores select box and checkbox state using the preferences
// stored in chrome.storage. // stored in chrome.storage.
function restore_options() { function restore_options() {
// Use default value color = 'red' and likesColor = true. // Use default value color = 'red' and likesColor = true.
chrome.storage.sync.get({ chrome.storage.sync.get({
theme: 'light', theme: 'light',
blacklist: '', blacklist: '',
loggingType: 'domain' loggingType: 'domain'
}, function(items) { }, function (items) {
document.getElementById('theme').value = items.theme; document.getElementById('theme').value = items.theme;
document.getElementById('blacklist').value = items.blacklist; document.getElementById('blacklist').value = items.blacklist;
document.getElementById(items.loggingType + 'Type').checked = true; document.getElementById(items.loggingType + 'Type').checked = true;
}); });
} }
document.addEventListener('DOMContentLoaded', restore_options); document.addEventListener('DOMContentLoaded', restore_options);

View File

@@ -3,16 +3,23 @@
/* This is a fix for Bootstrap requiring jQuery */ /* This is a fix for Bootstrap requiring jQuery */
'use strict'; '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'); global.jQuery = require('jquery');
require('bootstrap'); require('bootstrap');
var React = require('react'); _react2['default'].render(_react2['default'].createElement(_componentsWakaTimeReactJs2['default'], null), document.getElementById('wakatime'));
var WakaTime = require('./components/WakaTime.react');
React.render(React.createElement(WakaTime, null), document.getElementById('wakatime'));
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) }).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"; "use strict";
Object.defineProperty(exports, "__esModule", { 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; }; })(); 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 _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 _jquery = require('jquery');
var changeExtensionIcon = require('./helpers/changeExtensionIcon');
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 () { var WakaTime = (function () {
function WakaTime() { function WakaTime() {
@@ -73,12 +91,18 @@ var WakaTime = (function () {
_createClass(WakaTime, [{ _createClass(WakaTime, [{
key: 'checkAuth', key: 'checkAuth',
/**
* Checks if the user is logged in.
*
* @returns {*}
*/
value: function checkAuth() { value: function checkAuth() {
var _this = this; var _this = this;
var deferredObject = $.Deferred(); var deferredObject = _jquery2['default'].Deferred();
$.ajax({ _jquery2['default'].ajax({
url: this.currentUserApiUrl, url: this.currentUserApiUrl,
dataType: 'json', dataType: 'json',
success: function success(data) { success: function success(data) {
@@ -97,6 +121,11 @@ var WakaTime = (function () {
} }
}, { }, {
key: 'recordHeartbeat', key: 'recordHeartbeat',
/**
* Depending on various factors detects the current active tab URL or domain,
* and sends it to WakaTime for logging.
*/
value: function recordHeartbeat() { value: function recordHeartbeat() {
var _this2 = this; var _this2 = this;
@@ -104,22 +133,15 @@ var WakaTime = (function () {
if (data !== false) { if (data !== false) {
console.log('user is logged id.');
// User is logged in. // User is logged in.
changeExtensionIcon(); // Change extension icon to default color.
(0, _helpersChangeExtensionIconJs2['default'])();
console.log('recording heartbeat.');
chrome.idle.queryState(_this2.detectionIntervalInSeconds, function (newState) { chrome.idle.queryState(_this2.detectionIntervalInSeconds, function (newState) {
console.log(newState);
if (newState === 'active') { if (newState === 'active') {
// Get current tab URL. // Get current tab URL.
chrome.tabs.query({ active: true }, function (tabs) { chrome.tabs.query({ active: true }, function (tabs) {
console.log(tabs[0].url);
_this2.sendHeartbeat(tabs[0].url); _this2.sendHeartbeat(tabs[0].url);
}); });
} }
@@ -127,31 +149,44 @@ var WakaTime = (function () {
} else { } else {
// User is not logged in. // User is not logged in.
changeExtensionIcon('red'); // Change extension icon to red color.
(0, _helpersChangeExtensionIconJs2['default'])('red');
console.log('user is not logged id.');
//TODO: Redirect user to wakatime login page.
//
} }
}); });
} }
}, { }, {
key: '_preparePayload', 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) { value: function _preparePayload(entity, type) {
var debug = arguments[2] === undefined ? false : arguments[2]; var debug = arguments[2] === undefined ? false : arguments[2];
return JSON.stringify({ return JSON.stringify({
entity: entity, entity: entity,
type: type, type: type,
time: currentTimestamp(), time: (0, _helpersCurrentTimestampJs2['default'])(),
is_debugging: debug is_debugging: debug
}); });
} }
}, { }, {
key: '_getLoggingType', key: '_getLoggingType',
/**
* Returns a promise with logging type variable.
*
* @returns {*}
* @private
*/
value: function _getLoggingType() { value: function _getLoggingType() {
var deferredObject = $.Deferred(); var deferredObject = _jquery2['default'].Deferred();
chrome.storage.sync.get({ chrome.storage.sync.get({
loggingType: this.loggingType loggingType: this.loggingType
@@ -163,48 +198,60 @@ var WakaTime = (function () {
} }
}, { }, {
key: 'sendHeartbeat', 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) { value: function sendHeartbeat(entity) {
var _this3 = this; var _this3 = this;
var payload = null;
this._getLoggingType().done(function (loggingType) { this._getLoggingType().done(function (loggingType) {
// Get only the domain from the entity.
// And send that in heartbeat
if (loggingType == 'domain') { if (loggingType == 'domain') {
console.log('sending entity with type domain');
// Get only the domain from the entity. var domain = _UrlHelperJs2['default'].getDomainFromUrl(entity);
// And send that in heartbeat
console.log(UrlHelper.getDomainFromUrl(entity));
var domain = UrlHelper.getDomainFromUrl(entity); payload = _this3._preparePayload(domain, 'domain');
var payload = _this3._preparePayload(domain, 'domain');
console.log(payload); console.log(payload);
//this.sendAjaxRequestToApi(payload); _this3.sendAjaxRequestToApi(payload);
} else if (loggingType == 'url') { }
console.log('sending entity with type url'); // Send entity in heartbeat
else if (loggingType == 'url') {
// Send entity in heartbeat payload = _this3._preparePayload(entity, 'url');
var payload = _this3._preparePayload(entity, 'url');
console.log(payload); console.log(payload);
//this.sendAjaxRequestToApi(payload); _this3.sendAjaxRequestToApi(payload);
} }
}); });
} }
}, { }, {
key: 'sendAjaxRequestToApi', key: 'sendAjaxRequestToApi',
/**
* Sends AJAX request with payload to the heartbeat API as JSON.
*
* @param payload
* @param method
* @returns {*}
*/
value: function sendAjaxRequestToApi(payload) { value: function sendAjaxRequestToApi(payload) {
var _this4 = this; var _this4 = this;
var method = arguments[1] === undefined ? 'POST' : arguments[1]; var method = arguments[1] === undefined ? 'POST' : arguments[1];
var deferredObject = $.Deferred(); var deferredObject = _jquery2['default'].Deferred();
$.ajax({ _jquery2['default'].ajax({
url: this.heartbeatApiUrl, url: this.heartbeatApiUrl,
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
@@ -235,7 +282,7 @@ module.exports = exports['default'];
//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'; 'use strict';
Object.defineProperty(exports, '__esModule', { 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; }; })(); 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 _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; } 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) { var MainList = (function (_React$Component) {
function MainList() { function MainList() {
@@ -282,64 +333,64 @@ var MainList = (function (_React$Component) {
var loginLogoutButton = function loginLogoutButton() { var loginLogoutButton = function loginLogoutButton() {
if (_this.props.loggedIn === true) { if (_this.props.loggedIn === true) {
return React.createElement( return _react2['default'].createElement(
'div', 'div',
null, null,
React.createElement( _react2['default'].createElement(
'a', 'a',
{ target: '_blank', href: 'https://wakatime.com/settings/rules', className: 'list-group-item' }, { target: '_blank', href: 'https://wakatime.com/settings/rules', className: 'list-group-item' },
React.createElement('i', { className: 'fa fa-fw fa-filter' }), _react2['default'].createElement('i', { className: 'fa fa-fw fa-filter' }),
' Custom Rules' 'Custom Rules'
), ),
React.createElement( _react2['default'].createElement(
'a', 'a',
{ target: '_blank', href: 'https://wakatime.com/dashboard', className: 'list-group-item' }, { target: '_blank', href: 'https://wakatime.com/dashboard', className: 'list-group-item' },
React.createElement('i', { className: 'fa fa-fw fa-tachometer' }), _react2['default'].createElement('i', { className: 'fa fa-fw fa-tachometer' }),
' Dashboard' 'Dashboard'
), ),
React.createElement( _react2['default'].createElement(
'a', 'a',
{ href: '#', className: 'list-group-item', onClick: _this.props.logoutUser }, { href: '#', className: 'list-group-item', onClick: _this.props.logoutUser },
React.createElement('i', { className: 'fa fa-fw fa-sign-out' }), _react2['default'].createElement('i', { className: 'fa fa-fw fa-sign-out' }),
' Logout' 'Logout'
) )
); );
} }
return React.createElement( return _react2['default'].createElement(
'a', 'a',
{ target: '_blank', href: 'https://wakatime.com/login', className: 'list-group-item' }, { target: '_blank', href: 'https://wakatime.com/login', className: 'list-group-item' },
React.createElement('i', { className: 'fa fa-fw fa-sign-in' }), _react2['default'].createElement('i', { className: 'fa fa-fw fa-sign-in' }),
' Login' 'Login'
); );
}; };
var signedInAs = function signedInAs() { var signedInAs = function signedInAs() {
if (_this.props.loggedIn === true) { if (_this.props.loggedIn === true) {
return React.createElement( return _react2['default'].createElement(
'div', 'div',
{ className: 'panel panel-default' }, { className: 'panel panel-default' },
React.createElement( _react2['default'].createElement(
'div', 'div',
{ className: 'panel-body' }, { className: 'panel-body' },
React.createElement( _react2['default'].createElement(
'div', 'div',
{ className: 'row' }, { className: 'row' },
React.createElement( _react2['default'].createElement(
'div', 'div',
{ className: 'col-xs-2' }, { 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', 'div',
{ className: 'col-xs-10' }, { className: 'col-xs-10' },
'Signed in as ', 'Signed in as',
React.createElement( _react2['default'].createElement(
'b', 'b',
null, null,
_this.props.user.full_name _this.props.user.full_name
), ),
React.createElement('br', null), _react2['default'].createElement('br', null),
_this.props.user.email _this.props.user.email
) )
) )
@@ -348,18 +399,18 @@ var MainList = (function (_React$Component) {
} }
}; };
return React.createElement( return _react2['default'].createElement(
'div', 'div',
null, null,
signedInAs(), signedInAs(),
React.createElement( _react2['default'].createElement(
'div', 'div',
{ className: 'list-group' }, { className: 'list-group' },
React.createElement( _react2['default'].createElement(
'a', 'a',
{ href: '#', className: 'list-group-item', onClick: this._openOptionsPage }, { href: '#', className: 'list-group-item', onClick: this._openOptionsPage },
React.createElement('i', { className: 'fa fa-fw fa-cogs' }), _react2['default'].createElement('i', { className: 'fa fa-fw fa-cogs' }),
' Options' 'Options'
), ),
loginLogoutButton() loginLogoutButton()
) )
@@ -368,7 +419,7 @@ var MainList = (function (_React$Component) {
}]); }]);
return MainList; return MainList;
})(React.Component); })(_react2['default'].Component);
exports['default'] = MainList; exports['default'] = MainList;
module.exports = exports['default']; 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; }; })(); 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 _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; } 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) { var Navbar = (function (_React$Component) {
function Navbar() { function Navbar() {
@@ -402,68 +457,68 @@ var Navbar = (function (_React$Component) {
_createClass(Navbar, [{ _createClass(Navbar, [{
key: "render", key: "render",
value: function render() { value: function render() {
return React.createElement( return _react2["default"].createElement(
"nav", "nav",
{ className: "navbar navbar-default", role: "navigation" }, { className: "navbar navbar-default", role: "navigation" },
React.createElement( _react2["default"].createElement(
"div", "div",
{ className: "container-fluid" }, { className: "container-fluid" },
React.createElement( _react2["default"].createElement(
"div", "div",
{ className: "navbar-header" }, { className: "navbar-header" },
React.createElement( _react2["default"].createElement(
"button", "button",
{ type: "button", className: "navbar-toggle collapsed", "data-toggle": "collapse", "data-target": "#bs-example-navbar-collapse-1" }, { type: "button", className: "navbar-toggle collapsed", "data-toggle": "collapse", "data-target": "#bs-example-navbar-collapse-1" },
React.createElement( _react2["default"].createElement(
"span", "span",
{ className: "sr-only" }, { className: "sr-only" },
"Toggle navigation" "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", "a",
{ target: "_blank", className: "navbar-brand", href: "https://wakatime.com" }, { target: "_blank", className: "navbar-brand", href: "https://wakatime.com" },
"WakaTime", "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", "div",
{ className: "collapse navbar-collapse", id: "bs-example-navbar-collapse-1" }, { className: "collapse navbar-collapse", id: "bs-example-navbar-collapse-1" },
React.createElement( _react2["default"].createElement(
"ul", "ul",
{ className: "nav navbar-nav" }, { className: "nav navbar-nav" },
React.createElement( _react2["default"].createElement(
"li", "li",
{ className: "dropdown" }, { className: "dropdown" },
React.createElement( _react2["default"].createElement(
"a", "a",
{ href: "#", className: "dropdown-toggle", "data-toggle": "dropdown", role: "button", "aria-expanded": "false" }, { 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", "About",
React.createElement("span", { className: "caret" }) _react2["default"].createElement("span", { className: "caret" })
), ),
React.createElement( _react2["default"].createElement(
"ul", "ul",
{ className: "dropdown-menu", role: "menu" }, { className: "dropdown-menu", role: "menu" },
React.createElement( _react2["default"].createElement(
"li", "li",
null, null,
React.createElement( _react2["default"].createElement(
"a", "a",
{ target: "_blank", href: "https://github.com/wakatime/chrome-wakatime/issues" }, { 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" "Report an Issue"
) )
), ),
React.createElement( _react2["default"].createElement(
"li", "li",
null, null,
React.createElement( _react2["default"].createElement(
"a", "a",
{ target: "_blank", href: "https://github.com/wakatime/chrome-wakatime" }, { 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" "View on GitHub"
) )
) )
@@ -477,7 +532,7 @@ var Navbar = (function (_React$Component) {
}]); }]);
return Navbar; return Navbar;
})(React.Component); })(_react2["default"].Component);
exports["default"] = Navbar; exports["default"] = Navbar;
module.exports = exports["default"]; 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; }; })(); 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 _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; } 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 $ = require('jquery');
var NavBar = require('./NavBar.react'); var _react2 = _interopRequireDefault(_react);
var MainList = require('./MainList.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) { var WakaTime = (function (_React$Component) {
function WakaTime() { function WakaTime() {
@@ -535,13 +606,13 @@ var WakaTime = (function (_React$Component) {
theme: 'light' theme: 'light'
}, function (items) { }, function (items) {
if (items.theme == 'light') { if (items.theme == 'light') {
changeExtensionIcon(); (0, _helpersChangeExtensionIconJs2['default'])();
} else { } else {
changeExtensionIcon('white'); (0, _helpersChangeExtensionIconJs2['default'])('white');
} }
}); });
var wakatime = new WakaTimeOriginal(); var wakatime = new _WakaTimeJs2['default']();
wakatime.checkAuth().done(function (data) { wakatime.checkAuth().done(function (data) {
@@ -556,13 +627,9 @@ var WakaTime = (function (_React$Component) {
loggedIn: true loggedIn: true
}); });
changeExtensionIcon(); (0, _helpersChangeExtensionIconJs2['default'])();
} else { } else {
(0, _helpersChangeExtensionIconJs2['default'])('red');
changeExtensionIcon('red');
//TODO: Redirect user to wakatime login page.
//
} }
}); });
} }
@@ -571,9 +638,9 @@ var WakaTime = (function (_React$Component) {
value: function logoutUser() { value: function logoutUser() {
var _this2 = this; var _this2 = this;
var deferredObject = $.Deferred(); var deferredObject = _jquery2['default'].Deferred();
$.ajax({ _jquery2['default'].ajax({
url: this.logoutUserUrl, url: this.logoutUserUrl,
method: 'GET', method: 'GET',
success: function success() { success: function success() {
@@ -606,26 +673,26 @@ var WakaTime = (function (_React$Component) {
loggedIn: false loggedIn: false
}); });
changeExtensionIcon('red'); (0, _helpersChangeExtensionIconJs2['default'])('red');
}); });
} }
}, { }, {
key: 'render', key: 'render',
value: function render() { value: function render() {
return React.createElement( return _react2['default'].createElement(
'div', 'div',
null, null,
React.createElement(NavBar, null), _react2['default'].createElement(_NavBarReactJs2['default'], null),
React.createElement( _react2['default'].createElement(
'div', 'div',
{ className: 'container' }, { className: 'container' },
React.createElement( _react2['default'].createElement(
'div', 'div',
{ className: 'row' }, { className: 'row' },
React.createElement( _react2['default'].createElement(
'div', 'div',
{ className: 'col-md-12' }, { 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; return WakaTime;
})(React.Component); })(_react2['default'].Component);
exports['default'] = WakaTime; exports['default'] = WakaTime;
module.exports = exports['default']; 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. * It changes the extension icon color.
* Supported values are: 'red', 'white' and ''. * Supported values are: 'red', 'white' and ''.
*
* @param string color = ''
* @return null
*/ */
'use strict'; 'use strict';
@@ -671,14 +735,17 @@ function changeExtensionIcon() {
module.exports = exports['default']; module.exports = exports['default'];
},{}],8:[function(require,module,exports){ },{}],8:[function(require,module,exports){
/**
* Returns UNIX timestamp
*/
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { Object.defineProperty(exports, "__esModule", {
value: true value: true
}); });
exports["default"] = function () { exports["default"] = function () {
return Math.round(new Date().getTime() / 1000); return Math.round(new Date().getTime() / 1000);
}; };
module.exports = exports["default"]; module.exports = exports["default"];

View File

@@ -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;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ (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;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
'use strict'; 'use strict';
var WakaTime = require('./WakaTime'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _WakaTimeJs = require('./WakaTime.js');
var _WakaTimeJs2 = _interopRequireDefault(_WakaTimeJs);
/** /**
* Whenever an alarms sets off, this function * Whenever an alarms sets off, this function
@@ -17,7 +21,7 @@ function resolveAlarm(alarm) {
console.log('recording a heartbeat - alarm triggered'); console.log('recording a heartbeat - alarm triggered');
var wakatime = new WakaTime(); var wakatime = new _WakaTimeJs2['default']();
wakatime.recordHeartbeat(); wakatime.recordHeartbeat();
} }
@@ -38,7 +42,7 @@ chrome.tabs.onActivated.addListener(function (activeInfo) {
console.log('recording a heartbeat - active tab changed'); console.log('recording a heartbeat - active tab changed');
var wakatime = new WakaTime(); var wakatime = new _WakaTimeJs2['default']();
wakatime.recordHeartbeat(); wakatime.recordHeartbeat();
}); });
@@ -57,7 +61,7 @@ chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
if (tabId == tabs[0].id) { if (tabId == tabs[0].id) {
console.log('recording a heartbeat - tab updated'); console.log('recording a heartbeat - tab updated');
var wakatime = new WakaTime(); var wakatime = new _WakaTimeJs2['default']();
wakatime.recordHeartbeat(); wakatime.recordHeartbeat();
} }
@@ -65,7 +69,7 @@ chrome.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
} }
}); });
},{"./WakaTime":3}],2:[function(require,module,exports){ },{"./WakaTime.js":3}],2:[function(require,module,exports){
"use strict"; "use strict";
Object.defineProperty(exports, "__esModule", { Object.defineProperty(exports, "__esModule", {
@@ -105,14 +109,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; }; })(); 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 _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 _jquery = require('jquery');
var changeExtensionIcon = require('./helpers/changeExtensionIcon');
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 () { var WakaTime = (function () {
function WakaTime() { function WakaTime() {
@@ -130,14 +145,14 @@ var WakaTime = (function () {
/** /**
* Checks if the user is logged in. * Checks if the user is logged in.
* *
* @return $.promise() * @returns {*}
*/ */
value: function checkAuth() { value: function checkAuth() {
var _this = this; var _this = this;
var deferredObject = $.Deferred(); var deferredObject = _jquery2['default'].Deferred();
$.ajax({ _jquery2['default'].ajax({
url: this.currentUserApiUrl, url: this.currentUserApiUrl,
dataType: 'json', dataType: 'json',
success: function success(data) { success: function success(data) {
@@ -160,8 +175,6 @@ var WakaTime = (function () {
/** /**
* Depending on various factors detects the current active tab URL or domain, * Depending on various factors detects the current active tab URL or domain,
* and sends it to WakaTime for logging. * and sends it to WakaTime for logging.
*
* @return null
*/ */
value: function recordHeartbeat() { value: function recordHeartbeat() {
var _this2 = this; var _this2 = this;
@@ -172,7 +185,7 @@ var WakaTime = (function () {
// User is logged in. // User is logged in.
// Change extension icon to default color. // Change extension icon to default color.
changeExtensionIcon(); (0, _helpersChangeExtensionIconJs2['default'])();
chrome.idle.queryState(_this2.detectionIntervalInSeconds, function (newState) { chrome.idle.queryState(_this2.detectionIntervalInSeconds, function (newState) {
@@ -187,7 +200,7 @@ var WakaTime = (function () {
// User is not logged in. // User is not logged in.
// Change extension icon to red color. // Change extension icon to red color.
changeExtensionIcon('red'); (0, _helpersChangeExtensionIconJs2['default'])('red');
} }
}); });
} }
@@ -197,10 +210,11 @@ var WakaTime = (function () {
/** /**
* Creates payload for the heartbeat and returns it as JSON. * Creates payload for the heartbeat and returns it as JSON.
* *
* @param string entity * @param entity
* @param string type 'domain' or 'url' * @param type
* @param boolean debug = false * @param debug
* @return JSON * @returns {*}
* @private
*/ */
value: function _preparePayload(entity, type) { value: function _preparePayload(entity, type) {
var debug = arguments[2] === undefined ? false : arguments[2]; var debug = arguments[2] === undefined ? false : arguments[2];
@@ -208,7 +222,7 @@ var WakaTime = (function () {
return JSON.stringify({ return JSON.stringify({
entity: entity, entity: entity,
type: type, type: type,
time: currentTimestamp(), time: (0, _helpersCurrentTimestampJs2['default'])(),
is_debugging: debug is_debugging: debug
}); });
} }
@@ -218,10 +232,11 @@ var WakaTime = (function () {
/** /**
* Returns a promise with logging type variable. * Returns a promise with logging type variable.
* *
* @return $.promise * @returns {*}
* @private
*/ */
value: function _getLoggingType() { value: function _getLoggingType() {
var deferredObject = $.Deferred(); var deferredObject = _jquery2['default'].Deferred();
chrome.storage.sync.get({ chrome.storage.sync.get({
loggingType: this.loggingType loggingType: this.loggingType
@@ -238,21 +253,22 @@ var WakaTime = (function () {
* Given the entity and logging type it creates a payload and * Given the entity and logging type it creates a payload and
* sends an ajax post request to the API. * sends an ajax post request to the API.
* *
* @param string entity * @param entity
* @return null
*/ */
value: function sendHeartbeat(entity) { value: function sendHeartbeat(entity) {
var _this3 = this; var _this3 = this;
var payload = null;
this._getLoggingType().done(function (loggingType) { this._getLoggingType().done(function (loggingType) {
// Get only the domain from the entity. // Get only the domain from the entity.
// And send that in heartbeat // And send that in heartbeat
if (loggingType == 'domain') { if (loggingType == 'domain') {
var domain = UrlHelper.getDomainFromUrl(entity); var domain = _UrlHelperJs2['default'].getDomainFromUrl(entity);
var payload = _this3._preparePayload(domain, 'domain'); payload = _this3._preparePayload(domain, 'domain');
console.log(payload); console.log(payload);
@@ -260,7 +276,7 @@ var WakaTime = (function () {
} }
// Send entity in heartbeat // Send entity in heartbeat
else if (loggingType == 'url') { else if (loggingType == 'url') {
var payload = _this3._preparePayload(entity, 'url'); payload = _this3._preparePayload(entity, 'url');
console.log(payload); console.log(payload);
@@ -274,18 +290,18 @@ var WakaTime = (function () {
/** /**
* Sends AJAX request with payload to the heartbeat API as JSON. * Sends AJAX request with payload to the heartbeat API as JSON.
* *
* @param JSON payload * @param payload
* @param string method = 'POST' * @param method
* @return $.promise * @returns {*}
*/ */
value: function sendAjaxRequestToApi(payload) { value: function sendAjaxRequestToApi(payload) {
var _this4 = this; var _this4 = this;
var method = arguments[1] === undefined ? 'POST' : arguments[1]; var method = arguments[1] === undefined ? 'POST' : arguments[1];
var deferredObject = $.Deferred(); var deferredObject = _jquery2['default'].Deferred();
$.ajax({ _jquery2['default'].ajax({
url: this.heartbeatApiUrl, url: this.heartbeatApiUrl,
dataType: 'json', dataType: 'json',
contentType: 'application/json', contentType: 'application/json',
@@ -316,13 +332,10 @@ module.exports = exports['default'];
//default //default
},{"./UrlHelper":2,"./helpers/changeExtensionIcon":4,"./helpers/currentTimestamp":5,"jquery":6}],4:[function(require,module,exports){ },{"./UrlHelper.js":2,"./helpers/changeExtensionIcon.js":4,"./helpers/currentTimestamp.js":5,"jquery":6}],4:[function(require,module,exports){
/** /**
* It changes the extension icon color. * It changes the extension icon color.
* Supported values are: 'red', 'white' and ''. * Supported values are: 'red', 'white' and ''.
*
* @param string color = ''
* @return null
*/ */
'use strict'; 'use strict';
@@ -350,8 +363,6 @@ module.exports = exports['default'];
},{}],5:[function(require,module,exports){ },{}],5:[function(require,module,exports){
/** /**
* Returns UNIX timestamp * Returns UNIX timestamp
*
* @return integer
*/ */
"use strict"; "use strict";

View File

@@ -3,61 +3,65 @@
/* This is a fix for Bootstrap requiring jQuery */ /* This is a fix for Bootstrap requiring jQuery */
'use strict'; 'use strict';
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _jquery = require('jquery');
var _jquery2 = _interopRequireDefault(_jquery);
global.jQuery = require('jquery'); global.jQuery = require('jquery');
require('bootstrap'); require('bootstrap');
var $ = require('jquery');
function detectCheckedRadio(name) { function detectCheckedRadio(name) {
for (var i = 0; i < document.getElementsByName(name).length; i++) { for (var i = 0; i < document.getElementsByName(name).length; i++) {
var button = document.getElementsByName(name)[i]; var button = document.getElementsByName(name)[i];
if (button.checked === true) { if (button.checked === true) {
return button.value; return button.value;
}
} }
}
} }
// Saves options to chrome.storage.sync. // Saves options to chrome.storage.sync.
function save_options(e) { function save_options(e) {
e.preventDefault(); e.preventDefault();
var theme = document.getElementById('theme').value; var theme = document.getElementById('theme').value;
var blacklist = document.getElementById('blacklist').value; var blacklist = document.getElementById('blacklist').value;
var loggingType = detectCheckedRadio('loggingType'); var loggingType = detectCheckedRadio('loggingType');
chrome.storage.sync.set({ chrome.storage.sync.set({
theme: theme, theme: theme,
blacklist: blacklist, blacklist: blacklist,
loggingType: loggingType loggingType: loggingType
}, function () { }, function () {
// Update status to let user know options were saved. // Update status to let user know options were saved.
var status = $('#status'); var status = (0, _jquery2['default'])('#status');
status.html('<strong>Well done!</strong> Options have been saved.'); status.html('<strong>Well done!</strong> Options have been saved.');
status.fadeIn(1500, function () { status.fadeIn(1500, function () {
setTimeout(function () { setTimeout(function () {
status.fadeOut(1500, function () { status.fadeOut(1500, function () {
status.html(''); status.html('');
});
}, 750);
}); });
}, 750);
}); });
});
} }
// Restores select box and checkbox state using the preferences // Restores select box and checkbox state using the preferences
// stored in chrome.storage. // stored in chrome.storage.
function restore_options() { function restore_options() {
// Use default value color = 'red' and likesColor = true. // Use default value color = 'red' and likesColor = true.
chrome.storage.sync.get({ chrome.storage.sync.get({
theme: 'light', theme: 'light',
blacklist: '', blacklist: '',
loggingType: 'domain' loggingType: 'domain'
}, function (items) { }, function (items) {
document.getElementById('theme').value = items.theme; document.getElementById('theme').value = items.theme;
document.getElementById('blacklist').value = items.blacklist; document.getElementById('blacklist').value = items.blacklist;
document.getElementById(items.loggingType + 'Type').checked = true; document.getElementById(items.loggingType + 'Type').checked = true;
}); });
} }
document.addEventListener('DOMContentLoaded', restore_options); document.addEventListener('DOMContentLoaded', restore_options);

View File

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 44 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB