fix: fix uploading photos on iOS 13 (#1550)

fixes #1546
This commit is contained in:
Nolan Lawson 2019-10-07 07:15:05 -07:00 committed by GitHub
parent 5167e04417
commit d53430fee5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 29 additions and 15 deletions

View file

@ -142,6 +142,7 @@
"NodeList", "NodeList",
"NotificationEvent", "NotificationEvent",
"OffscreenCanvas", "OffscreenCanvas",
"PointerEvent",
"URL", "URL",
"WebSocket", "WebSocket",
"__assets__", "__assets__",

View file

@ -7,6 +7,7 @@ import { INLINE_THEME, DEFAULT_THEME, switchToTheme } from '../routes/_utils/the
import { basename } from '../routes/_api/utils' import { basename } from '../routes/_api/utils'
import { onUserIsLoggedOut } from '../routes/_actions/onUserIsLoggedOut' import { onUserIsLoggedOut } from '../routes/_actions/onUserIsLoggedOut'
import { storeLite } from '../routes/_store/storeLite' import { storeLite } from '../routes/_store/storeLite'
import { isIOSPre12Point2, isMac } from '../routes/_utils/userAgent'
window.__themeColors = process.env.THEME_COLORS window.__themeColors = process.env.THEME_COLORS
@ -51,7 +52,7 @@ if (disableCustomScrollbars) {
} }
// hack to make the scrollbars rounded only on macOS // hack to make the scrollbars rounded only on macOS
if (/mac/i.test(navigator.platform)) { if (isMac()) {
document.documentElement.style.setProperty('--scrollbar-border-radius', '50px') document.documentElement.style.setProperty('--scrollbar-border-radius', '50px')
} }
@ -59,9 +60,7 @@ if (/mac/i.test(navigator.platform)) {
// for cross-origin authentication: https://github.com/nolanlawson/pinafore/issues/45 // for cross-origin authentication: https://github.com/nolanlawson/pinafore/issues/45
// Here we sniff for iOS <12.2 by checking for the existence of a native IntersectionObserver // Here we sniff for iOS <12.2 by checking for the existence of a native IntersectionObserver
// function, which was added in 12.2. // function, which was added in 12.2.
if (/iP(?:hone|ad|od)/.test(navigator.userAgent) && if (isIOSPre12Point2()) {
!(typeof IntersectionObserver === 'function' &&
IntersectionObserver.toString().includes('[native code]'))) {
document.head.removeChild(document.getElementById('theManifest')) document.head.removeChild(document.getElementById('theManifest'))
} }

View file

@ -1,3 +1,5 @@
import { isIOSPre13 } from '../_utils/userAgent'
export const DEFAULT_MEDIA_WIDTH = 300 export const DEFAULT_MEDIA_WIDTH = 300
export const DEFAULT_MEDIA_HEIGHT = 250 export const DEFAULT_MEDIA_HEIGHT = 250
@ -51,10 +53,8 @@ const acceptedFileTypes = [
'video/x-ms-asf' 'video/x-ms-asf'
] ]
const isIOS = process.browser && /iP(?:hone|ad|od)/.test(navigator.userAgent)
// TODO: iOS has a bug where it does not allow audio uploads unless you either *only* accept audio, or // TODO: iOS has a bug where it does not allow audio uploads unless you either *only* accept audio, or
// you accept everything. Since this is not a great user experience (e.g. it could lead someone trying // you accept everything. Since this is not a great user experience (e.g. it could lead someone trying
// to upload a PDF, which is not allowed), then we only use the */* for iOS. // to upload a PDF, which is not allowed), then we only use the */* for iOS.
// WebKit bug: https://bugs.webkit.org/show_bug.cgi?id=190982#c2 // WebKit bug: https://bugs.webkit.org/show_bug.cgi?id=190982#c2
export const mediaAccept = isIOS ? '*/*' : acceptedFileTypes.join(',') export const mediaAccept = isIOSPre13() ? '*/*' : acceptedFileTypes.join(',')

