forked from
jollywhoppers.com/witchsky.app
Bluesky app fork with some witchin' additions 馃挮
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}