From 8ba203b437404e77da0c7f4143c853449a41053f Mon Sep 17 00:00:00 2001 From: daniel-j Date: Mon, 22 Aug 2016 16:28:30 +0200 Subject: [PATCH] wip gui --- extension/fimfic2epub-logo.png | Bin 0 -> 3997 bytes extension/inject.css | 13 ++++ extension/manifest.json | 8 ++- src/eventPage.js | 17 +++-- src/main.js | 112 ++++++++++++++++++++++++++++----- 5 files changed, 131 insertions(+), 19 deletions(-) create mode 100644 extension/fimfic2epub-logo.png create mode 100644 extension/inject.css diff --git a/extension/fimfic2epub-logo.png b/extension/fimfic2epub-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..0288cf2ce6216ab439ebcc63679533d6351cf3b5 GIT binary patch literal 3997 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 { - sendResponse(URL.createObjectURL(blob), type) - }, 'blob') - return true + if (typeof request === 'string') { + fetch(request, (blob, type) => { + sendResponse(URL.createObjectURL(blob), type) + }, 'blob') + // required for async + return true + } else if (request.showPageAction) { + chrome.pageAction.show(sender.tab.id) + } + }) + + chrome.pageAction.onClicked.addListener(function (tab) { + chrome.tabs.sendMessage(tab.id, 'pageAction') }) } diff --git a/src/main.js b/src/main.js index 4af48f6..99a785c 100644 --- a/src/main.js +++ b/src/main.js @@ -1,5 +1,8 @@ +/* global chrome */ +'use strict' import FimFic2Epub from './FimFic2Epub' +import m from 'mithril' import { saveAs } from 'file-saver' function blobToDataURL (blob, callback) { @@ -8,27 +11,108 @@ function blobToDataURL (blob, callback) { a.readAsDataURL(blob) } +const isChromeExt = typeof chrome !== 'undefined' + const STORY_ID = document.location.pathname.match(/^\/story\/(\d*)/)[1] -const ffc = new FimFic2Epub(STORY_ID) +let ffc const epubButton = document.querySelector('.story_container ul.chapters li.bottom a[title="Download Story (.epub)"]') +const dialogContainer = document.createElement('div') +dialogContainer.id = 'epubDialogContainer' +document.body.appendChild(dialogContainer) + +let checkbox = { + view: function (ctrl, args, text) { + return m('label.toggleable-switch', [ + m('input', {type: 'checkbox', name: args.name, checked: args.checked}), + m('a'), + text + ]) + } +} + +let dialog = { + controller (args) { + this.dragging = m.prop(false) + this.xpos = m.prop(100) + this.ypos = m.prop(100) + this.el = m.prop(null) + this.ondown = (e) => { + let el = this.el().firstChild + let rect = el.getBoundingClientRect() + let offset = {x: e.pageX - rect.left, y: e.pageY - rect.top} + this.dragging(true) + let onmove = (e) => { + e.preventDefault() + if (this.dragging()) { + let rect = el.getBoundingClientRect() + this.xpos(Math.max(0, Math.min(e.pageX - offset.x, window.innerWidth - rect.width))) + this.ypos(Math.max(0, Math.min(e.pageY - offset.y, window.innerHeight - rect.height))) + // console.log(e.pageX, e.pageY) + m.redraw() + } + } + let onup = () => { + this.dragging(false) + window.removeEventListener('mousemove', onmove) + window.removeEventListener('mouseup', onup) + } + window.addEventListener('mousemove', onmove, false) + window.addEventListener('mouseup', onup, false) + } + }, + view (ctrl, args, extras) { + return m('.drop-down-pop-up-container', {config: ctrl.el, style: {left: ctrl.xpos() + 'px', top: ctrl.ypos() + 'px'}}, m('.drop-down-pop-up', [ + m('h1', {onmousedown: ctrl.ondown}, m('i.fa.fa-book'), 'Export EPUB', m('a.close_button', {onclick: closeDialog})), + m('.drop-down-pop-up-content', [ + m(checkbox, {name: 'toggle-chapter-headings'}, 'Toggle chapter headings') + ]) + ])) + } +} + +function openDialog (args, extras) { + m.mount(dialogContainer, m(dialog, args, extras)) +} +function closeDialog () { + m.mount(dialogContainer, null) +} + +function clickButton () { + if (!STORY_ID) return + if (!ffc) ffc = new FimFic2Epub(STORY_ID) + + openDialog() + + return + + ffc.download().then(ffc.getFile.bind(ffc)).then((file) => { + console.log('Saving file...') + if (typeof safari !== 'undefined') { + blobToDataURL(file, (dataurl) => { + document.location.href = dataurl + alert('Add .epub to the filename of the downloaded file') + }) + } else { + saveAs(file, ffc.filename) + } + }) +} + if (epubButton) { + if (isChromeExt) { + chrome.runtime.sendMessage({showPageAction: true}) + chrome.runtime.onMessage.addListener(function (request) { + if (request === 'pageAction') { + clickButton() + } + }) + } + epubButton.addEventListener('click', function (e) { e.preventDefault() - ffc.download().then(() => { - ffc.getFile().then((file) => { - console.log('Saving file...') - if (typeof safari !== 'undefined') { - blobToDataURL(file, (dataurl) => { - document.location.href = dataurl - alert('Add .epub to the filename of the downloaded file') - }) - } else { - saveAs(file, ffc.filename) - } - }) - }) + clickButton() }, false) }