import { KeyValue } from '@angular/common'; import { Component, Inject, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { NavController } from '@ionic/angular'; import { SafeAny } from '@ngify/types'; import { filter, takeUntil } from 'rxjs/operators'; import { FriendRequestStatus, SocketEvent } from 'src/app/common/enums'; import { success } from 'src/app/common/operators'; import { WINDOW } from 'src/app/common/tokens'; import { NICKNAME_MAX_LENGTH, REASON_MAX_LENGTH } from 'src/app/constants'; import { AgreeFriendRequest, FriendRequest, Result, User } from 'src/app/models/onchat.model'; import { FriendService } from 'src/app/services/apis/friend.service'; import { Destroyer } from 'src/app/services/destroyer.service'; import { GlobalData } from 'src/app/services/global-data.service'; import { Overlay } from 'src/app/services/overlay.service'; import { Socket } from 'src/app/services/socket.service'; @Component({ selector: 'app-handle', templateUrl: './handle.page.html', styleUrls: ['./handle.page.scss'], providers: [Destroyer] }) export class HandlePage implements OnInit { readonly requestStatus: typeof FriendRequestStatus = FriendRequestStatus; /** 用户 */ user: User; request: FriendRequest; constructor( public globalData: GlobalData, private overlay: Overlay, private navCtrl: NavController, private route: ActivatedRoute, private socket: Socket, private friendService: FriendService, private destroyer: Destroyer, @Inject(WINDOW) private window: Window, ) { } ngOnInit() { this.route.data.subscribe(({ user, request }: { user: User, request: Result<FriendRequest> }) => { this.user = user; this.request = request.data; }); this.socket.on(SocketEvent.FriendRequestAgree).pipe( takeUntil(this.destroyer), success(), filter(({ data }: Result<AgreeFriendRequest>) => data.requesterId === this.user.id) ).subscribe(() => { this.window.setTimeout(() => this.navCtrl.back(), 250); }); this.socket.on(SocketEvent.FriendRequestReject).pipe( takeUntil(this.destroyer), success(), filter(({ data }: Result<FriendRequest>) => data.requesterId === this.user.id) ).subscribe(() => { this.window.setTimeout(() => this.navCtrl.back(), 250); }); // 如果未读,则设置为已读 const { id, targetReaded } = this.request; if (!targetReaded) { this.friendService.readedReceiveRequest(id).subscribe(); const request = this.globalData.receiveFriendRequests.find(o => o.id === id); if (request) { request.targetReaded = true; } } } agree() { this.overlay.alert({ header: '同意申请', confirmHandler: (data: KeyValue<string, SafeAny>) => { this.socket.friendRequestAgree(this.request.id, data['requesterAlias']); }, inputs: [{ name: 'requesterAlias', type: 'text', placeholder: '顺便给对方起个好听的别名吧', cssClass: 'ipt-primary', attributes: { maxlength: NICKNAME_MAX_LENGTH } }] }); } reject() { this.overlay.alert({ header: '拒绝申请', confirmHandler: (data: KeyValue<string, SafeAny>) => { this.socket.friendRequestReject(this.request.id, data['rejectReason']); }, inputs: [{ name: 'rejectReason', type: 'textarea', placeholder: '或许可以告诉对方你拒绝的原因', cssClass: 'ipt-primary', attributes: { rows: 4, maxlength: REASON_MAX_LENGTH } }] }); } }