1
0
mirror of https://github.com/RobinLinus/snapdrop.git synced 2025-05-19 00:50:14 -07:00

Basic File Share Target implementation

This commit is contained in:
RobinLinus 2019-03-13 18:29:45 +01:00
parent ba69167a76
commit 2cdb78019c
7 changed files with 188 additions and 3 deletions

View File

@ -22,7 +22,7 @@
"sizes": "512x512",
"type": "image/png"
}],
"background_color": "#3367d6",
"background_color": "#efefef",
"start_url": "/",
"display": "minimal-ui",
"theme_color": "#3367d6"

View File

@ -163,8 +163,18 @@ class PeerUI {
}
_onTouchStart(e) {
this._touchStart = Date.now();
this._touchTimer = setTimeout(_ => this._onTouchEnd(), 610);
if (window.shareTargetFile) {
// this is a ShareTarget flow
Events.fire('files-selected', {
files: [window.shareTargetFile],
to: this._peer.id
});
window.shareTargetFile = null;
e.preventDefault();
} else {
this._touchStart = Date.now();
this._touchTimer = setTimeout(_ => this._onTouchEnd(), 610);
}
}
_onTouchEnd(e) {
@ -280,8 +290,18 @@ class SendTextDialog extends Dialog {
this.$text.setSelectionRange(0, this.$text.value.length)
}
<<<<<<< Updated upstream
=======
_handleShareTargetText() {
if (!window.shareTargetText) return;
this.$text.value = window.shareTargetText;
window.shareTargetText = '';
}
>>>>>>> Stashed changes
_send(e) {
e.preventDefault();
if (!this.$text.value) return;
Events.fire('send-text', {
to: this._recipient,
text: this.$text.value
@ -414,6 +434,28 @@ class Notifications {
}
}
<<<<<<< Updated upstream
=======
class NetworkStatusUI {
constructor() {
window.addEventListener('offline', e => this._showOfflineMessage(), false);
window.addEventListener('online', e => this._showOnlineMessage(), false);
if (!navigator.onLine) this._showOfflineMessage();
}
_showOfflineMessage() {
Events.fire('notify-user', 'You are offline');
}
_showOnlineMessage() {
Events.fire('notify-user', 'You are back online');
}
}
>>>>>>> Stashed changes
class Snapdrop {
constructor() {
const server = new ServerConnection();
@ -425,6 +467,10 @@ class Snapdrop {
const receiveTextDialog = new ReceiveTextDialog();
const toast = new Toast();
const notifications = new Notifications();
<<<<<<< Updated upstream
=======
const networkStatusUI = new NetworkStatusUI();
>>>>>>> Stashed changes
})
}
}
@ -471,6 +517,26 @@ if ('serviceWorker' in navigator && !window.iOS) {
console.log('Service Worker registered');
window.serviceWorker = serviceWorker
});
<<<<<<< Updated upstream
=======
// don't display install banner when installed
window.addEventListener('beforeinstallprompt', e => {
if (window.matchMedia('(display-mode: standalone)').matches) {
return event.preventDefault();
}
});
navigator.serviceWorker.onmessage = (event) => {
const shareTargetText = event.data.shareTargetText;
window.shareTargetText = shareTargetText;
console.log(shareTargetText);
const shareTargetFile = event.data.shareTargetFile;
window.shareTargetFile = shareTargetFile;
console.log(shareTargetFile);
};
>>>>>>> Stashed changes
}
// Background Animation

View File

