import { h, Component, render } from '/js/preact.module.js'; import htm from '/js/htm.module.js'; // Initialize htm with Preact const html = htm.bind(h); window.mitty = mitt() const SVG_BATTERY_LEVEL = html`` const BATTERY_LEVEL = { 4: 'full', 3: 'medium', 2: 'low', 1: 'critical', 0: 'critical', } const PairingMethod = { DEFAULT: 'default', FAST: 'fast', STADIA: 'stadia', OLD: 'old', } const WsCommand = { GET_JOYCON_LIST: 'get_joycon_list', CONNECT_JOYCON: 'connect_joycon', DISCONNECT_JOYCON: 'disconnect_joycon', UPDATE_JOYCON_STATE: 'update_joycon_state', } const PairingState = { IDLE: 0, GETTING_TOKEN: 1, PAIRING: 2, CONNECTING: 3, CONNECTED: 4, DISCONNECTING: 5, DISCONNECTED: 10, ERROR_JOYCON: 101, ERROR_CONNECTION: 102, ERROR_INVALID_PAIRING_CODE: 103, ERROR_PUNCH_PAIRING: 104, ERROR_HOLE_PUNCHING: 105, ERROR_CONSOLE_CONNECTION: 106, } const PairingStateMessage = { [PairingState.IDLE]: 'Idle', [PairingState.GETTING_TOKEN]: 'Getting auth token...', [PairingState.PAIRING]: 'Sending pairing code...', [PairingState.CONNECTING]: 'Connecting with console...', [PairingState.CONNECTED]: 'Connected!', [PairingState.DISCONNECTED]: 'Disconnected', [PairingState.ERROR_JOYCON]: 'Joy-Con problem!', [PairingState.ERROR_CONNECTION]: 'Couldn\'t get auth token!', [PairingState.ERROR_INVALID_PAIRING_CODE]: 'Invalid pairing code!', [PairingState.ERROR_PUNCH_PAIRING]: 'Couldn\'t punch pairing!', [PairingState.ERROR_HOLE_PUNCHING]: 'Couldn\'t connect with console!', [PairingState.ERROR_CONSOLE_CONNECTION]: 'Couldn\'t connect with console!', } class PairingMethodPicker extends Component { constructor(props) { super() this.state = { pairing_method: props.pairing_method, } this.onChange = this.onChange.bind(this) } onChange(e) { const pairing_method = e.target.value this.setState({ pairing_method: pairing_method, }) window.mitty.emit('update_method', pairing_method) } render(props) { return html` ` } } class PrivateIpAddress extends Component { constructor(props) { super(props) let lock_host = false let host_ip_addr = props.host_ip_addr let console_ip_addr = props.console_ip_addr let hostname = window.location.hostname if (hostname.startsWith('192.168.') || hostname.startsWith('10.')) { host_ip_addr = hostname lock_host = true } this.state = { host_ip_addr: host_ip_addr, console_ip_addr: console_ip_addr, lock_host: lock_host, } this.onKeyPress = this.onKeyPress.bind(this) this.onChange = this.onChange.bind(this) } onChange(e) { const key = this.props.pairing_method == PairingMethod.DEFAULT ? 'host_ip_addr' : 'console_ip_addr' const value = e.target.value this.setState({ [key]: value, }) window.mitty.emit('update_addr', value) } onKeyPress(e) { if (!/[0-9\.]/.test(e.key)) { e.preventDefault() return } } componentDidMount() { let addr = this.props.pairing_method == PairingMethod.DEFAULT ? this.state.host_ip_addr : this.state.console_ip_addr window.mitty.emit('update_addr', addr) } render(props, state) { const pairing_method = props.pairing_method const addr = pairing_method == PairingMethod.DEFAULT ? state.host_ip_addr : state.console_ip_addr return html` ${(pairing_method == PairingMethod.STADIA) && html` `} ${(pairing_method == PairingMethod.DEFAULT && state.lock_host) && html` `} ${([PairingMethod.FAST, PairingMethod.OLD].indexOf(pairing_method) > -1 || (pairing_method == PairingMethod.DEFAULT && !state.lock_host)) && html` `} ` } } class PairingCode extends Component { constructor(props) { super(props) this.state = { pairing_code: props.pairing_code, } this.onChange = this.onChange.bind(this) } onChange(e) { const value = e.target.value this.setState({ pairing_code: value, }) window.mitty.emit('update_code', value) } render(props, state) { const pairing_method = props.pairing_method return html` ${[PairingMethod.DEFAULT, PairingMethod.STADIA].indexOf(pairing_method) > -1 && html` !/[0-9]/.test(e.key) && e.preventDefault()} onChange=${this.onChange} /> `} ${[PairingMethod.DEFAULT, PairingMethod.STADIA].indexOf(pairing_method) == -1 && html` `} ` } } class JoyCon extends Component { constructor(props) { super(props) this.connect = this.connect.bind(this) this.disconnect = this.disconnect.bind(this) this.onStateUpdated = this.onStateUpdated.bind(this) this.state = { ...props.joycon, } window.mitty.on('resp_' + WsCommand.DISCONNECT_JOYCON, this.onDisconnected) window.mitty.on('resp_' + WsCommand.UPDATE_JOYCON_STATE, this.onStateUpdated) } connect() { window.mitty.emit('req_' + WsCommand.CONNECT_JOYCON, this.props.joycon.serial) } disconnect() { window.mitty.emit('req_' + WsCommand.DISCONNECT_JOYCON, this.props.joycon.serial) } onStateUpdated(data) { if (data['serial'] != this.props.joycon.serial) { return } const state = data['state'] if (PairingStateMessage.hasOwnProperty(state)) { this.setState({ ...data, }) } } render(props, { name, state, pairing_code, is_left, color, battery_level }) { const joyconState = state const stateMessage = PairingStateMessage[joyconState] let showButton = true if ([PairingState.GETTING_TOKEN, PairingState.PAIRING, PairingState.CONNECTING].indexOf(joyconState) > -1) { showButton = false } let joyconSvg if (is_left) { joyconSvg = html`` } else { joyconSvg = html`` } const batteryLevel = BATTERY_LEVEL[battery_level] return html`
No Joy-Cons found!
`} ${props.joycons.length > 0 && html`░░ ░░░░░░ ░░ ░░ ░░░░░░ ░░░░░ ░░░ ░░ ░░░░░░ ░░░░░░░ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒▒▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒▒▒ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ ▓▓ █████ ██████ ██ ██████ ██ ██ ██ ████ ██████ ███████