codeburst

Bursts of code to power through your day. Web Development articles, tutorials, and news.

Follow publication

Let’s Build an App with Custom React Hooks

Varun Pujari
codeburst
Published in
5 min readApr 24, 2020

--

In every walk in with nature, one receives far more than he seeks. Just like this shot.
Photo by Abdullah Ahmad on Unsplash
Programming Languages Search App

Prerequisites

Let’s get started

create-react-app --template=typescript languages-search-app
.main {
margin-top: 1rem;
}
.uppercase {
text-transform: uppercase;
}
.text-center {
text-align: center;
}
.search-input {
display: block;
margin: auto;
width: 300px;
padding: 0.5rem;
font-size: 0.75rem;
}
import React from "react";
import "./App.css";
const App: React.FC = () => {
return (
<div className="main">
<h2 className="text-center uppercase">Programming Languages</h2>
</div>
);
};
export default App;

Hook to fetch data from API

import Language from "../types/Language";
import { useState, useEffect } from "react";
const useLanguages = () => {
const [languages, setLanguages] = useState<Language[]>([]);
const endpoint = "https://api.npoint.io/33d57619ef599fc57a53";

useEffect(() => {
fetch(endpoint)
.then((response) => response.json())
.then((data) => setLanguages(data))
.catch((error) => console.log({ error }));
}, []);
return languages;
};
export default useLanguages;
export default interface Language {
id: string;
name: string;
}
import React from "react";
import "./App.css";
import useLanguages from "./hooks/languagesHook";const App: React.FC = () => { const languages = useLanguages(); return (
<div className="main">
<h2 className="text-center uppercase">Programming Languages</h2>
{languages.slice(0, 10).map((l) => (
<p className="text-center" key={l.id}>{l.name}</p>
))}
</div>
);
};
export default App;

Hook to process user input

import { useState, useCallback } from "react";const useUserInput = (defaultValue: string = "") => {  const [value, setValue] = useState(defaultValue);
const onChange = useCallback((e) => setValue(e.target.value), []);

return {value, onChange,};
};
export default useUserInput;
import React from "react";
import "./App.css";
import useLanguages from "./hooks/languagesHook";
import useUserInput from "./hooks/userInputHook";
const App: React.FC = () => { const searchText = useUserInput(""); const languages = useLanguages(); return (
<div className="main">
<h2 className="text-center uppercase">Programming Languages</h2>
<input placeholder="Search languages here..."
type="text"
className="search-input text-center"
{...searchText} />
{languages.slice(0, 10).map((l) => (
<p className="text-center" key={l.id}>{l.name}</p>
))}
</div>
);
};
export default App;

Hook to search and filter list of data

import { useMemo } from "react";const useSearchable = <T>(data: T[], searchText: string, searchProps: (item: T) => string[]) => {  return useMemo(() => {    const regex = new RegExp(searchText, "i");    return data.filter((item) =>
searchProps(item).some((sp) => regex.test(sp))
);
}, [data, searchText, searchProps]);
};
export default useSearchable;
import React from "react";
import "./App.css";
import useLanguages from "./hooks/languagesHook";
import useUserInput from "./hooks/userInputHook";
import useSearchable from "./hooks/searchableHook";
const App: React.FC = () => { const searchText = useUserInput(""); const languages = useLanguages(); const searchableLanguages = useSearchable(
languages,
searchText.value,
(l) => [l.name]
);
return (
<div className="main">
<h2 className="text-center uppercase">Programming Languages</h2>
<input placeholder="Search languages here..."
type="text"
className="search-input text-center"
{...searchText} />
{searchableLanguages.slice(0, 10).map((l) => (
<p className="text-center" key={l.id}>{l.name}</p>
))}
</div>
);
};
export default App;

--

--

Published in codeburst

Bursts of code to power through your day. Web Development articles, tutorials, and news.

Written by Varun Pujari

Software Engineer | Chess Lover | IoT Geek

Responses (1)