import React, { useState, useEffect, useRef } from 'react';
import { Globe, Sun, CloudRain, CloudLightning, Clock, Users, MapPin, ServerOff } from 'lucide-react';
import { motion } from 'framer-motion';
import { io } from 'socket.io-client';
// 월드 정보 페이지
const WorldsPage = ({ isMobile = false }) => {
const [worlds, setWorlds] = useState([]);
const [loading, setLoading] = useState(true);
const [serverOnline, setServerOnline] = useState(null);
const socketRef = useRef(null);
// 월드 순서 정렬 함수 (오버월드 -> 네더 -> 엔드)
const sortWorlds = (worldList) => {
const order = {
'minecraft:overworld': 0,
'minecraft:the_nether': 1,
'minecraft:the_end': 2
};
return [...worldList].sort((a, b) => {
const orderA = order[a.dimension] ?? 999;
const orderB = order[b.dimension] ?? 999;
return orderA - orderB;
});
};
useEffect(() => {
// 소켓 연결
const socket = io('/', {
path: '/socket.io',
transports: ['websocket', 'polling']
});
socketRef.current = socket;
socket.on('status', (data) => {
setServerOnline(data.online);
if (!data.online) {
setLoading(false);
}
});
socket.on('worlds', (data) => {
setWorlds(sortWorlds(data.worlds || []));
setLoading(false);
});
// 초기 데이터 요청
socket.emit('get_worlds');
// 5초마다 갱신
const interval = setInterval(() => {
socket.emit('get_worlds');
}, 1000);
return () => {
clearInterval(interval);
socket.disconnect();
};
}, []);
// 시간 포맷팅 (틱 -> 시:분)
const formatTime = (dayTime) => {
const hours = Math.floor(dayTime / 1000);
const minutes = Math.floor((dayTime % 1000) / 16.67);
const hour24 = (hours + 6) % 24;
const ampm = hour24 >= 12 ? '오후' : '오전';
const hour12 = hour24 % 12 || 12;
return `${ampm} ${hour12}:${String(Math.floor(minutes)).padStart(2, '0')}`;
};
// 날씨 아이콘
const WeatherIcon = ({ type }) => {
switch (type) {
case 'thunderstorm':
return
마인크래프트 서버가 현재 오프라인 상태입니다.
서버가 시작되면 월드 정보를 확인할 수 있습니다.
{player.name}
월드 정보를 불러올 수 없습니다.