import React, { Component } from 'react'
import { Redirect } from 'react-router-dom'
import superagent from 'superagent'
import { connect } from 'react-redux'
import uuidv4 from 'uuid/v4'
import { fetchServers } from '../../actions'
class OauthCallback extends Component {
state = {
notReady: true,
message: 'chotto matte kudasai...',
redirect: '/s',
url: null,
}
async fetchUser() {
const rsp = await superagent.get('/api/auth/user')
sessionStorage.setItem('user', JSON.stringify(rsp.body))
sessionStorage.setItem('user.update', JSON.stringify(Date.now()))
this.props.dispatch({
type: Symbol.for('set user'),
data: rsp.body,
})
}
setupUser() {
const userUpdateTime = sessionStorage.getItem('user.update') || 0
if (+userUpdateTime + 1000 * 60 * 10 > Date.now()) {
const user = sessionStorage.getItem('user')
if (user != null && user !== '') {
this.props.dispatch({
type: Symbol.for('set user'),
data: JSON.parse(user),
})
}
}
return this.fetchUser()
}
async componentDidMount() {
const state = uuidv4()
const oUrl = new URL(window.location.href)
if (oUrl.searchParams.has('r')) {
this.setState({ redirect: oUrl.searchParams.get('r') })
}
window.sessionStorage.setItem(
'state',
JSON.stringify({ state, redirect: oUrl.searchParams.get('r') })
)
try {
await this.setupUser()
this.props.dispatch(fetchServers)
this.setState({ notReady: false })
} catch (e) {
const {
body: { url },
} = await superagent.get('/api/auth/redirect?url=✔️')
const nUrl = new URL(url)
nUrl.searchParams.set('state', state)
this.setState({ url: nUrl.toString() })
window.location.href = nUrl.toString()
}
}
render() {
return this.state.notReady ? (
this.state.message
) : (
<>
Something oopsed, click me to get to where you meant.
>
)
}
}
export default connect(OauthCallback)