From d62727c3f9d3616724ef12fb6b00aabac46d29a4 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sat, 1 Jul 2023 03:01:38 +0200 Subject: [PATCH] [chore] fix lint errors --- .eslintrc.js | 12 +++++- src/main/ipcs/bs-version-ipcs.ts | 12 +++--- src/main/models/archive.class.ts | 4 +- .../local-models-manager.service.ts | 10 ++--- src/main/services/auto-updater.service.ts | 1 + src/main/services/bs-launcher.service.ts | 6 +-- src/main/services/folder-linker.service.ts | 4 +- .../services/mods/beat-mods-api.service.ts | 2 +- .../services/mods/bs-mods-manager.service.ts | 11 ++--- src/main/services/oculus.service.ts | 6 +-- src/main/services/request.service.ts | 2 +- src/main/services/steam.service.ts | 41 ++++++++++--------- .../available-version-item.component.tsx | 1 + .../available-versions-slide.component.tsx | 4 +- .../filter-panel.component.tsx | 18 ++++---- .../local-maps-list-panel.component.tsx | 7 ++-- .../maps-toolbar.component.tsx | 11 ----- .../download-maps-modal.component.tsx | 9 ++-- .../models/delete-models-modal.component.tsx | 6 ++- .../download-models-modal.component.tsx | 2 +- .../share-folders-modal.component.tsx | 21 +++++----- .../why-credentials-modal.component.tsx | 6 +-- .../components/modal/modal.component.tsx | 2 +- .../model-item.component.tsx | 22 +++++----- .../models-panel.component.tsx | 4 +- .../nav-bar/bsmanager-icon.component.tsx | 2 +- .../bsm-progress-bar.component.tsx | 2 +- .../supporter-item.component.tsx | 4 +- .../supporters-view.component.tsx | 4 +- .../shared/bs-content-nav-bar.component.tsx | 2 +- .../shared/bsm-button.component.tsx | 12 ++++-- .../shared/bsm-dropdown-button.component.tsx | 5 +-- .../components/shared/bsm-image.component.tsx | 1 - .../components/shared/bsm-link.component.tsx | 1 + .../shared/bsm-select.component.tsx | 2 +- .../svgs/icons/github-icon.component.tsx | 2 +- .../svgs/icons/mee6-icon.component.tsx | 10 ++--- .../icons/model-type-bloq-icon.component.tsx | 2 +- .../launch/launch-mod-toogle.component.tsx | 4 +- src/renderer/helpers/maps-utils.ts | 2 +- src/renderer/helpers/time-utils.ts | 8 ++-- src/renderer/hooks/use-click-outside.hook.ts | 2 +- .../services/bs-mods-manager.service.ts | 10 ++--- .../services/bs-version-manager.service.ts | 3 +- .../services/configuration.service.ts | 12 +++--- src/renderer/services/i18n.service.ts | 2 +- src/renderer/services/ipc.service.ts | 7 ++-- src/renderer/services/link-opener.service.ts | 3 +- src/renderer/services/modale.service.ts | 17 ++++---- .../models-manager.service.ts | 5 +-- src/renderer/services/notification.service.ts | 2 +- .../thrird-partys/beat-saver.service.ts | 2 +- .../services/version-folder-linker.service.ts | 2 +- src/renderer/windows/Launcher.tsx | 2 +- .../models/ipc/ipc-request.interface.ts | 1 - 55 files changed, 176 insertions(+), 181 deletions(-) delete mode 100644 src/renderer/components/maps-mangement-components/maps-toolbar.component.tsx diff --git a/.eslintrc.js b/.eslintrc.js index 97c4632c..5513c870 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -35,7 +35,17 @@ module.exports = { "no-useless-escape": "off", "jsx-a11y/no-noninteractive-element-interactions": "off", "no-async-promise-executor": "off", - "new-cap": "off" + "new-cap": "off", + "no-new": "off", + "no-plusplus": "off", + "react/jsx-props-no-spreading": "off", + "jsx-a11y/iframe-has-title": "off", + "import/no-dynamic-require": "off", + "radix": "off", + "jsx-a11y/alt-text": "off", + "react/prop-types": "off", + "import/no-cycle": "off", + "prefer-promise-reject-errors": "off" }, parserOptions: { ecmaVersion: 2020, diff --git a/src/main/ipcs/bs-version-ipcs.ts b/src/main/ipcs/bs-version-ipcs.ts index c74bd690..8bcda8d0 100644 --- a/src/main/ipcs/bs-version-ipcs.ts +++ b/src/main/ipcs/bs-version-ipcs.ts @@ -19,7 +19,7 @@ import { VersionFolderLinkerService } from '../services/version-folder-linker.se const ipc = IpcService.getInstance(); -ipcMain.on('bs-version.get-version-dict', (event, req: IpcRequest) => { +ipcMain.on('bs-version.get-version-dict', (_event, req: IpcRequest) => { BSVersionLibService.getInstance().getAvailableVersions().then(versions => { UtilsService.getInstance().ipcSend(req.responceChannel, {success: true, data: versions}); }).catch(() => { @@ -27,7 +27,7 @@ ipcMain.on('bs-version.get-version-dict', (event, req: IpcRequest) => { }) }); -ipcMain.on('bs-version.installed-versions', async (event, req: IpcRequest) => { +ipcMain.on('bs-version.installed-versions', async (_event, req: IpcRequest) => { BSLocalVersionService.getInstance().getInstalledVersions().then(versions => { UtilsService.getInstance().ipcSend(req.responceChannel, {success: true, data: versions}); }).catch(() => { @@ -35,7 +35,7 @@ ipcMain.on('bs-version.installed-versions', async (event, req: IpcRequest) }) }); -ipcMain.on("bs-version.open-folder", async (event, req: IpcRequest) => { +ipcMain.on("bs-version.open-folder", async (_event, req: IpcRequest) => { const localVersionService = BSLocalVersionService.getInstance(); const versionFolder = await localVersionService.getVersionPath(req.args); if (!(await pathExist(versionFolder))) @@ -43,7 +43,7 @@ ipcMain.on("bs-version.open-folder", async (event, req: IpcRequest) = shell.openPath(versionFolder); }); -ipcMain.on("bs-version.edit", async (event, req: IpcRequest<{version: BSVersion, name: string, color: string}>) => { +ipcMain.on("bs-version.edit", async (__event, req: IpcRequest<{version: BSVersion, name: string, color: string}>) => { BSLocalVersionService.getInstance().editVersion(req.args.version, req.args.name, req.args.color).then(res => { UtilsService.getInstance().ipcSend(req.responceChannel, {success: !!res, data: res}); }).catch((error: BsmException) => { @@ -51,7 +51,7 @@ ipcMain.on("bs-version.edit", async (event, req: IpcRequest<{version: BSVersion, }); }); -ipcMain.on("bs-version.clone", async (event, req: IpcRequest<{version: BSVersion, name: string, color: string}>) => { +ipcMain.on("bs-version.clone", async (_event, req: IpcRequest<{version: BSVersion, name: string, color: string}>) => { BSLocalVersionService.getInstance().cloneVersion(req.args.version, req.args.name, req.args.color).then(res => { UtilsService.getInstance().ipcSend(req.responceChannel, {success: !!res, data: res}); }).catch((error: BsmException) => { @@ -113,7 +113,7 @@ ipc.on("link-folder", async (req: IpcRequest<{ folder: string, options?: LinkOpt try{ const ipaData = (await readJSON(jsonIPAPath)) ?? {} as any; - ipaData["YeetMods"] = false; + ipaData.YeetMods = false; await writeJSON(jsonIPAPath, ipaData, {spaces: 4}); }catch(e){ log.error("Disable YeetMods", e); diff --git a/src/main/models/archive.class.ts b/src/main/models/archive.class.ts index 38bfffba..87f36c1a 100644 --- a/src/main/models/archive.class.ts +++ b/src/main/models/archive.class.ts @@ -2,9 +2,7 @@ import archiver from "archiver"; import { createWriteStream } from "fs"; import { Observable } from "rxjs"; import recursive from "recursive-readdir"; -import { lstatSync } from "fs"; import * as _path from "path"; -import { ArchiveProgress } from "shared/models/archive.interface"; import { Progression } from "main/helpers/fs.helpers"; export class Archive{ @@ -45,7 +43,7 @@ export class Archive{ public addFile(path: string, destPath?: string): void{ this.files.push(path); - destPath = destPath ||= _path.basename(path); + destPath ||= _path.basename(path); this.archive.file(path, {name: destPath}); } diff --git a/src/main/services/additional-content/local-models-manager.service.ts b/src/main/services/additional-content/local-models-manager.service.ts index 14613f4f..4aa278c4 100644 --- a/src/main/services/additional-content/local-models-manager.service.ts +++ b/src/main/services/additional-content/local-models-manager.service.ts @@ -14,13 +14,12 @@ import sanitize from "sanitize-filename"; import { Progression, ensureFolderExist, unlinkPath } from "../../helpers/fs.helpers"; import { MODEL_FILE_EXTENSIONS, MODEL_TYPES, MODEL_TYPE_FOLDERS } from "../../../shared/models/models/constants"; import { InstallationLocationService } from "../installation-location.service"; -import { Observable, Subscription, lastValueFrom, map } from "rxjs"; +import { Observable, Subscription, lastValueFrom } from "rxjs"; import { readdir } from "fs/promises"; import md5File from "md5-file"; import { allSettled } from "../../../shared/helpers/promise.helpers"; import { ModelSaberService } from "../thrid-party/model-saber/model-saber.service"; import { BsmLocalModel } from "shared/models/models/bsm-local-model.interface"; -import { ArchiveProgress } from "shared/models/archive.interface"; import { Archive } from "../../models/archive.class"; export class LocalModelsManagerService { @@ -66,7 +65,7 @@ export class LocalModelsManagerService { private openOneClickDownloadModelWindow(id: string, type: string){ - ipcMain.once("one-click-model-info", async (event, req: IpcRequest) => { + ipcMain.once("one-click-model-info", async (_event, req: IpcRequest) => { this.utils.ipcSend(req.responceChannel, {success: true, data: {id, type}}); }); @@ -76,7 +75,7 @@ export class LocalModelsManagerService { private async getModelFolderPath(type: MSModelType, version?: BSVersion): Promise{ - const rootPath = !!version ? await this.localVersion.getVersionPath(version) : this.installPaths.sharedContentPath; + const rootPath = version ? await this.localVersion.getVersionPath(version) : this.installPaths.sharedContentPath; const modelFolderPath = path.join(rootPath, MODEL_TYPE_FOLDERS[type]); await ensureFolderExist(modelFolderPath); @@ -95,7 +94,7 @@ export class LocalModelsManagerService { const modelFolder = await this.getModelFolderPath(model.type, version); const modelDest = path.join(modelFolder, sanitize(path.basename(model.download))); - let url = model.download.split("/"); + const url = model.download.split("/"); url[url.length - 1] = encodeURIComponent(url[url.length - 1]); const download$ = this.request.downloadFile(url.join("/"), modelDest); @@ -149,7 +148,6 @@ export class LocalModelsManagerService { const modelsPath = await this.getModelFolderPath(type, version); const files = await readdir(modelsPath, {withFileTypes: true}); - //return files.filter(file => file.isFile() && path.extname(file.name) === MODEL_FILE_EXTENSIONS[type]).map(file => path.join(modelsPath, file.name)); return files.reduce((acc, file) => { if(!file.isFile() || path.extname(file.name) !== MODEL_FILE_EXTENSIONS[type]){ return acc; } acc.push(path.join(modelsPath, file.name)); diff --git a/src/main/services/auto-updater.service.ts b/src/main/services/auto-updater.service.ts index 21cbdb77..51bbb9df 100644 --- a/src/main/services/auto-updater.service.ts +++ b/src/main/services/auto-updater.service.ts @@ -2,6 +2,7 @@ import { autoUpdater } from 'electron-updater'; import log from 'electron-log'; import { UtilsService } from './utils.service'; import { gt } from 'semver'; + export class AutoUpdaterService { private static instance: AutoUpdaterService; diff --git a/src/main/services/bs-launcher.service.ts b/src/main/services/bs-launcher.service.ts index 6908b7c1..3e449686 100644 --- a/src/main/services/bs-launcher.service.ts +++ b/src/main/services/bs-launcher.service.ts @@ -45,14 +45,14 @@ export class BSLauncherService{ private async backupSteamVR(): Promise{ const steamVrFolder = await this.getSteamVRPath(); if(!await pathExist(steamVrFolder)){ return; } - return rename(steamVrFolder, steamVrFolder + ".bak").catch(log.error); + return rename(steamVrFolder, `${steamVrFolder}.bak`).catch(log.error); } public async restoreSteamVR(): Promise{ const steamVrFolder = await this.getSteamVRPath(); - const steamVrBackup = steamVrFolder + ".bak"; + const steamVrBackup = `${steamVrFolder}.bak`; if(!await pathExist(steamVrBackup)){ return; } - return rename(steamVrFolder + ".bak", steamVrFolder).catch(log.error); + return rename(steamVrBackup, steamVrFolder).catch(log.error); } public async isBsRunning(): Promise { diff --git a/src/main/services/folder-linker.service.ts b/src/main/services/folder-linker.service.ts index 91512be6..51de86b9 100644 --- a/src/main/services/folder-linker.service.ts +++ b/src/main/services/folder-linker.service.ts @@ -31,7 +31,7 @@ export class FolderLinkerService { } private getBackupFolder(folderPath: string): string { - return folderPath + "_backup"; + return `${folderPath}_backup`; } private async backupFolder(folderPath: string): Promise { @@ -101,7 +101,7 @@ export class FolderLinkerService { public async isFolderSymlink(folder: string): Promise { try{ if(!(await pathExist(folder))){ return false; } - return lstat(folder).then(stat => stat.isSymbolicLink()); + return await lstat(folder).then(stat => stat.isSymbolicLink()); } catch(e){ log.error(e); diff --git a/src/main/services/mods/beat-mods-api.service.ts b/src/main/services/mods/beat-mods-api.service.ts index 74b4b79a..8a3d7fac 100644 --- a/src/main/services/mods/beat-mods-api.service.ts +++ b/src/main/services/mods/beat-mods-api.service.ts @@ -72,7 +72,7 @@ export class BeatModsApiService { } public async getAllMods(): Promise{ - if(!!this.allModsCache){ return this.allModsCache; } + if(this.allModsCache){ return this.allModsCache; } return this.requestService.getJSON(this.getAllModsUrl()).then(mods => { this.allModsCache = mods; return this.allModsCache; diff --git a/src/main/services/mods/bs-mods-manager.service.ts b/src/main/services/mods/bs-mods-manager.service.ts index ddff39ec..e6650907 100644 --- a/src/main/services/mods/bs-mods-manager.service.ts +++ b/src/main/services/mods/bs-mods-manager.service.ts @@ -5,17 +5,14 @@ import { BSLocalVersionService } from "../bs-local-version.service" import path from "path"; import { UtilsService } from "../utils.service"; import md5File from "md5-file"; -import fs from "fs" import { RequestService } from "../request.service"; import { spawn } from "child_process"; import { BS_EXECUTABLE } from "../../constants"; import log from "electron-log"; -import { deleteFolder, pathExist, unlinkPath } from "../../helpers/fs.helpers"; +import { deleteFolder, pathExist, unlinkPath, ensureFolderExist } from "../../helpers/fs.helpers"; import { lastValueFrom } from "rxjs"; import JSZip from "jszip" import { extractZip } from "../../helpers/zip.helpers"; -import { ensureFolderExist } from "../../helpers/fs.helpers"; -import { readdir } from "fs-extra"; import recursiveReadDir from "recursive-readdir"; export class BsModsManagerService { @@ -133,7 +130,7 @@ export class BsModsManagerService { resolve(false); }); - setTimeout(() => resolve(false), (1 * 60) * 1000); //timeout 1min + setTimeout(() => resolve(false), (1 * 60) * 1000); // timeout 1min }); } @@ -165,7 +162,7 @@ export class BsModsManagerService { return download.hashMd5.some(md5 => md5.hash === entryMd5) ? entry : undefined; }))).filter(entry => !!entry); - if(checkedEntries.length != download.hashMd5.length){ return false; } + if(checkedEntries.length !== download.hashMd5.length){ return false; } const verionPath = await this.bsLocalService.getVersionPath(version); const isBSIPA = mod.name.toLowerCase() === "bsipa"; @@ -260,7 +257,7 @@ export class BsModsManagerService { ]).then(dirMods => { const modsDict = new Map(); - if(!!bsipa){ modsDict.set(bsipa.name, bsipa); } + if(bsipa){ modsDict.set(bsipa.name, bsipa); } for(const mod of dirMods.flat()){ if(modsDict.has(mod.name)){ continue; } diff --git a/src/main/services/oculus.service.ts b/src/main/services/oculus.service.ts index 76aff725..d1705b46 100644 --- a/src/main/services/oculus.service.ts +++ b/src/main/services/oculus.service.ts @@ -21,7 +21,7 @@ export class OculusService { } public async oculusRunning(): Promise { - return await this.utils.taskRunning("OculusClient.exe"); + return this.utils.taskRunning("OculusClient.exe"); } public async getOculusLibsPath(): Promise{ @@ -36,9 +36,9 @@ export class OculusService { const libsPath = (await Promise.all(libsRegData.keys.map(async key => { const originalPath = (await regedit.promisified.list([`${oculusLibsRegKey}\\${key}`]))[`${oculusLibsRegKey}\\${key}`]; - if(!originalPath.exists || !libsRegData.values || !originalPath.values["OriginalPath"]){ return null; } + if(!originalPath.exists || !libsRegData.values || !originalPath.values.OriginalPath){ return null; } - return originalPath.values["OriginalPath"].value as string; + return originalPath.values.OriginalPath.value as string; }, []))).filter(path => !!path); diff --git a/src/main/services/request.service.ts b/src/main/services/request.service.ts index 51d4a3a0..eaf5741b 100644 --- a/src/main/services/request.service.ts +++ b/src/main/services/request.service.ts @@ -40,7 +40,7 @@ export class RequestService { const file = createWriteStream(dest); file.on("close", () => { - progress["data"] = dest; + progress.data = dest; subscriber.next(progress); subscriber.complete(); }); file.on("error", err => unlink(dest, () => subscriber.error(err))); diff --git a/src/main/services/steam.service.ts b/src/main/services/steam.service.ts index ba5c97e6..f98fbf87 100644 --- a/src/main/services/steam.service.ts +++ b/src/main/services/steam.service.ts @@ -38,7 +38,7 @@ export class SteamService{ if (process.platform === 'win32') { return !!(await this.getActiveUser()); } - return await psList() + return psList() .then(processes => !!processes.find(process => process.cmd.includes('steam'))) .catch(e => {log.error(e); throw e}) } @@ -47,26 +47,27 @@ export class SteamService{ if(this.steamPath){ return this.steamPath; } - switch (process.platform) { - case "linux": + if(process.platform === "win32"){ + const [win32Res, win64Res] = await Promise.all([ + regedit.promisified.list(['HKLM\\SOFTWARE\\Valve\\Steam']), + regedit.promisified.list(['HKLM\\SOFTWARE\\WOW6432Node\\Valve\\Steam']) + ]); + + const [win32, win64] = [win32Res["HKLM\\SOFTWARE\\Valve\\Steam"], win64Res["HKLM\\SOFTWARE\\WOW6432Node\\Valve\\Steam"]]; + + let res = ''; + if(win64.exists && win64?.values?.InstallPath?.value){ res = win64.values.InstallPath.value as string; } + else if(win32.exists && win32?.values?.InstallPath?.value){ res = win32.values.InstallPath.value as string; } + this.steamPath = res; + return res; + } + + if(process.platform === "linux"){ this.steamPath = path.join(app.getPath('home'), '.steam', "steam"); return this.steamPath; - case "win32": - const [win32Res, win64Res] = await Promise.all([ - regedit.promisified.list(['HKLM\\SOFTWARE\\Valve\\Steam']), - regedit.promisified.list(['HKLM\\SOFTWARE\\WOW6432Node\\Valve\\Steam']) - ]); - - const [win32, win64] = [win32Res["HKLM\\SOFTWARE\\Valve\\Steam"], win64Res["HKLM\\SOFTWARE\\WOW6432Node\\Valve\\Steam"]]; - - let res = ''; - if(win64.exists && win64?.values?.InstallPath?.value){ res = win64.values.InstallPath.value as string; } - else if(win32.exists && win32?.values?.InstallPath?.value){ res = win32.values.InstallPath.value as string; } - this.steamPath = res; - return res; - default: - return null; } + + return null; } public async getGameFolder(gameId: string, gameFolder?: string): Promise{ @@ -82,8 +83,8 @@ export class SteamService{ libraryFolders = libraryFolders.libraryfolders for(const libKey in Object.keys(libraryFolders)){ - if(!libraryFolders[libKey] || !libraryFolders[libKey]["apps"]){ continue; } - if(libraryFolders[libKey]["apps"][gameId] != null){ return path.join(libraryFolders[libKey]["path"], "steamapps", "common", gameFolder); }; + if(!libraryFolders[libKey] || !libraryFolders[libKey].apps){ continue; } + if(libraryFolders[libKey].apps[gameId] != null){ return path.join(libraryFolders[libKey].path, "steamapps", "common", gameFolder); }; } return null; } diff --git a/src/renderer/components/available-versions/available-version-item.component.tsx b/src/renderer/components/available-versions/available-version-item.component.tsx index 33d98bbf..b27d473c 100644 --- a/src/renderer/components/available-versions/available-version-item.component.tsx +++ b/src/renderer/components/available-versions/available-version-item.component.tsx @@ -52,6 +52,7 @@ export const AvailableVersionItem = memo(function AvailableVersionItem(props: {v {formatedDate} { props.version.ReleaseURL && ( + // eslint-disable-next-line jsx-a11y/anchor-is-valid -- link will be reworked { e.stopPropagation(); openReleasePage(); }} className="flex flex-row justify-between items-center rounded-full bg-black bg-opacity-30 text-white pb-px hover:bg-opacity-50"> {t("pages.available-versions.steam-release")} diff --git a/src/renderer/components/available-versions/available-versions-slide.component.tsx b/src/renderer/components/available-versions/available-versions-slide.component.tsx index 81921683..cc53717c 100644 --- a/src/renderer/components/available-versions/available-versions-slide.component.tsx +++ b/src/renderer/components/available-versions/available-versions-slide.component.tsx @@ -18,8 +18,8 @@ export function AvailableVersionsSlide(props: {year: string}) { return (
    - {availableVersions.map((version, index) => - + {availableVersions.map((version) => + )}
) diff --git a/src/renderer/components/maps-mangement-components/filter-panel.component.tsx b/src/renderer/components/maps-mangement-components/filter-panel.component.tsx index cca2e70e..9560022c 100644 --- a/src/renderer/components/maps-mangement-components/filter-panel.component.tsx +++ b/src/renderer/components/maps-mangement-components/filter-panel.component.tsx @@ -4,7 +4,7 @@ import { MutableRefObject, useEffect, useRef, useState} from "react" import { MAP_TYPES } from "renderer/partials/maps/map-tags/map-types" import { MAP_STYLES } from "renderer/partials/maps/map-tags/map-styles" import { BsmCheckbox } from "../shared/bsm-checkbox.component" -import { min_to_s } from "renderer/helpers/time-utils" +import { minToS } from "renderer/helpers/time-utils" import dateFormat from "dateformat" import { BsmRange } from "../shared/bsm-range.component" import { useTranslation } from "renderer/hooks/use-translation.hook" @@ -38,7 +38,7 @@ export function FilterPanel({className, ref, playlist = false, filter, onChange, const MAX_NPS = 17; const MIN_DURATION = 0; - const MAX_DURATION = min_to_s(30); + const MAX_DURATION = minToS(30); const npss = [filter?.minNps || MIN_NPS, filter?.maxNps || MAX_NPS]; const durations = [filter?.minDuration || MIN_DURATION, filter?.maxDuration || MAX_DURATION]; @@ -80,7 +80,7 @@ export function FilterPanel({className, ref, playlist = false, filter, onChange, } - const renderLabel = (text: unknown, isMax: boolean): JSX.Element => { + const renderLabel = (text: string|number, isMax: boolean): JSX.Element => { return ( {text} @@ -91,10 +91,10 @@ export function FilterPanel({className, ref, playlist = false, filter, onChange, const onNpssChange = ([min, max]: number[]) => { const newFilter: MapFilter = {...filter, minNps: min, maxNps: max}; if(max === MAX_NPS){ - delete newFilter["maxNps"]; + delete newFilter.maxNps; } if(min === MIN_NPS){ - delete newFilter["minNps"]; + delete newFilter.minNps; } onChange(newFilter); } @@ -102,10 +102,10 @@ export function FilterPanel({className, ref, playlist = false, filter, onChange, const onDurationsChange = ([min, max]: number[]) => { const newFilter: MapFilter = {...filter, minDuration: min, maxDuration: max}; if(max === MAX_DURATION){ - delete newFilter["maxDuration"]; + delete newFilter.maxDuration; } if(min === MIN_DURATION){ - delete newFilter["minDuration"]; + delete newFilter.minDuration; } onChange(newFilter); } @@ -129,11 +129,11 @@ export function FilterPanel({className, ref, playlist = false, filter, onChange, const newFilter = {...filter, enabledTags, excludedTags}; if(newFilter.enabledTags.size === 0){ - delete newFilter["enabledTags"]; + delete newFilter.enabledTags; } if(newFilter.excludedTags.size === 0){ - delete newFilter["excludedTags"]; + delete newFilter.excludedTags; } onChange(newFilter); 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 8e3b2fc9..f11b60da 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 @@ -2,12 +2,11 @@ import { MapsManagerService } from "renderer/services/maps-manager.service" import { BSVersion } from "shared/bs-version.interface" import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from "react" import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface" -import { Subscription } from "rxjs" +import { Subscription, BehaviorSubject } from "rxjs" import { MapFilter } from "shared/models/maps/beat-saver.model" import { MapsDownloaderService } from "renderer/services/maps-downloader.service" import { VariableSizeList } from "react-window" import { MapsRow } from "./maps-row.component" -import { BehaviorSubject } from "rxjs" import { debounceTime, last, mergeMap, tap } from "rxjs/operators" import { BeatSaverService } from "renderer/services/thrird-partys/beat-saver.service" import { OsDiagnosticService } from "renderer/services/os-diagnostic.service" @@ -121,7 +120,7 @@ export const LocalMapsListPanel = forwardRef(({version, className, filter, searc last(), mergeMap(async progress => { if(os.isOffline){ return progress.maps; } - const maps = progress.maps; + const { maps } = progress; const details = await bsaver.getMapDetailsFromHashs(maps.map(map => map.hash)); return maps.map(map => { map.bsaverInfo = details.find(d => d.versions.at(0).hash === map.hash); @@ -330,7 +329,7 @@ export const LocalMapsListPanel = forwardRef(({version, className, filter, searc return (
- 108} itemCount={preppedMaps.length} itemData={preppedMaps} layout="vertical" style={{scrollbarGutter: "stable both-edges"}} itemKey={(i, data) => data[i].map(map => map.hash).join()}> + 108} itemCount={preppedMaps.length} itemData={preppedMaps} layout="vertical" style={{scrollbarGutter: "stable both-edges"}} itemKey={(i, data) => data[i].map(map => map.hash).join()}> {(props) => }
diff --git a/src/renderer/components/maps-mangement-components/maps-toolbar.component.tsx b/src/renderer/components/maps-mangement-components/maps-toolbar.component.tsx deleted file mode 100644 index b78c2b57..00000000 --- a/src/renderer/components/maps-mangement-components/maps-toolbar.component.tsx +++ /dev/null @@ -1,11 +0,0 @@ -type Props = { - className?: string -} - -export function MapsToolbar({className}: Props) { - return ( -
- -
- ) -} 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 fb0e194d..7d50c945 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 @@ -9,7 +9,6 @@ import { useObservable } from "renderer/hooks/use-observable.hook"; import { BSV_SORT_ORDER } from "renderer/partials/beat-saver/sort-order"; import { BeatSaverService } from "renderer/services/thrird-partys/beat-saver.service"; import { MapsDownloaderService } from "renderer/services/maps-downloader.service"; -import { MapsManagerService } from "renderer/services/maps-manager.service"; import { ModalComponent } from "renderer/services/modale.service"; import { BSVersion } from "shared/bs-version.interface"; import { BsvMapCharacteristic, BsvMapDetail, MapFilter, SearchOrder, SearchParams } from "shared/models/maps/beat-saver.model"; @@ -21,7 +20,7 @@ import { useTranslation } from "renderer/hooks/use-translation.hook"; import { OsDiagnosticService } from "renderer/services/os-diagnostic.service"; import { BsmLocalMap } from "shared/models/maps/bsm-local-map.interface"; -export const DownloadMapsModal: ModalComponent = ({resolver, data: { ownedMaps, version }}) => { +export const DownloadMapsModal: ModalComponent = ({ data: { ownedMaps, version } }) => { const beatSaver = BeatSaverService.getInstance(); const mapsDownloader = MapsDownloaderService.getInstance(); @@ -173,7 +172,11 @@ export const DownloadMapsModal: ModalComponent  - {t(loading ? "modals.download-maps.loading-maps" : isOnline ? "modals.download-maps.no-maps-found" : "modals.download-maps.no-internet")} + {(() => { + 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"); + })()} ) : ( <> diff --git a/src/renderer/components/modal/modal-types/models/delete-models-modal.component.tsx b/src/renderer/components/modal/modal-types/models/delete-models-modal.component.tsx index 0a4dc1db..ace6d7b6 100644 --- a/src/renderer/components/modal/modal-types/models/delete-models-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/models/delete-models-modal.component.tsx @@ -25,7 +25,11 @@ export const DeleteModelsModal: ModalComponent isMultiple ? t("models.modals.delete-models.title") : t("models.modals.delete-model.title")); const desc = useConstant(() => isMultiple ? t("models.modals.delete-models.desc", {nb: `${data.models.length}`}) : t("models.modals.delete-model.desc", {modelName: data.models[0].model?.name ?? data.models[0].fileName})); - const linkedAnnotation = useConstant(() => data.linked ? (isMultiple ? t("models.modals.delete-models.linked-annotation") : t("models.modals.delete-model.linked-annotation")) : undefined); + const linkedAnnotation = useConstant(() => (() => { + if(!data.linked) return null; + if(isMultiple) return t("models.modals.delete-models.linked-annotation"); + return t("models.modals.delete-model.linked-annotation"); + })()); return (
diff --git a/src/renderer/components/modal/modal-types/models/download-models-modal.component.tsx b/src/renderer/components/modal/modal-types/models/download-models-modal.component.tsx index ccdc91f8..aac07dfd 100644 --- a/src/renderer/components/modal/modal-types/models/download-models-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/models/download-models-modal.component.tsx @@ -157,7 +157,7 @@ export const DownloadModelsModal: ModalComponent currentType$.next(value)}/>
searhInput$.next(e.target.value)}/> - +
diff --git a/src/renderer/components/modal/modal-types/share-folders-modal.component.tsx b/src/renderer/components/modal/modal-types/share-folders-modal.component.tsx index 8fb18622..6db7dbd7 100644 --- a/src/renderer/components/modal/modal-types/share-folders-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/share-folders-modal.component.tsx @@ -75,7 +75,7 @@ export const ShareFoldersModal: ModalComponent = ({ data }) =>

{t("modals.shared-folders.description")}

    {folders.map((folder, index) => ( - {removeFolder(index)}}/> + {removeFolder(index)}}/> ))}
@@ -151,16 +151,15 @@ const FolderItem = ({version, relativeFolder, onDelete}: FolderProps) => { - {!processing ? ( - !pending ? ( - {e.preventDefault(); onDelete?.()}}/> - ) : ( - {e.preventDefault(); cancelLink()}}/> - ) - ) : ( - - )} - + {(() => { + if(processing){ + return ; + } + if(pending){ + return {e.preventDefault(); cancelLink()}}/>; + } + return {e.preventDefault(); onDelete?.()}}/>; + })()}
) diff --git a/src/renderer/components/modal/modal-types/why-credentials-modal.component.tsx b/src/renderer/components/modal/modal-types/why-credentials-modal.component.tsx index b7afa9b9..8b958ccd 100644 --- a/src/renderer/components/modal/modal-types/why-credentials-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/why-credentials-modal.component.tsx @@ -1,9 +1,8 @@ -import { BsmButton } from "renderer/components/shared/bsm-button.component"; import { useTranslation } from "renderer/hooks/use-translation.hook"; import { LinkOpenerService } from "renderer/services/link-opener.service"; -import { ModalComponent, ModalExitCode } from "renderer/services/modale.service" +import { ModalComponent } from "renderer/services/modale.service" -export const WhyCredentialsModal: ModalComponent = ({resolver}) => { +export const WhyCredentialsModal: ModalComponent = () => { const t = useTranslation(); const linkOpener = LinkOpenerService.getInstance(); @@ -17,6 +16,7 @@ export const WhyCredentialsModal: ModalComponent = ({resolver}) => {

{t("modals.steam-credentials.title")}

{t("modals.steam-credentials.p-1")}

+ { /* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
{e.preventDefault; openTutorial()}} className="underline text-blue-600 hover:text-blue-900 dark:text-blue-400 dark:hover:text-blue-600 mb-2 block cursor-pointer"> https://steamcommunity.com/sharedfiles/filedetails/?id=1805934840 diff --git a/src/renderer/components/modal/modal.component.tsx b/src/renderer/components/modal/modal.component.tsx index 06e6abc4..2d190602 100644 --- a/src/renderer/components/modal/modal.component.tsx +++ b/src/renderer/components/modal/modal.component.tsx @@ -23,7 +23,7 @@ export function Modal() { resolver?.(ModalExitCode.NO_CHOICE); } - if(!!ModalComponent){ + if(ModalComponent){ window.addEventListener("keyup", onEscape) } else{ diff --git a/src/renderer/components/models-management/model-item.component.tsx b/src/renderer/components/models-management/model-item.component.tsx index ca9fcdc5..c2f136df 100644 --- a/src/renderer/components/models-management/model-item.component.tsx +++ b/src/renderer/components/models-management/model-item.component.tsx @@ -32,7 +32,7 @@ type Props = { onDoubleClick?: (value: T) => void } & Partial & Partial & Omit, "id" | "onDoubleClick"> -function modelItem(props: Props) { +function ModelItemElement(props: Props) { const t = useTranslation(); const color = useThemeColor("first-color"); @@ -66,7 +66,7 @@ function modelItem(props: Props) { if(!props.thumbnail){ return null; } if(isValidUrl(props.thumbnail)){ return props.thumbnail; } const [file, ext] = props.thumbnail.split("."); - return props.download.split("/").slice(0, -1).join("/") + `/${file}.${ext.toLowerCase()}`; + return `${props.download.split("/").slice(0, -1).join("/")}/${file}.${ext.toLowerCase()}` })(); const modelTags = (() => { @@ -74,19 +74,19 @@ function modelItem(props: Props) { return [...new Set(props.tags)]; })(); - const actionButtons = (): {icon: BsmIconType, action: () => void, iconColor?: string}[] => { - const buttons: {icon: BsmIconType, action: () => void, iconColor?: string}[] = []; + const actionButtons = (): {id: number, icon: BsmIconType, action: () => void, iconColor?: string}[] => { + const buttons: {id: number, icon: BsmIconType, action: () => void, iconColor?: string}[] = []; if(props.onDownload && !props.onCancelDownload){ - buttons.push({ icon: "download", action: () => props.onDownload(props.callbackValue) }); + buttons.push({id: 0, icon: "download", action: () => props.onDownload(props.callbackValue) }); } if(props.onDelete){ - buttons.push({ icon: "trash", action: () => props.onDelete(props.callbackValue) }); + buttons.push({ id: 1,icon: "trash", action: () => props.onDelete(props.callbackValue) }); } if(props.onCancelDownload){ - buttons.push({ icon: "cross", action: () => props.onCancelDownload(props.callbackValue), iconColor: "red" }); + buttons.push({ id: 2,icon: "cross", action: () => props.onCancelDownload(props.callbackValue), iconColor: "red" }); } return buttons; @@ -105,12 +105,12 @@ function modelItem(props: Props) {
- - + +
{!props.isDownloading ? ( actionButtons().map((button, index) => ( - {e.stopPropagation(); e.preventDefault(); button.action();}} withBar={false}/> + {e.stopPropagation(); e.preventDefault(); button.action();}} withBar={false}/> )) ): ( @@ -157,4 +157,4 @@ function modelItem(props: Props) { const typedMemo: (c: T, propsAreEqual?: (prevProps: Readonly

, nextProps: Readonly

) => boolean) => T = memo; -export const ModelItem = typedMemo(modelItem, equal); +export const ModelItem = typedMemo(ModelItemElement, equal); diff --git a/src/renderer/components/models-management/models-panel.component.tsx b/src/renderer/components/models-management/models-panel.component.tsx index 14668d14..3f19d179 100644 --- a/src/renderer/components/models-management/models-panel.component.tsx +++ b/src/renderer/components/models-management/models-panel.component.tsx @@ -13,7 +13,7 @@ import { useOnUpdate } from "renderer/hooks/use-on-update.hook"; import { NotificationService } from "renderer/services/notification.service"; import { ConfigurationService } from "renderer/services/configuration.service"; import { useTranslation } from "renderer/hooks/use-translation.hook"; -import { gte, lt } from "semver"; +import { lt } from "semver"; export function ModelsPanel({version, isActive, goToMods}: {version?: BSVersion, isActive: boolean, goToMods?: () => void}) { @@ -85,7 +85,7 @@ export function ModelsPanel({version, isActive, goToMods}: {version?: BSVersion,

- {setModelTypeTab(() => tab.extra), setCurrentTabIndex(() => index)}}/> + {setModelTypeTab(() => tab.extra); setCurrentTabIndex(() => index)}}/>
diff --git a/src/renderer/components/nav-bar/bsmanager-icon.component.tsx b/src/renderer/components/nav-bar/bsmanager-icon.component.tsx index 09a3bc2a..8caceb60 100644 --- a/src/renderer/components/nav-bar/bsmanager-icon.component.tsx +++ b/src/renderer/components/nav-bar/bsmanager-icon.component.tsx @@ -13,7 +13,7 @@ export const BsManagerIcon = memo(({className}: {className?: string}) => { const {firstColor, secondColor} = useThemeColor(); const playing= useObservable(audioPlayer.playing$); - const bpm = audioPlayer.bpm; + const { bpm } = audioPlayer; const transitions: Variants = { playing: { diff --git a/src/renderer/components/progress-bar/bsm-progress-bar.component.tsx b/src/renderer/components/progress-bar/bsm-progress-bar.component.tsx index 6fb231a8..49725adc 100644 --- a/src/renderer/components/progress-bar/bsm-progress-bar.component.tsx +++ b/src/renderer/components/progress-bar/bsm-progress-bar.component.tsx @@ -34,7 +34,7 @@ export function BsmProgressBar() { {progressLabel}
)} - { !progressValue && } + { !progressValue && }
} diff --git a/src/renderer/components/settings/supporters-view/supporter-item.component.tsx b/src/renderer/components/settings/supporters-view/supporter-item.component.tsx index ea15ee4a..b74d9119 100644 --- a/src/renderer/components/settings/supporters-view/supporter-item.component.tsx +++ b/src/renderer/components/settings/supporters-view/supporter-item.component.tsx @@ -21,13 +21,13 @@ export function SupporterItem({supporter, delay}: Props) { })(); const renderSpan = () => { - return {supporter.username}; + return {supporter.username}; } const renderItem = () => { if(supporter.type !== "sponsor"){ return renderSpan(); } return ( - + {renderSpan()} diff --git a/src/renderer/components/settings/supporters-view/supporters-view.component.tsx b/src/renderer/components/settings/supporters-view/supporters-view.component.tsx index 847e97f1..63ac7a85 100644 --- a/src/renderer/components/settings/supporters-view/supporters-view.component.tsx +++ b/src/renderer/components/settings/supporters-view/supporters-view.component.tsx @@ -32,8 +32,8 @@ export function SupportersView({isVisible, setVisible}: Props) { ({isVisible && - setVisible(false)}> - {(!!sponsors.length || !!supporters.length) && } + setVisible(false)}/> + {(!!sponsors.length || !!supporters.length) && }
{!!sponsors.length && } {!!supporters.length && } diff --git a/src/renderer/components/shared/bs-content-nav-bar.component.tsx b/src/renderer/components/shared/bs-content-nav-bar.component.tsx index f68ef852..b59b7189 100644 --- a/src/renderer/components/shared/bs-content-nav-bar.component.tsx +++ b/src/renderer/components/shared/bs-content-nav-bar.component.tsx @@ -24,7 +24,7 @@ export function BsContentNavBar({className, tabIndex, tabs, renderTab, onTabC return (