import { useState, useEffect, useCallback } from 'react'; import styled from 'styled-components'; import { gzip } from 'pako'; import history from 'history/browser'; import copy from 'copy-to-clipboard'; import { MenuButton, Button } from './Menu'; import { languageIds } from '../highlighting'; import themes from '../style/themes'; export default function EditorControls({ code, setCode, language, setLanguage, theme, setTheme, zoom }) { const [saving, setSaving] = useState(false); const [recentlySaved, setRecentlySaved] = useState(false); useEffect(() => { setRecentlySaved(false); }, [code, language]) const save = useCallback(() => { if (!code || recentlySaved) { return; } setSaving(true); saveToBytebin(code, language).then((pasteId) => { setSaving(false); setRecentlySaved(true); history.replace({ pathname: pasteId }); copy(window.location.href); document.title = 'paste | ' + pasteId; }); }, [code, language, recentlySaved]); useEffect(() => { const listener = (e) => { if ((e.ctrlKey || e.metaKey)) { if (e.key === 's' || e.key === 'S') { e.preventDefault(); save(); } if (e.key === '=' || e.key === '-') { e.preventDefault(); zoom(e.key === '=' ? 1 : -1); } } } window.addEventListener('keydown', listener); return () => window.removeEventListener('keydown', listener); }, [save, zoom]); function reset() { setCode(''); setLanguage('plain'); history.replace({ pathname: '/' }); document.title = 'paste'; } return (
) } const Header = styled.header` position: fixed; z-index: 2; width: 100%; height: 2em; color: ${props => props.theme.primary}; background: ${props => props.theme.secondary}; display: flex; justify-content: space-between; user-select: none; `; const Section = styled.div` display: flex; align-items: center; `; function langaugeToContentType(language) { if (language === 'json') { return 'application/json'; } else { return 'text/' + language; } } async function saveToBytebin(code, language) { try { const compressed = gzip(code); const contentType = langaugeToContentType(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; }