first react attempts
This commit is contained in:
		
							
								
								
									
										11
									
								
								src/AlternativeBody.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								src/AlternativeBody.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
import * as React from "react";
 | 
			
		||||
 | 
			
		||||
class AlternativeBody extends React.Component{
 | 
			
		||||
    render() {
 | 
			
		||||
        return (
 | 
			
		||||
            <div>Second page!</div>
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default AlternativeBody;
 | 
			
		||||
							
								
								
									
										1
									
								
								src/App.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								src/App.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										70
									
								
								src/App.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								src/App.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
import React from 'react';
 | 
			
		||||
import './App.css';
 | 
			
		||||
import MainBody from "./MainBody";
 | 
			
		||||
import AlternativeBody from "./AlternativeBody"
 | 
			
		||||
import ReactDOM from 'react-dom';
 | 
			
		||||
import 'bootstrap/dist/css/bootstrap.min.css';
 | 
			
		||||
 | 
			
		||||
class App extends React.Component {
 | 
			
		||||
    page1click() {
 | 
			
		||||
        console.log("click page1");
 | 
			
		||||
 | 
			
		||||
        // rerender mainbody space here
 | 
			
		||||
        ReactDOM.render(
 | 
			
		||||
            <MainBody/>,
 | 
			
		||||
            document.getElementById("mainbody")
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    page2click() {
 | 
			
		||||
        console.log("click page2");
 | 
			
		||||
 | 
			
		||||
        // rerender mainbody space here
 | 
			
		||||
        ReactDOM.render(
 | 
			
		||||
            <AlternativeBody/>,
 | 
			
		||||
            document.getElementById("mainbody")
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
        return (
 | 
			
		||||
            <div className="App">
 | 
			
		||||
                <nav className="navbar navbar-expand-sm bg-primary navbar-dark">
 | 
			
		||||
                    <a className="navbar-brand" href="!#">Lukis Tube</a>
 | 
			
		||||
 | 
			
		||||
                    <ul className="navbar-nav">
 | 
			
		||||
                        <li className="nav-item">
 | 
			
		||||
                            <a className="nav-link" onClick={() => this.homePageClick()} href="!#">Home</a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                        <li className="nav-item">
 | 
			
		||||
                            <a className="nav-link" onClick={() => this.homePageClick()} href="!#">Random Video</a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                        <li className="nav-item">
 | 
			
		||||
                            <a className="nav-link" onClick={() => this.homePageClick()} href="!#">Categories</a>
 | 
			
		||||
                        </li>
 | 
			
		||||
                    </ul>
 | 
			
		||||
                </nav>
 | 
			
		||||
                <div>
 | 
			
		||||
                    <button onClick={() => this.page1click()}>Page1</button>
 | 
			
		||||
                    <button onClick={() => this.page2click()}>Page2</button>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div id="mainbody">
 | 
			
		||||
                    mimimimimi
 | 
			
		||||
                </div>
 | 
			
		||||
 | 
			
		||||
            </div>
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    homePageClick() {
 | 
			
		||||
        console.log("click page1");
 | 
			
		||||
 | 
			
		||||
        // rerender mainbody space here
 | 
			
		||||
        ReactDOM.render(
 | 
			
		||||
            <MainBody/>,
 | 
			
		||||
            document.getElementById("mainbody")
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default App;
 | 
			
		||||
							
								
								
									
										19
									
								
								src/MainBody.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/MainBody.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
import React from "react";
 | 
			
		||||
 | 
			
		||||
class MainBody extends React.Component {
 | 
			
		||||
    render() {
 | 
			
		||||
        const requestOptions = {
 | 
			
		||||
            method: 'POST',
 | 
			
		||||
            headers: { 'Content-Type': 'application/json' },
 | 
			
		||||
            body: JSON.stringify({ title: 'React POST Request Example' })
 | 
			
		||||
        };
 | 
			
		||||
        fetch('https://jsonplaceholder.typicode.com/posts', requestOptions)
 | 
			
		||||
            .then(response => response.json())
 | 
			
		||||
            .then(data => this.setState({ postId: data.id }));
 | 
			
		||||
        return (
 | 
			
		||||
            <div>Hey from other class</div>
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default MainBody;
 | 
			
		||||
							
								
								
									
										65
									
								
								src/Zwei.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/Zwei.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,65 @@
 | 
			
		||||
import React from 'react';
 | 
			
		||||
 | 
			
		||||
class TodoApp extends React.Component {
 | 
			
		||||
    constructor(props) {
 | 
			
		||||
        super(props);
 | 
			
		||||
        this.state = {items: [], text: ''};
 | 
			
		||||
        this.handleChange = this.handleChange.bind(this);
 | 
			
		||||
        this.handleSubmit = this.handleSubmit.bind(this);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    render() {
 | 
			
		||||
        return (
 | 
			
		||||
            <div>
 | 
			
		||||
                <h3>TODO</h3>
 | 
			
		||||
                <TodoList items={this.state.items}/>
 | 
			
		||||
                <form onSubmit={this.handleSubmit}>
 | 
			
		||||
                    <label htmlFor="new-todo">
 | 
			
		||||
                        What needs to be done?
 | 
			
		||||
                    </label>
 | 
			
		||||
                    <input
 | 
			
		||||
                        id="new-todo"
 | 
			
		||||
                        onChange={this.handleChange}
 | 
			
		||||
                        value={this.state.text}
 | 
			
		||||
                    />
 | 
			
		||||
                    <button>
 | 
			
		||||
                        Add #{this.state.items.length + 1}
 | 
			
		||||
                    </button>
 | 
			
		||||
                </form>
 | 
			
		||||
            </div>
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    handleChange(e) {
 | 
			
		||||
        this.setState({text: e.target.value});
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    handleSubmit(e) {
 | 
			
		||||
        e.preventDefault();
 | 
			
		||||
        if (this.state.text.length === 0) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        const newItem = {
 | 
			
		||||
            text: this.state.text,
 | 
			
		||||
            id: Date.now()
 | 
			
		||||
        };
 | 
			
		||||
        this.setState(state => ({
 | 
			
		||||
            items: state.items.concat(newItem),
 | 
			
		||||
            text: ''
 | 
			
		||||
        }));
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class TodoList extends React.Component {
 | 
			
		||||
    render() {
 | 
			
		||||
        return (
 | 
			
		||||
            <ul>
 | 
			
		||||
                {this.props.items.map(item => (
 | 
			
		||||
                    <li key={item.id}>{item.text}</li>
 | 
			
		||||
                ))}
 | 
			
		||||
            </ul>
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export default TodoApp;
 | 
			
		||||
							
								
								
									
										13
									
								
								src/index.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/index.css
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
			
		||||
body {
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
 | 
			
		||||
    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
 | 
			
		||||
    sans-serif;
 | 
			
		||||
    -webkit-font-smoothing: antialiased;
 | 
			
		||||
    -moz-osx-font-smoothing: grayscale;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
code {
 | 
			
		||||
    font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
 | 
			
		||||
    monospace;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										17
									
								
								src/index.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/index.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,17 @@
 | 
			
		||||
import React from 'react';
 | 
			
		||||
import ReactDOM from 'react-dom';
 | 
			
		||||
import './index.css';
 | 
			
		||||
import App from './App';
 | 
			
		||||
import * as serviceWorker from './serviceWorker';
 | 
			
		||||
 | 
			
		||||
ReactDOM.render(
 | 
			
		||||
  <React.StrictMode>
 | 
			
		||||
    <App />
 | 
			
		||||
  </React.StrictMode>,
 | 
			
		||||
  document.getElementById('root')
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
// If you want your app to work offline and load faster, you can change
 | 
			
		||||
// unregister() to register() below. Note this comes with some pitfalls.
 | 
			
		||||
// Learn more about service workers: https://bit.ly/CRA-PWA
 | 
			
		||||
serviceWorker.register();
 | 
			
		||||
							
								
								
									
										141
									
								
								src/serviceWorker.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								src/serviceWorker.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,141 @@
 | 
			
		||||
// This optional code is used to register a service worker.
 | 
			
		||||
// register() is not called by default.
 | 
			
		||||
 | 
			
		||||
// This lets the app load faster on subsequent visits in production, and gives
 | 
			
		||||
// it offline capabilities. However, it also means that developers (and users)
 | 
			
		||||
// will only see deployed updates on subsequent visits to a page, after all the
 | 
			
		||||
// existing tabs open on the page have been closed, since previously cached
 | 
			
		||||
// resources are updated in the background.
 | 
			
		||||
 | 
			
		||||
// To learn more about the benefits of this model and instructions on how to
 | 
			
		||||
// opt-in, read https://bit.ly/CRA-PWA
 | 
			
		||||
 | 
			
		||||
const isLocalhost = Boolean(
 | 
			
		||||
  window.location.hostname === 'localhost' ||
 | 
			
		||||
    // [::1] is the IPv6 localhost address.
 | 
			
		||||
    window.location.hostname === '[::1]' ||
 | 
			
		||||
    // 127.0.0.0/8 are considered localhost for IPv4.
 | 
			
		||||
    window.location.hostname.match(
 | 
			
		||||
      /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
 | 
			
		||||
    )
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
export function register(config) {
 | 
			
		||||
  if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
 | 
			
		||||
    // The URL constructor is available in all browsers that support SW.
 | 
			
		||||
    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
 | 
			
		||||
    if (publicUrl.origin !== window.location.origin) {
 | 
			
		||||
      // Our service worker won't work if PUBLIC_URL is on a different origin
 | 
			
		||||
      // from what our page is served on. This might happen if a CDN is used to
 | 
			
		||||
      // serve assets; see https://github.com/facebook/create-react-app/issues/2374
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    window.addEventListener('load', () => {
 | 
			
		||||
      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
 | 
			
		||||
 | 
			
		||||
      if (isLocalhost) {
 | 
			
		||||
        // This is running on localhost. Let's check if a service worker still exists or not.
 | 
			
		||||
        checkValidServiceWorker(swUrl, config);
 | 
			
		||||
 | 
			
		||||
        // Add some additional logging to localhost, pointing developers to the
 | 
			
		||||
        // service worker/PWA documentation.
 | 
			
		||||
        navigator.serviceWorker.ready.then(() => {
 | 
			
		||||
          console.log(
 | 
			
		||||
            'This web app is being served cache-first by a service ' +
 | 
			
		||||
              'worker. To learn more, visit https://bit.ly/CRA-PWA'
 | 
			
		||||
          );
 | 
			
		||||
        });
 | 
			
		||||
      } else {
 | 
			
		||||
        // Is not localhost. Just register service worker
 | 
			
		||||
        registerValidSW(swUrl, config);
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function registerValidSW(swUrl, config) {
 | 
			
		||||
  navigator.serviceWorker
 | 
			
		||||
    .register(swUrl)
 | 
			
		||||
    .then(registration => {
 | 
			
		||||
      registration.onupdatefound = () => {
 | 
			
		||||
        const installingWorker = registration.installing;
 | 
			
		||||
        if (installingWorker == null) {
 | 
			
		||||
          return;
 | 
			
		||||
        }
 | 
			
		||||
        installingWorker.onstatechange = () => {
 | 
			
		||||
          if (installingWorker.state === 'installed') {
 | 
			
		||||
            if (navigator.serviceWorker.controller) {
 | 
			
		||||
              // At this point, the updated precached content has been fetched,
 | 
			
		||||
              // but the previous service worker will still serve the older
 | 
			
		||||
              // content until all client tabs are closed.
 | 
			
		||||
              console.log(
 | 
			
		||||
                'New content is available and will be used when all ' +
 | 
			
		||||
                  'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
 | 
			
		||||
              );
 | 
			
		||||
 | 
			
		||||
              // Execute callback
 | 
			
		||||
              if (config && config.onUpdate) {
 | 
			
		||||
                config.onUpdate(registration);
 | 
			
		||||
              }
 | 
			
		||||
            } else {
 | 
			
		||||
              // At this point, everything has been precached.
 | 
			
		||||
              // It's the perfect time to display a
 | 
			
		||||
              // "Content is cached for offline use." message.
 | 
			
		||||
              console.log('Content is cached for offline use.');
 | 
			
		||||
 | 
			
		||||
              // Execute callback
 | 
			
		||||
              if (config && config.onSuccess) {
 | 
			
		||||
                config.onSuccess(registration);
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    })
 | 
			
		||||
    .catch(error => {
 | 
			
		||||
      console.error('Error during service worker registration:', error);
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function checkValidServiceWorker(swUrl, config) {
 | 
			
		||||
  // Check if the service worker can be found. If it can't reload the page.
 | 
			
		||||
  fetch(swUrl, {
 | 
			
		||||
    headers: { 'Service-Worker': 'script' },
 | 
			
		||||
  })
 | 
			
		||||
    .then(response => {
 | 
			
		||||
      // Ensure service worker exists, and that we really are getting a JS file.
 | 
			
		||||
      const contentType = response.headers.get('content-type');
 | 
			
		||||
      if (
 | 
			
		||||
        response.status === 404 ||
 | 
			
		||||
        (contentType != null && contentType.indexOf('javascript') === -1)
 | 
			
		||||
      ) {
 | 
			
		||||
        // No service worker found. Probably a different app. Reload the page.
 | 
			
		||||
        navigator.serviceWorker.ready.then(registration => {
 | 
			
		||||
          registration.unregister().then(() => {
 | 
			
		||||
            window.location.reload();
 | 
			
		||||
          });
 | 
			
		||||
        });
 | 
			
		||||
      } else {
 | 
			
		||||
        // Service worker found. Proceed as normal.
 | 
			
		||||
        registerValidSW(swUrl, config);
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
    .catch(() => {
 | 
			
		||||
      console.log(
 | 
			
		||||
        'No internet connection found. App is running in offline mode.'
 | 
			
		||||
      );
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export function unregister() {
 | 
			
		||||
  if ('serviceWorker' in navigator) {
 | 
			
		||||
    navigator.serviceWorker.ready
 | 
			
		||||
      .then(registration => {
 | 
			
		||||
        registration.unregister();
 | 
			
		||||
      })
 | 
			
		||||
      .catch(error => {
 | 
			
		||||
        console.error(error.message);
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								src/setupTests.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								src/setupTests.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
// jest-dom adds custom jest matchers for asserting on DOM nodes.
 | 
			
		||||
// allows you to do things like:
 | 
			
		||||
// expect(element).toHaveTextContent(/react/i)
 | 
			
		||||
// learn more: https://github.com/testing-library/jest-dom
 | 
			
		||||
import '@testing-library/jest-dom/extend-expect';
 | 
			
		||||
		Reference in New Issue
	
	Block a user