@ -0,0 +1,63 @@
<<<<<<< Updated upstream
=======
var CACHE_NAME = 'snapdrop-cache-v1.042';
var urlsToCache = [
'/',
'/styles.css',
'/scripts/network.js',
'/scripts/ui.js',
'/sounds/blop.mp3',
'/images/favicon-96x96.png'
];
self.addEventListener('install', function(event) {
// Perform install steps
event.waitUntil(
caches.open(CACHE_NAME)
.then(function(cache) {
console.log('Opened cache');
return cache.addAll(urlsToCache);
})
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.match(event.request)
.then(function(response) {
// Cache hit - return response
if (response) {
return response;
}
return fetch(event.request);
})
);
});
self.addEventListener('fetch', function(event) {
if (event.request.method !== 'POST') return;
event.respondWith(Response.redirect('./'));
event.waitUntil(async function() {
const data = await event.request.formData();
const client = await self.clients.get(event.resultingClientId);
const shareTargetFile = data.get('file');
const title = data.get('title');
const text = data.get('text');
const url = data.get('url');
let shareTargetText = title ? title : '';
shareTargetText += text ? shareTargetText ? ' ' + text : text : '';
shareTargetText += url ? shareTargetText ? ' ' + url : url : '';
if (!shareTargetText) return;
history.pushState({}, 'URL Rewrite', '/');
console.log('Shared Target Text:', '"' + shareTargetText + '"');
client.postMessage({ shareTargetFile, shareTargetText });
}());
});
>>>>>>> Stashed changes

49
devserver/server.pem Normal file
View File

