qr-code-app/src/locations/Sidebar.tsx (114 lines of code) (raw):
import React, { useState, useEffect, useRef } from 'react';
import { SidebarAppSDK } from '@contentful/app-sdk';
import QRCodeStyling from "qr-code-styling";
import { useSDK } from "@contentful/react-apps-toolkit";
import styles from "./Sidebar.module.css";
import { Button, Note } from "@contentful/f36-components";
import logo from "../assets/logo.png";
const CONTENT_FIELD_ID = "slug";
const QR_CODE_WIDTH = 2000;
const QR_CODE_HEIGHT = 2000;
const qrCode = new QRCodeStyling({
width: QR_CODE_WIDTH,
height: QR_CODE_HEIGHT,
});
const qrCodeWithImage = new QRCodeStyling({
width: QR_CODE_WIDTH,
height: QR_CODE_HEIGHT,
image: logo,
imageOptions: {
margin: 8,
},
});
const Sidebar = () => {
const sdk = useSDK<SidebarAppSDK>();
const qrCodeRef = useRef<any>(null);
const qrCodeWithImageRef = useRef<any>(null);
const entry = sdk.entry;
const contentField = entry.fields[CONTENT_FIELD_ID];
const [pageUrl, setPageUrl] = useState("");
const [isPublished, setIsPublished] = useState<boolean>(
entry.getSys().publishedBy !== undefined
);
useEffect(() => {
qrCode.append(qrCodeRef.current);
qrCodeWithImage.append(qrCodeWithImageRef.current);
sdk.window.updateHeight();
}, [isPublished, sdk.window]);
useEffect(() => {
const detach = contentField.onValueChanged(async (slug) => {
const url = `${process.env.REACT_APP_DOMAIN}/${slug}`;
setPageUrl(url);
qrCode.update({
data: url,
});
qrCodeWithImage.update({
data: url,
});
sdk.window.updateHeight();
});
return () => detach();
}, [contentField, sdk.window]);
useEffect(() => {
const detach = entry.onSysChanged(async (sys) => {
setIsPublished(sys.publishedBy !== undefined);
});
return () => detach();
}, [entry]);
useEffect(() => {
sdk.window.updateHeight();
}, [sdk.window, pageUrl]);
const handleSaveQrCodeClick = () => {
qrCode.download({
name: contentField.getValue(),
extension: "png",
});
};
const handleSaveQrCodeWithImageClick = () => {
qrCodeWithImage.download({
name: contentField.getValue(),
extension: "png",
});
};
return (
<>
{isPublished && pageUrl.length > 0 && (
<a
href={pageUrl}
target="_blank"
className={styles.link}
rel="noreferrer"
>
{pageUrl}
</a>
)}
{qrCode && isPublished && (
<>
<div className={styles.qrcode} ref={qrCodeRef} />
<Button
variant="primary"
size="medium"
isFullWidth
onClick={handleSaveQrCodeClick}
>
Save QR Code
</Button>
</>
)}
{qrCodeWithImage && isPublished && (
<div className={styles.qrCodeWithImageSectionWrapper}>
<div className={styles.qrcode} ref={qrCodeWithImageRef} />
<Button
variant="primary"
size="medium"
isFullWidth
onClick={handleSaveQrCodeWithImageClick}
>
Save QR Code
</Button>
</div>
)}
{!isPublished && (
<Note variant="primary">Please, "publish" the article first.</Note>
)}
</>
);
};
export default Sidebar;