@keycloakify/keycloak-account-ui
Version:
<p align="center"> <img src="https://github.com/user-attachments/assets/e31c4910-7205-441c-9a35-e134b806b3a8"> </p> <p align="center"> <i>Repackaged Keycloak Account UI</i> <br> <br> <a href="https://github.com/keycloakify/keycloak-a
159 lines (141 loc) • 4.2 kB
text/typescript
import {
BaseEnvironment,
type KeycloakContext,
} from "@keycloakify/keycloak-account-ui/ui-shared";
import { joinPath } from "@keycloakify/keycloak-account-ui/utils/joinPath";
import { parseResponse } from "@keycloakify/keycloak-account-ui/api/parse-response";
import {
ClientRepresentation,
CredentialContainer,
DeviceRepresentation,
Group,
LinkedAccountRepresentation,
Permission,
UserRepresentation,
} from "@keycloakify/keycloak-account-ui/api/representations";
import { request } from "@keycloakify/keycloak-account-ui/api/request";
export type CallOptions = {
context: KeycloakContext<BaseEnvironment>;
signal?: AbortSignal;
};
export type PaginationParams = {
first: number;
max: number;
};
export async function getPersonalInfo({
signal,
context,
}: CallOptions): Promise<UserRepresentation> {
const response = await request("/?userProfileMetadata=true", context, {
signal,
});
return parseResponse<UserRepresentation>(response);
}
export async function getSupportedLocales({
signal,
context,
}: CallOptions): Promise<string[]> {
const response = await request("/supportedLocales", context, { signal });
return parseResponse<string[]>(response);
}
export async function savePersonalInfo(
context: KeycloakContext<BaseEnvironment>,
info: UserRepresentation,
): Promise<void> {
const response = await request("/", context, { body: info, method: "POST" });
if (!response.ok) {
const { errors } = await response.json();
throw errors;
}
return undefined;
}
export async function getPermissionRequests(
resourceId: string,
{ signal, context }: CallOptions,
): Promise<Permission[]> {
const response = await request(
`/resources/${resourceId}/permissions/requests`,
context,
{ signal },
);
return parseResponse<Permission[]>(response);
}
export async function getDevices({
signal,
context,
}: CallOptions): Promise<DeviceRepresentation[]> {
const response = await request("/sessions/devices", context, { signal });
return parseResponse<DeviceRepresentation[]>(response);
}
export async function getApplications({
signal,
context,
}: CallOptions): Promise<ClientRepresentation[]> {
const response = await request("/applications", context, { signal });
return parseResponse<ClientRepresentation[]>(response);
}
export async function deleteConsent(
context: KeycloakContext<BaseEnvironment>,
id: string,
) {
return request(`/applications/${id}/consent`, context, { method: "DELETE" });
}
export async function deleteSession(
context: KeycloakContext<BaseEnvironment>,
id?: string,
) {
return request(`/sessions${id ? `/${id}` : ""}`, context, {
method: "DELETE",
});
}
export async function getCredentials({ signal, context }: CallOptions) {
const response = await request("/credentials", context, {
signal,
});
return parseResponse<CredentialContainer[]>(response);
}
export async function getLinkedAccounts({ signal, context }: CallOptions) {
const response = await request("/linked-accounts", context, { signal });
return parseResponse<LinkedAccountRepresentation[]>(response);
}
export async function unLinkAccount(
context: KeycloakContext<BaseEnvironment>,
account: LinkedAccountRepresentation,
) {
const response = await request(
"/linked-accounts/" + account.providerName,
context,
{
method: "DELETE",
},
);
if (response.ok) return;
return parseResponse(response);
}
export async function linkAccount(
context: KeycloakContext<BaseEnvironment>,
account: LinkedAccountRepresentation,
) {
const redirectUri = encodeURIComponent(
joinPath(
context.environment.serverBaseUrl,
"realms",
context.environment.realm,
"account",
),
);
const response = await request(
"/linked-accounts/" + account.providerName,
context,
{
searchParams: { providerId: account.providerName, redirectUri },
},
);
return parseResponse<{ accountLinkUri: string }>(response);
}
export async function getGroups({ signal, context }: CallOptions) {
const response = await request("/groups", context, {
signal,
});
return parseResponse<Group[]>(response);
}