diff --git a/.gitattributes b/.gitattributes
index 10a05a4..170a0fe 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -7,4 +7,11 @@ LICENSE text eol=lf
*.html text eol=lf
*.js text eol=lf
*.json text eol=lf
-*.css text eol=lf
\ No newline at end of file
+*.css text eol=lf
+*.jsx text eol=lf
+.gitignore text eol=lf
+.gitattributes text eol=lf
+.gitmodules text eol=lf
+.jshintrc text eol=lf
+*.md text eol=lf
+*.rst text eol=lf
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 12046f0..be16b69 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,36 +1,36 @@
-# Logs
-logs
-*.log
-
-# Runtime data
-pids
-*.pid
-*.seed
-
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-
-# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
-
-# Compiled binary addons (http://nodejs.org/api/addons.html)
-build/Release
-
-# Dependency directory
-# Deployed apps should consider commenting this line out:
-# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git
-node_modules
-
-.DS_Store
-
-vendor/bower_components
-
-.idea
-
-# Generated chrome extension
-public/
-web-ext-artifacts/
-.web-extension-id
+# Logs
+logs
+*.log
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directory
+# Deployed apps should consider commenting this line out:
+# see https://npmjs.org/doc/faq.html#Should-I-check-my-node_modules-folder-into-git
+node_modules
+
+.DS_Store
+
+vendor/bower_components
+
+.idea
+
+# Generated chrome extension
+public/
+web-ext-artifacts/
+.web-extension-id
diff --git a/.jshintrc b/.jshintrc
index d1ea3e8..11886c7 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -1,10 +1,10 @@
-{
- "node": true,
- "curly": true,
- "latedef": true,
- "quotmark": true,
- "undef": true,
- "unused": true,
- "trailing": true,
- "predef": [ "chrome" ]
-}
+{
+ "node": true,
+ "curly": true,
+ "latedef": true,
+ "quotmark": true,
+ "undef": true,
+ "unused": true,
+ "trailing": true,
+ "predef": [ "chrome" ]
+}
diff --git a/HISTORY.rst b/HISTORY.rst
index 00fd818..671800b 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -1,24 +1,24 @@
-
-History
--------
-
-
-1.0.2 (2016-06-30)
-++++++++++++++++++
-
-- Fix bug preventing options from saving. #42
-
-
-1.0.1 (2016-06-29)
-++++++++++++++++++
-
-- Fix blacklist setting.
-- Misc bug fixes related to icon popup.
-- Send plugin name and version with heartbeat data. #41
-
-
-1.0.0 (2016-06-29)
-++++++++++++++++++
-
-- Birth
-
+
+History
+-------
+
+
+1.0.2 (2016-06-30)
+++++++++++++++++++
+
+- Fix bug preventing options from saving. #42
+
+
+1.0.1 (2016-06-29)
+++++++++++++++++++
+
+- Fix blacklist setting.
+- Misc bug fixes related to icon popup.
+- Send plugin name and version with heartbeat data. #41
+
+
+1.0.0 (2016-06-29)
+++++++++++++++++++
+
+- Birth
+
diff --git a/README.md b/README.md
index 2454f44..37f47a2 100644
--- a/README.md
+++ b/README.md
@@ -1,77 +1,77 @@
-chrome-wakatime
-===============
-
-Automatic time tracking for stats about your website debugging, research, documentation, etc.
-
-Note: Activity from this Chrome extension will not display on leaderboards, so installing this extension may lower your rank.
-
-
-## Installation
-
-1. Install the extension:
-
-[](https://chrome.google.com/webstore/detail/wakatime/jnbbnacmeggbgdjgaoojpmhdlkkpblgi)
-
-2. Login to [WakaTime](https://wakatime.com/).
-
-3. Use Chrome like you normally do and your time will be tracked for you automatically.
-
-4. Visit https://wakatime.com to see your logged time.
-
-5. Use in conjunction with [other WakaTime plugins](https://wakatime.com/plugins).
-
-
-## Screenshots
-
-
-
-
-
-
-
-
-## Development instructions
-
-> For development purposes only.
-
-To get started, install NPM and Bower dependencies, and do an initial build with Gulp:
-```
-npm start
-```
-
-To build the extension once:
-
-```
-npm run gulp
-```
-
-To monitor changes:
-
-```
-npm run watch
-```
-
-Run tests:
-
-```
-npm test
-```
-
-Lint code *(Both JS and JSX)*:
-
-```
-jsxhint --jsx-only .
-```
-
-### Automatic code linting
-
-There is a precommit hook that lints the code before commiting the changes.
-
-
-### Load unpacked in Chrome
-
-1. Clone repository to disk
-2. Go to `Settings` → `Extensions`
-3. Enable `Developer mode`
-4. Click `Load unpacked extension...`
-5. Select repository directory
+chrome-wakatime
+===============
+
+Automatic time tracking for stats about your website debugging, research, documentation, etc.
+
+Note: Activity from this Chrome extension will not display on leaderboards, so installing this extension may lower your rank.
+
+
+## Installation
+
+1. Install the extension:
+
+[](https://chrome.google.com/webstore/detail/wakatime/jnbbnacmeggbgdjgaoojpmhdlkkpblgi)
+
+2. Login to [WakaTime](https://wakatime.com/).
+
+3. Use Chrome like you normally do and your time will be tracked for you automatically.
+
+4. Visit https://wakatime.com to see your logged time.
+
+5. Use in conjunction with [other WakaTime plugins](https://wakatime.com/plugins).
+
+
+## Screenshots
+
+
+
+
+
+
+
+
+## Development instructions
+
+> For development purposes only.
+
+To get started, install NPM and Bower dependencies, and do an initial build with Gulp:
+```
+npm start
+```
+
+To build the extension once:
+
+```
+npm run gulp
+```
+
+To monitor changes:
+
+```
+npm run watch
+```
+
+Run tests:
+
+```
+npm test
+```
+
+Lint code *(Both JS and JSX)*:
+
+```
+jsxhint --jsx-only .
+```
+
+### Automatic code linting
+
+There is a precommit hook that lints the code before commiting the changes.
+
+
+### Load unpacked in Chrome
+
+1. Clone repository to disk
+2. Go to `Settings` → `Extensions`
+3. Enable `Developer mode`
+4. Click `Load unpacked extension...`
+5. Select repository directory
diff --git a/assets/js/app.jsx b/assets/js/app.jsx
index ccec460..0797c4d 100644
--- a/assets/js/app.jsx
+++ b/assets/js/app.jsx
@@ -1,15 +1,15 @@
-
-/* This is a fix for Bootstrap requiring jQuery */
-global.jQuery = require('jquery');
-require('bootstrap');
-
-var React = require('react');
-var ReactDOM = require('react-dom');
-
-// React components
-var WakaTime = require('./components/WakaTime.jsx');
-
-ReactDOM.render(
- ,
- document.getElementById('wakatime')
-);
+
+/* This is a fix for Bootstrap requiring jQuery */
+global.jQuery = require('jquery');
+require('bootstrap');
+
+var React = require('react');
+var ReactDOM = require('react-dom');
+
+// React components
+var WakaTime = require('./components/WakaTime.jsx');
+
+ReactDOM.render(
+ ,
+ document.getElementById('wakatime')
+);
diff --git a/assets/js/components/Alert.jsx b/assets/js/components/Alert.jsx
index e82d8c5..5afd0d5 100644
--- a/assets/js/components/Alert.jsx
+++ b/assets/js/components/Alert.jsx
@@ -1,19 +1,19 @@
-var React = require('react');
-var classNames = require('classnames');
-
-var Alert = React.createClass({
-
- propTypes: {
- type: React.PropTypes.string.isRequired,
- text: React.PropTypes.string.isRequired
- },
-
- render: function() {
- return(
-
{this.props.text}
- );
- }
-
-});
-
-module.exports = Alert;
+var React = require('react');
+var classNames = require('classnames');
+
+var Alert = React.createClass({
+
+ propTypes: {
+ type: React.PropTypes.string.isRequired,
+ text: React.PropTypes.string.isRequired
+ },
+
+ render: function() {
+ return(
+ {this.props.text}
+ );
+ }
+
+});
+
+module.exports = Alert;
diff --git a/assets/js/components/MainList.jsx b/assets/js/components/MainList.jsx
index 76a6443..c01b3c5 100644
--- a/assets/js/components/MainList.jsx
+++ b/assets/js/components/MainList.jsx
@@ -1,106 +1,106 @@
-/* global browser */
-
-var React = require('react');
-
-var MainList = React.createClass({
-
- _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 (
-
- );
- }
-
- return (
-
-
- Login
-
- );
- };
-
- // If logging is enabled, display that info to user
- var loggingStatus = function() {
- if(that.props.loggingEnabled === true && that.props.loggedIn === true)
- {
- return (
-
- );
- }
- else if(that.props.loggingEnabled === false && that.props.loggedIn === true)
- {
- return (
-
- );
- }
- };
-
- var totalTimeLoggedToday = function() {
- if (that.props.loggedIn === true) {
- return (
-
-
-
- {that.props.totalTimeLoggedToday}
- TOTAL TIME LOGGED TODAY
-
-
-
- );
- }
- };
-
- return (
-
-
- {totalTimeLoggedToday()}
-
- {loggingStatus()}
-
-
-
- );
- }
-
-});
-
-module.exports = MainList;
+/* global browser */
+
+var React = require('react');
+
+var MainList = React.createClass({
+
+ _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 (
+
+ );
+ }
+
+ return (
+
+
+ Login
+
+ );
+ };
+
+ // If logging is enabled, display that info to user
+ var loggingStatus = function() {
+ if(that.props.loggingEnabled === true && that.props.loggedIn === true)
+ {
+ return (
+
+ );
+ }
+ else if(that.props.loggingEnabled === false && that.props.loggedIn === true)
+ {
+ return (
+
+ );
+ }
+ };
+
+ var totalTimeLoggedToday = function() {
+ if (that.props.loggedIn === true) {
+ return (
+
+
+
+ {that.props.totalTimeLoggedToday}
+ TOTAL TIME LOGGED TODAY
+
+
+
+ );
+ }
+ };
+
+ return (
+
+
+ {totalTimeLoggedToday()}
+
+ {loggingStatus()}
+
+
+
+ );
+ }
+
+});
+
+module.exports = MainList;
diff --git a/assets/js/components/NavBar.jsx b/assets/js/components/NavBar.jsx
index 6950303..5b2e09a 100644
--- a/assets/js/components/NavBar.jsx
+++ b/assets/js/components/NavBar.jsx
@@ -1,89 +1,89 @@
-var React = require('react');
-
-var NavBar = React.createClass({
-
- render: function() {
-
- var that = this;
-
- var signedInAs = function() {
- if (that.props.loggedIn === true) {
- return (
- Signed in as {that.props.user.full_name}
- );
- }
- };
-
- var dashboard = function() {
- if (that.props.loggedIn === true) {
- return (
-
-
-
- Dashboard
-
-
- );
- }
- };
-
- var customRules = function() {
- if (that.props.loggedIn === true) {
- return (
-
-
-
- Custom Rules
-
-
- );
- }
- };
-
- return (
-
- );
- }
-
-});
-
-module.exports = NavBar;
+var React = require('react');
+
+var NavBar = React.createClass({
+
+ render: function() {
+
+ var that = this;
+
+ var signedInAs = function() {
+ if (that.props.loggedIn === true) {
+ return (
+ Signed in as {that.props.user.full_name}
+ );
+ }
+ };
+
+ var dashboard = function() {
+ if (that.props.loggedIn === true) {
+ return (
+
+
+
+ Dashboard
+
+
+ );
+ }
+ };
+
+ var customRules = function() {
+ if (that.props.loggedIn === true) {
+ return (
+
+
+
+ Custom Rules
+
+
+ );
+ }
+ };
+
+ return (
+
+ );
+ }
+
+});
+
+module.exports = NavBar;
diff --git a/assets/js/components/Options.jsx b/assets/js/components/Options.jsx
index e315043..47e5042 100644
--- a/assets/js/components/Options.jsx
+++ b/assets/js/components/Options.jsx
@@ -1,214 +1,214 @@
-/* global browser */
-
-var React = require('react');
-var ReactCSSTransitionGroup = require('react-addons-css-transition-group');
-
-var config = require('../config');
-
-// React components
-var Alert = require('./Alert.jsx');
-var SitesList = require('./SitesList.jsx');
-
-/**
- * One thing to keep in mind is that you cannot use this.refs.blacklist if
- * the blacklist select box is not being rendered on the form.
- *
- * @type {*|Function}
- */
-var Options = React.createClass({
-
- 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();
- },
-
- 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;
- });
- },
-
- _handleSubmit: function (e) {
- e.preventDefault();
-
- this.saveSettings();
- },
-
- saveSettings: function () {
- var that = this;
-
- 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();
-
- this.setState({loggingStyle: loggingStyle});
- },
-
- _updateBlacklistState: function(sites){
- this.setState({
- blacklist: sites
- });
- },
-
- _updateWhitelistState: function(sites){
- this.setState({
- whitelist: sites
- });
- },
-
- render: function () {
-
- var that = this;
-
- var alert = function() {
- if(that.state.displayAlert === true){
-
- setTimeout(function () {
- that.setState({displayAlert:false});
- }, 2000);
-
- return(
-
- );
- }
- };
-
- var loggingStyle = function () {
-
- if (that.state.loggingStyle == 'blacklist') {
- return (
-
- );
- }
-
- return (
-
- );
-
- };
-
- return (
-
-
-
-
-
- {alert()}
-
-
-
-
-
-
-
- );
- }
-});
-
-module.exports = Options;
+/* global browser */
+
+var React = require('react');
+var ReactCSSTransitionGroup = require('react-addons-css-transition-group');
+
+var config = require('../config');
+
+// React components
+var Alert = require('./Alert.jsx');
+var SitesList = require('./SitesList.jsx');
+
+/**
+ * One thing to keep in mind is that you cannot use this.refs.blacklist if
+ * the blacklist select box is not being rendered on the form.
+ *
+ * @type {*|Function}
+ */
+var Options = React.createClass({
+
+ 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();
+ },
+
+ 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;
+ });
+ },
+
+ _handleSubmit: function (e) {
+ e.preventDefault();
+
+ this.saveSettings();
+ },
+
+ saveSettings: function () {
+ var that = this;
+
+ 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();
+
+ this.setState({loggingStyle: loggingStyle});
+ },
+
+ _updateBlacklistState: function(sites){
+ this.setState({
+ blacklist: sites
+ });
+ },
+
+ _updateWhitelistState: function(sites){
+ this.setState({
+ whitelist: sites
+ });
+ },
+
+ render: function () {
+
+ var that = this;
+
+ var alert = function() {
+ if(that.state.displayAlert === true){
+
+ setTimeout(function () {
+ that.setState({displayAlert:false});
+ }, 2000);
+
+ return(
+
+ );
+ }
+ };
+
+ var loggingStyle = function () {
+
+ if (that.state.loggingStyle == 'blacklist') {
+ return (
+
+ );
+ }
+
+ return (
+
+ );
+
+ };
+
+ return (
+
+
+
+
+
+ {alert()}
+
+
+
+
+
+
+
+ );
+ }
+});
+
+module.exports = Options;
diff --git a/assets/js/components/SitesList.jsx b/assets/js/components/SitesList.jsx
index af034b0..276f6e0 100644
--- a/assets/js/components/SitesList.jsx
+++ b/assets/js/components/SitesList.jsx
@@ -1,35 +1,35 @@
-var React = require('react');
-
-var SitesList = React.createClass({
-
- getDefaultProps: function () {
- return {
- placeholder: 'http://google.com'
- };
- },
-
- _handleChange: function (event) {
- var sites = event.target.value;
-
- this.props.handleChange(sites);
- },
-
- render: function () {
-
- return (
-
-
-
-
-
- {this.props.helpText}
-
- One line per site.
-
-
- );
- }
-});
-
-module.exports = SitesList;
+var React = require('react');
+
+var SitesList = React.createClass({
+
+ getDefaultProps: function () {
+ return {
+ placeholder: 'http://google.com'
+ };
+ },
+
+ _handleChange: function (event) {
+ var sites = event.target.value;
+
+ this.props.handleChange(sites);
+ },
+
+ render: function () {
+
+ return (
+
+
+
+
+
+ {this.props.helpText}
+
+ One line per site.
+
+
+ );
+ }
+});
+
+module.exports = SitesList;
diff --git a/assets/js/components/WakaTime.jsx b/assets/js/components/WakaTime.jsx
index 10e4105..7e858d2 100644
--- a/assets/js/components/WakaTime.jsx
+++ b/assets/js/components/WakaTime.jsx
@@ -1,173 +1,173 @@
-/* global browser */
-
-var React = require("react");
-var $ = require('jquery');
-
-var config = require('../config');
-
-// React components
-var NavBar = require('./NavBar.jsx');
-var MainList = require('./MainList.jsx');
-
-// Core
-var WakaTimeCore = require('../core/WakaTimeCore').default;
-
-// Helpers
-var changeExtensionState = require('../helpers/changeExtensionState');
-
-var Wakatime = React.createClass({
-
- getInitialState: function() {
- return {
- user: {
- full_name: null,
- email: null,
- photo: null
- },
- loggedIn: false,
- loggingEnabled: config.loggingEnabled,
- totalTimeLoggedToday: '0 minutes'
- };
- },
-
- 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
- });
- });
- }
- else {
- changeExtensionState('notSignedIn');
- }
- });
-
- },
-
- 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);
- }
- });
-
- return deferredObject.promise();
- },
-
- _logoutUser: function() {
-
- var that = this;
-
- this.logoutUser().done(function(){
-
- that.setState({
- user: {
- full_name: null,
- email: null,
- photo: null
- },
- loggedIn: false,
- loggingEnabled: false
- });
-
- changeExtensionState('notSignedIn');
-
- });
- },
-
- _disableLogging: function() {
- this.setState({
- loggingEnabled: false
- });
-
- changeExtensionState('notLogging');
-
- browser.storage.sync.set({
- loggingEnabled: false
- });
- },
-
- _enableLogging: function() {
- this.setState({
- loggingEnabled: true
- });
-
- changeExtensionState('allGood');
-
- browser.storage.sync.set({
- loggingEnabled: true
- });
- },
-
- render: function() {
- return (
-
- );
- }
-
-});
-
-module.exports = Wakatime;
+/* global browser */
+
+var React = require("react");
+var $ = require('jquery');
+
+var config = require('../config');
+
+// React components
+var NavBar = require('./NavBar.jsx');
+var MainList = require('./MainList.jsx');
+
+// Core
+var WakaTimeCore = require('../core/WakaTimeCore').default;
+
+// Helpers
+var changeExtensionState = require('../helpers/changeExtensionState');
+
+var Wakatime = React.createClass({
+
+ getInitialState: function() {
+ return {
+ user: {
+ full_name: null,
+ email: null,
+ photo: null
+ },
+ loggedIn: false,
+ loggingEnabled: config.loggingEnabled,
+ totalTimeLoggedToday: '0 minutes'
+ };
+ },
+
+ 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
+ });
+ });
+ }
+ else {
+ changeExtensionState('notSignedIn');
+ }
+ });
+
+ },
+
+ 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);
+ }
+ });
+
+ return deferredObject.promise();
+ },
+
+ _logoutUser: function() {
+
+ var that = this;
+
+ this.logoutUser().done(function(){
+
+ that.setState({
+ user: {
+ full_name: null,
+ email: null,
+ photo: null
+ },
+ loggedIn: false,
+ loggingEnabled: false
+ });
+
+ changeExtensionState('notSignedIn');
+
+ });
+ },
+
+ _disableLogging: function() {
+ this.setState({
+ loggingEnabled: false
+ });
+
+ changeExtensionState('notLogging');
+
+ browser.storage.sync.set({
+ loggingEnabled: false
+ });
+ },
+
+ _enableLogging: function() {
+ this.setState({
+ loggingEnabled: true
+ });
+
+ changeExtensionState('allGood');
+
+ browser.storage.sync.set({
+ loggingEnabled: true
+ });
+ },
+
+ render: function() {
+ return (
+
+ );
+ }
+
+});
+
+module.exports = Wakatime;
diff --git a/assets/js/options.jsx b/assets/js/options.jsx
index 91b61dd..b7f21ec 100644
--- a/assets/js/options.jsx
+++ b/assets/js/options.jsx
@@ -1,16 +1,16 @@
-/* global browser */
-
-/* This is a fix for Bootstrap requiring jQuery */
-global.jQuery = require('jquery');
-require('bootstrap');
-
-var React = require('react');
-var ReactDOM = require('react-dom');
-
-// React components
-var Options = require('./components/Options.jsx');
-
-ReactDOM.render(
- ,
- document.getElementById('wakatime-options')
-);
+/* global browser */
+
+/* This is a fix for Bootstrap requiring jQuery */
+global.jQuery = require('jquery');
+require('bootstrap');
+
+var React = require('react');
+var ReactDOM = require('react-dom');
+
+// React components
+var Options = require('./components/Options.jsx');
+
+ReactDOM.render(
+ ,
+ document.getElementById('wakatime-options')
+);
diff --git a/assets/less/bootstrap/.csslintrc b/assets/less/bootstrap/.csslintrc
index 8e8afb3..005b862 100644
--- a/assets/less/bootstrap/.csslintrc
+++ b/assets/less/bootstrap/.csslintrc
@@ -1,19 +1,19 @@
-{
- "adjoining-classes": false,
- "box-sizing": false,
- "box-model": false,
- "compatible-vendor-prefixes": false,
- "floats": false,
- "font-sizes": false,
- "gradients": false,
- "important": false,
- "known-properties": false,
- "outline-none": false,
- "qualified-headings": false,
- "regex-selectors": false,
- "shorthand": false,
- "text-indent": false,
- "unique-headings": false,
- "universal-selector": false,
- "unqualified-attributes": false
-}
+{
+ "adjoining-classes": false,
+ "box-sizing": false,
+ "box-model": false,
+ "compatible-vendor-prefixes": false,
+ "floats": false,
+ "font-sizes": false,
+ "gradients": false,
+ "important": false,
+ "known-properties": false,
+ "outline-none": false,
+ "qualified-headings": false,
+ "regex-selectors": false,
+ "shorthand": false,
+ "text-indent": false,
+ "unique-headings": false,
+ "universal-selector": false,
+ "unqualified-attributes": false
+}