Files
Toju/toju-app/src/app/domains/direct-message/feature/find-people/find-people.component.ts

63 lines
1.9 KiB
TypeScript

/* eslint-disable @typescript-eslint/member-ordering */
import {
Component,
computed,
inject,
signal
} from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { RouterLink } from '@angular/router';
import { Store } from '@ngrx/store';
import { NgIcon, provideIcons } from '@ng-icons/core';
import {
lucideArrowLeft,
lucideSearch,
lucideUsers
} from '@ng-icons/lucide';
import { UserSearchListComponent } from '../user-search-list/user-search-list.component';
import { selectAllUsers } from '../../../../store/users/users.selectors';
import { selectSavedRooms } from '../../../../store/rooms/rooms.selectors';
/**
* Dedicated people-discovery page. Wraps {@link UserSearchListComponent} with a search
* field and an onboarding empty state for accounts that have not joined any servers yet.
* On mobile the global app-shell servers rail stays visible beside this page.
*/
@Component({
selector: 'app-find-people',
standalone: true,
imports: [
CommonModule,
FormsModule,
RouterLink,
NgIcon,
UserSearchListComponent
],
viewProviders: [provideIcons({ lucideArrowLeft, lucideSearch, lucideUsers })],
templateUrl: './find-people.component.html',
host: {
class: 'block h-full min-h-0 min-w-0 w-full overflow-hidden'
}
})
export class FindPeopleComponent {
private store = inject(Store);
searchQuery = signal('');
private users = this.store.selectSignal(selectAllUsers);
private savedRooms = this.store.selectSignal(selectSavedRooms);
/** True when the account has any people to surface (known users or server members). */
hasDiscoverablePeople = computed(() => {
if (this.users().length > 0) {
return true;
}
return this.savedRooms().some((room) => (room.members?.length ?? 0) > 0);
});
onSearchChange(query: string): void {
this.searchQuery.set(query);
}
}