@@ -3,6 +3,7 @@ import { FaShare } from "react-icons/fa6";
33import { QRCodeCanvas } from "qrcode.react" ;
44import { saveAs } from "file-saver" ;
55import { useRouter } from "next/router" ;
6+ import { toPng } from "html-to-image" ;
67
78import FallbackImage from "@components/FallbackImage" ;
89import UserSocial from "./UserSocials" ;
@@ -14,6 +15,19 @@ import Modal from "@components/Modal";
1415import ClipboardCopy from "@components/ClipboardCopy" ;
1516import { socials } from "@config/socials" ;
1617import Markdown from "@components/Markdown" ;
18+ import { renderToString } from "react-dom/server" ;
19+ import QRcodeWallpaper from "./QRcodeWallpaper" ;
20+
21+ const renderQRCodeWallpaperToString = ( BASE_URL , data ) => {
22+ const qrCodeElement = React . createElement ( QRcodeWallpaper , {
23+ BASE_URL : BASE_URL ,
24+ data : data ,
25+ } ) ;
26+
27+ const qrCodeString = renderToString ( qrCodeElement ) ;
28+
29+ return qrCodeString ;
30+ } ;
1731
1832function UserProfile ( { BASE_URL , data } ) {
1933 const [ qrShow , setQrShow ] = useState ( false ) ;
@@ -30,6 +44,26 @@ function UserProfile({ BASE_URL, data }) {
3044 saveAs ( blob , `biodrop-${ data . username } .png` ) ,
3145 ) ;
3246
47+ const downloadWallpaper = async ( ) => {
48+ try {
49+ const qrCodeString = renderQRCodeWallpaperToString ( BASE_URL , data ) ;
50+
51+ const container = document . createElement ( "div" ) ;
52+ container . innerHTML = qrCodeString ;
53+
54+ const dataUrl = await toPng ( container , {
55+ cacheBust : false ,
56+ backgroundColor : "#122640" ,
57+ width : 1080 ,
58+ height : 1920 ,
59+ } ) ;
60+
61+ saveAs ( dataUrl , `Biodrop-Wallpaper-${ data . username } .png` ) ;
62+ } catch ( e ) {
63+ console . error ( e ) ;
64+ }
65+ } ;
66+
3367 return (
3468 < >
3569 < div className = "flex justify-center items-center flex-col md:flex-row gap-x-6" >
@@ -128,6 +162,13 @@ function UserProfile({ BASE_URL, data }) {
128162 </ Button >
129163 ) }
130164 </ div >
165+ < div className = "w-full px-2 mx-auto flex justify-center mb-4" >
166+ { qrShow && (
167+ < Button primary = { true } onClick = { downloadWallpaper } >
168+ Export as Wallpaper
169+ </ Button >
170+ ) }
171+ </ div >
131172 </ div >
132173 { qrShow && (
133174 < >
0 commit comments