import React, { useEffect } from 'react'
import { useTranslation } from 'react-i18next'
import {
LocationInstanceConnectionAction,
LocationInstanceConnectionServiceReceptor,
useLocationInstanceConnectionState,
useWorldInstance
} from '@xrengine/client-core/src/common/services/LocationInstanceConnectionService'
import { LoadingCircle } from '@xrengine/client-core/src/components/LoadingCircle'
import { leaveNetwork } from '@xrengine/client-core/src/transports/SocketWebRTCClientFunctions'
import { SocketWebRTCClientNetwork } from '@xrengine/client-core/src/transports/SocketWebRTCClientNetwork'
import { Engine } from '@xrengine/engine/src/ecs/classes/Engine'
import { addActionReceptor, dispatchAction, removeActionReceptor } from '@xrengine/hyperflux'
import DirectionsRun from '@mui/icons-material/DirectionsRun'
import DoneIcon from '@mui/icons-material/Done'
import { useEditorState } from '../../services/EditorServices'
import SelectInput from '../inputs/SelectInput'
import { InfoTooltip } from '../layout/Tooltip'
import * as styles from '../toolbar/styles.module.scss'
import {
EditorActiveInstanceService,
EditorActiveInstanceServiceReceptor,
useEditorActiveInstanceState
} from './EditorActiveInstanceService'
import { useEditorNetworkInstanceProvisioning } from './useEditorNetworkInstanceProvisioning'
export const WorldInstanceConnection = () => {
const { t } = useTranslation()
const activeInstanceState = useEditorActiveInstanceState()
const activeInstances = [
{
label: t('editor:toolbar.instance.none'),
value: 'None'
}
].concat(
activeInstanceState.activeInstances.value.map((instance) => {
return {
label: `${instance.id} (${instance.currentUsers} ${
instance.currentUsers === 1 ? t('editor:toolbar.instance.user') : t('editor:toolbar.instance.users')
})`,
value: instance.id
}
})
)
const editorState = useEditorState()
const sceneId = `${editorState.projectName.value}/${editorState.sceneName.value}`
EditorActiveInstanceService.useAPIListeners()
useEffect(() => {
addActionReceptor(EditorActiveInstanceServiceReceptor)
addActionReceptor(LocationInstanceConnectionServiceReceptor)
return () => {
removeActionReceptor(EditorActiveInstanceServiceReceptor)
removeActionReceptor(LocationInstanceConnectionServiceReceptor)
}
}, [])
useEditorNetworkInstanceProvisioning()
const onSelectInstance = (selectedInstance: string) => {
if (selectedInstance === 'None' || (worldNetworkHostId && selectedInstance !== worldNetworkHostId)) {
if (worldNetworkHostId) {
leaveNetwork(Engine.instance.currentWorld.worldNetwork as SocketWebRTCClientNetwork)
}
return
}
const instance = activeInstanceState.activeInstances.value.find(({ id }) => id === selectedInstance)
if (!instance) return
EditorActiveInstanceService.provisionServer(instance.location, instance.id, sceneId)
}
// const decrementPage = () => { }
// const incrementPage = () => { }
const worldNetworkHostId = Engine.instance.currentWorld.worldNetwork?.hostId
const currentLocationInstanceConnection = useWorldInstance()
const getIcon = () => {
if (currentLocationInstanceConnection?.value) {
if (currentLocationInstanceConnection.connected) return