React

by Abdul Ahmad

HTML

<div id="app"></div>

CSS

body {
  background: #20262E;
  padding: 20px;
  font-family: Helvetica;
}

#app {
  background: #fff;
  border-radius: 4px;
  padding: 20px;
  transition: all 0.2s;
}

li {
  margin: 8px 0;
}

h2 {
  font-weight: bold;
  margin-bottom: 15px;
}

.done {
  color: rgba(0, 0, 0, 0.3);
  text-decoration: line-through;
}

input {
  margin-right: 5px;
}

React

function App() {
	const { valPromise } = useSomeHook();
  const [state, setState] = React.useState();
  
  React.useEffect(() => {
  	valPromise.then(r => {
    	setState(r);
    });
  }, []);
  
  if (!state) return 'not resolved yet';
  return 'resolved: ' + state;
}

function useSomeHook() {
  const [state, setState] = React.useState();
  const resolve = React.useRef();
	const valPromise = React.useRef(new Promise((res) => {
  	if (resolve.current) return;
  	resolve.current = val => {
      console.log('resolved val', val);
    	res(val);
    }
  }));
  
  React.useEffect(() => {
  	getValTimeout({ setState });
  }, []);
  
  React.useEffect(() => {
  	if (!state) return;
    resolve.current(state);
  }, [state]);
  
  return { valPromise: valPromise.current };
}

function getValTimeout({ setState }) {
	setTimeout(() => {
  	setState('the val');
  }, 1000);
}

ReactDOM.render(<App />, document.querySelector("#app"))