diff --git a/client/images/snapdrop-graphics.sketch b/client/images/snapdrop-graphics.sketch index b8b756a..ca77d93 100755 Binary files a/client/images/snapdrop-graphics.sketch and b/client/images/snapdrop-graphics.sketch differ diff --git a/client/manifest.json b/client/manifest.json index 271cf8e..47d049a 100644 --- a/client/manifest.json +++ b/client/manifest.json @@ -22,7 +22,7 @@ "sizes": "512x512", "type": "image/png" }], - "background_color": "#3367d6", + "background_color": "#efefef", "start_url": "/", "display": "minimal-ui", "theme_color": "#3367d6" diff --git a/client/scripts/ui.js b/client/scripts/ui.js index c627756..77f121f 100644 --- a/client/scripts/ui.js +++ b/client/scripts/ui.js @@ -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 diff --git a/client/service-worker.js b/client/service-worker.js index e69de29..23cd170 100644 --- a/client/service-worker.js +++ b/client/service-worker.js @@ -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 diff --git a/devserver/server.pem b/devserver/server.pem new file mode 100644 index 0000000..1973d24 --- /dev/null +++ b/devserver/server.pem @@ -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----- \ No newline at end of file diff --git a/devserver/simple-https-server.py b/devserver/simple-https-server.py new file mode 100644 index 0000000..7342de7 --- /dev/null +++ b/devserver/simple-https-server.py @@ -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() \ No newline at end of file diff --git a/devserver/snapdrop-cert.crt b/devserver/snapdrop-cert.crt new file mode 100644 index 0000000..896cb9d Binary files /dev/null and b/devserver/snapdrop-cert.crt differ