import React, { useState, useEffect, ImgHTMLAttributes } from 'react'; import { avWebQLApi } from '@availity/api-axios'; import get from 'lodash/get'; const spaceIDQuery = ` query configurationFindById($id: ID!){ configurationFindOne(id: $id){ ...on PayerSpace{ images{ tile logo billboard } } } } `; const payerIDQuery = ` query configurationFindMany($payerIDs: [ID!], $types: [TypeEnum!]){ configurationPagination(filter: { payerIds: $payerIDs, types: $types }){ items { ...on PayerSpace { images{ tile logo billboard } } } } } `; const fetchLogo = async ( query: string, variables: Record, path: string, clientId: string ): Promise => { const response = await avWebQLApi.create( { query, variables }, { headers: { 'X-Client-ID': clientId } } ); return get((response as { data: { data: unknown } }).data.data, path); }; export const getLogo = async ( spaceId?: string | null, payerId?: string | null, clientId?: string ): Promise => { if (!clientId) { throw new Error('clientId is required'); } try { let url: string | undefined; if (spaceId) { const variables = { id: spaceId }; url = await fetchLogo(spaceIDQuery, variables, 'configurationFindOne.images.logo', clientId); } else if (payerId) { const variables = { payerIDs: [payerId], types: ['space'] }; url = await fetchLogo(payerIDQuery, variables, 'configurationPagination.items[0].images.logo', clientId); if (!url) { // eslint-disable-next-line unicorn/prefer-string-replace-all url = `/public/apps/eligibility/images/value-add-logos/${payerId.replace(/\s/g, '')}.gif`; } } return url; } catch { return undefined; } }; export interface PayerLogoProps extends Omit, 'src'> { /** Client ID to use to fetch the payer's logo. */ clientId: string; /** Required if `payerId` is not provided. The payer spaces ID for the payer for which you want a logo. */ spaceId?: string; /** Required if `spaceId` is not provided. The payer ID for the payer for which you want a logo. */ payerId?: string; } const PayerLogo = ({ spaceId, payerId, clientId, ...props }: PayerLogoProps) => { const [url, setUrl] = useState(); useEffect(() => { let cancelled = false; (async () => { const logoUrl = await getLogo(spaceId, payerId, clientId); if (!cancelled) setUrl(logoUrl); })(); return () => { cancelled = true; }; }, [spaceId, payerId, clientId]); if (!clientId || (!payerId && !spaceId)) return null; return Payer logo; }; export default PayerLogo;