Setup CI tests (#100)
* use @xarc/xrun to streamline tasks in an imperative manner * add lint-staged/husky for git hook tasks * run prettier across all files * fixing tests * add ci test workflow * add a ci workflow * remove precommit in favor of husky * add .prettierrc.js * reformat with prettier
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
|
||||
/* This is a fix for Bootstrap requiring jQuery */
|
||||
global.jQuery = require('jquery');
|
||||
require('bootstrap');
|
||||
@@ -9,7 +8,4 @@ var ReactDOM = require('react-dom');
|
||||
// React components
|
||||
var WakaTime = require('./components/WakaTime.jsx');
|
||||
|
||||
ReactDOM.render(
|
||||
<WakaTime />,
|
||||
document.getElementById('wakatime')
|
||||
);
|
||||
ReactDOM.render(<WakaTime />, document.getElementById('wakatime'));
|
||||
|
||||
@@ -3,13 +3,9 @@ var reactCreateClass = require('create-react-class');
|
||||
var classNames = require('classnames');
|
||||
|
||||
var Alert = reactCreateClass({
|
||||
|
||||
render: function() {
|
||||
return(
|
||||
<div className={classNames('alert', 'alert-' + this.props.type)}>{this.props.text}</div>
|
||||
);
|
||||
}
|
||||
|
||||
render: function () {
|
||||
return <div className={classNames('alert', 'alert-' + this.props.type)}>{this.props.text}</div>;
|
||||
},
|
||||
});
|
||||
|
||||
module.exports = Alert;
|
||||
|
||||
@@ -2,106 +2,111 @@
|
||||
|
||||
var React = require('react');
|
||||
var reactCreateClass = require('create-react-class');
|
||||
|
||||
var MainList = reactCreateClass({
|
||||
|
||||
_openOptionsPage: function() {
|
||||
if (browser.runtime.openOptionsPage) {
|
||||
// New way to open options pages, if supported (Chrome 42+).
|
||||
browser.runtime.openOptionsPage();
|
||||
} else {
|
||||
// Reasonable fallback.
|
||||
window.open(browser.runtime.getURL('options.html'));
|
||||
}
|
||||
},
|
||||
|
||||
render: function() {
|
||||
|
||||
var that = this;
|
||||
|
||||
var loginLogoutButton = function() {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<div>
|
||||
<a href="#" className="list-group-item" onClick={that.props.logoutUser}>
|
||||
<i className="fa fa-fw fa-sign-out"></i>
|
||||
Logout
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<a target="_blank" href="https://wakatime.com/login" className="list-group-item">
|
||||
<i className="fa fa-fw fa-sign-in"></i>
|
||||
Login
|
||||
</a>
|
||||
);
|
||||
};
|
||||
|
||||
// If logging is enabled, display that info to user
|
||||
var loggingStatus = function() {
|
||||
if(that.props.loggingEnabled === true && that.props.loggedIn === true)
|
||||
{
|
||||
return (
|
||||
<div className="row">
|
||||
<div className="col-xs-12">
|
||||
<p>
|
||||
<a href="#" onClick={that.props.disableLogging} className="btn btn-danger btn-block">Disable logging</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
else if(that.props.loggingEnabled === false && that.props.loggedIn === true)
|
||||
{
|
||||
return (
|
||||
<div className="row">
|
||||
<div className="col-xs-12">
|
||||
<p>
|
||||
<a href="#" onClick={that.props.enableLogging} className="btn btn-success btn-block">Enable logging</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
var totalTimeLoggedToday = function() {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<div className="row">
|
||||
<div className="col-xs-12">
|
||||
<blockquote>
|
||||
<p>{that.props.totalTimeLoggedToday}</p>
|
||||
<small><cite>TOTAL TIME LOGGED TODAY</cite></small>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
|
||||
{totalTimeLoggedToday()}
|
||||
|
||||
{loggingStatus()}
|
||||
|
||||
<div className="list-group">
|
||||
<a href="#" className="list-group-item" onClick={this._openOptionsPage}>
|
||||
<i className="fa fa-fw fa-cogs"></i>
|
||||
Options
|
||||
</a>
|
||||
|
||||
{loginLogoutButton()}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
_openOptionsPage: function () {
|
||||
if (browser.runtime.openOptionsPage) {
|
||||
// New way to open options pages, if supported (Chrome 42+).
|
||||
browser.runtime.openOptionsPage();
|
||||
} else {
|
||||
// Reasonable fallback.
|
||||
window.open(browser.runtime.getURL('options.html'));
|
||||
}
|
||||
},
|
||||
|
||||
render: function () {
|
||||
var that = this;
|
||||
|
||||
var loginLogoutButton = function () {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<div>
|
||||
<a href="#" className="list-group-item" onClick={that.props.logoutUser}>
|
||||
<i className="fa fa-fw fa-sign-out"></i>
|
||||
Logout
|
||||
</a>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<a target="_blank" href="https://wakatime.com/login" className="list-group-item">
|
||||
<i className="fa fa-fw fa-sign-in"></i>
|
||||
Login
|
||||
</a>
|
||||
);
|
||||
};
|
||||
|
||||
// If logging is enabled, display that info to user
|
||||
var loggingStatus = function () {
|
||||
if (that.props.loggingEnabled === true && that.props.loggedIn === true) {
|
||||
return (
|
||||
<div className="row">
|
||||
<div className="col-xs-12">
|
||||
<p>
|
||||
<a
|
||||
href="#"
|
||||
onClick={that.props.disableLogging}
|
||||
className="btn btn-danger btn-block"
|
||||
>
|
||||
Disable logging
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
} else if (that.props.loggingEnabled === false && that.props.loggedIn === true) {
|
||||
return (
|
||||
<div className="row">
|
||||
<div className="col-xs-12">
|
||||
<p>
|
||||
<a
|
||||
href="#"
|
||||
onClick={that.props.enableLogging}
|
||||
className="btn btn-success btn-block"
|
||||
>
|
||||
Enable logging
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
var totalTimeLoggedToday = function () {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<div className="row">
|
||||
<div className="col-xs-12">
|
||||
<blockquote>
|
||||
<p>{that.props.totalTimeLoggedToday}</p>
|
||||
<small>
|
||||
<cite>TOTAL TIME LOGGED TODAY</cite>
|
||||
</small>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div>
|
||||
{totalTimeLoggedToday()}
|
||||
|
||||
{loggingStatus()}
|
||||
|
||||
<div className="list-group">
|
||||
<a href="#" className="list-group-item" onClick={this._openOptionsPage}>
|
||||
<i className="fa fa-fw fa-cogs"></i>
|
||||
Options
|
||||
</a>
|
||||
|
||||
{loginLogoutButton()}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
module.exports = MainList;
|
||||
|
||||
@@ -2,89 +2,101 @@ var React = require('react');
|
||||
var reactCreateClass = require('create-react-class');
|
||||
|
||||
var NavBar = reactCreateClass({
|
||||
render: function () {
|
||||
var that = this;
|
||||
|
||||
render: function() {
|
||||
|
||||
var that = this;
|
||||
|
||||
var signedInAs = function() {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<p className="navbar-text">Signed in as <b>{that.props.user.full_name}</b></p>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
var dashboard = function() {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<li>
|
||||
<a target="_blank" href="https://wakatime.com/dashboard">
|
||||
<i className="fa fa-fw fa-tachometer"></i>
|
||||
Dashboard
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
var customRules = function() {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<li>
|
||||
<a target="_blank" href="https://wakatime.com/settings/rules">
|
||||
<i className="fa fa-fw fa-filter"></i>
|
||||
Custom Rules
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
var signedInAs = function () {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<nav className="navbar navbar-default" role="navigation">
|
||||
<div className="container-fluid">
|
||||
<div className="navbar-header">
|
||||
<button type="button" className="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
|
||||
<span className="sr-only">Toggle navigation</span>
|
||||
<i className="fa fa-fw fa-cogs"></i>
|
||||
</button>
|
||||
<a target="_blank" className="navbar-brand" href="https://wakatime.com">
|
||||
WakaTime
|
||||
<img src="graphics/wakatime-logo-48.png" />
|
||||
</a>
|
||||
</div>
|
||||
<div className="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
||||
{signedInAs()}
|
||||
<ul className="nav navbar-nav">
|
||||
{customRules()}
|
||||
{dashboard()}
|
||||
<li className="dropdown">
|
||||
<a href="#" className="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
|
||||
<i className="fa fa-fw fa-info"></i>
|
||||
About
|
||||
<span className="caret"></span>
|
||||
</a>
|
||||
<ul className="dropdown-menu" role="menu">
|
||||
<li>
|
||||
<a target="_blank" href="https://github.com/wakatime/chrome-wakatime/issues">
|
||||
<i className="fa fa-fw fa-bug"></i>
|
||||
Report an Issue</a>
|
||||
</li>
|
||||
<li>
|
||||
<a target="_blank" href="https://github.com/wakatime/chrome-wakatime">
|
||||
<i className="fa fa-fw fa-github"></i>
|
||||
View on GitHub</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
<p className="navbar-text">
|
||||
Signed in as <b>{that.props.user.full_name}</b>
|
||||
</p>
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var dashboard = function () {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<li>
|
||||
<a target="_blank" href="https://wakatime.com/dashboard">
|
||||
<i className="fa fa-fw fa-tachometer"></i>
|
||||
Dashboard
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
var customRules = function () {
|
||||
if (that.props.loggedIn === true) {
|
||||
return (
|
||||
<li>
|
||||
<a target="_blank" href="https://wakatime.com/settings/rules">
|
||||
<i className="fa fa-fw fa-filter"></i>
|
||||
Custom Rules
|
||||
</a>
|
||||
</li>
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<nav className="navbar navbar-default" role="navigation">
|
||||
<div className="container-fluid">
|
||||
<div className="navbar-header">
|
||||
<button
|
||||
type="button"
|
||||
className="navbar-toggle collapsed"
|
||||
data-toggle="collapse"
|
||||
data-target="#bs-example-navbar-collapse-1"
|
||||
>
|
||||
<span className="sr-only">Toggle navigation</span>
|
||||
<i className="fa fa-fw fa-cogs"></i>
|
||||
</button>
|
||||
<a target="_blank" className="navbar-brand" href="https://wakatime.com">
|
||||
WakaTime
|
||||
<img src="graphics/wakatime-logo-48.png" />
|
||||
</a>
|
||||
</div>
|
||||
<div className="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
|
||||
{signedInAs()}
|
||||
<ul className="nav navbar-nav">
|
||||
{customRules()}
|
||||
{dashboard()}
|
||||
<li className="dropdown">
|
||||
<a
|
||||
href="#"
|
||||
className="dropdown-toggle"
|
||||
data-toggle="dropdown"
|
||||
role="button"
|
||||
aria-expanded="false"
|
||||
>
|
||||
<i className="fa fa-fw fa-info"></i>
|
||||
About
|
||||
<span className="caret"></span>
|
||||
</a>
|
||||
<ul className="dropdown-menu" role="menu">
|
||||
<li>
|
||||
<a target="_blank" href="https://github.com/wakatime/chrome-wakatime/issues">
|
||||
<i className="fa fa-fw fa-bug"></i>
|
||||
Report an Issue
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a target="_blank" href="https://github.com/wakatime/chrome-wakatime">
|
||||
<i className="fa fa-fw fa-github"></i>
|
||||
View on GitHub
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
module.exports = NavBar;
|
||||
|
||||
@@ -17,200 +17,215 @@ var SitesList = require('./SitesList.jsx');
|
||||
* @type {*|Function}
|
||||
*/
|
||||
var Options = reactCreateClass({
|
||||
getInitialState: function () {
|
||||
return {
|
||||
theme: config.theme,
|
||||
blacklist: '',
|
||||
whitelist: '',
|
||||
loggingType: config.loggingType,
|
||||
loggingStyle: config.loggingStyle,
|
||||
displayAlert: false,
|
||||
alertType: config.alert.success.type,
|
||||
alertText: config.alert.success.text,
|
||||
};
|
||||
},
|
||||
|
||||
getInitialState: function () {
|
||||
return {
|
||||
theme: config.theme,
|
||||
blacklist: '',
|
||||
whitelist: '',
|
||||
loggingType: config.loggingType,
|
||||
loggingStyle: config.loggingStyle,
|
||||
displayAlert: false,
|
||||
alertType: config.alert.success.type,
|
||||
alertText: config.alert.success.text
|
||||
};
|
||||
},
|
||||
componentDidMount: function () {
|
||||
this.restoreSettings();
|
||||
},
|
||||
|
||||
componentDidMount: function () {
|
||||
this.restoreSettings();
|
||||
},
|
||||
restoreSettings: function () {
|
||||
var that = this;
|
||||
|
||||
restoreSettings: function () {
|
||||
var that = this;
|
||||
|
||||
browser.storage.sync.get({
|
||||
theme: config.theme,
|
||||
blacklist: '',
|
||||
whitelist: '',
|
||||
loggingType: config.loggingType,
|
||||
loggingStyle: config.loggingStyle
|
||||
}).then(function (items) {
|
||||
that.setState({
|
||||
theme: items.theme,
|
||||
blacklist: items.blacklist,
|
||||
whitelist: items.whitelist,
|
||||
loggingType: items.loggingType,
|
||||
loggingStyle: items.loggingStyle
|
||||
});
|
||||
|
||||
that.refs.theme.value = items.theme;
|
||||
that.refs.loggingType.value = items.loggingType;
|
||||
that.refs.loggingStyle.value = items.loggingStyle;
|
||||
browser.storage.sync
|
||||
.get({
|
||||
theme: config.theme,
|
||||
blacklist: '',
|
||||
whitelist: '',
|
||||
loggingType: config.loggingType,
|
||||
loggingStyle: config.loggingStyle,
|
||||
})
|
||||
.then(function (items) {
|
||||
that.setState({
|
||||
theme: items.theme,
|
||||
blacklist: items.blacklist,
|
||||
whitelist: items.whitelist,
|
||||
loggingType: items.loggingType,
|
||||
loggingStyle: items.loggingStyle,
|
||||
});
|
||||
},
|
||||
|
||||
_handleSubmit: function (e) {
|
||||
e.preventDefault();
|
||||
that.refs.theme.value = items.theme;
|
||||
that.refs.loggingType.value = items.loggingType;
|
||||
that.refs.loggingStyle.value = items.loggingStyle;
|
||||
});
|
||||
},
|
||||
|
||||
this.saveSettings();
|
||||
},
|
||||
_handleSubmit: function (e) {
|
||||
e.preventDefault();
|
||||
|
||||
saveSettings: function () {
|
||||
var that = this;
|
||||
this.saveSettings();
|
||||
},
|
||||
|
||||
var theme = this.refs.theme.value.trim();
|
||||
var loggingType = this.refs.loggingType.value.trim();
|
||||
var loggingStyle = this.refs.loggingStyle.value.trim();
|
||||
// Trimming blacklist and whitelist removes blank lines and spaces.
|
||||
var blacklist = that.state.blacklist.trim();
|
||||
var whitelist = that.state.whitelist.trim();
|
||||
saveSettings: function () {
|
||||
var that = this;
|
||||
|
||||
// Sync options with google storage.
|
||||
browser.storage.sync.set({
|
||||
theme: theme,
|
||||
blacklist: blacklist,
|
||||
whitelist: whitelist,
|
||||
loggingType: loggingType,
|
||||
loggingStyle: loggingStyle
|
||||
}).then(function () {
|
||||
// Set state to be newly entered values.
|
||||
that.setState({
|
||||
theme: theme,
|
||||
blacklist: blacklist,
|
||||
whitelist: whitelist,
|
||||
loggingType: loggingType,
|
||||
loggingStyle: loggingStyle,
|
||||
displayAlert: true
|
||||
});
|
||||
var theme = this.refs.theme.value.trim();
|
||||
var loggingType = this.refs.loggingType.value.trim();
|
||||
var loggingStyle = this.refs.loggingStyle.value.trim();
|
||||
// Trimming blacklist and whitelist removes blank lines and spaces.
|
||||
var blacklist = that.state.blacklist.trim();
|
||||
var whitelist = that.state.whitelist.trim();
|
||||
|
||||
// Sync options with google storage.
|
||||
browser.storage.sync
|
||||
.set({
|
||||
theme: theme,
|
||||
blacklist: blacklist,
|
||||
whitelist: whitelist,
|
||||
loggingType: loggingType,
|
||||
loggingStyle: loggingStyle,
|
||||
})
|
||||
.then(function () {
|
||||
// Set state to be newly entered values.
|
||||
that.setState({
|
||||
theme: theme,
|
||||
blacklist: blacklist,
|
||||
whitelist: whitelist,
|
||||
loggingType: loggingType,
|
||||
loggingStyle: loggingStyle,
|
||||
displayAlert: true,
|
||||
});
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
_displayBlackOrWhiteList: function () {
|
||||
var loggingStyle = this.refs.loggingStyle.value.trim();
|
||||
_displayBlackOrWhiteList: function () {
|
||||
var loggingStyle = this.refs.loggingStyle.value.trim();
|
||||
|
||||
this.setState({loggingStyle: loggingStyle});
|
||||
},
|
||||
this.setState({ loggingStyle: loggingStyle });
|
||||
},
|
||||
|
||||
_updateBlacklistState: function(sites){
|
||||
this.setState({
|
||||
blacklist: sites
|
||||
});
|
||||
},
|
||||
_updateBlacklistState: function (sites) {
|
||||
this.setState({
|
||||
blacklist: sites,
|
||||
});
|
||||
},
|
||||
|
||||
_updateWhitelistState: function(sites){
|
||||
this.setState({
|
||||
whitelist: sites
|
||||
});
|
||||
},
|
||||
_updateWhitelistState: function (sites) {
|
||||
this.setState({
|
||||
whitelist: sites,
|
||||
});
|
||||
},
|
||||
|
||||
render: function () {
|
||||
render: function () {
|
||||
var that = this;
|
||||
|
||||
var that = this;
|
||||
|
||||
var alert = function() {
|
||||
if(that.state.displayAlert === true){
|
||||
|
||||
setTimeout(function () {
|
||||
that.setState({displayAlert:false});
|
||||
}, 2000);
|
||||
|
||||
return(
|
||||
<Alert key={that.state.alertText} type={that.state.alertType} text={that.state.alertText} />
|
||||
);
|
||||
}
|
||||
};
|
||||
|
||||
var loggingStyle = function () {
|
||||
|
||||
if (that.state.loggingStyle == 'blacklist') {
|
||||
return (
|
||||
<SitesList
|
||||
handleChange={that._updateBlacklistState}
|
||||
label="Blacklist"
|
||||
sites={that.state.blacklist}
|
||||
helpText="Sites that you don't want to show in your reports." />
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<SitesList
|
||||
handleChange={that._updateWhitelistState}
|
||||
label="Whitelist"
|
||||
sites={that.state.whitelist}
|
||||
placeholder="http://google.com http://myproject.com@@MyProject"
|
||||
helpText="Sites that you want to show in your reports. You can assign URL to project by adding @@YourProject at the end of line." />
|
||||
);
|
||||
|
||||
};
|
||||
var alert = function () {
|
||||
if (that.state.displayAlert === true) {
|
||||
setTimeout(function () {
|
||||
that.setState({ displayAlert: false });
|
||||
}, 2000);
|
||||
|
||||
return (
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
<div className="col-md-12">
|
||||
|
||||
<ReactCSSTransitionGroup transitionName="alert" transitionEnterTimeout={500} transitionLeaveTimeout={300}>
|
||||
{alert()}
|
||||
</ReactCSSTransitionGroup>
|
||||
|
||||
<form className="form-horizontal" onSubmit={this._handleSubmit}>
|
||||
|
||||
<div className="form-group">
|
||||
<label className="col-lg-2 control-label">Logging style</label>
|
||||
|
||||
<div className="col-lg-10">
|
||||
<select className="form-control" ref="loggingStyle" defaultValue="blacklist" onChange={this._displayBlackOrWhiteList}>
|
||||
<option value="blacklist">All except blacklisted sites</option>
|
||||
<option value="whitelist">Only whitelisted sites</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{loggingStyle()}
|
||||
|
||||
<div className="form-group">
|
||||
<label className="col-lg-2 control-label">Logging type</label>
|
||||
|
||||
<div className="col-lg-10">
|
||||
<select className="form-control" ref="loggingType" defaultValue="domain">
|
||||
<option value="domain">Only the domain</option>
|
||||
<option value="url">Entire URL</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="form-group">
|
||||
<label htmlFor="theme" className="col-lg-2 control-label">Theme</label>
|
||||
|
||||
<div className="col-lg-10">
|
||||
<select className="form-control" ref="theme" defaultValue="light">
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="form-group">
|
||||
<div className="col-lg-10 col-lg-offset-2">
|
||||
<button type="submit" className="btn btn-primary">Save</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Alert
|
||||
key={that.state.alertText}
|
||||
type={that.state.alertType}
|
||||
text={that.state.alertText}
|
||||
/>
|
||||
);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var loggingStyle = function () {
|
||||
if (that.state.loggingStyle == 'blacklist') {
|
||||
return (
|
||||
<SitesList
|
||||
handleChange={that._updateBlacklistState}
|
||||
label="Blacklist"
|
||||
sites={that.state.blacklist}
|
||||
helpText="Sites that you don't want to show in your reports."
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<SitesList
|
||||
handleChange={that._updateWhitelistState}
|
||||
label="Whitelist"
|
||||
sites={that.state.whitelist}
|
||||
placeholder="http://google.com http://myproject.com@@MyProject"
|
||||
helpText="Sites that you want to show in your reports. You can assign URL to project by adding @@YourProject at the end of line."
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
<div className="col-md-12">
|
||||
<ReactCSSTransitionGroup
|
||||
transitionName="alert"
|
||||
transitionEnterTimeout={500}
|
||||
transitionLeaveTimeout={300}
|
||||
>
|
||||
{alert()}
|
||||
</ReactCSSTransitionGroup>
|
||||
|
||||
<form className="form-horizontal" onSubmit={this._handleSubmit}>
|
||||
<div className="form-group">
|
||||
<label className="col-lg-2 control-label">Logging style</label>
|
||||
|
||||
<div className="col-lg-10">
|
||||
<select
|
||||
className="form-control"
|
||||
ref="loggingStyle"
|
||||
defaultValue="blacklist"
|
||||
onChange={this._displayBlackOrWhiteList}
|
||||
>
|
||||
<option value="blacklist">All except blacklisted sites</option>
|
||||
<option value="whitelist">Only whitelisted sites</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{loggingStyle()}
|
||||
|
||||
<div className="form-group">
|
||||
<label className="col-lg-2 control-label">Logging type</label>
|
||||
|
||||
<div className="col-lg-10">
|
||||
<select className="form-control" ref="loggingType" defaultValue="domain">
|
||||
<option value="domain">Only the domain</option>
|
||||
<option value="url">Entire URL</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="form-group">
|
||||
<label htmlFor="theme" className="col-lg-2 control-label">
|
||||
Theme
|
||||
</label>
|
||||
|
||||
<div className="col-lg-10">
|
||||
<select className="form-control" ref="theme" defaultValue="light">
|
||||
<option value="light">Light</option>
|
||||
<option value="dark">Dark</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="form-group">
|
||||
<div className="col-lg-10 col-lg-offset-2">
|
||||
<button type="submit" className="btn btn-primary">
|
||||
Save
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
module.exports = Options;
|
||||
|
||||
@@ -2,35 +2,43 @@ var React = require('react');
|
||||
var reactCreateClass = require('create-react-class');
|
||||
|
||||
var SitesList = reactCreateClass({
|
||||
getDefaultProps: function () {
|
||||
return {
|
||||
placeholder: 'http://google.com',
|
||||
};
|
||||
},
|
||||
|
||||
getDefaultProps: function () {
|
||||
return {
|
||||
placeholder: 'http://google.com'
|
||||
};
|
||||
},
|
||||
_handleChange: function (event) {
|
||||
var sites = event.target.value;
|
||||
|
||||
_handleChange: function (event) {
|
||||
var sites = event.target.value;
|
||||
this.props.handleChange(sites);
|
||||
},
|
||||
|
||||
this.props.handleChange(sites);
|
||||
},
|
||||
render: function () {
|
||||
return (
|
||||
<div className="form-group">
|
||||
<label htmlFor="sites" className="col-lg-2 control-label">
|
||||
{this.props.label}
|
||||
</label>
|
||||
|
||||
render: function () {
|
||||
|
||||
return (
|
||||
<div className="form-group">
|
||||
<label htmlFor="sites" className="col-lg-2 control-label">{this.props.label}</label>
|
||||
|
||||
<div className="col-lg-10">
|
||||
<textarea className="form-control" rows="3" ref="sites" onChange={this._handleChange}
|
||||
placeholder={this.props.placeholder} value={this.props.sites}></textarea>
|
||||
<span className="help-block">{this.props.helpText}
|
||||
<br/>
|
||||
One line per site.</span>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
<div className="col-lg-10">
|
||||
<textarea
|
||||
className="form-control"
|
||||
rows="3"
|
||||
ref="sites"
|
||||
onChange={this._handleChange}
|
||||
placeholder={this.props.placeholder}
|
||||
value={this.props.sites}
|
||||
></textarea>
|
||||
<span className="help-block">
|
||||
{this.props.helpText}
|
||||
<br />
|
||||
One line per site.
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
module.exports = SitesList;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* global browser */
|
||||
|
||||
var React = require("react");
|
||||
var React = require('react');
|
||||
var reactCreateClass = require('create-react-class');
|
||||
var $ = require('jquery');
|
||||
|
||||
@@ -17,160 +17,147 @@ var WakaTimeCore = require('../core/WakaTimeCore').default;
|
||||
var changeExtensionState = require('../helpers/changeExtensionState');
|
||||
|
||||
var Wakatime = reactCreateClass({
|
||||
getInitialState: function () {
|
||||
return {
|
||||
user: {
|
||||
full_name: null,
|
||||
email: null,
|
||||
photo: null,
|
||||
},
|
||||
loggedIn: false,
|
||||
loggingEnabled: config.loggingEnabled,
|
||||
totalTimeLoggedToday: '0 minutes',
|
||||
};
|
||||
},
|
||||
|
||||
getInitialState: function() {
|
||||
return {
|
||||
user: {
|
||||
full_name: null,
|
||||
email: null,
|
||||
photo: null
|
||||
},
|
||||
loggedIn: false,
|
||||
componentDidMount: function () {
|
||||
var wakatime = new WakaTimeCore();
|
||||
|
||||
var that = this;
|
||||
|
||||
wakatime.checkAuth().done(function (data) {
|
||||
if (data !== false) {
|
||||
browser.storage.sync
|
||||
.get({
|
||||
loggingEnabled: config.loggingEnabled,
|
||||
totalTimeLoggedToday: '0 minutes'
|
||||
};
|
||||
},
|
||||
})
|
||||
.then(function (items) {
|
||||
that.setState({ loggingEnabled: items.loggingEnabled });
|
||||
|
||||
componentDidMount: function() {
|
||||
|
||||
var wakatime = new WakaTimeCore();
|
||||
|
||||
var that = this;
|
||||
|
||||
wakatime.checkAuth().done(function(data) {
|
||||
|
||||
if (data !== false) {
|
||||
|
||||
browser.storage.sync.get({
|
||||
loggingEnabled: config.loggingEnabled
|
||||
}).then(function(items) {
|
||||
that.setState({loggingEnabled: items.loggingEnabled});
|
||||
|
||||
if (items.loggingEnabled === true) {
|
||||
changeExtensionState('allGood');
|
||||
}
|
||||
else {
|
||||
changeExtensionState('notLogging');
|
||||
}
|
||||
});
|
||||
|
||||
that.setState({
|
||||
user: {
|
||||
full_name: data.full_name,
|
||||
email: data.email,
|
||||
photo: data.photo
|
||||
},
|
||||
loggedIn: true
|
||||
});
|
||||
|
||||
wakatime.getTotalTimeLoggedToday().done(function(grand_total) {
|
||||
that.setState({
|
||||
totalTimeLoggedToday: grand_total.text
|
||||
});
|
||||
});
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
}
|
||||
else {
|
||||
changeExtensionState('notSignedIn');
|
||||
if (items.loggingEnabled === true) {
|
||||
changeExtensionState('allGood');
|
||||
} else {
|
||||
changeExtensionState('notLogging');
|
||||
}
|
||||
});
|
||||
|
||||
that.setState({
|
||||
user: {
|
||||
full_name: data.full_name,
|
||||
email: data.email,
|
||||
photo: data.photo,
|
||||
},
|
||||
loggedIn: true,
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
logoutUser: function() {
|
||||
var deferredObject = $.Deferred();
|
||||
|
||||
var that = this;
|
||||
|
||||
$.ajax({
|
||||
url: config.logoutUserUrl,
|
||||
method: 'GET',
|
||||
success: function() {
|
||||
|
||||
deferredObject.resolve(that);
|
||||
|
||||
},
|
||||
error: function(xhr, status, err) {
|
||||
|
||||
console.error(config.logoutUserUrl, status, err.toString());
|
||||
|
||||
deferredObject.resolve(that);
|
||||
}
|
||||
wakatime.getTotalTimeLoggedToday().done(function (grand_total) {
|
||||
that.setState({
|
||||
totalTimeLoggedToday: grand_total.text,
|
||||
});
|
||||
});
|
||||
|
||||
return deferredObject.promise();
|
||||
},
|
||||
wakatime.recordHeartbeat();
|
||||
} else {
|
||||
changeExtensionState('notSignedIn');
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_logoutUser: function() {
|
||||
logoutUser: function () {
|
||||
var deferredObject = $.Deferred();
|
||||
|
||||
var that = this;
|
||||
var that = this;
|
||||
|
||||
this.logoutUser().done(function(){
|
||||
$.ajax({
|
||||
url: config.logoutUserUrl,
|
||||
method: 'GET',
|
||||
success: function () {
|
||||
deferredObject.resolve(that);
|
||||
},
|
||||
error: function (xhr, status, err) {
|
||||
console.error(config.logoutUserUrl, status, err.toString());
|
||||
|
||||
that.setState({
|
||||
user: {
|
||||
full_name: null,
|
||||
email: null,
|
||||
photo: null
|
||||
},
|
||||
loggedIn: false,
|
||||
loggingEnabled: false
|
||||
});
|
||||
deferredObject.resolve(that);
|
||||
},
|
||||
});
|
||||
|
||||
changeExtensionState('notSignedIn');
|
||||
return deferredObject.promise();
|
||||
},
|
||||
|
||||
});
|
||||
},
|
||||
_logoutUser: function () {
|
||||
var that = this;
|
||||
|
||||
_disableLogging: function() {
|
||||
this.setState({
|
||||
loggingEnabled: false
|
||||
});
|
||||
this.logoutUser().done(function () {
|
||||
that.setState({
|
||||
user: {
|
||||
full_name: null,
|
||||
email: null,
|
||||
photo: null,
|
||||
},
|
||||
loggedIn: false,
|
||||
loggingEnabled: false,
|
||||
});
|
||||
|
||||
changeExtensionState('notLogging');
|
||||
changeExtensionState('notSignedIn');
|
||||
});
|
||||
},
|
||||
|
||||
browser.storage.sync.set({
|
||||
loggingEnabled: false
|
||||
});
|
||||
},
|
||||
_disableLogging: function () {
|
||||
this.setState({
|
||||
loggingEnabled: false,
|
||||
});
|
||||
|
||||
_enableLogging: function() {
|
||||
this.setState({
|
||||
loggingEnabled: true
|
||||
});
|
||||
changeExtensionState('notLogging');
|
||||
|
||||
changeExtensionState('allGood');
|
||||
browser.storage.sync.set({
|
||||
loggingEnabled: false,
|
||||
});
|
||||
},
|
||||
|
||||
browser.storage.sync.set({
|
||||
loggingEnabled: true
|
||||
});
|
||||
},
|
||||
_enableLogging: function () {
|
||||
this.setState({
|
||||
loggingEnabled: true,
|
||||
});
|
||||
|
||||
render: function() {
|
||||
return (
|
||||
<div>
|
||||
<NavBar
|
||||
user={this.state.user}
|
||||
loggedIn={this.state.loggedIn} />
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
<div className="col-md-12">
|
||||
<MainList
|
||||
disableLogging={this._disableLogging}
|
||||
enableLogging={this._enableLogging}
|
||||
loggingEnabled={this.state.loggingEnabled}
|
||||
user={this.state.user}
|
||||
totalTimeLoggedToday={this.state.totalTimeLoggedToday}
|
||||
logoutUser={this._logoutUser}
|
||||
loggedIn={this.state.loggedIn} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
changeExtensionState('allGood');
|
||||
|
||||
browser.storage.sync.set({
|
||||
loggingEnabled: true,
|
||||
});
|
||||
},
|
||||
|
||||
render: function () {
|
||||
return (
|
||||
<div>
|
||||
<NavBar user={this.state.user} loggedIn={this.state.loggedIn} />
|
||||
<div className="container">
|
||||
<div className="row">
|
||||
<div className="col-md-12">
|
||||
<MainList
|
||||
disableLogging={this._disableLogging}
|
||||
enableLogging={this._enableLogging}
|
||||
loggingEnabled={this.state.loggingEnabled}
|
||||
user={this.state.user}
|
||||
totalTimeLoggedToday={this.state.totalTimeLoggedToday}
|
||||
logoutUser={this._logoutUser}
|
||||
loggedIn={this.state.loggedIn}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
},
|
||||
});
|
||||
|
||||
module.exports = Wakatime;
|
||||
|
||||
@@ -1,67 +1,60 @@
|
||||
/* global browser */
|
||||
//jshint esnext:true
|
||||
|
||||
var config = {
|
||||
// Extension name
|
||||
name: 'WakaTime',
|
||||
// Extension version
|
||||
version: browser.runtime.getManifest().version,
|
||||
// Time for idle state of the browser
|
||||
// The user is considered idle if there was
|
||||
// no activity in the browser for x seconds
|
||||
detectionIntervalInSeconds: 60,
|
||||
// Default logging style
|
||||
// Log all except blacklisted sites
|
||||
// or log only the white listed sites.
|
||||
loggingStyle: 'blacklist',
|
||||
// Default logging type
|
||||
loggingType: 'domain',
|
||||
// By default logging is enabled
|
||||
loggingEnabled: true,
|
||||
// Url to which to send the heartbeat
|
||||
heartbeatApiUrl: 'https://wakatime.com/api/v1/users/current/heartbeats',
|
||||
// Url from which to detect if the user is logged in
|
||||
currentUserApiUrl: 'https://wakatime.com/api/v1/users/current',
|
||||
// The url to logout the user from wakatime
|
||||
logoutUserUrl: 'https://wakatime.com/logout',
|
||||
// Gets stats from the WakaTime API
|
||||
summariesApiUrl: 'https://wakatime.com/api/v1/users/current/summaries',
|
||||
// Different colors for different states of the extension
|
||||
colors: {
|
||||
allGood: '',
|
||||
notLogging: 'gray',
|
||||
notSignedIn: 'red',
|
||||
lightTheme: 'white'
|
||||
// Extension name
|
||||
name: 'WakaTime',
|
||||
// Extension version
|
||||
version: process.env.NODE_ENV === 'test' ? 'test' : browser.runtime.getManifest().version,
|
||||
// Time for idle state of the browser
|
||||
// The user is considered idle if there was
|
||||
// no activity in the browser for x seconds
|
||||
detectionIntervalInSeconds: 60,
|
||||
// Default logging style
|
||||
// Log all except blacklisted sites
|
||||
// or log only the white listed sites.
|
||||
loggingStyle: 'blacklist',
|
||||
// Default logging type
|
||||
loggingType: 'domain',
|
||||
// By default logging is enabled
|
||||
loggingEnabled: true,
|
||||
// Url to which to send the heartbeat
|
||||
heartbeatApiUrl: 'https://wakatime.com/api/v1/users/current/heartbeats',
|
||||
// Url from which to detect if the user is logged in
|
||||
currentUserApiUrl: 'https://wakatime.com/api/v1/users/current',
|
||||
// The url to logout the user from wakatime
|
||||
logoutUserUrl: 'https://wakatime.com/logout',
|
||||
// Gets stats from the WakaTime API
|
||||
summariesApiUrl: 'https://wakatime.com/api/v1/users/current/summaries',
|
||||
// Different colors for different states of the extension
|
||||
colors: {
|
||||
allGood: '',
|
||||
notLogging: 'gray',
|
||||
notSignedIn: 'red',
|
||||
lightTheme: 'white',
|
||||
},
|
||||
// Tooltips for each of the extension states
|
||||
tooltips: {
|
||||
allGood: '',
|
||||
notLogging: 'Not logging',
|
||||
notSignedIn: 'Not signed In',
|
||||
blacklisted: 'This URL is blacklisted',
|
||||
whitelisted: 'This URL is not on your whitelist',
|
||||
},
|
||||
// Default theme
|
||||
theme: 'light',
|
||||
// Valid extension states
|
||||
states: ['allGood', 'notLogging', 'notSignedIn', 'blacklisted', 'whitelisted'],
|
||||
// Predefined alert type and text for success and failure.
|
||||
alert: {
|
||||
success: {
|
||||
type: 'success',
|
||||
text: 'Options have been saved!',
|
||||
},
|
||||
// Tooltips for each of the extension states
|
||||
tooltips: {
|
||||
allGood: '',
|
||||
notLogging: 'Not logging',
|
||||
notSignedIn: 'Not signed In',
|
||||
blacklisted: 'This URL is blacklisted',
|
||||
whitelisted: 'This URL is not on your whitelist'
|
||||
failure: {
|
||||
type: 'danger',
|
||||
text: 'There was an error while saving the options!',
|
||||
},
|
||||
// Default theme
|
||||
theme: 'light',
|
||||
// Valid extension states
|
||||
states: [
|
||||
'allGood',
|
||||
'notLogging',
|
||||
'notSignedIn',
|
||||
'blacklisted',
|
||||
'whitelisted'
|
||||
],
|
||||
// Predefined alert type and text for success and failure.
|
||||
alert: {
|
||||
success: {
|
||||
type: 'success',
|
||||
text: 'Options have been saved!'
|
||||
},
|
||||
failure: {
|
||||
type: 'danger',
|
||||
text: 'There was an error while saving the options!'
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
module.exports = config;
|
||||
|
||||
@@ -32,7 +32,7 @@ class WakaTimeCore {
|
||||
$.ajax({
|
||||
url: config.summariesApiUrl + '?start=' + today + '&end=' + today,
|
||||
dataType: 'json',
|
||||
success: data => {
|
||||
success: (data) => {
|
||||
deferredObject.resolve(data.data[0].grand_total);
|
||||
},
|
||||
error: (xhr, status, err) => {
|
||||
@@ -56,7 +56,7 @@ class WakaTimeCore {
|
||||
$.ajax({
|
||||
url: config.currentUserApiUrl,
|
||||
dataType: 'json',
|
||||
success: data => {
|
||||
success: (data) => {
|
||||
deferredObject.resolve(data.data);
|
||||
},
|
||||
error: (xhr, status, err) => {
|
||||
@@ -80,14 +80,14 @@ class WakaTimeCore {
|
||||
blacklist: '',
|
||||
whitelist: '',
|
||||
})
|
||||
.then(items => {
|
||||
.then((items) => {
|
||||
if (items.loggingEnabled === true) {
|
||||
changeExtensionState('allGood');
|
||||
|
||||
browser.idle.queryState(config.detectionIntervalInSeconds).then(newState => {
|
||||
browser.idle.queryState(config.detectionIntervalInSeconds).then((newState) => {
|
||||
if (newState === 'active') {
|
||||
// Get current tab URL.
|
||||
browser.tabs.query({ currentWindow: true, active: true }).then(tabs => {
|
||||
browser.tabs.query({ currentWindow: true, active: true }).then((tabs) => {
|
||||
if (tabs.length == 0) return;
|
||||
|
||||
var currentActiveTab = tabs[0];
|
||||
@@ -141,9 +141,9 @@ class WakaTimeCore {
|
||||
* @returns {object}
|
||||
*/
|
||||
getHeartbeat(url, list) {
|
||||
const projectIndicatorCharacters = '@@';
|
||||
var projectIndicatorCharacters = '@@';
|
||||
|
||||
const lines = list.split('\n');
|
||||
var lines = list.split('\n');
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
// strip (http:// or https://) and trailing (`/` or `@@`)
|
||||
var cleanLine = lines[i]
|
||||
@@ -241,7 +241,7 @@ class WakaTimeCore {
|
||||
sendHeartbeat(heartbeat, debug) {
|
||||
var payload = null;
|
||||
|
||||
this._getLoggingType().done(loggingType => {
|
||||
this._getLoggingType().done((loggingType) => {
|
||||
// Get only the domain from the entity.
|
||||
// And send that in heartbeat
|
||||
if (loggingType == 'domain') {
|
||||
@@ -283,7 +283,7 @@ class WakaTimeCore {
|
||||
// nothing to do here
|
||||
},
|
||||
},
|
||||
success: response => {
|
||||
success: (response) => {
|
||||
deferredObject.resolve(this);
|
||||
},
|
||||
error: (xhr, status, err) => {
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
// Create a connection to the background page
|
||||
var backgroundPageConnection = browser.runtime.connect({
|
||||
name: "devtools-page"
|
||||
name: 'devtools-page',
|
||||
});
|
||||
|
||||
// Send a message to background page with the current active tabId
|
||||
backgroundPageConnection.postMessage({
|
||||
name: 'init',
|
||||
tabId: browser.devtools.inspectedWindow.tabId
|
||||
name: 'init',
|
||||
tabId: browser.devtools.inspectedWindow.tabId,
|
||||
});
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* global browser */
|
||||
|
||||
// Core
|
||||
var WakaTimeCore = require("./core/WakaTimeCore").default;
|
||||
var WakaTimeCore = require('./core/WakaTimeCore').default;
|
||||
|
||||
// initialize class
|
||||
var wakatime = new WakaTimeCore();
|
||||
@@ -12,46 +12,40 @@ var connections = {};
|
||||
|
||||
// Add a listener to resolve alarms
|
||||
browser.alarms.onAlarm.addListener(function (alarm) {
|
||||
// |alarm| can be undefined because onAlarm also gets called from
|
||||
// window.setTimeout on old chrome versions.
|
||||
if (alarm && alarm.name == 'heartbeatAlarm') {
|
||||
// |alarm| can be undefined because onAlarm also gets called from
|
||||
// window.setTimeout on old chrome versions.
|
||||
if (alarm && alarm.name == 'heartbeatAlarm') {
|
||||
console.log('recording a heartbeat - alarm triggered');
|
||||
|
||||
console.log('recording a heartbeat - alarm triggered');
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
}
|
||||
wakatime.recordHeartbeat();
|
||||
}
|
||||
});
|
||||
|
||||
// Create a new alarm for heartbeats.
|
||||
browser.alarms.create('heartbeatAlarm', {periodInMinutes: 2});
|
||||
browser.alarms.create('heartbeatAlarm', { periodInMinutes: 2 });
|
||||
|
||||
/**
|
||||
* Whenever a active tab is changed it records a heartbeat with that tab url.
|
||||
*/
|
||||
browser.tabs.onActivated.addListener(function (activeInfo) {
|
||||
browser.tabs.get(activeInfo.tabId).then(function (tab) {
|
||||
console.log('recording a heartbeat - active tab changed');
|
||||
|
||||
browser.tabs.get(activeInfo.tabId).then(function (tab) {
|
||||
|
||||
console.log('recording a heartbeat - active tab changed');
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
});
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
});
|
||||
});
|
||||
|
||||
/**
|
||||
* Whenever a active window is changed it records a heartbeat with the active tab url.
|
||||
*/
|
||||
browser.windows.onFocusChanged.addListener(function (windowId) {
|
||||
if (windowId != browser.windows.WINDOW_ID_NONE) {
|
||||
console.log('recording a heartbeat - active window changed');
|
||||
|
||||
if (windowId != browser.windows.WINDOW_ID_NONE) {
|
||||
console.log('recording a heartbeat - active window changed');
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
} else {
|
||||
console.log('lost focus');
|
||||
}
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
} else {
|
||||
console.log('lost focus');
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
@@ -59,57 +53,49 @@ browser.windows.onFocusChanged.addListener(function (windowId) {
|
||||
* currently active and if it is, then it records a heartbeat.
|
||||
*/
|
||||
browser.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
|
||||
if (changeInfo.status === 'complete') {
|
||||
// Get current tab URL.
|
||||
browser.tabs.query({ currentWindow: true, active: true }).then(function (tabs) {
|
||||
// If tab updated is the same as active tab
|
||||
if (tabId == tabs[0].id) {
|
||||
console.log('recording a heartbeat - tab updated');
|
||||
|
||||
if (changeInfo.status === 'complete') {
|
||||
// Get current tab URL.
|
||||
browser.tabs.query({currentWindow: true, active: true}).then(function(tabs) {
|
||||
// If tab updated is the same as active tab
|
||||
if (tabId == tabs[0].id) {
|
||||
console.log('recording a heartbeat - tab updated');
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* This is in charge of detecting if devtools are opened or closed
|
||||
* and sending a heartbeat depending on that.
|
||||
*/
|
||||
browser.runtime.onConnect.addListener(function (port) {
|
||||
if (port.name == 'devtools-page') {
|
||||
// Listen to messages sent from the DevTools page
|
||||
port.onMessage.addListener(function (message, sender, sendResponse) {
|
||||
if (message.name == 'init') {
|
||||
connections[message.tabId] = port;
|
||||
|
||||
if (port.name == "devtools-page") {
|
||||
wakatime.setTabsWithDevtoolsOpen(Object.keys(connections));
|
||||
|
||||
// Listen to messages sent from the DevTools page
|
||||
port.onMessage.addListener(function (message, sender, sendResponse) {
|
||||
if (message.name == "init") {
|
||||
wakatime.recordHeartbeat();
|
||||
}
|
||||
});
|
||||
|
||||
connections[message.tabId] = port;
|
||||
port.onDisconnect.addListener(function (port) {
|
||||
var tabs = Object.keys(connections);
|
||||
|
||||
wakatime.setTabsWithDevtoolsOpen(Object.keys(connections));
|
||||
for (var i = 0, len = tabs.length; i < len; i++) {
|
||||
if (connections[tabs[i]] == port) {
|
||||
delete connections[tabs[i]];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
}
|
||||
});
|
||||
wakatime.setTabsWithDevtoolsOpen(Object.keys(connections));
|
||||
|
||||
port.onDisconnect.addListener(function (port) {
|
||||
|
||||
var tabs = Object.keys(connections);
|
||||
|
||||
for (var i = 0, len = tabs.length; i < len; i ++) {
|
||||
if (connections[tabs[i]] == port) {
|
||||
delete connections[tabs[i]];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
wakatime.setTabsWithDevtoolsOpen(Object.keys(connections));
|
||||
|
||||
wakatime.recordHeartbeat();
|
||||
});
|
||||
|
||||
}
|
||||
wakatime.recordHeartbeat();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -9,42 +9,41 @@ var config = require('../config');
|
||||
* @param color
|
||||
*/
|
||||
function changeExtensionIcon(color) {
|
||||
color = color ? color : '';
|
||||
|
||||
color = color ? color : '';
|
||||
var path = null;
|
||||
|
||||
var path = null;
|
||||
if (color !== '') {
|
||||
color = '-' + color;
|
||||
|
||||
if (color !== '') {
|
||||
color = '-' + color;
|
||||
path = './graphics/wakatime-logo-38' + color + '.png';
|
||||
|
||||
path = './graphics/wakatime-logo-38' + color + '.png';
|
||||
browser.browserAction.setIcon({
|
||||
path: path,
|
||||
});
|
||||
}
|
||||
|
||||
browser.browserAction.setIcon({
|
||||
path: path
|
||||
});
|
||||
}
|
||||
if (color === '') {
|
||||
browser.storage.sync
|
||||
.get({
|
||||
theme: config.theme,
|
||||
})
|
||||
.then(function (items) {
|
||||
if (items.theme == config.theme) {
|
||||
path = './graphics/wakatime-logo-38.png';
|
||||
|
||||
if (color === '') {
|
||||
browser.storage.sync.get({
|
||||
theme: config.theme
|
||||
}).then(function (items) {
|
||||
if (items.theme == config.theme) {
|
||||
path = './graphics/wakatime-logo-38.png';
|
||||
|
||||
browser.browserAction.setIcon({
|
||||
path: path
|
||||
});
|
||||
}
|
||||
else {
|
||||
path = './graphics/wakatime-logo-38-white.png';
|
||||
|
||||
browser.browserAction.setIcon({
|
||||
path: path
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
browser.browserAction.setIcon({
|
||||
path: path,
|
||||
});
|
||||
} else {
|
||||
path = './graphics/wakatime-logo-38-white.png';
|
||||
|
||||
browser.browserAction.setIcon({
|
||||
path: path,
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = changeExtensionIcon;
|
||||
|
||||
@@ -11,32 +11,32 @@ var in_array = require('./in_array');
|
||||
* @param state
|
||||
*/
|
||||
function changeExtensionState(state) {
|
||||
if (! in_array(state, config.states)) {
|
||||
throw new Error('Not a valid state!');
|
||||
}
|
||||
if (!in_array(state, config.states)) {
|
||||
throw new Error('Not a valid state!');
|
||||
}
|
||||
|
||||
switch (state) {
|
||||
case 'allGood':
|
||||
changeExtensionIcon(config.colors.allGood);
|
||||
changeExtensionTooltip(config.tooltips.allGood);
|
||||
break;
|
||||
case 'notLogging':
|
||||
changeExtensionIcon(config.colors.notLogging);
|
||||
changeExtensionTooltip(config.tooltips.notLogging);
|
||||
break;
|
||||
case 'notSignedIn':
|
||||
changeExtensionIcon(config.colors.notSignedIn);
|
||||
changeExtensionTooltip(config.tooltips.notSignedIn);
|
||||
break;
|
||||
case 'blacklisted':
|
||||
changeExtensionIcon(config.colors.notLogging);
|
||||
changeExtensionTooltip(config.tooltips.blacklisted);
|
||||
break;
|
||||
case 'whitelisted':
|
||||
changeExtensionIcon(config.colors.notLogging);
|
||||
changeExtensionTooltip(config.tooltips.whitelisted);
|
||||
break;
|
||||
}
|
||||
switch (state) {
|
||||
case 'allGood':
|
||||
changeExtensionIcon(config.colors.allGood);
|
||||
changeExtensionTooltip(config.tooltips.allGood);
|
||||
break;
|
||||
case 'notLogging':
|
||||
changeExtensionIcon(config.colors.notLogging);
|
||||
changeExtensionTooltip(config.tooltips.notLogging);
|
||||
break;
|
||||
case 'notSignedIn':
|
||||
changeExtensionIcon(config.colors.notSignedIn);
|
||||
changeExtensionTooltip(config.tooltips.notSignedIn);
|
||||
break;
|
||||
case 'blacklisted':
|
||||
changeExtensionIcon(config.colors.notLogging);
|
||||
changeExtensionTooltip(config.tooltips.blacklisted);
|
||||
break;
|
||||
case 'whitelisted':
|
||||
changeExtensionIcon(config.colors.notLogging);
|
||||
changeExtensionTooltip(config.tooltips.whitelisted);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = changeExtensionState;
|
||||
module.exports = changeExtensionState;
|
||||
|
||||
@@ -8,15 +8,13 @@ var config = require('../config');
|
||||
* @param text
|
||||
*/
|
||||
function changeExtensionTooltip(text) {
|
||||
if (text === '') {
|
||||
text = config.name;
|
||||
} else {
|
||||
text = config.name + ' - ' + text;
|
||||
}
|
||||
|
||||
if (text === '') {
|
||||
text = config.name;
|
||||
}
|
||||
else {
|
||||
text = config.name + ' - ' + text;
|
||||
}
|
||||
|
||||
browser.browserAction.setTitle({title: text});
|
||||
browser.browserAction.setTitle({ title: text });
|
||||
}
|
||||
|
||||
module.exports = changeExtensionTooltip;
|
||||
module.exports = changeExtensionTooltip;
|
||||
|
||||
@@ -7,25 +7,24 @@
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function contains(url, list) {
|
||||
var lines = list.split('\n');
|
||||
var lines = list.split('\n');
|
||||
|
||||
for (var i = 0; i < lines.length; i ++) {
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
// Trim all lines from the list one by one
|
||||
var cleanLine = lines[i].trim();
|
||||
|
||||
// Trim all lines from the list one by one
|
||||
var cleanLine = lines[i].trim();
|
||||
// If by any chance one line in the list is empty, ignore it
|
||||
if (cleanLine === '') continue;
|
||||
|
||||
// If by any chance one line in the list is empty, ignore it
|
||||
if(cleanLine === '') continue;
|
||||
var lineRe = new RegExp(cleanLine.replace('.', '.').replace('*', '.*'));
|
||||
|
||||
var lineRe = new RegExp(cleanLine.replace('.', '\.').replace('*', '.*'));
|
||||
|
||||
// If url matches the current line return true
|
||||
if (lineRe.test(url)) {
|
||||
return true;
|
||||
}
|
||||
// If url matches the current line return true
|
||||
if (lineRe.test(url)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
module.exports = contains;
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
* @returns {string}
|
||||
*/
|
||||
function getDomainFromUrl(url) {
|
||||
var parts = url.split('/');
|
||||
var parts = url.split('/');
|
||||
|
||||
return parts[0] + "//" + parts[2];
|
||||
return parts[0] + '//' + parts[2];
|
||||
}
|
||||
|
||||
module.exports = getDomainFromUrl;
|
||||
module.exports = getDomainFromUrl;
|
||||
|
||||
@@ -6,13 +6,13 @@
|
||||
* @returns {boolean}
|
||||
*/
|
||||
function in_array(needle, haystack) {
|
||||
for (var i = 0; i < haystack.length; i ++) {
|
||||
if (needle == haystack[i]) {
|
||||
return true;
|
||||
}
|
||||
for (var i = 0; i < haystack.length; i++) {
|
||||
if (needle == haystack[i]) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
module.exports = in_array;
|
||||
module.exports = in_array;
|
||||
|
||||
@@ -10,7 +10,4 @@ var ReactDOM = require('react-dom');
|
||||
// React components
|
||||
var Options = require('./components/Options.jsx');
|
||||
|
||||
ReactDOM.render(
|
||||
<Options />,
|
||||
document.getElementById('wakatime-options')
|
||||
);
|
||||
ReactDOM.render(<Options />, document.getElementById('wakatime-options'));
|
||||
|
||||
Reference in New Issue
Block a user