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;
|