summaryrefslogtreecommitdiff
path: root/client/lib/util.js
blob: e8065d54ab2beb7efe2e84072a0f3f5abfcea5e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import Tone from 'tone'
import StartAudioContext from './startAudioContext'

const isIphone = (navigator.userAgent.match(/iPhone/i)) || (navigator.userAgent.match(/iPod/i))
const isIpad = (navigator.userAgent.match(/iPad/i))
const isAndroid = (navigator.userAgent.match(/Android/i))
const isMobile = isIphone || isIpad || isAndroid
const isDesktop = ! isMobile

document.body.classList.add(isMobile ? 'mobile' : 'desktop')

const browser = { isIphone, isIpad, isMobile, isDesktop }

function clamp(n,a,b){ return n<a?a:n<b?n:b }
function choice (a){ return a[ Math.floor(Math.random() * a.length) ] }
function mod(n,m){ return n-(m * Math.floor(n/m)) }
function firstTouch(f){ return e => f(e.touches[0]) }

function requestAudioContext (fn) {
	if (isMobile) {
    const container = document.createElement('div')
    const button = document.createElement('div')
    button.innerHTML = 'Tap to start - please unmute your phone'
    Object.assign(container.style, {
			display: 'block',
      position: 'absolute',
      width: '100%',
      height: '100%',
      zIndex: '10000',
      top: '0px',
      left: '0px',
      backgroundColor: 'rgba(0, 0, 0, 0.8)',
    })
		Object.assign(button.style, {
			display: 'block',
		  position: 'absolute',
		  left: '50%',
		  top: '50%',
			padding: '20px',
		  backgroundColor: '#7F33ED',
		  color: 'white',
		  fontFamily: 'monospace',
		  borderRadius: '3px',
		  transform: 'translate3D(-50%,-50%,0)',
		  textAlign: 'center',
			lineHeight: '1.5',
			width: '150px',
    })
    container.appendChild(button)
    document.body.appendChild(container)
    StartAudioContext.setContext(Tone.context)
    StartAudioContext.on(button)
    StartAudioContext.onStarted(_ => {
      container.remove()
			fn()
  	})
	} else {
		fn()
	}
}

export { choice, mod, clamp, browser, firstTouch, requestAudioContext }