Android build v1.1.2

This commit is contained in:
Warren H
2026-06-29 22:35:49 -04:00
parent cbe42b6164
commit c6251167a5
52 changed files with 5554 additions and 3117 deletions
+36 -52
View File
@@ -84,6 +84,7 @@ export function EquipmentScreen({
const [upgrading, setUpgrading] = useState(false)
const [showSetBonuses, setShowSetBonuses] = useState(false)
const [equipmentTab, setEquipmentTab] = useState<'equipment' | 'crafting'>(mode ?? 'equipment')
const activeEquipmentTab = mode ?? equipmentTab
const [inventoryPage, setInventoryPage] = useState(0)
const [recipePage, setRecipePage] = useState(0)
const [message, setMessage] = useState('')
@@ -97,10 +98,6 @@ export function EquipmentScreen({
const [selectedRecipeId, setSelectedRecipeId] = useState<number | null>(
firstRecipe?.id ?? null,
)
const selectedRecipe = profile.craftingRecipes.find((recipe) => recipe.id === selectedRecipeId)
const selectedRecipeRequiresUpgrade = selectedRecipe
? !DIRECT_CRAFT_ITEM_LEVELS.has(selectedRecipe.item.itemLevel)
: false
const selectedItemRecipe = selectedItem
? profile.craftingRecipes.find((recipe) => recipe.item.id === selectedItem.id)
: undefined
@@ -132,9 +129,10 @@ export function EquipmentScreen({
1,
Math.ceil(visibleInventory.length / EQUIPMENT_LIST_PAGE_SIZE),
)
const activeInventoryPage = Math.min(inventoryPage, inventoryPageCount - 1)
const inventoryPageItems = visibleInventory.slice(
inventoryPage * EQUIPMENT_LIST_PAGE_SIZE,
(inventoryPage + 1) * EQUIPMENT_LIST_PAGE_SIZE,
activeInventoryPage * EQUIPMENT_LIST_PAGE_SIZE,
(activeInventoryPage + 1) * EQUIPMENT_LIST_PAGE_SIZE,
)
const [slotFilter, setSlotFilter] = useState<EquipmentSlot | 'all'>('all')
@@ -172,42 +170,28 @@ export function EquipmentScreen({
1,
Math.ceil(filteredRecipes.length / CRAFTING_LIST_PAGE_SIZE),
)
const activeRecipePage = Math.min(recipePage, recipePageCount - 1)
const recipePageItems = filteredRecipes.slice(
recipePage * CRAFTING_LIST_PAGE_SIZE,
(recipePage + 1) * CRAFTING_LIST_PAGE_SIZE,
activeRecipePage * CRAFTING_LIST_PAGE_SIZE,
(activeRecipePage + 1) * CRAFTING_LIST_PAGE_SIZE,
)
const activeSelectedRecipeId = filteredRecipes.some((recipe) => recipe.id === selectedRecipeId)
? selectedRecipeId
: filteredRecipes[0]?.id ?? null
const selectedRecipe = profile.craftingRecipes.find((recipe) => recipe.id === activeSelectedRecipeId)
const selectedRecipeRequiresUpgrade = selectedRecipe
? !DIRECT_CRAFT_ITEM_LEVELS.has(selectedRecipe.item.itemLevel)
: false
useEffect(() => {
window.scrollTo(0, scrollRef.current)
}, [profile])
useEffect(() => {
setInventoryPage((current) => Math.min(current, inventoryPageCount - 1))
}, [inventoryPageCount])
useEffect(() => {
setRecipePage((current) => Math.min(current, recipePageCount - 1))
}, [recipePageCount])
useEffect(() => {
if (filteredRecipes.length === 0) {
setSelectedRecipeId(null)
return
}
if (!filteredRecipes.some((recipe) => recipe.id === selectedRecipeId)) {
setSelectedRecipeId(filteredRecipes[0].id)
}
}, [filteredRecipes, selectedRecipeId])
useEffect(() => {
if (equipmentTab === 'crafting') {
if (activeEquipmentTab === 'crafting') {
loadProfile().then((fresh) => onUpdated(fresh)).catch(() => {})
}
}, [equipmentTab])
useEffect(() => {
if (mode) setEquipmentTab(mode)
}, [mode])
}, [activeEquipmentTab, onUpdated])
function saveScroll() {
scrollRef.current = window.scrollY
@@ -330,7 +314,7 @@ export function EquipmentScreen({
}
const workshopState = useMemo<DualScreenWorkshopState>(() => {
if (equipmentTab === 'crafting') {
if (activeEquipmentTab === 'crafting') {
if (!selectedRecipe) {
return {
mode: 'crafting',
@@ -416,7 +400,7 @@ export function EquipmentScreen({
: []),
],
}
}, [comparisonItem, equipmentTab, selectedItem, selectedRecipe, upgradeRecipe])
}, [activeEquipmentTab, comparisonItem, selectedItem, selectedRecipe, upgradeRecipe])
useDualScreenWorkshopPublisher(workshopState, dualScreenEnabled)
@@ -449,14 +433,14 @@ export function EquipmentScreen({
{showModeTabs && (
<nav className="equipment-tabs">
<button
className={`equipment-tab ${equipmentTab === 'equipment' ? 'active' : ''}`}
className={`equipment-tab ${activeEquipmentTab === 'equipment' ? 'active' : ''}`}
onClick={() => setEquipmentTab('equipment')}
type="button"
>
Equipment
</button>
<button
className={`equipment-tab ${equipmentTab === 'crafting' ? 'active' : ''}`}
className={`equipment-tab ${activeEquipmentTab === 'crafting' ? 'active' : ''}`}
onClick={() => setEquipmentTab('crafting')}
type="button"
>
@@ -465,7 +449,7 @@ export function EquipmentScreen({
</nav>
)}
{equipmentTab === 'equipment' ? (
{activeEquipmentTab === 'equipment' ? (
<>
<section className="item-comparison">
{selectedItem ? (
@@ -577,11 +561,11 @@ export function EquipmentScreen({
</div>
{visibleInventory.length > EQUIPMENT_LIST_PAGE_SIZE && (
<ListPager
label={`Page ${inventoryPage + 1} / ${inventoryPageCount}`}
onNext={() => setInventoryPage((current) => Math.min(inventoryPageCount - 1, current + 1))}
onPrevious={() => setInventoryPage((current) => Math.max(0, current - 1))}
nextDisabled={inventoryPage >= inventoryPageCount - 1}
previousDisabled={inventoryPage <= 0}
label={`Page ${activeInventoryPage + 1} / ${inventoryPageCount}`}
onNext={() => setInventoryPage(Math.min(inventoryPageCount - 1, activeInventoryPage + 1))}
onPrevious={() => setInventoryPage(Math.max(0, activeInventoryPage - 1))}
nextDisabled={activeInventoryPage >= inventoryPageCount - 1}
previousDisabled={activeInventoryPage <= 0}
/>
)}
</section>
@@ -666,7 +650,7 @@ export function EquipmentScreen({
<EquipmentHeading
eyebrow="Available Gear"
title={slotFilter === 'all' ? 'Craftable Gear' : SLOT_LABELS[slotFilter]}
detail={`Page ${recipePage + 1}/${recipePageCount}`}
detail={`Page ${activeRecipePage + 1}/${recipePageCount}`}
/>
{filteredRecipes.length === 0 ? (
<p className="inventory-empty">No recipes match filters.</p>
@@ -674,7 +658,7 @@ export function EquipmentScreen({
<div className="crafting-list">
{recipePageItems.map((recipe) => (
<button
className={`${selectedRecipeId === recipe.id ? 'selected' : ''} rarity-${recipe.item.rarity}`}
className={`${activeSelectedRecipeId === recipe.id ? 'selected' : ''} rarity-${recipe.item.rarity}`}
key={recipe.id}
onClick={() => setSelectedRecipeId(recipe.id)}
type="button"
@@ -696,11 +680,11 @@ export function EquipmentScreen({
)}
{filteredRecipes.length > CRAFTING_LIST_PAGE_SIZE && (
<ListPager
label={`Page ${recipePage + 1} / ${recipePageCount}`}
onNext={() => setRecipePage((current) => Math.min(recipePageCount - 1, current + 1))}
onPrevious={() => setRecipePage((current) => Math.max(0, current - 1))}
nextDisabled={recipePage >= recipePageCount - 1}
previousDisabled={recipePage <= 0}
label={`Page ${activeRecipePage + 1} / ${recipePageCount}`}
onNext={() => setRecipePage(Math.min(recipePageCount - 1, activeRecipePage + 1))}
onPrevious={() => setRecipePage(Math.max(0, activeRecipePage - 1))}
nextDisabled={activeRecipePage >= recipePageCount - 1}
previousDisabled={activeRecipePage <= 0}
/>
)}
<div className="crafting-action-row">
@@ -748,7 +732,7 @@ export function EquipmentScreen({
</section>
)}
{equipmentTab === 'equipment' && profile.setBonuses.length > 0 && (
{activeEquipmentTab === 'equipment' && profile.setBonuses.length > 0 && (
<section className="set-bonus-panel">
<div className="equipment-heading toggle-heading">
<div>
@@ -784,11 +768,11 @@ export function EquipmentScreen({
)
if (embedded) {
return <div className={`equipment-screen embedded-screen ${equipmentTab === 'crafting' ? 'crafting-active' : ''}`}>{content}</div>
return <div className={`equipment-screen embedded-screen ${activeEquipmentTab === 'crafting' ? 'crafting-active' : ''}`}>{content}</div>
}
return (
<section className={`content-screen equipment-screen ${equipmentTab === 'crafting' ? 'crafting-active' : ''}`}>
<section className={`content-screen equipment-screen ${activeEquipmentTab === 'crafting' ? 'crafting-active' : ''}`}>
{content}
</section>
)