[chore] reimplement login with meta

This commit is contained in:
MathieuG-P
2024-12-24 12:01:24 +01:00
parent 8eec1fe611
commit cda8a8a3f3
18 changed files with 187 additions and 75 deletions
@@ -1,25 +1,52 @@
import { ModalComponent, ModalExitCode } from "../../../../services/modale.service";
import { useState } from "react";
import { ModalComponent, ModalExitCode, ModalService } from "../../../../services/modale.service";
import { MouseEventHandler, useState } from "react";
import { BsmButton } from "renderer/components/shared/bsm-button.component";
import { useTranslation } from "renderer/hooks/use-translation.hook";
import { useTranslationV2 } from "renderer/hooks/use-translation.hook";
import { MetaIcon } from "renderer/components/svgs/icons/meta-icon.component";
import { BsmCheckbox } from "renderer/components/shared/bsm-checkbox.component";
import Tippy from "@tippyjs/react";
import { useService } from "renderer/hooks/use-service.hook";
import { IpcService } from "renderer/services/ipc.service";
import { lastValueFrom } from "rxjs";
import { EnterMetaTokenModal } from "./enter-meta-token-modal.component";
import { CustomError } from "shared/models/exceptions/custom-error.class";
import { MetaAuthErrorCodes } from "shared/models/bs-version-download/oculus-download.model";
import { NotificationService } from "renderer/services/notification.service";
type ReturnType = { method: MetaAuthMethod.META, stay: boolean } | { method: MetaAuthMethod.MANUAL };
export const LoginToMetaModal: ModalComponent<string> = ({ resolver }) => {
export const LoginToMetaModal: ModalComponent<ReturnType> = ({ resolver }) => {
const { text: t } = useTranslationV2();
const t = useTranslation();
const ipc = useService(IpcService);
const modal = useService(ModalService);
const notifications = useService(NotificationService);
const [stay, setStay] = useState(false);
const [stay, setStay] = useState(true);
const [authWindowOpen, setAuthWindowOpen] = useState(false);
const submit = () => {
resolver({ exitCode: ModalExitCode.COMPLETED, data: { method: MetaAuthMethod.META, stay } });
};
const handleLoginWithMeta = () => {
setAuthWindowOpen(() => true);
lastValueFrom(ipc.sendV2("login-with-meta", stay)).then(token => {
resolver({ exitCode: ModalExitCode.COMPLETED, data: token });
}).catch((e: CustomError) => {
if(e.code === MetaAuthErrorCodes.META_LOGIN_WINDOW_CLOSED_BY_USER){
return;
}
const enterTokenManually = () => {
resolver({ exitCode: ModalExitCode.COMPLETED, data: { method: MetaAuthMethod.MANUAL } });
if(e.code){
notifications.notifyError({title: "notifications.types.error", desc: `notifications.bs-download.oculus-download.errors.msg.${e.code}`});
}
resolver({ exitCode: ModalExitCode.CANCELED });
}).finally(() => {
setAuthWindowOpen(() => false);
})
}
const handleEnterTokenManually: MouseEventHandler<HTMLButtonElement> = async (e) => {
e.preventDefault();
const res = await modal.openModal(EnterMetaTokenModal);
resolver(res);
}
return (
@@ -38,17 +65,12 @@ export const LoginToMetaModal: ModalComponent<ReturnType> = ({ resolver }) => {
<span>{t("modals.connect-to-meta.stay")}</span>
</div>
<BsmButton className="rounded-md flex justify-center items-center transition-all h-10 w-full" typeColor="primary" text="modals.connect-to-meta.connect-to-meta" withBar={false} onClick={submit}/>
<BsmButton className="rounded-md flex justify-center items-center transition-all h-10 w-full" typeColor="primary" text="modals.connect-to-meta.connect-to-meta" withBar={false} onClick={handleLoginWithMeta} disabled={authWindowOpen}/>
<Tippy className="!bg-neutral-900" arrow={false} content={t("modals.connect-to-meta.body.enter-token-manually-tooltip")} >
<p className="text-sm italic underline text-center -translate-y-1 leading-3 cursor-pointer" onClick={enterTokenManually}>{t("modals.connect-to-meta.body.enter-token-manually")}</p>
<button className="text-sm italic underline text-center -translate-y-1 leading-3 cursor-pointer" onClick={handleEnterTokenManually}>{t("modals.connect-to-meta.body.enter-token-manually")}</button>
</Tippy>
</form>
);
};
export enum MetaAuthMethod {
MANUAL = "manual",
META = "meta"
}
@@ -46,6 +46,7 @@ import { StaticConfigurationService } from "renderer/services/static-configurati
import { tryit } from "shared/helpers/error.helpers";
import { InstallationLocationService } from "renderer/services/installation-location.service";
import { AutoUpdaterService } from "renderer/services/auto-updater.service";
import { OculusDownloaderService } from "renderer/services/bs-version-download/oculus-downloader.service";
export function SettingsPage() {
@@ -55,6 +56,7 @@ export function SettingsPage() {
const modalService = useService(ModalService);
const bsDownloader = useService(BsDownloaderService);
const steamDownloader = useService(SteamDownloaderService);
const oculusDownloader = useService(OculusDownloaderService);
const progressBarService = useService(ProgressBarService);
const notificationService = useService(NotificationService);
const i18nService = useService(I18nService);
@@ -121,16 +123,17 @@ export function SettingsPage() {
});
};
const loadDownloadersSession = () => {
setHasDownloaderSession(steamDownloader.sessionExist());
const loadDownloadersSession = async () => {
setHasDownloaderSession(steamDownloader.sessionExist() || await oculusDownloader.metaSessionExists());
}
const clearDownloadersSession = () => {
const clearDownloadersSession = async () => {
if (!hasDownloaderSession) {
return;
}
steamDownloader.deleteSteamSession();
await oculusDownloader.deleteMetaSession()
notificationService.notifyInfo({
title: "pages.settings.steam-and-oculus.logout-success",
});
@@ -8,10 +8,9 @@ import { NotificationService } from "../notification.service";
import { ModalExitCode, ModalService } from "../modale.service";
import { DownloaderServiceInterface } from "./bs-store-downloader.interface";
import { AbstractBsDownloaderService } from "./abstract-bs-downloader.service";
import { DownloadInfo } from "main/services/bs-version-download/bs-steam-downloader.service";
import { MetaAuthErrorCodes, OculusDownloaderErrorCodes } from "shared/models/bs-version-download/oculus-download.model";
import { EnterMetaTokenModal } from "renderer/components/modal/modal-types/bs-downgrade/enter-meta-token-modal.component";
import { addFilterStringLog } from "renderer";
import { LoginToMetaModal } from "renderer/components/modal/modal-types/bs-downgrade/login-to-meta-modal.component";
import { OculusDownloadInfo } from "main/services/bs-version-download/bs-oculus-downloader.service";
export class OculusDownloaderService extends AbstractBsDownloaderService implements DownloaderServiceInterface{
@@ -69,7 +68,7 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme
);
}
private startDownloadBsVersion(downloadInfo: DownloadInfo): Observable<Progression<BSVersion>>{
private startDownloadBsVersion(downloadInfo: OculusDownloadInfo): Observable<Progression<BSVersion>>{
const ignoreCode = [MetaAuthErrorCodes.META_LOGIN_WINDOW_CLOSED_BY_USER, OculusDownloaderErrorCodes.DOWNLOAD_CANCELLED];
return this.handleDownload(
this.ipc.sendV2("bs-oculus-download", downloadInfo ),
@@ -77,25 +76,16 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme
);
}
private async doDownloadBsVersion(bsVersion: BSVersion, isVerification: boolean): Promise<BSVersion> {
private async doDownloadBsVersion(bsVersion: BSVersion, isVerification: boolean): Promise<BSVersion|undefined> {
const autoDownloadFailed = false;
const {exitCode, data: token} = await this.modals.openModal(LoginToMetaModal)
return (async () => {
if(exitCode !== ModalExitCode.COMPLETED){
return undefined
}
const tokenRes = await this.modals.openModal(EnterMetaTokenModal);
if(tokenRes.exitCode !== ModalExitCode.COMPLETED){
return false;
}
addFilterStringLog(tokenRes.data);
return lastValueFrom(this.startDownloadBsVersion({ bsVersion, isVerification, token: tokenRes.data })).then(() => true);
})().then(res => {
if(autoDownloadFailed || !res){
return lastValueFrom(this.startDownloadBsVersion({ bsVersion, isVerification, token })).then(() => true).then(res => {
if(!res){
return bsVersion;
}
@@ -121,4 +111,12 @@ export class OculusDownloaderService extends AbstractBsDownloaderService impleme
return lastValueFrom(this.ipc.sendV2("bs-oculus-stop-download"));
}
public deleteMetaSession(): Promise<void>{
return lastValueFrom(this.ipc.sendV2("delete-meta-session"));
}
public metaSessionExists(): Promise<boolean>{
return lastValueFrom(this.ipc.sendV2("meta-session-exists"));
}
}