Skip to content

Commit

Permalink
feat: preview on template splash (#85)
Browse files Browse the repository at this point in the history
  • Loading branch information
QuiiBz authored Apr 14, 2024
1 parent 7387ca4 commit 9f1d957
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 30 deletions.
Binary file added apps/dashboard/public/images/linkedin.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/dashboard/public/images/x.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions apps/dashboard/src/components/ExportModal/Embed.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import {
Tooltip,
IconButton,
} from "@radix-ui/themes";
import { toast } from "sonner";
import { useUser } from "../../lib/hooks/useUser";
import { CopyIcon } from "../icons/CopyIcon";

Expand Down Expand Up @@ -69,6 +70,8 @@ export function Embed({ exportedKey, dynamicTexts }: EmbedProps) {

if (embed?.textContent) {
void navigator.clipboard.writeText(embed.textContent);

toast.success("Copied to clipboard!");
}
}

Expand Down
23 changes: 5 additions & 18 deletions apps/dashboard/src/components/ExportModal/Preview.tsx
Original file line number Diff line number Diff line change
@@ -1,36 +1,23 @@
import { Flex, SegmentedControl, Text, TextField } from "@radix-ui/themes";
import { startTransition, useState } from "react";
import { Flex, Text, TextField } from "@radix-ui/themes";
import { startTransition } from "react";
import { OgImage } from "../OgImage";
import { useElementsStore } from "../../stores/elementsStore";
import { usePreviewControls } from "../../lib/hooks/usePreviewControls";

interface PreviewProps {
dynamicTexts: Record<string, string>;
setDynamicTexts: (dynamicTexts: Record<string, string>) => void;
}

export function Preview({ dynamicTexts, setDynamicTexts }: PreviewProps) {
const [preview, setPreview] = useState<"x" | "linkedin">("x");
const { preview, PreviewControls } = usePreviewControls();
const elements = useElementsStore((state) => state.elements);

return (
<Flex direction="column" gap="4">
<Flex align="center" justify="between">
<Text size="5">Preview</Text>
<Flex align="center" gap="4">
<SegmentedControl.Root
onValueChange={(value) => {
startTransition(() => {
setPreview(value as typeof preview);
});
}}
value={preview}
>
<SegmentedControl.Item value="x">X (Twitter)</SegmentedControl.Item>
<SegmentedControl.Item value="linkedin">
LinkedIn
</SegmentedControl.Item>
</SegmentedControl.Root>
</Flex>
<PreviewControls />
</Flex>
<Flex gap="6" justify="between">
<OgImage
Expand Down
2 changes: 1 addition & 1 deletion apps/dashboard/src/components/OgImage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ function OgImageInnerClient({
return <img alt="" src={src} />;
}

async function OgImageInnerServer({
export async function OgImageInnerServer({
elements,
dynamicTexts,
mockDynamicTexts,
Expand Down
10 changes: 6 additions & 4 deletions apps/dashboard/src/components/Splash/HomeSplashMyImages.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,12 @@ export function HomeSplashMyImages() {
router.push(`/editor/${id}`);
}}
>
<AddIcon height="1.4em" width="1.4em" />
<Text as="span" size="2">
Start from scratch
</Text>
<Flex align="center" gap="1">
<AddIcon height="1.4em" width="1.4em" />
<Text as="span" size="2">
Start from scratch
</Text>
</Flex>
</OgImage>
{images.slice(0, 2).map((image) => (
<OgImage
Expand Down
10 changes: 6 additions & 4 deletions apps/dashboard/src/components/Splash/MyImagesSplash.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,12 @@ export function MyImagesSplash() {
router.push(`/editor/${id}`);
}}
>
<AddIcon height="1.4em" width="1.4em" />
<Text as="span" size="2">
Start from scratch
</Text>
<Flex align="center" gap="1">
<AddIcon height="1.4em" width="1.4em" />
<Text as="span" size="2">
Start from scratch
</Text>
</Flex>
</OgImage>
{images.map((image) => (
<OgImage
Expand Down
9 changes: 6 additions & 3 deletions apps/dashboard/src/components/Splash/TemplateSplash.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ import Link from "next/link";
import { Button, Flex, Text } from "@radix-ui/themes";
import { ArrowLeftIcon } from "../icons/ArrowLeftIcon";
import type { Template } from "../../lib/templates";
import { OgImage } from "../OgImage";
import { OgImageInnerServer } from "../OgImage";
import { TemplateSplashButton } from "./TemplateSplashButton";
import { TemplateSplashPreview } from "./TemplateSplashPreview";

interface TemplateSplashProps {
template: Template;
Expand All @@ -21,8 +22,10 @@ export function TemplateSplash({ template }: TemplateSplashProps) {
</Link>
</Button>
</Flex>
<Flex gap="4" justify="between">
<OgImage elements={template.elements} size="medium" />
<Flex gap="8" justify="between">
<TemplateSplashPreview
image={<OgImageInnerServer elements={template.elements} />}
/>
<Flex direction="column" gap="4">
<Text as="p" size="2">
{template.description}
Expand Down
22 changes: 22 additions & 0 deletions apps/dashboard/src/components/Splash/TemplateSplashPreview.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
"use client";
import { Flex } from "@radix-ui/themes";
import type { ReactNode } from "react";
import { OgImage } from "../OgImage";
import { usePreviewControls } from "../../lib/hooks/usePreviewControls";

interface TemplateSplashPreviewProps {
image: ReactNode;
}

export function TemplateSplashPreview({ image }: TemplateSplashPreviewProps) {
const { preview, PreviewControls } = usePreviewControls();

return (
<Flex direction="column" gap="4">
<OgImage preview={preview} size="medium">
{image}
</OgImage>
<PreviewControls />
</Flex>
);
}
48 changes: 48 additions & 0 deletions apps/dashboard/src/lib/hooks/usePreviewControls.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { Flex, SegmentedControl } from "@radix-ui/themes";
import Image from "next/image";
import { useMemo, useState } from "react";

export function usePreviewControls() {
const [preview, setPreview] = useState<"x" | "linkedin">("x");

const PreviewControls = useMemo(() => {
return function Controls() {
return (
<SegmentedControl.Root
onValueChange={(value) => {
setPreview(value as typeof preview);
}}
value={preview}
>
<SegmentedControl.Item value="x">
<Flex align="center" gap="1">
<Image
alt="X (Twitter) logo"
height="16"
src="/images/x.png"
width="16"
/>
X (Twitter)
</Flex>
</SegmentedControl.Item>
<SegmentedControl.Item value="linkedin">
<Flex align="center" gap="1">
<Image
alt="LinkedIn logo"
height="16"
src="/images/linkedin.png"
width="16"
/>
LinkedIn
</Flex>
</SegmentedControl.Item>
</SegmentedControl.Root>
);
};
}, [preview]);

return {
preview,
PreviewControls,
};
}

0 comments on commit 9f1d957

Please sign in to comment.