Implement ios prototype version
This commit is contained in:
parent
a80d007e0c
commit
e3601055fc
24 changed files with 1368 additions and 1 deletions
158
ios/ios.js
Normal file
158
ios/ios.js
Normal file
|
@ -0,0 +1,158 @@
|
|||
/* global window, document, fetch */
|
||||
|
||||
const MAXFILESIZE = 1024 * 1024 * 1024 * 2;
|
||||
|
||||
const EventEmitter = require('events');
|
||||
const emitter = new EventEmitter();
|
||||
|
||||
function dom(tagName, attributes, children = []) {
|
||||
const node = document.createElement(tagName);
|
||||
for (const name in attributes) {
|
||||
if (name.indexOf('on') === 0) {
|
||||
node[name] = attributes[name];
|
||||
} else if (name === 'htmlFor') {
|
||||
node.htmlFor = attributes.htmlFor;
|
||||
} else if (name === 'className') {
|
||||
node.className = attributes.className;
|
||||
} else {
|
||||
node.setAttribute(name, attributes[name]);
|
||||
}
|
||||
}
|
||||
if (!(children instanceof Array)) {
|
||||
children = [children];
|
||||
}
|
||||
for (let child of children) {
|
||||
if (typeof child === 'string') {
|
||||
child = document.createTextNode(child);
|
||||
}
|
||||
node.appendChild(child);
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
function uploadComplete(file) {
|
||||
document.body.innerHTML = '';
|
||||
const input = dom('input', { id: 'url', value: file.url });
|
||||
const copy = dom(
|
||||
'button',
|
||||
{
|
||||
id: 'copy-button',
|
||||
className: 'button',
|
||||
onclick: () => {
|
||||
window.webkit.messageHandlers['copy'].postMessage(input.value);
|
||||
copy.textContent = 'Copied!';
|
||||
setTimeout(function() {
|
||||
copy.textContent = 'Copy to clipboard';
|
||||
}, 2000);
|
||||
}
|
||||
},
|
||||
'Copy to clipboard'
|
||||
);
|
||||
const node = dom(
|
||||
'div',
|
||||
{ id: 'striped' },
|
||||
dom('div', { id: 'white' }, [
|
||||
input,
|
||||
copy,
|
||||
dom(
|
||||
'button',
|
||||
{ id: 'send-another', className: 'button', onclick: render },
|
||||
'Send another file'
|
||||
)
|
||||
])
|
||||
);
|
||||
document.body.appendChild(node);
|
||||
}
|
||||
|
||||
const state = {
|
||||
storage: {
|
||||
files: [],
|
||||
remove: function(fileId) {
|
||||
console.log('REMOVE FILEID', fileId);
|
||||
},
|
||||
writeFile: function(file) {
|
||||
console.log('WRITEFILE', file);
|
||||
},
|
||||
addFile: uploadComplete,
|
||||
totalUploads: 0
|
||||
},
|
||||
transfer: null,
|
||||
uploading: false,
|
||||
settingPassword: false,
|
||||
passwordSetError: null,
|
||||
route: '/'
|
||||
};
|
||||
|
||||
function upload(event) {
|
||||
console.log('UPLOAD');
|
||||
event.preventDefault();
|
||||
const target = event.target;
|
||||
const file = target.files[0];
|
||||
if (file.size === 0) {
|
||||
return;
|
||||
}
|
||||
if (file.size > MAXFILESIZE) {
|
||||
console.log('file too big (no bigger than ' + MAXFILESIZE + ')');
|
||||
return;
|
||||
}
|
||||
|
||||
emitter.emit('upload', { file: file, type: 'click' });
|
||||
}
|
||||
|
||||
function render() {
|
||||
document.body.innerHTML = '';
|
||||
const striped = dom(
|
||||
'div',
|
||||
{ id: 'striped' },
|
||||
dom('div', { id: 'white' }, [
|
||||
dom('label', { id: 'label', htmlFor: 'input' }, 'Choose file'),
|
||||
dom('input', {
|
||||
id: 'input',
|
||||
type: 'file',
|
||||
name: 'input',
|
||||
onchange: upload
|
||||
})
|
||||
])
|
||||
);
|
||||
document.body.appendChild(striped);
|
||||
}
|
||||
|
||||
emitter.on('render', function() {
|
||||
document.body.innerHTML = '';
|
||||
const percent =
|
||||
(state.transfer.progress[0] / state.transfer.progress[1]) * 100;
|
||||
const node = dom(
|
||||
'div',
|
||||
{ style: 'background-color: white; width: 100%' },
|
||||
dom('span', {
|
||||
style: `display: inline-block; width: ${percent}%; background-color: blue`
|
||||
})
|
||||
);
|
||||
document.body.appendChild(node);
|
||||
});
|
||||
|
||||
emitter.on('pushState', function(path) {
|
||||
console.log('pushState ' + path + ' ' + JSON.stringify(state));
|
||||
});
|
||||
|
||||
const fileManager = require('../app/fileManager').default;
|
||||
try {
|
||||
fileManager(state, emitter);
|
||||
} catch (e) {
|
||||
console.error('error' + e);
|
||||
console.error(e);
|
||||
}
|
||||
|
||||
function sendBase64EncodedFromSwift(encoded) {
|
||||
fetch(encoded)
|
||||
.then(res => res.blob())
|
||||
.then(blob => {
|
||||
emitter.emit('upload', { file: blob, type: 'share' });
|
||||
});
|
||||
}
|
||||
|
||||
window.sendBase64EncodedFromSwift = sendBase64EncodedFromSwift;
|
||||
|
||||
render();
|
||||
|
||||
window.webkit.messageHandlers['loaded'].postMessage('');
|
Loading…
Add table
Add a link
Reference in a new issue