import map from 'licia/map'
import trim from 'licia/trim'
import isNull from 'licia/isNull'
import each from 'licia/each'
import copy from 'licia/copy'
import LunaModal from 'luna-modal'
import LunaDataGrid from 'luna-data-grid'
import { setState, getState } from './util'
import chobitsu from '../lib/chobitsu'
import { classPrefix as c } from '../lib/util'
export default class Cookie {
constructor($container, devtools) {
this._$container = $container
this._devtools = devtools
this._selectedItem = null
this._initTpl()
this._dataGrid = new LunaDataGrid(this._$dataGrid.get(0), {
columns: [
{
id: 'key',
title: 'キー',
weight: 30,
},
{
id: 'value',
title: '値',
weight: 90,
},
],
minHeight: 60,
maxHeight: 223,
})
this._bindEvent()
}
refresh() {
const $container = this._$container
const dataGrid = this._dataGrid
const { cookies } = chobitsu.domain('Network').getCookies()
const cookieData = map(cookies, ({ name, value }) => ({
key: name,
val: value,
}))
dataGrid.clear()
each(cookieData, ({ key, val }) => {
dataGrid.append(
{
key,
value: val,
},
{
selectable: true,
}
)
})
const cookieState = getState('cookie', cookieData.length)
setState($container, cookieState)
}
_initTpl() {
const $container = this._$container
$container.html(
c(`
クッキー
`)
)
this._$dataGrid = $container.find(c('.data-grid'))
this._$filterText = $container.find(c('.filter-text'))
}
_updateButtons() {
const $container = this._$container
const $showDetail = $container.find(c('.show-detail'))
const $deleteCookie = $container.find(c('.delete-cookie'))
const $copyCookie = $container.find(c('.copy-cookie'))
const btnDisabled = c('btn-disabled')
$showDetail.addClass(btnDisabled)
$deleteCookie.addClass(btnDisabled)
$copyCookie.addClass(btnDisabled)
if (this._selectedItem) {
$showDetail.rmClass(btnDisabled)
$deleteCookie.rmClass(btnDisabled)
$copyCookie.rmClass(btnDisabled)
}
}
_getVal(key) {
const { cookies } = chobitsu.domain('Network').getCookies()
for (let i = 0, len = cookies.length; i < len; i++) {
if (cookies[i].name === key) {
return cookies[i].value
}
}
return ''
}
_bindEvent() {
const devtools = this._devtools
this._$container
.on('click', c('.refresh-cookie'), () => {
devtools.notify('更新しました', { icon: 'success' })
this.refresh()
})
.on('click', c('.clear-cookie'), () => {
chobitsu.domain('Storage').clearDataForOrigin({
storageTypes: 'cookies',
})
this.refresh()
})
.on('click', c('.delete-cookie'), () => {
const key = this._selectedItem
chobitsu.domain('Network').deleteCookies({ name: key })
this.refresh()
})
.on('click', c('.show-detail'), () => {
const key = this._selectedItem
const val = this._getVal(key)
try {
showSources('object', JSON.parse(val))
} catch {
showSources('raw', val)
}
})
.on('click', c('.copy-cookie'), () => {
const key = this._selectedItem
copy(this._getVal(key))
devtools.notify('コピーしました', { icon: 'success' })
})
.on('click', c('.filter'), () => {
LunaModal.prompt('フィルターを入力').then((filter) => {
if (isNull(filter)) return
filter = trim(filter)
this._filter = filter
this._$filterText.text(filter)
this._dataGrid.setOption('filter', filter)
})
})
function showSources(type, data) {
const sources = devtools.get('sources')
if (!sources) return
sources.set(type, data)
devtools.showTool('sources')
return true
}
this._dataGrid
.on('select', (node) => {
this._selectedItem = node.data.key
this._updateButtons()
})
.on('deselect', () => {
this._selectedItem = null
this._updateButtons()
})
}
}