Bluesky app fork with some witchin' additions 馃挮
at post-text-option 104 lines 2.8 kB view raw
1import '../index.css' 2 3import {AppBskyFeedDefs, AtpAgent} from '@atproto/api' 4import {h, render} from 'preact' 5 6import logo from '../../assets/logo.svg' 7import {applyTheme, initSystemColorMode} from '../color-mode' 8import {Container} from '../components/container' 9import {Link} from '../components/link' 10import {Post} from '../components/post' 11import {getRkey} from '../util/rkey' 12 13const root = document.getElementById('app') 14if (!root) throw new Error('No root element') 15 16const agent = new AtpAgent({ 17 service: 'https://public.api.bsky.app', 18}) 19 20const uri = `at://${window.location.pathname.slice('/embed/'.length)}` 21if (!uri) { 22 throw new Error('No uri in path') 23} 24 25const query = new URLSearchParams(window.location.search) 26 27// theme - default to light mode 28const colorMode = query.get('colorMode') 29 30switch (colorMode) { 31 case 'dark': 32 applyTheme('dark') 33 break 34 case 'system': 35 initSystemColorMode() 36 break 37 case 'light': 38 default: 39 applyTheme('light') 40 break 41} 42 43agent 44 .getPostThread({ 45 uri, 46 depth: 0, 47 parentHeight: 0, 48 }) 49 .then(({data}) => { 50 if (!AppBskyFeedDefs.isThreadViewPost(data.thread)) { 51 throw new Error('Expected a ThreadViewPost') 52 } 53 const pwiOptOut = !!data.thread.post.author.labels?.find( 54 label => label.val === '!no-unauthenticated', 55 ) 56 if (pwiOptOut) { 57 render(<PwiOptOut thread={data.thread} />, root) 58 } else { 59 render(<Post thread={data.thread} />, root) 60 } 61 }) 62 .catch(err => { 63 console.error(err) 64 render(<ErrorMessage />, root) 65 }) 66 67function PwiOptOut({thread}: {thread: AppBskyFeedDefs.ThreadViewPost}) { 68 const href = `/profile/${thread.post.author.did}/post/${getRkey(thread.post)}` 69 return ( 70 <Container href={href}> 71 <Link 72 href={href} 73 className="transition-transform hover:scale-110 absolute top-4 right-4"> 74 <img src={logo} className="h-6" /> 75 </Link> 76 <div className="w-full py-12 gap-4 flex flex-col items-center"> 77 <p className="max-w-80 text-center w-full text-textLight dark:text-textDimmed"> 78 The author of this post has requested their posts not be displayed on 79 external sites. 80 </p> 81 <Link 82 href={href} 83 className="max-w-80 rounded-lg bg-brand text-white text-center py-1 px-4 w-full mx-auto"> 84 View on Bluesky 85 </Link> 86 </div> 87 </Container> 88 ) 89} 90 91function ErrorMessage() { 92 return ( 93 <Container href="https://witchsky.app/"> 94 <Link 95 href="https://witchsky.app/" 96 className="transition-transform hover:scale-110 absolute top-4 right-4"> 97 <img src={logo} className="h-6" /> 98 </Link> 99 <p className="my-16 text-center w-full text-textLight dark:text-textDimmed"> 100 Post not found, it may have been deleted. 101 </p> 102 </Container> 103 ) 104}