From d299553d1eea81ca5d30843587ac209585ac2da2 Mon Sep 17 00:00:00 2001 From: MathieuG-P <40181755+Zagrios@users.noreply.github.com> Date: Tue, 18 Jun 2024 21:03:13 +0200 Subject: [PATCH] [feature-107] Advancement on playlist creation --- src/main/ipcs/os-controls-ipcs.ts | 13 ++ .../local-playlists-list-panel.component.tsx | 6 +- .../playlists/playlist-item.component.tsx | 4 +- .../login-to-steam-modal.component.tsx | 4 +- .../models/delete-models-modal.component.tsx | 2 +- .../edit-playlist-infos-modal.component.tsx | 80 +++++++++++ .../edit-playlist-modal.component.tsx | 130 +++++++++++++++--- .../components/shared/bsm-image.component.tsx | 1 + .../steam-downloader.service.ts | 2 +- src/shared/models/ipc/ipc-routes.ts | 1 + 10 files changed, 215 insertions(+), 28 deletions(-) create mode 100644 src/renderer/components/modal/modal-types/playlist/edit-playlist-modal/edit-playlist-infos-modal.component.tsx rename src/renderer/components/modal/modal-types/playlist/{ => edit-playlist-modal}/edit-playlist-modal.component.tsx (72%) diff --git a/src/main/ipcs/os-controls-ipcs.ts b/src/main/ipcs/os-controls-ipcs.ts index 7e2e264a..1de9cfe4 100644 --- a/src/main/ipcs/os-controls-ipcs.ts +++ b/src/main/ipcs/os-controls-ipcs.ts @@ -2,6 +2,7 @@ import { shell, dialog, app, BrowserWindow } from "electron"; import { NotificationService } from "../services/notification.service"; import { IpcService } from "../services/ipc.service"; import { from, of } from "rxjs"; +import { readFileSync } from "fs-extra"; // TODO IMPROVE WINDOW CONTROL BY USING WINDOW SERVICE @@ -45,3 +46,15 @@ ipc.on("notify-system", (args, reply) => { ipc.on("view-path-in-explorer", (args, reply) => { reply(of(shell.showItemInFolder(args))); }); + +ipc.on("choose-image", (args, reply) => { + reply(from(dialog.showOpenDialog({ properties: ["openFile", "multiSelections"], filters: [{ name: "Images", extensions: ["jpg", "png", "jpeg"] }] }).then(res => { + if (res.canceled || !res.filePaths) { + return []; + } + if(args.base64){ + return res.filePaths.map(path => Buffer.from(readFileSync(path)).toString("base64")); + } + return res.filePaths; + }))); +}); diff --git a/src/renderer/components/maps-playlists-panel/playlists/local-playlists-list-panel.component.tsx b/src/renderer/components/maps-playlists-panel/playlists/local-playlists-list-panel.component.tsx index 4a3d4ccb..d10b1056 100644 --- a/src/renderer/components/maps-playlists-panel/playlists/local-playlists-list-panel.component.tsx +++ b/src/renderer/components/maps-playlists-panel/playlists/local-playlists-list-panel.component.tsx @@ -6,7 +6,7 @@ import { useOnUpdate } from "renderer/hooks/use-on-update.hook"; import { useService } from "renderer/hooks/use-service.hook"; import { PlaylistsManagerService } from "renderer/services/playlists-manager.service"; import { FolderLinkState } from "renderer/services/version-folder-linker.service"; -import { BehaviorSubject, combineAll, combineLatest, distinctUntilChanged, filter, finalize, lastValueFrom, map, tap } from "rxjs"; +import { BehaviorSubject, combineLatest, distinctUntilChanged, filter, finalize, lastValueFrom, map, tap } from "rxjs"; import { BSVersion } from "shared/bs-version.interface"; import { noop } from "shared/helpers/function.helpers"; import { LocalBPList, LocalBPListsDetails } from "shared/models/playlists/local-playlist.models"; @@ -37,7 +37,7 @@ import { ProgressionInterface } from "shared/models/progress-bar"; import { enumerate } from "shared/helpers/array.helpers"; import { SyncPlaylistModal } from "renderer/components/modal/modal-types/playlist/sync-playlist-modal.component"; import { ExportPlaylistModal } from "renderer/components/modal/modal-types/playlist/export-playlist-modal.component"; -import { EditPlaylistModal } from "renderer/components/modal/modal-types/playlist/edit-playlist-modal.component"; +import { EditPlaylistModal } from "renderer/components/modal/modal-types/playlist/edit-playlist-modal/edit-playlist-modal.component"; type Props = { version: BSVersion; @@ -77,8 +77,6 @@ export const LocalPlaylistsListPanel = forwardRef( const playlists = useObservable(() => playlists$, []); - console.log(playlists); - const [playlistsLoading, setPlaylistsLoading] = useState(false); const loadPercent$ = useConstant(() => new BehaviorSubject(0)); const linked = useStateMap(linkedState, (newState, precMapped) => (newState === FolderLinkState.Pending || newState === FolderLinkState.Processing) ? precMapped : newState === FolderLinkState.Linked, false); diff --git a/src/renderer/components/maps-playlists-panel/playlists/playlist-item.component.tsx b/src/renderer/components/maps-playlists-panel/playlists/playlist-item.component.tsx index 01b66b57..e97ebe13 100644 --- a/src/renderer/components/maps-playlists-panel/playlists/playlist-item.component.tsx +++ b/src/renderer/components/maps-playlists-panel/playlists/playlist-item.component.tsx @@ -75,9 +75,7 @@ export function PlaylistItem({ title, if (!duration) { return null; } - const date = new Date(0); - date.setSeconds(duration); - return duration > 3600 ? dateFormat(date, "h:MM:ss") : dateFormat(date, "MM:ss"); + return duration > 3600 ? dateFormat(duration * 1000, "h:MM:ss") : dateFormat(duration * 1000, "MM:ss"); })(); // TODO : Translate diff --git a/src/renderer/components/modal/modal-types/bs-downgrade/login-to-steam-modal.component.tsx b/src/renderer/components/modal/modal-types/bs-downgrade/login-to-steam-modal.component.tsx index 4fbef88f..7900e475 100644 --- a/src/renderer/components/modal/modal-types/bs-downgrade/login-to-steam-modal.component.tsx +++ b/src/renderer/components/modal/modal-types/bs-downgrade/login-to-steam-modal.component.tsx @@ -59,14 +59,14 @@ export const LoginToSteamModal: ModalComponent< - setUsername(e.target.value)} value={username} type="text" name="username" id="username" placeholder={t("modals.steam-login.inputs.username.placeholder")} /> + setUsername(e.target.value)} value={username} type="text" name="username" id="username" placeholder={t("modals.steam-login.inputs.username.placeholder")} />
- setPassword(e.target.value)} value={password} type={showPassword ? "text" : "password"} name="password" id="password" placeholder={t("modals.steam-login.inputs.password.placeholder")} /> + setPassword(e.target.value)} value={password} type={showPassword ? "text" : "password"} name="password" id="password" placeholder={t("modals.steam-login.inputs.password.placeholder")} /> setShowPassword(prev => !prev)} />
{password?.length > 64 && {t("modals.steam-login.inputs.password.max-length-warning")}} 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 7adf355c..acf57544 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 @@ -24,7 +24,7 @@ export const DeleteModelsModal: ModalComponent 1; const title = useConstant(() => (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 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(() => (() => { if (!data.linked) return null; diff --git a/src/renderer/components/modal/modal-types/playlist/edit-playlist-modal/edit-playlist-infos-modal.component.tsx b/src/renderer/components/modal/modal-types/playlist/edit-playlist-modal/edit-playlist-infos-modal.component.tsx new file mode 100644 index 00000000..131c3021 --- /dev/null +++ b/src/renderer/components/modal/modal-types/playlist/edit-playlist-modal/edit-playlist-infos-modal.component.tsx @@ -0,0 +1,80 @@ +import { BsmImage } from "renderer/components/shared/bsm-image.component"; +import { ModalComponent, ModalExitCode } from "renderer/services/modale.service"; +import { BsmButton } from "renderer/components/shared/bsm-button.component"; +import { useState } from "react"; +import { useService } from "renderer/hooks/use-service.hook"; +import { SteamDownloaderService } from "renderer/services/bs-version-download/steam-downloader.service"; +import { IpcService } from "renderer/services/ipc.service"; +import { lastValueFrom } from "rxjs"; +import { logRenderError } from "renderer"; + +type Props = { + playlistTitle: string; + playlistDescription: string; + playlistAuthor: string; + base64Image: string; +} + +export const EditPlaylistInfosModal: ModalComponent = ({ resolver, options: { data: { + playlistTitle, + playlistDescription, + playlistAuthor, + base64Image +}}}) => { + + const steamDownloader = useService(SteamDownloaderService); + const ipc = useService(IpcService); + + const [title, setTitle] = useState(playlistTitle); + const [description, setDescription] = useState(playlistDescription); + const [author, setAuthor] = useState(playlistAuthor ?? steamDownloader.getSteamUsername()); + const [base64, setBase64] = useState(base64Image); + + const handleClickImage = async () => { + const res = await lastValueFrom(ipc.sendV2("choose-image", { base64: true })).catch(logRenderError) as string[]; + setBase64(prev => res?.at(0) ?? prev); + } + + const submit = () => { + resolver({ + exitCode: ModalExitCode.COMPLETED, + data: { + playlistTitle: title, + playlistDescription: description, + playlistAuthor: author, + base64Image: base64 + } + }); + }; + + return ( +
+

Créer une playlist

+
+ +
+ + setTitle(e.target.value)}/> +
+
+ +