aboutsummaryrefslogtreecommitdiff
path: root/front-end/src/store/socialMfaPlugin.ts
blob: e0ec97255fc7d8ebab11ad0dfe43a34b15e88963 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75

import 'pinia'
import { MaybeRef } from 'vue';
import {
    useUser,
    useOauthLogin,
    useSocialDefaultLogout,
    fetchSocialPortals,
    fromSocialPortals,
    fromSocialConnections,
} from '@vnuge/vnlib.browser'
import { get } from '@vueuse/core';
import { PiniaPluginContext, PiniaPlugin, storeToRefs } from 'pinia'
import { defer } from 'lodash-es';

type SocialMfaPlugin = ReturnType<typeof useOauthLogin>

declare module 'pinia' {
    export interface PiniaCustomProperties {
        socialOauth(): Promise<SocialMfaPlugin>
    }
}

export const socialMfaPlugin = (portalEndpoint?: MaybeRef<string>): PiniaPlugin => {

    return ({ store }: PiniaPluginContext) => {

        const { } = storeToRefs(store)
        const { logout } = useUser()

        //Create social login from available portals
        const defaultSocial = useSocialDefaultLogout(
            useOauthLogin([]),
            logout  //fallback to default logout
        );

        const _loadPromise = new Promise<SocialMfaPlugin>((resolve, _) => {

            if (get(portalEndpoint) == null) {
                return resolve(defaultSocial)
            }

            /*
                Try to load social methods from server, if it fails, then we will 
                fall back to default
             */

            defer(async () => {

                try {

                    const portals = await fetchSocialPortals(get(portalEndpoint)!);
                    const social = fromSocialPortals(portals);
                    const methods = fromSocialConnections(social);

                    //Create social login from available portals
                    const login = useOauthLogin(methods);

                    const socialOauth = useSocialDefaultLogout(login, logout);
                    resolve(socialOauth)

                } catch (error) {
                    //Let failure fall back to default
                    resolve(defaultSocial)
                }
            })
        })

        const socialOauth = () => _loadPromise

        return {
            socialOauth,
        }
    }
}