* attempt some sort of "usurping" system * polling-based active video approach * split into inner component again * click to steal active video * disable findAndActivateVideo on native * new intersectionobserver approach - wip * fix types * disable perf optimisation to allow overflow * make active player indicator subtler, clean up video utils * partially fix double-playing * start working on controls * fullscreen API * get buttons working somewhat * rm source from where it shouldn't be * use video elem as source of truth * fix keyboard nav + mute state * new icons, add fullscreen + time + fix play * unmount when far offscreen + round 2dp * listen globally to clicks rather than blur event * move controls to new file * reduce quality when not active * add hover state to buttons * stop propagation of videoplayer click * move around autoplay effects * increase background contrast * add subtitles button * add stopPropagation to root of video player * clean up VideoWebControls * fix chrome * change quality based on focused state * use autoLevelCapping instead of nextLevel * get subtitle track from stream * always use hlsjs * rework hls into a ref * render player earlier, allowing preload * add error boundary * clean up component structure and organisation * rework fullscreen API * disable fullscreen on iPhone * don't play when ready on pause * debounce buffering * simplify giant list of event listeners * update pref * reduce prop drilling * minimise rerenders in `ActiveViewContext` * restore prop drilling --------- Co-authored-by: Samuel Newman <10959775+mozzius@users.noreply.github.com> Co-authored-by: Hailey <me@haileyok.com>
23 lines
896 B
TypeScript
23 lines
896 B
TypeScript
import {Platform} from 'react-native'
|
|
import {getLocales} from 'expo-localization'
|
|
|
|
import {fixLegacyLanguageCode} from '#/locale/helpers'
|
|
import {dedupArray} from 'lib/functions'
|
|
|
|
export const isIOS = Platform.OS === 'ios'
|
|
export const isAndroid = Platform.OS === 'android'
|
|
export const isNative = isIOS || isAndroid
|
|
export const devicePlatform = isIOS ? 'ios' : isAndroid ? 'android' : 'web'
|
|
export const isWeb = !isNative
|
|
export const isMobileWebMediaQuery = 'only screen and (max-width: 1300px)'
|
|
export const isMobileWeb =
|
|
isWeb &&
|
|
// @ts-ignore we know window exists -prf
|
|
global.window.matchMedia(isMobileWebMediaQuery)?.matches
|
|
export const isIPhoneWeb = isWeb && /iPhone/.test(navigator.userAgent)
|
|
|
|
export const deviceLocales = dedupArray(
|
|
getLocales?.()
|
|
.map?.(locale => fixLegacyLanguageCode(locale.languageCode))
|
|
.filter(code => typeof code === 'string'),
|
|
) as string[]
|