This repository has been archived on 2024-11-11. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
mastodon-apps/projects/mastolists/src/app/shared/services/list.service.ts
2022-12-22 16:38:25 +01:00

80 lines
3.4 KiB
TypeScript

import {Injectable} from '@angular/core';
import {EMPTY, expand, map, Observable, reduce, take} from "rxjs";
import {MastodonApiListsService} from "../../../../../mastodon-api/src/lib/services/mastodon-api-lists.service";
import {PersistentStore} from "../state/persistent/persistent-store.service";
import {Account} from "../../../../../mastodon-api/src/lib/interfaces/public/account";
import {List} from "../../../../../mastodon-api/src/lib/interfaces/public/list";
@Injectable({
providedIn: 'root'
})
export class ListService {
constructor(private mastodonApiListsService: MastodonApiListsService,
private store: PersistentStore) {
}
loadLists(): Observable<List[]> {
const applicationState = this.store.value;
const instanceName = applicationState.currentInstance?.instanceName;
const accessToken = applicationState.currentInstance?.accessToken;
return this.mastodonApiListsService
.getLists(instanceName, accessToken!)
.pipe(map(result => result.sort((a, b) => a.title.localeCompare(b.title))));
}
loadAccountsIdsForList(listId: string): Observable<{ [id: string]: string[] }> {
const applicationState = this.store.value;
const instanceName = applicationState.currentInstance?.instanceName;
const accessToken = applicationState.currentInstance?.accessToken;
return this.mastodonApiListsService
.getAccountsForList(instanceName, accessToken!, listId)
.pipe(
expand(result => {
const nextLink = result[0];
if (nextLink && nextLink.length > 0) {
return this.mastodonApiListsService.getAccountsForList(instanceName, accessToken!, listId, nextLink);
}
return EMPTY;
}),
map(result => {
const accounts = result[1];
return {[listId]: accounts.map(account => account.id)};
}
),
reduce((acc: { [listId: string]: string[] }, res: { [listId: string]: string[] }) => {
const listId = Object.keys(res)[0];
if (acc[listId] !== undefined && acc[listId].length > 0) {
acc[listId] = acc[listId].concat(res[listId]);
return acc;
}
return {...acc, ...res};
}, {}),
);
}
addAccountToSelectedList(accountId: string, listId: string) {
const applicationState = this.store.value;
const instanceName = applicationState.currentInstance?.instanceName;
const accessToken = applicationState.currentInstance?.accessToken;
return this.mastodonApiListsService
.addAccountToList(instanceName, accessToken!, listId, accountId)
.pipe(
take(1),
);
}
removeAccountFromList(accountId: string, listId: string) {
const applicationState = this.store.value;
const instanceName = applicationState.currentInstance?.instanceName;
const accessToken = applicationState.currentInstance?.accessToken;
return this.mastodonApiListsService
.removeAccountFromList(instanceName, accessToken!, listId, accountId)
.pipe(
take(1),
)
}
}