Merge remote-tracking branch 'origin/SvelteStuff' into astra/style

This commit is contained in:
Astra 2025-04-20 17:19:20 +09:00
commit 2a355be5b2
Signed by: astra
SSH key fingerprint: SHA256:jQDNS75/33T59Ey4yAzrUPP/5YQaXEetsW8hwUae+ag
4 changed files with 109 additions and 16 deletions

View file

@ -13,13 +13,24 @@
alt="avatar of {post.displayName}"
/>
{/if}
<div id="headerText">{post.displayName} | {post.timenotstamp}</div>
<div id="headerText">{post.displayName} | {post.authorHandle} | {post.timenotstamp}</div>
</div>
<div id="postContent">
{#if post.replyingDid}
<p id="replyingText">replying to: {post.replyingDid}</p>
{/if}
<p id="postText">{post.text}</p>
<p>{post.text}</p>
{#if post.replyingUri}
<a
id="replyingText"
href="https://deer.social/profile/{post.replyingUri.repo}/post/{post
.replyingUri.rkey}">replying to {post.replyingUri.repo}</a
>
{/if}
{#if post.quotingUri}
<a
id="quotingText"
href="https://deer.social/profile/{post.quotingUri.repo}/post/{post
.quotingUri.rkey}">quoting {post.quotingUri.repo}</a
>
{/if}
{#if post.imagesCid}
<div id="imagesContainer">
{#each post.imagesCid as imageLink}

View file

@ -2,9 +2,16 @@ import { simpleFetchHandler, XRPC } from "@atcute/client";
import "@atcute/bluesky/lexicons";
import type {
AppBskyActorDefs,
AppBskyActorProfile,
AppBskyFeedPost,
At,
ComAtprotoRepoListRecords,
} from "@atcute/client/lexicons";
import {
CompositeDidDocumentResolver,
PlcDidDocumentResolver,
WebDidDocumentResolver,
} from "@atcute/identity-resolver";
import { Config } from "../../config";
// import { ComAtprotoRepoListRecords.Record } from "@atcute/client/lexicons";
// import { AppBskyFeedPost } from "@atcute/client/lexicons";
@ -13,17 +20,24 @@ import { Config } from "../../config";
interface AccountMetadata {
did: string;
displayName: string;
handle: string;
avatarCid: string | null;
}
interface atUriObject {
repo: string;
collection: string;
rkey: string;
}
class Post {
authorDid: string;
authorAvatarCid: string | null;
authorHandle: string;
displayName: string;
text: string;
timestamp: number;
timenotstamp: string;
quotingDid: string | null;
replyingDid: string | null;
quotingUri: atUriObject | null;
replyingUri: atUriObject | null;
imagesCid: string[] | null;
videosLinkCid: string | null;
@ -33,17 +47,18 @@ class Post {
) {
this.authorDid = account.did;
this.authorAvatarCid = account.avatarCid;
this.authorHandle = account.handle;
this.displayName = account.displayName;
const post = record.value as AppBskyFeedPost.Record;
this.timenotstamp = post.createdAt;
this.text = post.text;
this.timestamp = Date.parse(post.createdAt);
if (post.reply) {
this.replyingDid = didFromATuri(post.reply.parent.uri).repo;
this.replyingUri = processAtUri(post.reply.parent.uri);
} else {
this.replyingDid = null;
this.replyingUri = null;
}
this.quotingDid = null;
this.quotingUri = null;
this.imagesCid = null;
this.videosLinkCid = null;
switch (post.embed?.$type) {
@ -56,10 +71,10 @@ class Post {
this.videosLinkCid = post.embed.video.ref.$link;
break;
case "app.bsky.embed.record":
this.quotingDid = didFromATuri(post.embed.record.uri).repo;
this.quotingUri = processAtUri(post.embed.record.uri);
break;
case "app.bsky.embed.recordWithMedia":
this.quotingDid = didFromATuri(post.embed.record.record.uri).repo;
this.quotingUri = processAtUri(post.embed.record.record.uri);
switch (post.embed.media.$type) {
case "app.bsky.embed.images":
this.imagesCid = post.embed.media.images.map((imageRecord) =>
@ -77,7 +92,7 @@ class Post {
}
}
const didFromATuri = (aturi: string) => {
const processAtUri = (aturi: string): atUriObject => {
const parts = aturi.split("/");
return {
repo: parts[2],
@ -108,9 +123,11 @@ const getAccountMetadata = async (did: `did:${string}:${string}`) => {
rkey: "self",
},
});
const value = data.value as AppBskyActorDefs.ProfileView;
const value = data.value as AppBskyActorProfile.Record;
const handle = await blueskyHandleFromDid(did);
const account: AccountMetadata = {
did: did,
handle: handle,
displayName: value.displayName || "",
avatarCid: null,
};
@ -143,7 +160,7 @@ const fetchPosts = async (did: string) => {
try {
const { data } = await rpc.get("com.atproto.repo.listRecords", {
params: {
repo: did,
repo: did as At.Identifier,
collection: "app.bsky.feed.post",
limit: 5,
},
@ -163,6 +180,39 @@ const fetchPosts = async (did: string) => {
}
};
const identityResolve = async (did: At.Did) => {
const resolver = new CompositeDidDocumentResolver({
methods: {
plc: new PlcDidDocumentResolver(),
web: new WebDidDocumentResolver(),
},
});
if (did.startsWith("did:plc:") || did.startsWith("did:web:")) {
const doc = await resolver.resolve(
did as `did:plc:${string}` | `did:web:${string}`,
);
return doc;
} else {
throw new Error(`Unsupported DID type: ${did}`);
}
};
const blueskyHandleFromDid = async (did: At.Did) => {
const doc = await identityResolve(did);
if (doc.alsoKnownAs) {
const handleAtUri = doc.alsoKnownAs.find((url) => url.startsWith("at://"));
const handle = handleAtUri?.split("/")[2];
if (!handle) {
return "Handle not found";
} else {
return handle;
}
} else {
return "Handle not found";
}
};
const fetchAllPosts = async () => {
const users: AccountMetadata[] = await getAllMetadataFromPds();
const postRecords = await Promise.all(
@ -186,5 +236,11 @@ const fetchAllPosts = async () => {
return posts;
};
const testApiCall = async () => {
const { data } = await rpc.get("com.atproto.sync.listRepos", {
params: {},
});
console.log(data);
};
export { fetchAllPosts, getAllMetadataFromPds, Post };
export type { AccountMetadata };