import { useState, useEffect } from 'react'; import { languageIds } from '../highlighting'; import { gzip } from 'pako'; import history from 'history/browser'; import copy from 'copy-to-clipboard'; export default function EditorControls({ code, language, setLanguage }) { const [langMenuOpen, setLangMenuOpen] = useState(false); const [saving, setSaving] = useState(false); const [recentlySaved, setRecentlySaved] = useState(false); useEffect(() => { setRecentlySaved(false); }, [code, language]) function save() { if (!code || recentlySaved) { return; } setSaving(true); saveToBytebin(code, language).then((pasteId) => { setSaving(false); setRecentlySaved(true); history.replace({ pathname: pasteId, hash: '' }); copy(window.location.href); document.title = 'paste | ' + pasteId; }); } function toggleLangMenu() { setLangMenuOpen(!langMenuOpen); } function selectLanguage(e, language) { e.stopPropagation(); setLangMenuOpen(false); setLanguage(language); } return (
{recentlySaved ? '[link copied!]' : saving ? '[saving...]' : '[save]' }
[language: {language}] {langMenuOpen && (
    {languageIds.map(id =>
  • selectLanguage(e, id)}>{id}
  • )}
)}
[not pasting code?] [about paste]
) } async function saveToBytebin(code, language) { try { const compressed = gzip(code); const contentType = 'text/' + language; const resp = await fetch('https://bytebin.lucko.me/post', { method: 'POST', headers: { 'Content-Type': contentType, 'Content-Encoding': 'gzip', 'Accept': 'application/json' }, body: compressed }); if (resp.ok) { const json = await resp.json(); return json.key; } } catch (e) { console.log(e); } return null; }