add simple +1 buttons for list

This commit is contained in:
Badtz 2025-03-28 17:30:20 -07:00
parent 504a63293d
commit 504c8ecd6e
4 changed files with 96 additions and 11 deletions

View file

@ -1,6 +1,22 @@
<script lang="ts"> <script lang="ts">
import type { MeWoachFeedSession } from '@atcute/client/lexicons'; import { addActivity } from '$lib/util';
export let sessions: MeWoachFeedSession.Record[] = []; import type { XRPC } from '@atcute/client';
import type { At, MeWoachFeedSession } from '@atcute/client/lexicons';
export let sessions: {
record: MeWoachFeedSession.Record;
uri: string;
cid: string;
progress: number;
}[] = [];
export let did: At.DID;
export let rpc: XRPC;
function plusOne(uri: At.Uri, cid: At.CID, progress: number) {
addActivity(did, rpc, uri, cid, progress);
sessions = sessions.map((session) =>
session.uri === uri ? { ...session, progress: progress } : session
);
}
</script> </script>
<div class="h-auto rounded-sm bg-gray-400 p-2"> <div class="h-auto rounded-sm bg-gray-400 p-2">
@ -9,8 +25,13 @@
{#each sessions as session} {#each sessions as session}
<li class="mx-auto mb-2 rounded-sm bg-gray-500 p-4"> <li class="mx-auto mb-2 rounded-sm bg-gray-500 p-4">
<div> <div>
<a href={'https://pdsls.dev/' + session.content.uri}>{session.label}</a> <a href={'https://pdsls.dev/' + session.uri}>{session.record.label}</a>
<p>{session.createdAt}</p> <p>{session.record.createdAt}</p>
<p>{session.progress}</p>
<button
class="rounded-md bg-blue-600 p-2"
onclick={() => plusOne(session.uri, session.cid, session.progress + 1)}>+1</button
>
</div> </div>
</li> </li>
{/each} {/each}

View file

@ -7,7 +7,7 @@ import {
XrpcHandleResolver XrpcHandleResolver
} from '@atcute/identity-resolver'; } from '@atcute/identity-resolver';
import type { At } from '@atcute/client/lexicons'; import type { At, MeWoachFeedActivity } from '@atcute/client/lexicons';
const didDocumentResolver = new CompositeDidDocumentResolver({ const didDocumentResolver = new CompositeDidDocumentResolver({
methods: { methods: {
@ -43,6 +43,7 @@ export async function createRPC(did: string) {
const manager = new CredentialManager({ service: pds }); const manager = new CredentialManager({ service: pds });
const rpc = new XRPC({ handler: manager }); const rpc = new XRPC({ handler: manager });
// await manager.login({ identifier: '', password: '' });
return rpc; return rpc;
} }
@ -100,3 +101,54 @@ export async function resolveMedia(rpc: XRPC, uri: At.Uri) {
}); });
return value; return value;
} }
export async function addActivity(
did: At.DID,
rpc: XRPC,
uri: At.Uri,
cid: At.CID,
count: number = 1,
performedAt: string = new Date().toISOString()
) {
const activityRecord: MeWoachFeedActivity.Record = {
$type: 'me.woach.feed.activity',
createdAt: new Date().toISOString(),
progress: count,
session: { cid, uri },
performedAt
};
const result = await rpc.call('com.atproto.repo.createRecord', {
data: {
repo: did,
collection: 'me.woach.feed.activity',
record: activityRecord
}
});
return result.data.uri;
}
export async function getProgress(rpc: XRPC, did: string, uri: At.Uri) {
const currentProgress = await rpc.get('com.atproto.repo.listRecords', {
params: {
repo: did,
collection: 'me.woach.feed.activity'
}
});
const filteredRecords = currentProgress.data.records.filter((a) => {
const record = a.value as MeWoachFeedActivity.Record;
return record.session.uri === uri;
});
let lastProgress = 0;
if (filteredRecords.length > 0) {
const lastUpdate = filteredRecords[0]?.value as MeWoachFeedActivity.Record;
lastProgress = Number(lastUpdate.progress);
return lastProgress;
} else {
return 0;
}
}

View file

@ -10,5 +10,5 @@
<div class="mx-auto grid w-3/4 grid-cols-3 gap-4"> <div class="mx-auto grid w-3/4 grid-cols-3 gap-4">
<Activity activity={data.activity} /> <Activity activity={data.activity} />
<List sessions={data.sessions} /> <List sessions={data.sessions} did={data.did} rpc={data.rpc} />
</div> </div>

View file

@ -1,6 +1,7 @@
import { import {
createRPC, createRPC,
getActivity, getActivity,
getProgress,
getSessions, getSessions,
resolveHandle, resolveHandle,
resolveMedia, resolveMedia,
@ -18,13 +19,24 @@ export const load: PageLoad = async ({ params }) => {
const did = await resolveHandle(params.handle); const did = await resolveHandle(params.handle);
const rpc = await createRPC(did); const rpc = await createRPC(did);
const sessions: MeWoachFeedSession.Record[] = (await getSessions(rpc, did)).map( const sessions: {
(record: ComAtprotoRepoListRecords.Record) => record.value as MeWoachFeedSession.Record record: MeWoachFeedSession.Record;
uri: string;
cid: string;
progress: number;
}[] = await Promise.all(
(await getSessions(rpc, did)).map(async (record: ComAtprotoRepoListRecords.Record) => ({
record: record.value as MeWoachFeedSession.Record,
uri: record.uri,
cid: record.cid,
progress: await getProgress(rpc, did, record.uri)
}))
); );
const activity: { const activity: {
session: MeWoachFeedSession.Record; session: MeWoachFeedSession.Record;
activity: MeWoachFeedActivity.Record; activity: MeWoachFeedActivity.Record;
content: MeWoachContentAnilist.Main;
}[] = await Promise.all( }[] = await Promise.all(
(await getActivity(rpc, did)).map(async (activityRecord: ComAtprotoRepoListRecords.Record) => { (await getActivity(rpc, did)).map(async (activityRecord: ComAtprotoRepoListRecords.Record) => {
const session = (await resolveSession( const session = (await resolveSession(
@ -42,11 +54,11 @@ export const load: PageLoad = async ({ params }) => {
}) })
); );
console.log(activity);
return { return {
handle: params.handle, handle: params.handle,
sessions: sessions, sessions: sessions,
activity: activity activity: activity,
rpc,
did
}; };
}; };