JSFiddle - React, Tailwind, and code Playground

by pleinx

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.24/browser.js"></script>
<script src="https://npmcdn.com/react@latest/dist/react-with-addons.js"></script>
<script src="https://npmcdn.com/react-dom@latest/dist/react-dom.js"></script>
<script src="https://facebook.github.io/react/js/jsfiddle-integration-babel.js"></script>

<div id="login_panel"></div>

SCSS

.component-login {
  width: 300px;
  padding: 10px;
  border: 1px solid #ccc;
  margin: 10px;
  
  input {
    width: 95%;
    margin-bottom: 10px;
    padding: 5px;
    border-radius: 5px;
    border: 1px solid #ccc;
  }
  
  h3 {
    margin: 0 0 10px;
  }
  
  .component-error {
    display: inline-block;
    margin: 10px 0;
  }
}

Babel + JSX

const DB = {
	userLogins: [
  	{
    	user: 'yoda',
      pass: '1234'
    },
  ]
};

class LoginPanel extends React.Component {
	constructor() {
  	super();
    
    this.state = {
    	loggedIn: false,
      error: false,
      account: {}
    };
  }

	isLoggedIn() {
  	return this.state.loggedIn;
  }
  
  hasError() {
  	return this.state.error;
  }

	renderHeadline() {
    if(this.hasError()) {
    	return <div>UngĂĽltiger Login!</div>;
    }

		let {user} = this.state.account;
  	return (this.isLoggedIn() ? `Hey, ${user}!` : `Anmelden`);
  }
  
  renderLoginForm() {
  	// TODO add onEnter
  	return (
      <div>
        <input type="text" ref="user" placeholder="Ihr Benutzername..." />
        <input type="text" ref="pass" placeholder="Ihr Passwort..." />
      </div>
  	);
  }
  
  renderLoginLogoutButton() {
  	let label = (this.isLoggedIn() ? 'Logout' : 'Login');
    // TODO Add Button
  	return null;
  }
  
  renderHiddenContent() {
  	return <div>Yoda: Good, the dark side is!</div>;
  }

	render() {
  	return (
    	<div className="component-login">
        <h3>{this.renderHeadline()}</h3>
      	{(!this.isLoggedIn() ? this.renderLoginForm() : this.renderHiddenContent())}
        {this.renderLoginLogoutButton()}
      </div>
    );
  }
  
  onSubmit() {
  	if(this.isLoggedIn()) {
    	// user wants to logout
    	this.setState({loggedIn: false, error: false, account: {}});
      return;
    }
  
  	// get the input values
  	let user = this.refs.user.value;
    let pass = this.refs.pass.value;
    
    // check is user valid
    let userData = DB.userLogins.find((account) => {
    	return (account.user === user && account.pass === pass);
    });
    
    if(typeof userData === 'object') {
    	// TODO bugfix
    	this.setState({loggedIn: true, account: userData});
    }
    else {
    	this.setState({error: true});
    }
  }
}

ReactDOM.render(
  <LoginPanel/>,
  document.getElementById('login_panel')
);