forked from cerebral/overmind
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.tsx
More file actions
121 lines (107 loc) · 2.68 KB
/
index.tsx
File metadata and controls
121 lines (107 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import * as React from 'react'
import FrontPage from '../FrontPage'
import * as page from 'page'
import * as themes from 'overmind-themes'
import { ThemeProvider } from '../../styled-components'
import { getTheme } from '../../utils'
import Guides from '../Guides'
import Videos from '../Videos'
import Guide from '../Guide'
import Api from '../Api'
import TopBar from '../TopBar'
import { Wrapper } from './elements'
const routesMap = {
'/': FrontPage,
'/guides': Guides,
'/guides/:type/:title': Guide,
'/videos': Videos,
'/videos/:title': Videos,
'/api/:title': Api,
}
export type TVideo = {
title: string
type: string
fileName: string
url: string
shortName: string
}
export type TGuide = {
title: string
type: string
fileName: string
}
export type TApi = {
title: string
fileName: string
}
type State = {
currentPage: string
currentPath: string
videos: TVideo[]
guides: TGuide[]
apis: TApi[]
isLoading: boolean
}
class App extends React.Component<{}, State> {
state = {
currentPage: null,
currentPath: null,
videos: [],
guides: [],
apis: [],
isLoading: true,
}
componentWillMount() {
const routes = Object.keys(routesMap)
routes.forEach((route) =>
page(route, (context) =>
this.setState({ currentPage: route, currentPath: context.path })
)
)
page.redirect('/api', '/api/action')
}
componentDidUpdate(_, prevState) {
if (prevState.currentPath !== this.state.currentPath) {
document.querySelector('#overmind-app').scrollTop = 0
}
}
componentDidMount() {
const el = document.querySelector('#overmind-app') as HTMLElement
el.style.backgroundColor = themes[getTheme()].color.dark
page.start({})
Promise.all([
fetch('/backend/guides').then((response) => response.json()),
fetch('/backend/videos').then((response) => response.json()),
fetch('/backend/apis').then((response) => response.json()),
]).then(([guides, videos, apis]) =>
this.setState({
isLoading: false,
guides,
videos,
apis,
})
)
}
render() {
const { currentPage, currentPath } = this.state
if (!currentPage) {
return null
}
const Page = routesMap[this.state.currentPage]
return (
<ThemeProvider theme={themes[getTheme()]}>
<Wrapper>
<TopBar currentPage={currentPage} selectedTheme={getTheme()} />
<Page
currentPath={currentPath}
isLoading={this.state.isLoading}
videos={this.state.videos}
apis={this.state.apis}
guides={this.state.guides}
/>
</Wrapper>
</ThemeProvider>
)
}
}
export default App