I currently have a component that takes a currencyCode and returns an SVG of the corresponding country. I want to expand the component for instances whereby we want to search by country name and not by currency code. The current props that are passed into the component are:
currencyCode – which is something like “AED” & countryLabel – which is something like “United Arab Emirates”
import Afghanistan from "./CountryFlags/Afghanistan.js";
// condensed imports
const currencyCodeMap = {
  AED: UnitedArabEmirates,
  AFN: Afghanistan,
  ALL: Albania,
  AMD: Armenia,
  AOA: Angola,
  ARS: Argentina,
  AUD: Australia,
  AZN: Azerbaijan,
};
type Props = {
  currencyCode?: string,
  countryLabel?: string,
  className?: string,
};
const CountryFlag = ({ currencyCode, countryLabel, className }: Props) => {
  const FlagComponent = currencyCodeMap[currencyCode];
  if (!FlagComponent) {
    return <StyledIcon isOberonIcon={true} name={"countryFallback"} />;
  }
  return (
    <StyledImageWrapper className={className}>
      <FlagComponent />
    </StyledImageWrapper>
  );
};
I tried to update my currencyCodeMap to something like:
AED | "United Arab Emirates" so that either the label or the code would return a flag, but no joy. Any suggestions?
Advertisement
Answer
AED | "United Arab Emirates" is not valid JavaScript syntax.
Why not have an object like:
type CountryEntry = {
  currencyCode: string,
  countryLabel: string,
  flagComponent: JSX.Element
}
Then have an array of these and use .find() to get the component.
It would look something like this:
import Afghanistan from "./CountryFlags/Afghanistan.js";
type Props = {
  currencyCode?: string,
  countryLabel?: string,
  className?: string,
};
type CountryEntry = {
  currencyCode: string,
  countryLabel: string,
  flagComponent: JSX.Element
}
const flags: CountryEntry[] = [
  { currencyCode: "AFN", countryLabel: "Afghanistan", flagComponent: Afghanistan },
/* ... */
];
const CountryFlag = ({ currencyCode, countryLabel, className }: Props) => {
  const countryEntry = flags.find(
    (f) => f.countryLabel === countryLabel || f.currencyCode === currencyCode
  );
  if (!countryEntry) {
    return <StyledIcon isOberonIcon={true} name={"countryFallback"} />;
  } else {
    const FlagComponent = countryEntry.flagComponent;
    
    return (
      <StyledImageWrapper className={className}>
        <FlagComponent />
      </StyledImageWrapper>
    );
};