import { createSelector } from 'reselect' import { IAvatarState, IGravatarStatusByEmail, IGravatarByEmail, ICompanyLogoStatusByDomain, ICompanyLogoByDomain, } from './interfaces' import { Status } from '../../interfaces/status' import { extractDomain } from './helpers' interface EmailProps { email: string, } export const root = (state: any): IAvatarState => state.avatar export const gravatarStatusByEmail = (state: any): IGravatarStatusByEmail => root(state).gravatarStatusByEmail export const gravatarByEmail = (state: any): IGravatarByEmail => root(state).gravatarByEmail export const gravatarDataUrlByEmail = (state: any): IGravatarByEmail => root(state).gravatarDataUrlByEmail export const companyLogoStatusByDomain = (state: any): ICompanyLogoStatusByDomain => root(state).companyLogoStatusByDomain export const companyLogoByDomain = (state: any): ICompanyLogoByDomain => root(state).companyLogoByDomain export const companyDataUrlLogoByDomain = (state: any): ICompanyLogoByDomain => root(state).companyLogoDataUrlByDomain const emailFromProps = (state: any, { email }: EmailProps) => email export const makeAvatarDataUrl = (email: string) => createSelector([ gravatarDataUrlByEmail, companyDataUrlLogoByDomain, ], ( gravatarByEmail: IGravatarByEmail, companyLogoByDomain: ICompanyLogoByDomain, ) => { const domain = extractDomain(email) if (companyLogoByDomain[domain]) { return companyLogoByDomain[domain] } else if (gravatarByEmail[email]) { return gravatarByEmail[email] } }) export const makeAvatarUrl = () => { return createSelector([ gravatarByEmail, companyLogoByDomain, emailFromProps, ], ( gravatarByEmail: IGravatarByEmail, companyLogoByDomain: ICompanyLogoByDomain, email: string, ): string => { const domain = extractDomain(email) if (companyLogoByDomain[domain]) { return companyLogoByDomain[domain] } else if (gravatarByEmail[email]) { return gravatarByEmail[email] } }) } export const makeAvatarStatus = () => { return createSelector([ gravatarStatusByEmail, companyLogoStatusByDomain, emailFromProps, ], ( gravatarStatusByEmail: IGravatarStatusByEmail, companyLogoStatusByDomain: ICompanyLogoStatusByDomain, email: string, ): Status => { const domain = extractDomain(email) const companyLogoStatus = companyLogoStatusByDomain[domain] if (companyLogoStatus === Status.Success || companyLogoStatus === Status.Pending) { return companyLogoStatus } return gravatarStatusByEmail[email] }) }