if (!props.src) return ""; State.init({ copiedShareUrl: false, }); const src = props.src; const [accountId, widget, widgetName] = src.split("/"); const data = Social.get(`${accountId}/widget/${widgetName}/metadata/**`); const metadata = data || {}; const tags = Object.keys(metadata.tags || {}); const shareUrl = `https://near.social/#/calebjacob.near/widget/ComponentDetailsPage?src=${src}`; const size = props.size || "large"; const sizes = { medium: { gap: "16px", thumbnail: "56px", title: "16px", }, large: { gap: "16px", thumbnail: "100px", title: "32px", }, }; const Wrapper = styled.div``; const Header = styled.div` display: flex; align-items: center; gap: ${(p) => sizes[p.size].gap}; margin-bottom: 32px; @media (max-width: 770px) { gap: 16px; } `; const TagsWrapper = styled.div` margin-bottom: 32px; `; const Actions = styled.div` display: flex; gap: 12px; flex-wrap: wrap; margin-bottom: 16px; `; const Title = styled.h1` font-size: ${(p) => sizes[p.size].title}; line-height: 1.2em; color: #11181C; margin: 0 0 8px; font-weight: 600; @media (max-width: 770px) { font-size: 16px; margin: 0; } `; const Thumbnail = styled.div` width: ${(p) => sizes[p.size].thumbnail}; height: ${(p) => sizes[p.size].thumbnail}; flex-shrink: 0; border: 1px solid #ECEEF0; border-radius: 12px; overflow: hidden; box-shadow: 0px 1px 3px rgba(16, 24, 40, 0.1), 0px 1px 2px rgba(16, 24, 40, 0.06); img { object-fit: cover; width: 100%; height: 100%; } @media (max-width: 770px) { width: 58px; height: 58px; } `; const ButtonLink = styled.a` display: inline-flex; align-items: center; gap: 8px; padding: 8px 16px; height: 32px; border-radius: 6px; font-weight: 600; font-size: 12px; line-height: 15px; text-align: center; cursor: pointer; color: ${(p) => (p.primary ? "#fff" : "#11181C")} !important; background: ${(p) => (p.primary ? "#0091FF" : "#FBFCFD")}; border: ${(p) => (p.primary ? "none" : "1px solid #D7DBDF")}; &:hover, &:focus { background: ${(p) => (p.primary ? "#0484e5" : "#ECEDEE")}; text-decoration: none; outline: none; } i { color: #7E868C; } `; const Text = styled.p` margin: 0; font-size: 14px; line-height: 20px; color: ${(p) => (p.bold ? "#11181C" : "#687076")}; font-weight: ${(p) => (p.bold ? "600" : "400")}; font-size: ${(p) => (p.small ? "12px" : "14px")}; i { margin-right: 4px; } `; return ( <Wrapper> <Header size={size}> <Thumbnail size={size}> <Widget src="mob.near/widget/Image" props={{ image: metadata.image, fallbackUrl: "https://ipfs.near.social/ipfs/bafkreido7gsk4dlb63z3s5yirkkgrjs2nmyar5bxyet66chakt2h5jve6e", alt: metadata.name, }} /> </Thumbnail> <div> <Title size={size}>{metadata.name || widgetName}</Title> <Text>{src}</Text> </div> </Header> {props.showTags && tags.length > 0 && ( <TagsWrapper> <Widget src="calebjacob.near/widget/ComponentTags" props={{ tags, }} /> </TagsWrapper> )} <Actions> <ButtonLink primary href={`/#/${src}`}> Open </ButtonLink> <ButtonLink href={`/#/edit/${src}`}> {context.accountId === accountId ? ( <> <i class="bi bi-pencil-fill"></i> Edit </> ) : ( <> <i class="bi bi-git"></i> Fork </> )} </ButtonLink> <ButtonLink href={`/#/calebjacob.near/widget/ComponentDetailsPage?src=${src}&tab=source`} > <i class="bi bi-code-square"></i> View Source </ButtonLink> <OverlayTrigger placement="top" overlay={<Tooltip>Copy to clipboard</Tooltip>} > <ButtonLink as="button" type="button" onMouseLeave={() => { State.update({ copiedShareUrl: false }); }} onClick={() => { clipboard.writeText(shareUrl).then(() => { State.update({ copiedShareUrl: true }); }); }} > {state.copiedShareUrl ? ( <i class="bi bi-check-circle"></i> ) : ( <i class="bi bi-box-arrow-up-right"></i> )} Share URL </ButtonLink> </OverlayTrigger> </Actions> </Wrapper> );