Skip to content

Commit cd1fedb

Browse files
committed
Sends a notification once every hour if the user is within 20 meters of an unrated location. New notifications will replace old ones to avoid spam. Mobile users will get a vibration and noise when receiving it
1 parent b5d79ad commit cd1fedb

File tree

6 files changed

+154
-5
lines changed

6 files changed

+154
-5
lines changed

app/app/Providers/ShareBaseUserWithViewsProvider.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class ShareBaseUserWithViewsProvider extends ServiceProvider
1515
public function boot()
1616
{
1717
view()->share('base_user', new BaseUser());
18+
view()->share('google_map_api_key', config('app.google_map_api_key'));
1819
}
1920

2021
/**

app/public/js/home.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,12 @@ function initMap()
5555
streetViewControl: false,
5656
clickableIcons: false
5757
});
58-
default_location = new google.maps.LatLng(default_location.latitude, default_location.longitude);
59-
58+
try{
59+
default_location = new google.maps.LatLng(default_location.latitude, default_location.longitude);
60+
}
61+
catch(e){
62+
default_location= new google.maps.LatLng(function(){return 42.317503},function(){return -83.035474});
63+
}
6064
google.maps.event.addDomListener(window, "resize", function() {
6165
var center = map.getCenter();
6266
google.maps.event.trigger(map, "resize");
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
var url= window.location.href;
2+
var pos = url.search('using_pwa');
3+
4+
if (pos+1 && url[pos+8] && 'serviceWorker' in navigator) {
5+
navigator.serviceWorker
6+
.register('service-worker.js')
7+
.then(function(registration) {
8+
if (!navigator.serviceWorker.controller){
9+
location.reload();
10+
}
11+
sendNewLocation();
12+
})
13+
.catch(function(err) {
14+
console.log("Service Worker Failed to Register", err);
15+
});
16+
}
17+
18+
if ('serviceWorker' in navigator){
19+
navigator.serviceWorker.addEventListener('message', function(e) {
20+
if(e.data.type=='redirect') {
21+
location.replace(e.data.url);
22+
} else if(e.data.type='refresh') {
23+
sendNewLocation();
24+
}
25+
});
26+
}
27+
28+
function sendNewLocation() {
29+
getCurrentGeolocation().then( function(latlng){
30+
lng=latlng.lng();
31+
lat=latlng.lat();
32+
var urlGet = '/api/location/nearby/'+lng+'/'+lat;
33+
var ajaxReq = $.ajax({
34+
type: 'get',
35+
url: urlGet,
36+
dataType: 'json',
37+
success: function(data, status, xhr){
38+
navigator.serviceWorker.controller.postMessage(data);
39+
},
40+
error: function(xhr, reason, ex){
41+
var sampleData={
42+
name: '404',
43+
id:'0'
44+
};
45+
navigator.serviceWorker.controller.postMessage(sampleData);
46+
console.log("No nearby locations found at "+urlGet);
47+
}
48+
});
49+
});
50+
};

app/public/service-worker.js

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
var reviewRedirect, title, options;
2+
title = 'We Need Your Help!';
3+
options = {
4+
body: '',
5+
icon: '/images/logo-192x192.png',
6+
sound: '/sounds/alert.wav',
7+
actions: [
8+
{
9+
action: 'review',
10+
title: 'Yes!'
11+
}
12+
],
13+
tag: 'help-notification',
14+
vibrate: [500,110,500,110,450]
15+
};
16+
function helpNotification(name,id) {
17+
if(name=='404')
18+
options.body='';
19+
else{
20+
reviewRedirect='location/rating/'+id+'/5';
21+
options.body='Would you like to add a review to '+name+'?';
22+
}
23+
//self.registration.showNotification(title, options);
24+
};
25+
26+
function sendNotification() {
27+
//check to send here
28+
sendMessage({type: 'refresh'});
29+
if(options.body!=='')
30+
self.registration.showNotification(title,options);
31+
}
32+
33+
function sendMessageToClient(client, msg){
34+
return new Promise(function(resolve, reject){
35+
var msg_chan = new MessageChannel();
36+
37+
msg_chan.port1.onmessage = function(event){
38+
if(event.data.error){
39+
reject(event.data.error);
40+
}else{
41+
resolve(event.data);
42+
}
43+
};
44+
45+
client.postMessage(msg, [msg_chan.port2]);
46+
});
47+
}
48+
49+
function sendMessage(content){
50+
clients.matchAll().then(clients => {
51+
clients.forEach(client => {
52+
sendMessageToClient(client, content);
53+
})
54+
})
55+
}
56+
57+
self.addEventListener('install', function(e) {
58+
e.waitUntil(self.skipWaiting());
59+
console.log('Service Worker Installed')
60+
})
61+
62+
self.addEventListener('activate', function(e) {
63+
e.waitUntil(self.clients.claim())
64+
console.log('Service Worker Activated');
65+
})
66+
67+
self.addEventListener('fetch',function(e) {
68+
//console.log('fetching '+e);
69+
})
70+
71+
self.addEventListener('notificationclick', function(e) {
72+
switch(e.action) {
73+
case 'review':
74+
sendMessage({
75+
type: 'redirect',
76+
url: reviewRedirect
77+
});
78+
break;
79+
}
80+
e.notification.close();
81+
})
82+
83+
self.addEventListener('message', function(e) {
84+
helpNotification(e.data.name,e.data.id);
85+
})
86+
87+
//send first notification
88+
setTimeout(sendNotification,5000);
89+
//Starting the push notification clock
90+
setTimeout(setInterval(sendNotification,3600000),5000);
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
11
<div id="copyright"></div>
2+
<script src="/js/jquery-3.1.1.js" type="text/javascript"></script>
3+
<script src="/js/utils.js" type="text/javascript"></script>
4+
<script type="text/javascript" async defer
5+
src="//maps.googleapis.com/maps/api/js?key={{ $google_map_api_key }}&amp;callback=initMap">
6+
</script>
7+
<script src="/js/service_worker_script.js" type="text/javascript"></script>

app/resources/views/pages/home.blade.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
@extends('layouts.default', ['body_class' => 'nav-home-page'])
22
@section('footer-content')
3+
<script src="/js/service_worker_script.js" type="text/javascript"></script>
34
<script src="/js/jquery-3.1.1.js" type="text/javascript"></script>
45
<script src="/js/utils.js" type="text/javascript"></script>
56
<script src="/js/home.js" type="text/javascript"></script>
@@ -10,9 +11,6 @@
1011
'longitude': {{ $default_location['longitude'] }}
1112
};
1213
</script>
13-
<script type="text/javascript" async defer
14-
src="//maps.googleapis.com/maps/api/js?key={{ $google_map_api_key }}&amp;callback=initMap">
15-
</script>
1614
@stop
1715
@section('content')
1816
<div class="home-page">

0 commit comments

Comments
 (0)