import React, {PureComponent} from 'react'; import PropTypes from 'prop-types'; import autobind from 'autobind-decorator'; import Modal from '../base/modal'; import ModalBody from '../base/modal-body'; import ModalHeader from '../base/modal-header'; import ModalFooter from '../base/modal-footer'; import CookiesEditor from '../editors/cookies-editor'; import * as models from '../../../models'; import {trackEvent} from '../../../analytics/index'; @autobind class CookiesModal extends PureComponent { constructor (props) { super(props); this.state = { cookieJar: null, workspace: null, filter: '' }; } _setModalRef (n) { this.modal = n; } _setFilterInputRef (n) { this.filterInput = n; } async _saveChanges () { const {cookieJar} = this.state; await models.cookieJar.update(cookieJar); this._load(); } _handleCookieUpdate (oldCookie, cookie) { const {cookieJar} = this.state; const {cookies} = cookieJar; const index = cookies.findIndex(c => c.domain === oldCookie.domain && c.key === oldCookie.key); cookieJar.cookies = [ ...cookies.slice(0, index), cookie, ...cookies.slice(index + 1) ]; this._saveChanges(cookieJar); trackEvent('Cookie', 'Update'); } _handleCookieAdd (cookie) { const {cookieJar} = this.state; const {cookies} = cookieJar; cookieJar.cookies = [cookie, ...cookies]; this._saveChanges(cookieJar); trackEvent('Cookie', 'Create'); } _handleCookieDelete (cookie) { const {cookieJar} = this.state; const {cookies} = cookieJar; // NOTE: This is sketchy because it relies on the same reference cookieJar.cookies = cookies.filter(c => c !== cookie); this._saveChanges(cookieJar); trackEvent('Cookie', 'Delete'); } _handleFilterChange (e) { const filter = e.target.value; this.setState({filter}); trackEvent('Cookie Editor', 'Filter Change'); } _getFilteredSortedCookies () { const {cookieJar, filter} = this.state; if (!cookieJar) { // Nothing to do yet. return []; } const {cookies} = cookieJar; return cookies.filter(c => { const toSearch = JSON.stringify(c).toLowerCase(); return toSearch.indexOf(filter.toLowerCase()) !== -1; }); } async _load () { const {workspace} = this.props; const cookieJar = await models.cookieJar.getOrCreateForWorkspace(workspace); this.setState({cookieJar}); } async show () { await this._load(); this.modal.show(); setTimeout(() => this.filterInput.focus(), 100); trackEvent('Cookie Editor', 'Show'); } hide () { this.modal.hide(); } toggle () { if (this.modal.isOpen()) { this.hide(); } else { this.show(); } } render () { const filteredCookies = this._getFilteredSortedCookies(); const {filter} = this.state; return ( Manage Cookies
* cookies are automatically sent with relevant requests
); } } CookiesModal.propTypes = { workspace: PropTypes.object.isRequired }; // export CookiesModal; export default CookiesModal;