bitcoin-s/website/pages/en/index.js

249 lines
8.0 KiB
JavaScript

/**
* Copyright (c) 2017-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
const React = require("react");
const CompLibrary = require("../../core/CompLibrary.js");
const MarkdownBlock = CompLibrary.MarkdownBlock; /* Used to read markdown */
const Container = CompLibrary.Container;
const GridBlock = CompLibrary.GridBlock;
const Logo = props => (
<div className="projectLogo">
<img src={props.img_src} alt="Project Logo" />
</div>
);
class HomeSplash extends React.Component {
render() {
const { siteConfig, language = "" } = this.props;
const { baseUrl, docsUrl } = siteConfig;
const docsPart = `${docsUrl ? `${docsUrl}/` : ""}`;
const langPart = `${language ? `${language}/` : ""}`;
const docUrl = doc => `${baseUrl}${docsPart}${langPart}${doc}`;
const SplashContainer = props => (
<div className="homeContainer">
<div className="homeSplashFade">
<div className="wrapper homeWrapper">{props.children}</div>
</div>
</div>
);
const ProjectTitle = () => (
<h2 className="projectTitle">
<small>{siteConfig.tagline}</small>
</h2>
);
const PromoSection = props => (
<div className="section promoSection">
<div className="promoRow">
<div className="pluginRowBlock">{props.children}</div>
</div>
</div>
);
return (
<SplashContainer>
<div className="inner">
<ProjectTitle siteConfig={siteConfig} />
<PromoSection>
{/*
<Button href="#try">Try It Out</Button>
<Button href={docUrl("doc1.html")}>Example Link</Button>
<Button href={docUrl("doc2.html")}>Example Link 2</Button> */}
</PromoSection>
</div>
</SplashContainer>
);
}
}
class Index extends React.Component {
render() {
const { config: siteConfig, language = "" } = this.props;
const { baseUrl, docsUrl } = siteConfig;
const docsPart = `${docsUrl ? `${docsUrl}/` : ""}`;
const langPart = `${language ? `${language}/` : ""}`;
const docUrl = doc => `${baseUrl}${docsPart}${langPart}${doc}`;
const Block = props => (
<Container
padding={["bottom", "top"]}
id={props.id}
background={props.background}
>
<GridBlock
align="center"
contents={props.children}
layout={props.layout}
/>
</Container>
);
const Button = props => (
<div style={props.style} className="pluginWrapper buttonWrapper">
<a className="dark-button" href={props.href} target={props.target}>
{props.children}
</a>
</div>
);
// cribbed from Bloop site, https://github.com/scalacenter/bloop/blob/6b5384241d1bba4143315e66f668876d65a2e34f/website/pages/en/index.js#L92
const Hero = ({ siteConfig }) => (
<div className="hero">
<div className="hero__container">
<Logo img_src={`${siteConfig.baseUrl}img/bitcoin-s-logo.svg`} />
<h1>{siteConfig.tagline}</h1>
<Button href={docUrl("getting-started")}>Get started</Button>
</div>
</div>
);
const TryOut = () => (
<Block id="try">
{[
{
content: [
"Use our RPC clients for `bitcoind`/Bitcoin Core and Eclair, and get powerful",
"static typing baked into your RPC calls. All returned values you get from `bitcoind`",
"and Eclair are converted into native Bitcoin/Lightning data structures for you.",
"Is that raw hex string you've been passing around a transaction or a Lightning invoice?",
"With Bitcoin-S you get both confidence in your code _and_ powerful methods available",
"on your data"
].join(" "),
image: `${baseUrl}img/undraw_target_kriv.svg`,
imageAlign: "left",
title: "Super-powered RPC clients"
}
]}
</Block>
);
const Description = () => (
<Block background="dark">
{[
{
content: [
"Bitcoin-S is used in production today, facilitating transactions and systems handling",
"millions of dollars each day. It has a very high degree of code coverage,",
"with unit tests, property based tests and integration tests."
].join(" "),
image: `${baseUrl}img/undraw_Security_on_s9ym.svg`,
imageAlign: "right",
title: "Battle tested, high quality code"
}
]}
</Block>
);
const LearnHow = () => (
<Block background="light">
{[
{
content: [
"We provide solid APIs for constructing and signing transactions.",
"From small-scale 1-in 2-out transactions, to custom logic powering exchange withdrawals, we've got you covered.",
"Check out our [`TxBuilder` example](docs/core/txbuilder) to see how."
].join(" "),
image: `${baseUrl}img/undraw_transfer_money_rywa.svg`,
imageAlign: "right",
title: "Construct and sign bitcoin transactions"
}
]}
</Block>
);
const Features = () => (
<Block layout="fourColumn">
{[
{
content: [
"Bitcoin-S allows you to interact with data structures found in the",
"Bitcoin and Lightning protocols as first-class citizens of your app.",
"Go back and forth between hex, byte and JVM representation trivially,",
"letting our abstractions focus on what you want to build"
].join(" "),
image: `${baseUrl}img/undraw_digital_currency_qpak.svg`,
imageAlign: "top",
title: "Deep protocol understanding"
},
{
content: [
"Code with confidence, knowing your data won't change under you. All",
"data structures in Bitcoin-S are immutable. This eliminates a big",
"range of bugs right away, and enable you to write concurrent code",
"much easier"
].join(" "),
image: `${baseUrl}img/undraw_code_review_l1q9.svg`,
imageAlign: "top",
title: "Immutable data structures"
},
{
content: [
"Get the compiler to work for you, ensuring your logic covers all cases.",
"Modelling your application with mathematically founded types enables greater confidence in the correctness of your code"
].join(" "),
image: `${baseUrl}img/undraw_mathematics_4otb.svg`,
imageAlign: "top",
title: "Algebraic data types"
}
]}
</Block>
);
const Showcase = () => {
if ((siteConfig.users || []).length === 0) {
return null;
}
const showcase = siteConfig.users
.filter(user => user.pinned)
.map(user => (
<a href={user.infoLink} key={user.infoLink}>
<img src={user.image} alt={user.caption} title={user.caption} />
</a>
));
const pageUrl = page => baseUrl + (language ? `${language}/` : "") + page;
return (
<div className="productShowcaseSection paddingBottom">
<h2>Who is using Bitcoin-S?</h2>
<p>
Bitcoin-S is used in production applications, by both small and
large companies
</p>
<div className="logos">{showcase}</div>
<div className="more-users">
<a className="button" href={pageUrl("users.html")}>
Read more
</a>
</div>
</div>
);
};
return (
<div>
<Hero siteConfig={siteConfig} />
<div className="mainContainer">
<Features />
<LearnHow />
<TryOut />
<Description />
<Showcase />
</div>
</div>
);
}
}
module.exports = Index;