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 1be7e2f5..e7917375 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 @@ -7,6 +7,7 @@ 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" +import { MapsToolbar } from "./maps-toolbar.component" type Props = { version: BSVersion, @@ -20,6 +21,7 @@ export function LocalMapsListPanel({version, className} : Props) { const ref = useRef() const isVisible = useInView(ref, {once: true}); const [maps, setMaps] = useState([] as BsmLocalMap[]); + const [selectedMaps, setSelectedMaps] = useState([] as string[]); useEffect(() => { @@ -59,6 +61,18 @@ export function LocalMapsListPanel({version, className} : Props) { return res; } + const onMapSelected = (hash: string) => { + const hashs = [...selectedMaps]; + if(hashs.some(selectedHash => selectedHash === hash)){ + const i = hashs.findIndex(selectedHash => selectedHash === hash); + hashs.splice(i, 1); + } + else{ + hashs.push(hash); + } + setSelectedMaps(() => hashs); + } + const renderMapItem = (map: BsmLocalMap) => { return hash === map.hash)} 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={() => {}} + onSelected={onMapSelected} />; } return ( - +
+ {/* */} +
    + {maps.map(map => renderMapItem(map))} +
+
) } diff --git a/src/renderer/components/maps-mangement-components/map-item.component.tsx b/src/renderer/components/maps-mangement-components/map-item.component.tsx index 1e359c56..2d40d95b 100644 --- a/src/renderer/components/maps-mangement-components/map-item.component.tsx +++ b/src/renderer/components/maps-mangement-components/map-item.component.tsx @@ -32,11 +32,13 @@ export type MapItemProps = { duration: number, likes: number, createdAt: string, + selected?: boolean, onDelete?: (hash: string) => void, onDownload?: (id: string) => void, + onSelected: (hash: string) => void, } -export function MapItem({hash, title, autor, songAutor, coverUrl, songUrl, autorId, mapId, diffs, qualified, ranked, bpm, duration, likes, createdAt, onDelete, onDownload}: MapItemProps) { +export function MapItem({hash, title, autor, songAutor, coverUrl, songUrl, autorId, mapId, diffs, qualified, ranked, bpm, duration, likes, createdAt, selected, onDelete, onDownload, onSelected}: MapItemProps) { const linkOpener = LinkOpenerService.getInstance(); const audioPlayer = AudioPlayerService.getInstance(); @@ -123,7 +125,8 @@ export function MapItem({hash, title, autor, songAutor, coverUrl, songUrl, autor } return ( - setHovered(true)} onHoverEnd={() => setHovered(false)} style={{zIndex: hovered && 5}}> + setHovered(true)} onHoverEnd={() => setHovered(false)} style={{zIndex: hovered && 5, transform: "translateZ(0) scale(1.0, 1.0)", backfaceVisibility: "hidden"}} onClick={e => {e.stopPropagation(); onSelected(hash)}}> + {(hovered || selected) && } {(diffsPanelHovered || bottomBarHovered) && ( @@ -194,11 +197,11 @@ export function MapItem({hash, title, autor, songAutor, coverUrl, songUrl, autor -
+
-
+
{onDelete && {e.stopPropagation(); openPreview()}}/>} {e.stopPropagation(); openPreview()}}/> {mapId && {e.stopPropagation(); copyBsr()}}/>}