diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/user.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/user.store.ts index 34722f93f1..c4e85f2d82 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/user.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/user.store.ts @@ -1,6 +1,6 @@ -import { BehaviorSubject, map, Observable } from 'rxjs'; +import { BehaviorSubject } from 'rxjs'; import type { UserDetails } from '@umbraco-cms/models'; -import { createObservablePart, UniqueArrayBehaviorSubject, UniqueBehaviorSubject } from '@umbraco-cms/observable-api'; +import { createObservablePart, UniqueArrayBehaviorSubject } from '@umbraco-cms/observable-api'; import { UmbContextToken } from '@umbraco-cms/context-api'; import { UmbStoreBase } from '@umbraco-cms/stores/store-base'; @@ -17,13 +17,13 @@ export const STORE_ALIAS = 'UmbUserStore'; export class UmbUserStore extends UmbStoreBase { - #users = new UniqueArrayBehaviorSubject([]); + #users = new UniqueArrayBehaviorSubject([], x => x.key); public users = this.#users.asObservable(); #totalUsers = new BehaviorSubject(0); public readonly totalUsers = this.#totalUsers.asObservable(); - getAll(): Observable> { + getAll() { // TODO: use Fetcher API. // TODO: only fetch if the data type is not in the store? fetch(`/umbraco/backoffice/users/list/items`) @@ -42,7 +42,7 @@ export class UmbUserStore extends UmbStoreBase { * @return {*} {(Observable)} * @memberof UmbDataTypeStore */ - getByKey(key: string): Observable { + getByKey(key: string) { // TODO: use Fetcher API. // TODO: only fetch if the data type is not in the store? fetch(`/umbraco/backoffice/users/details/${key}`) @@ -54,7 +54,14 @@ export class UmbUserStore extends UmbStoreBase { return createObservablePart(this.#users, (users: Array) => users.find((user: UmbUserStoreItemType) => user.key === key) || null); } - getByKeys(keys: Array): Observable> { + + /** + * @description - Request Users by keys. + * @param {string} key + * @return {*} {(Observable)} + * @memberof UmbDataTypeStore + */ + getByKeys(keys: Array) { const params = keys.map((key) => `key=${key}`).join('&'); fetch(`/umbraco/backoffice/users/getByKeys?${params}`) .then((res) => res.json()) @@ -65,7 +72,7 @@ export class UmbUserStore extends UmbStoreBase { return createObservablePart(this.#users, (users: Array) => users.filter((user: UmbUserStoreItemType) => keys.includes(user.key))); } - getByName(name: string): Observable> { + getByName(name: string) { name = name.trim(); name = name.toLocaleLowerCase(); @@ -79,9 +86,7 @@ export class UmbUserStore extends UmbStoreBase { return createObservablePart(this.#users, (users: Array) => users.filter((user: UmbUserStoreItemType) => user.name.toLocaleLowerCase().includes(name))); } - // TODO: Continue here: - - async enableUsers(userKeys: Array): Promise { + async enableUsers(userKeys: Array) { // TODO: use Fetcher API. try { const res = await fetch('/umbraco/backoffice/users/enable', { @@ -92,19 +97,19 @@ export class UmbUserStore extends UmbStoreBase { }, }); const enabledKeys = await res.json(); - const storedUsers = this._items.getValue().filter((user) => enabledKeys.includes(user.key)); + const storedUsers = this.#users.getValue().filter((user) => enabledKeys.includes(user.key)); storedUsers.forEach((user) => { user.status = 'enabled'; }); - this.updateItems(storedUsers); + this.#users.append(storedUsers); } catch (error) { console.error('Enable Users failed', error); } } - async updateUserGroup(userKeys: Array, userGroup: string): Promise { + async updateUserGroup(userKeys: Array, userGroup: string) { // TODO: use Fetcher API. try { const res = await fetch('/umbraco/backoffice/users/updateUserGroup', { @@ -115,7 +120,7 @@ export class UmbUserStore extends UmbStoreBase { }, }); const enabledKeys = await res.json(); - const storedUsers = this._items.getValue().filter((user) => enabledKeys.includes(user.key)); + const storedUsers = this.#users.getValue().filter((user) => enabledKeys.includes(user.key)); storedUsers.forEach((user) => { if (userKeys.includes(user.key)) { @@ -125,13 +130,13 @@ export class UmbUserStore extends UmbStoreBase { } }); - this.updateItems(storedUsers); + this.#users.append(storedUsers); } catch (error) { console.error('Add user group failed', error); } } - async removeUserGroup(userKeys: Array, userGroup: string): Promise { + async removeUserGroup(userKeys: Array, userGroup: string) { // TODO: use Fetcher API. try { const res = await fetch('/umbraco/backoffice/users/enable', { @@ -142,19 +147,19 @@ export class UmbUserStore extends UmbStoreBase { }, }); const enabledKeys = await res.json(); - const storedUsers = this._items.getValue().filter((user) => enabledKeys.includes(user.key)); + const storedUsers = this.#users.getValue().filter((user) => enabledKeys.includes(user.key)); storedUsers.forEach((user) => { user.userGroups = user.userGroups.filter((group) => group !== userGroup); }); - this.updateItems(storedUsers); + this.#users.append(storedUsers); } catch (error) { console.error('Remove user group failed', error); } } - async disableUsers(userKeys: Array): Promise { + async disableUsers(userKeys: Array) { // TODO: use Fetcher API. try { const res = await fetch('/umbraco/backoffice/users/disable', { @@ -165,19 +170,19 @@ export class UmbUserStore extends UmbStoreBase { }, }); const disabledKeys = await res.json(); - const storedUsers = this._items.getValue().filter((user) => disabledKeys.includes(user.key)); + const storedUsers = this.#users.getValue().filter((user) => disabledKeys.includes(user.key)); storedUsers.forEach((user) => { user.status = 'disabled'; }); - this.updateItems(storedUsers); + this.#users.append(storedUsers); } catch (error) { console.error('Disable Users failed', error); } } - async deleteUsers(userKeys: Array): Promise { + async deleteUsers(userKeys: Array) { // TODO: use Fetcher API. try { const res = await fetch('/umbraco/backoffice/users/delete', { @@ -188,13 +193,13 @@ export class UmbUserStore extends UmbStoreBase { }, }); const deletedKeys = await res.json(); - this.deleteItems(deletedKeys); + this.#users.remove(deletedKeys); } catch (error) { console.error('Delete Users failed', error); } } - async save(users: Array): Promise { + async save(users: Array) { // TODO: use Fetcher API. try { const res = await fetch('/umbraco/backoffice/users/save', { @@ -205,7 +210,7 @@ export class UmbUserStore extends UmbStoreBase { }, }); const json = await res.json(); - this.updateItems(json); + this.#users.append(json); } catch (error) { console.error('Save Data Type error', error); } @@ -216,7 +221,7 @@ export class UmbUserStore extends UmbStoreBase { email: string, message: string, userGroups: Array - ): Promise { + ) { // TODO: use Fetcher API. try { const res = await fetch('/umbraco/backoffice/users/invite', { @@ -227,7 +232,7 @@ export class UmbUserStore extends UmbStoreBase { }, }); const json = (await res.json()) as UmbUserStoreItemType[]; - this.updateItems(json); + this.#users.append(json); return json[0]; } catch (error) { console.error('Invite user error', error);