Skip to main content

HOC with hooks - testing hooks

https://github.com/testing-library/react-hooks-testing-library

export const Foo = ({ bar }) => {
  const { result, loading, error } = useRequest(bar);
  if (error) {
    return <ErrorComponent />;
  } else if (loading) {
    return <LoadingComponent />;
  }
  return <ResultComponent result={result} />;
};

This looks reasonably good at a glance, but what about when we have to repeat this pattern for a dozen different requests? You would copy and paste this conditional block to each of those different implementations and in each of them, it would need to be tested on its own.
An HoC implementation could resemble something like this:
const Foo = ({ result }) => <ResultComponent result={result} />;const withRequest = BaseComponent => ({ bar, ...props }) => { const { result, loading, error } = useRequest(bar); return ( <BaseComponent {...props} result={result} loading={loading} error={error} /> ); };const withError = branch(({ error }) => error, ErrorComponent);const withLoading = branch(({ loading }) => loading, LoadingComponent);export default compose( withRequest, withLoading, withError )(Foo);

Prop Mutation

const Result = ({ bar }) => <ResultComponent result={bar} />;const withBar = BaseComponent => ({ foo, ...props }) => (
  <BaseComponent {...props} bar={transform(foo)} />
);export default withBar(Result);
const ResultComponent = (props) => {
const { hello } = props
return (
<div>
<h1>{hello}</h1>
</div>
)
}
ResultComponent.propTypes = {
hello: PropTypes.string.isRequired,
};
const withHello = BaseComponent => (props) => {
const { name } = props
const str = `Hi ${name}`
return <BaseComponent hello={str} />
}
const Hello = withHello(
ResultComponent
);
<Hello name='Joe' />

Comments

Popular posts from this blog

for loop in javascript - promise - .eslintrc for "for of"

the vast majority of cases  map ,  forEach ,  find  etc. can be used.  async function printFiles () { const files = await getFilePaths(); await Promise.all(files. map (async (file) => { const contents = await fs.readFile(file, 'utf8') console.log(contents) })); } const inventory = [ { name : 'apples' , quantity : 2 } , { name : 'bananas' , quantity : 0 } , { name : 'cherries' , quantity : 5 } ] ; const result = inventory . find ( ( { name } ) => name === 'cherries' ) ;   function getFirstMatching(array) { for (let item of array) { const result = heavyTransform(item); if (result) { return result; } } } Specifically this shuts down the whole no-restricted-syntax. If you want to cherry-pick, here is the current definition: 'no-restricted-syntax' : [ 'error' , { selector : 'ForInStatement' , message...

window.URL.createObjectURL is not (yet) available in jest-dom - testing scenario

Since  window.URL.createObjectURL  is not (yet) available in jest-dom, you need to provide a mock implementation for it. Don't forget to reset the mock implementation after each test. describe ( "your test suite" , () => { window . URL . createObjectURL = jest . fn (); afterEach (() => { window . URL . createObjectURL . mockReset (); }); it ( "your test case" , () => { expect ( true ). toBeTruthy (); }); });

setup git account on mac with ssh - push to remote denied with other login

http://burnedpixel.com/blog/setting-up-git-and-github-on-your-mac/#generatenewkey “ SSH  uses public-key cryptography to authenticate the remote computer and allow it to authenticate the user, if necessary. There are several ways to use SSH; one is to use automatically generated public-private key pairs to simply encrypt a network connection, and then use password authentication to log on.” An SSH key basically lets your computer uniquely identify itself when it connects to servers. If Github is aware of the key your computer is using, you won’t have to enter your Github username/password every time you connect. Check for pre-existing SSH keys on your computer Let’s see if your computer has one or more keys already installed: 1 2 # Point the terminal to the directory that would contain SSH keys for your user account. $ cd ~/.ssh If you get the response “No such file or directory”, skip to  Generate a new SSH Key . Otherwise, you’ll need to backup...