moah things
This commit is contained in:
@@ -8,10 +8,10 @@
|
|||||||
<div id="example"></div>
|
<div id="example"></div>
|
||||||
|
|
||||||
<!-- Dependencies -->
|
<!-- Dependencies -->
|
||||||
<script src="./node_modules/react/umd/react.development.js"></script>
|
<script src="/node_modules/react/umd/react.development.js"></script>
|
||||||
<script src="./node_modules/react-dom/umd/react-dom.development.js"></script>
|
<script src="/node_modules/react-dom/umd/react-dom.development.js"></script>
|
||||||
<!-- Main -->
|
<!-- Main -->
|
||||||
<script src="./dist/bundle.js"></script>
|
<script src="/dist/bundle.js"></script>
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
"serve": "webpack-dev-server --output-public-path=dist",
|
"serve": "webpack-dev-server --output-public-path=dist --history-api-fallback",
|
||||||
"build": "webpack"
|
"build": "webpack"
|
||||||
},
|
},
|
||||||
"author": "",
|
"author": "",
|
||||||
@@ -16,10 +16,13 @@
|
|||||||
"@types/underscore": "^1.8.6",
|
"@types/underscore": "^1.8.6",
|
||||||
"bootstrap": "^4.0.0-beta.2",
|
"bootstrap": "^4.0.0-beta.2",
|
||||||
"firebase": "^4.8.0",
|
"firebase": "^4.8.0",
|
||||||
|
"path-to-regexp": "^2.1.0",
|
||||||
"re-base": "^3.2.1",
|
"re-base": "^3.2.1",
|
||||||
"react": "^16.2.0",
|
"react": "^16.2.0",
|
||||||
"react-dom": "^16.2.0",
|
"react-dom": "^16.2.0",
|
||||||
"react-redux": "^5.0.6",
|
"react-redux": "^5.0.6",
|
||||||
|
"react-router": "^4.2.0",
|
||||||
|
"react-router-dom": "^4.2.2",
|
||||||
"react-syntax-highlighter": "^6.1.1",
|
"react-syntax-highlighter": "^6.1.1",
|
||||||
"reactstrap": "^5.0.0-alpha.4",
|
"reactstrap": "^5.0.0-alpha.4",
|
||||||
"redux": "^3.7.2",
|
"redux": "^3.7.2",
|
||||||
@@ -28,6 +31,8 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/react": "^16.0.31",
|
"@types/react": "^16.0.31",
|
||||||
"@types/react-dom": "^16.0.3",
|
"@types/react-dom": "^16.0.3",
|
||||||
|
"@types/react-router": "^4.0.20",
|
||||||
|
"@types/react-router-dom": "^4.2.3",
|
||||||
"@types/reactstrap": "^5.0.6",
|
"@types/reactstrap": "^5.0.6",
|
||||||
"awesome-typescript-loader": "^3.4.1",
|
"awesome-typescript-loader": "^3.4.1",
|
||||||
"css-loader": "^0.28.7",
|
"css-loader": "^0.28.7",
|
||||||
|
|||||||
@@ -1,13 +1,66 @@
|
|||||||
// import * as React from "react";
|
import { LoginState } from '../models/LoginState';
|
||||||
// import { Col, FormText } from "reactstrap";
|
import { AppState } from '../models/AppState';
|
||||||
// import Document from '../models/Document'
|
import * as React from 'react';
|
||||||
// export interface EditorProps {document: Document, onChange}
|
import * as _ from 'underscore';
|
||||||
// export class Editor extends React.Component<Document, {}>{
|
import fbData from '../startup/firebase'
|
||||||
// render(){
|
import {Document} from '../models/Document'
|
||||||
// return(
|
import { Col } from 'reactstrap';
|
||||||
// <Col sm="12">
|
|
||||||
// <textarea onch ></textarea>
|
|
||||||
// </Col>);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// }
|
interface EditProps {docId: string, login: LoginState, onChange?: (doc:string)=>void}
|
||||||
|
interface EditState {document: Document}
|
||||||
|
|
||||||
|
export class Editor extends React.Component<EditProps, EditState>{
|
||||||
|
constructor(props: EditProps){
|
||||||
|
super(props)
|
||||||
|
this.state = {
|
||||||
|
document:{
|
||||||
|
Title: '',
|
||||||
|
Body: ''
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
ref: any
|
||||||
|
componentDidMount() {
|
||||||
|
if(!this.props.login.isLoggedIn){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let docId = '';
|
||||||
|
if(this.props && this.props.docId && this.props.docId.length > 0){
|
||||||
|
docId = this.props.docId;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
throw "no doc id!"
|
||||||
|
}
|
||||||
|
//todo move this functionality to the edit container
|
||||||
|
this.ref = fbData.rebase.syncState(`docs/${this.props.login.uid}/${docId}`, {
|
||||||
|
context: this,
|
||||||
|
state: 'document',
|
||||||
|
asArray: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
fbData.rebase.removeBinding(this.ref);
|
||||||
|
}
|
||||||
|
updateDocument(docBody: string){
|
||||||
|
this.setState({
|
||||||
|
document: {
|
||||||
|
Title: '',
|
||||||
|
Body: docBody
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let textArea = null;
|
||||||
|
if(this.props.login.isLoggedIn){
|
||||||
|
textArea = <textarea className="form-control" style={{height: "70vh"}} value={this.state.document.Body} onChange={(event)=>this.updateDocument(event.target.value)}></textarea>
|
||||||
|
}
|
||||||
|
return(
|
||||||
|
<Col sm="12">
|
||||||
|
{textArea}
|
||||||
|
</Col>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
7
src/components/ForOhFour.tsx
Normal file
7
src/components/ForOhFour.tsx
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import * as React from "react";
|
||||||
|
|
||||||
|
export class ForOhFour extends React.Component<any, any>{
|
||||||
|
render(){
|
||||||
|
return <h4>404! oh noes</h4>;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
import { LoginState } from '../models/LoginState';
|
|
||||||
import { Edit } from '../containers/Edit';
|
|
||||||
import { Tab1 } from './Tab1';
|
|
||||||
import * as React from 'react';
|
|
||||||
import { TabContent, TabPane, Nav, NavItem, NavLink, Card, Button, CardTitle, CardText, Row, Col, NavbarBrand } from 'reactstrap';
|
|
||||||
|
|
||||||
export interface TabSelected {tabNumber: string}
|
|
||||||
export interface TabNavProps {login: LoginState}
|
|
||||||
|
|
||||||
export class TabNav extends React.Component<TabNavProps, TabSelected> {
|
|
||||||
constructor(props: TabNavProps) {
|
|
||||||
super(props);
|
|
||||||
|
|
||||||
this.toggle = this.toggle.bind(this);
|
|
||||||
this.state = {
|
|
||||||
tabNumber: "1"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
toggle(tab: string) {
|
|
||||||
if (this.state.tabNumber !== tab) {
|
|
||||||
super.setState({
|
|
||||||
tabNumber: tab
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
render() {
|
|
||||||
var editor = this.props.login.isLoggedIn ? <Edit docId={"awesome"} login={this.props.login} /> : <h4> Please login, yo</h4>
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<Nav tabs className="ml-auto">
|
|
||||||
<NavItem>
|
|
||||||
<NavLink
|
|
||||||
className={this.state.tabNumber === '1' ? 'active': ''}
|
|
||||||
onClick={() => { this.toggle('1'); }}
|
|
||||||
>
|
|
||||||
View
|
|
||||||
</NavLink>
|
|
||||||
</NavItem>
|
|
||||||
<NavItem>
|
|
||||||
<NavLink
|
|
||||||
className={this.state.tabNumber === '2' ? 'active': ''}
|
|
||||||
onClick={() => { this.toggle('2'); }}
|
|
||||||
>
|
|
||||||
Edit
|
|
||||||
</NavLink>
|
|
||||||
</NavItem>
|
|
||||||
</Nav>
|
|
||||||
<TabContent activeTab={this.state.tabNumber}>
|
|
||||||
<TabPane tabId="1">
|
|
||||||
<Row style={{height: '100%'}}>
|
|
||||||
<Tab1 />
|
|
||||||
</Row>
|
|
||||||
</TabPane>
|
|
||||||
<TabPane tabId="2">
|
|
||||||
<Row style={{height: '100%'}}>
|
|
||||||
<Col sm="12">
|
|
||||||
{editor}
|
|
||||||
</Col>
|
|
||||||
</Row>
|
|
||||||
</TabPane>
|
|
||||||
</TabContent>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -24,13 +24,13 @@ public static class Extension
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
export interface ViewerProps {doc?: string, language?: string}
|
||||||
export class Tab1 extends React.Component<any, any>{
|
export class Viewer extends React.Component<ViewerProps, any>{
|
||||||
render(){
|
render(){
|
||||||
return(
|
return(
|
||||||
<Col sm="12">
|
<Col sm="12">
|
||||||
<Card style={{ paddingTop: "10px" }}>
|
<Card style={{ paddingTop: "10px" }}>
|
||||||
<SyntaxHighlighter showLineNumbers={true} language='cs' style={googlecode} >{exampleText}</SyntaxHighlighter>
|
<SyntaxHighlighter showLineNumbers={true} language={this.props.language || 'cs'} style={googlecode} >{this.props.doc || ''}</SyntaxHighlighter>
|
||||||
</Card>
|
</Card>
|
||||||
</Col>);
|
</Col>);
|
||||||
}
|
}
|
||||||
@@ -1,24 +1,33 @@
|
|||||||
|
import { Edit } from './Edit';
|
||||||
import { LoginContainer } from './Login';
|
import { LoginContainer } from './Login';
|
||||||
import { TabNav } from '../components/TabNav';
|
|
||||||
import { NavBar } from '../components/NavBar';
|
import { NavBar } from '../components/NavBar';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import * as redux from 'redux';
|
import * as redux from 'redux';
|
||||||
import {Store} from "redux"
|
import {Store} from "redux"
|
||||||
import { connect } from 'react-redux';
|
import { connect } from 'react-redux';
|
||||||
import { AppState } from '../models/AppState';
|
import { AppState } from '../models/AppState';
|
||||||
|
import { Route, RouteProps, RouterChildContext, RouteComponentProps, Redirect } from 'react-router';
|
||||||
|
import { ForOhFour } from '../components/ForOhFour'
|
||||||
|
import {generateDocId} from '../util/doc'
|
||||||
const mapStateToProps = (state : AppState) : AppState =>
|
const mapStateToProps = (state : AppState) : AppState =>
|
||||||
{
|
{
|
||||||
return state;
|
return state;
|
||||||
};
|
};
|
||||||
class appContainer extends React.Component<AppState, {}>{
|
class appContainer extends React.Component<AppState, any>{
|
||||||
|
|
||||||
render(){
|
render(){
|
||||||
return <div className="app container-fluid">
|
return <div className="app container-fluid">
|
||||||
<NavBar>
|
<NavBar>
|
||||||
<LoginContainer/>
|
<LoginContainer/>
|
||||||
</NavBar>
|
</NavBar>
|
||||||
<TabNav login={this.props.login} />
|
<Route path="/d/:uid/:docId*" render={(routeProps: RouteComponentProps<{docId?: string, uid?: string}>)=>{
|
||||||
|
if(!routeProps.match.params.uid){
|
||||||
|
return <ForOhFour />
|
||||||
|
}
|
||||||
|
if(!routeProps.match.params.docId){
|
||||||
|
return <Redirect to={`/d/${routeProps.match.params.uid}/${generateDocId()}`} />
|
||||||
|
}
|
||||||
|
return <Edit login={this.props.login} docId={routeProps.match.params.docId} />
|
||||||
|
}} />
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,74 +1,67 @@
|
|||||||
import { LoginState } from '../models/LoginState';
|
import { LoginState } from '../models/LoginState';
|
||||||
import { AppState } from '../models/AppState';
|
import { Editor } from '../components/Editor';
|
||||||
|
import { Viewer } from '../components/Viewer';
|
||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import * as _ from 'underscore';
|
import { TabContent, TabPane, Nav, NavItem, NavLink, Card, Button, CardTitle, CardText, Row, Col, NavbarBrand } from 'reactstrap';
|
||||||
import fbData from '../startup/firebase'
|
|
||||||
import {Document} from '../models/Document'
|
|
||||||
import { Col } from 'reactstrap';
|
|
||||||
import { connect } from 'react-redux';
|
|
||||||
|
|
||||||
interface EditProps {docId: string, login: LoginState}
|
export interface EditState {tabNumber: string, doc?: string}
|
||||||
interface EditState {document: Document}
|
export interface EditProps {login: LoginState, docId?: string}
|
||||||
|
|
||||||
export class Edit extends React.Component<EditProps, EditState> {
|
export class Edit extends React.Component<EditProps, EditState> {
|
||||||
constructor(props: EditProps) {
|
constructor(props: EditProps) {
|
||||||
super(props)
|
super(props);
|
||||||
|
|
||||||
|
this.toggle = this.toggle.bind(this);
|
||||||
this.state = {
|
this.state = {
|
||||||
document:{
|
tabNumber: "1"
|
||||||
Title: '',
|
|
||||||
Body: ''
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
ref: any
|
|
||||||
componentDidMount() {
|
toggle(tab: string) {
|
||||||
if(!this.props.login.isLoggedIn){
|
if (this.state.tabNumber !== tab) {
|
||||||
return;
|
super.setState({
|
||||||
}
|
tabNumber: tab
|
||||||
let docId = '';
|
|
||||||
if(this.props && this.props.docId && this.props.docId.length > 0){
|
|
||||||
docId = this.props.docId;
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
docId = this.generateDocId()
|
|
||||||
}
|
|
||||||
this.ref = fbData.rebase.syncState(`docs/${this.props.login.uid}/${docId}`, {
|
|
||||||
context: this,
|
|
||||||
state: 'document',
|
|
||||||
asArray: false
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
componentWillUnmount() {
|
|
||||||
fbData.rebase.removeBinding(this.ref);
|
|
||||||
}
|
}
|
||||||
generateDocId(){
|
|
||||||
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
||||||
let result = '';
|
|
||||||
for (let i = 0; i < 8; i++){
|
|
||||||
result += str.charAt(Math.floor(Math.random()*str.length))
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
updateDocument(docBody: string){
|
|
||||||
this.setState({
|
|
||||||
document: {
|
|
||||||
Title: '',
|
|
||||||
Body: docBody
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let textArea = null;
|
var editlawl = this.props.login.isLoggedIn ? <Editor docId={this.props.docId} login={this.props.login} onChange={(doc:string)=>{this.setState({doc: doc}) }} /> : <h4> Please login, yo</h4>
|
||||||
if(this.props.login.isLoggedIn){
|
var viewer = this.state.tabNumber === '1'? <Viewer doc={this.state.doc} /> : null;
|
||||||
textArea = <textarea className="form-control" style={{height: "70vh"}} value={this.state.document.Body} onChange={(event)=>this.updateDocument(event.target.value)}></textarea>
|
|
||||||
}
|
|
||||||
return (
|
return (
|
||||||
|
<div>
|
||||||
|
<Nav tabs className="ml-auto">
|
||||||
|
<NavItem>
|
||||||
|
<NavLink
|
||||||
|
className={this.state.tabNumber === '1' ? 'active': ''}
|
||||||
|
onClick={() => { this.toggle('1'); }}
|
||||||
|
>
|
||||||
|
View
|
||||||
|
</NavLink>
|
||||||
|
</NavItem>
|
||||||
|
<NavItem>
|
||||||
|
<NavLink
|
||||||
|
className={this.state.tabNumber === '2' ? 'active': ''}
|
||||||
|
onClick={() => { this.toggle('2'); }}
|
||||||
|
>
|
||||||
|
Edit
|
||||||
|
</NavLink>
|
||||||
|
</NavItem>
|
||||||
|
</Nav>
|
||||||
|
<TabContent activeTab={this.state.tabNumber}>
|
||||||
|
<TabPane tabId="1">
|
||||||
|
<Row style={{height: '100%'}}>
|
||||||
|
{viewer}
|
||||||
|
</Row>
|
||||||
|
</TabPane>
|
||||||
|
<TabPane tabId="2">
|
||||||
|
<Row style={{height: '100%'}}>
|
||||||
<Col sm="12">
|
<Col sm="12">
|
||||||
{textArea}
|
{editlawl}
|
||||||
</Col>
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</TabPane>
|
||||||
|
</TabContent>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
73
src/containers/Editor.tsx
Normal file
73
src/containers/Editor.tsx
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
import { LoginState } from '../models/LoginState';
|
||||||
|
import { AppState } from '../models/AppState';
|
||||||
|
import * as React from 'react';
|
||||||
|
import * as _ from 'underscore';
|
||||||
|
import fbData from '../startup/firebase'
|
||||||
|
import {Document} from '../models/Document'
|
||||||
|
import { Col } from 'reactstrap';
|
||||||
|
|
||||||
|
interface EditProps {docId: string, login: LoginState}
|
||||||
|
interface EditState {document: Document}
|
||||||
|
|
||||||
|
export class Editor extends React.Component<EditProps, EditState>{
|
||||||
|
constructor(props: EditProps){
|
||||||
|
super(props)
|
||||||
|
this.state = {
|
||||||
|
document:{
|
||||||
|
Title: '',
|
||||||
|
Body: ''
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
ref: any
|
||||||
|
componentDidMount() {
|
||||||
|
if(!this.props.login.isLoggedIn){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let docId = '';
|
||||||
|
if(this.props && this.props.docId && this.props.docId.length > 0){
|
||||||
|
docId = this.props.docId;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
docId = this.generateDocId()
|
||||||
|
}
|
||||||
|
this.ref = fbData.rebase.syncState(`docs/${this.props.login.uid}/${docId}`, {
|
||||||
|
context: this,
|
||||||
|
state: 'document',
|
||||||
|
asArray: false
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
fbData.rebase.removeBinding(this.ref);
|
||||||
|
}
|
||||||
|
generateDocId(){
|
||||||
|
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||||
|
let result = '';
|
||||||
|
for (let i = 0; i < 8; i++){
|
||||||
|
result += str.charAt(Math.floor(Math.random()*str.length))
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
updateDocument(docBody: string){
|
||||||
|
this.setState({
|
||||||
|
document: {
|
||||||
|
Title: '',
|
||||||
|
Body: docBody
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
render(){
|
||||||
|
let textArea = null;
|
||||||
|
if(this.props.login.isLoggedIn){
|
||||||
|
textArea = <textarea className="form-control" style={{height: "70vh"}} value={this.state.document.Body} onChange={(event)=>this.updateDocument(event.target.value)}></textarea>
|
||||||
|
}
|
||||||
|
return(
|
||||||
|
<Col sm="12">
|
||||||
|
{textArea}
|
||||||
|
</Col>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -31,6 +31,7 @@ class loginContainer extends React.Component<ILoginProps,{}>{
|
|||||||
}
|
}
|
||||||
|
|
||||||
handleLogin(user: firebase.User){
|
handleLogin(user: firebase.User){
|
||||||
|
console.log(user);
|
||||||
if (user) {
|
if (user) {
|
||||||
this.props.onLogin({isLoggedIn: true, displayName: user.displayName, uid: user.uid});
|
this.props.onLogin({isLoggedIn: true, displayName: user.displayName, uid: user.uid});
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ import * as React from "react";
|
|||||||
import * as ReactDOM from "react-dom";
|
import * as ReactDOM from "react-dom";
|
||||||
import { Hello } from "./components/Hello";
|
import { Hello } from "./components/Hello";
|
||||||
import 'bootstrap/dist/css/bootstrap.css';
|
import 'bootstrap/dist/css/bootstrap.css';
|
||||||
import { TabNav } from './components/TabNav'
|
|
||||||
import { NavBar } from './components/NavBar'
|
import { NavBar } from './components/NavBar'
|
||||||
import rebase from './startup/firebase'
|
import rebase from './startup/firebase'
|
||||||
import { LoginContainer } from './containers/Login'
|
import { LoginContainer } from './containers/Login'
|
||||||
@@ -10,10 +9,13 @@ import { createStore } from 'redux'
|
|||||||
import {MainReducer} from './reducers/MainReducer'
|
import {MainReducer} from './reducers/MainReducer'
|
||||||
import { Provider } from 'react-redux'
|
import { Provider } from 'react-redux'
|
||||||
import { AppContainer } from "./containers/AppContainer";
|
import { AppContainer } from "./containers/AppContainer";
|
||||||
|
import { BrowserRouter } from "react-router-dom";
|
||||||
let store = createStore(MainReducer)
|
let store = createStore(MainReducer)
|
||||||
const App = () => (
|
const App = () => (
|
||||||
|
<BrowserRouter>
|
||||||
<AppContainer />
|
<AppContainer />
|
||||||
|
</BrowserRouter>
|
||||||
|
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
8
src/util/doc.ts
Normal file
8
src/util/doc.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
export function generateDocId(){
|
||||||
|
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
||||||
|
let result = '';
|
||||||
|
for (let i = 0; i < 8; i++){
|
||||||
|
result += str.charAt(Math.floor(Math.random()*str.length))
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
@@ -2,12 +2,12 @@ module.exports = {
|
|||||||
entry: "./src/index.tsx",
|
entry: "./src/index.tsx",
|
||||||
output: {
|
output: {
|
||||||
filename: "bundle.js",
|
filename: "bundle.js",
|
||||||
path: __dirname + "/dist"
|
path: __dirname + "./dist",
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|
||||||
// Enable sourcemaps for debugging webpack's output.
|
// Enable sourcemaps for debugging webpack's output.
|
||||||
devtool: "source-map",
|
devtool: "source-map",
|
||||||
|
|
||||||
resolve: {
|
resolve: {
|
||||||
// Add '.ts' and '.tsx' as resolvable extensions.
|
// Add '.ts' and '.tsx' as resolvable extensions.
|
||||||
extensions: [".ts", ".tsx", ".js", ".json"]
|
extensions: [".ts", ".tsx", ".js", ".json"]
|
||||||
|
|||||||
82
yarn.lock
82
yarn.lock
@@ -120,6 +120,10 @@
|
|||||||
version "0.2.5"
|
version "0.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.5.tgz#11ccb45505cb56d4bc0a9a09712b14585248e784"
|
resolved "https://registry.yarnpkg.com/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.2.5.tgz#11ccb45505cb56d4bc0a9a09712b14585248e784"
|
||||||
|
|
||||||
|
"@types/history@*":
|
||||||
|
version "4.6.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.6.2.tgz#12cfaba693ba20f114ed5765467ff25fdf67ddb0"
|
||||||
|
|
||||||
"@types/node@*":
|
"@types/node@*":
|
||||||
version "8.5.1"
|
version "8.5.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.1.tgz#4ec3020bcdfe2abffeef9ba3fbf26fca097514b5"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.1.tgz#4ec3020bcdfe2abffeef9ba3fbf26fca097514b5"
|
||||||
@@ -138,6 +142,21 @@
|
|||||||
"@types/react" "*"
|
"@types/react" "*"
|
||||||
redux "^3.6.0"
|
redux "^3.6.0"
|
||||||
|
|
||||||
|
"@types/react-router-dom@^4.2.3":
|
||||||
|
version "4.2.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-4.2.3.tgz#06e0b67ff536adc0681dffdbe592ae91fb85887d"
|
||||||
|
dependencies:
|
||||||
|
"@types/history" "*"
|
||||||
|
"@types/react" "*"
|
||||||
|
"@types/react-router" "*"
|
||||||
|
|
||||||
|
"@types/react-router@*", "@types/react-router@^4.0.20":
|
||||||
|
version "4.0.20"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-4.0.20.tgz#3404f54e44bba2239ea4320ea701d86d92f05486"
|
||||||
|
dependencies:
|
||||||
|
"@types/history" "*"
|
||||||
|
"@types/react" "*"
|
||||||
|
|
||||||
"@types/react-syntax-highlighter@^0.0.3":
|
"@types/react-syntax-highlighter@^0.0.3":
|
||||||
version "0.0.3"
|
version "0.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-0.0.3.tgz#c15aeac29eb193d11ac3a70e3d489f8539e6ee1a"
|
resolved "https://registry.yarnpkg.com/@types/react-syntax-highlighter/-/react-syntax-highlighter-0.0.3.tgz#c15aeac29eb193d11ac3a70e3d489f8539e6ee1a"
|
||||||
@@ -1953,6 +1972,16 @@ highlight.js@~9.12.0:
|
|||||||
version "9.12.0"
|
version "9.12.0"
|
||||||
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
|
resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e"
|
||||||
|
|
||||||
|
history@^4.7.2:
|
||||||
|
version "4.7.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/history/-/history-4.7.2.tgz#22b5c7f31633c5b8021c7f4a8a954ac139ee8d5b"
|
||||||
|
dependencies:
|
||||||
|
invariant "^2.2.1"
|
||||||
|
loose-envify "^1.2.0"
|
||||||
|
resolve-pathname "^2.2.0"
|
||||||
|
value-equal "^0.4.0"
|
||||||
|
warning "^3.0.0"
|
||||||
|
|
||||||
hmac-drbg@^1.0.0:
|
hmac-drbg@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
|
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
|
||||||
@@ -1965,7 +1994,7 @@ hoek@2.x.x:
|
|||||||
version "2.16.3"
|
version "2.16.3"
|
||||||
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
|
resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed"
|
||||||
|
|
||||||
hoist-non-react-statics@^2.2.1:
|
hoist-non-react-statics@^2.2.1, hoist-non-react-statics@^2.3.0:
|
||||||
version "2.3.1"
|
version "2.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0"
|
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-2.3.1.tgz#343db84c6018c650778898240135a1420ee22ce0"
|
||||||
|
|
||||||
@@ -2103,7 +2132,7 @@ interpret@^1.0.0:
|
|||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
|
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
|
||||||
|
|
||||||
invariant@^2.0.0:
|
invariant@^2.0.0, invariant@^2.2.1, invariant@^2.2.2:
|
||||||
version "2.2.2"
|
version "2.2.2"
|
||||||
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
|
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -2321,6 +2350,10 @@ is-wsl@^1.1.0:
|
|||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
|
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
|
||||||
|
|
||||||
|
isarray@0.0.1:
|
||||||
|
version "0.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
|
||||||
|
|
||||||
isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
|
isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
|
||||||
@@ -2547,7 +2580,7 @@ longest@^1.0.1:
|
|||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
|
resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
|
||||||
|
|
||||||
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
|
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
|
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3091,6 +3124,16 @@ path-to-regexp@0.1.7:
|
|||||||
version "0.1.7"
|
version "0.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
|
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
|
||||||
|
|
||||||
|
path-to-regexp@^1.7.0:
|
||||||
|
version "1.7.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
|
||||||
|
dependencies:
|
||||||
|
isarray "0.0.1"
|
||||||
|
|
||||||
|
path-to-regexp@^2.1.0:
|
||||||
|
version "2.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.1.0.tgz#7e30f9f5b134bd6a28ffc2e3ef1e47075ac5259b"
|
||||||
|
|
||||||
path-type@^1.0.0:
|
path-type@^1.0.0:
|
||||||
version "1.1.0"
|
version "1.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
|
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
|
||||||
@@ -3437,7 +3480,7 @@ promise@^7.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
asap "~2.0.3"
|
asap "~2.0.3"
|
||||||
|
|
||||||
prop-types@^15.5.10, prop-types@^15.5.8, prop-types@^15.6.0:
|
prop-types@^15.5.10, prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0:
|
||||||
version "15.6.0"
|
version "15.6.0"
|
||||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
|
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856"
|
||||||
dependencies:
|
dependencies:
|
||||||
@@ -3601,6 +3644,29 @@ react-redux@^5.0.6:
|
|||||||
loose-envify "^1.1.0"
|
loose-envify "^1.1.0"
|
||||||
prop-types "^15.5.10"
|
prop-types "^15.5.10"
|
||||||
|
|
||||||
|
react-router-dom@^4.2.2:
|
||||||
|
version "4.2.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-4.2.2.tgz#c8a81df3adc58bba8a76782e946cbd4eae649b8d"
|
||||||
|
dependencies:
|
||||||
|
history "^4.7.2"
|
||||||
|
invariant "^2.2.2"
|
||||||
|
loose-envify "^1.3.1"
|
||||||
|
prop-types "^15.5.4"
|
||||||
|
react-router "^4.2.0"
|
||||||
|
warning "^3.0.0"
|
||||||
|
|
||||||
|
react-router@^4.2.0:
|
||||||
|
version "4.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.2.0.tgz#61f7b3e3770daeb24062dae3eedef1b054155986"
|
||||||
|
dependencies:
|
||||||
|
history "^4.7.2"
|
||||||
|
hoist-non-react-statics "^2.3.0"
|
||||||
|
invariant "^2.2.2"
|
||||||
|
loose-envify "^1.3.1"
|
||||||
|
path-to-regexp "^1.7.0"
|
||||||
|
prop-types "^15.5.4"
|
||||||
|
warning "^3.0.0"
|
||||||
|
|
||||||
react-syntax-highlighter@^6.1.1:
|
react-syntax-highlighter@^6.1.1:
|
||||||
version "6.1.1"
|
version "6.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-6.1.1.tgz#4d134fa9217c4025e7fd6efeadd08ba92436ee4e"
|
resolved "https://registry.yarnpkg.com/react-syntax-highlighter/-/react-syntax-highlighter-6.1.1.tgz#4d134fa9217c4025e7fd6efeadd08ba92436ee4e"
|
||||||
@@ -3836,6 +3902,10 @@ resolve-from@^3.0.0:
|
|||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
|
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
|
||||||
|
|
||||||
|
resolve-pathname@^2.2.0:
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879"
|
||||||
|
|
||||||
resolve-url@^0.2.1:
|
resolve-url@^0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
||||||
@@ -4531,6 +4601,10 @@ validate-npm-package-license@^3.0.1:
|
|||||||
spdx-correct "~1.0.0"
|
spdx-correct "~1.0.0"
|
||||||
spdx-expression-parse "~1.0.0"
|
spdx-expression-parse "~1.0.0"
|
||||||
|
|
||||||
|
value-equal@^0.4.0:
|
||||||
|
version "0.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7"
|
||||||
|
|
||||||
vary@~1.1.2:
|
vary@~1.1.2:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
|
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
|
||||||
|
|||||||
Reference in New Issue
Block a user