aboutsummaryrefslogtreecommitdiff
path: root/front-end/src/store/socialMfaPlugin.ts
blob: 2f78f3a8d86076d480e9edc408e7fe456050b731 (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
76
77
78

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);

                    console.log(login.methods)

                    resolve(socialOauth)

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

        const socialOauth = () => _loadPromise

        return {
            socialOauth,
        }
    }
}