14 changed files with 84 additions and 75 deletions
@ -1,10 +0,0 @@
|
||||
import ready from '../ready'; |
||||
|
||||
export let assetHost = ''; |
||||
|
||||
ready(() => { |
||||
const cdnHost = document.querySelector('meta[name=cdn-host]'); |
||||
if (cdnHost) { |
||||
assetHost = cdnHost.content || ''; |
||||
} |
||||
}); |
||||
@ -0,0 +1,13 @@
|
||||
import ready from '../ready'; |
||||
|
||||
export let assetHost = ''; |
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
ready(() => { |
||||
const cdnHost = document.querySelector<HTMLMetaElement>( |
||||
'meta[name=cdn-host]', |
||||
); |
||||
if (cdnHost) { |
||||
assetHost = cdnHost.content || ''; |
||||
} |
||||
}); |
||||
@ -1,6 +0,0 @@
|
||||
// NB: This function can still return unsafe HTML
|
||||
export const unescapeHTML = (html) => { |
||||
const wrapper = document.createElement('div'); |
||||
wrapper.innerHTML = html.replace(/<br\s*\/?>/g, '\n').replace(/<\/p><p>/g, '\n\n').replace(/<[^>]*>/g, ''); |
||||
return wrapper.textContent; |
||||
}; |
||||
@ -0,0 +1,9 @@
|
||||
// NB: This function can still return unsafe HTML
|
||||
export const unescapeHTML = (html: string) => { |
||||
const wrapper = document.createElement('div'); |
||||
wrapper.innerHTML = html |
||||
.replace(/<br\s*\/?>/g, '\n') |
||||
.replace(/<\/p><p>/g, '\n\n') |
||||
.replace(/<[^>]*>/g, ''); |
||||
return wrapper.textContent; |
||||
}; |
||||
@ -1,13 +1,23 @@
|
||||
// Copied from emoji-mart for consistency with emoji picker and since
|
||||
// they don't export the icons in the package
|
||||
export const loupeIcon = ( |
||||
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'> |
||||
<svg |
||||
xmlns='http://www.w3.org/2000/svg' |
||||
viewBox='0 0 20 20' |
||||
width='13' |
||||
height='13' |
||||
> |
||||
<path d='M12.9 14.32a8 8 0 1 1 1.41-1.41l5.35 5.33-1.42 1.42-5.33-5.34zM8 14A6 6 0 1 0 8 2a6 6 0 0 0 0 12z' /> |
||||
</svg> |
||||
); |
||||
|
||||
export const deleteIcon = ( |
||||
<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' width='13' height='13'> |
||||
<svg |
||||
xmlns='http://www.w3.org/2000/svg' |
||||
viewBox='0 0 20 20' |
||||
width='13' |
||||
height='13' |
||||
> |
||||
<path d='M10 8.586L2.929 1.515 1.515 2.929 8.586 10l-7.071 7.071 1.414 1.414L10 11.414l7.071 7.071 1.414-1.414L11.414 10l7.071-7.071-1.414-1.414L10 8.586z' /> |
||||
</svg> |
||||
); |
||||
@ -1,30 +0,0 @@
|
||||
// Handles browser quirks, based on
|
||||
// https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API/Using_the_Notifications_API
|
||||
|
||||
const checkNotificationPromise = () => { |
||||
try { |
||||
// eslint-disable-next-line promise/valid-params, promise/catch-or-return
|
||||
Notification.requestPermission().then(); |
||||
} catch(e) { |
||||
return false; |
||||
} |
||||
|
||||
return true; |
||||
}; |
||||
|
||||
const handlePermission = (permission, callback) => { |
||||
// Whatever the user answers, we make sure Chrome stores the information
|
||||
if(!('permission' in Notification)) { |
||||
Notification.permission = permission; |
||||
} |
||||
|
||||
callback(Notification.permission); |
||||
}; |
||||
|
||||
export const requestNotificationPermission = (callback) => { |
||||
if (checkNotificationPromise()) { |
||||
Notification.requestPermission().then((permission) => handlePermission(permission, callback)).catch(console.warn); |
||||
} else { |
||||
Notification.requestPermission((permission) => handlePermission(permission, callback)); |
||||
} |
||||
}; |
||||
@ -0,0 +1,13 @@
|
||||
/** |
||||
* Tries Notification.requestPermission, console warning instead of rejecting on error. |
||||
* @param callback Runs with the permission result on completion. |
||||
*/ |
||||
export const requestNotificationPermission = async ( |
||||
callback: NotificationPermissionCallback, |
||||
) => { |
||||
try { |
||||
callback(await Notification.requestPermission()); |
||||
} catch (error) { |
||||
console.warn(error); |
||||
} |
||||
}; |
||||
Loading…
Reference in new issue