import {OOElement} from '../../elements/oo-element' import {html} from '../html' import {AuthProvider} from '../../type/auth-provider' import store from '../local-storage' import {SignedInDetail, SignedIn, SignedInError, SignedInErrorDetail} from '../../type/event' import {attach, dispatch} from '../notification' import weakMap from '../weak-map' import customEvent from '../../lib/custom-event' const ATTR = { DATA_PROVIDER: 'data-provider', DATA_INIT_NOTIFICATION: 'data-init-notification' } const EVENT = { SIGNED_IN: (detail: SignedInDetail): SignedIn => customEvent('signedin', detail), SIGNED_IN_ERROR: (detail: SignedInErrorDetail): SignedInError => customEvent('signedinerror', detail) } const asValidString = (data: string): AuthProvider => { if (data === 'google' || data === 'facebook' || data === 'github') { return data } return 'google' } const provider = weakMap() export default class extends OOElement { static get observedAttributes() { return [ATTR.DATA_PROVIDER] } get provider() { return provider.get(this) } constructor() { super() provider.set(this, asValidString(this.getAttribute(ATTR.DATA_PROVIDER))) attach() } connectedCallback() { super.connectedCallback() this.checkSignInStatus() } attributeChangedCallback(attr, prev, next) { if (prev === next) { return } provider.set(this, asValidString(next)) if (this.connected) { this.update() } } render() { const prov = provider.get(this) let label: string = prov switch (prov) { case 'google': label = 'Google' break case 'facebook': label = 'Facebook' break case 'github': label = 'GitHub' break default: break } return html` ` } protected async signIn() { // Sign in } checkSignInStatus() { if (typeof store.uid === 'string' && typeof store.token === 'string') { this.dispatchSignedIn({ token: store.token, uid: store.uid }) } } dispatchSignedIn(data: SignedInDetail) { this.dispatchEvent(EVENT.SIGNED_IN(data)) } dispatchSignedInError(data: SignedInErrorDetail) { dispatch({ message: `Sign-in failure/${data.message}`, type: 'error' }) this.dispatchEvent(EVENT.SIGNED_IN_ERROR(data)) } }