Skip to content

Instantly share code, notes, and snippets.

@GGrassiant
Last active September 29, 2020 21:21
Show Gist options
  • Save GGrassiant/2fb91f02ad35b880cfd8619247ef2077 to your computer and use it in GitHub Desktop.
Save GGrassiant/2fb91f02ad35b880cfd8619247ef2077 to your computer and use it in GitHub Desktop.
Easy React Hooks translator

Easy React Hooks translator

  • Input
  • Debouncing
  • Dropdown
import React, { useState, useEffect } from 'react';
import axios from 'axios';
const Convert = ({ language, text }) => {
const [translated, setTranslated] = useState('');
const [debouncedText, setDebouncedText] = useState(text);
useEffect(() => {
const timerId = setTimeout(() => {
setDebouncedText(text);
}, 500);
return () => {
clearTimeout(timerId);
};
}, [text]);
useEffect(() => {
const doTranslation = async () => {
const { data } = await axios.post(
'https://translation.googleapis.com/language/translate/v2',
{},
{
params: {
q: debouncedText,
target: language.value,
key: API_KEY,
},
}
);
setTranslated(data.data.translations[0].translatedText);
};
doTranslation();
}, [language, debouncedText]);
return (
<div>
<h1 className="ui header">{translated}</h1>
</div>
);
};
export default Convert;
import React, { useState, useEffect, useRef } from 'react';
const Dropdown = ({ label, options, selected, onSelectedChange }) => {
const [open, setOpen] = useState(false);
const ref = useRef();
useEffect(() => {
const onBodyClick = (event) => {
if (ref.current.contains(event.target)) {
return;
}
setOpen(false);
};
document.body.addEventListener('click', onBodyClick);
return () => {
document.body.removeEventListener('click', onBodyClick);
};
}, []);
const renderedOptions = options.map((option) => {
if (option.value === selected.value) {
return null;
}
return (
<div
key={option.value}
className="item"
onClick={() => onSelectedChange(option)}
>
{option.label}
</div>
);
});
return (
<div ref={ref} className="ui form">
<div className="field">
<label className="label">{label}</label>
<div
onClick={() => setOpen(!open)}
className={`ui selection dropdown ${open ? 'visible active' : ''}`}
>
<i className="dropdown icon"></i>
<div className="text">{selected.label}</div>
<div className={`menu ${open ? 'visible transition' : ''}`}>
{renderedOptions}
</div>
</div>
</div>
</div>
);
};
export default Dropdown;
import React, { useState } from 'react';
import Translate from './components/Translate';
export default () => {
return (
<div>
<Translate />
</div>
);
};
import React, { useState } from 'react';
import Dropdown from './Dropdown';
import Convert from './Convert';
const options = [
{
label: 'Afrikaans',
value: 'af',
},
{
label: 'Arabic',
value: 'ar',
},
{
label: 'Hindi',
value: 'hi',
},
{
label: 'Dutch',
value: 'nl',
},
];
const Translate = () => {
const [language, setLanguage] = useState(options[0]);
const [text, setText] = useState('');
return (
<div>
<div className="ui form">
<div className="field">
<label>Enter Text</label>
<input value={text} onChange={(e) => setText(e.target.value)} />
</div>
</div>
<Dropdown
label="Select a Language"
selected={language}
onSelectedChange={setLanguage}
options={options}
/>
<hr />
<h3 className="ui header">Output</h3>
<Convert text={text} language={language} />
</div>
);
};
export default Translate;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment