You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

133 lines
5.3 KiB

import React, { Component } from 'react'
import ReactDOM from 'react-dom';
import { HashRouter, Route, Link } from 'react-router-dom'
import { Menu, Container, Modal, Button, Image } from 'semantic-ui-react'
import 'semantic-ui-css/semantic.min.css';
import About from './About/About'
import Home from './Home/Home'
import ShareX from './ShareX/ShareX'
export default class BaseComponent extends Component {
state = {
open: true,
userData: {},
authorized: false,
activeItem: ""
}
onOAuthClose() {
this.setState({ open: true })
}
handleItemClick = (e, { name }) => this.setState({ activeItem: name })
componentWillMount() {
this.checkAuth()
}
checkAuth = () => {
const that = this,
token = window.localStorage.getItem('token');
if (token) {
fetch('/api/v1/check', {
method: 'POST',
body: JSON.stringify({
Token: token
}),
headers: {
'Content-Type': 'application/json'
}
}).then(res => res.ok ? res.json() : Promise.reject(res.json())) // Check if the request was StatusOK, otherwise reject Promise
.then(d => {
that.setState({ userData: d })
that.setState({ authorized: true })
})
.catch(e => {
window.localStorage.removeItem('token');
that.setState({ authorized: false })
})
}
}
onAuthCallback = data => {
// clear the old event listener, so that the event can only emitted be once
window.removeEventListener('onAuthCallback', this.onAuthCallback);
window.localStorage.setItem('token', data.detail.token);
this.checkAuth();
}
onAuthClick = () => {
window.addEventListener('onAuthCallback', this.onAuthCallback, false);
// Open the oAuth window that is it centered in the middle of the screen
var wwidth = 400,
wHeight = 500;
var wLeft = (window.screen.width / 2) - (wwidth / 2);
var wTop = (window.screen.height / 2) - (wHeight / 2);
window.open('/api/v1/login', '', `width=${wwidth}, height=${wHeight}, top=${wTop}, left=${wLeft}`)
}
handleLogout = () => {
window.localStorage.removeItem("token")
this.setState({ authorized: false })
}
render() {
const { open, authorized, activeItem, userData } = this.state
if (!authorized) {
return (
<Modal size='tiny' open={open} onClose={this.onOAuthClose}>
<Modal.Header>
Authentication
</Modal.Header>
<Modal.Content>
<p>Currently you are only able to use Google as authentication service:</p>
<div className='ui center aligned segment'>
<Button className='ui google plus button' onClick={this.onAuthClick}>
<i className='google icon'></i>
Login with Google
</Button>
</div>
</Modal.Content>
</Modal>
)
}
return (
<HashRouter>
<Container style={{ marginTop: "15px" }}>
<Menu stackable>
<Menu.Item as={Link} to="/" name='shorten' onClick={this.handleItemClick} >
<Image src={userData.Picture} alt='user profile' circular size='mini' />
</Menu.Item>
<Menu.Item name='shorten' active={activeItem === 'shorten'} onClick={this.handleItemClick} as={Link} to="/">
Shorten
</Menu.Item>
<Menu.Item name='ShareX' active={activeItem === 'ShareX'} onClick={this.handleItemClick} as={Link} to="/sharex">
ShareX Config Generator
</Menu.Item>
<Menu.Item name='recent' active={activeItem === 'recent'} onClick={this.handleItemClick} as={Link} to="/recent">
Recently Shortened URLs
</Menu.Item>
<Menu.Item name='lookup' active={activeItem === 'lookup'} onClick={this.handleItemClick} as={Link} to="/lookup">
Lookup URLs
</Menu.Item>
<Menu.Item name='about' active={activeItem === 'about'} onClick={this.handleItemClick} as={Link} to="/about">
About
</Menu.Item>
<Menu.Menu position='right'>
<Menu.Item onClick={this.handleLogout}>Logout</Menu.Item>
</Menu.Menu>
</Menu>
<Route exact path="/" component={Home} />
<Route path="/about" component={About} />
<Route path="/ShareX" component={ShareX} />
</Container>
</HashRouter>
)
}
}
ReactDOM.render((
<BaseComponent />
), document.getElementById('root'))
// registerServiceWorker();