From 7f3a55cee47cb91694d84338cc50591982fa3207 Mon Sep 17 00:00:00 2001 From: shidorien Date: Fri, 5 Jan 2024 22:53:47 +0100 Subject: [PATCH 01/27] Add translations for map characteristics and map item actions --- assets/jsons/translations/en.json | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 625c0405..28a9b1b6 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -728,6 +728,8 @@ "maps": { "map-filter-panel": { "duration": "Duration", + "nps" : "Notes Per Second", + "nps-abbr" : "NPS", "tags": "tags", "specificities": "general", "requirements": "requirements" @@ -793,9 +795,24 @@ "Expert": "expert", "ExpertPlus": "expert+" }, + "map-Characteristics": { + "Standard": "standard", + "OneSaber": "one saber", + "NoArrows": "no arrows", + "90Degree": "90°", + "360Degree": "360°", + "Lightshow": "lightshow", + "Lawless": "lawless" + }, "map-item": { "by": "By {songAutor}", - "mapped-by": "mapped by" + "mapped-by": "mapped by", + "delete": "Delete", + "preview" : "Preview map", + "bsr-code" : "BSR code", + "download" : "Download map", + "downloading" :"Downloading map", + "cancel-download" : "Cancel download" } }, "models": { From 79be8a8173394f08fb8567eddc668e7261108e16 Mon Sep 17 00:00:00 2001 From: shidorien Date: Fri, 5 Jan 2024 22:53:54 +0100 Subject: [PATCH 02/27] Add styles for tooltips --- src/renderer/index.css | 21 +++++++++++++++++++++ src/renderer/index.tsx | 1 + 2 files changed, 22 insertions(+) diff --git a/src/renderer/index.css b/src/renderer/index.css index b8730906..3ad6255b 100644 --- a/src/renderer/index.css +++ b/src/renderer/index.css @@ -19,6 +19,7 @@ } * { + user-select: none; } @@ -78,6 +79,26 @@ background: rgba(0, 0, 0, 0.25); } + + +.tippy-box[data-theme~='default'] { + @apply !bg-neutral-900; + color: #fff; +} + +.tippy-box[data-theme~='default'][data-placement^='top'] > .tippy-arrow::before { + @apply !border-t-neutral-900 +} +.tippy-box[data-theme~='default'][data-placement^='bottom'] > .tippy-arrow::before { + @apply !border-b-neutral-900 +} +.tippy-box[data-theme~='default'][data-placement^='left'] > .tippy-arrow::before { + @apply !border-l-neutral-900 +} +.tippy-box[data-theme~='default'][data-placement^='right'] > .tippy-arrow::before { + @apply !border-r-neutral-900 +} + @keyframes glowing { 0% { background-position: 0 0; diff --git a/src/renderer/index.tsx b/src/renderer/index.tsx index befd5df7..66e121a6 100644 --- a/src/renderer/index.tsx +++ b/src/renderer/index.tsx @@ -1,6 +1,7 @@ import { createRoot } from "react-dom/client"; import { HashRouter } from "react-router-dom"; import "tailwindcss/tailwind.css"; + import "./index.css"; import { IpcService } from "./services/ipc.service"; import { ThemeService } from "./services/theme.service"; From 395b6704fdb10425f37c9836b8ba9bd0b77b142c Mon Sep 17 00:00:00 2001 From: shidorien Date: Fri, 5 Jan 2024 22:54:41 +0100 Subject: [PATCH 03/27] add tippy --- .../map-item.component.tsx | 135 +++++++++++------- 1 file changed, 81 insertions(+), 54 deletions(-) diff --git a/src/renderer/components/maps-mangement-components/map-item.component.tsx b/src/renderer/components/maps-mangement-components/map-item.component.tsx index b71ccd33..71cc59ca 100644 --- a/src/renderer/components/maps-mangement-components/map-item.component.tsx +++ b/src/renderer/components/maps-mangement-components/map-item.component.tsx @@ -21,6 +21,7 @@ import useDoubleClick from "use-double-click"; import { GlowEffect } from "../shared/glow-effect.component"; import { useDelayedState } from "renderer/hooks/use-delayed-state.hook"; import { useService } from "renderer/hooks/use-service.hook"; +import Tippy from "@tippyjs/react"; export type ParsedMapDiff = { type: BsvMapDifficultyType; name: string; stars: number }; @@ -51,7 +52,7 @@ export type MapItemProps = { }; export const MapItem = memo(({ hash, title, autor, songAutor, coverUrl, songUrl, autorId, mapId, diffs, ranked, bpm, duration, likes, createdAt, selected, downloading, showOwned, callBackParam, onDelete, onDownload, onSelected, onCancelDownload, onDoubleClick }: MapItemProps) => { - + const linkOpener = useService(LinkOpenerService); const audioPlayer = useService(AudioPlayerService); @@ -156,25 +157,25 @@ export const MapItem = memo(({ hash, title, autor, songAutor, coverUrl, songUrl, return ( setHovered(true)} onHoverEnd={() => setHovered(false)} style={{ zIndex: hovered && 5, transform: "translateZ(0) scale(1.0, 1.0)", backfaceVisibility: "hidden" }}> - - {(diffsPanelHovered || bottomBarHovered) && ( - - {Array.from(diffs.entries()).map(([charac, diffSet]) => ( -
    - {diffSet.map(({ type, name, stars }) => ( -
  1. - - - {stars ? ★ {stars} : {parseDiffLabel(type)}} - - {parseDiffLabel(name)} -
  2. - ))} -
- ))} -
- )} -
+ + {(diffsPanelHovered || bottomBarHovered) && ( + + {Array.from(diffs.entries()).map(([charac, diffSet]) => ( +
    + {diffSet.map(({ type, name, stars }) => ( +
  1. + + + {stars ? ★ {stars} : {parseDiffLabel(type)}} + + {parseDiffLabel(name)} +
  2. + ))} +
+ ))} +
+ )} +
@@ -246,46 +247,66 @@ export const MapItem = memo(({ hash, title, autor, songAutor, coverUrl, songUrl,
{onDelete && !downloading && ( - { - e.stopPropagation(); - onDelete(callBackParam); - }} - /> + +
+ { + e.stopPropagation(); + onDelete(callBackParam); + }} + /> +
+
)} {onDownload && !downloading && ( - { - e.stopPropagation(); - onDownload(callBackParam); - }} - /> + +
+ { + e.stopPropagation(); + onDownload(callBackParam); + }} + /> +
+
)} {onCancelDownload && !downloading && ( - { - e.stopPropagation(); - onCancelDownload(callBackParam); - }} - /> + +
+ { + e.stopPropagation(); + onCancelDownload(callBackParam); + }} + /> +
+
)} - {downloading && } + {downloading && + +
+ +
+
+ } {previewUrl && ( + +
+
+
)} {mapId && ( + +
+
+
)}
From 54f24d93a38b35cae693cfc5ba727390442d6eed Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sat, 6 Jan 2024 14:49:07 +0100 Subject: [PATCH 04/27] [bugfix] Handle oculus library doesnt have OriginaPath value Added a method to resolve GUID path to resolve Path value in oculus library reg --- src/main/helpers/fs.helpers.ts | 17 +++++++++++++ .../bs-launcher/oculus-launcher.service.ts | 6 ++++- src/main/services/oculus.service.ts | 25 ++++++++++++++++--- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/src/main/helpers/fs.helpers.ts b/src/main/helpers/fs.helpers.ts index ec64701e..03e833e4 100644 --- a/src/main/helpers/fs.helpers.ts +++ b/src/main/helpers/fs.helpers.ts @@ -5,6 +5,7 @@ import { Observable, concatMap, from } from "rxjs"; import log from "electron-log"; import { BsmException } from "shared/models/bsm-exception.model"; import crypto from "crypto"; +import { execSync } from "child_process"; export async function pathExist(path: string): Promise { try { @@ -232,6 +233,22 @@ export async function isJunction(path: string): Promise{ return lstats.isSymbolicLink() && stats.isDirectory(); } +export function resolveGUIDPath(guidPath: string): string { + log.info("resolveGUIDPath", guidPath); + const guidVolume = path.parse(guidPath).root; + log.info("guidVolume", guidVolume); + const command = `powershell -command "(Get-WmiObject -Class Win32_Volume | Where-Object { $_.DeviceID -like '${guidVolume}' }).DriveLetter"`; + log.info("command", command); + const driveLetter = execSync(command).toString().trim(); + log.info("driveLetter", driveLetter); + if (!driveLetter) { + log.error("Unable to resolve GUID path"); + throw new Error("Unable to resolve GUID path"); + } + log.info("result guid", path.join(driveLetter, path.relative(guidVolume, guidPath))); + return path.join(driveLetter, path.relative(guidVolume, guidPath)); +} + export interface Progression { total: number; current: number; diff --git a/src/main/services/bs-launcher/oculus-launcher.service.ts b/src/main/services/bs-launcher/oculus-launcher.service.ts index 2cf7f7e8..92831375 100644 --- a/src/main/services/bs-launcher/oculus-launcher.service.ts +++ b/src/main/services/bs-launcher/oculus-launcher.service.ts @@ -34,7 +34,10 @@ export class OculusLauncherService extends AbstractLauncherService implements St this.pathsService = InstallationLocationService.getInstance(); this.oculus.tryGetGameFolder([OCULUS_BS_DIR, OCULUS_BS_BACKUP_DIR]).then(async dirPath => { - if(dirPath){ return this.oculusLib$.next( path.join(dirPath, "..") ); } + if(dirPath){ + log.info("Oculus game found", dirPath); + return this.oculusLib$.next( path.join(dirPath, "..") ); + } const defaultLib = ((await this.oculus.getOculusLibs()) || []).find(lib => lib.isDefault); if(defaultLib?.path){ return this.oculusLib$.next(path.join(defaultLib.path, "Software")); } this.oculusLib$.next(null); @@ -48,6 +51,7 @@ export class OculusLauncherService extends AbstractLauncherService implements St const oculusLibPath = await lastValueFrom(this.oculusLib$.pipe(take(1), timeout(sToMs(30)), catchError(() => of(null)))); if(!oculusLibPath || !(await pathExists(oculusLibPath))){ + log.error("oculusLibPath value", oculusLibPath, "Path exists", await pathExists(oculusLibPath)); throw new Error("Oculus library not found, deleteBsSymlinks"); } diff --git a/src/main/services/oculus.service.ts b/src/main/services/oculus.service.ts index 349e96c0..dd4dc581 100644 --- a/src/main/services/oculus.service.ts +++ b/src/main/services/oculus.service.ts @@ -1,8 +1,9 @@ import { list } from "regedit-rs"; import path from "path"; -import { pathExist } from "../helpers/fs.helpers"; +import { pathExist, resolveGUIDPath } from "../helpers/fs.helpers"; import log from "electron-log"; import { lstat } from "fs-extra"; +import { tryit } from "../../shared/helpers/error.helpers"; export class OculusService { private static instance: OculusService; @@ -31,6 +32,11 @@ export class OculusService { const oculusLibsRegKey = "HKCU\\SOFTWARE\\Oculus VR, LLC\\Oculus\\Libraries"; const libsRegData = await list(oculusLibsRegKey).then(data => data[oculusLibsRegKey]); + log.info("Oculus libraries registry data", "exists:", libsRegData.exists, "keys:", "values:", libsRegData.keys, (() => { + const values = Object.entries(libsRegData.values ?? []); + return values.map(([name, value]) => [name, value.value]); + })()); + if (!libsRegData.keys?.length) { log.info("Registry key \"HKCU\\SOFTWARE\\Oculus VR, LLC\\Oculus\\Libraries\" not found"); return null; @@ -41,12 +47,22 @@ export class OculusService { const libsPath: OculusLibrary[] = ( await Promise.all(libsRegData.keys.map(async key => { const originalPath = await list([`${oculusLibsRegKey}\\${key}`]).then(res => res[`${oculusLibsRegKey}\\${key}`]); + + log.info("Value in key", key, "is", (() => { + const values = Object.entries(originalPath.values ?? []); + return values.map(([name, value]) => [name, value.value]); + })()); - if (!originalPath.values?.OriginalPath) { - return null; + if (originalPath.values?.OriginalPath) { + return { id: key, path: originalPath.values.OriginalPath.value, isDefault: defaultLibraryId === key } as OculusLibrary; + } + + if(originalPath.values?.Path) { + const { result } = tryit(() => resolveGUIDPath(originalPath.values.Path.value as string)); + return result ? { id: key, path: result, isDefault: defaultLibraryId === key } as OculusLibrary : null; } - return { id: key, path: originalPath.values.OriginalPath.value, isDefault: defaultLibraryId === key } as OculusLibrary + return null; }, [])) ).filter(Boolean); @@ -81,6 +97,7 @@ export class OculusService { public async tryGetGameFolder(gameFolders: string[]): Promise { for(const gameFolder of gameFolders){ const fullPath = await this.getGameFolder(gameFolder); + log.info("Oculus game folder", gameFolder, "fullPath", fullPath); if(fullPath){ return fullPath; } } From 05a3a383eeba6863c1c6bb4f58941a226593328a Mon Sep 17 00:00:00 2001 From: shidorien Date: Sat, 6 Jan 2024 20:44:23 +0100 Subject: [PATCH 05/27] Remove unused map characteristics translations --- assets/jsons/translations/en.json | 9 --------- 1 file changed, 9 deletions(-) diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 28a9b1b6..b54ba29d 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -795,15 +795,6 @@ "Expert": "expert", "ExpertPlus": "expert+" }, - "map-Characteristics": { - "Standard": "standard", - "OneSaber": "one saber", - "NoArrows": "no arrows", - "90Degree": "90°", - "360Degree": "360°", - "Lightshow": "lightshow", - "Lawless": "lawless" - }, "map-item": { "by": "By {songAutor}", "mapped-by": "mapped by", From f448f023f88bb36cab6b343eccc97e0a3ad22123 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sat, 6 Jan 2024 20:44:52 +0100 Subject: [PATCH 06/27] Remove unused import statement --- src/renderer/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/renderer/index.tsx b/src/renderer/index.tsx index 66e121a6..befd5df7 100644 --- a/src/renderer/index.tsx +++ b/src/renderer/index.tsx @@ -1,7 +1,6 @@ import { createRoot } from "react-dom/client"; import { HashRouter } from "react-router-dom"; import "tailwindcss/tailwind.css"; - import "./index.css"; import { IpcService } from "./services/ipc.service"; import { ThemeService } from "./services/theme.service"; From fcad40ec66617dd15d683fca787c829ba4be5eb8 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 00:26:10 +0100 Subject: [PATCH 07/27] Update filter panel component --- .../filter-panel.component.tsx | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) 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 5332c5ce..c9f701b7 100644 --- a/src/renderer/components/maps-mangement-components/filter-panel.component.tsx +++ b/src/renderer/components/maps-mangement-components/filter-panel.component.tsx @@ -56,7 +56,7 @@ export function FilterPanel({ className, ref, playlist = false, filter, onChange const renderDurationLabel = (sec: number): JSX.Element => { const textValue = (() => { if (sec === MIN_DURATION) { - return t("maps.map-filter-panel.duration"); + return "0"; } if (sec === MAX_DURATION) { return "∞"; @@ -72,7 +72,7 @@ export function FilterPanel({ className, ref, playlist = false, filter, onChange const renderNpsLabel = (nps: number): JSX.Element => { const textValue = (() => { if (nps === MIN_NPS) { - return "NPS"; + return "0" } if (nps === MAX_NPS) { return "∞"; @@ -167,9 +167,13 @@ export function FilterPanel({ className, ref, playlist = false, filter, onChange return !playlist ? ( -
- - + +
+ + + + {t("maps.map-filter-panel.nps")} + {t("maps.map-filter-panel.duration")}
From 902ca819c548f81b277f27b676ced1050c11a52c Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 00:27:52 +0100 Subject: [PATCH 08/27] Remove unused abbreviation for NPS --- assets/jsons/translations/en.json | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index b54ba29d..9995d535 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -729,7 +729,6 @@ "map-filter-panel": { "duration": "Duration", "nps" : "Notes Per Second", - "nps-abbr" : "NPS", "tags": "tags", "specificities": "general", "requirements": "requirements" From 0b1f36cc9618464102fd07d9e184c4fc565b3a73 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 00:44:17 +0100 Subject: [PATCH 09/27] Add translations --- assets/jsons/translations/de.json | 9 ++++++++- assets/jsons/translations/es.json | 9 ++++++++- assets/jsons/translations/fr.json | 9 ++++++++- assets/jsons/translations/ja.json | 9 ++++++++- assets/jsons/translations/ru.json | 9 ++++++++- assets/jsons/translations/zh-tw.json | 9 ++++++++- assets/jsons/translations/zh.json | 9 ++++++++- 7 files changed, 56 insertions(+), 7 deletions(-) diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json index 4a631259..d4cf9904 100644 --- a/assets/jsons/translations/de.json +++ b/assets/jsons/translations/de.json @@ -728,6 +728,7 @@ "maps": { "map-filter-panel": { "duration": "Länge", + "nps" : "Noten pro Sekunde", "tags": "Stichworte", "specificities": "Allgemein", "requirements": "Anforderungen" @@ -795,7 +796,13 @@ }, "map-item": { "by": "Von {songAutor}", - "mapped-by": "Gemapped von" + "mapped-by": "Gemapped von", + "delete": "Löschen", + "preview" : "Kartenvorschau", + "bsr-code" : "BSR Code", + "download" : "Karte herunterladen", + "downloading" :"Karte wird heruntergeladen", + "cancel-download" : "Download abbrechen" } }, "models": { diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index 67441fa6..31a77dcc 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -727,6 +727,7 @@ "maps": { "map-filter-panel": { "duration": "Duración", + "nps" : "Notas por Segundo", "tags": "tags", "specificities": "general", "requirements": "requisitos" @@ -794,7 +795,13 @@ }, "map-item": { "by": "Por {songAutor}", - "mapped-by": "mapeado por" + "mapped-by": "mapeado por", + "delete": "Eliminar", + "preview" : "Vista previa del mapa", + "bsr-code" : "Código BSR", + "download" : "Descargar mapa", + "downloading" :"Descargando mapa", + "cancel-download" : "Cancelar descarga" } }, "models": { diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 7631e256..495972f6 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -724,6 +724,7 @@ "maps": { "map-filter-panel": { "duration": "Durée", + "nps" : "Notes par Seconde", "tags": "tags", "specificities": "général", "requirements": "requis" @@ -791,7 +792,13 @@ }, "map-item": { "by": "Par {songAutor}", - "mapped-by": "mappée par" + "mapped-by": "mappée par", + "delete": "Supprimer", + "preview" : "Aperçu de la carte", + "bsr-code" : "Code BSR", + "download" : "Télécharger la carte", + "downloading" :"Téléchargement de la carte", + "cancel-download" : "Annuler le téléchargement" } }, "models": { diff --git a/assets/jsons/translations/ja.json b/assets/jsons/translations/ja.json index 65132a6a..f2284a4e 100644 --- a/assets/jsons/translations/ja.json +++ b/assets/jsons/translations/ja.json @@ -728,6 +728,7 @@ "maps": { "map-filter-panel": { "duration": "尺", + "nps" : "秒間ノート数", "tags": "タグ", "specificities": "一般", "requirements": "要Mod" @@ -795,7 +796,13 @@ }, "map-item": { "by": "By {songAutor}", - "mapped-by": "作成者 " + "mapped-by": "作成者 ", + "delete": "削除", + "preview" : "マッププレビュー", + "bsr-code" : "BSRコード", + "download" : "マップをダウンロード", + "downloading" :"マップをダウンロード中", + "cancel-download" : "ダウンロードをキャンセル" } }, "models": { diff --git a/assets/jsons/translations/ru.json b/assets/jsons/translations/ru.json index f1e289e6..9b31d3c9 100644 --- a/assets/jsons/translations/ru.json +++ b/assets/jsons/translations/ru.json @@ -728,6 +728,7 @@ "maps": { "map-filter-panel": { "duration": "Длительность", + "nps" : "Нот в Секунду", "tags": "тэги", "specificities": "основное", "requirements": "требуемые моды" @@ -795,7 +796,13 @@ }, "map-item": { "by": "От {songAutor}", - "mapped-by": "автор карты " + "mapped-by": "автор карты ", + "delete": "Удалить", + "preview" : "Предпросмотр карты", + "bsr-code" : "Код BSR", + "download" : "Скачать карту", + "downloading" :"Загрузка карты", + "cancel-download" : "Отменить загрузку" } }, "models": { diff --git a/assets/jsons/translations/zh-tw.json b/assets/jsons/translations/zh-tw.json index cf2e71b2..35739258 100644 --- a/assets/jsons/translations/zh-tw.json +++ b/assets/jsons/translations/zh-tw.json @@ -729,6 +729,7 @@ "maps": { "map-filter-panel": { "duration": "時長", + "nps" : "每秒音符數", "tags": "標籤", "specificities": "general", "requirements": "要求" @@ -796,7 +797,13 @@ }, "map-item": { "by": "By {songAutor}", - "mapped-by": "mapped by" + "mapped-by": "mapped by", + "delete": "刪除", + "preview" : "預覽地圖", + "bsr-code" : "BSR代碼", + "download" : "下載地圖", + "downloading" :"正在下載地圖", + "cancel-download" : "取消下載" } }, "models": { diff --git a/assets/jsons/translations/zh.json b/assets/jsons/translations/zh.json index 2e806fc0..46617d51 100644 --- a/assets/jsons/translations/zh.json +++ b/assets/jsons/translations/zh.json @@ -729,6 +729,7 @@ "maps": { "map-filter-panel": { "duration": "时长", + "nps" : "每秒音符数", "tags": "标签", "specificities": "general", "requirements": "要求" @@ -796,7 +797,13 @@ }, "map-item": { "by": "By {songAutor}", - "mapped-by": "mapped by" + "mapped-by": "mapped by", + "delete": "删除", + "preview" : "预览地图", + "bsr-code" : "BSR代码", + "download" : "下载地图", + "downloading" :"正在下载地图", + "cancel-download" : "取消下载" } }, "models": { From 4c7a61ecd0f0055791e1367eb655a374bb1a3a09 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 00:57:26 +0100 Subject: [PATCH 10/27] Update translation for delete button in Spanish --- assets/jsons/translations/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index 31a77dcc..a6c831aa 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -796,7 +796,7 @@ "map-item": { "by": "Por {songAutor}", "mapped-by": "mapeado por", - "delete": "Eliminar", + "delete": "Borrar", "preview" : "Vista previa del mapa", "bsr-code" : "Código BSR", "download" : "Descargar mapa", From 32cab3d4eb93f6e216ceafa6d4e675f528299438 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 01:06:25 +0100 Subject: [PATCH 11/27] Update translations for de.json, es.json, and fr.json --- assets/jsons/translations/de.json | 2 +- assets/jsons/translations/es.json | 2 +- assets/jsons/translations/fr.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json index d4cf9904..443cee50 100644 --- a/assets/jsons/translations/de.json +++ b/assets/jsons/translations/de.json @@ -728,7 +728,7 @@ "maps": { "map-filter-panel": { "duration": "Länge", - "nps" : "Noten pro Sekunde", + "nps" : "Noten Pro Sekunde", "tags": "Stichworte", "specificities": "Allgemein", "requirements": "Anforderungen" diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index a6c831aa..f4aa37e6 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -727,7 +727,7 @@ "maps": { "map-filter-panel": { "duration": "Duración", - "nps" : "Notas por Segundo", + "nps" : "Notas Por Segundo", "tags": "tags", "specificities": "general", "requirements": "requisitos" diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 495972f6..0b24017b 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -724,7 +724,7 @@ "maps": { "map-filter-panel": { "duration": "Durée", - "nps" : "Notes par Seconde", + "nps" : "Notes Par Seconde", "tags": "tags", "specificities": "général", "requirements": "requis" From 40ecf536d0624338e00994654eb4d0476870e97a Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 01:17:29 +0100 Subject: [PATCH 12/27] Remove unused translation --- assets/jsons/translations/de.json | 4 ---- assets/jsons/translations/en.json | 4 ---- assets/jsons/translations/es.json | 4 +--- assets/jsons/translations/fr.json | 3 --- assets/jsons/translations/ja.json | 4 ---- assets/jsons/translations/ru.json | 4 ---- assets/jsons/translations/zh-tw.json | 4 ---- assets/jsons/translations/zh.json | 4 ---- 8 files changed, 1 insertion(+), 30 deletions(-) diff --git a/assets/jsons/translations/de.json b/assets/jsons/translations/de.json index 443cee50..a2781aef 100644 --- a/assets/jsons/translations/de.json +++ b/assets/jsons/translations/de.json @@ -25,9 +25,6 @@ } }, "pages": { - "shared-maps": { - "title": "Geteilte Maps" - }, "version-viewer": { "launch-mods": { "oculus": "Oculus Modus", @@ -42,7 +39,6 @@ } }, "maps": { - "title": "Geteilte Maps", "search-bar": { "search-placeholder": "Suche eine Map", "filters-btn": "Filter", diff --git a/assets/jsons/translations/en.json b/assets/jsons/translations/en.json index 9995d535..2bf32c3c 100644 --- a/assets/jsons/translations/en.json +++ b/assets/jsons/translations/en.json @@ -25,9 +25,6 @@ } }, "pages": { - "shared-maps": { - "title": "Shared maps" - }, "version-viewer": { "launch-mods": { "oculus": "Oculus Mode", @@ -42,7 +39,6 @@ } }, "maps": { - "title": "Shared maps", "search-bar": { "search-placeholder": "Search a map", "filters-btn": "Filters", diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index f4aa37e6..5ff9abeb 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -25,9 +25,7 @@ } }, "pages": { - "shared-maps": { - "title": "Mapas comunes" - }, + "version-viewer": { "launch-mods": { "oculus": "Modo Oculus", diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 0b24017b..490062fe 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -25,9 +25,6 @@ } }, "pages": { - "shared-maps": { - "title": "Maps partagées" - }, "version-viewer": { "launch-mods": { "oculus": "Mode Oculus", diff --git a/assets/jsons/translations/ja.json b/assets/jsons/translations/ja.json index f2284a4e..a6a798ac 100644 --- a/assets/jsons/translations/ja.json +++ b/assets/jsons/translations/ja.json @@ -25,9 +25,6 @@ } }, "pages": { - "shared-maps": { - "title": "共有マップ" - }, "version-viewer": { "launch-mods": { "oculus": "Oculusモード", @@ -42,7 +39,6 @@ } }, "maps": { - "title": "共有マップ", "search-bar": { "search-placeholder": "マップを検索", "filters-btn": "絞り込み", diff --git a/assets/jsons/translations/ru.json b/assets/jsons/translations/ru.json index 9b31d3c9..b0b8d892 100644 --- a/assets/jsons/translations/ru.json +++ b/assets/jsons/translations/ru.json @@ -25,9 +25,6 @@ } }, "pages": { - "shared-maps": { - "title": "Общие карты" - }, "version-viewer": { "launch-mods": { "oculus": "Режим Oculus", @@ -42,7 +39,6 @@ } }, "maps": { - "title": "Общие карты", "search-bar": { "search-placeholder": "Поиск среди карт", "filters-btn": "Фильтр", diff --git a/assets/jsons/translations/zh-tw.json b/assets/jsons/translations/zh-tw.json index 35739258..b77c186a 100644 --- a/assets/jsons/translations/zh-tw.json +++ b/assets/jsons/translations/zh-tw.json @@ -25,9 +25,6 @@ } }, "pages": { - "shared-maps": { - "title": "共享譜面 " - }, "version-viewer": { "launch-mods": { "oculus": "Oculus 模式", @@ -42,7 +39,6 @@ } }, "maps": { - "title": "Shared maps", "search-bar": { "search-placeholder": "譜面搜尋", "filters-btn": "篩選", diff --git a/assets/jsons/translations/zh.json b/assets/jsons/translations/zh.json index 46617d51..9d19e3d2 100644 --- a/assets/jsons/translations/zh.json +++ b/assets/jsons/translations/zh.json @@ -25,9 +25,6 @@ } }, "pages": { - "shared-maps": { - "title": "共享谱面" - }, "version-viewer": { "launch-mods": { "oculus": "Oculus 模式", @@ -42,7 +39,6 @@ } }, "maps": { - "title": "Shared maps", "search-bar": { "search-placeholder": "谱面搜索", "filters-btn": "筛选", From 1ed71c61efcbc5a634fae81170fb7c07494c3f12 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 01:18:04 +0100 Subject: [PATCH 13/27] Remove unnecessary line in es.json --- assets/jsons/translations/es.json | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/jsons/translations/es.json b/assets/jsons/translations/es.json index 5ff9abeb..4a0fabf6 100644 --- a/assets/jsons/translations/es.json +++ b/assets/jsons/translations/es.json @@ -25,7 +25,6 @@ } }, "pages": { - "version-viewer": { "launch-mods": { "oculus": "Modo Oculus", From a51bf1ab15baaaa82028c561727b5380c09169ba Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 01:22:30 +0100 Subject: [PATCH 14/27] Update French translations --- assets/jsons/translations/fr.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/assets/jsons/translations/fr.json b/assets/jsons/translations/fr.json index 490062fe..6b382951 100644 --- a/assets/jsons/translations/fr.json +++ b/assets/jsons/translations/fr.json @@ -227,8 +227,11 @@ "steam-download": { "warnings": { "msg": { + "ManifestChecksum": "Le manifeste précédemment téléchargé ne correspond pas au nouveau 🤔", "ConnectionTimeout": "Ta connexion internet semble instable 🥶", - "Unknown": "Quelque chose d'étrange s'est produit 🤔 Votre connexion est surement instable." + "ConnectionLost": "La connexion a été perdue, essayez à nouveau...", + "ConnectionError": "Impossible de se connecter à Steam, essayez à nouveau...", + "Unknown": "Quelque chose d'étrange s'est produit 🤔 Votre connexion est probablement instable." } }, "errors": { From a7dbe61535085f6a0c7ba18d6b887765ede5ec37 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 01:26:44 +0100 Subject: [PATCH 15/27] Remove unnecessary whitespace in zh-tw.json --- assets/jsons/translations/zh-tw.json | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/jsons/translations/zh-tw.json b/assets/jsons/translations/zh-tw.json index b77c186a..e4d4dfd9 100644 --- a/assets/jsons/translations/zh-tw.json +++ b/assets/jsons/translations/zh-tw.json @@ -649,7 +649,6 @@ "valid-btn": "取消關聯譜面" } }, - "download-maps": { "search-btn": "搜尋", "loading-maps": "譜面載入中...", From 8c9597ab0e268d1668dc0ac83e001c4c48e170ff Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 01:27:16 +0100 Subject: [PATCH 16/27] Remove unnecessary code in zh.json --- assets/jsons/translations/zh.json | 1 - 1 file changed, 1 deletion(-) diff --git a/assets/jsons/translations/zh.json b/assets/jsons/translations/zh.json index 9d19e3d2..54c48cb6 100644 --- a/assets/jsons/translations/zh.json +++ b/assets/jsons/translations/zh.json @@ -649,7 +649,6 @@ "valid-btn": "取消关联谱面" } }, - "download-maps": { "search-btn": "搜索", "loading-maps": "谱面加载中...", From 072e2991badac8f1aca1f1cb8db05afdcbb6cd3b Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 01:28:47 +0100 Subject: [PATCH 17/27] Update filter panel component layout --- .../maps-mangement-components/filter-panel.component.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) 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 c9f701b7..3d1f743d 100644 --- a/src/renderer/components/maps-mangement-components/filter-panel.component.tsx +++ b/src/renderer/components/maps-mangement-components/filter-panel.component.tsx @@ -167,9 +167,7 @@ export function FilterPanel({ className, ref, playlist = false, filter, onChange return !playlist ? ( - -
- +
{t("maps.map-filter-panel.nps")} @@ -184,7 +182,6 @@ export function FilterPanel({ className, ref, playlist = false, filter, onChange {translateMapSpecificity(specificity)}
))} -

{t("maps.map-filter-panel.requirements")}

{MAP_REQUIREMENTS.map(requirement => (
handleCheckbox(requirement)}> From e071d792ad2e1ccdfd212388c8761300251ccaf6 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 01:32:05 +0100 Subject: [PATCH 18/27] Remove unnecessary empty lines and whitespace --- .../maps-mangement-components/map-item.component.tsx | 1 - src/renderer/index.css | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/renderer/components/maps-mangement-components/map-item.component.tsx b/src/renderer/components/maps-mangement-components/map-item.component.tsx index 71cc59ca..f0e4415d 100644 --- a/src/renderer/components/maps-mangement-components/map-item.component.tsx +++ b/src/renderer/components/maps-mangement-components/map-item.component.tsx @@ -52,7 +52,6 @@ export type MapItemProps = { }; export const MapItem = memo(({ hash, title, autor, songAutor, coverUrl, songUrl, autorId, mapId, diffs, ranked, bpm, duration, likes, createdAt, selected, downloading, showOwned, callBackParam, onDelete, onDownload, onSelected, onCancelDownload, onDoubleClick }: MapItemProps) => { - const linkOpener = useService(LinkOpenerService); const audioPlayer = useService(AudioPlayerService); diff --git a/src/renderer/index.css b/src/renderer/index.css index 3ad6255b..fde11256 100644 --- a/src/renderer/index.css +++ b/src/renderer/index.css @@ -19,7 +19,6 @@ } * { - user-select: none; } @@ -79,8 +78,6 @@ background: rgba(0, 0, 0, 0.25); } - - .tippy-box[data-theme~='default'] { @apply !bg-neutral-900; color: #fff; From 073061c8e59e8e620ded88c06eb69e398d49f893 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sun, 7 Jan 2024 03:00:53 +0100 Subject: [PATCH 19/27] [chore] update maps and playlists panel UI for coherence --- .../local-maps-manager.service.ts | 14 +-- .../link-button.component.tsx | 82 +++++++------ .../local-maps-list-panel.component.tsx | 2 +- .../map-item.component.tsx | 6 +- .../maps-playlists-panel.component.tsx | 110 +++++++----------- .../maps-row.component.tsx | 2 +- .../share-folders-modal.component.tsx | 45 +++---- .../models-panel.component.tsx | 58 ++++++--- .../models-tabs-navbar.component.tsx | 87 -------------- .../setting-radio-array.component.tsx | 2 +- .../shared/bs-content-nav-bar.component.tsx | 30 ----- .../bs-content-tab-item.component.tsx | 44 +++++++ .../bs-content-tab-panel.component.tsx | 35 ++++++ .../shared/laser-slider.component.tsx | 35 ++++++ .../shared/tab-nav-bar.component.tsx | 6 +- src/renderer/services/maps-manager.service.ts | 8 +- .../models-manager.service.ts | 8 +- .../services/version-folder-linker.service.ts | 67 ++++++----- 18 files changed, 324 insertions(+), 317 deletions(-) delete mode 100644 src/renderer/components/models-management/models-tabs-navbar.component.tsx delete mode 100644 src/renderer/components/shared/bs-content-nav-bar.component.tsx create mode 100644 src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-item.component.tsx create mode 100644 src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-panel.component.tsx create mode 100644 src/renderer/components/shared/laser-slider.component.tsx diff --git a/src/main/services/additional-content/local-maps-manager.service.ts b/src/main/services/additional-content/local-maps-manager.service.ts index 0fdf040c..b30349aa 100644 --- a/src/main/services/additional-content/local-maps-manager.service.ts +++ b/src/main/services/additional-content/local-maps-manager.service.ts @@ -7,7 +7,7 @@ import { InstallationLocationService } from "../installation-location.service"; import { UtilsService } from "../utils.service"; import crypto from "crypto"; import { lstatSync } from "fs"; -import { copy, createReadStream, ensureDir, realpath, unlink } from "fs-extra"; +import { copy, createReadStream, ensureDir, pathExists, realpath, unlink } from "fs-extra"; import StreamZip from "node-stream-zip"; import { RequestService } from "../request.service"; import sanitize from "sanitize-filename"; @@ -255,10 +255,12 @@ export class LocalMapsManagerService { const mapFolderName = sanitize(`${map.id}-${map.name}`); const mapsFolder = await this.getMapsFolderPath(version); - const installedMap = await this.loadMapInfoFromPath(path.join(mapsFolder, mapFolderName)).catch(e => { - log.error("loadMapInfoFromPath", e); - return null; - }); + const mapPath = path.join(mapsFolder, mapFolderName); + + const installedMap = await pathExists(mapPath).then(exists => { + if(!exists){ return null; } + return this.loadMapInfoFromPath(mapPath); + }).catch(() => null); if(map.versions.every(version => version.hash === installedMap?.hash)) { return installedMap; @@ -270,8 +272,6 @@ export class LocalMapsManagerService { throw `Cannot download ${zipUrl}`; } - const mapPath = path.join(mapsFolder, mapFolderName); - await ensureFolderExist(mapPath); await zip.extract(null, mapPath); diff --git a/src/renderer/components/maps-mangement-components/link-button.component.tsx b/src/renderer/components/maps-mangement-components/link-button.component.tsx index bc8d1d6c..5f353b77 100644 --- a/src/renderer/components/maps-mangement-components/link-button.component.tsx +++ b/src/renderer/components/maps-mangement-components/link-button.component.tsx @@ -1,48 +1,60 @@ import { motion } from "framer-motion"; -import { forwardRef } from "react"; +import { useState } from "react"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import { BsmIcon } from "../svgs/bsm-icon.component"; import { useTranslation } from "renderer/hooks/use-translation.hook"; +import { FolderLinkState } from "renderer/services/version-folder-linker.service"; +import { Observable } from "rxjs"; +import { useObservable } from "renderer/hooks/use-observable.hook"; -type Props = { +export type LinkBtnProps = { className?: string; title?: string; - linked?: boolean; - disabled?: boolean; + state$: Observable; onClick?: () => void; }; -export const LinkButton = motion( - forwardRef((props: Props, ref) => { - const t = useTranslation(); - const color = useThemeColor("first-color"); +export const LinkButton = ({className, title, state$, onClick}: LinkBtnProps) => { + const t = useTranslation(); + + const state = useObservable(state$); + const color = useThemeColor("first-color"); + const disabled = state === FolderLinkState.Processing || state === FolderLinkState.Pending; - const linkedColor = (() => { - if (props.disabled) { - return "orange"; - } - if (props.linked) { + const btnColor = () => { + switch (state) { + case FolderLinkState.Linked: return color; - } - return "red"; - })(); + case FolderLinkState.Pending: + case FolderLinkState.Processing: + return "orange"; + case FolderLinkState.Unlinked: + return "red"; + default: + return "red"; + } + } - return ( -
{ - e.preventDefault(); - e.stopPropagation(); - !props.disabled && props.onClick?.(); - }} - style={{ pointerEvents: props.disabled ? "none" : "auto" }} - tabIndex={-1} - > - - -
- ); - }) -); + const handleClick = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + !disabled && onClick?.(); + } + + return ( + + + + + ); +} 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 e7af8ece..a6f66cf9 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 @@ -429,7 +429,7 @@ export const LocalMapsListPanel = forwardRef(({ version, className, filter, sear 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/map-item.component.tsx b/src/renderer/components/maps-mangement-components/map-item.component.tsx index b71ccd33..c015725f 100644 --- a/src/renderer/components/maps-mangement-components/map-item.component.tsx +++ b/src/renderer/components/maps-mangement-components/map-item.component.tsx @@ -191,8 +191,8 @@ export const MapItem = memo(({ hash, title, autor, songAutor, coverUrl, songUrl,
- -
+ +

{title} @@ -240,7 +240,7 @@ export const MapItem = memo(({ hash, title, autor, songAutor, coverUrl, songUrl,

-
+
diff --git a/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx b/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx index db26ff29..200f5952 100644 --- a/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx +++ b/src/renderer/components/maps-mangement-components/maps-playlists-panel.component.tsx @@ -1,24 +1,18 @@ -import { DetailedHTMLProps, useEffect, useRef, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { BSVersion } from "shared/bs-version.interface"; -import { TabNavBar } from "../shared/tab-nav-bar.component"; import { LocalMapsListPanel } from "./local-maps-list-panel.component"; import { BsmDropdownButton, DropDownItem } from "../shared/bsm-dropdown-button.component"; import { FilterPanel } from "./filter-panel.component"; import { MapFilter } from "shared/models/maps/beat-saver.model"; -import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import { MapsManagerService } from "renderer/services/maps-manager.service"; -import { motion, Variants } from "framer-motion"; import { MapsDownloaderService } from "renderer/services/maps-downloader.service"; import { BsmImage } from "../shared/bsm-image.component"; import wipGif from "../../../../assets/images/gifs/wip.gif"; -import { OsDiagnosticService } from "renderer/services/os-diagnostic.service"; -import { useObservable } from "renderer/hooks/use-observable.hook"; -import { BsmIcon } from "../svgs/bsm-icon.component"; import { useTranslation } from "renderer/hooks/use-translation.hook"; -import { LinkButton } from "./link-button.component"; -import { debounceTime } from "rxjs/operators"; import { VersionFolderLinkerService, VersionLinkerActionListener } from "renderer/services/version-folder-linker.service"; import { useService } from "renderer/hooks/use-service.hook"; +import { BsContentTabPanel } from "../shared/bs-content-tab-panel/bs-content-tab-panel.component"; +import { BsmButton } from "../shared/bsm-button.component"; type Props = { version?: BSVersion; @@ -29,7 +23,6 @@ export function MapsPlaylistsPanel({ version, isActive }: Props) { const mapsService = useService(MapsManagerService); const mapsDownloader = useService(MapsDownloaderService); - const osDiagnostic = useService(OsDiagnosticService); const linker = useService(VersionFolderLinkerService); const [tabIndex, setTabIndex] = useState(0); @@ -37,9 +30,6 @@ export function MapsPlaylistsPanel({ version, isActive }: Props) { const [mapSearch, setMapSearch] = useState(""); const [playlistSearch, setPlaylistSearch] = useState(""); const [mapsLinked, setMapsLinked] = useState(false); - const [linkingPending, setLinkingPending] = useState(false); - const isOnline = useObservable(osDiagnostic.isOnline$); - const color = useThemeColor("first-color"); const t = useTranslation(); const mapsRef = useRef(); @@ -50,8 +40,6 @@ export function MapsPlaylistsPanel({ version, isActive }: Props) { loadMapIsLinked(); - const sub = mapsService.$mapsLinkingPending(version).pipe(debounceTime(50)).subscribe(setLinkingPending); - const onMapsLinked: VersionLinkerActionListener = action => { if (!action.relativeFolder.includes(MapsManagerService.RELATIVE_MAPS_FOLDER)) { return; @@ -63,7 +51,6 @@ export function MapsPlaylistsPanel({ version, isActive }: Props) { linker.onVersionFolderUnlinked(onMapsLinked); return () => { - sub.unsubscribe(); linker.removeVersionFolderLinkedListener(onMapsLinked); linker.removeVersionFolderUnlinkedListener(onMapsLinked); }; @@ -80,6 +67,10 @@ export function MapsPlaylistsPanel({ version, isActive }: Props) { return setPlaylistSearch(() => value); }; + const handleMapsAddClick = () => { + mapsDownloader.openDownloadMapModal(version, mapsRef.current.getMaps?.()); + }; + const handleMapsLinkClick = () => { if (!mapsLinked) { return mapsService.linkVersion(version); @@ -87,56 +78,6 @@ export function MapsPlaylistsPanel({ version, isActive }: Props) { return mapsService.unlinkVersion(version); }; - const handleMapsAddClick = () => { - mapsDownloader.openDownloadMapModal(version, mapsRef.current.getMaps?.()); - }; - - const renderTab = (props: DetailedHTMLProps, HTMLLIElement>, text: string, index: number): JSX.Element => { - const onClickLink = (index: number) => { - if (index === 0) { - handleMapsLinkClick(); - } - }; - - const onClickAdd = (index: number) => { - if (index === 0) { - handleMapsAddClick(); - } - }; - - const variants: Variants = { hover: { rotate: 22.5 }, tap: { rotate: 45 } }; - - return ( -
  • - {text} - {index === 0 && ( -
    - {isOnline && ( - { - e.stopPropagation(); - onClickAdd(index); - }} - tabIndex={-1} - > - - - - - {t("misc.add")} - - )} - {!!version && onClickLink(index)} />} -
    - )} -
  • - ); - }; - const dropDownItems = ((): DropDownItem[] => { if (tabIndex === 1) { return []; @@ -150,6 +91,15 @@ export function MapsPlaylistsPanel({ version, isActive }: Props) { return (
    -
    - -
    + setTabIndex(index)} + tabs={[ + { + text: "misc.maps", + icon: "trash", + onClick: () => setTabIndex(0), + linkProps: version ? { + state$: mapsService.$mapsFolderLinkState(version), + onClick: handleMapsLinkClick, + } : undefined, + }, + { + text: "misc.playlists", + icon: "trash", + onClick: () => setTabIndex(1), + }, + ]} + > + <>
    Coming soon
    -
    -
    + +
    ); } diff --git a/src/renderer/components/maps-mangement-components/maps-row.component.tsx b/src/renderer/components/maps-mangement-components/maps-row.component.tsx index e92d4ac2..4aa185e4 100644 --- a/src/renderer/components/maps-mangement-components/maps-row.component.tsx +++ b/src/renderer/components/maps-mangement-components/maps-row.component.tsx @@ -52,7 +52,7 @@ export const MapsRow = memo(({ maps, style, selectedMaps$, onMapSelect, onMapDel }; return ( -
      +
        {maps?.map(renderMapItem)}
      ); 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 75907e77..a4d33886 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 @@ -1,9 +1,9 @@ import Tippy from "@tippyjs/react"; -import { Variants } from "framer-motion"; import { useEffect, useState } from "react"; import { LinkButton } from "renderer/components/maps-mangement-components/link-button.component"; import { BsmBasicSpinner } from "renderer/components/shared/bsm-basic-spinner/bsm-basic-spinner.component"; import { BsmButton } from "renderer/components/shared/bsm-button.component"; +import { useConstant } from "renderer/hooks/use-constant.hook"; import { useObservable } from "renderer/hooks/use-observable.hook"; import { useService } from "renderer/hooks/use-service.hook"; import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; @@ -12,7 +12,7 @@ import { BSVersionManagerService } from "renderer/services/bs-version-manager.se import { ConfigurationService } from "renderer/services/configuration.service"; import { IpcService } from "renderer/services/ipc.service"; import { ModalComponent } from "renderer/services/modale.service"; -import { VersionFolderLinkerService, VersionLinkerActionType } from "renderer/services/version-folder-linker.service"; +import { FolderLinkState, VersionFolderLinkerService, VersionLinkerActionType } from "renderer/services/version-folder-linker.service"; import { BSVersion } from "shared/bs-version.interface"; export const ShareFoldersModal: ModalComponent = ({ data }) => { @@ -107,33 +107,13 @@ const FolderItem = ({ version, relativeFolder, onDelete }: FolderProps) => { const t = useTranslation(); - const name = relativeFolder.split(window.electron.path.sep).at(-1); const color = useThemeColor("first-color"); - - const variants: Variants = { - hover: { rotate: 22.5 }, - tap: { rotate: 45 }, - }; - - const pending = useObservable(linker.isPending(version, relativeFolder)); - const processing = useObservable(linker.isProcessing(version, relativeFolder)); - const linkDisabled = pending || processing; - - const [linked, setLinked] = useState(false); - - useEffect(() => { - if (pending) { - return; - } - loadFolderIsLinked(); - }, [version, relativeFolder, pending]); - - const loadFolderIsLinked = () => { - linker.isVersionFolderLinked(version, relativeFolder).toPromise().then(setLinked); - }; + const state$ = useConstant(() => linker.$folderLinkedState(version, relativeFolder)); + const state = useObservable(state$); + const name = relativeFolder.split(window.electron.path.sep).at(-1); const onClickLink = () => { - if (linked) { + if (state === FolderLinkState.Linked) { return linker.unlinkVersionFolder({ version, relativeFolder, @@ -150,7 +130,6 @@ const FolderItem = ({ version, relativeFolder, onDelete }: FolderProps) => { const cancelLink = () => { linker.cancelAction(version, relativeFolder); - loadFolderIsLinked(); }; return ( @@ -159,14 +138,18 @@ const FolderItem = ({ version, relativeFolder, onDelete }: FolderProps) => { {name}
      - - + + {(() => { - if (processing) { + if (state === FolderLinkState.Processing) { return ; } - if (pending) { + if (state === FolderLinkState.Pending) { return ( void }) { const modelsManager = useService(ModelsManagerService); @@ -93,6 +97,31 @@ export function ModelsPanel({ version, isActive, goToMods }: { version?: BSVersi { text: "models.panel.actions.drop-down.delete", onClick: deleteModels, icon: "trash" }, ]; + const getModelTabProps = (model: MSModelType): BsContentTabItemProps => { + + const onClick = async () => { + const state = await lastValueFrom(modelsManager.$modelsLinkingState(version, model).pipe(take(1))); + if (state === FolderLinkState.Pending || state === FolderLinkState.Processing) { return; } + if (state === FolderLinkState.Linked) { + modelsManager.unlinkModels(model, version); + } else { + modelsManager.linkModels(model, version); + } + } + + const linkProps: LinkBtnProps = version ? { + state$: modelsManager.$modelsLinkingState(version, model), + onClick, + } : undefined; + + return { + text: `models.types.plural.${model}`, + icon: model, + onClick: () => setModelTypeTab(model), + linkProps + } + }; + return (
      @@ -112,24 +141,23 @@ export function ModelsPanel({ version, isActive, goToMods }: { version?: BSVersi
      -
      - { - setModelTypeTab(() => tab.extra); - setCurrentTabIndex(() => index); - }} - /> - -
      + setCurrentTabIndex(index)} + tabs={[ + getModelTabProps(MSModelType.Avatar), + getModelTabProps(MSModelType.Saber), + getModelTabProps(MSModelType.Platfrom), + getModelTabProps(MSModelType.Bloq), + ]} + > + <> -
      -
      + +
      ); } diff --git a/src/renderer/components/models-management/models-tabs-navbar.component.tsx b/src/renderer/components/models-management/models-tabs-navbar.component.tsx deleted file mode 100644 index 71d59464..00000000 --- a/src/renderer/components/models-management/models-tabs-navbar.component.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { BSVersion } from "shared/bs-version.interface"; -import { MSModelType } from "../../../shared/models/models/model-saber.model"; -import { LinkButton } from "../maps-mangement-components/link-button.component"; -import { useState } from "react"; -import { useOnUpdate } from "renderer/hooks/use-on-update.hook"; -import { ModelsManagerService } from "renderer/services/models-management/models-manager.service"; -import { BsContentNavBar, BsContentNavBarTab } from "../shared/bs-content-nav-bar.component"; -import { useConstant } from "renderer/hooks/use-constant.hook"; -import { BsmIcon } from "../svgs/bsm-icon.component"; -import { MODEL_TYPES } from "../../../shared/models/models/constants"; -import { useService } from "renderer/hooks/use-service.hook"; -import { useTranslation } from "renderer/hooks/use-translation.hook"; - -type Props = { - className?: string; - version?: BSVersion; - tabIndex: number; - onTabChange: (index: number, tab: BsContentNavBarTab) => void; -}; - -export function ModelsTabsNavbar({ className, version, tabIndex, onTabChange }: Props) { - const tabs = useConstant[]>(() => { - return MODEL_TYPES.map(type => ({ - text: type, - extra: type, - })); - }); - - return } />; -} - -type TabProps = { - version?: BSVersion; - modelType: MSModelType; - active?: boolean; -} & React.ComponentProps<"li">; - -function ModelTab({ version, modelType, active, onClick }: TabProps) { - const modelsManager = useService(ModelsManagerService); - - const t = useTranslation(); - - const [modelsAreLinked, setModelsAreLinked] = useState(false); - const [linkBtnDisabled, setLinkBtnDisabled] = useState(false); - - useOnUpdate(() => { - if (!version) { - return; - } - - const sub = modelsManager.$modelsLinkingPending(version, modelType).subscribe(async pending => { - if (pending) { - return setLinkBtnDisabled(() => pending); - } - const modelsLinked = await modelsManager.isModelsLinked(version, modelType); - setModelsAreLinked(() => modelsLinked); - setLinkBtnDisabled(() => pending); - }); - - return () => { - sub.unsubscribe(); - }; - }, [version]); - - const linkModels = () => modelsManager.linkModels(modelType, version); - const unlinkModels = () => modelsManager.unlinkModels(modelType, version); - - const onClickLink = () => { - if (!version) { - return Promise.resolve(); - } - if (modelsAreLinked) { - return unlinkModels(); - } - return linkModels(); - }; - - return ( -
    • -
      - - {t(`models.types.plural.${modelType}`)} -
      -
      {!!version && }
      -
    • - ); -} diff --git a/src/renderer/components/settings/setting-radio-array.component.tsx b/src/renderer/components/settings/setting-radio-array.component.tsx index 60eb44a1..1a7f2e60 100644 --- a/src/renderer/components/settings/setting-radio-array.component.tsx +++ b/src/renderer/components/settings/setting-radio-array.component.tsx @@ -21,7 +21,7 @@ export function SettingRadioArray({ id, items, selectedItemId, selectedItemVa return (
      {items.map(i => ( -
      onItemSelected(i)} key={i.id} className={`py-3 w-full flex cursor-pointer justify-between items-center rounded-md px-2 transition-colors duration-200 ${isSelected(i) ? "bg-light-main-color-3 dark:bg-main-color-3" : "bg-light-main-color-1 dark:bg-main-color-1"} ${i.className}`}> +
      onItemSelected(i)} key={i.id} className={`py-3 w-full flex cursor-pointer justify-between items-center rounded-md px-2 transition-colors duration-300 ${isSelected(i) ? "bg-light-main-color-3 dark:bg-main-color-3" : "bg-light-main-color-1 dark:bg-main-color-1"} ${i.className}`}>
      diff --git a/src/renderer/components/shared/bs-content-nav-bar.component.tsx b/src/renderer/components/shared/bs-content-nav-bar.component.tsx deleted file mode 100644 index e747df83..00000000 --- a/src/renderer/components/shared/bs-content-nav-bar.component.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { DetailedHTMLProps, Fragment } from "react"; -import { BsmIconType } from "../svgs/bsm-icon.component"; - -type Props = { - className?: string; - tabIndex: number; - tabs: BsContentNavBarTab[]; - renderTab: (props: DetailedHTMLProps, any>, tab?: BsContentNavBarTab, activeTab?: BsContentNavBarTab) => JSX.Element; - onTabChange?: (index: number, tab?: BsContentNavBarTab) => void; -}; - -export type BsContentNavBarTab = { - text: string; - icon?: BsmIconType; - extra?: T; -}; - -export function BsContentNavBar({ className, tabIndex, tabs, renderTab, onTabChange }: Props) { - const handleTabClick = (index: number) => { - onTabChange?.(index, tabs[index]); - }; - - 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 new file mode 100644 index 00000000..edb55553 --- /dev/null +++ b/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-item.component.tsx @@ -0,0 +1,44 @@ +import { LinkBtnProps, LinkButton } from "renderer/components/maps-mangement-components/link-button.component"; +import { BsmIcon, BsmIconType } from "renderer/components/svgs/bsm-icon.component"; +import { useTranslation } from "renderer/hooks/use-translation.hook"; + +export type BsContentTabItemProps = { + text: string; + icon: BsmIconType; + active?: boolean; + value?: T; + linkProps?: LinkBtnProps; + onClick: (value?: T) => void; +}; + +type BsContentTabItemComponent = ({text, icon, active, value, linkProps, onClick}: BsContentTabItemProps) => JSX.Element; + +export const BsContentTabItem: BsContentTabItemComponent = ({ text, icon, active, value, linkProps, onClick }) => { + + const t = useTranslation(); + + const handleClick = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + onClick(value); + } + + return ( +
    • +
      + + {t(text)} +
      + {linkProps && ( +
      + +
      + )} +
    • + ); +} \ No newline at end of file diff --git a/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-panel.component.tsx b/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-panel.component.tsx new file mode 100644 index 00000000..8a4239f6 --- /dev/null +++ b/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-panel.component.tsx @@ -0,0 +1,35 @@ +import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; +import { LaserSlider } from "../laser-slider.component"; +import { BsContentTabItem, BsContentTabItemProps } from "./bs-content-tab-item.component"; + +type Props = { + className?: string; + tabs: BsContentTabItemProps[]; + tabIndex: number; + onTabChange: (index: number, tab: BsContentTabItemProps) => void; + children: JSX.Element; +} + +export function BsContentTabPanel({className, tabIndex, tabs, onTabChange, children}: Props) { + + const sliderColor = useThemeColor("second-color"); + + return ( +
      + + +
      + {children} +
      +
      + ) +} diff --git a/src/renderer/components/shared/laser-slider.component.tsx b/src/renderer/components/shared/laser-slider.component.tsx new file mode 100644 index 00000000..fd5812af --- /dev/null +++ b/src/renderer/components/shared/laser-slider.component.tsx @@ -0,0 +1,35 @@ +import { CSSProperties } from "react"; + +type Props = { + mode: "horizontal" | "vertical"; + color: string; + className?: string; + nbSteps: number; + step: number; +} + +export function LaserSlider({mode, color, className, nbSteps, step}: Props) { + + const sliderStyle = ((): CSSProperties => { + if(mode === "vertical"){ + return { + transform: `translate(0, ${step * 100}%)`, + height: `calc(100% / ${nbSteps})`, + width: "100%" + } + } + + return { + transform: `translate(${step * 100}%, 0)`, + width: `calc(100% / ${nbSteps})`, + height: "100%" + } + })(); + + return ( +
      + + +
      + ) +} diff --git a/src/renderer/components/shared/tab-nav-bar.component.tsx b/src/renderer/components/shared/tab-nav-bar.component.tsx index 0484ec58..960ab97e 100644 --- a/src/renderer/components/shared/tab-nav-bar.component.tsx +++ b/src/renderer/components/shared/tab-nav-bar.component.tsx @@ -1,6 +1,7 @@ import { DetailedHTMLProps, Fragment } 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"; type Props = { tabIndex: number; @@ -22,10 +23,7 @@ export function TabNavBar(props: Props) { return (
      - + diff --git a/src/renderer/services/version-folder-linker.service.ts b/src/renderer/services/version-folder-linker.service.ts index d6a58b1e..936de9d6 100644 --- a/src/renderer/services/version-folder-linker.service.ts +++ b/src/renderer/services/version-folder-linker.service.ts @@ -4,6 +4,7 @@ import { BehaviorSubject, Observable, of } from "rxjs"; import { BSVersion } from "shared/bs-version.interface"; import { IpcService } from "./ipc.service"; import { ProgressBarService } from "./progress-bar.service"; +import equal from "fast-deep-equal"; export class VersionFolderLinkerService { private static instance: VersionFolderLinkerService; @@ -132,11 +133,11 @@ export class VersionFolderLinkerService { return this._queue$.pipe( mergeMap(queue => { const currentAction = queue.at(0); - if(currentAction && currentAction.version === version && currentAction.relativeFolder === relativeFolder) { + if(currentAction && equal(currentAction.version, version) && currentAction.relativeFolder === relativeFolder) { return of(FolderLinkState.Processing) } - if(queue.some(action => action.version === version && action.relativeFolder === relativeFolder)) { + if(queue.some(action => equal(action.version, version) && action.relativeFolder === relativeFolder)) { return of(FolderLinkState.Pending); } diff --git a/src/renderer/windows/OneClick/OneClickDownloadPlaylist.tsx b/src/renderer/windows/OneClick/OneClickDownloadPlaylist.tsx index 8dab7d1b..a21bf590 100644 --- a/src/renderer/windows/OneClick/OneClickDownloadPlaylist.tsx +++ b/src/renderer/windows/OneClick/OneClickDownloadPlaylist.tsx @@ -24,8 +24,8 @@ export default function OneClickDownloadPlaylist() { const mapsContainer = useRef(null); const playlistUrl = useConstant(() => new URLSearchParams(window.location.search).get("playlistUrl")); const download$ = useConstant(() => playlistDownloader.oneClickInstallPlaylist(playlistUrl)); - const playlistInfos = useObservable(download$.pipe(filter(progress => !!progress.data?.playlistInfos), map(progress => progress.data.playlistInfos), take(1))); - const downloadedMaps = useObservable(download$.pipe(filter(progress => !!progress.data?.downloadedMaps), map(progress => progress.data.downloadedMaps))); + const playlistInfos = useObservable(() => download$.pipe(filter(progress => !!progress.data?.playlistInfos), map(progress => progress.data.playlistInfos), take(1))); + const downloadedMaps = useObservable(() => download$.pipe(filter(progress => !!progress.data?.downloadedMaps), map(progress => progress.data.downloadedMaps))); useEffect(() => { diff --git a/src/renderer/windows/ShortcutLaunch.tsx b/src/renderer/windows/ShortcutLaunch.tsx index ca2f2a87..1049676a 100644 --- a/src/renderer/windows/ShortcutLaunch.tsx +++ b/src/renderer/windows/ShortcutLaunch.tsx @@ -26,7 +26,7 @@ export default function ShortcutLaunch() { const t = useTranslation(); const color = useThemeColor("second-color"); - const launchOptions = useObservable(ipc.sendV2("shortcut-launch-options").pipe(take(1)), null) + const launchOptions = useObservable(() => ipc.sendV2("shortcut-launch-options").pipe(take(1)), null) const [rotation, setRotation] = useState(0); const [status, setStatus] = useState(); From 68b105dd635b73553a57e42e7dce784ed3eb1155 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sun, 7 Jan 2024 16:33:06 +0100 Subject: [PATCH 22/27] [bugfix] remove test logs + add tryit in resolveGUID function --- src/main/helpers/fs.helpers.ts | 13 ++++--------- .../services/bs-launcher/oculus-launcher.service.ts | 2 -- src/main/services/oculus.service.ts | 12 ------------ 3 files changed, 4 insertions(+), 23 deletions(-) diff --git a/src/main/helpers/fs.helpers.ts b/src/main/helpers/fs.helpers.ts index 03e833e4..7fa474f7 100644 --- a/src/main/helpers/fs.helpers.ts +++ b/src/main/helpers/fs.helpers.ts @@ -6,6 +6,7 @@ import log from "electron-log"; import { BsmException } from "shared/models/bsm-exception.model"; import crypto from "crypto"; import { execSync } from "child_process"; +import { tryit } from "../../shared/helpers/error.helpers"; export async function pathExist(path: string): Promise { try { @@ -234,18 +235,12 @@ export async function isJunction(path: string): Promise{ } export function resolveGUIDPath(guidPath: string): string { - log.info("resolveGUIDPath", guidPath); const guidVolume = path.parse(guidPath).root; - log.info("guidVolume", guidVolume); const command = `powershell -command "(Get-WmiObject -Class Win32_Volume | Where-Object { $_.DeviceID -like '${guidVolume}' }).DriveLetter"`; - log.info("command", command); - const driveLetter = execSync(command).toString().trim(); - log.info("driveLetter", driveLetter); - if (!driveLetter) { - log.error("Unable to resolve GUID path"); - throw new Error("Unable to resolve GUID path"); + const {result: driveLetter, error} = tryit(() => execSync(command).toString().trim()); + if (!driveLetter || error) { + throw new Error("Unable to resolve GUID path", error); } - log.info("result guid", path.join(driveLetter, path.relative(guidVolume, guidPath))); return path.join(driveLetter, path.relative(guidVolume, guidPath)); } diff --git a/src/main/services/bs-launcher/oculus-launcher.service.ts b/src/main/services/bs-launcher/oculus-launcher.service.ts index 92831375..e07232b9 100644 --- a/src/main/services/bs-launcher/oculus-launcher.service.ts +++ b/src/main/services/bs-launcher/oculus-launcher.service.ts @@ -35,7 +35,6 @@ export class OculusLauncherService extends AbstractLauncherService implements St this.oculus.tryGetGameFolder([OCULUS_BS_DIR, OCULUS_BS_BACKUP_DIR]).then(async dirPath => { if(dirPath){ - log.info("Oculus game found", dirPath); return this.oculusLib$.next( path.join(dirPath, "..") ); } const defaultLib = ((await this.oculus.getOculusLibs()) || []).find(lib => lib.isDefault); @@ -51,7 +50,6 @@ export class OculusLauncherService extends AbstractLauncherService implements St const oculusLibPath = await lastValueFrom(this.oculusLib$.pipe(take(1), timeout(sToMs(30)), catchError(() => of(null)))); if(!oculusLibPath || !(await pathExists(oculusLibPath))){ - log.error("oculusLibPath value", oculusLibPath, "Path exists", await pathExists(oculusLibPath)); throw new Error("Oculus library not found, deleteBsSymlinks"); } diff --git a/src/main/services/oculus.service.ts b/src/main/services/oculus.service.ts index dd4dc581..057cd7cb 100644 --- a/src/main/services/oculus.service.ts +++ b/src/main/services/oculus.service.ts @@ -32,13 +32,7 @@ export class OculusService { const oculusLibsRegKey = "HKCU\\SOFTWARE\\Oculus VR, LLC\\Oculus\\Libraries"; const libsRegData = await list(oculusLibsRegKey).then(data => data[oculusLibsRegKey]); - log.info("Oculus libraries registry data", "exists:", libsRegData.exists, "keys:", "values:", libsRegData.keys, (() => { - const values = Object.entries(libsRegData.values ?? []); - return values.map(([name, value]) => [name, value.value]); - })()); - if (!libsRegData.keys?.length) { - log.info("Registry key \"HKCU\\SOFTWARE\\Oculus VR, LLC\\Oculus\\Libraries\" not found"); return null; } @@ -47,11 +41,6 @@ export class OculusService { const libsPath: OculusLibrary[] = ( await Promise.all(libsRegData.keys.map(async key => { const originalPath = await list([`${oculusLibsRegKey}\\${key}`]).then(res => res[`${oculusLibsRegKey}\\${key}`]); - - log.info("Value in key", key, "is", (() => { - const values = Object.entries(originalPath.values ?? []); - return values.map(([name, value]) => [name, value.value]); - })()); if (originalPath.values?.OriginalPath) { return { id: key, path: originalPath.values.OriginalPath.value, isDefault: defaultLibraryId === key } as OculusLibrary; @@ -97,7 +86,6 @@ export class OculusService { public async tryGetGameFolder(gameFolders: string[]): Promise { for(const gameFolder of gameFolders){ const fullPath = await this.getGameFolder(gameFolder); - log.info("Oculus game folder", gameFolder, "fullPath", fullPath); if(fullPath){ return fullPath; } } From fcf391db557aab3f1ed23990badd16dffd347a05 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sun, 7 Jan 2024 16:40:03 +0100 Subject: [PATCH 23/27] add info log --- src/main/services/oculus.service.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/services/oculus.service.ts b/src/main/services/oculus.service.ts index 057cd7cb..c0b0622b 100644 --- a/src/main/services/oculus.service.ts +++ b/src/main/services/oculus.service.ts @@ -33,6 +33,7 @@ export class OculusService { const libsRegData = await list(oculusLibsRegKey).then(data => data[oculusLibsRegKey]); if (!libsRegData.keys?.length) { + log.info("Registry key \"HKCU\\SOFTWARE\\Oculus VR, LLC\\Oculus\\Libraries\" not found"); return null; } From d6e51f0d11331b9c43118307d65e912d6576a70b Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sun, 7 Jan 2024 17:01:20 +0100 Subject: [PATCH 24/27] [chore] fix sonarcloud bug --- .../maps-mangement-components/link-button.component.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/components/maps-mangement-components/link-button.component.tsx b/src/renderer/components/maps-mangement-components/link-button.component.tsx index b50bb6a3..9526fceb 100644 --- a/src/renderer/components/maps-mangement-components/link-button.component.tsx +++ b/src/renderer/components/maps-mangement-components/link-button.component.tsx @@ -8,7 +8,7 @@ export type LinkBtnProps = { className?: string; title?: string; state: FolderLinkState; - onClick?: () => void; + onClick?: () => unknown; }; export const LinkButton = ({className, title, state, onClick}: LinkBtnProps) => { From 86017e65c0827cb607673990f921a522c9ca7f76 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Sun, 7 Jan 2024 17:06:32 +0100 Subject: [PATCH 25/27] [chore] component props readonly --- .../bs-content-tab-panel/bs-content-tab-panel.component.tsx | 4 ++-- src/renderer/components/shared/laser-slider.component.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-panel.component.tsx b/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-panel.component.tsx index 8a4239f6..6cc1257e 100644 --- a/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-panel.component.tsx +++ b/src/renderer/components/shared/bs-content-tab-panel/bs-content-tab-panel.component.tsx @@ -2,13 +2,13 @@ import { useThemeColor } from "renderer/hooks/use-theme-color.hook"; import { LaserSlider } from "../laser-slider.component"; import { BsContentTabItem, BsContentTabItemProps } from "./bs-content-tab-item.component"; -type Props = { +type Props = Readonly<{ className?: string; tabs: BsContentTabItemProps[]; tabIndex: number; onTabChange: (index: number, tab: BsContentTabItemProps) => void; children: JSX.Element; -} +}>; export function BsContentTabPanel({className, tabIndex, tabs, onTabChange, children}: Props) { diff --git a/src/renderer/components/shared/laser-slider.component.tsx b/src/renderer/components/shared/laser-slider.component.tsx index fd5812af..ce35107a 100644 --- a/src/renderer/components/shared/laser-slider.component.tsx +++ b/src/renderer/components/shared/laser-slider.component.tsx @@ -1,12 +1,12 @@ import { CSSProperties } from "react"; -type Props = { +type Props = Readonly<{ mode: "horizontal" | "vertical"; color: string; className?: string; nbSteps: number; step: number; -} +}> export function LaserSlider({mode, color, className, nbSteps, step}: Props) { From 6e2dfa26b7666e7bc6f08ce285cf446fee1dd594 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 17:21:08 +0100 Subject: [PATCH 26/27] Add modification after review --- .../maps-mangement-components/filter-panel.component.tsx | 8 ++++---- .../maps-mangement-components/map-item.component.tsx | 6 +++--- src/renderer/index.css | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) 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 3d1f743d..7962b23e 100644 --- a/src/renderer/components/maps-mangement-components/filter-panel.component.tsx +++ b/src/renderer/components/maps-mangement-components/filter-panel.component.tsx @@ -56,7 +56,7 @@ export function FilterPanel({ className, ref, playlist = false, filter, onChange const renderDurationLabel = (sec: number): JSX.Element => { const textValue = (() => { if (sec === MIN_DURATION) { - return "0"; + return MIN_DURATION; } if (sec === MAX_DURATION) { return "∞"; @@ -72,7 +72,7 @@ export function FilterPanel({ className, ref, playlist = false, filter, onChange const renderNpsLabel = (nps: number): JSX.Element => { const textValue = (() => { if (nps === MIN_NPS) { - return "0" + return MIN_NPS; } if (nps === MAX_NPS) { return "∞"; @@ -170,8 +170,8 @@ export function FilterPanel({ className, ref, playlist = false, filter, onChange
      - {t("maps.map-filter-panel.nps")} - {t("maps.map-filter-panel.duration")} + {t("maps.map-filter-panel.nps")} + {t("maps.map-filter-panel.duration")}
      diff --git a/src/renderer/components/maps-mangement-components/map-item.component.tsx b/src/renderer/components/maps-mangement-components/map-item.component.tsx index f0e4415d..609792f0 100644 --- a/src/renderer/components/maps-mangement-components/map-item.component.tsx +++ b/src/renderer/components/maps-mangement-components/map-item.component.tsx @@ -246,7 +246,7 @@ export const MapItem = memo(({ hash, title, autor, songAutor, coverUrl, songUrl,
      {onDelete && !downloading && ( - +
      )} {onDownload && !downloading && ( - +
      )} {mapId && ( - +
      .tippy-arrow::before { From 7dc63fa7750d1ed281abf0408f80cfc0578b79b9 Mon Sep 17 00:00:00 2001 From: shidorien Date: Sun, 7 Jan 2024 18:27:42 +0100 Subject: [PATCH 27/27] Fix tippy-box styles in index.css --- src/renderer/index.css | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/renderer/index.css b/src/renderer/index.css index 46612bfe..a0d20c98 100644 --- a/src/renderer/index.css +++ b/src/renderer/index.css @@ -79,21 +79,21 @@ } .tippy-box[data-theme~='default'] { - @apply !bg-neutral-900; - @apply !text-white; + @apply bg-neutral-900; + @apply text-white; } .tippy-box[data-theme~='default'][data-placement^='top'] > .tippy-arrow::before { - @apply !border-t-neutral-900 + @apply border-t-neutral-900 } .tippy-box[data-theme~='default'][data-placement^='bottom'] > .tippy-arrow::before { - @apply !border-b-neutral-900 + @apply border-b-neutral-900 } .tippy-box[data-theme~='default'][data-placement^='left'] > .tippy-arrow::before { - @apply !border-l-neutral-900 + @apply border-l-neutral-900 } .tippy-box[data-theme~='default'][data-placement^='right'] > .tippy-arrow::before { - @apply !border-r-neutral-900 + @apply border-r-neutral-900 } @keyframes glowing {