|
|
@@ -3,8 +3,11 @@ import React, {useEffect, useState} from "react";
|
|
|
import GameItem from "@components/GameItem";
|
|
|
import {REQ_STATUS} from "@api/config";
|
|
|
import SmallLoading from "@components/SmallLoading";
|
|
|
+import {useThemeProvider} from "@contexts/themeContext";
|
|
|
+import GameRoom from "@components/GameRoom";
|
|
|
+import {total} from "react-big-calendar/lib/utils/dates";
|
|
|
const i18n =global.i18n;
|
|
|
-const GameList=({data,status,reqMore})=>{
|
|
|
+const GameList=({data,status,reqMore,user})=>{
|
|
|
// data={
|
|
|
// type:0,//游戏分类
|
|
|
// page:1,
|
|
|
@@ -70,61 +73,191 @@ const GameList=({data,status,reqMore})=>{
|
|
|
// },
|
|
|
// ]
|
|
|
// }
|
|
|
+ const {isMobile} = useThemeProvider();
|
|
|
+ const M_LIST_COL=3;
|
|
|
+ const M_LIST_ROW=1;
|
|
|
const [selected,setSelected]=useState(-1);
|
|
|
- const getColNum=()=>{
|
|
|
- let num=3;
|
|
|
- let gamelist=document.querySelector('#gameList');
|
|
|
- if(gamelist){
|
|
|
- let style=window.getComputedStyle(gamelist);
|
|
|
- if (style!=null){
|
|
|
- let columns=style["grid-template-columns"];
|
|
|
- let arr=columns.split(" ");
|
|
|
- num=arr.length;
|
|
|
+ const [roomRow,setRoomRow]=useState({});
|
|
|
+ const [showPopRoom,setShowPopRoom]=useState(false);
|
|
|
+ const roomHeight="5.2rem"
|
|
|
+ const handleReset=(e)=>{
|
|
|
+ setSelected(-1);
|
|
|
+ setRoomRow({});
|
|
|
+ }
|
|
|
+ useEffect(()=>{
|
|
|
+ document.addEventListener("click",handleReset);
|
|
|
+ return ()=>{
|
|
|
+ document.removeEventListener("click",handleReset);
|
|
|
+ }
|
|
|
+ },[])
|
|
|
+ const checkSetRoom=(e,item,row,total)=>{
|
|
|
+ let target=e.target;
|
|
|
+ if (target){
|
|
|
+ let rect=target.getBoundingClientRect();
|
|
|
+ let cH = document.documentElement.clientHeight;
|
|
|
+ let cB=rect.bottom;
|
|
|
+ if (cH-cB>80)row=row+1;
|
|
|
+ }else row=row+1;
|
|
|
+ if (row>=total)row=total-1;
|
|
|
+ setRoomRow({
|
|
|
+ row:row,
|
|
|
+ data:item
|
|
|
+ });
|
|
|
+ }
|
|
|
+ const handleSelect=(e,data,row,total)=>{
|
|
|
+ e.stopPropagation();
|
|
|
+ if (data.id===selected){
|
|
|
+ handleReset();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ setSelected(data.id);
|
|
|
+ checkSetRoom(e,data,row,total);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const handlePopSelected=(e,data,row,totall)=>{
|
|
|
+ e.stopPropagation();
|
|
|
+ setRoomRow({
|
|
|
+ row:0,
|
|
|
+ data:data
|
|
|
+ });
|
|
|
+ setShowPopRoom(true);
|
|
|
+ }
|
|
|
+ const handlePopClose=()=>{
|
|
|
+ setRoomRow({});
|
|
|
+ setShowPopRoom(false);
|
|
|
+ }
|
|
|
+ const renderGameListDesktop=()=>{
|
|
|
+ let list=data.data;
|
|
|
+ if (list==null)list=[];
|
|
|
+ return (
|
|
|
+ <>
|
|
|
+ <div id={"gameList"} className={styles.game_list}>
|
|
|
+ {
|
|
|
+ list.map((item, index) => {
|
|
|
+ return (
|
|
|
+ <GameItem key={index} data={item} handleRoom={handlePopSelected}></GameItem>
|
|
|
+ )
|
|
|
+ })
|
|
|
+ }
|
|
|
+ </div>
|
|
|
+ <GameRoom open={showPopRoom} data={roomRow.data} user={user} onClose={handlePopClose}></GameRoom>
|
|
|
+ </>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ const formatMList = (list) => {
|
|
|
+ let mList = [];
|
|
|
+ if (list) {
|
|
|
+ for (let i = 0; i < list.length; i += M_LIST_COL) {
|
|
|
+ let rowArr = list.slice(i, i + M_LIST_COL);
|
|
|
+ mList.push(rowArr);
|
|
|
}
|
|
|
}
|
|
|
- return num;
|
|
|
+ return mList;
|
|
|
}
|
|
|
- const handleSelect=(e,i)=>{
|
|
|
- setSelected(i);
|
|
|
+ const renderRoom=(row,len)=>{
|
|
|
+ if (roomRow==null)return (<></>);
|
|
|
+ let rrow=roomRow.row;
|
|
|
+ let data=roomRow.data;
|
|
|
+ if (rrow===row){
|
|
|
+ // let level_info=data.level_info;
|
|
|
+ let open=true;
|
|
|
+ return (
|
|
|
+ <GameRoom open={open} data={data} height={roomHeight} mobile={true} user={user}></GameRoom>
|
|
|
+ )
|
|
|
+ }
|
|
|
+ else return (<></>);
|
|
|
}
|
|
|
- const renderGameList=()=>{
|
|
|
+ const renderGameListMobile=()=>{
|
|
|
let list=data.data;
|
|
|
if (list==null)list=[];
|
|
|
+ list=formatMList(list);
|
|
|
+ let len=list.length;
|
|
|
+ // return (
|
|
|
+ // <div id={"gameList"} className={styles.game_list}>
|
|
|
+ // {
|
|
|
+ // list.map((item,index)=>{
|
|
|
+ // let itemStyle={}
|
|
|
+ // if (selected!==-1){
|
|
|
+ // if (index!==selected){
|
|
|
+ // itemStyle.filter="brightness(60%)"
|
|
|
+ // }
|
|
|
+ // else
|
|
|
+ // {
|
|
|
+ // itemStyle.transform="scale(1.05)";
|
|
|
+ // }
|
|
|
+ // let col=getColNum();
|
|
|
+ // let s_row=Math.floor(selected/col);
|
|
|
+ // let row=Math.floor(index/col);
|
|
|
+ // if (s_row===row){
|
|
|
+ // itemStyle.marginBottom="100px";
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // return (
|
|
|
+ // <GameItem style={itemStyle} key={index} data={item} index={index} onClickItem={handleSelect}></GameItem>
|
|
|
+ // )
|
|
|
+ // })
|
|
|
+ // }
|
|
|
+ // </div>
|
|
|
+ // )
|
|
|
+
|
|
|
return (
|
|
|
- <div id={"gameList"} className={styles.game_list}>
|
|
|
+ <div id={"gameList"} className={styles.game_list_mobile}>
|
|
|
{
|
|
|
- list.map((item,index)=>{
|
|
|
- let itemStyle={}
|
|
|
- if (selected!==-1){
|
|
|
- if (index!==selected){
|
|
|
- itemStyle.filter="brightness(60%)"
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- itemStyle.transform="scale(1.05)";
|
|
|
- }
|
|
|
- let col=getColNum();
|
|
|
- let s_row=Math.floor(selected/col);
|
|
|
- let row=Math.floor(index/col);
|
|
|
- if (s_row===row){
|
|
|
- itemStyle.marginBottom="100px";
|
|
|
+ list.map((rowArr,row)=>{
|
|
|
+ let rowStyle={};
|
|
|
+ if (roomRow!=null){
|
|
|
+ // if (roomRow.row===row){
|
|
|
+ if (row>=roomRow.row){
|
|
|
+ // rowStyle.marginTop=roomHeight;
|
|
|
+ rowStyle.transform=`translateY(${roomHeight})`;
|
|
|
}
|
|
|
+ // if (roomRow.row===row){
|
|
|
+ // rowStyle.marginTop=roomHeight;
|
|
|
+ // }
|
|
|
}
|
|
|
return (
|
|
|
- <GameItem style={itemStyle} key={index} data={item} index={index} onClickItem={handleSelect}></GameItem>
|
|
|
+ <>
|
|
|
+ {renderRoom(row,len)}
|
|
|
+ <div key={row} className={styles.list_row} style={rowStyle}>
|
|
|
+ {
|
|
|
+ rowArr.map((item, col) => {
|
|
|
+ let itemStyle={}
|
|
|
+ if (selected!==-1){
|
|
|
+ if (item.id!==selected){
|
|
|
+ itemStyle.filter="brightness(60%)"
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ itemStyle.transform="scale(1.05)";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (
|
|
|
+ <GameItem key={col} data={item} handleRoom={(e,data)=>{
|
|
|
+ handleSelect(e,data,row,len)
|
|
|
+ }} row={row} style={itemStyle}></GameItem>
|
|
|
+ )
|
|
|
+ })
|
|
|
+ }
|
|
|
+ </div>
|
|
|
+ </>
|
|
|
)
|
|
|
})
|
|
|
}
|
|
|
</div>
|
|
|
)
|
|
|
}
|
|
|
- const renderProgress=()=>{
|
|
|
- let list=data.data;
|
|
|
- if (list==null)list=[];
|
|
|
- let current=list.length;
|
|
|
- let total=data.total;
|
|
|
- let progress=Math.ceil((current/total)*100);
|
|
|
- let spro=progress+"%";
|
|
|
+ const renderGameList = () => {
|
|
|
+ if (isMobile()) return renderGameListMobile();
|
|
|
+ else return renderGameListDesktop();
|
|
|
+ }
|
|
|
+ const renderProgress = () => {
|
|
|
+ let list = data.data;
|
|
|
+ if (list == null) list = [];
|
|
|
+ let current = list.length;
|
|
|
+ let total = data.total;
|
|
|
+ let progress = Math.ceil((current / total) * 100);
|
|
|
+ let spro =progress+"%";
|
|
|
return (
|
|
|
<div className={styles.page_progress}>
|
|
|
<span>{current} / {total}</span>
|
|
|
@@ -162,11 +295,26 @@ const GameList=({data,status,reqMore})=>{
|
|
|
</div>
|
|
|
)
|
|
|
}
|
|
|
+ const renderShowMore=()=>{
|
|
|
+ let moreStyle={};
|
|
|
+ if (roomRow&&roomRow.row!=null){
|
|
|
+ let row=roomRow.row;
|
|
|
+ if (row>=0){
|
|
|
+ moreStyle.transform=`translateY(${roomHeight})`;
|
|
|
+ moreStyle.marginBottom=roomHeight;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (
|
|
|
+ <div className={styles.page_con} style={moreStyle}>
|
|
|
+ {renderProgress()}
|
|
|
+ {renderShowMoreBtn()}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }
|
|
|
return (
|
|
|
<div className={`w-100 ${styles.list_container}`}>
|
|
|
{renderGameList()}
|
|
|
- {renderProgress()}
|
|
|
- {renderShowMoreBtn()}
|
|
|
+ {renderShowMore()}
|
|
|
</div>
|
|
|
)
|
|
|
}
|