import React, { useEffect,useState,useRef } from 'react';
import ReactTooltip from 'react-tooltip' //https://wwayne.github.io/react-tooltip/
import Modal from 'react-modal'
/**
* Hook that alerts clicks outside of the passed ref
*/
function useOutsideAlerter(ref,setEdit) {
useEffect(() => {
/**
* Alert if clicked on outside of element
*/
function handleClickOutside(event) {
if (ref.current && !ref.current.contains(event.target)) {
setEdit(false)
}
}
// Bind the event listener
document.addEventListener("mousedown", handleClickOutside);
return () => {
// Unbind the event listener on clean up
document.removeEventListener("mousedown", handleClickOutside);
};
}, [ref,setEdit]);
}
function EditBox(p) {
useEffect(()=>{
var timer1 = setTimeout(()=>{
document.getElementById("editBoxInput").focus()
document.getElementById("editBoxInput").select()
},100)
return () => {
clearTimeout(timer1);
};
},[p.edit])
return {
if (e.key==="Enter") {p.setEdit(false)}
else if (e.key==="Escape") {p.setEdit(false)}
}} maxLength={p.maxlength?p.maxlength:20} onBlur={()=>{p.setEdit(false)}} value={p.value} onChange={(f)=>{f.currentTarget.value.length>0?p.setName(f.currentTarget.value):p.setName(p.originalName)}}>
}
function EditBoxInput(p) {
const [edit,setEdit] = useState(false)
useEffect(()=>{
if (p.callback) {
p.callback()
}
},[edit,p])
return <>
{setEdit(true)}}>
{edit?
:<>{p.prefix}{p.data}>}
>
}
function PageControlButton(p) {
return {p.setCurrentPage(p.page)}} className={(p.currentPage===p.page)?"selected":"unselected"}>{p.pageName?p.pageName:p.page}
}
function PageControl(p) {
var pages = []
for (var i=0;i)
}
return pages.length>0&&
{pages.map((page,i)=>{return {page}})}
}
function ExpandTooltip(p) {
return <>{p.children}{p.tooltip}>
}
function Class(p) {
const CLASSES = p.GetData("class")
const class_obj = CLASSES[p.name]
return class_obj?<>
{class_obj.name}>:<>>
}
function ClassSelector(p){
const CLASSES = p.GetData("class")
const wrapperRef = useRef(null);
useOutsideAlerter(wrapperRef,p.setEdit);
return <>
Class Selector
{Object.keys(CLASSES).map((cl,i)=>{
return
})}
>
}
function EditableClass(p){
const [edit,setEdit] = useState(false)
return <>{setEdit(!edit)}}>
{edit&&}
>
}
function PopupWindow(p) {
return {p.setModalOpen(false)}} shouldFocusAfterRender={true} shouldCloseOnOverlayClick={true} shouldCloseOnEsc={true} className="modal" overlayClassName="modalOverlay">
{p.title}
{p.showCloseButton&&
{p.setModalOpen(false)}}>
}
{p.children}
}
function SelectorWindow(p) {
const [itemList,setItemList] = useState([])
const [tabPage,setTabPage] = useState(1)
const [sortSelector,setSortSelector] = useState(p.sortItems?p.sortItems[0]:"")
const [filter,setFilter] = useState("")
useEffect(()=>{
if (p.dataFunction) {
setItemList(p.dataFunction())
}
},[p])
return
{(p.sortItems||p.filter)&&
}
{itemList.filter((item)=>p.filterFunction(tabPage,item)).filter((item)=>p.searchFieldFunction(filter,item)).sort((a,b)=>p.sortOrderFunction(sortSelector,a,b)).map((item)=>p.displayFunction(item))}
{p.children}
}
function TestPanel(p) {
const [bpGraphMax,setbpGraphMax] = useState(1000)
const [hpGraphMax,sethpGraphMax] = useState(1000)
const [ppGraphMax,setppGraphMax] = useState(1000)
const [atkGraphMax,setatkGraphMax] = useState(1000)
const [defGraphMax,setdefGraphMax] = useState(1000)
const [author,setauthor] = useState("Player")
const [buildName,setbuildName] = useState("Character")
const [className,setclassName] = useState("Hunter")
const [subclassName,setsubclassName] = useState("Force")
const [level,setLevel] = useState(20)
const [secondaryLevel,setsecondaryLevel] = useState(20)
const [effectPage,setEffectPage] = useState(1)
const [weaponPage,setWeaponPage] = useState(1)
const [statPage,setStatPage] = useState(1)
const [classSelectWindowOpen,setClassSelectWindowOpen] = useState(false)
const [weaponSelectWindowOpen,setWeaponSelectWindowOpen] = useState(false)
//Helper variables for Weapon selector with structure: [weapon_type,weapon,potential,potential_tooltip,weapon_existence_data]
const WEAPON_WEAPONTYPE=0;const WEAPON_WEAPON=1;const WEAPON_POTENTIAL=2;const WEAPON_POTENTIAL_TOOLTIP=3;const WEAPON_EXISTENCE_DATA=4;
const [selectedWeapon,setSelectedWeapon] = useState([])
useEffect(()=>{
if (p.bp>1000) {
setbpGraphMax(3000)
sethpGraphMax(3000)
setppGraphMax(3000)
setatkGraphMax(3000)
setdefGraphMax(3000)
} else {
setbpGraphMax(1000)
sethpGraphMax(1000)
setppGraphMax(1000)
setatkGraphMax(1000)
setdefGraphMax(1000)
}
},[p.bp])
//console.log(p.GetData("class",p.className,"icon"))
return (<>
Basic Information
Author |
|
Build Name |
|
{setClassSelectWindowOpen(true)}} >Class |
|
|
Sub-Class |
|
|
Equip
{setWeaponSelectWindowOpen(true)}} className="equipPaletteSlot">
Weapons
1![]({process.env.PUBLIC_URL+selectedWeapon[WEAPON_EXISTENCE_DATA]?.icon})
Equipped Weapon
{selectedWeapon[WEAPON_WEAPON]?.name+" "+selectedWeapon[WEAPON_WEAPONTYPE]?.name}+40
{weaponPage===3?
Ability Details
- Dynamo Unit Lv.3
- Fixa Attack Lv.3
- Pettas Soul II
- Alts Secreta II
- Gigas Precision II
- Precision III
![](./icons/aug_plus.png)
Stat Adjustment
- Enhancement Lv. +35
- Multi-Weapon -
- Element -
:
<>hi>
}
Damage Stats
{statPage===1?<>
Critical Hit Rate |
5% |
Critical Multiplier |
120% |
Midrange |
126 |
Critical |
152 |
Effective |
127 |
>:<>
Critical Hit Rate |
- |
Critical Multiplier |
- |
Midrange |
- |
Critical |
- |
Effective |
- |
>
}
ez pz
{
var dat1=p.GetData("weapon_existence_data")
return Array.isArray(dat1)?dat1.map((weapon_existence_data)=>{
var weapon_type=p.GetData("weapon_type",weapon_existence_data.weapon_type_id,undefined,true)
var weapon=p.GetData("weapon",weapon_existence_data.weapon_id,undefined,true)
var potential=p.GetData("potential",weapon.potential_id,undefined,true)
var potential_all=p.GetData("potential_data")
var potential_tooltip=[]
for (var pot in potential_all) {
if (pot.includes(potential.name)) {
potential_tooltip.push(p.GetData("potential_data",pot))
}
}
return [weapon_type,weapon,potential,potential_tooltip,weapon_existence_data]
}):[]
}}
filterFunction={(page,item)=>{
switch (page) {
case 2:return item[WEAPON_WEAPONTYPE].name==="Assault Rifle"
case 3:return item[WEAPON_WEAPONTYPE].name==="Launcher"
case 4:return item[WEAPON_WEAPONTYPE].name==="Rod"
case 5:return item[WEAPON_WEAPONTYPE].name==="Talis"
default:return true
}
}}
searchFieldFunction={(searchText,item)=>searchText.length>0?(item[WEAPON_WEAPON].name.toLowerCase()+" "+item[WEAPON_WEAPONTYPE].name.toLowerCase()).includes(searchText.toLowerCase()):true}
sortOrderFunction={(sort,itemA,itemB)=>{
switch (sort) {
case "Rarity":return itemB[1].rarity-itemA[1].rarity
case "Attack":return itemB[1].atk-itemA[1].atk
default:return 0
}
}}
displayFunction={(item)=>{
return {setSelectedWeapon(item);setWeaponSelectWindowOpen(false)}}>
{item[WEAPON_WEAPON].name} {item[WEAPON_WEAPONTYPE].name}
{item[WEAPON_WEAPON].atk} {item[WEAPON_POTENTIAL_TOOLTIP].map((pot,i)=><>{(i!==0)&&
}{pot.name}: {pot.description?pot.description.split("\\n").map((it)=><>{it}
>):<>>}>)}>}>
{item[WEAPON_POTENTIAL].name}
}}
/>
>
)
}
export default TestPanel;