feat(account): Implement account and organization management features

This commit is contained in:
2024-10-06 23:56:03 +02:00
parent 2c0e771da2
commit f7600ca83f
26 changed files with 1036 additions and 240 deletions
+8 -24
View File
@@ -17,7 +17,7 @@ import '@uptime.link/webwidget';
import '@design.estate/dees-catalog';
import { DeesForm, DeesFormSubmit, DeesInputText } from '@design.estate/dees-catalog';
import { IdpState } from '../idp.state.js';
import { IdpState } from '../states/idp.state.js';
declare global {
interface HTMLElementTagNameMap {
@@ -94,7 +94,7 @@ export class IdpLoginPrompt extends DeesElement {
></dees-input-text>
<dees-form-submit id="loginSubmitButton"></dees-form-submit>
</dees-form>
<dees-button type="discreet" class="registerButton" @click=${async () => {
<dees-button type="discreet" class="registerButton" @clicked=${async () => {
const idpState = await IdpState.getSingletonInstance();
idpState.domtools.router.pushUrl('/register');
}}>Register instead</dees-button>
@@ -124,7 +124,11 @@ export class IdpLoginPrompt extends DeesElement {
}
private login = async (valueArg: { emailAddress: string; passwordArg: string }) => {
// lets disable the register button
const registerButton: plugins.deesCatalog.DeesButton = this.shadowRoot.querySelector('.registerButton');
registerButton.disabled = true;
// lets define the needed requests
const idpState = await IdpState.getSingletonInstance();
const loginForm: DeesForm = this.shadowRoot.querySelector('#loginForm');
const loginRequestWithUsernameAndPassword =
new domtools.TypedRequest<plugins.idpInterfaces.request.IReq_LoginWithEmailOrUsernameAndPassword>(
@@ -154,9 +158,10 @@ export class IdpLoginPrompt extends DeesElement {
}
if (response.refreshToken) {
loginForm.setStatus('pending', 'obtained refreshToken...');
const jwt = await this.handleRefreshToken(response.refreshToken, 0);
const jwt = await idpState.idpClient.refreshJwt(response.refreshToken);
if (jwt) {
loginForm.setStatus('success', 'obtained jwt.');
idpState.domtools.router.pushUrl('/account');
} else {
loginForm.setStatus('error', 'something went wrong');
}
@@ -190,27 +195,6 @@ export class IdpLoginPrompt extends DeesElement {
}
}
public async handleRefreshToken(refreshTokenArg: string, delayDispatchMillisArg = 0) {
// a refreshToken binds dierctly to a session.
// the refresh token is used on a continuous basis to get fresh and short-lived jwts
const refreshJwt = new domtools.TypedRequest<plugins.idpInterfaces.request.IReq_RefreshJwt>(
'/typedrequest',
'refreshJwt'
);
const responseJwt = await refreshJwt.fire({
refreshToken: refreshTokenArg,
});
if (responseJwt.jwt) {
this.domtools.convenience.smartdelay.delayFor(delayDispatchMillisArg).then(() => {
this.dispatchJwt(responseJwt.jwt);
});
return responseJwt.jwt;
} else {
return null;
}
}
public async focus() {
(
this.shadowRoot.querySelector('#loginEmailInput') as plugins.deesCatalog.DeesInputText