Skip to content

Commit 78584be

Browse files
feat: added new onError param to base-login-provider and login-provider to handle onError resolving of loading script errors. (#811)
feat: added onHasErrorChange/hasError and onIsLoadedChange/isLoaded to handle error event handling and loaded event handling based on your provider config. chore: implemented error/loading methods for all providers chore: updated readme with new error and loaded handling example
1 parent 2fa0325 commit 78584be

File tree

10 files changed

+99
-9
lines changed

10 files changed

+99
-9
lines changed

projects/angularx-social-login/README.md

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,34 @@ this.authService.signIn(FacebookLoginProvider.PROVIDER_ID, fbLoginOptions);
390390
ng build angularx-social-login
391391
ng serve
392392
```
393+
394+
## Error & Loading Handling
395+
To handle errors and loaded events you can use the `BaseLoginProvider` object from your `SocialAuthServiceConfig`
396+
397+
398+
``` typescript
399+
// inject the SOCIAL_AUTH_CONFIG into your component
400+
providerConfig: SocialAuthServiceConfig | Promise<SocialAuthServiceConfig> = inject(SOCIAL_AUTH_CONFIG);
401+
402+
...
403+
404+
async SetUpProviderHandling() {
405+
// get the injected providerConfig as a SocialAuthServiceConfig.
406+
const providerConfig = await this.providerConfig;
407+
// get your provider config based on the ProviderId
408+
const foundProviderConfig = providerConfig.providers.find(x => x.id == MyProvider.PROVIDER_ID);
409+
if(foundProviderConfig && foundProviderConfig.provider) {
410+
foundProviderConfig.provider.onHasErrorChange.subscribe(value => {
411+
// handle errors on change here
412+
});
413+
// set the base has error result here.
414+
const hasError = foundProviderConfig.provider.hasError;
415+
416+
foundProviderConfig.provider.onIsLoadedChange.subscribe(value => {
417+
// handle isLoading on change here
418+
});
419+
// set the base isLoaded result here.
420+
const hasError = foundProviderConfig.provider.isLoaded;
421+
}
422+
}
423+
```

projects/angularx-social-login/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@abacritt/angularx-social-login",
3-
"version": "2.5.1",
3+
"version": "2.5.2",
44
"description": "Social login and authentication module for Angular 19. Supports authentication with Google, Facebook, Amazon, and VK. Can be extended to other providers also.",
55
"repository": {
66
"type": "git",

projects/angularx-social-login/src/entities/base-login-provider.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,17 @@ export abstract class BaseLoginProvider implements LoginProvider {
1010
abstract signIn(signInOptions?: object): Promise<SocialUser>;
1111
abstract signOut(revoke?: boolean): Promise<void>;
1212
refreshToken?(): Promise<SocialUser | null>;
13+
readonly onHasErrorChange: EventEmitter<boolean> = new EventEmitter();
14+
readonly onIsLoadedChange: EventEmitter<boolean> = new EventEmitter();
15+
hasError: boolean = false;
16+
isLoaded: boolean = false;
1317

1418
protected loadScript(
1519
id: string,
1620
src: string,
1721
onload: any,
18-
parentElement: any = null
22+
parentElement: any = null,
23+
onError: any = null
1924
): void {
2025
// get document if platform is only browser
2126
if (typeof document !== 'undefined' && !document.getElementById(id)) {
@@ -24,6 +29,7 @@ export abstract class BaseLoginProvider implements LoginProvider {
2429
signInJS.async = true;
2530
signInJS.src = src;
2631
signInJS.onload = onload;
32+
signInJS.onerror = onError;
2733

2834
if (!parentElement) {
2935
parentElement = document.head;

projects/angularx-social-login/src/entities/login-provider.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ export interface LoginProvider {
88
signIn(signInOptions?: object): Promise<SocialUser>;
99
signOut(revoke?: boolean): Promise<void>;
1010
refreshToken?(): Promise<SocialUser | null>;
11+
readonly onHasErrorChange: EventEmitter<boolean>;
12+
readonly onIsLoadedChange: EventEmitter<boolean>;
13+
hasError: boolean;
14+
isLoaded: boolean;
1115
}

projects/angularx-social-login/src/providers/amazon-login-provider.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,17 @@ export class AmazonLoginProvider extends BaseLoginProvider {
3434
return new Promise((resolve, reject) => {
3535
try {
3636
// @ts-ignore
37-
this.loadScript('amazon-login-sdk', 'https://assets.loginwithamazon.com/sdk/na/login1.js', () => {resolve();}, amazonRoot);
37+
this.loadScript('amazon-login-sdk', 'https://assets.loginwithamazon.com/sdk/na/login1.js', () => {resolve();}, amazonRoot,
38+
() => {
39+
this.hasError = true;
40+
this.onHasErrorChange.emit(this.hasError);
41+
reject(`There was an issue loading the ${AmazonLoginProvider.PROVIDER_ID} authentication script.`);
42+
});
3843
} catch (err) {
3944
reject(err);
45+
} finally {
46+
this.isLoaded = true;
47+
this.onIsLoadedChange.emit(this.isLoaded);
4048
}
4149
});
4250
}

projects/angularx-social-login/src/providers/dummy-login-provider.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ export class DummyLoginProvider extends BaseLoginProvider {
6464

6565
getLoginStatus(): Promise<SocialUser> {
6666
return new Promise((resolve, reject) => {
67+
this.isLoaded = true;
68+
this.onIsLoadedChange.emit(this.isLoaded);
6769
if (this.loggedIn) {
6870
resolve(this.dummy);
6971
} else {

projects/angularx-social-login/src/providers/facebook-login-provider.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,19 @@ export class FacebookLoginProvider extends BaseLoginProvider {
3838
});
3939

4040
resolve();
41-
}
41+
},
42+
null,
43+
() => {
44+
this.hasError = true;
45+
this.onHasErrorChange.emit(this.hasError);
46+
reject(`There was an issue loading the ${FacebookLoginProvider.PROVIDER_ID} authentication script.`);
47+
}
4248
);
4349
} catch (err) {
4450
reject(err);
51+
} finally {
52+
this.isLoaded = true;
53+
this.onIsLoadedChange.emit(this.isLoaded);
4554
}
4655
});
4756
}

projects/angularx-social-login/src/providers/google-login-provider.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,18 @@ export class GoogleLoginProvider extends BaseLoginProvider {
115115
}
116116

117117
resolve();
118-
}
119-
);
118+
},
119+
null,
120+
() => {
121+
this.hasError = true;
122+
this.onHasErrorChange.emit(this.hasError);
123+
reject(`There was an issue loading the ${GoogleLoginProvider.PROVIDER_ID} authentication script.`);
124+
});
120125
} catch (err) {
121126
reject(err);
127+
} finally {
128+
this.isLoaded = true;
129+
this.onIsLoadedChange.emit(this.isLoaded);
122130
}
123131
});
124132
}

projects/angularx-social-login/src/providers/microsoft-login-provider.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ export class MicrosoftLoginProvider extends BaseLoginProvider {
122122

123123
initialize(): Promise<void> {
124124
return new Promise((resolve, reject) => {
125+
try {
125126
this.loadScript(
126127
MicrosoftLoginProvider.PROVIDER_ID,
127128
'https://alcdn.msauth.net/browser/2.13.1/js/msal-browser.min.js',
@@ -146,8 +147,20 @@ export class MicrosoftLoginProvider extends BaseLoginProvider {
146147
} catch (e) {
147148
reject(e);
148149
}
150+
},
151+
null,
152+
() => {
153+
this.hasError = true;
154+
this.onHasErrorChange.emit(this.hasError);
155+
reject(`There was an issue loading the ${MicrosoftLoginProvider.PROVIDER_ID} authentication script.`);
149156
}
150157
);
158+
} catch (err) {
159+
reject(err);
160+
} finally {
161+
this.isLoaded = true;
162+
this.onIsLoadedChange.emit(this.isLoaded);
163+
}
151164
});
152165
}
153166

@@ -206,8 +219,8 @@ export class MicrosoftLoginProvider extends BaseLoginProvider {
206219
}
207220
}
208221

209-
async signIn(): Promise<SocialUser> {
210-
const loginResponse = await this._instance.loginPopup({
222+
async signIn(options: MSALLoginRequest | undefined = undefined): Promise<SocialUser> {
223+
const loginResponse = await this._instance.loginPopup(options ? options : {
211224
scopes: this.initOptions.scopes,
212225
prompt: this.initOptions.prompt,
213226
});

projects/angularx-social-login/src/providers/vk-login-provider.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,19 @@ export class VKLoginProvider extends BaseLoginProvider {
5555
});
5656

5757
resolve();
58-
}
58+
},
59+
null,
60+
() => {
61+
this.hasError = true;
62+
this.onHasErrorChange.emit(this.hasError);
63+
reject(`There was an issue loading the ${VKLoginProvider.PROVIDER_ID} authentication script.`);
64+
}
5965
);
6066
} catch (err) {
6167
reject(err);
68+
} finally {
69+
this.isLoaded = true;
70+
this.onIsLoadedChange.emit(this.isLoaded);
6271
}
6372
});
6473
}

0 commit comments

Comments
 (0)