Skip to content

Commit e801c7a

Browse files
committed
[[blog]] blogs are working again
1 parent a547ca0 commit e801c7a

File tree

15 files changed

+774
-765
lines changed

15 files changed

+774
-765
lines changed

ui/assets/css/tailwind.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4060,6 +4060,10 @@ html {
40604060
line-height: 2.25rem;
40614061
}
40624062

4063+
.font-thin {
4064+
font-weight: 100;
4065+
}
4066+
40634067
.font-extralight {
40644068
font-weight: 200;
40654069
}

ui/packages/blog/BlogApp.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
const m = require("mithril")
3+
4+
const BlogApp = {
5+
view: vnode => {
6+
return m(".container", [
7+
m("h1.title.uppercase.font-medium.text-xl.mb-4", "Blogging Tools"),
8+
m("a.btn", {
9+
href: patchfox.url("blog", "import"),
10+
onclick: (ev) => {
11+
ev.preventDefault()
12+
patchfox.go("blog","import")
13+
}
14+
}, "Import from RSS/Atom")
15+
])
16+
}
17+
}
18+
19+
module.exports = BlogApp

ui/packages/blog/BlogApp.svelte

Lines changed: 0 additions & 9 deletions
This file was deleted.

ui/packages/blog/BlogCard.js

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
const m = require("mithril")
2+
const Card = require("../../core/components/Card.js")
3+
const VoteCounter = require("../../core/components/VoteCounter.js")
4+
const { when } = require("../../core/kernel/utils.js")
5+
6+
const BlogCard = {
7+
oninit: vnode => {
8+
vnode.state.showBlogpost = false
9+
vnode.state.loading = false
10+
vnode.state.toast = false
11+
vnode.state.toastMsg = ""
12+
vnode.state.showRaw = false
13+
14+
let msg = vnode.attrs.msg
15+
let content = msg.value.content
16+
let summary = ssb.markdown(content.summary)
17+
18+
vnode.state.post = summary
19+
vnode.state.hasContentWarning = content.contentWarning && content.contentWarning.length > 0
20+
vnode.state.liked = false
21+
vnode.state.key = Date.now()
22+
23+
ssb.votes(msg.key).then(ms => {
24+
vnode.state.liked = ms.includes(ssb.feed)
25+
m.redraw()
26+
})
27+
},
28+
view: vnode => {
29+
console.log("hit")
30+
let msg = vnode.attrs.msg
31+
let showRaw = vnode.state.showRaw
32+
let post = vnode.state.post
33+
let key = vnode.state.key
34+
35+
let content = msg.value.content
36+
37+
let summary = ssb.markdown(content.summary)
38+
let thumbnail = content.thumbnail || false
39+
let encodedThumbnail = encodeURIComponent(thumbnail) || false
40+
let title = content.title || false
41+
42+
43+
const likeChanged = ev => {
44+
let v = ev.target.checked
45+
if (v) {
46+
ssb
47+
.like(msg.key)
48+
.then(() => {
49+
vnode.state.liked = true
50+
vnode.state.key = Date.now()
51+
m.redraw()
52+
})
53+
.catch(() => {
54+
vnode.state.liked = false
55+
vnode.state.key = Date.now()
56+
m.redraw()
57+
})
58+
} else {
59+
ssb
60+
.unlike(msg.key)
61+
.then(() => {
62+
vnode.state.liked = false
63+
m.redraw()
64+
})
65+
.catch(() => {
66+
vnode.state.liked = true
67+
m.redraw()
68+
})
69+
}
70+
}
71+
72+
const displayBlogPost = ev => {
73+
vnode.state.loading = true
74+
75+
ssb
76+
.getBlob(content.blog)
77+
.then(data => {
78+
vnode.state.post = ssb.markdown(data)
79+
vnode.state.showBlogpost = true
80+
m.redraw()
81+
})
82+
.catch(err => {
83+
console.error("can't load blog post", err)
84+
vnode.state.toast = true
85+
vnode.state.toastMsg = err
86+
m.redraw()
87+
})
88+
}
89+
90+
const reply = ev => {
91+
let rootId = msg.value.content.root || msg.key
92+
let channel = msg.value.content.channel
93+
patchfox.go("post", "compose", { root: rootId, branch: msg.key, channel })
94+
}
95+
96+
const fork = ev => {
97+
let originalRoot = msg.value.content.root || msg.key
98+
let channel = msg.value.content.channel
99+
let replyfeed = msg.value.author
100+
patchfox.go("post", "compose", {
101+
root: msg.key,
102+
branch: msg.key,
103+
fork: originalRoot,
104+
channel,
105+
replyfeed,
106+
})
107+
}
108+
109+
const goRoot = ev => {
110+
let rootId = msg.value.content.root || msg.key
111+
patchfox.go("hub", "thread", { thread: rootId })
112+
}
113+
114+
const goBranch = ev => {
115+
let branchId = msg.value.content.branch || msg.key
116+
patchfox.go("hub", "thread", { thread: branchId })
117+
}
118+
119+
const actions = [
120+
m("div.flex.align-middle", [
121+
m(
122+
".form-control.flex-1",
123+
{key: 1},
124+
m("label.cursor-pointer.label", [
125+
m("span.label-text.mr-2", "Like"),
126+
m("input.toggle", {
127+
type: "checkbox",
128+
onchange: likeChanged,
129+
checked: vnode.state.liked,
130+
}),
131+
])
132+
),
133+
m(VoteCounter, {msg, key}),
134+
]),
135+
m("div.flex-1"),
136+
when(
137+
msg.value.content.root,
138+
m(
139+
"span",
140+
m(
141+
"a.btn.btn-ghost",
142+
{
143+
href: `?pkg=hub&view=thread&thread=${encodeURIComponent(
144+
msg.value.content.root
145+
)}`,
146+
onclick: goRoot,
147+
},
148+
"Root Message"
149+
)
150+
)
151+
),
152+
when(
153+
msg.value.content.branch,
154+
m(
155+
"span",
156+
m(
157+
"a.btn.btn-ghost",
158+
{
159+
href: `?pkg=hub&view=thread&thread=${encodeURIComponent(
160+
msg.value.content.branch
161+
)}`,
162+
onclick: goBranch,
163+
},
164+
"In Reply To"
165+
)
166+
)
167+
),
168+
when(!msg.value.private, [
169+
m(
170+
"button.btn.btn-primary",
171+
{
172+
onclick: fork,
173+
},
174+
"Fork"
175+
),
176+
m(
177+
"button.btn.btn-primary",
178+
{
179+
onclick: reply,
180+
},
181+
"Reply"
182+
),
183+
vnode.state.showBlogpost ? m("button.btn.btn-primary", {
184+
onclick: () => vnode.state.showBlogpost = false
185+
}, "Close blogpost") : m("button.btn.btn-primary", {
186+
onclick: displayBlogPost
187+
}, "Read blogpost")
188+
]),
189+
]
190+
191+
return m(Card, {msg, showRaw, actions}, [
192+
when(thumbnail, m(".card-image", m("img.img-responsive", {src: patchfox.blobUrl(thumbnail), alt: title}))),
193+
when(title, m("h5.card-title.h5", title)),
194+
when(vnode.state.toast, m(".toast.toast-error", `Can't load blogpost: ${vnode.state.toastMsg}`)),
195+
when(vnode.state.hasContentWarning, m(".toast.toast-primary"),m("p", [m("b", "Content warning:"), msg.value.contentWarning])),
196+
m("article.prose", vnode.state.showBlogpost ? m.trust(post) : m.trust(summary)),
197+
])
198+
},
199+
}
200+
201+
module.exports = BlogCard

0 commit comments

Comments
 (0)