changing of status message is implemented

This commit is contained in:
Richard Park 2020-01-13 14:54:25 +09:00
parent 99f7fa9767
commit 993003ef60
7 changed files with 187 additions and 48 deletions

View File

@ -335,41 +335,55 @@
<button mat-menu-item (click)="onClickStatusBusy($event, 1)"> <button mat-menu-item (click)="onClickStatusBusy($event, 1)">
<span class="presence pcOther"> </span> <span class="presence pcOther"> </span>
<ucap-inline-edit-input <ucap-inline-edit-input
#statusMessage1
(click)="$event.stopPropagation()" (click)="$event.stopPropagation()"
(apply)="onApplyStatusMessage(1, statusMessage1.value)"
> >
<span ucapInlineEditInput="view">{{ loginRes?.statusMessage1 }}</span> <span ucapInlineEditInput="view">{{ loginRes?.statusMessage1 }}</span>
<span ucapInlineEditInput="edit"><input matInput type="text"/></span> <span ucapInlineEditInput="edit"
><input
matInput
#statusMessage1
type="text"
[value]="loginRes?.statusMessage1"
/></span>
</ucap-inline-edit-input> </ucap-inline-edit-input>
<!-- {{ loginRes?.statusMessage1 }} -->
</button> </button>
<!-- <button
mat-menu-item
class="edit"
(click)="$event.stopPropagation(); statusMessage1.editMode = true"
></button> -->
</div> </div>
<div class="setting"> <div class="setting">
<button mat-menu-item (click)="onClickStatusBusy($event, 2)"> <button mat-menu-item (click)="onClickStatusBusy($event, 2)">
<span class="presence pcOther"> </span> <span class="presence pcOther"> </span>
{{ loginRes?.statusMessage2 }} <ucap-inline-edit-input
(click)="$event.stopPropagation()"
(apply)="onApplyStatusMessage(2, statusMessage2.value)"
>
<span ucapInlineEditInput="view">{{ loginRes?.statusMessage2 }}</span>
<span ucapInlineEditInput="edit"
><input
matInput
#statusMessage2
type="text"
[value]="loginRes?.statusMessage2"
/></span>
</ucap-inline-edit-input>
</button> </button>
<button
mat-menu-item
class="edit"
(click)="onClickChangeStatusBusy($event, 2)"
></button>
</div> </div>
<div class="setting"> <div class="setting">
<button mat-menu-item (click)="onClickStatusBusy($event, 3)"> <button mat-menu-item (click)="onClickStatusBusy($event, 3)">
<span class="presence pcOther"> </span> <span class="presence pcOther"> </span>
{{ loginRes?.statusMessage3 }} <ucap-inline-edit-input
(click)="$event.stopPropagation()"
(apply)="onApplyStatusMessage(3, statusMessage3.value)"
>
<span ucapInlineEditInput="view">{{ loginRes?.statusMessage3 }}</span>
<span ucapInlineEditInput="edit"
><input
matInput
#statusMessage3
type="text"
[value]="loginRes?.statusMessage3"
/></span>
</ucap-inline-edit-input>
</button> </button>
<button
mat-menu-item
class="edit"
(click)="onClickChangeStatusBusy($event, 3)"
></button>
</div> </div>
</mat-menu> </mat-menu>
@ -377,28 +391,11 @@
<div mat-menu-item (click)="$event.stopPropagation()"> <div mat-menu-item (click)="$event.stopPropagation()">
{{ 'presence.settingOfAwayTime' | translate }} {{ 'presence.settingOfAwayTime' | translate }}
</div> </div>
<div mat-menu-item> <mat-radio-group aria-label="Select an option" [value]="myIdleCheckTime">
<mat-radio-button <div mat-menu-item *ngFor="let awayTime of awayTimeList">
value="10" <mat-radio-button [value]="awayTime" (change)="onChangeAwayTime($event)">
[checked]="myIdleCheckTime === 10" {{ awayTime }}{{ 'common.units.minute' | translate }}</mat-radio-button
(change)="onChangeAwayTime($event)" >
>10{{ 'common.units.minute' | translate }}</mat-radio-button </div>
> </mat-radio-group>
</div>
<div mat-menu-item>
<mat-radio-button
value="20"
[checked]="myIdleCheckTime === 20"
(change)="onChangeAwayTime($event)"
>20{{ 'common.units.minute' | translate }}</mat-radio-button
>
</div>
<div mat-menu-item>
<mat-radio-button
value="30"
[checked]="myIdleCheckTime === 30"
(change)="onChangeAwayTime($event)"
>30{{ 'common.units.minute' | translate }}</mat-radio-button
>
</div>
</mat-menu> </mat-menu>

View File

