feat: login_challenge and scope storing, mock api

This commit is contained in:
2025-07-26 14:49:48 +04:00
parent a1a9e0dc93
commit 9a97411bfd
20 changed files with 424 additions and 85 deletions

View File

@ -1,28 +1,63 @@
"use client";
import { FC, useEffect, useState } from "react";
import { redirect } from "next/navigation";
import { useSelector } from "react-redux";
import { Button, Text } from "@mantine/core";
import SERVICES from "@/constants/services";
import { ServiceCode } from "@/enums/ServiceCode";
import SCOPES from "@/constants/scopes";
import { Scopes } from "@/enums/Scopes";
import { notifications } from "@/lib/notifications";
import { RootState } from "@/lib/store";
import ServiceData from "@/types/ServiceData";
import { AuthService } from "@/mocks/authService";
const ConsentButton: FC = () => {
const serviceCode = useSelector(
(state: RootState) => state.targetService.serviceCode
);
const [serviceData, setServiceData] = useState<ServiceData>();
const auth = useSelector((state: RootState) => state.auth);
const [clientName, setClientName] = useState<string>(Scopes.UNDEFINED);
const [serviceRequiredAccess, setServiceRequiredAccess] =
useState<string>("");
const setAccessesForScope = () => {
const accesses: string[] = [];
(auth.scope ?? []).forEach((scopeItem: Scopes) => {
const access = SCOPES[scopeItem];
if (access) accesses.push(access);
});
setServiceRequiredAccess(accesses.join("\n"));
};
const requestConsent = () => {
if (!auth.loginChallenge || auth.scope.length === 0) return;
new AuthService()
.requestConsent(auth.loginChallenge)
.then(response => response.data)
.then(({ clientName }) => {
setClientName(clientName);
})
.catch(error => {
console.error(error);
notifications.error({ message: error.toString() });
});
};
useEffect(() => {
if (serviceCode === ServiceCode.UNDEFINED) {
redirect("services");
}
setServiceData(SERVICES[serviceCode]);
}, [serviceCode]);
setAccessesForScope();
requestConsent();
}, []);
const confirmAccess = () => {};
const confirmAccess = () => {
if (!auth.loginChallenge) return;
new AuthService()
.approveConsent(auth.loginChallenge)
.then(response => response.data)
.then(({ redirectUrl }) => {
window.location.href = redirectUrl;
})
.catch(error => {
console.error(error);
notifications.error({ message: error.toString() });
});
};
return (
<>
@ -34,8 +69,7 @@ const ConsentButton: FC = () => {
<Text
fz={"h4"}
ta="center">
Сервис {serviceData?.name} получит{" "}
{serviceData?.requiredAccesses}
Сервис {clientName} получит {serviceRequiredAccess}
</Text>
</>
);