diff --git a/src/lib/components/list.svelte b/src/lib/components/list.svelte index 332ab89..d6ad39e 100644 --- a/src/lib/components/list.svelte +++ b/src/lib/components/list.svelte @@ -1,6 +1,22 @@
@@ -9,8 +25,13 @@ {#each sessions as session}
  • - {session.label} -

    {session.createdAt}

    + {session.record.label} +

    {session.record.createdAt}

    +

    {session.progress}

    +
  • {/each} diff --git a/src/lib/util.ts b/src/lib/util.ts index ea6fe97..cd16435 100644 --- a/src/lib/util.ts +++ b/src/lib/util.ts @@ -7,7 +7,7 @@ import { XrpcHandleResolver } from '@atcute/identity-resolver'; -import type { At } from '@atcute/client/lexicons'; +import type { At, MeWoachFeedActivity } from '@atcute/client/lexicons'; const didDocumentResolver = new CompositeDidDocumentResolver({ methods: { @@ -43,6 +43,7 @@ export async function createRPC(did: string) { const manager = new CredentialManager({ service: pds }); const rpc = new XRPC({ handler: manager }); + // await manager.login({ identifier: '', password: '' }); return rpc; } @@ -100,3 +101,54 @@ export async function resolveMedia(rpc: XRPC, uri: At.Uri) { }); 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; + } +} diff --git a/src/routes/user/[handle]/+page.svelte b/src/routes/user/[handle]/+page.svelte index 274b5f0..bd2feb0 100644 --- a/src/routes/user/[handle]/+page.svelte +++ b/src/routes/user/[handle]/+page.svelte @@ -10,5 +10,5 @@
    - +
    diff --git a/src/routes/user/[handle]/+page.ts b/src/routes/user/[handle]/+page.ts index 467a4eb..e692e3f 100644 --- a/src/routes/user/[handle]/+page.ts +++ b/src/routes/user/[handle]/+page.ts @@ -1,6 +1,7 @@ import { createRPC, getActivity, + getProgress, getSessions, resolveHandle, resolveMedia, @@ -18,13 +19,24 @@ export const load: PageLoad = async ({ params }) => { const did = await resolveHandle(params.handle); const rpc = await createRPC(did); - const sessions: MeWoachFeedSession.Record[] = (await getSessions(rpc, did)).map( - (record: ComAtprotoRepoListRecords.Record) => record.value as MeWoachFeedSession.Record + const sessions: { + 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: { session: MeWoachFeedSession.Record; activity: MeWoachFeedActivity.Record; + content: MeWoachContentAnilist.Main; }[] = await Promise.all( (await getActivity(rpc, did)).map(async (activityRecord: ComAtprotoRepoListRecords.Record) => { const session = (await resolveSession( @@ -42,11 +54,11 @@ export const load: PageLoad = async ({ params }) => { }) ); - console.log(activity); - return { handle: params.handle, sessions: sessions, - activity: activity + activity: activity, + rpc, + did }; };