@ -0,0 +1,49 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDAsAjoETQkrh6o
AK96vKJsbI0Cxnc7qoPNHf1troWzOulC+TWOmfnoV1j3R9R+9mfXQ/ka0PqmJOfl
mtRaEPtwQu/jwsYg26OssqaWtqA4vfiPLEfzUylr/zYAbSpKuD1s8ytOS/DJVkF1
uZFD92y811AJqoaLrdxHLEKxLQOsuSOk/AYidtTV/LewGt4DCWUCRBKU/G3bIQdY
Z48oO6U8cuO7fONgObMFZzxGxQYU8u/xly4najq4i/LcOG7MQUUpFk/qBUbM0Igp
hfLEdexz4b75B/Jf4afEAcBjAtLK9Cun1nVMWVC/BW3w/lmwx+UJ6EHF5qjH1MuV
s3nYTkcPAgMBAAECggEACjnNXzN6hu/OpK/UoDjejc589Ua/ESWNdRdAWc/HPKnF
s04yb2zwfEoWaJkhR9Of0ybCU4//nU2cGO1Mk7MPBPgobvfpN9kwKHwapyjt+9Tp
GgAJmXoyWo7iuMcSVYDNkbid9bvF/YlcU/kTIn5BAQyULM8l8Me7RvOsXma7KTFa
fkwpDdnooj8hOIHvtsTvwQFnN/q4eOK0y5VCKpWedi21M/U/4XbFMwaRMqLwFPmy
3iXl40hGyGHGfUrVVRE29d8HD24HOy5JKkJVbwzr3P+0CtZXdYZG9fvSmEQEDmiu
5sYd6iTiQnF26cn7ZtEavJ2nbpmu9cHjZdjHdErIcQKBgQDppzC7EGL5WLrcCpJU
mhWc8DQ0uJ6oapwLJzW4QFz5sZksWHA5abqhiRbB6ak8EV8spXK8jGMC4ZyHk7Se
7oSz40fC1YpcU/tcAKtIuJxgStf6afFGADyjX/ePZH62Pi8TVAfjT+1XprPKoxQG
HNroNzRlUpzxuHxDjFEKlXVo8wKBgQDTHdaHbSFddxeAG6icyjX87HAgTGX7WQaz
mIhrAvjxoTbMnCJQ2QGYfj7L1HyZ4eHL2NHbEasPKS9kSSdRRaCYZ/XvYiCge6pP
Aiyu8xeachY0QJjJPKC2WYe4Rk9i4q/M2RrsD1ps2jdVocJ96nLV1S0o1Yr2QTAc
TDSOZBlwdQKBgQDNOkkXRgFpOoKGm9KD9QNe4a05UaAqFdoSAdKxj/caauA7j0Kj
aza+hAc1M+OuGyQZtwjcjAK7mSc//oD7yE1PJCb3/1CUYD+8Q+ou6diQy6yBC2Ud
M0AP0E9F5+NUd7Ipq/lxs9ao0ofBSRRheh7dMQAYr0OjHYQoYKsePMDv+QKBgF7Z
VPzbJtZbHw/LXWGz57WOdIHOUTMvuDcQHJoXZ8kHaRtcOn6gQHtGnOfuu1xXg56V
9xK5SWUyV7xysVtuMMzISFIYgBgZ91Yv3+tqA/y7rQYkz3/54SqL5tH/pMMEnX8n
O1U7QKEPGTU7y6nOn3E6qWNjLV+dwgO0qRggGN3RAoGBAJ6Kv1UbOIHRbGl0RJJR
nsOPeDDhTepkS3zs3BD1DxuVmsiPLFL56SE4PZjfVDSBYI9euJmDXYj2qEOrLFNt
Cx8vBAiU8fZbOIUaFmt4QsWTWyLyE4HvzN4m3v1p04KdPkxev+1SmOZFfR8RJsNx
IzLRIdllpD3oq4nwt66ViLGv
-----END PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIDcTCCAlmgAwIBAgIJAMfOBmp8lWsMMA0GCSqGSIb3DQEBCwUAME8xCzAJBgNV
BAYTAlhYMQ8wDQYDVQQIDAZhc2Rhc2QxDDAKBgNVBAcMA2FzZDEhMB8GA1UECgwY
SW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMB4XDTE3MDEyMjIyMDgyNFoXDTE4MDEy
MjIyMDgyNFowTzELMAkGA1UEBhMCWFgxDzANBgNVBAgMBmFzZGFzZDEMMAoGA1UE
BwwDYXNkMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwggEiMA0G
CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAsAjoETQkrh6oAK96vKJsbI0Cxnc7
qoPNHf1troWzOulC+TWOmfnoV1j3R9R+9mfXQ/ka0PqmJOflmtRaEPtwQu/jwsYg
26OssqaWtqA4vfiPLEfzUylr/zYAbSpKuD1s8ytOS/DJVkF1uZFD92y811AJqoaL
rdxHLEKxLQOsuSOk/AYidtTV/LewGt4DCWUCRBKU/G3bIQdYZ48oO6U8cuO7fONg
ObMFZzxGxQYU8u/xly4najq4i/LcOG7MQUUpFk/qBUbM0IgphfLEdexz4b75B/Jf
4afEAcBjAtLK9Cun1nVMWVC/BW3w/lmwx+UJ6EHF5qjH1MuVs3nYTkcPAgMBAAGj
UDBOMB0GA1UdDgQWBBSYz0SbFs+YqMF8SpgIiK+iE5cq9zAfBgNVHSMEGDAWgBSY
z0SbFs+YqMF8SpgIiK+iE5cq9zAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBCwUA
A4IBAQB4K0bbzcsPzWo6BVbh4IJ/OqHCpZ3a3Othdkm3TF4fHg4tpNZWp/6vNklN
d365znGxhS9pS7mBvzFQVUrcCS7AI2gZhk/84QyC0FWTTAvsThz9G4jIgV96hu00
CNwCuJvBxCDVkGELXZkHilQ+J8VkDLrXN44AuWx0t7YgONwawDttzIQv2JjdzY2E
t6tlXpCJuuR/jmqXkz3+iBkn0D5acTJ8ViH/Wb457FkioqMEsjbrRmesI7rOxdzT
869H9azHqXQXFus0Kc5UMHTZgdF2F9sxg7L8cKUCrwN4P8epICGTxq+LPQvk1srr
L8xU+IwS2z4qx6rzrWqSdv9NACdr
-----END CERTIFICATE-----

View File

@ -0,0 +1,7 @@
import BaseHTTPServer, SimpleHTTPServer
import ssl
httpd = BaseHTTPServer.HTTPServer(('0.0.0.0', 4443), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket (httpd.socket, certfile='../devserver/server.pem', server_side=True)
print('Server running on https://localhost:4443 \n(Cert is self-signed. Your browser will warn you)')
httpd.serve_forever()

BIN
devserver/snapdrop-cert.crt Normal file

Binary file not shown.