From 3aad71b731a56f5c269e19b9a00baf2ede57001d Mon Sep 17 00:00:00 2001 From: Daniel Constantin Date: Wed, 23 May 2018 17:37:30 +0200 Subject: [PATCH 1/5] Add option to publish to ipns --- app/api.js | 15 ++++ app/menu.js | 7 ++ app/windows/PublishToIPNS/index.html | 21 +++++ app/windows/PublishToIPNS/loader.js | 7 ++ app/windows/PublishToIPNS/renderer.jsx | 86 +++++++++++++++++++ app/windows/PublishToIPNS/window.js | 69 +++++++++++++++ .../Storage/Components/StorageElement.jsx | 15 +++- 7 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 app/windows/PublishToIPNS/index.html create mode 100644 app/windows/PublishToIPNS/loader.js create mode 100644 app/windows/PublishToIPNS/renderer.jsx create mode 100644 app/windows/PublishToIPNS/window.js diff --git a/app/api.js b/app/api.js index 171ab5f..2832c34 100644 --- a/app/api.js +++ b/app/api.js @@ -410,6 +410,21 @@ export function resolveName (name) { return IPFS_CLIENT.name.resolve(name) } +/** + * Publishes an IPFS hash to IPNS (the PeerID). + * + * Result looks like: + * { + * name:"QmPoXQhVxRAjMXLz7BaAAN1pQyKqHECK3K453oBRGnNvTQ" + * value:"/ipfs/QmPgcYEGLSBPJ8scQTsFRz8sz8X32cdZNQt3dSQb5fMMEQ" + * } + */ +export function publishToIPNS (hash) { + if (!IPFS_CLIENT) return Promise.reject(ERROR_IPFS_UNAVAILABLE) + + return IPFS_CLIENT.name.publish(hash) +} + /** * connectTo allows easily to connect to a node by specifying a str multiaddress * example: connectTo("/ip4/192.168.0.22/tcp/4001/ipfs/Qm...") diff --git a/app/menu.js b/app/menu.js index c6110d4..aaa9541 100644 --- a/app/menu.js +++ b/app/menu.js @@ -7,6 +7,7 @@ import electron, { BrowserWindow, Menu, app } from 'electron' import ImportWindow from './windows/Import/window' import SettingsWindow from './windows/Settings/window' import ResolveIPNS from './windows/ResolveIPNS/window' +import PublishToIPNS from './windows/PublishToIPNS/window' const template = [{ label: 'File', @@ -22,6 +23,12 @@ const template = [{ click () { ResolveIPNS.create(app) } + }, { + label: 'PublishToIPNS', + accelerator: 'CmdOrCtrl+F', + click () { + PublishToIPNS.create(app) + } }] }, { label: 'Edit', diff --git a/app/windows/PublishToIPNS/index.html b/app/windows/PublishToIPNS/index.html new file mode 100644 index 0000000..0ba1b03 --- /dev/null +++ b/app/windows/PublishToIPNS/index.html @@ -0,0 +1,21 @@ + + + + + Codestin Search App + + + + +
+ + + + + diff --git a/app/windows/PublishToIPNS/loader.js b/app/windows/PublishToIPNS/loader.js new file mode 100644 index 0000000..3a1e460 --- /dev/null +++ b/app/windows/PublishToIPNS/loader.js @@ -0,0 +1,7 @@ +import Spinner from 'spin.js' + +var target = document.getElementById('host') +new Spinner().spin(target) + +// After the spinner is rendered, we require the actual component +setTimeout(() => require('./renderer.jsx'), 0) diff --git a/app/windows/PublishToIPNS/renderer.jsx b/app/windows/PublishToIPNS/renderer.jsx new file mode 100644 index 0000000..2fcfac6 --- /dev/null +++ b/app/windows/PublishToIPNS/renderer.jsx @@ -0,0 +1,86 @@ +import React from 'react' +import ReactDom from 'react-dom' + +import { remote } from 'electron' +import { initIPFSClient, publishToIPNS, getPeer } from '../../api' +import { trackEvent } from '../../stats' + +// Load Components +import { + Window, + Content, + Input, + Toolbar, + Actionbar, + Button +} from 'react-photonkit' +import ProgressOverlay from '../../components/ProgressOverlay' +import CircularProgress from '../../components/CircularProgress' + +class PublishToIPNSWindow extends React.Component { + state = { + loading: false + } + + componentDidMount () { + trackEvent('PublishToIPNSWindowOpen') + getPeer().then(peer => this.setState({ peer })) + } + + handleSubmit = (event) => { + event.preventDefault() + this.setState({ loading: true }) + const hash = event.target[1].value + publishToIPNS(hash) + .then(result => { + this.setState({ loading: false }) + const message = `Successfully published ${result.value} to IPNS!` + remote.dialog.showMessageBox({ type: 'info', message }) + window.close() + }) + .catch(err => { + this.setState({ loading: false }) + remote.dialog.showErrorBox('Error', err.message) + }) + } + + render () { + const { loading, peer } = this.state + + return ( +
+ + + + + + + +