Open robinyoon-dev opened 1 year ago
ํ์ฌ ์ฝ๋
import { MongoClient, ObjectId } from "mongodb";
import ShareBoard from "@/components/boards/ShareBoard";
import Layout from "@/components/layout/Layout";
import { useState, useEffect, useRef } from "react";
import styles from "@/styles/style.module.css";
import Link from "next/link";
import Grid1fr from "@/components/layout/Grid1fr";
import LoadingSpinner from "@/components/parts/LoadingSpinner";
import Head from "next/head";
import Confetti from "@/components/parts/Confetti";
import config from "@/config/mongo.config";
import html2canvas from "html2canvas";
import Image from "next/image";
import btnStyles from "@/components/layout/Button.module.css";
import saveAs from "file-saver";
function SharePage({ newBoard, bingoData, data }) {
const [showCopiedMessage, setShowCopiedMessage] = useState(false);
const [isLoading, setIsLoading] = useState(true);
const divRef = useRef(null);
const canvasRef = useRef(null);
useEffect(() => {
if (data !== null) {
setIsLoading(false);
}
}, []);
if (isLoading) {
return <LoadingSpinner />;
}
const bingoUrl = getBingoUrl(bingoData);
const shareUrl = `https://planbingo.vercel.app/fromLink?id=${data.id}${bingoUrl}`;
const handleCopyClick = () => {
navigator.clipboard.writeText(shareUrl);
setShowCopiedMessage(true);
};
const downloadCanvasDiv = () => {
const div = divRef.current;
const canvas = canvasRef.current;
canvas.width = div.offsetWidth;
canvas.height = div.offsetHeight;
html2canvas(div).then((canvas) => {
canvas.toBlob((blob) => {
if (blob != null) {
saveAs(blob, `${data.title}.png`);
}
});
});
};
return (
<>
<Head>
<title>ํ๋ ๋น๊ณ </title>
</Head>
<Layout>
{newBoard.newBoard && <Confetti />}
{data.bingoCount === 8 && <Confetti />}
{newBoard.newBoard && (
<div className={styles.fontSize}>
์ฒ์์ผ๋ก ํ๋ ๋น๊ณ ๋ฅผ ๋ง๋ค์์ด์!
</div>
)}
{newBoard.newBoard === false && data.bingoCount !== 8 && (
<div className={styles.fontSize}> ๐๋ชฉํ๋ฅผ ๋ฌ์ฑํ๊ตฐ์!๐</div>
)}
{data.bingoCount === 8 && (
<div className={styles.fontSize}>
{" "}
๐์ถํํฉ๋๋ค! ๋น๊ณ ๋ฅผ ์์ฑํ์ด์!๐
</div>
)}
<canvas ref={canvasRef} className={styles.canvas}></canvas>
<div ref={divRef} className={styles.canvasDiv}>
<ShareBoard
bingoData={bingoData}
main={data.main}
title={data.title}
value1={data.value1}
value2={data.value2}
value3={data.value3}
value4={data.value4}
value5={data.value5}
value6={data.value6}
value7={data.value7}
value8={data.value8}
value9={data.value9}
bgColor={data.bgColor}
cubeColor={data.cubeColor}
bingoCount={data.bingoCount}
patternArray={data.patternArray}
/>
</div>
{newBoard.newBoard && (
<div className={styles.fontSizeS}>๋ชฉํ๋ฅผ ๊ณต์ ํด๋ณผ๊น์?</div>
)}
{newBoard.newBoard === false && data.bingoCount !== 8 && (
<div className={styles.fontSizeS}> ํ๋ ๋น๊ณ ๋ฅผ ๊ณต์ ํด๋ด์๐</div>
)}
{data.bingoCount === 8 && (
<div className={styles.fontSizeS}>
{" "}
์์ฑํ ํ๋ ๋น๊ณ ๋ฅผ ์๋ํด๋ด์!
</div>
)}
{showCopiedMessage && (
<div className={styles.alarm}>๋งํฌ๊ฐ ๋ณต์ฌ๋์์ต๋๋ค!</div>
)}
<Grid1fr>
<button
className={[btnStyles.button, styles.btnColor].join(" ")}
onClick={downloadCanvasDiv}
>
<Image
src={"/download.svg"}
alt={"download an image"}
width={30}
height={30}
/>{" "}
<p>์ด๋ฏธ์ง๋ก ์ ์ฅํ๊ธฐ</p>
</button>
<button
onClick={handleCopyClick}
className={[btnStyles.button, styles.btnColor].join(" ")}
>
<Image
src={"/link.svg"}
alt={"share a link"}
width={30}
height={30}
/>{" "}
<p>๋งํฌ ๋ณต์ฌํ๊ธฐ</p>
</button>
<Link
className={[btnStyles.button, styles.btnNoneColor].join(" ")}
href="/home"
>
<Image
src={"/home.svg"}
alt={"back to home"}
width={30}
height={30}
/>{" "}
<p>ํ์ผ๋ก</p>
</Link>
</Grid1fr>
</Layout>
</>
);
}
export async function getServerSideProps(ctx) {
let newBoard, bingoData, data;
if (ctx.query.bingoData) {
bingoData = JSON.parse(ctx.query.bingoData);
} else {
bingoData = {
bingo123: false,
bingo456: false,
bingo789: false,
bingo147: false,
bingo258: false,
bingo369: false,
bingo159: false,
bingo357: false,
};
}
data = JSON.parse(ctx.query.data);
if (data.newBoard) {
newBoard = true;
} else {
newBoard = false;
}
// fetch data from an API
const client = await MongoClient.connect(config.mongoClient);
const db = client.db();
const boardsCollection = db.collection("boards");
const board = await boardsCollection.findOne({ _id: ObjectId(data._id) });
client.close();
return {
props: {
newBoard: {
newBoard,
},
bingoData: {
bingo123: bingoData.bingo123,
bingo456: bingoData.bingo456,
bingo789: bingoData.bingo789,
bingo147: bingoData.bingo147,
bingo258: bingoData.bingo258,
bingo369: bingoData.bingo369,
bingo159: bingoData.bingo159,
bingo357: bingoData.bingo357,
},
data: {
id: board._id.toString(),
user: board.user,
main: board.main,
title: board.title,
value1: board.value1,
value2: board.value2,
value3: board.value3,
value4: board.value4,
value5: board.value5,
value6: board.value6,
value7: board.value7,
value8: board.value8,
value9: board.value9,
bgColor: board.bgColor,
cubeColor: board.cubeColor,
bingoCount: board.bingoCount,
patternArray: board.patternArray,
},
},
};
}
export function getBingoUrl(bingoData) {
const bingoNumbers = [
"bingo123",
"bingo456",
"bingo789",
"bingo147",
"bingo258",
"bingo369",
"bingo159",
"bingo357",
];
const tempArray = bingoNumbers.map((bingoNumber) => {
if (bingoData[bingoNumber]) {
return `&bingo=${bingoNumber}`;
} else {
return;
}
});
return tempArray.join("");
}
export default SharePage;
์ฝ๋
html2canvas(div).then((canvas) => {
const dataURL = canvas.toDataURL("image/png");
saveAs(dataURL, `${data.title}.png`);
};
Description
์์ดํจ๋ safari์์ ์ด๋ฏธ์ง ์ ์ฅ ์ ๋๋ ๋ฌธ์ ํด๊ฒฐํ์.
Todo
์์ดํฐ, ๋งฅ๋ถ ํผ๋๋ฐฑ
์๋ฃ
์์ดํฐ, ์์ดํจ๋์ ์ฌํ๋ฆฌ์์ ๊ฐ๋ฐ์ ๋๊ตฌ ์ด๊ธฐ(SAFARI DEBUGGING) file-saver ๊ณต์ ๋ฌธ์ [React] ํ๋ฉด(DOM) ์บก์ณ ๋ฐ ์ ์ฅ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ (feat. html2canvas, file-saver)