import React, { Component } from 'react';
import styles from './root.less';
const envVars = require('config');
import { GoogleLogin } from 'react-google-login';
import { Button, Card, Typography } from '@material-ui/core';
import { Send } from '@material-ui/icons';
import { ToastsContainer, ToastsStore } from 'react-toasts';
// Old notification elem for manual use
// const notification = (
//
//
// Successfully executed command!
//
//
// );
const INITIAL_COMMAND_STATE = {
command: 'google',
commandInput: '',
commandIcon:
envVars.DEFAULT_LOGO != null
? envVars.DEFAULT_LOGO
: 'https://s3-us-west-1.amazonaws.com/charify-assets/defaultLogo.png',
commandInputPlaceholder: 'Do Anything You Want',
commandComplete: false,
commandProcessedData: null,
needGoogleAuth: false
};
class MainCommand extends Component {
state = {
googleAccessToken: null,
googleAuthUser: null,
...INITIAL_COMMAND_STATE
};
componentWillMount() {
gapi.load('client:auth2', () => {
gapi.client.init({
apiKey: envVars.GOOGLE_API_KEY,
clientId: envVars.OAUTH2_CLIENT_ID,
discoveryDocs: [
'https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest'
],
scope: 'profile email https://mail.google.com/'
});
// .then(
// function() {
// console.log('properly initialized gapi and client and auth2');
// gapi.auth2
// .getAuthInstance()
// .signIn()
// .then(() => {
// // getting all messages example
// // var messageRequest = gapi.client.gmail.users.messages.get({
// // userId: 'me',
// // id: '16b854db03a69932',
// // format: 'full'
// // });
// // messageRequest.execute(function(response) {
// // console.log(response);
// // });
// });
// },
// function(error) {
// appendPre(JSON.stringify(error, null, 2));
// }
// );
});
}
componentDidMount() {
this.mainBar.focus();
}
googleSignIn = async e => {
await console.log('Going through sign in flow');
const signInResponse = await gapi.auth2.getAuthInstance().signIn();
await console.log('Sign in response', signInResponse);
this.setState({
googleAccessToken: signInResponse.Zi.access_token,
googleAuthUser: signInResponse.w3,
commandComplete: true
});
};
handleInputKeyDown = e => {
var input = e.target.value;
if (e.key === 'Enter' && this.state.commandComplete)
this.handleSubmitCommand(e);
else if ((e.key === 'Backspace' || e.key === 'Delete') && input == '') {
console.log('Clearing out command');
this.setState(INITIAL_COMMAND_STATE);
}
};
handleInputChange = e => {
var newInput = e.target.value;
var newCommand = this.state.command;
var newCommandIcon = this.state.commandIcon;
var newCommandInputPlaceholder = this.state.commandInputPlaceholder;
var newCommandComplete = this.state.commandComplete;
var newCommandProcessedData = this.state.commandProcessedData;
var newNeedGoogleAuth = this.state.needGoogleAuth;
// initial finding that command was entered
// TODO: helper function to properly change properties
if (newInput.includes('gmail') && newCommandIcon == envVars.DEFAULT_LOGO) {
newCommand = 'gmail';
newCommandIcon =
'https://image.flaticon.com/icons/png/512/281/281769.png';
newInput = newInput.replace('gmail', '');
newCommandInputPlaceholder = 'to | subject | message';
newNeedGoogleAuth = true;
} else if (
newInput.includes('utube') &&
newCommandIcon == envVars.DEFAULT_LOGO
) {
newCommand = 'utube';
newCommandIcon =
'https://cdn2.iconfinder.com/data/icons/micon-social-pack/512/youtube-512.png';
newInput = newInput.replace('utube', '');
newCommandComplete = true;
newCommandInputPlaceholder = 'search for any video';
} else if (
newInput.includes('red') &&
newCommandIcon == envVars.DEFAULT_LOGO
) {
newCommand = 'reddit';
newCommandIcon =
'https://cdn0.iconfinder.com/data/icons/social-media-2092/100/social-36-512.png';
newInput = newInput.replace('red', '');
newCommandComplete = true;
newCommandInputPlaceholder = 'search for any subreddit';
} else if (
newInput.includes('twit') &&
newCommandIcon == envVars.DEFAULT_LOGO
) {
newCommand = 'twitter';
newCommandIcon =
'https://www.coopdgii.com/wp-content/uploads/2016/12/Icono_Twitter.png.png';
newInput = newInput.replace('twit', '');
newCommandComplete = true;
newCommandInputPlaceholder = "what's happening";
} else if (
newInput.includes('gdrive') &&
newCommandIcon == envVars.DEFAULT_LOGO
) {
// execute command right away and reset
newCommand = 'gdrive';
newCommandComplete = true;
window.location = 'https://drive.google.com';
this.setState(INITIAL_COMMAND_STATE);
} else if (
newInput.includes('gcal') &&
newCommandIcon == envVars.DEFAULT_LOGO
) {
// execute command right away and reset
newCommand = 'gcal';
newCommandComplete = true;
window.location = 'https://calendar.google.com/calendar/r';
this.setState(INITIAL_COMMAND_STATE);
} else if (
newInput.includes('fb') &&
newCommandIcon == envVars.DEFAULT_LOGO
) {
newCommand = 'fb';
newCommandIcon =
'https://www.petconnectrescue.org/wp-content/uploads/2016/10/FB-icon.png';
newInput = newInput.replace('fb', '');
newCommandComplete = true;
newCommandInputPlaceholder = 'search for people, groups, etc.';
} // this one must be last, as its the default google search
else if (newCommand == 'google') {
newCommand = 'google';
newCommandComplete = true;
newCommandInputPlaceholder = 'search for anything';
}
if (newCommand == 'gmail') {
// TODO: helper function to check if input complete for current command and show submit button
const gmailSendParts = newInput.split('|');
if (gmailSendParts.length == 3) {
newCommandComplete = true;
newCommandProcessedData = gmailSendParts;
}
}
if (newNeedGoogleAuth) {
// Make the user go through google sign in
this.googleSignIn();
}
this.setState({
command: newCommand,
commandInput: newInput,
commandIcon: newCommandIcon,
commandInputPlaceholder: newCommandInputPlaceholder,
commandComplete: newCommandComplete,
commandProcessedData: newCommandProcessedData
});
};
handleSubmitCommand = e => {
// TODO: make executing api calls modular with helpers/services
const processedData = this.state.commandProcessedData;
const commandInput = this.state.commandInput;
if (this.state.command == 'gmail') {
const message =
`From: ${this.state.googleAuthUser.U3}\r\n` +
`To: ${processedData[0]}\r\n` +
`Subject: ${processedData[1]}\r\n\r\n` +
`${processedData[2]}`;
// The body needs to be base64url encoded.
const encodedMessage = btoa(message);
const reallyEncodedMessage = encodedMessage
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
var sendEmail = gapi.client.gmail.users.messages.send({
userId: 'me',
resource: {
// same response with any of these
raw: reallyEncodedMessage
// raw: encodedMessage
// raw: message
}
});
sendEmail.execute(function(response) {
console.log('Sent the Email!', response);
});
} else if (this.state.command == 'google') {
// if they type chase.com it will go straight there
if (commandInput.includes('.com')) {
window.location = 'https://' + commandInput;
} else {
window.location = 'https://www.google.com/search?q=' + commandInput;
}
} else if (this.state.command == 'utube') {
window.open(
'https://www.youtube.com/results?search_query=' + commandInput,
'_blank'
);
} else if (this.state.command == 'reddit') {
window.location = 'https://www.reddit.com/r/' + commandInput;
} else if (this.state.command == 'twitter') {
window.location = 'https://twitter.com/search?q=' + commandInput;
} else if (this.state.command == 'fb') {
var transformedSearchQuery = commandInput.replace(' ', '%20');
var fbUrl =
'https://www.facebook.com/search/top/?q=' + transformedSearchQuery;
window.location = fbUrl;
}
this.setState(INITIAL_COMMAND_STATE, () => {
console.log(this.state);
ToastsStore.success('Successfully executed command!');
});
};
render() {
const {
googleAccessToken,
commandInput,
commandInputPlaceholder,
commandIcon,
commandComplete
} = this.state;
return (
{/* Google Sign In button */}
{/*

Login with Google
*/}
{
this.mainBar = input;
}}
value={commandInput}
onChange={this.handleInputChange}
onKeyDown={this.handleInputKeyDown}
className={styles.searchBar}
placeholder={commandInputPlaceholder}
/>
{commandComplete && (
)}
);
}
}
export default MainCommand;