diff --git a/.erb/configs/webpack.config.renderer.dev.ts b/.erb/configs/webpack.config.renderer.dev.ts index 229cf712..5847ccb4 100644 --- a/.erb/configs/webpack.config.renderer.dev.ts +++ b/.erb/configs/webpack.config.renderer.dev.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-import-module-exports */ import "webpack-dev-server"; import path from "path"; import fs from "fs"; diff --git a/.eslintrc.js b/.eslintrc.js index 9a7f4aa7..09892909 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -57,16 +57,18 @@ module.exports = { 'react/jsx-filename-extension': [2, { 'extensions': ['.js', '.jsx', '.ts', '.tsx'] }], "no-shadow": "off", "react/function-component-definition": "off", + "jsx-a11y/control-has-associated-label": "off", + "react/button-has-type": "off", }, parserOptions: { ecmaVersion: 2020, sourceType: "module", - project: "./tsconfig.json", tsconfigRootDir: __dirname, createDefaultProgram: true, }, globals: { JSX: true, + NodeJS: true }, settings: { "import/resolver": { diff --git a/src/main/services/additional-content/local-playlists-manager.service.ts b/src/main/services/additional-content/local-playlists-manager.service.ts index 56e8a39b..10265717 100644 --- a/src/main/services/additional-content/local-playlists-manager.service.ts +++ b/src/main/services/additional-content/local-playlists-manager.service.ts @@ -190,15 +190,13 @@ export class LocalPlaylistsManagerService { } const songsDetails = localBPList.songs?.map(s => { - if(!s){ - return undefined; - } if(s.hash){ return this.songDetails.getSongDetails(s.hash); } if(s.key){ return this.songDetails.getSongDetailsById(s.key); } + return undefined; }).filter(Boolean); if(songsDetails && songsDetails.length){ @@ -235,7 +233,7 @@ export class LocalPlaylistsManagerService { }); } - public downloadPlaylistSongs(localBPList: LocalBPList, ignoreSongsHashs: string[] = [], version: BSVersion): Observable> { + public downloadPlaylistSongs(localBPList: LocalBPList, ignoreSongsHashs: string[], version: BSVersion): Observable> { let destroyed = false; diff --git a/src/main/services/additional-content/maps/local-maps-manager.service.ts b/src/main/services/additional-content/maps/local-maps-manager.service.ts index 757ee6a5..5264a4fe 100644 --- a/src/main/services/additional-content/maps/local-maps-manager.service.ts +++ b/src/main/services/additional-content/maps/local-maps-manager.service.ts @@ -243,7 +243,7 @@ export class LocalMapsManagerService { (async () => { for (const map of maps) { - let mapPath = map.path; + const mapPath = map.path; if (pathExistsSync(mapPath)) { await deleteFolder(mapPath); diff --git a/src/main/services/additional-content/maps/song-details-cache.service.ts b/src/main/services/additional-content/maps/song-details-cache.service.ts index e3c9ad7a..b374fd42 100644 --- a/src/main/services/additional-content/maps/song-details-cache.service.ts +++ b/src/main/services/additional-content/maps/song-details-cache.service.ts @@ -72,6 +72,7 @@ export class SongDetailsCacheService { private createIdIndex(songDetailsCache: Record): Record { const res: Record = {}; + // eslint-disable-next-line guard-for-in for(const hash in songDetailsCache){ res[songDetailsCache[hash].id] = songDetailsCache[hash]; } diff --git a/src/main/services/bs-launcher/steam-launcher.service.ts b/src/main/services/bs-launcher/steam-launcher.service.ts index c1f38cd8..0071f71c 100644 --- a/src/main/services/bs-launcher/steam-launcher.service.ts +++ b/src/main/services/bs-launcher/steam-launcher.service.ts @@ -8,7 +8,6 @@ import { BS_APP_ID, BS_EXECUTABLE, STEAMVR_APP_ID } from "../../constants"; import log from "electron-log"; import { AbstractLauncherService } from "./abstract-launcher.service"; import { CustomError } from "../../../shared/models/exceptions/custom-error.class"; -import isElevated from "is-elevated"; import { UtilsService } from "../utils.service"; import { exec } from "child_process"; import fs from 'fs'; @@ -47,13 +46,6 @@ export class SteamLauncherService extends AbstractLauncherService implements Sto }); } - private needStartBsAsAdmin(): Promise { - return isElevated().then(elevated => { - if(elevated){ return false; } - return this.steam.isElevated(); - }) - } - private getStartBsAsAdminExePath(): string { return path.join(this.util.getAssetsScriptsPath(), "start_beat_saber_admin.exe"); } @@ -115,7 +107,7 @@ export class SteamLauncherService extends AbstractLauncherService implements Sto // Linux setup if (process.platform === "linux") { - if (launchOptions.admin == true) { + if (launchOptions.admin) { log.warn("Launching as admin is not supported on Linux! Starting the game as a normal user."); launchOptions.admin = false; } diff --git a/src/main/services/installation-location.service.ts b/src/main/services/installation-location.service.ts index ee0b52e6..d8afcef3 100644 --- a/src/main/services/installation-location.service.ts +++ b/src/main/services/installation-location.service.ts @@ -1,7 +1,7 @@ import path from "path"; import { app } from "electron"; import ElectronStore from "electron-store"; -import { copyDirectoryWithJunctions, deleteFolder, ensureFolderExist, pathExist } from "../helpers/fs.helpers"; +import { copyDirectoryWithJunctions, deleteFolder, ensureFolderExist } from "../helpers/fs.helpers"; import { tryit } from "../../shared/helpers/error.helpers"; import { pathExistsSync } from "fs-extra"; diff --git a/src/main/services/liv/liv.service.ts b/src/main/services/liv/liv.service.ts index da066342..140b5246 100644 --- a/src/main/services/liv/liv.service.ts +++ b/src/main/services/liv/liv.service.ts @@ -1,6 +1,5 @@ import { execOnOs } from "../../helpers/env.helpers"; import path from "path"; -import { Log } from "../../decorators/log.decorator"; const { list, createKey, putValue, deleteKey, RegSzValue } = (execOnOs({ win32: () => require("regedit-rs") }, true) ?? {}) as typeof import("regedit-rs"); diff --git a/src/main/services/mods/beat-mods-api.service.ts b/src/main/services/mods/beat-mods-api.service.ts index 0bfeedee..90313751 100644 --- a/src/main/services/mods/beat-mods-api.service.ts +++ b/src/main/services/mods/beat-mods-api.service.ts @@ -7,7 +7,6 @@ export class BeatModsApiService { private readonly requestService: RequestService; - private readonly BEAT_MODS_VERSIONS = "https://versions.beatmods.com/versions.json"; private readonly BEAT_MODS_ALIAS = "https://alias.beatmods.com/aliases.json"; private readonly BEAT_MODS_API_URL = "https://beatmods.com/api/v1/"; @@ -57,7 +56,7 @@ export class BeatModsApiService { if (Array.from(aliases.keys()).some(k => k === version.BSVersion)) { return version; } - const alias = Array.from(aliases.entries()).find(([key, value]) => value.find(v => v.BSVersion === version.BSVersion))?.[0]; + const alias = Array.from(aliases.entries()).find(([, value]) => value.find(v => v.BSVersion === version.BSVersion))?.[0]; return { BSVersion: alias } as BSVersion; }); } diff --git a/src/main/services/thrid-party/beat-saver/beat-saver-api.service.ts b/src/main/services/thrid-party/beat-saver/beat-saver-api.service.ts index 0e8bc1a9..8cd4e1e8 100644 --- a/src/main/services/thrid-party/beat-saver/beat-saver-api.service.ts +++ b/src/main/services/thrid-party/beat-saver/beat-saver-api.service.ts @@ -1,6 +1,7 @@ import { BsvMapDetail } from "shared/models/maps"; -import { BsvPlaylist, BsvPlaylistPage, MapFilter, PlaylistSearchParams, PlaylistSearchResponse, SearchParams, SearchResponse } from "shared/models/maps/beat-saver.model"; +import { BsvPlaylistPage, MapFilter, PlaylistSearchParams, PlaylistSearchResponse, SearchParams, SearchResponse } from "shared/models/maps/beat-saver.model"; import { RequestService } from "../../request.service"; +import { CustomError } from "shared/models/exceptions/custom-error.class"; export class BeatSaverApiService { private static instance: BeatSaverApiService; @@ -22,7 +23,7 @@ export class BeatSaverApiService { private objectToStringRecord(obj: Record): Record { return Object.fromEntries(Object.entries(obj) - .filter(([_, value]) => value !== undefined && value !== null) + .filter(([, value]) => value !== undefined && value !== null) .map(([key, value]) => [key, String(value)] as [string, string])); } @@ -62,7 +63,7 @@ export class BeatSaverApiService { public async getMapsDetailsByHashs(hashs: T[]): Promise, BsvMapDetail>> { if (hashs.length > 50) { - throw "too musch map hashs"; + throw new CustomError("too musch map hashs", "TOO_MUCH_MAP_HASHS"); } const paramsHashs = hashs.join(","); diff --git a/src/renderer/components/maps-playlists-panel/maps-playlists-panel.component.tsx b/src/renderer/components/maps-playlists-panel/maps-playlists-panel.component.tsx index 3dbe0aed..973829eb 100644 --- a/src/renderer/components/maps-playlists-panel/maps-playlists-panel.component.tsx +++ b/src/renderer/components/maps-playlists-panel/maps-playlists-panel.component.tsx @@ -1,4 +1,4 @@ -import { Dispatch, SetStateAction, createContext, useMemo, useRef, useState } from "react"; +import { createContext, useRef, useState } from "react"; import { BSVersion } from "shared/bs-version.interface"; import { LocalMapsListPanel } from "./maps/local-maps-list-panel.component"; import { BsmDropdownButton, DropDownItem } from "../shared/bsm-dropdown-button.component"; @@ -22,6 +22,7 @@ import { useConstant } from "renderer/hooks/use-constant.hook"; import { LocalBPListsDetails } from "shared/models/playlists/local-playlist.models"; import { PlaylistDownloaderService } from "renderer/services/playlist-downloader.service"; import { LocalPlaylistFilter, LocalPlaylistFilterPanel } from "./playlists/local-playlist-filter-panel.component"; +import { noop } from "shared/helpers/function.helpers"; type Props = { version?: BSVersion; @@ -76,6 +77,7 @@ export function MapsPlaylistsPanel({ version, isActive }: Props) { switch (tabIndex) { case 0: return mapsDownloader.openDownloadMapModal(version, maps$.value); case 1: return playlistsDownloader.openDownloadPlaylistModal(version, playlists$, maps$); + default: return noop(); } } diff --git a/src/renderer/components/maps-playlists-panel/maps/filter-panel.component.tsx b/src/renderer/components/maps-playlists-panel/maps/filter-panel.component.tsx index 2a8690de..7d3e1cfa 100644 --- a/src/renderer/components/maps-playlists-panel/maps/filter-panel.component.tsx +++ b/src/renderer/components/maps-playlists-panel/maps/filter-panel.component.tsx @@ -219,7 +219,7 @@ export function FilterPanel({ className, ref, playlist = false, filter, localDat )} ) : ( - <> + undefined ); } @@ -330,24 +330,22 @@ export const isLocalMapFitMapFilter = ({filter, map, search}: { filter: MapFilte export const isBsvMapFitMapFilter = ({filter, map, search}: { filter: MapFilter, map: BsvMapDetail, search: string }): boolean => { - console.log("LAAAAAA", map); - - if (!isFitEnabledTags(filter, map.tags)) { console.log(1); return false; } + if (!isFitEnabledTags(filter, map.tags)) { return false; } if (!isFitExcludedTags(filter, map.tags)) { return false; } - if (map.versions?.at(0)?.diffs && !map.versions.at(0).diffs.some(diff => isFitMinNps(filter, diff.nps))) { console.log(2); return false; } - if (map.versions?.at(0)?.diffs && !map.versions.at(0).diffs.some(diff => isFitMaxNps(filter, diff.nps))) { console.log(3); return false; } - if (!isFitMinDuration(filter, map.metadata.duration)) { console.log(4); return false; } - if (!isFitMaxDuration(filter, map.metadata.duration)) { console.log(5); return false; } - if (!isFitNoodle(filter, map.versions?.at(0)?.diffs.some(diff => !!diff.ne))) { console.log(6); return false; } - if (!isFitMe(filter, map.versions?.at(0)?.diffs.some(diff => !!diff.me))) { console.log(7); return false; } - if (!isFitCinema(filter, map.versions?.at(0)?.diffs.some(diff => !!diff.cinema))) { console.log(8); return false; } - if (!isFitChroma(filter, map.versions?.at(0)?.diffs.some(diff => !!diff.chroma))) { console.log(9); return false; } - if (!isFitFullSpread(filter, map.versions?.at(0)?.diffs.length)) { console.log(10); return false; } - if (!isFitAutomapper(filter, map.automapper)){ console.log(11); return false; } - if (!isFitRanked(filter, map.ranked || map.blRanked)) { console.log(12); return false; } - if (!isFitCurated(filter, !!map.curator)) { console.log(13); return false; } - if (!isFitVerified(filter, !!map.curatedAt)) { console.log(14); return false; } - if (!isFitSearch(search, {songName: map.name, songAuthorName: map.metadata.songAuthorName, levelAuthorName: map.metadata.levelAuthorName})) { console.log(15); return false; } + if (map.versions?.at(0)?.diffs && !map.versions.at(0).diffs.some(diff => isFitMinNps(filter, diff.nps))) { return false; } + if (map.versions?.at(0)?.diffs && !map.versions.at(0).diffs.some(diff => isFitMaxNps(filter, diff.nps))) { return false; } + if (!isFitMinDuration(filter, map.metadata.duration)) { return false; } + if (!isFitMaxDuration(filter, map.metadata.duration)) { return false; } + if (!isFitNoodle(filter, map.versions?.at(0)?.diffs.some(diff => !!diff.ne))) { return false; } + if (!isFitMe(filter, map.versions?.at(0)?.diffs.some(diff => !!diff.me))) { return false; } + if (!isFitCinema(filter, map.versions?.at(0)?.diffs.some(diff => !!diff.cinema))) { return false; } + if (!isFitChroma(filter, map.versions?.at(0)?.diffs.some(diff => !!diff.chroma))) { return false; } + if (!isFitFullSpread(filter, map.versions?.at(0)?.diffs.length)) { return false; } + if (!isFitAutomapper(filter, map.automapper)){ return false; } + if (!isFitRanked(filter, map.ranked || map.blRanked)) { return false; } + if (!isFitCurated(filter, !!map.curator)) { return false; } + if (!isFitVerified(filter, !!map.curatedAt)) { return false; } + if (!isFitSearch(search, {songName: map.name, songAuthorName: map.metadata.songAuthorName, levelAuthorName: map.metadata.levelAuthorName})) { return false; } return true; }; diff --git a/src/renderer/components/maps-playlists-panel/maps/local-maps-list-panel.component.tsx b/src/renderer/components/maps-playlists-panel/maps/local-maps-list-panel.component.tsx index 9a530cad..f6e05827 100644 --- a/src/renderer/components/maps-playlists-panel/maps/local-maps-list-panel.component.tsx +++ b/src/renderer/components/maps-playlists-panel/maps/local-maps-list-panel.component.tsx @@ -3,7 +3,7 @@ import { BSVersion } from "shared/bs-version.interface"; import { forwardRef, useCallback, useContext, useEffect, useImperativeHandle, useState } from "react"; import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface"; import { Subscription, BehaviorSubject } from "rxjs"; -import { MapFilter, MapTag } from "shared/models/maps/beat-saver.model"; +import { MapFilter } from "shared/models/maps/beat-saver.model"; import { MapsDownloaderService } from "renderer/services/maps-downloader.service"; import { last, tap } from "rxjs/operators"; import { useTranslation } from "renderer/hooks/use-translation.hook"; @@ -23,6 +23,7 @@ import { VirtualScroll } from "renderer/components/shared/virtual-scroll/virtual import { MapItem } from "./map-item.component"; import { isLocalMapFitMapFilter } from "./filter-panel.component"; import { MapItemComponentPropsMapper } from "shared/mappers/map/map-item-component-props.mapper"; +import { noop } from "shared/helpers/function.helpers"; type Props = { version: BSVersion; @@ -70,8 +71,9 @@ export const LocalMapsListPanel = forwardRef(({ version, classNa }, [maps, selectedMaps]); useOnUpdate(() => { - if(linkedState === FolderLinkState.Pending || linkedState === FolderLinkState.Processing) return () => {}; + if(linkedState === FolderLinkState.Pending || linkedState === FolderLinkState.Processing) return noop; setLinked(linkedState === FolderLinkState.Linked); + return noop; }, [linkedState]); useEffect(() => { @@ -153,7 +155,7 @@ export const LocalMapsListPanel = forwardRef(({ version, classNa } const renderMap = useCallback((renderableMap: RenderableMap) => { - const map = renderableMap.map; + const { map } = renderableMap; return ( ({ hash, title, autor, songAutor, const mapUrl = mapId ? `https://beatsaver.com/maps/${mapId}` : null; const authorUrl = autorId ? `https://beatsaver.com/profile/${autorId}` : null; const likesText = likes ? Intl.NumberFormat(undefined, { notation: "compact" }).format(likes).split(" ").join("") : null; - const mapCoverUrl = coverUrl ? coverUrl : `https://eu.cdn.beatsaver.com/${hash}.jpg`; + const mapCoverUrl = coverUrl || `https://eu.cdn.beatsaver.com/${hash}.jpg`; const createdDate = useConstant(() => { if(!createdAt){ return null; } @@ -167,16 +167,16 @@ export function MapItemComponent ({ hash, title, autor, songAutor, <>
- {diffSet.map((diff, index) => ( - + {diffSet.map((diff) => ( + ))}
); } if (diffSets.length > 1) { - return diffSets.map(([diffType, diffSet], index) => ( - + return diffSets.map(([diffType, diffSet]) => ( + {diffSet.length} @@ -205,10 +205,10 @@ export function MapItemComponent ({ hash, title, autor, songAutor, {(diffsPanelHovered || bottomBarHovered) && ( - {Array.from(diffs.entries()).map(([charac, diffSet], index) => ( -
    - {diffSet.map(({ name, libelle, stars }, index) => ( -
  1. + {Array.from(diffs.entries()).map(([charac, diffSet]) => ( +
      + {diffSet.map(({ name, libelle, stars }) => ( +
    1. {onHighlightedDiffsChange && (
      diff --git a/src/renderer/components/maps-playlists-panel/playlists/playlist-item.component.tsx b/src/renderer/components/maps-playlists-panel/playlists/playlist-item.component.tsx index 9417b359..b9f89840 100644 --- a/src/renderer/components/maps-playlists-panel/playlists/playlist-item.component.tsx +++ b/src/renderer/components/maps-playlists-panel/playlists/playlist-item.component.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-nested-ternary */ import { motion } from 'framer-motion'; import { BsmImage } from 'renderer/components/shared/bsm-image.component'; import { ClockIcon } from 'renderer/components/svgs/icons/clock-icon.component'; @@ -126,7 +127,7 @@ export const PlaylistItem = memo(({ title, withBar={false} /> - ) : (<>)} + ) : (undefined)} {onClickSync ? ( isDownloading ? ( @@ -141,9 +142,9 @@ export const PlaylistItem = memo(({ title, withBar={false} /> - ) : (<>) + ) : undefined - ) : (<>)} + ) : undefined} {onClickDownload ? ( isDownloading ? ( @@ -158,9 +159,9 @@ export const PlaylistItem = memo(({ title, withBar={false} /> - ) : (<>) + ) : undefined - ) : (<>)} + ) : undefined} {onClickEdit ? ( - ) : (<>)} + ) : undefined} {onClickOpenFile ? - : (<>)} + : undefined} {(onClickDelete && !isDownloading && !isInQueue) ? - : (<>)} + : undefined}
      diff --git a/src/renderer/components/modal/modal-types/chabgelog-modal/changelog-modal.component.tsx b/src/renderer/components/modal/modal-types/chabgelog-modal/changelog-modal.component.tsx index 2e5a54cd..19a7d281 100644 --- a/src/renderer/components/modal/modal-types/chabgelog-modal/changelog-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/chabgelog-modal/changelog-modal.component.tsx @@ -7,7 +7,7 @@ import DOMPurify from 'dompurify'; import './changelog-modal.component.css'; import Tippy from "@tippyjs/react"; -export const ChangelogModal: ModalComponent = ({ resolver, options: {data: changelog} }) => { +export const ChangelogModal: ModalComponent = ({ options: {data: changelog} }) => { const linkOpener = useService(LinkOpenerService); const openGithub = () => linkOpener.open("https://github.com/Zagrios/bs-manager"); diff --git a/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx b/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx index 21184b36..43577194 100644 --- a/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/download-maps-modal.component.tsx @@ -132,7 +132,7 @@ export const DownloadMapsModal: ModalComponent { - const map = downloadableMap.map; + const { map } = downloadableMap; const downloadable = !downloadableMap.isOwned && !downloadableMap.isInQueue; const cancelable = downloadableMap.isInQueue && !downloadableMap.idDownloading; @@ -274,27 +274,3 @@ type DownloadableMap = { idDownloading: boolean; isInQueue: boolean; }; - -{/*
        - {maps.length === 0 ? ( -
        -  - - {(() => { - if (loading) { - return t("modals.download-maps.loading-maps"); - } - if (isOnline) { - return t("modals.download-maps.no-maps-found"); - } - return t("modals.download-maps.no-internet"); - })()} - -
        - ) : ( - <> - {maps.map(renderMap)} - - - )} -
      */} diff --git a/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-filter-panel.component.tsx b/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-filter-panel.component.tsx index d164fb32..030c35da 100644 --- a/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-filter-panel.component.tsx +++ b/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-filter-panel.component.tsx @@ -70,6 +70,7 @@ export function DownloadPlaylistFilterPanel({ className, params, onChange, onSub return {text}; }; + // eslint-disable-next-line react/no-unstable-nested-components const CustomRadio = (props: RadioProps) => { const {children, ...otherProps} = props; diff --git a/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-modal-header.component.tsx b/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-modal-header.component.tsx index 0b156928..0edac878 100644 --- a/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-modal-header.component.tsx +++ b/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-modal-header.component.tsx @@ -28,7 +28,7 @@ export function DownloadPlaylistModalHeader({ className, value, onSubmit }: Prop const sortOptions: BsmSelectOption[] = useConstant(() => { return Object.values(BsvSearchOrder).reduce((acc, value) => { if(value === BsvSearchOrder.Rating){ return acc; } - acc.push({ text: `beat-saver.maps-sorts.${value}`, value: value }); + acc.push({ text: `beat-saver.maps-sorts.${value}`, value }); return acc; }, []); }); diff --git a/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-modal.component.tsx b/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-modal.component.tsx index 8882d5fd..888af5e8 100644 --- a/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/playlist/download-playlist-modal/download-playlist-modal.component.tsx @@ -1,6 +1,6 @@ import { useObservable } from "renderer/hooks/use-observable.hook" import { ModalComponent, ModalService } from "renderer/services/modale.service" -import { Observable, lastValueFrom, take } from "rxjs" +import { Observable, lastValueFrom } from "rxjs" import { BSVersion } from "shared/bs-version.interface" import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface" import { LocalBPListsDetails } from "shared/models/playlists/local-playlist.models" @@ -49,7 +49,7 @@ export const DownloadPlaylistModal: ModalComponent playlists?.map(playlist => ({ playlist, isOwned: ownedPlaylists.some(ownedPlaylist => ownedPlaylist.id === playlist.playlistId), - ownedMaps: ownedMaps + ownedMaps }))); }, [playlists, ownedPlaylists, ownedMaps]) @@ -77,7 +77,7 @@ export const DownloadPlaylistModal: ModalComponent { - const playlist = downloadablePlaylists.playlist; + const { playlist } = downloadablePlaylists; const onClickDownload = () => { lastValueFrom(playlistDownloader.downloadPlaylist({ @@ -115,7 +115,7 @@ export const DownloadPlaylistModal: ModalComponent ) } - else if(downloadablePlaylists.length === 0){ + if(downloadablePlaylists.length === 0){ return (
      diff --git a/src/renderer/components/modal/modal-types/playlist/edit-playlist-modal/edit-playlist-modal.component.tsx b/src/renderer/components/modal/modal-types/playlist/edit-playlist-modal/edit-playlist-modal.component.tsx index 79a3a22d..20e3669f 100644 --- a/src/renderer/components/modal/modal-types/playlist/edit-playlist-modal/edit-playlist-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/playlist/edit-playlist-modal/edit-playlist-modal.component.tsx @@ -10,7 +10,6 @@ import { useOnUpdate } from "renderer/hooks/use-on-update.hook"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import { ModalComponent, ModalExitCode, ModalService } from "renderer/services/modale.service" import { BehaviorSubject, Observable, lastValueFrom, map, take } from "rxjs"; -import { BSVersion } from "shared/bs-version.interface"; import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface"; import { LocalBPList } from "shared/models/playlists/local-playlist.models" import { BsvMapDetail, SongDetails } from "shared/models/maps"; @@ -303,7 +302,7 @@ export const EditPlaylistModal: ModalComponent = ({ resolver, opt ) : tmpLocalMaps; const newPlaylistMaps = {...playlistMaps$.value} ?? {}; - mapsToAdd.forEach(map => newPlaylistMaps[getHashOfMap(map)] = { map }); + mapsToAdd.forEach(map =>{ newPlaylistMaps[getHashOfMap(map)] = { map }; }); playlistMaps$.next(newPlaylistMaps); availabledHashsSelected$.next([]); @@ -345,7 +344,7 @@ export const EditPlaylistModal: ModalComponent = ({ resolver, opt if(!playlistMap?.map){ return; } - const map = playlistMap.map; + const { map } = playlistMap; if((map as BsmLocalMap).rawInfo?._levelAuthorName){ mappersSet.add((map as BsmLocalMap).rawInfo._levelAuthorName); @@ -366,19 +365,19 @@ export const EditPlaylistModal: ModalComponent = ({ resolver, opt if(!playlistMap?.map){ return 0; } - const map = playlistMap.map; + const { map } = playlistMap; if((map as BsmLocalMap)?.songDetails?.duration){ return (map as BsmLocalMap).songDetails.duration; } - else if((map as SongDetails)?.duration){ + if((map as SongDetails)?.duration){ return (map as SongDetails).duration; } - else if((map as BsvMapDetail)?.metadata?.duration){ + if((map as BsvMapDetail)?.metadata?.duration){ return (map as BsvMapDetail).metadata.duration; } return 0; - }).filter(duration => !isNaN(duration)); + }).filter(duration => !Number.isNaN(duration)); const totalDuration = durations.reduce((acc, duration) => acc + duration, 0); return totalDuration > 3600 ? dateFormat(totalDuration * 1000, "H:MM:ss") : dateFormat(totalDuration * 1000, "MM:ss"); @@ -390,7 +389,7 @@ export const EditPlaylistModal: ModalComponent = ({ resolver, opt if(!playlistMap?.map){ return acc; } - const map = playlistMap.map; + const { map } = playlistMap; if(Array.isArray((map as BsmLocalMap)?.songDetails?.difficulties)){ acc.push(...(map as BsmLocalMap).songDetails.difficulties.map(diff => diff.nps)); @@ -402,7 +401,7 @@ export const EditPlaylistModal: ModalComponent = ({ resolver, opt acc.push(...(map as BsvMapDetail).versions.flatMap(version => version.diffs.map(diff => diff.nps))); } return acc; - }, [] as number[]).filter(n => !isNaN(n)); + }, [] as number[]).filter(n => !Number.isNaN(n)); const minNps = Math.min(...nps); const maxNps = Math.max(...nps); @@ -461,142 +460,140 @@ export const EditPlaylistModal: ModalComponent = ({ resolver, opt if(!playlistMaps || !localMaps){ return
      {t("playlist.loading")}
      } - else{ - return ( -
      -
      -
      -
      {e.preventDefault(); handleNewSearch()}}> - - setAvailableMapsSearch(() => e.target.value)} /> - {availableMapsSource === 1 && ( - - )} - - filterContainerRef.current.close()}/> - - {availableMapsSource === 1 && ( - - )} - + return ( +
      +
      +
      +
      {e.preventDefault(); handleNewSearch()}}> + + setAvailableMapsSearch(() => e.target.value)} /> + {availableMapsSource === 1 && ( + + )} + + filterContainerRef.current.close()}/> + + {availableMapsSource === 1 && ( + + )} + -
      - {(() => { - - if((availableMapsSource === 1 && !Array.isArray(bsvMaps)) || (availableMapsSource === 0 && !Array.isArray(localMaps))){ - return ( -
      - - {t("playlist.loading")} -
      - ); - } - - if((availableMapsSource === 1 && bsvMaps.length === 0) || (availableMapsSource === 0 && localMaps.length === 0)){ - return ( -
      - - {t("playlist.no-map-found")} -
      - ); - } - - if(availableMapsSource === 0){ - return renderList(localMaps.filter(map => { - if(playlistMaps?.[map.hash]){ return false; } - return isMapFitFilter({ map, filter: availableMapsFilter, search: availableMapsSearch }); - }), renderAvailableMapItem); - } - - return renderList(bsvMaps, renderBsvMapItem, { onScrollEnd: loadMoreBsvMaps }); - })()} -
      - -
      - {t("playlist.edit-playlist-shortcuts")} -
      -
      -
      - - - - - - -
      -
      -
      - setPlaylistMapsSearch(() => e.target.value)} /> - - - -
      -
      - {(() => { - if(!playlistMaps){ - return( -
      - - {t("playlist.loading")} -
      - ); - } - if(Object.keys(playlistMaps).length === 0){ - return ( -
      - - {t("playlist.playlist-is-empty")} -
      - ); - } +
      + {(() => { + if((availableMapsSource === 1 && !Array.isArray(bsvMaps)) || (availableMapsSource === 0 && !Array.isArray(localMaps))){ return ( - +
      + + {t("playlist.loading")} +
      ); + } - })()} + if((availableMapsSource === 1 && bsvMaps.length === 0) || (availableMapsSource === 0 && localMaps.length === 0)){ + return ( +
      + + {t("playlist.no-map-found")} +
      + ); + } + + if(availableMapsSource === 0){ + return renderList(localMaps.filter(map => { + if(playlistMaps?.[map.hash]){ return false; } + return isMapFitFilter({ map, filter: availableMapsFilter, search: availableMapsSearch }); + }), renderAvailableMapItem); + } + + return renderList(bsvMaps, renderBsvMapItem, { onScrollEnd: loadMoreBsvMaps }); + })()} +
      + +
      + {t("playlist.edit-playlist-shortcuts")} +
      +
      +
      + + + + + + +
      +
      +
      + setPlaylistMapsSearch(() => e.target.value)} /> + + + +
      +
      + {(() => { + if(!playlistMaps){ + return( +
      + + {t("playlist.loading")} +
      + ); + } + if(Object.keys(playlistMaps).length === 0){ + return ( +
      + + {t("playlist.playlist-is-empty")} +
      + ); + } + + return ( + + ); + + })()} +
      +
      +
      + + {Object.keys(playlistMaps ?? {}).length}
      -
      -
      - - {Object.keys(playlistMaps ?? {}).length} -
      -
      - - {playlistNbMappers} -
      -
      - - {playlistDuration} -
      -
      - - {`${playlistMinNps} - ${playlistMaxNps}`} -
      +
      + + {playlistNbMappers} +
      +
      + + {playlistDuration} +
      +
      + + {`${playlistMinNps} - ${playlistMaxNps}`}
      -
      - resolver({ exitCode: ModalExitCode.CANCELED })}/> - -
      - ) - } +
      + resolver({ exitCode: ModalExitCode.CANCELED })}/> + +
      +
      + ); })()}
      ) diff --git a/src/renderer/components/modal/modal-types/playlist/playlist-details-modal/bsv-playlist-details-modal.component.tsx b/src/renderer/components/modal/modal-types/playlist/playlist-details-modal/bsv-playlist-details-modal.component.tsx index 1f6f9780..7be3def1 100644 --- a/src/renderer/components/modal/modal-types/playlist/playlist-details-modal/bsv-playlist-details-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/playlist/playlist-details-modal/bsv-playlist-details-modal.component.tsx @@ -66,7 +66,7 @@ export const BsvPlaylistDetailsModal: ModalComponent = ({ resolver, }, [playlistMaps, currentMapDownload, downloadingMaps, installedMaps]) const renderMapItem = useCallback((downloadableMap: DownloadableMap) => { - const map = downloadableMap.map; + const { map } = downloadableMap; const downloadable = !downloadableMap.isOwned && !downloadableMap.isInQueue; const cancelable = downloadableMap.isInQueue && !downloadableMap.idDownloading; diff --git a/src/renderer/components/modal/modal-types/playlist/playlist-details-modal/local-playlist-details-modal.component.tsx b/src/renderer/components/modal/modal-types/playlist/playlist-details-modal/local-playlist-details-modal.component.tsx index 5fd6ccaa..7638d04b 100644 --- a/src/renderer/components/modal/modal-types/playlist/playlist-details-modal/local-playlist-details-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/playlist/playlist-details-modal/local-playlist-details-modal.component.tsx @@ -81,7 +81,7 @@ export const LocalPlaylistDetailsModal: ModalComponent = ({resolver if (!Array.isArray(installedMaps) || !localPlaylist) { return (
      - + Error
      ); } diff --git a/src/renderer/components/modal/modal.component.tsx b/src/renderer/components/modal/modal.component.tsx index aabf741a..fe047633 100644 --- a/src/renderer/components/modal/modal.component.tsx +++ b/src/renderer/components/modal/modal.component.tsx @@ -60,7 +60,7 @@ export function Modal() { return ( - {currentModal ? currentModal.resolver({ exitCode: ModalExitCode.NO_CHOICE })} className="fixed size-full bg-black z-[90]" initial={{ opacity: 0 }} animate={{ opacity: currentModal && 0.6 }} exit={{ opacity: 0 }} transition={{ duration: 0.2 }} /> : <>} + {currentModal ? currentModal.resolver({ exitCode: ModalExitCode.NO_CHOICE })} className="fixed size-full bg-black z-[90]" initial={{ opacity: 0 }} animate={{ opacity: currentModal && 0.6 }} exit={{ opacity: 0 }} transition={{ duration: 0.2 }} /> : undefined} {modals?.map(modal => ( {renderModal(modal)} diff --git a/src/renderer/components/models-management/models-grid.component.tsx b/src/renderer/components/models-management/models-grid.component.tsx index 45f08554..104fd352 100644 --- a/src/renderer/components/models-management/models-grid.component.tsx +++ b/src/renderer/components/models-management/models-grid.component.tsx @@ -19,6 +19,7 @@ import { ModelsDownloaderService } from "renderer/services/models-management/mod import { useTranslation } from "renderer/hooks/use-translation.hook"; import { BsContentLoader } from "../shared/bs-content-loader.component"; import { VirtualScroll } from "../shared/virtual-scroll/virtual-scroll.component"; +import { noop } from "shared/helpers/function.helpers"; type Props = { className?: string; @@ -96,7 +97,7 @@ export const ModelsGrid = forwardRef(({ className, version, type useOnUpdate(() => { if (!active && !models) { - return; + return noop; } const onLinkStateChangeCb = (action: VersionLinkerAction) => { @@ -204,7 +205,7 @@ export const ModelsGrid = forwardRef(({ className, version, type const renderModel = useCallback((renderableModel: RenderableModel) => { - const model = renderableModel.model; + const { model } = renderableModel; return ( void; + onCancel?: MouseEventHandler; }; export function NavBarItem({ progress, isDownloading, children, isActive, onCancel }: Props) { diff --git a/src/renderer/components/settings/setting-container.component.tsx b/src/renderer/components/settings/setting-container.component.tsx index abb41b38..00aba9b7 100644 --- a/src/renderer/components/settings/setting-container.component.tsx +++ b/src/renderer/components/settings/setting-container.component.tsx @@ -15,7 +15,7 @@ export function SettingContainer({ id, className, title, minorTitle, description const t = useTranslation(); if (os && os !== window.electron.platform) { - return <>; + return undefined; } return ( diff --git a/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-item.component.tsx b/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-item.component.tsx index f867dc96..8ff22d3d 100644 --- a/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-item.component.tsx +++ b/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-item.component.tsx @@ -1,3 +1,4 @@ +import { MouseEventHandler } from "react"; import { LinkBtnProps, LinkButton } from "renderer/components/shared/link-button.component"; import { SvgIcon } from "renderer/components/svgs/svg-icon.type"; import { useTranslation } from "renderer/hooks/use-translation.hook"; @@ -17,7 +18,7 @@ export const BsContentTabItem: BsContentTabItemComponent = ({ text, icon: Icon, const t = useTranslation(); - const handleClick = (e: React.MouseEvent) => { + const handleClick: MouseEventHandler = (e) => { e.preventDefault(); e.stopPropagation(); onClick(value); diff --git a/src/renderer/components/shared/bsm-dropdown-button.component.tsx b/src/renderer/components/shared/bsm-dropdown-button.component.tsx index d6da6415..eceef67a 100644 --- a/src/renderer/components/shared/bsm-dropdown-button.component.tsx +++ b/src/renderer/components/shared/bsm-dropdown-button.component.tsx @@ -1,4 +1,4 @@ -import { forwardRef, useImperativeHandle, useRef, useState } from "react"; +import { forwardRef, LegacyRef, useImperativeHandle, useRef, useState } from "react"; import { BsmIconType, BsmIcon } from "../svgs/bsm-icon.component"; import { BsmButton } from "./bsm-button.component"; import { useTranslation } from "renderer/hooks/use-translation.hook"; @@ -62,10 +62,8 @@ export const BsmDropdownButton = forwardRef(({ className, items, align, withBar return "right-0 origin-top-right"; })(); - console.log("alignClass", alignClass); - return ( -
      } className={className}> +
      } className={className}> setExpanded(!expanded)} className={buttonClassName ?? defaultButtonClassName} icon={icon} active={expanded} textClassName={textClassName} onClickOutside={handleClickOutside} withBar={withBar} text={text} />
      {items?.map( diff --git a/src/renderer/components/shared/bsm-link.component.tsx b/src/renderer/components/shared/bsm-link.component.tsx index 3d502432..6681dd54 100644 --- a/src/renderer/components/shared/bsm-link.component.tsx +++ b/src/renderer/components/shared/bsm-link.component.tsx @@ -1,3 +1,4 @@ +import { CSSProperties, ReactNode } from "react"; import { useService } from "renderer/hooks/use-service.hook"; import { LinkOpenerService } from "renderer/services/link-opener.service"; @@ -5,8 +6,8 @@ type Props = { className?: string; href?: string; internal?: boolean; - children?: React.ReactNode; - style?: React.CSSProperties; + children?: ReactNode; + style?: CSSProperties; }; export function BsmLink({ className, href, children, style, internal }: Props) { @@ -15,8 +16,6 @@ export function BsmLink({ className, href, children, style, internal }: Props) { const openLink = () => { - console.log("Opening link", href, internal); - if (!href) { return; } diff --git a/src/renderer/components/shared/tab-nav-bar.component.tsx b/src/renderer/components/shared/tab-nav-bar.component.tsx index 960ab97e..8ef60d46 100644 --- a/src/renderer/components/shared/tab-nav-bar.component.tsx +++ b/src/renderer/components/shared/tab-nav-bar.component.tsx @@ -1,4 +1,4 @@ -import { DetailedHTMLProps, Fragment } from "react"; +import { DetailedHTMLProps, Fragment, HTMLAttributes } from "react"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import { useTranslation } from "renderer/hooks/use-translation.hook"; import { LaserSlider } from "./laser-slider.component"; @@ -8,7 +8,7 @@ type Props = { tabsText: string[]; onTabChange: (index: number) => void; className?: string; - renderTab?: (props: DetailedHTMLProps, any>, text: string, index?: number) => JSX.Element; + renderTab?: (props: DetailedHTMLProps, any>, text: string, index?: number) => JSX.Element; }; export function TabNavBar(props: Props) { diff --git a/src/renderer/components/svgs/icons/chevron-top-icon.component.tsx b/src/renderer/components/svgs/icons/chevron-top-icon.component.tsx index 361cfb48..8650efd8 100644 --- a/src/renderer/components/svgs/icons/chevron-top-icon.component.tsx +++ b/src/renderer/components/svgs/icons/chevron-top-icon.component.tsx @@ -1,4 +1,6 @@ -export function ChevronTopIcon(props: React.ComponentProps<"svg">) { +import { ComponentProps } from "react"; + +export function ChevronTopIcon(props: ComponentProps<"svg">) { return ( diff --git a/src/renderer/components/version-viewer/slides/mods/mod-item.component.tsx b/src/renderer/components/version-viewer/slides/mods/mod-item.component.tsx index 56c24cd7..f6d7da4c 100644 --- a/src/renderer/components/version-viewer/slides/mods/mod-item.component.tsx +++ b/src/renderer/components/version-viewer/slides/mods/mod-item.component.tsx @@ -1,7 +1,7 @@ import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { BsmCheckbox } from "renderer/components/shared/bsm-checkbox.component"; import { Mod } from "shared/models/mods/mod.interface"; -import { CSSProperties, useRef } from "react"; +import { CSSProperties, MouseEvent, useRef } from "react"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import { BsModsManagerService } from "renderer/services/bs-mods-manager.service"; import { useObservable } from "renderer/hooks/use-observable.hook"; @@ -34,11 +34,11 @@ export function ModItem({ className, mod, installedVersion, isDependency, isSele modsManager.uninstallMod(mod, pageState.getState()); }; - const handleWantInfo = (e: React.MouseEvent) => { + const handleWantInfo = (e: MouseEvent) => { e.preventDefault(); onWantInfo(mod); }; - const handleOnChange = (e: React.MouseEvent) => { + const handleOnChange = (e: MouseEvent) => { e.preventDefault(); onChange(!isChecked); }; diff --git a/src/renderer/hooks/use-click-outside.hook.ts b/src/renderer/hooks/use-click-outside.hook.ts index 7f58a198..6d33e217 100644 --- a/src/renderer/hooks/use-click-outside.hook.ts +++ b/src/renderer/hooks/use-click-outside.hook.ts @@ -1,6 +1,6 @@ -import { MutableRefObject, useEffect } from "react"; +import { ComponentProps, MutableRefObject, useEffect } from "react"; -export function useClickOutside(ref: MutableRefObject, handler: React.ComponentProps["onClick"]) { +export function useClickOutside(ref: MutableRefObject, handler: ComponentProps["onClick"]) { useEffect(() => { if (!handler) { return () => {}; diff --git a/src/renderer/hooks/use-observe-size.hook.ts b/src/renderer/hooks/use-observe-size.hook.ts index 4ba6a1ce..d32e9431 100644 --- a/src/renderer/hooks/use-observe-size.hook.ts +++ b/src/renderer/hooks/use-observe-size.hook.ts @@ -1,4 +1,4 @@ -import { RefObject, useEffect, useState } from "react"; +import { RefObject, useEffect } from "react"; import { useConstant } from "./use-constant.hook"; import { BehaviorSubject, debounceTime, distinctUntilChanged } from "rxjs"; import { useObservable } from "./use-observable.hook"; diff --git a/src/renderer/hooks/use-switchable-observable.hook.ts b/src/renderer/hooks/use-switchable-observable.hook.ts index 14e09f9a..109ee024 100644 --- a/src/renderer/hooks/use-switchable-observable.hook.ts +++ b/src/renderer/hooks/use-switchable-observable.hook.ts @@ -1,13 +1,14 @@ import { Observable } from "rxjs"; import { useState, useEffect, Dispatch, SetStateAction } from "react"; +import { noop } from "shared/helpers/function.helpers"; -export function useSwitchableObservable(observable?: Observable, clearOnSwitch = true): [T, React.Dispatch>>, Observable, Dispatch>] { +export function useSwitchableObservable(observable?: Observable, clearOnSwitch = true): [T, Dispatch>>, Observable, Dispatch>] { const [currentObs, setCurrentObs] = useState(observable); const [obsValue, setObsValue] = useState(); useEffect(() => { if (!currentObs) { - return; + return noop; } if (clearOnSwitch) { setObsValue(() => null); diff --git a/src/renderer/hooks/use-theme-color.hook.ts b/src/renderer/hooks/use-theme-color.hook.ts index 8f4b3571..ea5f7776 100644 --- a/src/renderer/hooks/use-theme-color.hook.ts +++ b/src/renderer/hooks/use-theme-color.hook.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-redeclare */ import { DefaultConfigKey } from "renderer/config/default-configuration.config"; import { ConfigurationService } from "renderer/services/configuration.service"; import { useObservable } from "./use-observable.hook"; diff --git a/src/renderer/pages/available-versions-list.components.tsx b/src/renderer/pages/available-versions-list.components.tsx index eed439a8..8be40307 100644 --- a/src/renderer/pages/available-versions-list.components.tsx +++ b/src/renderer/pages/available-versions-list.components.tsx @@ -11,6 +11,7 @@ import { useService } from "renderer/hooks/use-service.hook"; import { BSVersion } from "shared/bs-version.interface"; import { useObservable } from "renderer/hooks/use-observable.hook"; import { BsDownloaderService } from "renderer/services/bs-version-download/bs-downloader.service"; +import { logRenderError } from "renderer"; export const AvailableVersionsContext = createContext<{ selectedVersion: BSVersion; setSelectedVersion: (version: BSVersion) => void }>(null); @@ -28,7 +29,7 @@ export function AvailableVersionsList() { const startDownload = async () => { return bsDownloader.downloadVersion(selectedVersion) - .catch(console.log) + .catch(logRenderError) .finally(() => setSelectedVersion(null)); }; @@ -40,19 +41,19 @@ export function AvailableVersionsList() { return Promise.all([ versionManager.askAvailableVersions(), versionManager.askInstalledVersions() - ]).catch(console.log); + ]).catch(logRenderError); } return (
      - +

      {t("pages.available-versions.title")}

      - + {selectedVersion && !downloading && ( diff --git a/src/renderer/pages/settings-page.component.tsx b/src/renderer/pages/settings-page.component.tsx index fb1d84c1..bb63bc3c 100644 --- a/src/renderer/pages/settings-page.component.tsx +++ b/src/renderer/pages/settings-page.component.tsx @@ -163,7 +163,7 @@ export function SettingsPage() { return; } - ipcService.sendV2<{ canceled: boolean; filePaths: string[] }>("choose-file").toPromise().then(res => { + lastValueFrom(ipcService.sendV2("choose-file")).then(res => { if (!res.canceled && res.filePaths?.length) { const protonPath = res.filePaths[0]; setProtonPath(protonPath); @@ -243,9 +243,14 @@ export function SettingsPage() { const switchDeepLink = async (manager: MapsManagerService | PlaylistsManagerService | ModelsManagerService, enable: boolean, showNotification: boolean, setter: Dispatch>) => { const res = await (enable ? manager.enableDeepLink() : manager.disableDeepLink()).then(() => true).catch(() => false); - if(showNotification){ - res ? showDeepLinkSuccess(enable) : showDeepLinkError(enable); + + if(showNotification && res){ + showDeepLinkSuccess(enable) } + else if(showNotification && !res){ + showDeepLinkError(enable); + } + const isEnable = await manager.isDeepLinksEnabled(); setter(() => isEnable); return res; @@ -257,7 +262,12 @@ export function SettingsPage() { const toogleAllDeepLinks = async () => { const res = (await Promise.all([switchDeepLink(mapsManager, !allDeepLinkEnabled, false, setMapDeepLinksEnabled), switchDeepLink(playlistsManager, !allDeepLinkEnabled, false, setPlaylistsDeepLinkEnabled), switchDeepLink(modelsManager, !allDeepLinkEnabled, false, setModelsDeepLinkEnabled)])).every(activation => activation === true); - res ? showDeepLinkSuccess(allDeepLinkEnabled) : showDeepLinkError(allDeepLinkEnabled); + if(res){ + showDeepLinkSuccess(allDeepLinkEnabled); + } + else{ + showDeepLinkError(allDeepLinkEnabled); + } }; return ( diff --git a/src/renderer/services/audio-player.service.ts b/src/renderer/services/audio-player.service.ts index 42ad7708..69c2a8a8 100644 --- a/src/renderer/services/audio-player.service.ts +++ b/src/renderer/services/audio-player.service.ts @@ -1,5 +1,6 @@ import { BehaviorSubject, Observable, map } from 'rxjs'; import { ConfigurationService } from './configuration.service'; +import { logRenderError } from 'renderer'; interface PlayerVolume { volume: number; @@ -51,7 +52,7 @@ export class AudioPlayerService { if(!sound){ return; } this.player.src = sound.src; this._bpm$.next(sound.bpm || 0); - this.player.play().catch(error => console.error('Error playing sound:', error)); + this.player.play().catch(logRenderError); }); this._volume$.subscribe(volume => { @@ -79,7 +80,7 @@ export class AudioPlayerService { return this.player.play().then(() => { this._playing$.next(true); - }).catch(error => console.error('Error resuming sound:', error)); + }).catch(logRenderError); } public setVolume(volume: number): void { diff --git a/src/renderer/services/bs-version-manager.service.ts b/src/renderer/services/bs-version-manager.service.ts index 51d480fe..d244577f 100644 --- a/src/renderer/services/bs-version-manager.service.ts +++ b/src/renderer/services/bs-version-manager.service.ts @@ -1,5 +1,5 @@ import { BSVersion } from "shared/bs-version.interface"; -import { BehaviorSubject, Observable, Subscription, lastValueFrom, map, shareReplay, throwError } from "rxjs"; +import { BehaviorSubject, Observable, Subscription, lastValueFrom, shareReplay, throwError } from "rxjs"; import { IpcService } from "./ipc.service"; import { ModalExitCode, ModalService } from "./modale.service"; import { NotificationService } from "./notification.service"; diff --git a/src/renderer/services/i18n.service.ts b/src/renderer/services/i18n.service.ts index 618103dd..08a498b2 100644 --- a/src/renderer/services/i18n.service.ts +++ b/src/renderer/services/i18n.service.ts @@ -81,10 +81,13 @@ export class I18nService { translated = getProperty(this.dictionary, translationKey) ?? translationKey; this.cache.set(translationKey, translated); } - args && + + if (args) { Object.keys(args).forEach(key => { translated = translated.replaceAll(`{${key}}`, args[key]); }); + } + return translated; } } diff --git a/src/renderer/services/modale.service.ts b/src/renderer/services/modale.service.ts index 0115e4d8..f1391b81 100644 --- a/src/renderer/services/modale.service.ts +++ b/src/renderer/services/modale.service.ts @@ -24,7 +24,7 @@ export class ModalService { const promise = new Promise>(resolve => { resolver = resolve as (value: ModalResponse | PromiseLike) => void; }); - const modalObj = {modal: modal as ModalComponent, resolver: resolver, options}; + const modalObj = {modal: modal as ModalComponent, resolver, options}; this._modalToShow$.next([...this._modalToShow$.getValue(), modalObj]); promise.then(() => { diff --git a/src/renderer/services/models-management/models-manager.service.ts b/src/renderer/services/models-management/models-manager.service.ts index d1e075d6..48e3eabb 100644 --- a/src/renderer/services/models-management/models-manager.service.ts +++ b/src/renderer/services/models-management/models-manager.service.ts @@ -1,6 +1,6 @@ import { MSModelType } from "shared/models/models/model-saber.model"; import { IpcService } from "../ipc.service"; -import { FolderLinkState, VersionFolderLinkerService, VersionLinkerActionListener, VersionLinkerActionType } from "../version-folder-linker.service"; +import { FolderLinkState, VersionFolderLinkerService, VersionLinkerActionListener } from "../version-folder-linker.service"; import { MODEL_TYPE_FOLDERS } from "shared/models/models/constants"; import { Observable, lastValueFrom, map } from "rxjs"; import { BSVersion } from "shared/bs-version.interface"; diff --git a/src/renderer/services/playlist-downloader.service.ts b/src/renderer/services/playlist-downloader.service.ts index e4061ee9..7fc77631 100644 --- a/src/renderer/services/playlist-downloader.service.ts +++ b/src/renderer/services/playlist-downloader.service.ts @@ -1,4 +1,4 @@ -import { BehaviorSubject, Observable, Subject, Subscription, distinctUntilChanged, filter, lastValueFrom, map, shareReplay, take, takeUntil, takeWhile, tap } from "rxjs"; +import { BehaviorSubject, Observable, Subject, Subscription, distinctUntilChanged, filter, lastValueFrom, map, shareReplay, take, takeUntil, tap } from "rxjs"; import { BPList, DownloadPlaylistProgressionData } from "shared/models/playlists/playlist.interface"; import { IpcService } from "./ipc.service"; import { ProgressBarService } from "./progress-bar.service"; @@ -43,7 +43,7 @@ export class PlaylistDownloaderService { return new Observable>(subscriber => { - let subs: Subscription[] = []; + const subs: Subscription[] = []; let canShowProgress = false; (async () => { diff --git a/src/renderer/services/playlists-manager.service.ts b/src/renderer/services/playlists-manager.service.ts index c6d64897..97df9608 100644 --- a/src/renderer/services/playlists-manager.service.ts +++ b/src/renderer/services/playlists-manager.service.ts @@ -1,6 +1,6 @@ import { BSVersion } from "shared/bs-version.interface"; import { IpcService } from "./ipc.service"; -import { Observable, lastValueFrom, of, switchMap } from "rxjs"; +import { Observable, lastValueFrom } from "rxjs"; import { FolderLinkState, VersionFolderLinkerService } from "./version-folder-linker.service"; import { Progression } from "main/helpers/fs.helpers"; import { LocalBPList, LocalBPListsDetails } from "shared/models/playlists/local-playlist.models"; diff --git a/src/renderer/services/progress-bar.service.ts b/src/renderer/services/progress-bar.service.ts index dfd746b7..1c5e09a2 100644 --- a/src/renderer/services/progress-bar.service.ts +++ b/src/renderer/services/progress-bar.service.ts @@ -5,7 +5,6 @@ import { NotificationService } from "./notification.service"; import { CSSProperties } from "react"; import { ProgressionInterface } from "shared/models/progress-bar"; import { Progression } from "main/helpers/fs.helpers"; -import { satisfies } from "semver"; export class ProgressBarService { private static instance: ProgressBarService; diff --git a/src/renderer/services/version-folder-linker.service.ts b/src/renderer/services/version-folder-linker.service.ts index 330db668..0c5735c3 100644 --- a/src/renderer/services/version-folder-linker.service.ts +++ b/src/renderer/services/version-folder-linker.service.ts @@ -1,4 +1,4 @@ -import { LinkOptions, UnlinkOptions } from "main/services/folder-linker.service"; +import { LinkOptions } from "main/services/folder-linker.service"; import { map, distinctUntilChanged, filter, mergeMap, shareReplay } from "rxjs/operators"; import { BehaviorSubject, Observable, of } from "rxjs"; import { BSVersion } from "shared/bs-version.interface"; diff --git a/src/renderer/windows/OneClick/OneClickDownloadMap.tsx b/src/renderer/windows/OneClick/OneClickDownloadMap.tsx index 822184b2..77055f2a 100644 --- a/src/renderer/windows/OneClick/OneClickDownloadMap.tsx +++ b/src/renderer/windows/OneClick/OneClickDownloadMap.tsx @@ -33,12 +33,9 @@ export default function OneClickDownloadMap() { progressBar.open(); - console.log("AAAA", mapId, isHash); - const promise = (async () => { const mapDetails = isHash === "true" ? (await bsv.getMapDetailsFromHashs([mapId])).at(0) : await bsv.getMapDetailsById(mapId); - console.log(mapDetails); setMapInfo(() => mapDetails); diff --git a/src/renderer/windows/OneClick/OneClickDownloadPlaylist.tsx b/src/renderer/windows/OneClick/OneClickDownloadPlaylist.tsx index 7af239bf..ca628c1c 100644 --- a/src/renderer/windows/OneClick/OneClickDownloadPlaylist.tsx +++ b/src/renderer/windows/OneClick/OneClickDownloadPlaylist.tsx @@ -11,7 +11,6 @@ import { map, filter, take, lastValueFrom } from "rxjs"; import defaultImage from "../../../../assets/images/default-version-img.jpg"; import { useService } from "renderer/hooks/use-service.hook"; import { useConstant } from "renderer/hooks/use-constant.hook"; -import { BPList } from "shared/models/playlists/playlist.interface"; import { useOnUpdate } from "renderer/hooks/use-on-update.hook"; import { useWindowArgs } from "renderer/hooks/use-window-args.hook"; import { useWindowControls } from "renderer/hooks/use-window-controls.hook"; diff --git a/src/shared/mappers/map/map-item-component-props.mapper.ts b/src/shared/mappers/map/map-item-component-props.mapper.ts index 0be957e8..ff0368cf 100644 --- a/src/shared/mappers/map/map-item-component-props.mapper.ts +++ b/src/shared/mappers/map/map-item-component-props.mapper.ts @@ -104,11 +104,11 @@ export abstract class MapItemComponentPropsMapper { public static from(mapDetails: BsmLocalMap|BsvMapDetail|SongDetails): MapItemComponentProps { if ((mapDetails as BsmLocalMap).rawInfo) { return MapItemComponentPropsMapper.fromBsmLocalMap(mapDetails as BsmLocalMap) as MapItemComponentProps; - } else if ((mapDetails as BsvMapDetail).metadata) { - return MapItemComponentPropsMapper.fromBsvMapDetail(mapDetails as BsvMapDetail) as MapItemComponentProps;; - } else { - return MapItemComponentPropsMapper.fromSongDetails(mapDetails as SongDetails) as MapItemComponentProps;; } + if ((mapDetails as BsvMapDetail).metadata) { + return MapItemComponentPropsMapper.fromBsvMapDetail(mapDetails as BsvMapDetail) as MapItemComponentProps; + } + return MapItemComponentPropsMapper.fromSongDetails(mapDetails as SongDetails) as MapItemComponentProps; } } diff --git a/src/shared/models/ipc/ipc-routes.ts b/src/shared/models/ipc/ipc-routes.ts index a4fd3729..b09d5997 100644 --- a/src/shared/models/ipc/ipc-routes.ts +++ b/src/shared/models/ipc/ipc-routes.ts @@ -116,6 +116,7 @@ export interface IpcChannelMapping { /* ** os-controls-ipcs ** */ "new-window": { request: string, response: void }; "choose-folder": { request: string, response: OpenDialogReturnValue }; + "choose-file": { request: string, response: OpenDialogReturnValue } "choose-image": { request: { multiple?: boolean, base64?: boolean }, response: string[] } "window.progression": { request: number, response: void }; "save-file": { request: { filename?: string; filters?: FileFilter[] }, response: string }; diff --git a/src/shared/models/maps/beat-saver.model.ts b/src/shared/models/maps/beat-saver.model.ts index 4ab0b5e9..885e1a69 100644 --- a/src/shared/models/maps/beat-saver.model.ts +++ b/src/shared/models/maps/beat-saver.model.ts @@ -216,7 +216,7 @@ export enum MapSpecificity { } -//[ Admin, Uploader, SageScore, None ] +// [ Admin, Uploader, SageScore, None ] export const BsvDeclaredAi = { Admin: "Admin", Uploader: "Uploader", diff --git a/src/shared/models/os/dialog.model.ts b/src/shared/models/os/dialog.model.ts index e28942bf..7e20bba8 100644 --- a/src/shared/models/os/dialog.model.ts +++ b/src/shared/models/os/dialog.model.ts @@ -1,4 +1,6 @@ +import { FileFilter } from "electron"; + export interface OpenSaveDialogOption { filename?: string; - filters?: Electron.FileFilter[]; + filters?: FileFilter[]; }