Add fediverse posting

This commit is contained in:
Nexus 2024-09-03 20:38:34 +01:00
parent f37b744df3
commit 7ad1eaf1b8
6 changed files with 182 additions and 12 deletions

View file

@ -11,7 +11,7 @@ export default function FaqPage() {
<div>
<h3>A: PGP:</h3>
<p>
<code class="inline">0FA334385D0B689F</code> - available via WKD (<code class="inline">gpg --locate-keys gpg@nexy7574.co.uk</code>), or the full (armoured) key is available
<code className="inline">0FA334385D0B689F</code> - available via WKD (<code className="inline">gpg --locate-keys gpg@nexy7574.co.uk</code>), or the full (armoured) key is available
<Link href="/assets/pgp-2024-05-13.txt" passHref legacyBehavior><a download>here</a></Link>.
The key is also available on several keyservers, however
<a href="https://keyserver.ubuntu.com/pks/lookup?search=0FA334385D0B689F&fingerprint=on&op=index" target="_blank" rel="noopener noreferrer">Ubuntu&apos;s keyserver</a>

View file

@ -172,3 +172,12 @@ so I've had to resort to stealing (copying and pasting from their docs)
font-size: 0.875rem; /* 14px */
line-height: 1.25rem; /* 20px */
}
.icon-48 {
width: 48px;
height: 48px;
}
.icon-64 {
width: 64px;
height: 64px;
}

View file

