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: - -[![Chrome Web Store](https://wakatime.com/static/img/chrome-web-store.png)](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 - -![SC open](./screenshots/sc_6-green.png) - -![SC open](./screenshots/sc_6-open.png) - -![Options SC](./screenshots/sc_8-options.png) - - -## 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: + +[![Chrome Web Store](https://wakatime.com/static/img/chrome-web-store.png)](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 + +![SC open](./screenshots/sc_6-green.png) + +![SC open](./screenshots/sc_6-open.png) + +![Options SC](./screenshots/sc_8-options.png) + + +## 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 ( -
- - - Logout - -
- ); - } - - return ( - - - Login - - ); - }; - - // If logging is enabled, display that info to user - var loggingStatus = function() { - if(that.props.loggingEnabled === true && that.props.loggedIn === true) - { - return ( -
-
-

- Disable logging -

-
-
- ); - } - else if(that.props.loggingEnabled === false && that.props.loggedIn === true) - { - return ( -
-
-

- Enable logging -

-
-
- ); - } - }; - - var totalTimeLoggedToday = function() { - if (that.props.loggedIn === true) { - return ( -
-
-
-

{that.props.totalTimeLoggedToday}

- TOTAL TIME LOGGED TODAY -
-
-
- ); - } - }; - - return ( -
- - {totalTimeLoggedToday()} - - {loggingStatus()} - -
- - - Options - - - {loginLogoutButton()} - -
-
- ); - } - -}); - -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 ( +
+ + + Logout + +
+ ); + } + + return ( + + + Login + + ); + }; + + // If logging is enabled, display that info to user + var loggingStatus = function() { + if(that.props.loggingEnabled === true && that.props.loggedIn === true) + { + return ( +
+
+

+ Disable logging +

+
+
+ ); + } + else if(that.props.loggingEnabled === false && that.props.loggedIn === true) + { + return ( +
+
+

+ Enable logging +

+
+
+ ); + } + }; + + var totalTimeLoggedToday = function() { + if (that.props.loggedIn === true) { + return ( +
+
+
+

{that.props.totalTimeLoggedToday}

+ TOTAL TIME LOGGED TODAY +
+
+
+ ); + } + }; + + return ( +
+ + {totalTimeLoggedToday()} + + {loggingStatus()} + +
+ + + Options + + + {loginLogoutButton()} + +
+
+ ); + } + +}); + +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()} - - -
    - -
    - - -
    - -
    -
    - - {loggingStyle()} - -
    - - -
    - -
    -
    - -
    - - -
    - -
    -
    - -
    -
    - -
    -
    -
    - -
    -
    -
    - ); - } -}); - -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()} + + +
    + +
    + + +
    + +
    +
    + + {loggingStyle()} + +
    + + +
    + +
    +
    + +
    + + +
    + +
    +
    + +
    +
    + +
    +
    +
    + +
    +
    +
    + ); + } +}); + +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 +}