From f0cf76a5fe41c3097a09a35dbc4be8b005b65bd9 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Mon, 14 Nov 2022 00:18:46 +0100 Subject: [PATCH] VisibilitySensor was causing unwanted destroy --- .../local-maps-list-panel.component.tsx | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx b/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx index af5673f5..1be7e2f5 100644 --- a/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx +++ b/src/renderer/components/maps-mangement-components/local-maps-list-panel.component.tsx @@ -1,11 +1,12 @@ import { MapsManagerService } from "renderer/services/maps-manager.service" import { BSVersion } from "shared/bs-version.interface" import VisibilitySensor from "react-visibility-sensor" -import { useEffect, useState } from "react" +import { useEffect, useRef, useState } from "react" import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface" import { Subscription } from "rxjs" import { MapItem, MapItemProps, ParsedMapDiff } from "./map-item.component" import { BsvMapCharacteristic, BsvMapDifficultyType } from "shared/models/maps/beat-saver.model" +import { useInView } from "framer-motion" type Props = { version: BSVersion, @@ -16,29 +17,45 @@ export function LocalMapsListPanel({version, className} : Props) { const mapsManager = MapsManagerService.getInstance(); - const [isVisible, setIsVisible] = useState(false); + const ref = useRef() + const isVisible = useInView(ref, {once: true}); const [maps, setMaps] = useState([] as BsmLocalMap[]); useEffect(() => { const subs: Subscription[] = []; - if(isVisible && !maps?.length){ + if(isVisible){ subs.push(mapsManager.getMaps(version).subscribe(localMaps => setMaps(() => [...localMaps]))); } - return () => { subs.forEach(s => s.unsubscribe()); } - }, [isVisible]) + return () => { + setMaps(() => []); + console.log("DESTORYED"); + subs.forEach(s => s.unsubscribe()); + } + }, [isVisible, version]) const extractMapDiffs = (map: BsmLocalMap): Map => { const res = new Map(); + if(map.bsaverInfo?.versions[0]?.diffs){ + map.bsaverInfo.versions[0].diffs.forEach(diff => { + const arr = res.get(diff.characteristic) || []; + const diffName = map.rawInfo._difficultyBeatmapSets.find(set => set._beatmapCharacteristicName === diff.characteristic)._difficultyBeatmaps.find(rawDiff => rawDiff._difficulty === diff.difficulty)?._customData?._difficultyLabel || diff.difficulty + arr.push({name: diffName, type: diff.difficulty, stars: diff.stars}); + res.set(diff.characteristic, arr); + }); + return res; + } + map.rawInfo._difficultyBeatmapSets.forEach(set => { set._difficultyBeatmaps.forEach(diff => { const arr = res.get(set._beatmapCharacteristicName) || []; arr.push({name: diff._customData?._difficultyLabel || diff._difficulty, type: diff._difficulty, stars: null}); res.set(set._beatmapCharacteristicName, arr); - }) - }) + }); + }); + return res; } @@ -54,16 +71,14 @@ export function LocalMapsListPanel({version, className} : Props) { songAutor={map.rawInfo._songAuthorName} bpm={map.rawInfo._beatsPerMinute} duration={map.bsaverInfo?.metadata?.duration} - diffs={extractMapDiffs(map)} mapId={map.bsaverInfo?.id} qualified={null} ranked={null} autorId={map.bsaverInfo?.uploader?.id} likes={map.bsaverInfo?.stats?.upvotes} createdAt={map.bsaverInfo?.createdAt} + diffs={extractMapDiffs(map)} mapId={map.bsaverInfo?.id} qualified={null} ranked={map.bsaverInfo?.ranked} autorId={map.bsaverInfo?.uploader?.id} likes={map.bsaverInfo?.stats?.upvotes} createdAt={map.bsaverInfo?.createdAt} onDelete={() => {}} />; } return ( - -
    - {maps.map(map => renderMapItem(map))} -
-
+ ) }