import React, {PropTypes, PureComponent} from 'react'; import autobind from 'autobind-decorator'; import Modal from '../base/Modal'; import ModalBody from '../base/ModalBody'; import ModalHeader from '../base/ModalHeader'; import ModalFooter from '../base/ModalFooter'; import CookiesEditor from '../editors/CookiesEditor'; 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; } _hide () { this.modal.hide(); } async _saveChanges () { const {cookieJar} = this.state; await models.cookieJar.update(cookieJar); this._load(this.state.workspace); } _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 (workspace) { const cookieJar = await models.cookieJar.getOrCreateForWorkspace(workspace); this.setState({cookieJar, workspace}); } async show (workspace) { await this._load(workspace); this.modal.show(); this.filterInput.focus(); trackEvent('Cookie Editor', 'Show'); } toggle (workspace) { this.modal.toggle(); this.filterInput.focus(); this._load(workspace); } render () { const filteredCookies = this._getFilteredSortedCookies(); const {filter} = this.state; return ( Manage Cookies
* cookies are automatically sent with relevant requests
); } } CookiesModal.propTypes = {}; // export CookiesModal; export default CookiesModal;