@ -1,5 +1,4 @@
import Image from "next/image";
import Link from "next/link";
import styles from './page.module.css';
// Image imports
@ -42,9 +41,10 @@ const _88x31s = {
"restartb": restartb,
"tom1212": tom1212
};
import FediPosts from "@/components/fediPosts";
function CustomIcon({src, name}) {
return <Image src={src} alt={name} title={name} width={32} height={32} className="icon"/>
return <Image src={src} alt={name} title={name} width={32} height={32} className="icon icon-48"/>
}
@ -293,6 +293,9 @@ export default function Index() {
</div>
</div>
<br/>
<h2>Recent fediverse Posts</h2>
<FediPosts/>
<br/>
<div>
{
Object.keys(_88x31s).map(

View file

@ -0,0 +1,45 @@
.note {
background-color: var(--background-secondary);
border: 1px solid var(--text-muted);
border-radius: 5px;
padding: .4em;
display: block
}
.container {
display: grid;
grid-auto-columns: 1fr;
grid-auto-rows: 3fr;
border-radius: 5px;
overflow-y: auto;
max-height: 50vh;
grid-gap: 1em;
}
.container a {
color: var(--text-primary);
text-decoration: none;
}
.author {
display: flex;
align-items: center;
vertical-align: middle;
gap: 4px;
}
.author img {
border-radius: 20%;
width: 48px;
height: 48px;
}
.content {
text-align: left;
}
.reactions, .reaction {
list-style: none;
text-align: left;
vertical-align: middle;
}

View file

@ -0,0 +1,113 @@
"use client";
import Image from "next/image";
import { useEffect, useState } from "react";
import styles from "./fediPosts.css"
import Link from "next/link";
function FediPost({data}) {
if(data.reply) {
return null;
}
console.debug(data.reactionEmojis);
return (
<Link href={`https://fedi.transgender.ing/notes/${data.id}`}>
<div className={"note"}>
<div className={"author"}>
<div>
<Image src={data.user.avatarUrl} alt={data.user.username} height={48} width={48}/>
</div>
<div>
<div>{data.user.username}</div>
</div>
</div>
<div className={"content"}>{data.text}</div>
<div className="reactions" hidden={!data.reactions}>
<ul>
{
Object.keys(data.reactions).map(reaction => {
let customEmoji = (data.reactionEmojis || {})[reaction.slice(1, -1)];
if(customEmoji) {
return (
<li key={reaction} className="reaction">
<Image src={customEmoji} alt={reaction} height={24} width={24}/>x{data.reactions[reaction]}
</li>
)
}
return (
<li key={reaction} className="reaction">
{reaction}x{data.reactions[reaction]}
</li>
)
})
}
</ul>
</div>
</div>
</Link>
)
}
export default function FediPosts() {
const [notes, setNotes] = useState([]);
const getNotes = (_notes) => {
let payload = {
userId: "9w3ylp0gudtr0001",
limit: 100,
withReplies: false,
withRenotes: false,
};
let lastNote = _notes[_notes.length - 1] || null;
if(lastNote) {
payload.untilId = lastNote.id;
}
fetch(
"https://fedi.transgender.ing/api/users/notes",
{
method: "POST",
body: JSON.stringify(payload),
headers: {"Content-Type": "application/json"}
}
)
.then(res => res.json()).catch(console.error);
}
useEffect(
() => {
let payload = {
userId: "9w3ylp0gudtr0001",
limit: 100,
withReplies: false,
withRenotes: false,
withFiles: false,
};
let lastNote = notes[notes.length - 1] || null;
if(lastNote) {
payload.untilId = lastNote.id;
}
fetch(
"https://fedi.transgender.ing/api/users/notes",
{
method: "POST",
body: JSON.stringify(payload),
headers: {"Content-Type": "application/json"}
}
)
.then(res => res.json())
.then((newNotes) => {setNotes([...notes, ...newNotes]);})
},
[]
);
if(!notes.length) {
return <div className="container">Loading notes...</div>
}
return (
<div className={"container"}>
<div>{notes.map(note => <FediPost key={note.id} data={note} />)}</div>
<button type="button" onClick={() => {getNotes(notes).then((newNotes) => {setNotes([...notes, ...newNotes])});}}>More</button>
</div>
)
}

View file

@ -13,30 +13,30 @@ export default function Nav() {
return (
<nav className={styles.nav}>
<div className={styles.identifier}>
<span><Image src={twemojiTrans} wdith={32} height={32} alt="🏳️‍⚧️" class="icon"/></span>&nbsp;<i id="__name">Nexus</i>
<span><Image src={twemojiTrans} wdith={32} height={32} alt="🏳️‍⚧️" className="icon"/></span>&nbsp;<i id="__name">Nexus</i>
</div>
<div className={styles.links}>
<div><Link href="/"><Icon className="icon" path={mdiHomeOutline} size={1} /></Link></div>
<div><Link href="/faq"><Icon className="icon" path={mdiFrequentlyAskedQuestions} size={1} title={"FAQ"} /></Link></div>
<div><Link href="/matrix"><Icon className="icon" path={mdiMessageOutline} size={1} title={"Matrix Clients (mirror list)"}/></Link></div>
<div>
<Link href="https://matrix.to/#/@nex:nexy7574.co.uk" class="icon">
<Image src={matrix} wdith={32} height={32} alt="Chat" title="Chat" class="icon"/>
<Link href="https://matrix.to/#/@nex:nexy7574.co.uk" className="icon">
<Image src={matrix} wdith={32} height={32} alt="Chat" title="Chat" className="icon"/>
</Link>
</div>
<div>
<Link href="https://github.com/nexy7574" rel="noopener noreferrer" target="_blank" class="icon">
<Image src={github} alt="GitHub" title="GitHub" wdith={32} height={32} class="icon"/>
<Link href="https://github.com/nexy7574" rel="noopener noreferrer" target="_blank" className="icon">
<Image src={github} alt="GitHub" title="GitHub" wdith={32} height={32} className="icon"/>
</Link>
</div>
<div>
<Link href="https://git.i-am.nexus/nex/nexy7574.co.uk-b" rel="noopener" target="_blank" class="icon">
<Image src={forgejo} alt="Forgejo" title="Forgejo (git) & source code" wdith={32} height={32} class="icon"/>
<Link href="https://git.i-am.nexus/nex/nexy7574.co.uk-b" rel="noopener" target="_blank" className="icon">
<Image src={forgejo} alt="Forgejo" title="Forgejo (git) & source code" wdith={32} height={32} className="icon"/>
</Link>
</div>
<div>
<Link href="https://fedi.transgender.ing/@nex" rel="noopener noreferrer" target="_blank" class="icon">
<Image src={fediverse} alt="Sharkey (Fediverse)" title="Sharkey (Fediverse)" wdith={32} height={32} class="icon"/>
<Link href="https://fedi.transgender.ing/@nex" rel="noopener noreferrer" target="_blank" className="icon">
<Image src={fediverse} alt="Sharkey (Fediverse)" title="Sharkey (Fediverse)" wdith={32} height={32} className="icon"/>
</Link>
</div>
</div>