From 224aee868ce5271e95c31f83a9cd69b16f1453b6 Mon Sep 17 00:00:00 2001 From: Grey Date: Sun, 4 Aug 2019 01:06:32 -0500 Subject: [PATCH] some fixes --- public/scss/home.scss | 28 +++++++++++++++++++++++++++ src/classes/data.ts | 5 ++++- src/classes/stockx.ts | 8 +++++--- src/common/types.ts | 3 +++ src/main/main.ts | 15 ++++++++++++++ src/renderer/components/tableItem.tsx | 1 + src/renderer/routes/Home.tsx | 14 ++++++++++++-- src/renderer/routes/Settings.tsx | 27 ++++++++++++++++++-------- 8 files changed, 87 insertions(+), 14 deletions(-) diff --git a/public/scss/home.scss b/public/scss/home.scss index 6ba60af..ffd7f15 100644 --- a/public/scss/home.scss +++ b/public/scss/home.scss @@ -135,6 +135,8 @@ $tableBackground: #fff; } .sync-container { margin: 0 0 0 auto; + display: flex; + flex-direction: row; .goat-btn { height: 51px; width: 220px; @@ -145,6 +147,7 @@ $tableBackground: #fff; border-radius: 4px; color: #000000; font-size: 14px; + margin-left: 18px; padding: 12px 36px; background: #fff; outline: none; @@ -156,6 +159,31 @@ $tableBackground: #fff; max-width: 100%; } } + .stockx-btn { + height: 51px; + width: 216px; + display: flex; + justify-content: center; + align-items: center; + cursor: pointer; + border-radius: 4px; + color: #fff; + font-size: 14px; + padding: 12px 36px; + background: #3bae2b; + outline: none; + background-image: radial-gradient( + at top left, + #51bf43, #3bae2b + ); + box-shadow: 0px 15px 85px -7px rgba(0,0,0,0.2); + .img { + margin-left: .6rem; + width: 70px; + height: auto; + max-width: 100%; + } + } } } .sales-table { diff --git a/src/classes/data.ts b/src/classes/data.ts index 5b91de6..25ebc1b 100644 --- a/src/classes/data.ts +++ b/src/classes/data.ts @@ -25,7 +25,10 @@ export const data: DataManager = { fs.writeFileSync(settingsPath, JSON.stringify({ goatUsername: '', goatPassword: '', - goatAuthToken: '' + goatAuthToken: '', + stockxEmail: '', + stockxPassword: '', + stockxJwtToken: '' })); } saleStorage = JSON.parse(fs.readFileSync(salesPath).toString()); diff --git a/src/classes/stockx.ts b/src/classes/stockx.ts index 24920c1..9b283ed 100644 --- a/src/classes/stockx.ts +++ b/src/classes/stockx.ts @@ -30,12 +30,14 @@ export class Stockx { password }, json: true, - jar: this.jar + jar: this.jar, + resolveWithFullResponse: true }); - this.jwtToken = res.headers['Jwt-Authorization']; + this.jwtToken = res.headers['jwt-authorization']; - return ''; + return this.jwtToken; } catch (e) { + console.error(e); return ''; } } diff --git a/src/common/types.ts b/src/common/types.ts index 153ffca..0d476a0 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -19,6 +19,9 @@ export type Settings = { goatUsername: string; goatPassword: string; goatAuthToken: string; + stockxEmail: string; + stockxPassword: string; + stockxJwtToken: string; }; export type DataManager = { diff --git a/src/main/main.ts b/src/main/main.ts index 11e06e5..53eb474 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -9,8 +9,10 @@ import * as url from 'url'; import { data } from '@/classes/data'; import { SaleInfo, Settings } from '@/common/types'; import { Goat } from '../classes/goat'; +import { Stockx } from '../classes/stockx'; const goat: Goat = new Goat(); +const stockx: Stockx = new Stockx(); const devtools: boolean = false; let mainWindow: Electron.BrowserWindow | null; @@ -93,6 +95,19 @@ ipcMain.on('goatLogin', async (event: IpcMessageEvent, arg: { username: string; } }); +ipcMain.on('stockxLogin', async (event: IpcMessageEvent, arg: { email: string; password: string }) => { + // tslint:disable: possible-timing-attack + const token: string = await stockx.logIn(arg.email, arg.password); + if (token) { + data.setSetting('stockxEmail', arg.email); + data.setSetting('stockxPassword', arg.password); + data.setSetting('stockxJwtToken', token); + mainWindow!.webContents.send('stockxLoginResponse', true); + } else { + mainWindow!.webContents.send('stockxLoginResponse', false); + } +}); + ipcMain.on('syncGoatSales', async (event: IpcMessageEvent) => { await goat.getSales(); mainWindow!.webContents.send('getSales', data.getSales()); diff --git a/src/renderer/components/tableItem.tsx b/src/renderer/components/tableItem.tsx index ddb7116..94d8c3b 100644 --- a/src/renderer/components/tableItem.tsx +++ b/src/renderer/components/tableItem.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import Select from 'react-select'; import { ipcRenderer } from 'electron'; +import { SaleInfo } from '@/common/types'; type Action = { label: string; value: string }; type TableItemProps = { diff --git a/src/renderer/routes/Home.tsx b/src/renderer/routes/Home.tsx index f696ed5..b4a2fee 100644 --- a/src/renderer/routes/Home.tsx +++ b/src/renderer/routes/Home.tsx @@ -4,6 +4,7 @@ import Modal from 'react-responsive-modal'; import { SaleInfo, Settings } from '@/common/types'; import * as GoatLogo from '@public/img/goat.png'; +import * as StockxLogo from '@public/img/stockx.png'; import '@public/scss/home.scss'; import { AddSale } from '../components/addSale'; import { TableItem } from '../components/tableItem'; @@ -19,6 +20,7 @@ type HomeState = { sales: SaleInfo[]; addModalOpen: boolean; goatConnected: boolean; + stockxConnected: boolean; }; let storedSales: SaleInfo[] = []; @@ -42,7 +44,8 @@ export class Home extends React.Component { this.state = { sales: [], addModalOpen: false, - goatConnected: false + goatConnected: false, + stockxConnected: false }; this.grossProfit = 0; @@ -77,7 +80,6 @@ export class Home extends React.Component { } } - let mostProfitable: number = 0; for (const sale of sales) { this.netProfit += sale.netProfit; @@ -107,6 +109,9 @@ export class Home extends React.Component { if (settings.goatAuthToken) { this.setState({ goatConnected: true }); } + if (settings.stockxJwtToken) { + this.setState({ stockxConnected: true }); + } }); } @@ -210,6 +215,11 @@ export class Home extends React.Component { {this.state.sales.length} {this.state.sales.length === 1 ? 'Sale' : 'Sales'}
+ {this.state.goatConnected ? ( + + ) : null } {this.state.goatConnected ? ( +
@@ -126,7 +134,10 @@ export class Settings extends React.Component { }); } - private showToast(): void { - toast.error('Stockx connections may be coming soon.'); + private stockxLogin(): void { + ipcRenderer.send('stockxLogin', { + email: this.state.stockxEmail, + password: this.state.stockxPassword + }); } }