@cocreate/pwa 1.25.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/FUNDING.yml +1 -1
- package/.github/workflows/automated.yml +47 -22
- package/CHANGELOG.md +355 -317
- package/CONTRIBUTING.md +6 -6
- package/CoCreate.config.js +2 -2
- package/README.md +17 -17
- package/demo/index.html +17 -78
- package/docs/index.html +18 -228
- package/package.json +7 -7
- package/src/index.js +93 -155
- package/demo/geolocation.html +0 -73
- package/demo/offline.html +0 -34
- package/src/badging.js +0 -10
- package/src/contact-picker.js +0 -11
- package/src/file-share.js +0 -15
- package/src/geolocation.js +0 -92
- package/src/offline.html +0 -34
- package/src/service-worker.js +0 -227
- package/src/theme.js +0 -57
- package/src/wakeLock.js +0 -9
- package/src/web-share.js +0 -90
package/src/offline.html
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<title>Offline</title>
|
|
5
|
-
<meta charset="utf-8" />
|
|
6
|
-
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
|
7
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
8
|
-
<meta name="theme-color" content="#3f51b5" />
|
|
9
|
-
<link rel="manifest" href="/manifest.webmanifest" />
|
|
10
|
-
<style>
|
|
11
|
-
body {
|
|
12
|
-
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI",
|
|
13
|
-
Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji",
|
|
14
|
-
"Segoe UI Emoji", "Segoe UI Symbol";
|
|
15
|
-
-webkit-font-smoothing: antialiased;
|
|
16
|
-
}
|
|
17
|
-
img {
|
|
18
|
-
display: block;
|
|
19
|
-
margin-left: auto;
|
|
20
|
-
margin-right: auto;
|
|
21
|
-
}
|
|
22
|
-
h1,
|
|
23
|
-
div {
|
|
24
|
-
text-align: center;
|
|
25
|
-
}
|
|
26
|
-
</style>
|
|
27
|
-
<link rel="manifest" href="/manifest.webmanifest" />
|
|
28
|
-
</head>
|
|
29
|
-
<body>
|
|
30
|
-
<img
|
|
31
|
-
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAAEsCAYAAACG+vy+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxRUM3NTFERjAzN0QxMUUxQUI5QkU5Q0VENTBFMjc2QSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxRUM3NTFFMDAzN0QxMUUxQUI5QkU5Q0VENTBFMjc2QSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFFQzc1MUREMDM3RDExRTFBQjlCRTlDRUQ1MEUyNzZBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFFQzc1MURFMDM3RDExRTFBQjlCRTlDRUQ1MEUyNzZBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+hI3m0wAAiuJJREFUeNrsfQmA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" />
|
|
32
|
-
<h1>Offline</h1>
|
|
33
|
-
</body>
|
|
34
|
-
</html>
|
package/src/service-worker.js
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
/********************************************************************************
|
|
2
|
-
* Copyright (C) 2023 CoCreate and Contributors.
|
|
3
|
-
*
|
|
4
|
-
* This program is free software: you can redistribute it and/or modify
|
|
5
|
-
* it under the terms of the GNU Affero General Public License as published
|
|
6
|
-
* by the Free Software Foundation, either version 3 of the License, or
|
|
7
|
-
* (at your option) any later version.
|
|
8
|
-
*
|
|
9
|
-
* This program is distributed in the hope that it will be useful,
|
|
10
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
-
* GNU Affero General Public License for more details.
|
|
13
|
-
*
|
|
14
|
-
* You should have received a copy of the GNU Affero General Public License
|
|
15
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
-
********************************************************************************/
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Commercial Licensing Information:
|
|
20
|
-
* For commercial use of this software without the copyleft provisions of the AGPLv3,
|
|
21
|
-
* you must obtain a commercial license from CoCreate LLC.
|
|
22
|
-
* For details, visit <https://cocreate.app/licenses/> or contact us at sales@cocreate.app.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
const cacheName = "dynamic-v2";
|
|
26
|
-
const updatedOn = new Date('2024-04-29T14:05:43.414Z');
|
|
27
|
-
|
|
28
|
-
let organization_id = ""
|
|
29
|
-
let storage = true
|
|
30
|
-
|
|
31
|
-
const queryString = self.location.search;
|
|
32
|
-
const queryParams = new URLSearchParams(queryString);
|
|
33
|
-
let cacheType = queryParams.get('cache');
|
|
34
|
-
|
|
35
|
-
self.addEventListener("install", (e) => {
|
|
36
|
-
console.log('Service Worker Installing')
|
|
37
|
-
self.skipWaiting();
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
// self.addEventListener("activate", async (e) => {
|
|
41
|
-
// e.waitUntil(clients.claim());
|
|
42
|
-
// });
|
|
43
|
-
|
|
44
|
-
self.addEventListener('activate', event => {
|
|
45
|
-
event.waitUntil(
|
|
46
|
-
clients.claim().then(() => {
|
|
47
|
-
return clients.matchAll({ type: 'window' }).then(clients => {
|
|
48
|
-
clients.forEach(client => client.navigate(client.url));
|
|
49
|
-
});
|
|
50
|
-
})
|
|
51
|
-
);
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
self.addEventListener("fetch", async (e) => {
|
|
55
|
-
if (!(e.request.url.indexOf('http') === 0) || e.request.method === 'POST') return;
|
|
56
|
-
|
|
57
|
-
e.respondWith(
|
|
58
|
-
caches
|
|
59
|
-
.match(e.request)
|
|
60
|
-
.then(async (cacheResponse) => {
|
|
61
|
-
let fetchedOn
|
|
62
|
-
if (cacheResponse && cacheType !== 'false') {
|
|
63
|
-
fetchedOn = cacheResponse.headers.get('fetched-on')
|
|
64
|
-
if (fetchedOn)
|
|
65
|
-
fetchedOn = new Date(fetchedOn)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
if (!navigator.onLine || !!cacheResponse && cacheType !== 'false' && (!fetchedOn || fetchedOn > updatedOn)) {
|
|
70
|
-
const organization = cacheResponse.headers.get('organization')
|
|
71
|
-
console.log('servering cache fetchOn greater', fetchedOn > updatedOn, organization)
|
|
72
|
-
const lastModified = cacheResponse.headers.get('last-modified')
|
|
73
|
-
sendCacheUpdate(e.request.url, organization, lastModified);
|
|
74
|
-
return cacheResponse;
|
|
75
|
-
} else {
|
|
76
|
-
console.log('fetching fetchOn less', fetchedOn > updatedOn)
|
|
77
|
-
|
|
78
|
-
const networkResponse = await fetch(e.request);
|
|
79
|
-
|
|
80
|
-
if (!organization_id)
|
|
81
|
-
organization_id = networkResponse.headers.get('organization')
|
|
82
|
-
|
|
83
|
-
let storageHeader = networkResponse.headers.get('storage')
|
|
84
|
-
if (storageHeader)
|
|
85
|
-
storage = storageHeader
|
|
86
|
-
|
|
87
|
-
if (cacheType && cacheType !== 'false' && networkResponse.status === 200) {
|
|
88
|
-
console.log('caching')
|
|
89
|
-
|
|
90
|
-
caches.open(cacheName).then((cache) => {
|
|
91
|
-
if (networkResponse.status !== 206) {
|
|
92
|
-
const networkModified = networkResponse.headers.get('last-modified');
|
|
93
|
-
// if (!networkModified) {
|
|
94
|
-
// networkResponse.headers.set('Last-Modified', new Date().toISOString());
|
|
95
|
-
// }
|
|
96
|
-
cache.put(e.request, networkResponse);
|
|
97
|
-
if (cacheType === 'reload' || cacheType === 'prompt') {
|
|
98
|
-
const cacheModified = cacheResponse.headers.get('last-modified');
|
|
99
|
-
if (networkModified !== cacheModified) {
|
|
100
|
-
self.clients.matchAll().then((clients) => {
|
|
101
|
-
clients.forEach((client) => {
|
|
102
|
-
client.postMessage({ action: 'cacheType', cacheType }); // Send a custom message
|
|
103
|
-
console.log(`file ${cacheType} has been triggered`)
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}).catch(() => {
|
|
110
|
-
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
if (!cacheResponse || cacheType === 'false' || cacheType === 'offline') {
|
|
115
|
-
return networkResponse.clone();
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (!!cacheResponse && cacheType !== 'false' && cacheType !== 'offline') {
|
|
121
|
-
return cacheResponse;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
})
|
|
125
|
-
.catch(function () {
|
|
126
|
-
return caches.match('./offline.html');
|
|
127
|
-
})
|
|
128
|
-
);
|
|
129
|
-
});
|
|
130
|
-
|
|
131
|
-
self.addEventListener('message', function (event) {
|
|
132
|
-
if (event.data.action === 'getOrganization')
|
|
133
|
-
event.source.postMessage({ action: 'getOrganization', organization_id });
|
|
134
|
-
else if (event.data.action === 'checkCache') {
|
|
135
|
-
event.source.postMessage({ action: 'checkCache', returnedFromCache: { ...returnedFromCache } });
|
|
136
|
-
returnedFromCache = {}
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
self.addEventListener('push', (event) => {
|
|
142
|
-
const pushData = event.data.json(); // Assuming the push payload is JSON data
|
|
143
|
-
|
|
144
|
-
// Process the push notification data as needed
|
|
145
|
-
const { socketUrl, _id } = pushData;
|
|
146
|
-
|
|
147
|
-
// Establish a WebSocket connection
|
|
148
|
-
const socket = new WebSocket(socketUrl);
|
|
149
|
-
|
|
150
|
-
// Handle WebSocket events
|
|
151
|
-
socket.addEventListener('open', () => {
|
|
152
|
-
// The WebSocket connection is open, send the message to the server
|
|
153
|
-
socket.send(JSON.stringify({ method: 'object.read', array: 'files', object: { _id }, uuid: '' }));
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
socket.addEventListener('message', (event) => {
|
|
157
|
-
// Handle messages received from the server over the WebSocket
|
|
158
|
-
const serverData = JSON.parse(event.data);
|
|
159
|
-
if (serverData.uuid === uuid) {
|
|
160
|
-
// TODO: add file to cache and close socket
|
|
161
|
-
}
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
socket.addEventListener('close', () => {
|
|
165
|
-
// Handle the WebSocket connection being closed
|
|
166
|
-
console.log('WebSocket connection closed.');
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
socket.addEventListener('error', (error) => {
|
|
170
|
-
// Handle WebSocket errors
|
|
171
|
-
console.error('WebSocket error:', error);
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
// Ensure that the service worker stays active until the WebSocket connection is closed
|
|
175
|
-
event.waitUntil(
|
|
176
|
-
new Promise((resolve) => {
|
|
177
|
-
socket.addEventListener('close', () => {
|
|
178
|
-
resolve();
|
|
179
|
-
});
|
|
180
|
-
})
|
|
181
|
-
);
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
let returnedFromCache = {};
|
|
185
|
-
let fetchTimeout = null;
|
|
186
|
-
const sendCacheUpdate = (url, organization, lastModified) => {
|
|
187
|
-
|
|
188
|
-
returnedFromCache[url] = { organization, lastModified };
|
|
189
|
-
|
|
190
|
-
if (fetchTimeout) {
|
|
191
|
-
clearTimeout(fetchTimeout);
|
|
192
|
-
}
|
|
193
|
-
const self = this
|
|
194
|
-
fetchTimeout = setTimeout(() => {
|
|
195
|
-
self.clients.matchAll().then(clients => {
|
|
196
|
-
if (clients.length > 0) {
|
|
197
|
-
clients[0].postMessage({ action: 'checkCache', returnedFromCache });
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
fetchTimeout = null;
|
|
202
|
-
// returnedFromCache = {};
|
|
203
|
-
}, 500);
|
|
204
|
-
};
|
|
205
|
-
|
|
206
|
-
// self.addEventListener('backgroundfetchsuccess', (event) => {
|
|
207
|
-
// const bgFetch = event.registration;
|
|
208
|
-
|
|
209
|
-
// event.waitUntil(async function() {
|
|
210
|
-
// // Create/open a cache.
|
|
211
|
-
// const cache = await caches.open(cacheName);
|
|
212
|
-
// // Get all the records.
|
|
213
|
-
// const records = await bgFetch.matchAll();
|
|
214
|
-
// // Copy each request/response across.
|
|
215
|
-
// const promises = records.map(async (record) => {
|
|
216
|
-
// const response = await record.responseReady;
|
|
217
|
-
// console.log('putting ')
|
|
218
|
-
// await cache.put(record.request, response);
|
|
219
|
-
// });
|
|
220
|
-
|
|
221
|
-
// // Wait for the copying to complete
|
|
222
|
-
// await Promise.all(promises);
|
|
223
|
-
|
|
224
|
-
// // Update the progress notification.
|
|
225
|
-
// // event.updateUI({ title: 'Episode 5 ready to listen!' });
|
|
226
|
-
// }());
|
|
227
|
-
// });
|
package/src/theme.js
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
function applyThemeAttributes() {
|
|
2
|
-
// Detect the current theme (light or dark)
|
|
3
|
-
const isDarkMode = window.matchMedia(
|
|
4
|
-
"(prefers-color-scheme: dark)"
|
|
5
|
-
).matches;
|
|
6
|
-
|
|
7
|
-
// Select all elements with light or dark attributes
|
|
8
|
-
const elements = document.querySelectorAll("[light], [dark]");
|
|
9
|
-
|
|
10
|
-
elements.forEach((element) => {
|
|
11
|
-
// Determine the attribute to use based on the theme
|
|
12
|
-
const themeAttr = isDarkMode ? "dark" : "light";
|
|
13
|
-
const themeValue = element.getAttribute(themeAttr);
|
|
14
|
-
|
|
15
|
-
// Determine the current value of the attribute to update
|
|
16
|
-
let attributeToUpdate;
|
|
17
|
-
if (element.tagName === "LINK" && element.rel === "manifest") {
|
|
18
|
-
attributeToUpdate = "href";
|
|
19
|
-
} else if (
|
|
20
|
-
element.tagName === "META" &&
|
|
21
|
-
element.name === "theme-color"
|
|
22
|
-
) {
|
|
23
|
-
attributeToUpdate = "content";
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
if (attributeToUpdate && themeValue) {
|
|
27
|
-
const currentValue = element.getAttribute(attributeToUpdate);
|
|
28
|
-
|
|
29
|
-
// Update only if the current value does not match the new value
|
|
30
|
-
if (currentValue !== themeValue) {
|
|
31
|
-
if (element.tagName === "LINK" && element.rel === "manifest") {
|
|
32
|
-
// Handle manifest link replacement
|
|
33
|
-
const newElement = element.cloneNode(); // Clone the element
|
|
34
|
-
newElement.setAttribute(attributeToUpdate, themeValue); // Update href
|
|
35
|
-
|
|
36
|
-
// Replace the old link with the new one to force fetch
|
|
37
|
-
element.parentNode.replaceChild(newElement, element);
|
|
38
|
-
console.log(`Manifest updated: ${themeValue}`);
|
|
39
|
-
} else {
|
|
40
|
-
// For other elements like meta, update the attribute directly
|
|
41
|
-
element.setAttribute(attributeToUpdate, themeValue);
|
|
42
|
-
if (element.tagName === "META") {
|
|
43
|
-
console.log(`Theme color updated: ${themeValue}`);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Apply theme attributes on page load
|
|
52
|
-
applyThemeAttributes();
|
|
53
|
-
|
|
54
|
-
// Listen for changes in the user's theme preference
|
|
55
|
-
window
|
|
56
|
-
.matchMedia("(prefers-color-scheme: dark)")
|
|
57
|
-
.addEventListener("change", applyThemeAttributes);
|
package/src/wakeLock.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
// Request a screen wake lock
|
|
2
|
-
const wakeLock = await navigator.wakeLock.request();
|
|
3
|
-
|
|
4
|
-
// Listen for wake lock release
|
|
5
|
-
wakeLock.addEventListener('release', () => {
|
|
6
|
-
console.log(`Screen Wake Lock released: ${wakeLock.released}`);
|
|
7
|
-
});
|
|
8
|
-
// Manually release the wake lock
|
|
9
|
-
wakeLock.release();
|
package/src/web-share.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
// https://web.dev/web-share-target/
|
|
2
|
-
/********************************************************************************
|
|
3
|
-
* Copyright (C) 2023 CoCreate and Contributors.
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU Affero General Public License as published
|
|
7
|
-
* by the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU Affero General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU Affero General Public License
|
|
16
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
-
********************************************************************************/
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Commercial Licensing Information:
|
|
21
|
-
* For commercial use of this software without the copyleft provisions of the AGPLv3,
|
|
22
|
-
* you must obtain a commercial license from CoCreate LLC.
|
|
23
|
-
* For details, visit <https://cocreate.app/licenses/> or contact us at sales@cocreate.app.
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
import Observer from "@cocreate/observer";
|
|
27
|
-
import Actions from "@cocreate/actions";
|
|
28
|
-
|
|
29
|
-
const selector = "[share]";
|
|
30
|
-
|
|
31
|
-
async function init(element) {
|
|
32
|
-
if (
|
|
33
|
-
element &&
|
|
34
|
-
!(element instanceof HTMLCollection) &&
|
|
35
|
-
!Array.isArray(element)
|
|
36
|
-
)
|
|
37
|
-
element = [element];
|
|
38
|
-
else if (!element) {
|
|
39
|
-
element = document.querySelectorAll(selector);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
for (let i = 0; i < element.length; i++)
|
|
43
|
-
element[i].addEventListener("click", function (e) {
|
|
44
|
-
share(e.target);
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function share(element) {
|
|
49
|
-
if (navigator.share && element) {
|
|
50
|
-
let title = element.getAttribute("share-title") || document.title;
|
|
51
|
-
let text =
|
|
52
|
-
element.getAttribute("share-text") ||
|
|
53
|
-
document.querySelector('meta[name="description"]')?.content ||
|
|
54
|
-
"";
|
|
55
|
-
let url = element.getAttribute("share-url") || window.location.href;
|
|
56
|
-
|
|
57
|
-
navigator
|
|
58
|
-
.share({
|
|
59
|
-
title: title,
|
|
60
|
-
text: text,
|
|
61
|
-
url: url
|
|
62
|
-
})
|
|
63
|
-
.then(() => console.log("Successful share"))
|
|
64
|
-
.catch((error) => console.log("Error sharing", error));
|
|
65
|
-
} else {
|
|
66
|
-
console.log(
|
|
67
|
-
"Web Share API is not supported or element is not provided."
|
|
68
|
-
);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
Observer.init({
|
|
73
|
-
name: "webshare",
|
|
74
|
-
types: ["addedNodes"],
|
|
75
|
-
selector: "[share]",
|
|
76
|
-
callback: (mutation) => {
|
|
77
|
-
init(mutation.target);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
Actions.init({
|
|
82
|
-
name: "share",
|
|
83
|
-
callback: (action) => {
|
|
84
|
-
share(action.element);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
init();
|
|
89
|
-
|
|
90
|
-
export default { init };
|