"use client"; import { useRef, useState } from "react"; import { AppBskyFeedDefs } from "@atproto/api"; import { EditorState } from "prosemirror-state"; import { useSmoker, useToaster } from "../Toast"; import { Menu, MenuItem } from "../Menu"; import { ButtonPrimary } from "../Buttons"; import { Modal } from "../Modal"; import { MobileSheet } from "../MobileSheet"; import { useIsMobile } from "src/hooks/isMobile"; import { ShareTiny } from "../Icons/ShareTiny"; import { BlueskyPostComposer } from "../BlueskyPostComposer/BlueskyPostComposer"; import { DotLoader } from "../utils/DotLoader"; import { useIdentityData } from "../IdentityProvider"; import { editorStateToFacetedText } from "../BlueskyPostComposer/ProsemirrorEditor"; import { sharePostToBsky } from "actions/sharePostToBsky"; import { BlueskyTiny } from "components/Icons/BlueskyTiny"; import { LoginContent } from "components/LoginButton"; export const InteractionShareButton = (props: { postUrl?: string; title?: string; type: "none" | "weak" | "strong"; trigger?: React.ReactNode; }) => { let smoker = useSmoker(); let [shareModalOpen, setShareModalOpen] = useState(false); if (props.type === "none") return; return ( <> {props.trigger ? ( props.trigger ) : ( <> Share )} } > setShareModalOpen(true)}> Share on Bluesky { e.stopPropagation(); e.preventDefault(); if (!props.postUrl) return; navigator.clipboard.writeText(props.postUrl); let rect = (e.target as HTMLElement).getBoundingClientRect(); smoker({ text: Copied Link!, position: { y: rect.top, x: rect.left, }, }); }} > Copy Link setShareModalOpen(false)} shareModalOpen={shareModalOpen} setShareModalOpen={setShareModalOpen} /> ); }; export const BskyShareModal = (props: { postUrl?: string; title?: string; onPosted: () => void; shareModalOpen: boolean; setShareModalOpen: (s: boolean) => void; }) => { let { identity } = useIdentityData(); let toaster = useToaster(); let editorStateRef = useRef(null); let [charCount, setCharCount] = useState(0); let [posting, setPosting] = useState(false); let isMobile = useIsMobile(); let profile = { avatar: identity?.bsky_profiles?.record.avatar, displayName: identity?.bsky_profiles?.record.displayName, handle: identity?.bsky_profiles?.record.handle, }; let post = async () => { if (!editorStateRef.current || !props.postUrl || posting) return; setPosting(true); let [text, facets] = editorStateToFacetedText(editorStateRef.current); let res = await sharePostToBsky({ text, facets, url: props.postUrl, title: props.title ?? "", description: "", }); setPosting(false); if (!res.success) { toaster({ content: "Hmm… Something went wrong. Try again!", type: "error", }); return; } toaster({ content: "Shared to Bluesky!", type: "success" }); props.onPosted(); }; let embed: AppBskyFeedDefs.PostView["embed"] = { $type: "app.bsky.embed.external#view", external: { uri: props.postUrl ?? "", title: props.title ?? "", description: "", }, }; let submitButton = ( 300} > {posting ? ( ) : ( <> Post )} ); let loggedIn = identity && identity.atp_did; let shareContent = !loggedIn ? ( ) : ( ); return ( <> {isMobile ? ( {shareContent} ) : ( {loggedIn &&
} {shareContent} )} ); };