add simple +1 buttons for list
This commit is contained in:
parent
504a63293d
commit
504c8ecd6e
4 changed files with 96 additions and 11 deletions
|
|
@ -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}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue