import React from 'react'; import EventBus from '../../../modules/helpers/eventbus'; import Tooltip from '../../helpers/tooltip/Tooltip'; import TextareaAutosize from '@material-ui/core/TextareaAutosize'; import './quicklinks.scss'; export default class QuickLinks extends React.PureComponent { constructor() { super(); this.state = { items: JSON.parse(localStorage.getItem('quicklinks')), name: '', url: '', showAddLink: 'hidden', nameError: '', urlError: '' }; this.language = window.language.widgets.quicklinks; } deleteLink(key, event) { event.preventDefault(); let data = JSON.parse(localStorage.getItem('quicklinks')); data = data.filter((i) => i.key !== key); localStorage.setItem('quicklinks', JSON.stringify(data)); this.setState({ items: data }); window.stats.postEvent('feature', 'Quicklink delete'); } addLink = () => { let data = JSON.parse(localStorage.getItem('quicklinks')); let url = this.state.url; let nameError, urlError; if (this.state.name.length <= 0) { nameError = this.language.name_error; } // regex: https://ihateregex.io/expr/url/ // eslint-disable-next-line no-useless-escape if (url.length <= 0 || /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)/.test(url) === false) { urlError = this.language.url_error; } if (nameError || urlError) { return this.setState({ nameError: nameError, urlError: urlError }); } if (!url.startsWith('http://') && !url.startsWith('https://')) { url = 'http://' + url; } data.push({ name: this.state.name, url: url, key: Math.random().toString(36).substring(7) + 1 }); localStorage.setItem('quicklinks', JSON.stringify(data)); this.setState({ items: data, name: '', url: '' }); window.stats.postEvent('feature', 'Quicklink add'); this.toggleAdd(); // make sure image is correct size const element = document.querySelector('.quicklinks-container'); const images = element.getElementsByTagName('img'); for (const img of images) { img.style.height = `${0.87 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`; }; } toggleAdd = () => { if (this.state.showAddLink === 'hidden') { this.setState({ showAddLink: 'visible' }); } else { this.setState({ showAddLink: 'hidden' }); } } componentDidMount() { if (localStorage.getItem('offlineMode') === 'true') { return; } EventBus.on('refresh', (data) => { if (data === 'quicklinks') { const element = document.querySelector('.quicklinks-container'); if (localStorage.getItem('quicklinksenabled') === 'false') { return element.style.display = 'none'; } element.style.display = 'block'; const images = element.getElementsByTagName('img'); for (const img of images) { img.style.height = `${0.87 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`; }; element.querySelector('button').style.fontSize = `${1.15 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`; this.setState({ items: JSON.parse(localStorage.getItem('quicklinks')) }); } }); // allows you to add a link by pressing enter document.querySelector('.topbarquicklinks').onkeydown = (e) => { e = e || window.event; const code = e.which || e.keyCode; if (code === 13 && this.state.showAddLink === 'visible') { this.addLink(); e.preventDefault(); } }; const element = document.querySelector('.quicklinks-container'); const images = element.getElementsByTagName('img'); for (const img of images) { img.style.height = `${0.87 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`; }; element.querySelector('button').style.fontSize = `${1.15 * Number((localStorage.getItem('zoomQuicklinks') || 100) / 100)}em`; } componentWillUnmount() { EventBus.remove('refresh'); } render() { if (localStorage.getItem('offlineMode') === 'true') { return null; } let target, rel = null; if (localStorage.getItem('quicklinksnewtab') === 'true') { target = '_blank'; rel = 'noopener noreferrer'; } const tooltipEnabled = localStorage.getItem('quicklinkstooltip'); const quickLink = (item) => { const useProxy = (localStorage.getItem('quicklinksddgProxy') !== 'false'); const url = useProxy ? 'https://icons.duckduckgo.com/ip2/' : 'https://www.google.com/s2/favicons?sz=32&domain='; const link = ( this.deleteLink(item.key, e)} href={item.url} target={target} rel={rel} draggable={false}> {item.name} ); if (tooltipEnabled === 'true') { return {link}; } else { return link; } }; return (
{this.state.items.map((item) => ( quickLink(item) ))}

{this.language.new}

this.setState({ name: e.target.value })} />

{this.state.nameError}

this.setState({ url: e.target.value })} />

{this.state.urlError}

); } }