Add in node timer features
This commit is contained in:
parent
1d044f986d
commit
3b25783304
182
src/App.js
182
src/App.js
@ -17,7 +17,8 @@ import Spinner from 'react-bootstrap/Spinner';
|
|||||||
import Form from 'react-bootstrap/Form';
|
import Form from 'react-bootstrap/Form';
|
||||||
|
|
||||||
import { FaCheckCircle } from 'react-icons/fa';
|
import { FaCheckCircle } from 'react-icons/fa';
|
||||||
import { IoCheckmarkCircleOutline,IoCloseCircleSharp,IoAlertCircleOutline } from 'react-icons/io5';
|
import { BiAlarmAdd } from 'react-icons/bi';
|
||||||
|
import { MdAlarmOff } from 'react-icons/md';
|
||||||
|
|
||||||
const fuzzysort = require('fuzzysort')
|
const fuzzysort = require('fuzzysort')
|
||||||
|
|
||||||
@ -37,8 +38,36 @@ const progress2 = new Audio(process.env.PUBLIC_URL+"/progress2.mp3")
|
|||||||
const retainerNames = ["Ayayayaya","Kittystorage","Morecatz","Finalretainer","Nowitsabun","Butwhy","Kkittyy","Howdoesanyonenameall","Ayayayayay"];
|
const retainerNames = ["Ayayayaya","Kittystorage","Morecatz","Finalretainer","Nowitsabun","Butwhy","Kkittyy","Howdoesanyonenameall","Ayayayayay"];
|
||||||
|
|
||||||
function Item(p){
|
function Item(p){
|
||||||
const {item,setLockout,contributor,lockout,itemCount,totalItemCount,playerInventory} = p
|
const {item,contributor,itemCount,totalItemCount,playerInventory} = p
|
||||||
const [itemLoc,setItemLoc]=useState("")
|
const [itemLoc,setItemLoc]=useState("")
|
||||||
|
const [itemTimers,setItemTimers]=useState([])
|
||||||
|
const [lockout,setLockout]=useState(false)
|
||||||
|
|
||||||
|
function updateTimer(ts,te,timerIndex) {
|
||||||
|
var newTimerStart=[];
|
||||||
|
if (item.timer_start!==null){
|
||||||
|
newTimerStart=[...item.timer_start.split(",")];
|
||||||
|
}
|
||||||
|
var newTimerEnd=[];
|
||||||
|
if (item.timer_end!==null){
|
||||||
|
newTimerEnd=[...item.timer_end.split(",")];
|
||||||
|
}
|
||||||
|
if (ts==""&&te==""){
|
||||||
|
newTimerStart=newTimerStart.filter((item,i)=>i!=timerIndex);
|
||||||
|
newTimerEnd=newTimerEnd.filter((item,i)=>i!=timerIndex);
|
||||||
|
} else {
|
||||||
|
newTimerStart[timerIndex]=ts;
|
||||||
|
newTimerEnd[timerIndex]=te;
|
||||||
|
}
|
||||||
|
setLockout(true)
|
||||||
|
axios.post(BACKEND_URL+"/updateTimer",{timer_start:newTimerStart.join(","),timer_end:newTimerEnd.join(","),id:item.id,last_modified:new Date()})
|
||||||
|
.then((data)=>{
|
||||||
|
setLockout(false)
|
||||||
|
})
|
||||||
|
.catch((err)=>{
|
||||||
|
setLockout(false)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function updateItem(item,target,contributor) {
|
function updateItem(item,target,contributor) {
|
||||||
var correctedVal=Math.min(item.required,target.value);
|
var correctedVal=Math.min(item.required,target.value);
|
||||||
@ -49,7 +78,7 @@ function Item(p){
|
|||||||
setLockout(false)
|
setLockout(false)
|
||||||
})
|
})
|
||||||
.catch((err)=>{
|
.catch((err)=>{
|
||||||
|
setLockout(false)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,6 +174,12 @@ function Item(p){
|
|||||||
//locs+="Player Inventory ["+Math.floor((j/35+1))+"] x"+it.amt
|
//locs+="Player Inventory ["+Math.floor((j/35+1))+"] x"+it.amt
|
||||||
}
|
}
|
||||||
setItemLoc(locs)
|
setItemLoc(locs)
|
||||||
|
if (item.required!==item.obtained&&item.timer_start!==null&&item.timer_start.length>0&&item.timer_start[0]!=""){
|
||||||
|
var endTimers = item.timer_end.split(",");
|
||||||
|
setItemTimers(item.timer_start.split(",").map((t,i)=>{return {timer_start:t,timer_end:endTimers[i]}}))
|
||||||
|
} else {
|
||||||
|
setItemTimers([])
|
||||||
|
}
|
||||||
},[item,playerInventory])
|
},[item,playerInventory])
|
||||||
|
|
||||||
return <Row className={"pb-1 pt-1 text-light"+(Number(item.obtained)===0?item.finalcraft?" finalProduct":" notStarted":Number(item.obtained)===Number(item.required)?" completed":" inProgress")}>
|
return <Row className={"pb-1 pt-1 text-light"+(Number(item.obtained)===0?item.finalcraft?" finalProduct":" notStarted":Number(item.obtained)===Number(item.required)?" completed":" inProgress")}>
|
||||||
@ -164,9 +199,32 @@ function Item(p){
|
|||||||
updateItem(item,{value:item.required},contributor)
|
updateItem(item,{value:item.required},contributor)
|
||||||
}}/>}
|
}}/>}
|
||||||
</Col>
|
</Col>
|
||||||
<Col>
|
{item.required!==item.obtained&&<>
|
||||||
|
<Col sm={2}>
|
||||||
<a style={{position:"relative",top:"8px"}} className="text-muted" href={"https://garlandtools.org/db/#item/"+item.itemid} target="tools">View Item Info</a>
|
<a style={{position:"relative",top:"8px"}} className="text-muted" href={"https://garlandtools.org/db/#item/"+item.itemid} target="tools">View Item Info</a>
|
||||||
</Col>
|
</Col>
|
||||||
|
<Col sm={1}>
|
||||||
|
<BiAlarmAdd style={{cursor:"pointer",borderBottom:"1px dotted",color:"#99FF99"}} onClick={()=>{if (item.timer_start!==null&&item.timer_start.length>0){updateTimer("0:00","3:00",item.timer_start.split(",").length)} else {updateTimer("0:00","3:00",0)}}}/>
|
||||||
|
</Col>
|
||||||
|
<Col sm={3}>
|
||||||
|
{itemTimers.map((timer,i)=><Timer key={i} lockout={lockout} updateTimer={updateTimer} timerIndex={i} timer_start={timer.timer_start} timer_end={timer.timer_end}/>)}
|
||||||
|
</Col></>}
|
||||||
|
</Row>
|
||||||
|
}
|
||||||
|
|
||||||
|
function Timer(p){
|
||||||
|
const {timer_start,timer_end,timerIndex,updateTimer,lockout}=p
|
||||||
|
const [timerStart,setTimerStart] = useState("")
|
||||||
|
const [timerEnd,setTimerEnd] = useState("")
|
||||||
|
useEffect(()=>{
|
||||||
|
setTimerStart(timer_start)
|
||||||
|
setTimerEnd(timer_end)
|
||||||
|
},[timer_start,timer_end])
|
||||||
|
return <Row>
|
||||||
|
<Col sm={3}><DarkInput style={{width:"100%"}} disabled={lockout} value={timerStart} onChange={(f)=>{setTimerStart(f.currentTarget.value)}} onKeyDown={(k)=>{if (k.key==='Enter') {if (k.currentTarget.value!=timer_start){updateTimer(k.currentTarget.value,timer_end,timerIndex)}}}} onBlur={(f)=>{if (f.currentTarget.value!=timer_start){updateTimer(f.currentTarget.value,timer_end,timerIndex)}}}></DarkInput></Col>
|
||||||
|
<Col sm={1} className="text-white">-</Col>
|
||||||
|
<Col sm={3}><DarkInput style={{width:"100%"}} disabled={lockout} value={timerEnd} onChange={(f)=>{setTimerEnd(f.currentTarget.value)}} onKeyDown={(k)=>{if (k.key==='Enter') {if (k.currentTarget.value!=timer_end){updateTimer(timer_start,k.currentTarget.value,timerIndex)}}}} onBlur={(f)=>{if (f.currentTarget.value!=timer_end){updateTimer(timer_start,f.currentTarget.value,timerIndex)}}}></DarkInput></Col>
|
||||||
|
<Col sm={1}><MdAlarmOff style={{cursor:"pointer",color:"red"}} onClick={(f)=>{updateTimer("","",timerIndex)}}/></Col>
|
||||||
</Row>
|
</Row>
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,6 +530,32 @@ function ListApp(p){
|
|||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function TimeDisplay(duration){
|
||||||
|
var hrs=Math.floor(duration/3600)
|
||||||
|
var min=Math.floor(duration/60)%60
|
||||||
|
return (hrs>0?hrs+" hrs,":"")+min+" min"
|
||||||
|
}
|
||||||
|
|
||||||
|
function TimerDisplay(p){
|
||||||
|
const {timer,eorzeanTime} = p
|
||||||
|
var eorzeanSeconds=Number(eorzeanTime.split(":")[0])*3600+Number(eorzeanTime.split(":")[1])*60
|
||||||
|
return <><Row>
|
||||||
|
<Col>
|
||||||
|
<img src={"https://xivapi.com"+timer.icon}/> {timer.name} <sub><i style={{color:"gray"}}>{eorzeanSeconds>timer.actual_seconds&&eorzeanSeconds<timer.end_seconds?"Node Available: "+TimeDisplay(timer.end_seconds-eorzeanSeconds):TimeDisplay((eorzeanSeconds>timer.actual_seconds)?timer.actual_seconds+86400-eorzeanSeconds:timer.actual_seconds-eorzeanSeconds)}</i></sub>
|
||||||
|
</Col>
|
||||||
|
<Col>
|
||||||
|
<span style={{float:"right"}}>{timer.timer_start} - {timer.timer_end}</span>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
<Row>
|
||||||
|
<Col sm={1}/>
|
||||||
|
<Col sm={10}>
|
||||||
|
<ProgressBar variant={eorzeanSeconds>timer.actual_seconds&&eorzeanSeconds<timer.end_seconds?"success":""} animated={eorzeanSeconds>timer.actual_seconds&&eorzeanSeconds<timer.end_seconds} striped={eorzeanSeconds>timer.actual_seconds&&eorzeanSeconds<timer.end_seconds} now={eorzeanSeconds>timer.actual_seconds?eorzeanSeconds<timer.end_seconds?100-((eorzeanSeconds-timer.end_seconds)/(timer.seconds-timer.end_seconds))*100:((eorzeanSeconds-timer.actual_seconds)/864):(100-(timer.actual_seconds-eorzeanSeconds)/864)}></ProgressBar>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</>
|
||||||
|
}
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
|
|
||||||
const [data,setData] = useState([])
|
const [data,setData] = useState([])
|
||||||
@ -493,6 +577,10 @@ function App() {
|
|||||||
const [lastModified,setLastModified] = useState(new Date())
|
const [lastModified,setLastModified] = useState(new Date())
|
||||||
const [lastUpdate,setLastUpdate] = useState(0)
|
const [lastUpdate,setLastUpdate] = useState(0)
|
||||||
const [playerInventory,setPlayerInventory] = useState([])
|
const [playerInventory,setPlayerInventory] = useState([])
|
||||||
|
const [eorzeanTime,setEorzeanTime] = useState("")
|
||||||
|
const [timerList,setTimerList] = useState([])
|
||||||
|
const [timerCutList1,setTimerCutList1] = useState([])
|
||||||
|
const [timerCutList2,setTimerCutList2] = useState([])
|
||||||
|
|
||||||
const [contributor,setContributor] = useState("")
|
const [contributor,setContributor] = useState("")
|
||||||
const [notifications,setNotifications] = useState([])
|
const [notifications,setNotifications] = useState([])
|
||||||
@ -503,12 +591,26 @@ function App() {
|
|||||||
|
|
||||||
const [matchedItems,setMatchedItems] = useState([])
|
const [matchedItems,setMatchedItems] = useState([])
|
||||||
|
|
||||||
const [lockout,setLockout] = useState(false)
|
//const [lockout,setLockout] = useState(false)
|
||||||
|
|
||||||
function LZ(digits,numb) {
|
function LZ(digits,numb) {
|
||||||
return "0".repeat(digits-String(numb).length)+numb
|
return "0".repeat(digits-String(numb).length)+numb
|
||||||
}
|
}
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
var eorzeanSeconds=Number(eorzeanTime.split(":")[0])*3600+Number(eorzeanTime.split(":")[1])*60
|
||||||
|
var timerObjs=timerList.map((item)=>{
|
||||||
|
var seconds=Number(item.timer_start.split(":")[0])*3600+Number(item.timer_start.split(":")[1])*60
|
||||||
|
var originalSeconds=seconds
|
||||||
|
var endSeconds=Number(item.timer_end.split(":")[0])*3600+Number(item.timer_end.split(":")[1])*60
|
||||||
|
if (endSeconds<seconds&&eorzeanSeconds>=0&&eorzeanSeconds<seconds){
|
||||||
|
seconds=0
|
||||||
|
}
|
||||||
|
return {seconds:seconds,actual_seconds:originalSeconds,end_seconds:endSeconds,...item}}).sort((a,b)=>a.end_seconds-b.end_seconds)
|
||||||
|
setTimerCutList1(timerObjs.filter((timer)=>timer.end_seconds>=eorzeanSeconds))
|
||||||
|
setTimerCutList2(timerObjs.filter((timer)=>timer.end_seconds<eorzeanSeconds))
|
||||||
|
},[timerList,eorzeanTime])
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
const interval = setInterval(()=>{
|
const interval = setInterval(()=>{
|
||||||
axios.get(BACKEND_URL+"/lastUpdate")
|
axios.get(BACKEND_URL+"/lastUpdate")
|
||||||
@ -519,6 +621,20 @@ function App() {
|
|||||||
return axios.get("https://projectdivar.com:4505/getData")
|
return axios.get("https://projectdivar.com:4505/getData")
|
||||||
.then((data)=>{
|
.then((data)=>{
|
||||||
//setData(data.data)
|
//setData(data.data)
|
||||||
|
var timers=[]
|
||||||
|
var timerItems=data.data.filter((item)=>item.obtained!=item.required&&item.timer_start!=null&&item.timer_start.length>0)
|
||||||
|
for (item of timerItems){
|
||||||
|
var splitter=item.timer_start.split(",")
|
||||||
|
var splitter2=item.timer_end.split(",")
|
||||||
|
var i=0
|
||||||
|
for (var t of splitter){
|
||||||
|
var newItem={...item}
|
||||||
|
newItem.timer_start=t
|
||||||
|
newItem.timer_end=splitter2[i++]
|
||||||
|
timers=[...timers,newItem]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setTimerList(timers)
|
||||||
setData(data.data.slice(dataSplitters[0],dataSplitters[1]))
|
setData(data.data.slice(dataSplitters[0],dataSplitters[1]))
|
||||||
setData2(data.data.slice(dataSplitters[1],dataSplitters[2]))
|
setData2(data.data.slice(dataSplitters[1],dataSplitters[2]))
|
||||||
setData3(data.data.slice(dataSplitters[2],dataSplitters[3]))
|
setData3(data.data.slice(dataSplitters[2],dataSplitters[3]))
|
||||||
@ -577,6 +693,22 @@ function App() {
|
|||||||
return ()=>clearInterval(interval)
|
return ()=>clearInterval(interval)
|
||||||
},[nav,lastUpdate])
|
},[nav,lastUpdate])
|
||||||
|
|
||||||
|
useEffect(()=>{
|
||||||
|
const interval = setInterval(()=>{
|
||||||
|
if (nav==="main"){
|
||||||
|
var date=new Date()
|
||||||
|
var earthH=date.getHours(),earthM=date.getMinutes(),earthS=date.getSeconds()
|
||||||
|
var earthTime=earthH*3600+earthM*60+earthS
|
||||||
|
var eorzeanTime=earthTime*20.571428571428571428571428571429
|
||||||
|
var eorzeanH=Math.floor(eorzeanTime/3600)%24
|
||||||
|
var eorzeanM=Math.floor(eorzeanTime/60)%60
|
||||||
|
var eorzeanS=Math.floor(eorzeanTime)%60
|
||||||
|
setEorzeanTime((("0")+eorzeanH).slice(-2)+":"+(("0")+eorzeanM).slice(-2))
|
||||||
|
}
|
||||||
|
},3000)
|
||||||
|
return ()=>clearInterval(interval)
|
||||||
|
},[nav,lastUpdate])
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
var notificationLastUpdate = new Date(new Date()-(NOTIFICATIONTIMEOUT*1000))
|
var notificationLastUpdate = new Date(new Date()-(NOTIFICATIONTIMEOUT*1000))
|
||||||
var largestNotificationID = -1
|
var largestNotificationID = -1
|
||||||
@ -627,6 +759,20 @@ function App() {
|
|||||||
axios.get("https://projectdivar.com:4505/getData")
|
axios.get("https://projectdivar.com:4505/getData")
|
||||||
.then((data)=>{
|
.then((data)=>{
|
||||||
//setData(data.data)
|
//setData(data.data)
|
||||||
|
var timers=[]
|
||||||
|
var timerItems=data.data.filter((item)=>item.obtained!=item.required&&item.timer_start!=null&&item.timer_start.length>0)
|
||||||
|
for (item of timerItems){
|
||||||
|
var splitter=item.timer_start.split(",")
|
||||||
|
var splitter2=item.timer_end.split(",")
|
||||||
|
var i=0
|
||||||
|
for (var t of splitter){
|
||||||
|
var newItem={...item}
|
||||||
|
newItem.timer_start=t
|
||||||
|
newItem.timer_end=splitter2[i++]
|
||||||
|
timers=[...timers,newItem]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setTimerList(timers)
|
||||||
setData(data.data.slice(dataSplitters[0],dataSplitters[1]))
|
setData(data.data.slice(dataSplitters[0],dataSplitters[1]))
|
||||||
setData2(data.data.slice(dataSplitters[1],dataSplitters[2]))
|
setData2(data.data.slice(dataSplitters[1],dataSplitters[2]))
|
||||||
setData3(data.data.slice(dataSplitters[2],dataSplitters[3]))
|
setData3(data.data.slice(dataSplitters[2],dataSplitters[3]))
|
||||||
@ -773,7 +919,7 @@ function App() {
|
|||||||
return (
|
return (
|
||||||
<Container className="bg-dark" fluid>
|
<Container className="bg-dark" fluid>
|
||||||
<Navbar bg="dark" variant="dark">
|
<Navbar bg="dark" variant="dark">
|
||||||
<Container>
|
<Container fluid>
|
||||||
<Navbar.Brand href="#home">
|
<Navbar.Brand href="#home">
|
||||||
<img src={process.env.PUBLIC_URL+"/favicon.ico"} width="30" height="30" className="d-inline-block align-top" alt="BUN logo"/> BUN Collab App
|
<img src={process.env.PUBLIC_URL+"/favicon.ico"} width="30" height="30" className="d-inline-block align-top" alt="BUN logo"/> BUN Collab App
|
||||||
</Navbar.Brand>
|
</Navbar.Brand>
|
||||||
@ -784,7 +930,10 @@ function App() {
|
|||||||
</>}
|
</>}
|
||||||
</Container>
|
</Container>
|
||||||
</Navbar>
|
</Navbar>
|
||||||
<Container>
|
<Container fluid>
|
||||||
|
<Row>
|
||||||
|
<Col sm={1}></Col>
|
||||||
|
<Col sm={8}>
|
||||||
{contributor.length===0?<>
|
{contributor.length===0?<>
|
||||||
<input placeHolder="e.g. Bun" onKeyDown={(k)=>{if (k.key==='Enter') {setContributor(document.getElementById("username").value)}}} id="username"/>
|
<input placeHolder="e.g. Bun" onKeyDown={(k)=>{if (k.key==='Enter') {setContributor(document.getElementById("username").value)}}} id="username"/>
|
||||||
<button type="Submit" onClick={(f)=>{setContributor(document.getElementById("username").value)}}>Submit</button>
|
<button type="Submit" onClick={(f)=>{setContributor(document.getElementById("username").value)}}>Submit</button>
|
||||||
@ -809,15 +958,15 @@ function App() {
|
|||||||
<Form.Control id="searchBar" className="bg-dark text-white" type="text" placeholder="Search Item" onChange={(f)=>{
|
<Form.Control id="searchBar" className="bg-dark text-white" type="text" placeholder="Search Item" onChange={(f)=>{
|
||||||
updateSearch(f.currentTarget.value)
|
updateSearch(f.currentTarget.value)
|
||||||
}} />
|
}} />
|
||||||
{matchedItems.map((item)=><Item key={item.obj.id} item={item.obj} setLockout={setLockout} lockout={lockout} contributor={contributor} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory}></Item>)}
|
{matchedItems.map((item)=><Item key={item.obj.id} item={item.obj} contributor={contributor} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory}></Item>)}
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
</Form>
|
</Form>
|
||||||
</Row>
|
</Row>
|
||||||
<Accordion className="bg-dark" defaultActiveKey="0">
|
<Accordion className="bg-dark" defaultActiveKey="0">
|
||||||
<ItemGroup name="Gathering Items" contributor={contributor} akey="0" data={data} lastModified={lastModified} setLastModified={setLastModified} setData={setData} setData1={setData} setData2={setData2} setData3={setData3} setData4={setData4} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory} lockout={lockout} setLockout={setLockout}/>
|
<ItemGroup name="Gathering Items" contributor={contributor} akey="0" data={data} lastModified={lastModified} setLastModified={setLastModified} setData={setData} setData1={setData} setData2={setData2} setData3={setData3} setData4={setData4} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory}/>
|
||||||
<ItemGroup name="Other Items" contributor={contributor} akey="1" data={data2} lastModified={lastModified} setLastModified={setLastModified} setData={setData2} setData1={setData} setData2={setData2} setData3={setData3} setData4={setData4} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory} lockout={lockout} setLockout={setLockout}/>
|
<ItemGroup name="Other Items" contributor={contributor} akey="1" data={data2} lastModified={lastModified} setLastModified={setLastModified} setData={setData2} setData1={setData} setData2={setData2} setData3={setData3} setData4={setData4} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory}/>
|
||||||
<ItemGroup name="Pre-crafting" contributor={contributor} akey="2" data={data3} lastModified={lastModified} setLastModified={setLastModified} setData={setData3} setData1={setData} setData2={setData2} setData3={setData3} setData4={setData4} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory} lockout={lockout} setLockout={setLockout}/>
|
<ItemGroup name="Pre-crafting" contributor={contributor} akey="2" data={data3} lastModified={lastModified} setLastModified={setLastModified} setData={setData3} setData1={setData} setData2={setData2} setData3={setData3} setData4={setData4} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory}/>
|
||||||
<ItemGroup name="Crafting Items" contributor={contributor} akey="3" data={data4} lastModified={lastModified} setLastModified={setLastModified} setData={setData4} setData1={setData} setData2={setData2} setData3={setData3} setData4={setData4} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory} lockout={lockout} setLockout={setLockout}/>
|
<ItemGroup name="Crafting Items" contributor={contributor} akey="3" data={data4} lastModified={lastModified} setLastModified={setLastModified} setData={setData4} setData1={setData} setData2={setData2} setData3={setData3} setData4={setData4} itemCount={itemCount} totalItemCount={totalItemCount} playerInventory={playerInventory}/>
|
||||||
</Accordion>
|
</Accordion>
|
||||||
</>:<Importer></Importer>
|
</>:<Importer></Importer>
|
||||||
:nav==="list"?<ListApp transferItems={transferItems}></ListApp>:
|
:nav==="list"?<ListApp transferItems={transferItems}></ListApp>:
|
||||||
@ -830,6 +979,15 @@ function App() {
|
|||||||
})}
|
})}
|
||||||
</ToastContainer>
|
</ToastContainer>
|
||||||
</div>
|
</div>
|
||||||
|
</Col>
|
||||||
|
{contributor.length>0&&
|
||||||
|
<Col sm={3} className="text-white">
|
||||||
|
<span style={{fontSize:24,marginRight:"24px"}}>Timers</span><i>ET: {eorzeanTime}</i>
|
||||||
|
{timerCutList1.map((timer,i)=><TimerDisplay timer={timer} key={i} eorzeanTime={eorzeanTime}/>)}
|
||||||
|
{timerCutList2.map((timer,i)=><TimerDisplay timer={timer} key={i} eorzeanTime={eorzeanTime}/>)}
|
||||||
|
</Col>
|
||||||
|
}
|
||||||
|
</Row>
|
||||||
</Container>
|
</Container>
|
||||||
</Container>
|
</Container>
|
||||||
);
|
);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user