import * as NotifyActions from './NotifyActions.js'
import * as SocketActions from './SocketActions.js'
import * as StreamActions from './StreamActions.js'
import * as constants from '../constants.js'
import Promise from 'bluebird'
import socket from '../socket.js'
import { callId, getUserMedia } from '../window.js'

export const init = () => dispatch => {
  return dispatch({
    type: constants.INIT,
    payload: Promise.all([
      connect()(dispatch),
      getCameraStream()(dispatch)
    ])
    .spread((socket, stream) => {
      dispatch(SocketActions.handshake({
        socket,
        roomName: callId,
        stream
      }))
    })
  })
}

export const connect = () => dispatch => {
  return new Promise(resolve => {
    socket.once('connect', () => {
      resolve(socket)
    })
    socket.on('connect', () => {
      dispatch(NotifyActions.warning('Connected to server socket'))
    })
    socket.on('disconnect', () => {
      dispatch(NotifyActions.error('Server socket disconnected'))
    })
  })
}

export const getCameraStream = () => dispatch => {
  return getUserMedia({ video: true, audio: true })
  .then(stream => {
    dispatch(StreamActions.addStream({ stream, userId: constants.ME }))
    return stream
  })
  .catch(() => {
    dispatch(NotifyActions.alert('Could not get access to microphone & camera'))
    return null
  })
}

import * as NotifyActions from './NotifyActions.js'
import * as SocketActions from './SocketActions.js'
import * as StreamActions from './StreamActions.js'
import * as constants from '../constants.js'
import Promise from 'bluebird'
import socket from '../socket.js'
import { callId, getUserMedia } from '../window.js'

export const init = () => dispatch => {
  return dispatch({
    type: constants.INIT,
    payload: Promise.all([
      connect()(dispatch),
      getCameraStream()(dispatch)
    ])
    .spread((socket, stream) => {
      dispatch(SocketActions.handshake({
        socket,
        roomName: callId,
        stream
      }))
    })
  })
}

export const connect = () => dispatch => {
  return new Promise(resolve => {
    socket.once('connect', () => {
      resolve(socket)
    })
    socket.on('connect', () => {
      dispatch(NotifyActions.warning('Connected to server socket'))
    })
    socket.on('disconnect', () => {
      dispatch(NotifyActions.error('Server socket disconnected'))
    })
  })
}

export const getCameraStream = () => dispatch => {
  return getUserMedia({ video: { facingMode: 'user' }, audio: true })
  .then(stream => {
    dispatch(StreamActions.addStream({ stream, userId: constants.ME }))
    return stream
  })
  .catch(() => {
    dispatch(NotifyActions.alert('Could not get access to microphone & camera'))
    return null
  })
}

Use facingMode: user when retrieving user video
Use facingMode: user when retrieving user video