@ -60,6 +60,7 @@ import { DOCUMENT } from '@angular/common';
import { MatMenu, MatRadioChange } from '@angular/material'; import { MatMenu, MatRadioChange } from '@angular/material';
import { StatusCode, StatusType } from '@ucap-webmessenger/core'; import { StatusCode, StatusType } from '@ucap-webmessenger/core';
import { StatusInfo } from '@ucap-webmessenger/protocol-status'; import { StatusInfo } from '@ucap-webmessenger/protocol-status';
import { UserInfoUpdateType } from '@ucap-webmessenger/protocol-info';
const zoomFactors = [60, 70, 85, 100, 120, 145, 170, 200]; const zoomFactors = [60, 70, 85, 100, 120, 145, 170, 200];
@ -95,6 +96,8 @@ export class TopBarComponent implements OnInit, OnDestroy {
WebLinkType = WebLinkType; WebLinkType = WebLinkType;
StatusCode = StatusCode; StatusCode = StatusCode;
readonly awayTimeList = [10, 20, 30];
@ViewChild('profileMenu', { static: true }) @ViewChild('profileMenu', { static: true })
profileMenu: MatMenu; profileMenu: MatMenu;
@ -169,12 +172,19 @@ export class TopBarComponent implements OnInit, OnDestroy {
ngOnDestroy(): void { ngOnDestroy(): void {
if (!!this.loginResSubscription) { if (!!this.loginResSubscription) {
this.loginResSubscription.unsubscribe(); this.loginResSubscription.unsubscribe();
this.loginResSubscription = undefined;
} }
if (!!this.myStatusSubscription) { if (!!this.myStatusSubscription) {
this.myStatusSubscription.unsubscribe(); this.myStatusSubscription.unsubscribe();
this.myStatusSubscription = undefined;
} }
if (!!this.myIdleCheckTimeSubscription) { if (!!this.myIdleCheckTimeSubscription) {
this.myIdleCheckTimeSubscription.unsubscribe(); this.myIdleCheckTimeSubscription.unsubscribe();
this.myIdleCheckTimeSubscription = undefined;
}
if (!!this.zoomSubscription) {
this.zoomSubscription.unsubscribe();
this.zoomSubscription = undefined;
} }
} }
@ -452,6 +462,32 @@ export class TopBarComponent implements OnInit, OnDestroy {
); );
} }
onApplyStatusMessage(index: number, statusMessage: string) {
this.logger.debug('StatusMessage', index, statusMessage);
let updateType: UserInfoUpdateType;
switch (index) {
case 1:
updateType = UserInfoUpdateType.StatusMessage1;
break;
case 2:
updateType = UserInfoUpdateType.StatusMessage2;
break;
case 3:
updateType = UserInfoUpdateType.StatusMessage3;
break;
default:
return;
}
this.store.dispatch(
AuthenticationStore.infoUser({
req: { type: updateType, info: statusMessage }
})
);
}
onClickChangeStatusBusy(event: Event, index: number) { onClickChangeStatusBusy(event: Event, index: number) {
event.stopPropagation(); event.stopPropagation();
} }

View File

@ -8,6 +8,7 @@ import {
UserPasswordSetRequest, UserPasswordSetRequest,
UserPasswordSetResponse UserPasswordSetResponse
} from '@ucap-webmessenger/protocol-service'; } from '@ucap-webmessenger/protocol-service';
import { UserRequest, UserResponse } from '@ucap-webmessenger/protocol-info';
export const webLogin = createAction( export const webLogin = createAction(
'[Account::Authentication] Web Login', '[Account::Authentication] Web Login',
@ -122,3 +123,20 @@ export const updateLoginRes = createAction(
loginRes: LoginResponse; loginRes: LoginResponse;
}>() }>()
); );
export const infoUser = createAction(
'[Account::Authentication] Info User',
props<{ req: UserRequest }>()
);
export const infoUserSuccess = createAction(
'[Account::Authentication] Info User Success',
props<{
res: UserResponse;
}>()
);
export const infoUserFailure = createAction(
'[Account::Authentication] Info User Failure',
props<{ error: any }>()
);

View File

