impress-2020/src/useOutfitState.js

91 lines
2.5 KiB
JavaScript
Raw Normal View History

2020-04-21 20:46:53 -07:00
import React from "react";
2020-04-22 14:55:12 -07:00
import useItemData from "./useItemData";
2020-04-21 20:46:53 -07:00
function useOutfitState() {
2020-04-22 03:03:45 -07:00
const [wornItemIds, setWornItemIds] = React.useState([
2020-04-22 14:55:12 -07:00
"38913",
"38911",
"38912",
"37375",
"48313",
"37229",
"43014",
"43397",
2020-04-22 03:03:45 -07:00
]);
2020-04-22 14:55:12 -07:00
const [closetedItemIds, setClosetedItemIds] = React.useState(["74166"]);
const allItemIds = [...wornItemIds, ...closetedItemIds];
const { loading, error, itemsById } = useItemData(allItemIds);
2020-04-21 20:46:53 -07:00
const wearItem = React.useCallback(
(itemIdToAdd) => {
if (wornItemIds.includes(itemIdToAdd)) {
return;
}
let newWornItemIds = wornItemIds;
let newClosetedItemIds = closetedItemIds;
2020-04-22 14:55:12 -07:00
const itemToAdd = itemsById[itemIdToAdd];
2020-04-21 20:46:53 -07:00
// Move the item out of the closet.
newClosetedItemIds = newClosetedItemIds.filter(
(id) => id !== itemIdToAdd
);
// Move conflicting items to the closet.
const conflictingItemIds = newWornItemIds.filter((wornItemId) => {
2020-04-22 14:55:12 -07:00
const wornItem = itemsById[wornItemId];
2020-04-21 20:46:53 -07:00
return wornItem.zoneName === itemToAdd.zoneName;
});
newWornItemIds = newWornItemIds.filter(
(id) => !conflictingItemIds.includes(id)
);
newClosetedItemIds = [...newClosetedItemIds, ...conflictingItemIds];
// Add this item to the worn set.
newWornItemIds = [...newWornItemIds, itemIdToAdd];
setWornItemIds(newWornItemIds);
setClosetedItemIds(newClosetedItemIds);
},
2020-04-22 14:55:12 -07:00
[wornItemIds, closetedItemIds, itemsById]
2020-04-21 20:46:53 -07:00
);
2020-04-22 14:55:12 -07:00
const zonesAndItems = getZonesAndItems(
itemsById,
wornItemIds,
closetedItemIds
2020-04-21 20:46:53 -07:00
);
2020-04-22 14:55:12 -07:00
const data = { zonesAndItems, wornItemIds };
return { loading, error, data, wearItem };
}
function getZonesAndItems(itemsById, wornItemIds, closetedItemIds) {
const wornItems = wornItemIds.map((id) => itemsById[id]).filter((i) => i);
const closetedItems = closetedItemIds
.map((id) => itemsById[id])
.filter((i) => i);
2020-04-21 20:46:53 -07:00
const allItems = [...wornItems, ...closetedItems];
const allZoneNames = [...new Set(allItems.map((item) => item.zoneName))];
allZoneNames.sort();
const zonesAndItems = allZoneNames.map((zoneName) => {
const items = allItems.filter((item) => item.zoneName === zoneName);
items.sort((a, b) => a.name.localeCompare(b.name));
const wornItemId =
items.map((item) => item.id).find((id) => wornItemIds.includes(id)) ||
null;
return { zoneName, items, wornItemId };
});
2020-04-22 14:55:12 -07:00
return zonesAndItems;
2020-04-21 20:46:53 -07:00
}
export default useOutfitState;