initial commit
This commit is contained in:
79
projects/mastolists/src/app/shared/services/list.service.ts
Normal file
79
projects/mastolists/src/app/shared/services/list.service.ts
Normal file
@@ -0,0 +1,79 @@
|
||||
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),
|
||||
)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user