website/src/pages/showcase.tsx (67 lines of code) (raw):
import type { FC } from 'react';
import React from 'react';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Translate, { translate } from '@docusaurus/Translate';
import Layout from '@theme/Layout';
import '../css/showcase.scss';
const Container: FC = (props) => {
  const { children } = props;
  return (
    <div className="hero text--center showcase">
      <div className="container">
        {children}
      </div>
    </div>
  );
};
const Header: FC = () => (
  <div className="header">
    <div className="title">
      <Translate id="showcase.website.title">Showcase</Translate>
    </div>
    <div className="tips">
      <Translate id="showcase.website.tips.used">This project is used by all these folks</Translate>
      <br />
      <Translate id="showcase.website.tips.wantUse">Are you using this project? </Translate>
      <a
        href="https://github.com/apache/apisix/blob/master/powered-by.md"
        target="_blank"
        rel="noopener noreferrer"
      >
        <u><Translate id="showcase.website.link.addYourCompany">Add your company</Translate></u>
      </a>
    </div>
  </div>
);
interface UserCardProps {
  infoLink: string;
  image: string;
  caption: string;
}
const UserCard: FC<UserCardProps> = (props) => {
  const { infoLink, image, caption } = props;
  return (
    <div className="user-card">
      <a href={infoLink}>
        <img className="logo" src={image} alt={caption} />
      </a>
    </div>
  );
};
const Content: FC = () => {
  const { siteConfig } = useDocusaurusContext();
  const { showcases = [] } = siteConfig.customFields as { showcases: UserCardProps[] };
  if (!showcases.length) {
    return null;
  }
  const showcaseList = showcases.map((user) => (
    <div className="col col--2 item" key={user.infoLink}>
      <UserCard
        image={`https://static.apiseven.com/202202/${user.image}`}
        caption={user.caption}
        infoLink={user.infoLink}
      />
    </div>
  ));
  return (
    <div className="row content">
      {showcaseList}
    </div>
  );
};
const Showcase: FC = () => (
  <Layout title={translate({ message: 'ShowCase' })}>
    <Container>
      <Header />
      <Content />
    </Container>
  </Layout>
);
export default Showcase;