2021-03-26 22:00:12 +00:00
|
|
|
import { useState, useEffect } from 'react';
|
2021-03-27 11:49:46 +00:00
|
|
|
import { ThemeProvider } from 'styled-components';
|
|
|
|
|
import ls from 'local-storage';
|
2021-03-26 22:00:12 +00:00
|
|
|
|
|
|
|
|
import EditorControls from './EditorControls';
|
|
|
|
|
import EditorTextArea from './EditorTextArea';
|
2021-03-27 11:49:46 +00:00
|
|
|
import themes from '../style/themes';
|
2021-03-26 22:00:12 +00:00
|
|
|
|
|
|
|
|
export default function Editor({ content, setContent, contentType }) {
|
|
|
|
|
const [language, setLanguage] = useState('plain');
|
2021-03-27 11:49:46 +00:00
|
|
|
const [theme, setTheme] = useState(() => {
|
|
|
|
|
const preference = ls.get('theme');
|
|
|
|
|
if (preference && themes[preference]) {
|
|
|
|
|
return preference;
|
|
|
|
|
} else {
|
|
|
|
|
return 'dark';
|
|
|
|
|
}
|
|
|
|
|
});
|
2021-03-27 14:17:28 +00:00
|
|
|
const [fontSize, setFontSize] = useState(() => {
|
|
|
|
|
const preference = ls.get('fontsize');
|
|
|
|
|
if (preference && preference >= 10 && preference <= 22) {
|
|
|
|
|
return preference;
|
|
|
|
|
} else {
|
|
|
|
|
return 16;
|
|
|
|
|
}
|
|
|
|
|
});
|
2021-03-27 11:49:46 +00:00
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (theme === 'dark') {
|
|
|
|
|
ls.remove('theme');
|
|
|
|
|
} else {
|
|
|
|
|
ls.set('theme', theme);
|
|
|
|
|
}
|
2021-03-27 14:17:28 +00:00
|
|
|
}, [theme]);
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
if (fontSize === 16) {
|
|
|
|
|
ls.remove('fontsize');
|
|
|
|
|
} else {
|
|
|
|
|
ls.set('fontsize', fontSize);
|
|
|
|
|
}
|
|
|
|
|
}, [fontSize]);
|
2021-03-27 11:49:46 +00:00
|
|
|
|
2021-03-26 22:00:12 +00:00
|
|
|
useEffect(() => {
|
|
|
|
|
if (contentType) {
|
|
|
|
|
setLanguage(contentType);
|
|
|
|
|
}
|
|
|
|
|
}, [contentType]);
|
|
|
|
|
|
2021-03-27 14:17:28 +00:00
|
|
|
function zoom(delta) {
|
|
|
|
|
const result = fontSize + delta;
|
|
|
|
|
if (result && result >= 10 && result <= 22) {
|
|
|
|
|
setFontSize(result);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-26 22:00:12 +00:00
|
|
|
return <>
|
2021-03-27 11:49:46 +00:00
|
|
|
<ThemeProvider theme={themes[theme]}>
|
2021-03-27 14:17:28 +00:00
|
|
|
<EditorControls
|
|
|
|
|
code={content} setCode={setContent}
|
|
|
|
|
language={language} setLanguage={setLanguage}
|
|
|
|
|
theme={theme} setTheme={setTheme}
|
|
|
|
|
zoom={zoom}
|
|
|
|
|
/>
|
|
|
|
|
<EditorTextArea code={content} setCode={setContent} language={language} fontSize={fontSize} />
|
2021-03-27 11:49:46 +00:00
|
|
|
</ThemeProvider>
|
2021-03-26 22:00:12 +00:00
|
|
|
</>
|
|
|
|
|
}
|