| @@ -1 +1,24 @@ | |||||
| <p>add-broadcast works!</p> | |||||
| <section class="info"> | |||||
| <img src="{{tempBroadcastInfo.user.imgUrl}}"> | |||||
| <div class="input-holder"> | |||||
| <input type="text" placeholder="Enter name of the Channel" [(ngModel)]="tempBroadcastInfo.user.name"> | |||||
| <input type="text" placeholder="Paste the image URL" [(ngModel)]="tempBroadcastInfo.user.imgUrl"> | |||||
| </div> | |||||
| </section> | |||||
| <div class="friend-list-holder"> | |||||
| <header> Select Members </header> | |||||
| <input type="text" [(ngModel)]="searchTerm" placeholder="Search Members" (input)="searchMembers()"> | |||||
| <ul> | |||||
| <li *ngFor="let friend of tempFriendList" [ngClass]="{'active' : isFriendMember(friend.user.id) }" | |||||
| (click)="toggleMember(friend.user.id)"> | |||||
| <img src="{{ friend.user.imgUrl }}" alt=""> | |||||
| <label> {{ friend.user.name }} </label> | |||||
| </li> | |||||
| </ul> | |||||
| </div> | |||||
| <button class="add-broadcast-button" (click)="closeBroadcast()" [ngClass]="{'active' : tempBroadcastInfo.user.name }"> | |||||
| <svg-icon *ngIf="tempBroadcastInfo.user.name" [applyClass]="true" class="icon" src="assets/custom-icons/check.svg"></svg-icon> | |||||
| <svg-icon *ngIf="!tempBroadcastInfo.user.name" [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> | |||||
| </button> | |||||
| @@ -0,0 +1,125 @@ | |||||
| .info { | |||||
| margin-top: 20px; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: space-between; | |||||
| width: 100%; | |||||
| .input-holder { | |||||
| width: calc(100% - 100px); | |||||
| } | |||||
| img { | |||||
| width: 80px; | |||||
| height: 80px; | |||||
| border: 2px solid var(--teal-green); | |||||
| background-color: #cecece; | |||||
| overflow: hidden; | |||||
| border-radius: 50%; | |||||
| object-fit: cover; | |||||
| display: block; | |||||
| } | |||||
| input { | |||||
| width: 100%; | |||||
| display: block; | |||||
| border: 0px; | |||||
| border-bottom: 2px solid var(--light-grey); | |||||
| color: var(--dark-grey); | |||||
| padding: 10px 0; | |||||
| font-size: 16px; | |||||
| margin-bottom: 10px; | |||||
| font-weight: 600; | |||||
| } | |||||
| } | |||||
| .friend-list-holder { | |||||
| header { | |||||
| font-size: 16px; | |||||
| font-weight: bold; | |||||
| color: var(--dark-grey); | |||||
| margin: 30px auto 0px; | |||||
| } | |||||
| ul { | |||||
| list-style: none; | |||||
| margin-top: 20px; | |||||
| } | |||||
| li { | |||||
| display: flex; | |||||
| width: 100%; | |||||
| align-items: center; | |||||
| justify-content: space-between; | |||||
| padding: 15px; | |||||
| margin: 0px auto; | |||||
| border-bottom: 1px solid #cecece; | |||||
| &.active { | |||||
| background-color: var(--teal-green); | |||||
| border-radius: 7px; | |||||
| label { | |||||
| color: white; | |||||
| } | |||||
| } | |||||
| } | |||||
| img { | |||||
| width: 40px; | |||||
| height: 40px; | |||||
| border-radius: 50%; | |||||
| margin-right: 15px; | |||||
| } | |||||
| label { | |||||
| display: block; | |||||
| font-size: 15px; | |||||
| font-weight: 500; | |||||
| color: var(--dark-grey); | |||||
| width: calc(100% - 50px); | |||||
| } | |||||
| input { | |||||
| width: 100%; | |||||
| display: block; | |||||
| border: 0px; | |||||
| border-bottom: 2px solid var(--light-grey); | |||||
| color: var(--dark-grey); | |||||
| font-size: 14px; | |||||
| padding: 10px 0; | |||||
| font-weight: 600; | |||||
| } | |||||
| } | |||||
| .add-broadcast-button { | |||||
| position: fixed; | |||||
| right: 20px; | |||||
| bottom: 20px; | |||||
| z-index: 1; | |||||
| background-color: var(--danger); | |||||
| border: 0px; | |||||
| border-radius: 50%; | |||||
| width: 50px; | |||||
| height: 50px; | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| border: 1px solid white; | |||||
| .icon { | |||||
| width: 60%; | |||||
| position: relative; | |||||
| top: 1px; | |||||
| fill: white; | |||||
| } | |||||
| &.active { | |||||
| background-color: var(--teal-green); | |||||
| .icon { | |||||
| width: 70%; | |||||
| fill: white; | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -11,11 +11,61 @@ export class AddBroadcastComponent implements OnInit { | |||||
| @Input() friendList: any = []; | @Input() friendList: any = []; | ||||
| searchTerm: string = ''; | searchTerm: string = ''; | ||||
| tempFriendList: any = []; | tempFriendList: any = []; | ||||
| tempBroadcastInfo: any = {} | |||||
| constructor() { } | constructor() { } | ||||
| ngOnInit(): void { | ngOnInit(): void { | ||||
| if (this.broadcastInfo) { | |||||
| this.tempBroadcastInfo = this.broadcastInfo; | |||||
| } else { | |||||
| this.tempBroadcastInfo = { | |||||
| user: { | |||||
| id: null, | |||||
| name: '', | |||||
| imgUrl: '' | |||||
| }, | |||||
| members: [], | |||||
| conversation: [] | |||||
| }; | |||||
| } | |||||
| this.tempFriendList = this.friendList; | this.tempFriendList = this.friendList; | ||||
| } | } | ||||
| isFriendMember(id: string | number) { | |||||
| return this.tempBroadcastInfo.members.includes(id); | |||||
| } | |||||
| toggleMember(id: string | number) { | |||||
| if (this.tempBroadcastInfo.members.includes(id)) { | |||||
| let index = this.tempBroadcastInfo.members.indexOf(id); | |||||
| this.tempBroadcastInfo.members.splice(index, 1); | |||||
| } else { | |||||
| this.tempBroadcastInfo.members.push(id); | |||||
| } | |||||
| } | |||||
| searchMembers() { | |||||
| if (this.searchTerm) { | |||||
| this.tempFriendList = this.friendList.filter((friend) => { | |||||
| return friend.user.name.toLowerCase().includes(this.searchTerm.toLowerCase()); | |||||
| }); | |||||
| } else { | |||||
| this.tempFriendList = this.friendList; | |||||
| } | |||||
| } | |||||
| closeBroadcast() { | |||||
| if (this.tempBroadcastInfo.user.name) { | |||||
| this.addBroadcastEvents.emit({ | |||||
| type: 'data', | |||||
| data: this.tempBroadcastInfo | |||||
| }); | |||||
| } else { | |||||
| this.addBroadcastEvents.emit({ | |||||
| type: 'close' | |||||
| }); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -51,7 +51,8 @@ | |||||
| <img src="{{ chat.user.imgUrl }}"> | <img src="{{ chat.user.imgUrl }}"> | ||||
| <div class="content"> | <div class="content"> | ||||
| <label> {{ chat.user.name }} </label> | <label> {{ chat.user.name }} </label> | ||||
| <p> | |||||
| <p> {{ chat.members.length }} Member(s) </p> | |||||
| <p *ngIf="chat.conversation.length > 0"> | |||||
| {{ chat.conversation[chat.conversation.length - 1].message }} | {{ chat.conversation[chat.conversation.length - 1].message }} | ||||
| </p> | </p> | ||||
| </div> | </div> | ||||
| @@ -61,11 +62,11 @@ | |||||
| </li> | </li> | ||||
| </ul> | </ul> | ||||
| <button class="add-broadcast-button" (click)="showAddBroadCast = !showAddBroadCast"> | |||||
| <button class="add-broadcast-button" (click)="selectedBroadcastChat = null; showAddBroadCast = true" *ngIf="!showAddBroadCast"> | |||||
| <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/plus.svg"></svg-icon> | <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/plus.svg"></svg-icon> | ||||
| </button> | </button> | ||||
| <app-add-broadcast *ngIf="showAddBroadCast"></app-add-broadcast> | |||||
| <app-add-broadcast (addBroadcastEvents)="getAddBroadcastEvents($event)" [friendList]="chatList" [broadcastInfo]="selectedBroadcastChat" *ngIf="showAddBroadCast" #addbroadcast></app-add-broadcast> | |||||
| </div> | </div> | ||||
| @@ -101,7 +102,7 @@ | |||||
| <section class="chat-window-slideup" [ngClass]="{'active' : selectedChat}"> | <section class="chat-window-slideup" [ngClass]="{'active' : selectedChat}"> | ||||
| <app-chat-window [conversation]="selectedChat" *ngIf="selectedChat" | <app-chat-window [conversation]="selectedChat" *ngIf="selectedChat" | ||||
| (hideChat)="getChatEvent($event)"></app-chat-window> | |||||
| (chatEvents)="getChatEvent($event)"></app-chat-window> | |||||
| </section> | </section> | ||||
| </section> | </section> | ||||
| @@ -8,8 +8,9 @@ import * as moment from 'moment'; | |||||
| styleUrls: ['./chat-page.component.scss'] | styleUrls: ['./chat-page.component.scss'] | ||||
| }) | }) | ||||
| export class ChatPageComponent implements OnInit { | export class ChatPageComponent implements OnInit { | ||||
| selectedSegment: string = 'messages'; | |||||
| selectedSegment: string = 'broadcasts'; | |||||
| selectedChat: any = null; | selectedChat: any = null; | ||||
| selectedBroadcastChat: any; | |||||
| showSearch: boolean = false; | showSearch: boolean = false; | ||||
| searchTerm: string = ''; | searchTerm: string = ''; | ||||
| searchList = { | searchList = { | ||||
| @@ -109,10 +110,11 @@ export class ChatPageComponent implements OnInit { | |||||
| broadCastList = [{ | broadCastList = [{ | ||||
| user: { | user: { | ||||
| id: 0, | |||||
| id: 1, | |||||
| name: '10th Standard Channel', | name: '10th Standard Channel', | ||||
| imgUrl: 'https://lh3.googleusercontent.com/9vppS4or0GIIqIdxU7vrMFbHMOOhO3FgFWPN1WYUH4xXd9GwFvZzeCGYrhezckELzAM' | imgUrl: 'https://lh3.googleusercontent.com/9vppS4or0GIIqIdxU7vrMFbHMOOhO3FgFWPN1WYUH4xXd9GwFvZzeCGYrhezckELzAM' | ||||
| }, | }, | ||||
| members: [], | |||||
| conversation: [{ | conversation: [{ | ||||
| message: 'Hi Students, Hope your all are doing well. You will have special classes tomorrow by DK sir @4.30PM. \n Followed by Quiz. ATB!', | message: 'Hi Students, Hope your all are doing well. You will have special classes tomorrow by DK sir @4.30PM. \n Followed by Quiz. ATB!', | ||||
| user: 0 | user: 0 | ||||
| @@ -143,8 +145,14 @@ export class ChatPageComponent implements OnInit { | |||||
| this.selectedChat = this.broadCastList[index]; | this.selectedChat = this.broadCastList[index]; | ||||
| } | } | ||||
| getChatEvent(e: boolean) { | |||||
| if (e) { | |||||
| getChatEvent(e: string) { | |||||
| if (e === 'close') { | |||||
| this.selectedChat = null; | |||||
| } | |||||
| if (e === 'edit') { | |||||
| this.showAddBroadCast = true; | |||||
| this.selectedBroadcastChat = JSON.parse(JSON.stringify(this.selectedChat)); | |||||
| this.selectedChat = null; | this.selectedChat = null; | ||||
| } | } | ||||
| } | } | ||||
| @@ -156,7 +164,7 @@ export class ChatPageComponent implements OnInit { | |||||
| } | } | ||||
| getFormattedDate() { | getFormattedDate() { | ||||
| return moment().format('ddd, hh:MM a') | |||||
| return moment().format('ddd, hh:MM a'); | |||||
| } | } | ||||
| searchChats() { | searchChats() { | ||||
| @@ -174,4 +182,27 @@ export class ChatPageComponent implements OnInit { | |||||
| } | } | ||||
| } | } | ||||
| getAddBroadcastEvents(e: any) { | |||||
| if (e.type === 'close') { | |||||
| this.showAddBroadCast = false; | |||||
| } | |||||
| if (e.type === 'data') { | |||||
| let broadcastData = e.data; | |||||
| if (!broadcastData.user.id) { | |||||
| broadcastData.user.id = this.broadCastList[this.broadCastList.length - 1].user.id + 1; | |||||
| this.broadCastList.push(broadcastData); | |||||
| } else { | |||||
| let index = this.broadCastList.findIndex((broadcast) => { | |||||
| return broadcast.user.id === broadcastData.user.id; | |||||
| }); | |||||
| this.broadCastList[index] = broadcastData; | |||||
| } | |||||
| this.showAddBroadCast = false; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -1,8 +1,11 @@ | |||||
| <header> | <header> | ||||
| <h5> | <h5> | ||||
| {{ conversation.user.name }} | {{ conversation.user.name }} | ||||
| <br> | |||||
| <span *ngIf="conversation.members"> {{ conversation.members.length }} Member(s) </span> | |||||
| </h5> | </h5> | ||||
| <button (click)="editBroadcast()" class="edit-button" *ngIf="conversation.members"> <svg-icon [applyClass]="true" class="icon edit" src="assets/custom-icons/pencil.svg"></svg-icon> </button> | |||||
| <button (click)="closeChat()"> <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> </button> | <button (click)="closeChat()"> <svg-icon [applyClass]="true" class="icon" src="assets/custom-icons/close.svg"></svg-icon> </button> | ||||
| </header> | </header> | ||||
| <ul> | <ul> | ||||
| @@ -12,10 +12,12 @@ header { | |||||
| letter-spacing: 1px; | letter-spacing: 1px; | ||||
| font-size: 18px; | font-size: 18px; | ||||
| color: var(--ash-black); | color: var(--ash-black); | ||||
| max-width: 50%; | |||||
| white-space: nowrap; | |||||
| overflow: hidden; | |||||
| text-overflow: ellipsis; | |||||
| width: calc(100% - 90px); | |||||
| span { | |||||
| color: var(--dark-grey); | |||||
| font-size: 14px; | |||||
| } | |||||
| } | } | ||||
| button { | button { | ||||
| @@ -25,6 +27,16 @@ header { | |||||
| background-color: var(--light-grey); | background-color: var(--light-grey); | ||||
| border: 0px; | border: 0px; | ||||
| &.edit-button { | |||||
| background-color: var(--teal-green); | |||||
| .icon { | |||||
| fill: white; | |||||
| width: 15px; | |||||
| height: 15px; | |||||
| } | |||||
| } | |||||
| .icon { | .icon { | ||||
| width: 12px; | width: 12px; | ||||
| height: 12px; | height: 12px; | ||||
| @@ -9,7 +9,7 @@ import * as moment from 'moment'; | |||||
| export class ChatWindowComponent implements OnInit { | export class ChatWindowComponent implements OnInit { | ||||
| @Input() conversation: any; | @Input() conversation: any; | ||||
| messageText: string = ''; | messageText: string = ''; | ||||
| @Output() hideChat = new EventEmitter(); | |||||
| @Output() chatEvents = new EventEmitter(); | |||||
| constructor() { } | constructor() { } | ||||
| @@ -50,6 +50,10 @@ export class ChatWindowComponent implements OnInit { | |||||
| } | } | ||||
| closeChat() { | closeChat() { | ||||
| this.hideChat.emit(true); | |||||
| this.chatEvents.emit('close'); | |||||
| } | |||||
| editBroadcast() { | |||||
| this.chatEvents.emit('edit'); | |||||
| } | } | ||||
| } | } | ||||
| @@ -0,0 +1,42 @@ | |||||
| <?xml version="1.0" encoding="iso-8859-1"?> | |||||
| <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | |||||
| <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | |||||
| viewBox="0 0 426.667 426.667" style="enable-background:new 0 0 426.667 426.667;" xml:space="preserve"> | |||||
| <g> | |||||
| <g> | |||||
| <path d="M421.876,56.307c-6.548-6.78-17.352-6.968-24.132-0.42c-0.142,0.137-0.282,0.277-0.42,0.42L119.257,334.375 | |||||
| l-90.334-90.334c-6.78-6.548-17.584-6.36-24.132,0.42c-6.388,6.614-6.388,17.099,0,23.713l102.4,102.4 | |||||
| c6.665,6.663,17.468,6.663,24.132,0L421.456,80.44C428.236,73.891,428.424,63.087,421.876,56.307z"/> | |||||
| </g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| </svg> | |||||
| @@ -0,0 +1,52 @@ | |||||
| <?xml version="1.0" encoding="iso-8859-1"?> | |||||
| <!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> | |||||
| <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" | |||||
| viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve"> | |||||
| <g> | |||||
| <g> | |||||
| <polygon points="51.2,353.28 0,512 158.72,460.8 "/> | |||||
| </g> | |||||
| </g> | |||||
| <g> | |||||
| <g> | |||||
| <rect x="89.73" y="169.097" transform="matrix(0.7071 -0.7071 0.7071 0.7071 -95.8575 260.3719)" width="353.277" height="153.599"/> | |||||
| </g> | |||||
| </g> | |||||
| <g> | |||||
| <g> | |||||
| <path d="M504.32,79.36L432.64,7.68c-10.24-10.24-25.6-10.24-35.84,0l-23.04,23.04l107.52,107.52l23.04-23.04 | |||||
| C514.56,104.96,514.56,89.6,504.32,79.36z"/> | |||||
| </g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| <g> | |||||
| </g> | |||||
| </svg> | |||||