From acc883e2ac7348f75f4c411193b292411143c156 Mon Sep 17 00:00:00 2001 From: Yucheng Hang Date: Mon, 2 Mar 2020 22:48:51 -0500 Subject: [PATCH] ~ --- .DS_Store | Bin 0 -> 6148 bytes icon192.png | Bin 0 -> 3107 bytes icon512.png | Bin 0 -> 8224 bytes index.html | 21 +++++ main.css | 47 +++++++++++ main.js | 84 ++++++++++++++++++++ manifest.json | 21 +++++ notification.mp3 | Bin 0 -> 47229 bytes sw.js | 202 +++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 375 insertions(+) create mode 100644 .DS_Store create mode 100644 icon192.png create mode 100644 icon512.png create mode 100644 index.html create mode 100644 main.css create mode 100644 main.js create mode 100644 manifest.json create mode 100644 notification.mp3 create mode 100644 sw.js diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..f7675966b42e7e483cd00cf2d02609e122324f42 GIT binary patch literal 6148 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 Zc!PEK{W4aWMRomvu9l%@3F?06e*gev#47** literal 0 HcmV?d00001 diff --git a/icon512.png b/icon512.png new file mode 100644 index 0000000000000000000000000000000000000000..8f7916402b5ea074524a5015f2379b5da5bc08fc GIT binary patch literal 8224 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 TdA?f+;79Gc=Cu+fvw;5vH9P$) literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..7fdbe38 --- /dev/null +++ b/index.html @@ -0,0 +1,21 @@ + + + + + + + DMD 3440 - Room of Chat + + + + + +

Sending messages as {UserName}

+
+
+ + +
+ + + \ No newline at end of file diff --git a/main.css b/main.css new file mode 100644 index 0000000..0086299 --- /dev/null +++ b/main.css @@ -0,0 +1,47 @@ +* { + box-sizing: border-box; +} + +body { + background-color: rgb(32, 49, 88); + color:#fff; + font-family: Arial, Helvetica, sans-serif; +} + +#chatBox { + width:100%; + position:absolute; + bottom:70px; + top:60px; + right:0px; + left:0px; + background:#eee; + border:1px solid #333; + color:#000; + padding:15px; +} + +#chatInput { + position:fixed; + left:0px; + bottom:0; + width:100%; + background-color:#ccc; + display: flex; + justify-content: space-between; + height: 70px; + +} + +#chatInput input { + width:100%; + text-indent: 15px; +} + +#chatInput button { + margin:0px 0px; + padding:0px 10px; + background-color:#333; + color:#fff; + border:1px solid #333; +} \ No newline at end of file diff --git a/main.js b/main.js new file mode 100644 index 0000000..0d21f61 --- /dev/null +++ b/main.js @@ -0,0 +1,84 @@ +// Register a service worker, this one located in serviceworker.js +// A service worker is a piece of code the browser runs behind the scenes. +if ('serviceWorker' in navigator) { + console.log('CLIENT: service worker registration in progress.'); + navigator.serviceWorker.register('sw.js').then(function() { + console.log('CLIENT: service worker registration complete.'); + }, function() { + console.log('CLIENT: service worker registration failure.'); + }); + } else { + console.log('CLIENT: service workers are not supported.'); + } + + let allMessages = []; + let chatBox = document.querySelector("#chatBox"); + let newMsgInput = document.querySelector("#newMsg"); + let userName = localStorage.getItem('userName') || "me"; + let notifSound = 'notification.mp3'; + let notifSoundElement = new Audio(notifSound); + let usernameInput = document.querySelector("#usernameInput"); + usernameInput.innerHTML = userName; + + function clearChatInput() { + document.querySelector("#newMsg").value = ""; + document.querySelector("#newMsg").focus(); + } + + function displayNewMessage(msg) { + var newMsgP = document.createElement("p"); + newMsgP.innerHTML = "" + msg.sentBy + ": " + msg.message; + chatBox.appendChild(newMsgP); + + window.navigator.vibrate(200); + + notifSoundElement.play(); + clearChatInput(); + } + + function makeNewMessageFromLocalUser() { + let usrMsg = { + sentBy: userName, + dateStamp: Date.now(), + message: newMsgInput.value + } + + if(usrMsg.message !== "") { + allMessages.push(usrMsg); + // end make message + displayNewMessage(usrMsg) + } + } + + //** All the triggers and event listener assignments down here... */ + + // assign the "Make New Message" function to the button click + document.querySelector("#sendBtn").addEventListener('click', function(){ + makeNewMessageFromLocalUser() + }); + + // since we're not using a real form, assign it to the "keyup return" of the message input too + + document.querySelector("#newMsg").addEventListener('keyup', function(e) { + if (e.keyCode === 13) { + makeNewMessageFromLocalUser(); + } + }); + + // when username input is changed, update localstorage and global variable + usernameInput.addEventListener('blur', function() { + var oldUsername = localStorage.getItem("userName"); + var newUsername = this.innerHTML; + + var alertNew = { + sentBy: "system", + dateStamp: Date.now(), + message: `${oldUsername} has changed their name to ${newUsername}` + } + + displayNewMessage(alertNew); + + + localStorage.setItem("userName", newUsername); + userName = localStorage.getItem("userName"); + }); \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..c98c45c --- /dev/null +++ b/manifest.json @@ -0,0 +1,21 @@ +{ + "short_name": "Room of Chat", + "name": "Room of Chat", + "icons": [ + { + "src":"icon192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icon512.png", + "type": "image/png", + "sizes": "512x512" + } + ], + "start_url": "index.html", + "background_color": "#f00", + "theme_color": "#f00", + "display": "fullscreen" + } + \ No newline at end of file diff --git a/notification.mp3 b/notification.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d8f90719909ba783f5e2523c7239dd85bbc93057 GIT binary patch literal 47229 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�@;1sr!WHQIg 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 YbN{+$kQRZE{6GHc|NFrIy+82(0nAVhV*mgE literal 0 HcmV?d00001 diff --git a/sw.js b/sw.js new file mode 100644 index 0000000..d2e3d44 --- /dev/null +++ b/sw.js @@ -0,0 +1,202 @@ + + +console.log('SERVICE WORKER: executing.'); + +/* A version number is useful when updating the worker logic, + allowing you to remove outdated cache entries during the update. +*/ +var version = 'v1::'; + +/* These resources will be downloaded and cached by the service worker + during the installation process. If any resource fails to be downloaded, + then the service worker won't be installed either. +*/ +var offlineFiles = [ + '', + 'icon192.png', + 'icon512.png', + 'index.html', + 'main.css', + 'main.js' +]; + +/* The install event fires when the service worker is first installed. + You can use this event to prepare the service worker to be able to serve + files while visitors are offline. +*/ +self.addEventListener("install", function(event) { + console.log('WORKER: install event in progress.'); + /* Using event.waitUntil(p) blocks the installation process on the provided + promise. If the promise is rejected, the service worker won't be installed. + */ + event.waitUntil( + /* The caches built-in is a promise-based API that helps you cache responses, + as well as finding and deleting them. + */ + caches + /* You can open a cache by name, and this method returns a promise. We use + a versioned cache name here so that we can remove old cache entries in + one fell swoop later, when phasing out an older service worker. + */ + .open(version + 'fundamentals') + .then(function(cache) { + /* After the cache is opened, we can fill it with the offline fundamentals. + The method below will add all resources in `offlineFiles` to the + cache, after making requests for them. + */ + return cache.addAll(offlineFiles); + }) + .then(function() { + console.log('WORKER: install completed'); + }) + ); +}); + +/* The fetch event fires whenever a page controlled by this service worker requests + a resource. This isn't limited to `fetch` or even XMLHttpRequest. Instead, it + comprehends even the request for the HTML page on first load, as well as JS and + CSS resources, fonts, any images, etc. +*/ +self.addEventListener("fetch", function(event) { + console.log('WORKER: fetch event in progress.'); + + /* We should only cache GET requests, and deal with the rest of method in the + client-side, by handling failed POST,PUT,PATCH,etc. requests. + */ + if (event.request.method !== 'GET') { + /* If we don't block the event as shown below, then the request will go to + the network as usual. + */ + console.log('WORKER: fetch event ignored.', event.request.method, event.request.url); + return; + } + /* Similar to event.waitUntil in that it blocks the fetch event on a promise. + Fulfillment result will be used as the response, and rejection will end in a + HTTP response indicating failure. + */ + event.respondWith( + caches + /* This method returns a promise that resolves to a cache entry matching + the request. Once the promise is settled, we can then provide a response + to the fetch request. + */ + .match(event.request) + .then(function(cached) { + /* Even if the response is in our cache, we go to the network as well. + This pattern is known for producing "eventually fresh" responses, + where we return cached responses immediately, and meanwhile pull + a network response and store that in the cache. + + Read more: + https://ponyfoo.com/articles/progressive-networking-serviceworker + */ + var networked = fetch(event.request) + // We handle the network request with success and failure scenarios. + .then(fetchedFromNetwork, unableToResolve) + // We should catch errors on the fetchedFromNetwork handler as well. + .catch(unableToResolve); + + /* We return the cached response immediately if there is one, and fall + back to waiting on the network as usual. + */ + console.log('WORKER: fetch event', cached ? '(cached)' : '(network)', event.request.url); + return cached || networked; + + function fetchedFromNetwork(response) { + /* We copy the response before replying to the network request. + This is the response that will be stored on the ServiceWorker cache. + */ + var cacheCopy = response.clone(); + + console.log('WORKER: fetch response from network.', event.request.url); + + caches + // We open a cache to store the response for this request. + .open(version + 'pages') + .then(function add(cache) { + /* We store the response for this request. It'll later become + available to caches.match(event.request) calls, when looking + for cached responses. + */ + return cache.put(event.request, cacheCopy); + }) + .then(function() { + console.log('WORKER: fetch response stored in cache.', event.request.url); + }); + + // Return the response so that the promise is settled in fulfillment. + return response; + } + + /* When this method is called, it means we were unable to produce a response + from either the cache or the network. This is our opportunity to produce + a meaningful response even when all else fails. It's the last chance, so + you probably want to display a "Service Unavailable" view or a generic + error response. + */ + function unableToResolve () { + /* There's a couple of things we can do here. + - Test the Accept header and then return one of the `offlineFiles` + e.g: `return caches.match('/some/cached/image.png')` + - You should also consider the origin. It's easier to decide what + "unavailable" means for requests against your origins than for requests + against a third party, such as an ad provider. + - Generate a Response programmaticaly, as shown below, and return that. + */ + + console.log('WORKER: fetch request failed in both cache and network.'); + + /* Here we're creating a response programmatically. The first parameter is the + response body, and the second one defines the options for the response. + */ + return new Response('

Service Unavailable

', { + status: 503, + statusText: 'Service Unavailable', + headers: new Headers({ + 'Content-Type': 'text/html' + }) + }); + } + }) + ); +}); + +/* The activate event fires after a service worker has been successfully installed. + It is most useful when phasing out an older version of a service worker, as at + this point you know that the new worker was installed correctly. In this example, + we delete old caches that don't match the version in the worker we just finished + installing. +*/ +self.addEventListener("activate", function(event) { + /* Just like with the install event, event.waitUntil blocks activate on a promise. + Activation will fail unless the promise is fulfilled. + */ + console.log('WORKER: activate event in progress.'); + + event.waitUntil( + caches + /* This method returns a promise which will resolve to an array of available + cache keys. + */ + .keys() + .then(function (keys) { + // We return a promise that settles when all outdated caches are deleted. + return Promise.all( + keys + .filter(function (key) { + // Filter by keys that don't start with the latest version prefix. + return !key.startsWith(version); + }) + .map(function (key) { + /* Return a promise that's fulfilled + when each outdated cache is deleted. + */ + return caches.delete(key); + }) + ); + }) + .then(function() { + console.log('WORKER: activate completed.'); + }) + ); +}); \ No newline at end of file