@ -41,7 +41,10 @@ import {
logoutInitialize, logoutInitialize,
userPasswordSet, userPasswordSet,
userPasswordSetSuccess, userPasswordSetSuccess,
userPasswordSetFailure userPasswordSetFailure,
infoUser,
infoUserSuccess,
infoUserFailure
} from './actions'; } from './actions';
import { import {
LoginInfo, LoginInfo,
@ -77,6 +80,10 @@ import { DaesangUrlInfoResponse } from '@ucap-webmessenger/api-external';
import { AppUserInfo, KEY_APP_USER_INFO } from '@app/types/app-user-info.type'; import { AppUserInfo, KEY_APP_USER_INFO } from '@app/types/app-user-info.type';
import { DaesangCipherService, WebLinkType } from '@ucap-webmessenger/daesang'; import { DaesangCipherService, WebLinkType } from '@ucap-webmessenger/daesang';
import { TranslateService } from '@ngx-translate/core'; import { TranslateService } from '@ngx-translate/core';
import {
InfoProtocolService,
UserResponse
} from '@ucap-webmessenger/protocol-info';
@Injectable() @Injectable()
export class Effects { export class Effects {
@ -482,6 +489,23 @@ export class Effects {
{ dispatch: false } { dispatch: false }
); );
infoUser$ = createEffect(() =>
this.actions$.pipe(
ofType(infoUser),
map(action => action.req),
exhaustMap(req =>
this.infoProtocolService.user(req).pipe(
map((res: UserResponse) => {
return infoUserSuccess({
res
});
}),
catchError(error => of(infoUserFailure({ error })))
)
)
)
);
constructor( constructor(
private actions$: Actions, private actions$: Actions,
private ngZone: NgZone, private ngZone: NgZone,
@ -493,6 +517,7 @@ export class Effects {
private appAuthenticationService: AppAuthenticationService, private appAuthenticationService: AppAuthenticationService,
private protocolService: ProtocolService, private protocolService: ProtocolService,
private authenticationProtocolService: AuthenticationProtocolService, private authenticationProtocolService: AuthenticationProtocolService,
private infoProtocolService: InfoProtocolService,
private serviceProtocolService: ServiceProtocolService, private serviceProtocolService: ServiceProtocolService,
private translateService: TranslateService, private translateService: TranslateService,
private dialogService: DialogService, private dialogService: DialogService,

View File

@ -6,8 +6,10 @@ import {
initialLoginFailCount, initialLoginFailCount,
logout, logout,
logoutInitialize, logoutInitialize,
updateLoginRes updateLoginRes,
infoUserSuccess
} from './actions'; } from './actions';
import { UserInfoUpdateType } from '@ucap-webmessenger/protocol-info';
export const reducer = createReducer( export const reducer = createReducer(
initialState, initialState,
@ -39,6 +41,57 @@ export const reducer = createReducer(
}; };
}), }),
on(infoUserSuccess, (state, action) => {
let loginRes = {
...state.loginRes
};
switch (action.res.type) {
case UserInfoUpdateType.Image:
loginRes = {
...loginRes
};
break;
case UserInfoUpdateType.Intro:
loginRes = {
...loginRes
};
break;
case UserInfoUpdateType.TelephoneVisible:
loginRes = {
...loginRes
};
break;
case UserInfoUpdateType.StatusMessage1:
loginRes = {
...loginRes,
statusMessage1: action.res.info
};
break;
case UserInfoUpdateType.StatusMessage2:
loginRes = {
...loginRes,
statusMessage2: action.res.info
};
break;
case UserInfoUpdateType.StatusMessage3:
loginRes = {
...loginRes,
statusMessage3: action.res.info
};
break;
default:
break;
}
return {
...state,
loginRes: {
...loginRes
}
};
}),
on(logoutInitialize, (state, action) => { on(logoutInitialize, (state, action) => {
return { return {
...initialState ...initialState

View File

@ -4,7 +4,13 @@ export enum UserInfoUpdateType {
// R: 인트로소개 // R: 인트로소개
Intro = 'R', Intro = 'R',
// T: 전화보이기여부 // T: 전화보이기여부
TelephoneVisible = 'T' TelephoneVisible = 'T',
/** StatusMessage1 */
StatusMessage1 = 'S1',
/** StatusMessage2 */
StatusMessage2 = 'S2',
/** StatusMessage3 */
StatusMessage3 = 'S3'
} }
export enum TelephoneVisibleType { export enum TelephoneVisibleType {

View File

@ -1,4 +1,4 @@
import { Component, OnInit } from '@angular/core'; import { Component, OnInit, Output, EventEmitter } from '@angular/core';
@Component({ @Component({
selector: 'ucap-inline-edit-input', selector: 'ucap-inline-edit-input',
@ -6,6 +6,9 @@ import { Component, OnInit } from '@angular/core';
styleUrls: ['./inline-edit-input.component.scss'] styleUrls: ['./inline-edit-input.component.scss']
}) })
export class InlineEditInputComponent implements OnInit { export class InlineEditInputComponent implements OnInit {
@Output()
apply = new EventEmitter<void>();
get editMode() { get editMode() {
return this._editMode; return this._editMode;
} }
@ -29,5 +32,6 @@ export class InlineEditInputComponent implements OnInit {
onClickApply(event: Event) { onClickApply(event: Event) {
this.editMode = false; this.editMode = false;
this.apply.emit();
} }
} }