Optimisation to tile rendering

This commit is contained in:
Mitchell McCaffrey 2021-06-10 20:08:11 +10:00
parent fa8d081079
commit 4bfe49f454
6 changed files with 33 additions and 16 deletions

View File

@ -9,7 +9,7 @@ import { getGroupItems } from "../../helpers/group";
import { useGroup } from "../../contexts/GroupContext"; import { useGroup } from "../../contexts/GroupContext";
function MapTiles({ maps, onMapEdit, onMapSelect, subgroup }) { function MapTiles({ mapsById, onMapEdit, onMapSelect, subgroup }) {
const { const {
selectedGroupIds, selectedGroupIds,
selectMode, selectMode,
@ -19,7 +19,7 @@ function MapTiles({ maps, onMapEdit, onMapSelect, subgroup }) {
function renderTile(group) { function renderTile(group) {
if (group.type === "item") { if (group.type === "item") {
const map = maps.find((map) => map.id === group.id); const map = mapsById[group.id];
const isSelected = selectedGroupIds.includes(group.id); const isSelected = selectedGroupIds.includes(group.id);
const canEdit = const canEdit =
isSelected && selectMode === "single" && selectedGroupIds.length === 1; isSelected && selectMode === "single" && selectedGroupIds.length === 1;
@ -44,7 +44,7 @@ function MapTiles({ maps, onMapEdit, onMapSelect, subgroup }) {
<MapTileGroup <MapTileGroup
key={group.id} key={group.id}
group={group} group={group}
maps={items.map((item) => maps.find((map) => map.id === item.id))} maps={items.map((item) => mapsById[item.id])}
isSelected={isSelected} isSelected={isSelected}
onSelect={onGroupSelect} onSelect={onGroupSelect}
onDoubleClick={() => canOpen && onGroupOpen(group.id)} onDoubleClick={() => canOpen && onGroupOpen(group.id)}

View File

@ -10,7 +10,7 @@ import { getGroupItems } from "../../helpers/group";
import { useGroup } from "../../contexts/GroupContext"; import { useGroup } from "../../contexts/GroupContext";
function TokenTiles({ tokens, onTokenEdit, subgroup }) { function TokenTiles({ tokensById, onTokenEdit, subgroup }) {
const { const {
selectedGroupIds, selectedGroupIds,
selectMode, selectMode,
@ -20,7 +20,7 @@ function TokenTiles({ tokens, onTokenEdit, subgroup }) {
function renderTile(group) { function renderTile(group) {
if (group.type === "item") { if (group.type === "item") {
const token = tokens.find((token) => token.id === group.id); const token = tokensById[group.id];
const isSelected = selectedGroupIds.includes(group.id); const isSelected = selectedGroupIds.includes(group.id);
const canEdit = const canEdit =
isSelected && selectMode === "single" && selectedGroupIds.length === 1; isSelected && selectMode === "single" && selectedGroupIds.length === 1;
@ -48,9 +48,7 @@ function TokenTiles({ tokens, onTokenEdit, subgroup }) {
<TokenTileGroup <TokenTileGroup
key={group.id} key={group.id}
group={group} group={group}
tokens={items.map((item) => tokens={items.map((item) => tokensById[item.id])}
tokens.find((token) => token.id === item.id)
)}
isSelected={isSelected} isSelected={isSelected}
onSelect={onGroupSelect} onSelect={onGroupSelect}
onDoubleClick={() => canOpen && onGroupOpen(group.id)} onDoubleClick={() => canOpen && onGroupOpen(group.id)}

View File

@ -221,6 +221,16 @@ export function MapDataProvider({ children }) {
}; };
}, [database, databaseStatus]); }, [database, databaseStatus]);
const [mapsById, setMapsById] = useState({});
useEffect(() => {
setMapsById(
maps.reduce((obj, map) => {
obj[map.id] = map;
return obj;
}, {})
);
}, [maps]);
const value = { const value = {
maps, maps,
mapStates, mapStates,
@ -234,6 +244,7 @@ export function MapDataProvider({ children }) {
mapsLoading, mapsLoading,
getMapState, getMapState,
updateMapGroups, updateMapGroups,
mapsById,
}; };
return ( return (
<MapDataContext.Provider value={value}>{children}</MapDataContext.Provider> <MapDataContext.Provider value={value}>{children}</MapDataContext.Provider>

View File

@ -169,10 +169,15 @@ export function TokenDataProvider({ children }) {
}; };
}, [database, databaseStatus]); }, [database, databaseStatus]);
const tokensById = tokens.reduce((obj, token) => { const [tokensById, setTokensById] = useState({});
obj[token.id] = token; useEffect(() => {
return obj; setTokensById(
}, {}); tokens.reduce((obj, token) => {
obj[token.id] = token;
return obj;
}, {})
);
}, [tokens]);
const value = { const value = {
tokens, tokens,

View File

@ -52,6 +52,7 @@ function SelectMapModal({
updateMapGroups, updateMapGroups,
updateMap, updateMap,
updateMapState, updateMapState,
mapsById,
} = useMapData(); } = useMapData();
const { addAssets } = useAssets(); const { addAssets } = useAssets();
@ -214,6 +215,7 @@ function SelectMapModal({
handleWidth handleWidth
handleHeight handleHeight
onResize={handleModalResize} onResize={handleModalResize}
refreshMode="debounce"
> >
<GroupProvider <GroupProvider
groups={mapGroups} groups={mapGroups}
@ -240,7 +242,7 @@ function SelectMapModal({
> >
<TilesContainer> <TilesContainer>
<MapTiles <MapTiles
maps={maps} mapsById={mapsById}
onMapEdit={setEditingMapId} onMapEdit={setEditingMapId}
onMapSelect={handleMapSelect} onMapSelect={handleMapSelect}
/> />
@ -254,7 +256,7 @@ function SelectMapModal({
> >
<TilesOverlay modalSize={modalSize}> <TilesOverlay modalSize={modalSize}>
<MapTiles <MapTiles
maps={maps} mapsById={mapsById}
onMapEdit={setEditingMapId} onMapEdit={setEditingMapId}
onMapSelect={handleMapSelect} onMapSelect={handleMapSelect}
subgroup subgroup

View File

@ -215,6 +215,7 @@ function SelectTokensModal({ isOpen, onRequestClose, onMapTokensStateCreate }) {
handleWidth handleWidth
handleHeight handleHeight
onResize={handleModalResize} onResize={handleModalResize}
refreshMode="debounce"
> >
<GroupProvider <GroupProvider
groups={tokenGroups} groups={tokenGroups}
@ -243,7 +244,7 @@ function SelectTokensModal({ isOpen, onRequestClose, onMapTokensStateCreate }) {
> >
<TilesContainer> <TilesContainer>
<TokenTiles <TokenTiles
tokens={tokens} tokensById={tokensById}
onTokenEdit={setEditingTokenId} onTokenEdit={setEditingTokenId}
/> />
</TilesContainer> </TilesContainer>
@ -256,7 +257,7 @@ function SelectTokensModal({ isOpen, onRequestClose, onMapTokensStateCreate }) {
> >
<TilesOverlay modalSize={modalSize}> <TilesOverlay modalSize={modalSize}>
<TokenTiles <TokenTiles
tokens={tokens} tokensById={tokensById}
onTokenEdit={setEditingTokenId} onTokenEdit={setEditingTokenId}
subgroup subgroup
/> />