/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
import React from 'react';
import { useStaticQuery, graphql } from 'gatsby';
import Img from 'gatsby-image';

interface Props {
  imageName?: string;
}

const DbImage = ({ imageName }: Props) => {
  const data = useStaticQuery(graphql`
    query {
      allImages: allFile(filter: {relativeDirectory: {eq: "src/images/databases"}}) {
        edges {
          node {
            childImageSharp {
              fixed(height: 50) {
                ...GatsbyImageSharpFixed
                originalName
              }
            }
          }
        }
      }
    }
  `);
  const images = data.allImages.edges.map((img) => img.node?.childImageSharp?.fixed);
  const filter = images.filter((img) => img?.originalName === imageName);
  return <Img fixed={filter[0]} />;
};

export default DbImage;
