TheBird

GiftCard.jsx

3.7 kB · jsx · 95 lines

1import { useState } from "react";2import { GIFT } from "../config/shop.ts";3import { buyHref, giftUrl, money } from "../lib/shop.ts";4import { AddToBag } from "../components/AddToBag.jsx";5import { Breadcrumbs } from "../components/Breadcrumbs.jsx";67export const TIERS = [8  { tier: "mini", name: "Mini", tint: "--red", from: 11, to: 99 },9  { tier: "medi", name: "Medi", tint: "--green", from: 111, to: 999 },10  { tier: "maxi", name: "Maxi", tint: "--blue", from: 1111, to: 9999 },11];1213const FACE = "/bird/bird-128.png";1415const whole = (price) => String(Math.round(Number(price)));1617function Face({ card, amount }) {18  return (19    <figure className="face" style={{ "--tint": `var(${card.tint})` }}>20      <div className="face-top">21        <img src={FACE} alt="" width="28" height="28" />22        <span>carlomitchener.com</span>23      </div>24      <p className="face-amount mono">{amount}</p>25      <div className="face-foot">26        <span>Gift Card</span>27        <span>{card.name}</span>28      </div>29    </figure>30  );31}3233export function GiftCards({ cards }) {34  return (35    <div className="wrap">36      <Breadcrumbs trail={[{ name: "Gift Card" }]} />37      <div className="page-head">38        <h1>Gift Card</h1>39        <p className="lead">Three sizes, nine angel numbers each. Sent by email, never expires.</p>40      </div>41      <div className="gift-row">42        {cards.map((card) => (43          <a key={card.tier} className="gift-pick" href={giftUrl(card.tier)}>44            <Face card={card} amount={String(card.from)} />45            <h3>{`${card.name} Gift Card`}</h3>46            <span className="price">{`$${card.from} to $${card.to}`}</span>47          </a>48        ))}49      </div>50    </div>51  );52}5354export function GiftCard({ card, cards, product, buyPrefix }) {55  const [id, setId] = useState("");56  const variant = product.variants.find((one) => one.id === id) ?? product.variants[0];57  return (58    <div className="wrap">59      <Breadcrumbs trail={[{ name: "Gift Card", href: GIFT }, { name: card.name }]} />60      <article className="gift">61        <div className="left">62          <Face card={card} amount={whole(variant.price)} />63        </div>64        <div className="side">65          <div className="details">66            <h1>{`${card.name} Gift Card`}</h1>67            <p className="fine">{`Angel numbers from ${card.from} to ${card.to}.`}</p>68            <p className="price">{money(variant.price)}</p>69            <nav className="tiers" aria-label="Gift card size">70              {cards.map((one) => (71                <a key={one.tier} href={giftUrl(one.tier)} aria-current={one.tier === card.tier ? "page" : undefined}>72                  {one.name}73                </a>74              ))}75            </nav>76            <div className="sizes" role="group" aria-label="Amount">77              {product.variants.map((one) => (78                <button type="button" key={one.id} className="mono" aria-pressed={one.id === variant.id ? "true" : "false"} disabled={!one.available} onClick={() => setId(one.id)}>79                  {whole(one.price)}80                </button>81              ))}82            </div>83            <div className="buy">84              <AddToBag disabled={!product.available} line={{ id: variant.id, key: product.key, title: `${card.name} Gift Card`, size: `$${whole(variant.price)}`, price: variant.price, image: FACE }} />85              <a className="pill wide" href={buyHref(buyPrefix, variant.id)} data-buy rel="noopener">86                Buy now87              </a>88            </div>89            <p className="fine">Shopify emails the code after checkout. It buys anything in the shop, never expires and cannot be refunded.</p>90          </div>91        </div>92      </article>93    </div>94  );95}