import type { ComAtprotoRepoApplyWrites } from '@atcute/atproto';
import type { AnyProfileView, AppBskyRichtextFacet } from '@atcute/bluesky';
import { type Client, ok } from '@atcute/client';
import type { Cid, Did, ResourceUri } from '@atcute/lexicons';
import { createRecord } from '#/lib/api/records';
export const createStarterPackList = async ({
name,
description,
descriptionFacets,
profiles,
did,
pds,
}: {
name: string;
description?: string;
descriptionFacets?: AppBskyRichtextFacet.Main[];
profiles: AnyProfileView[];
did: Did;
pds: Client;
}): Promise<{ cid: Cid; uri: ResourceUri }> => {
if (profiles.length === 0) {
throw new Error('No profiles given');
}
const list = await createRecord(pds, {
repo: did,
record: {
$type: 'app.bsky.graph.list',
avatar: undefined,
createdAt: new Date().toISOString(),
description,
descriptionFacets,
name,
purpose: 'app.bsky.graph.defs#referencelist',
},
});
if (!list) {
throw new Error('List creation failed');
}
await ok(
pds.post('com.atproto.repo.applyWrites', {
input: {
repo: did,
writes: profiles.map((p) => createListItem({ did: p.did, listUri: list.uri })),
},
}),
);
return list;
};
function createListItem({
did,
listUri,
}: {
did: string;
listUri: string;
}): ComAtprotoRepoApplyWrites.$input['writes'][number] {
return {
$type: 'com.atproto.repo.applyWrites#create',
collection: 'app.bsky.graph.listitem',
value: {
$type: 'app.bsky.graph.listitem',
createdAt: new Date().toISOString(),
list: listUri,
subject: did,
},
};
}