feat: Add Button-component

Signed-off-by: Tim Hårek Andreassen <tim@harek.no>
This commit is contained in:
Tim Hårek Andreassen 2024-04-12 11:26:38 +02:00
parent 800f8cb32d
commit ff98736a8e
No known key found for this signature in database
GPG Key ID: E59C7734F0E10EB5
3 changed files with 45 additions and 14 deletions

31
components/Button.tsx Normal file
View File

@ -0,0 +1,31 @@
import { ComponentChildren, JSX } from "preact";
type ButtonProps = {
children: ComponentChildren;
} & JSX.HTMLAttributes<HTMLButtonElement>;
const className = "p-2 border(gray-100 2) hover:bg-gray-200 bg-blue-200 w-max font-medium";
export function Button(props: ButtonProps) {
const { children, className: additionalClass = "", ...buttonProps } = props;
return (
<button className={`${className} ${additionalClass}`} {...buttonProps}>
{children}
</button>
);
}
type AnchorProps = {
children: ComponentChildren;
} & JSX.HTMLAttributes<HTMLAnchorElement>;
export function ButtonLink(props: AnchorProps) {
const { children, className: additionalClass = "", ...linkProps } = props;
return (
<a className={`${className} ${additionalClass}`} {...linkProps}>
{children}
</a>
);
}

View File

@ -1,5 +1,6 @@
import CopyButton from "../islands/CopyButton.tsx"; import CopyButton from "../islands/CopyButton.tsx";
import { SearchResult } from "../lib/nrk/nrk.ts"; import { SearchResult } from "../lib/nrk/nrk.ts";
import { ButtonLink } from "./Button.tsx";
export default function SeriesCard(props: { serie: SearchResult; origin: string }) { export default function SeriesCard(props: { serie: SearchResult; origin: string }) {
const feedUrl = new URL(`/api/feeds/${props.serie.seriesId}`, props.origin); const feedUrl = new URL(`/api/feeds/${props.serie.seriesId}`, props.origin);
@ -10,12 +11,9 @@ export default function SeriesCard(props: { serie: SearchResult; origin: string
<h3 className="text-xl font-semibold">{props.serie.title}</h3> <h3 className="text-xl font-semibold">{props.serie.title}</h3>
<p className="text-md">{props.serie.description}</p> <p className="text-md">{props.serie.description}</p>
<img src={image.uri} width={image.width} alt="" /> <img src={image.uri} width={image.width} alt="" />
<a <ButtonLink href={`podcast:${feedUrl.toString()}`} className="block">
className="block w-max bg-blue-100 text-black p-2 border-black border"
href={`podcast:${feedUrl.toString()}`}
>
📻 Åpne i din podkast-app 📻 Åpne i din podkast-app
</a> </ButtonLink>
<div className=""> <div className="">
<code className="font-mono bg-black text-white select-all p-2">{feedUrl.toString()}</code> <code className="font-mono bg-black text-white select-all p-2">{feedUrl.toString()}</code>
<CopyButton text={feedUrl.toString()}> <CopyButton text={feedUrl.toString()}>

View File

@ -1,14 +1,16 @@
import Preact from "preact"; import { ComponentChildren, JSX } from "preact";
import { useState } from "preact/hooks"; import { useState } from "preact/hooks";
import { IS_BROWSER } from "$fresh/runtime.ts"; import { IS_BROWSER } from "$fresh/runtime.ts";
import { Button } from "../components/Button.tsx";
type Props = { type Props = {
text: string; copyText: string;
children: Preact.ComponentChildren; children: ComponentChildren;
disabled?: boolean; disabled?: boolean;
}; } & JSX.HTMLAttributes<HTMLButtonElement>;
export default function CopyButton({ text, disabled = false, children }: Props) { export default function CopyButton(props: Props) {
const { copyText, disabled = false, children, ...buttonProps } = props;
const [clicked, setClicked] = useState(false); const [clicked, setClicked] = useState(false);
const startReset = () => { const startReset = () => {
@ -18,16 +20,16 @@ export default function CopyButton({ text, disabled = false, children }: Props)
}; };
return ( return (
<button <Button
onClick={() => { onClick={() => {
navigator.clipboard.writeText(text.toString()); navigator.clipboard.writeText(copyText.toString());
setClicked(true); setClicked(true);
startReset(); startReset();
}} }}
disabled={!IS_BROWSER || disabled} disabled={!IS_BROWSER || disabled}
class="px-2 py-1 border(gray-100 2) hover:bg-gray-200 mx-auto bg-blue-200" {...buttonProps}
> >
{clicked ? "Kopiert!" : children} {clicked ? "Kopiert!" : children}
</button> </Button>
); );
} }