View file

@ -1,9 +1,9 @@
// "lite" version of the store used in the inline script. // "lite" version of the store used in the inline script.
import { safeParse } from './safeParse' import { safeParse } from './safeParse'
import { testHasLocalStorageOnce } from '../_utils/testStorage' import { testHasLocalStorage } from '../_utils/testStorage'
const hasLocalStorage = testHasLocalStorageOnce() const hasLocalStorage = testHasLocalStorage()
export const storeLite = { export const storeLite = {
get () { get () {

View file

@ -1,9 +1,9 @@
import { scheduleIdleTask } from './scheduleIdleTask' import { scheduleIdleTask } from './scheduleIdleTask'
import { store } from '../_store/store' import { store } from '../_store/store'
import { isMobile } from './userAgent'
// Rough guess at whether this is a "mobile" device or not, for the purposes // Rough guess at whether this is a "mobile" device or not, for the purposes
// of "device class" estimations // of "device class" estimations
const IS_MOBILE = process.browser && navigator.userAgent.match(/(?:iPhone|iPod|iPad|Android|KAIOS)/)
// Run a task that doesn't need to be processed immediately, but should // Run a task that doesn't need to be processed immediately, but should
// probably be delayed if we're on a mobile device. Also run it sooner // probably be delayed if we're on a mobile device. Also run it sooner
@ -11,7 +11,7 @@ const IS_MOBILE = process.browser && navigator.userAgent.match(/(?:iPhone|iPod|i
export function runMediumPriorityTask (fn) { export function runMediumPriorityTask (fn) {
if (store.get().pageVisibilityHidden) { if (store.get().pageVisibilityHidden) {
fn() fn()
} else if (IS_MOBILE) { } else if (isMobile()) {
scheduleIdleTask(fn) scheduleIdleTask(fn)
} else { } else {
requestAnimationFrame(fn) requestAnimationFrame(fn)

View file

@ -5,7 +5,7 @@ import { thunk } from './thunk'
const testKey = '__test__' const testKey = '__test__'
export const testHasLocalStorageOnce = () => { export const testHasLocalStorage = thunk(() => {
try { try {
localStorage.setItem(testKey, testKey) localStorage.setItem(testKey, testKey)
if (!localStorage.length || localStorage.getItem(testKey) !== testKey) { if (!localStorage.length || localStorage.getItem(testKey) !== testKey) {
@ -16,9 +16,7 @@ export const testHasLocalStorageOnce = () => {
return false return false
} }
return true return true
} })
export const testHasLocalStorage = thunk(testHasLocalStorageOnce)
export const testHasIndexedDB = thunk(async () => { export const testHasIndexedDB = thunk(async () => {
if (typeof indexedDB === 'undefined') { if (typeof indexedDB === 'undefined') {

View file

@ -1,3 +1,19 @@
import { thunk } from './thunk' import { thunk } from './thunk'
export const isKaiOS = thunk(() => process.browser && /KAIOS/.test(navigator.userAgent)) export const isKaiOS = thunk(() => process.browser && /KAIOS/.test(navigator.userAgent))
export const isIOS = thunk(() => process.browser && /iP(?:hone|ad|od)/.test(navigator.userAgent))
export const isMac = thunk(() => process.browser && /mac/i.test(navigator.platform))
// IntersectionObserver introduced in iOS 12.2 https://caniuse.com/#feat=intersectionobserver
export const isIOSPre12Point2 = thunk(() => process.browser && isIOS() &&
!(typeof IntersectionObserver === 'function' &&
IntersectionObserver.toString().includes('[native code]')))
// PointerEvent introduced in iOS 13 https://caniuse.com/#feat=pointer
export const isIOSPre13 = thunk(() => process.browser && isIOS() &&
!(typeof PointerEvent === 'function' &&
PointerEvent.toString().includes('[native code]')))
export const isMobile = thunk(() => process.browser && navigator.userAgent.match(/(?:iPhone|iPod|iPad|Android|KAIOS)/))