From b2a8f5026780e04732c289e65ca29ed74c6fa76a Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Tue, 12 May 2020 10:46:19 +0900 Subject: [PATCH 01/64] Appling call-log UI design on a quickstart-calls sample. 1. Add CallLogView Component. 2. Add CallLogItem Component. 3. Add Header Component. 4. Add TabToolBar Component. 5. Add design Images. 6. Call-Log UI Desing apply. 7. when scroll reached to the bottom, get next call log query --- .gitignore | 1 + css/main.css | 15 ++ js/main.js | 4 +- js/widget.js | 4 +- lib/assets/ic-call-filled-active.svg | 3 + lib/assets/ic-call-filled-deactive.svg | 3 + lib/assets/ic-call-filled.svg | 3 + lib/assets/ic-layout-default-active.svg | 3 + lib/assets/ic-layout-default-deactive.svg | 3 + lib/assets/ic-logo-horizontal-inverse-01.svg | 3 + lib/assets/ic-video-thumbnail-filled.svg | 3 + .../icon-call-video-incoming-filled.svg | 6 + .../icon-call-video-outgoing-filled.svg | 6 + .../icon-call-voice-incoming-filled.svg | 6 + .../icon-call-voice-outgoing-filled.svg | 6 + lib/components/App.js | 11 +- lib/components/Header.js | 91 +++++++ lib/components/MainApp.js | 26 +- lib/components/TabToolBar.js | 53 ++++ lib/css/styles.js | 252 +++++++++++++++++- lib/utils/domUtil.js | 19 ++ lib/views/CallLogItem.js | 132 +++++++++ lib/views/CallLogView.js | 54 ++++ lib/views/DialView.js | 102 +------ package-lock.json | 90 +++---- 25 files changed, 746 insertions(+), 153 deletions(-) create mode 100644 lib/assets/ic-call-filled-active.svg create mode 100644 lib/assets/ic-call-filled-deactive.svg create mode 100644 lib/assets/ic-call-filled.svg create mode 100644 lib/assets/ic-layout-default-active.svg create mode 100644 lib/assets/ic-layout-default-deactive.svg create mode 100644 lib/assets/ic-logo-horizontal-inverse-01.svg create mode 100644 lib/assets/ic-video-thumbnail-filled.svg create mode 100644 lib/assets/icon-call-video-incoming-filled.svg create mode 100644 lib/assets/icon-call-video-outgoing-filled.svg create mode 100644 lib/assets/icon-call-voice-incoming-filled.svg create mode 100644 lib/assets/icon-call-voice-outgoing-filled.svg create mode 100644 lib/components/Header.js create mode 100644 lib/components/TabToolBar.js create mode 100644 lib/views/CallLogItem.js create mode 100644 lib/views/CallLogView.js diff --git a/.gitignore b/.gitignore index 6704566..a6b984d 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,4 @@ dist # TernJS port file .tern-port +.DS_Store diff --git a/css/main.css b/css/main.css index ab66b10..e0a1723 100644 --- a/css/main.css +++ b/css/main.css @@ -150,6 +150,7 @@ body { display: flex; width: 100vw; height: 100vh; + overflow: hidden; } .container { @@ -253,3 +254,17 @@ button label { right: 16px; bottom: 16px; } + +::-webkit-scrollbar { + width: 5px; /* 세로축 스크롤바 길이 */ + } + ::-webkit-scrollbar-track { + background-color: transparent; + } + ::-webkit-scrollbar-track-piece { + background-color: transparent; + } + ::-webkit-scrollbar-thumb { + border-radius: 8px; + background-color: gray; + } diff --git a/js/main.js b/js/main.js index b4e8c80..1394175 100644 --- a/js/main.js +++ b/js/main.js @@ -3,6 +3,7 @@ import MainApp from "../lib/components/MainApp"; import DialView from "../lib/views/DialView"; import CallView from "../lib/views/CallView"; import LoginView from "../lib/views/LoginView"; +import CallLogView from "../lib/views/CallLogView"; import { ACCESS_TOKEN, IS_ACCESS_TOKEN_NEEDED, TEST_APP_ID, USER_ID } from "../envs"; function onLoadedHandler() { @@ -12,7 +13,8 @@ function onLoadedHandler() { 'index': LoginView, 'login_view': LoginView, 'dial_view': DialView, - 'call_view': CallView + 'call_view': CallView, + 'calllog_view': CallLogView }, styles: {}, args: { diff --git a/js/widget.js b/js/widget.js index fcfc1c7..3773281 100644 --- a/js/widget.js +++ b/js/widget.js @@ -2,6 +2,7 @@ import "../css/main.css"; import LoginView from "../lib/views/LoginView"; import CallView from "../lib/views/CallView"; import DialView from "../lib/views/DialView"; +import CallLogView from "../lib/views/CallLogView"; import { TEST_APP_ID, USER_ID, ACCESS_TOKEN, IS_ACCESS_TOKEN_NEEDED } from "../envs.js"; import WidgetApp from "../lib/components/WidgetApp"; @@ -13,7 +14,8 @@ function onLoadedHandler() { 'index': LoginView, 'login_view': LoginView, 'dial_view': DialView, - 'call_view': CallView + 'call_view': CallView, + 'calllog_view': CallLogView }, styles: { }, diff --git a/lib/assets/ic-call-filled-active.svg b/lib/assets/ic-call-filled-active.svg new file mode 100644 index 0000000..e875484 --- /dev/null +++ b/lib/assets/ic-call-filled-active.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/ic-call-filled-deactive.svg b/lib/assets/ic-call-filled-deactive.svg new file mode 100644 index 0000000..115f2a7 --- /dev/null +++ b/lib/assets/ic-call-filled-deactive.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/ic-call-filled.svg b/lib/assets/ic-call-filled.svg new file mode 100644 index 0000000..e875484 --- /dev/null +++ b/lib/assets/ic-call-filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/ic-layout-default-active.svg b/lib/assets/ic-layout-default-active.svg new file mode 100644 index 0000000..78a47c9 --- /dev/null +++ b/lib/assets/ic-layout-default-active.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/ic-layout-default-deactive.svg b/lib/assets/ic-layout-default-deactive.svg new file mode 100644 index 0000000..5f4b5bd --- /dev/null +++ b/lib/assets/ic-layout-default-deactive.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/ic-logo-horizontal-inverse-01.svg b/lib/assets/ic-logo-horizontal-inverse-01.svg new file mode 100644 index 0000000..f574caf --- /dev/null +++ b/lib/assets/ic-logo-horizontal-inverse-01.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/ic-video-thumbnail-filled.svg b/lib/assets/ic-video-thumbnail-filled.svg new file mode 100644 index 0000000..677fc23 --- /dev/null +++ b/lib/assets/ic-video-thumbnail-filled.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/icon-call-video-incoming-filled.svg b/lib/assets/icon-call-video-incoming-filled.svg new file mode 100644 index 0000000..a408dd3 --- /dev/null +++ b/lib/assets/icon-call-video-incoming-filled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/lib/assets/icon-call-video-outgoing-filled.svg b/lib/assets/icon-call-video-outgoing-filled.svg new file mode 100644 index 0000000..380a106 --- /dev/null +++ b/lib/assets/icon-call-video-outgoing-filled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/lib/assets/icon-call-voice-incoming-filled.svg b/lib/assets/icon-call-voice-incoming-filled.svg new file mode 100644 index 0000000..f0cd9cc --- /dev/null +++ b/lib/assets/icon-call-voice-incoming-filled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/lib/assets/icon-call-voice-outgoing-filled.svg b/lib/assets/icon-call-voice-outgoing-filled.svg new file mode 100644 index 0000000..9bb0429 --- /dev/null +++ b/lib/assets/icon-call-voice-outgoing-filled.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/lib/components/App.js b/lib/components/App.js index b05beac..b76eff8 100644 --- a/lib/components/App.js +++ b/lib/components/App.js @@ -1,5 +1,5 @@ import BaseElement from "./BaseElement"; -import { jss, sheet } from "../css/styles.js"; +import { jss, sheet, classes } from "../css/styles.js"; export default class App extends BaseElement { constructor({ id, className, pages, styles, args }) { @@ -30,7 +30,14 @@ export default class App extends BaseElement { route(pageName, opt = {}) { for (let i = this.children.length - 1 ; i >= 0 ; i--) { const child = this.children[i]; - child.remove(); + if( child.element.id === 'header' || child.element.id === 'tabtoolbar') { + if( opt.isRemoveHeader === true ) { + child.remove(); + } + } + else{ + child.remove(); + } } const _pageName = this.pages[pageName] ? pageName : 'index'; diff --git a/lib/components/Header.js b/lib/components/Header.js new file mode 100644 index 0000000..3f35542 --- /dev/null +++ b/lib/components/Header.js @@ -0,0 +1,91 @@ +import SendBirdCall from "sendbird-calls"; +import BaseElement from "./BaseElement"; +import { createDiv } from "../utils/domUtil"; +import Menu from "../components/Menu"; +import { sheet, classes } from "../css/styles"; + +export default class Header extends BaseElement { + constructor({ id, className, parent, element, args } = {}) { + super({ id, className, parent, element, args }); + this.element = element; + this.parent = parent; + + this.settingItems = [ + { + 'label': 'Device settings', + 'callback': () => { this.sendToParent('show_settings') } + }, + { + 'label': 'Sign out', + 'callback': () => { + SendBirdCall.deauthenticate(); + this.sendToParent('deauthenticate'); + } + } + ]; + } + + build() { + const userDiv = createDiv({ + id: 'header_user_div', + className: `${classes['userDiv']} ${classes['center']}` + }); + + let profileImg; + if (this.args.user && this.args.user.profileUrl) { + sheet.update({ profileUrl: this.args.user.profileUrl }); + profileImg = createDiv({ id: 'header_profile_img', className: classes['profileSmall'] }); + } else { + profileImg = createDiv({ id: 'header_avatar', className: `${classes['avatar']}` }); + } + + const headerInfo = createDiv({ id: 'header_info', className: `${classes['headerInfo']}` }); + const userId = createDiv({ + id: 'header_user_id', + className: `${classes['headerUserId']} ${classes['fontNormal']} ${classes['fontHeavy']}`, + innerText: this.args.user.userId || '' + }); + const nickname = createDiv({ + id: 'header_nickname', + className: `${classes['headerNickname']} ${classes['fontSmall']}`, + innerText: this.args.user.nickname || 'no nickname' + }); + headerInfo.appendChild(userId); + headerInfo.appendChild(nickname); + + userDiv.appendChild(profileImg); + userDiv.appendChild(headerInfo); + + const headerButtons = createDiv({ + id: 'header_buttons', + className: `${classes['headerButtons']} ${classes['row']} ${classes['center']}` + }); + const settingsButton = new Menu({ + id: 'settings_button', + element: createDiv({ className: `${classes['settingsButton']}` }), + items: this.settingItems + }); + + const closeButton = createDiv({ + id: 'close_button', + className: `${classes['closeButton']}` + }); + closeButton.onclick = () => { + this.element.sendToParent('widgetclose'); + }; + settingsButton.appendToHTML(headerButtons); + headerButtons.appendChild(closeButton); + + const divider = createDiv({ + id: 'header_divider', + className: classes['headerDivider'] + }); + + const headerLogo = createDiv({ id: 'header_logo', className: `${classes['headerLogo']}`}); + + this.element.appendChild(userDiv); + this.element.appendChild(divider); + this.element.appendChild(headerButtons); + this.element.appendChild(headerLogo); + } +} \ No newline at end of file diff --git a/lib/components/MainApp.js b/lib/components/MainApp.js index cc31ae0..e0b119f 100644 --- a/lib/components/MainApp.js +++ b/lib/components/MainApp.js @@ -6,6 +6,10 @@ import { getCallOption } from "../utils/util"; import { Toast } from "./Toast"; import Settings from "../views/Settings"; +import Header from "../components/Header"; +import TabToolBar from "../components/TabToolBar"; +import { createDiv } from "../utils/domUtil"; + export default class MainApp extends App { constructor({ id, className, pages, styles, args }) { const _className = `${classes['mainApp']} ${classes['container']} ${classes['center']} ${className || ''}`; @@ -97,6 +101,9 @@ export default class MainApp extends App { this.args.user = user; if (this.onLoginSuccess) this.onLoginSuccess(); + + this.createHeaderNTab(); + this.route('dial_view', {}); } catch (e) { if (this.onLoginFailure) this.onLoginFailure(e); @@ -137,7 +144,7 @@ export default class MainApp extends App { return undefined; } - this.route('call_view', { call: call, state: state }); + this.route('call_view', { call: call, state: state, isRemoveHeader: true }); } isBusy() { @@ -173,6 +180,12 @@ export default class MainApp extends App { case 'close': this.recvClose(value); break; + case 'show_calllog': + this.route('calllog_view', {}); + break; + case 'show_dial': + this.route('dial_view', {}); + break; default: break; } @@ -190,7 +203,7 @@ export default class MainApp extends App { this.args.user = undefined; this.args.userId = undefined; this.args.accessToken = undefined; - this.route('login_view', {}); + this.route('login_view', { isRemoveHeader: true }); } recvShowSettings() { @@ -202,6 +215,15 @@ export default class MainApp extends App { } recvClose() { + this.createHeaderNTab(); this.route('dial_view', {}); } + + createHeaderNTab() { + const HeaderItem = new Header({element: createDiv({ id: 'header', className: `${classes['widgetHeader']}`})}); + const tabToolBar = new TabToolBar({element: createDiv({id: 'tabtoolbar', className: `${classes['tabToolBar']}`})}); + + HeaderItem.appendToBaseElement(this); + tabToolBar.appendToBaseElement(this); + } } \ No newline at end of file diff --git a/lib/components/TabToolBar.js b/lib/components/TabToolBar.js new file mode 100644 index 0000000..8367ac7 --- /dev/null +++ b/lib/components/TabToolBar.js @@ -0,0 +1,53 @@ +import BaseElement from "./BaseElement"; +import { createDiv, createParagraph, replaceClassName, hasClassName } from "../utils/domUtil"; +import { classes } from "../css/styles"; + +export default class TabToolBar extends BaseElement { + constructor({ id, className, parent, element } = {}) { + super({ id, className, parent, element }); + this.element = element; + } + + build() { + // dial tab + const btnDial = createDiv({id: 'btn_tab_dial', className: `${classes['btnTab']}`}); + const icoTabDial = createDiv({id: 'ico_tab_dial', className: `${classes['tabIco']} ${classes['dialActive']}`}); + const btnDialCaption = createParagraph({id: 'btn_dial_caption', innerText: 'dial', className: `${classes['fontNormal']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabActive']}`}); + + btnDial.appendChild(icoTabDial); + btnDial.appendChild(btnDialCaption); + + btnDial.onclick = (ev) => { + if(!hasClassName(icoTabDial, classes['dialActive'])) { + replaceClassName(icoTabDial, classes['dialDeactive'], classes['dialActive']); + replaceClassName(btnDialCaption, classes['btnTabDeactive'], classes['btnTabActive']); + + replaceClassName(icoCallLog, classes['callLogActive'], classes['callLogDeactive']); + replaceClassName(btnCalllogCaption, classes['btnTabActive'], classes['btnTabDeactive']); + this.sendToParent('show_dial'); + } + }; + + const btnCallLog = createDiv({id: 'btn_tab_calllog', className: `${classes['btnTab']}`}); + const icoCallLog = createDiv({id: 'ico_tab_callog', className: `${classes['tabIco']} ${classes['callLogDeactive']}`}); + const btnCalllogCaption = createParagraph({id: 'btn_calllog_caption', innerText: 'History', className: `${classes['fontNormal']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabDeactive']}`}); + + btnCallLog.appendChild(icoCallLog); + btnCallLog.appendChild(btnCalllogCaption); + + btnCallLog.onclick = (ev) => { + if(!hasClassName(icoCallLog, classes['callLogActive'])) { + replaceClassName(icoCallLog, classes['callLogDeactive'], classes['callLogActive']); + replaceClassName(btnCalllogCaption, classes['btnTabDeactive'], classes['btnTabActive']); + + replaceClassName(icoTabDial, classes['dialActive'], classes['dialDeactive']); + replaceClassName(btnDialCaption, classes['btnTabActive'], classes['btnTabDeactive']); + + this.sendToParent('show_calllog'); + } + }; + + this.element.appendChild(btnDial); + this.element.appendChild(btnCallLog); + } +} \ No newline at end of file diff --git a/lib/css/styles.js b/lib/css/styles.js index 63ad272..a9d1b48 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -24,6 +24,15 @@ import settingsCloseIcon from '../assets/ic-close-black-20.svg'; import widgetCloseIcon from '../assets/ic-close-24.svg'; import arrowDownIcon from '../assets/ic-input-arrow-down.svg'; import avatarIcon from '../assets/icon-avatar.svg'; +import dialIconActive from '../assets/ic-call-filled-active.svg'; +import dialIconDeactive from '../assets/ic-call-filled-deactive.svg'; +import callhistoryIconDeactive from '../assets/ic-layout-default-deactive.svg'; +import callhistoryIconActive from '../assets/ic-layout-default-active.svg'; +import headerLogo from '../assets/ic-logo-horizontal-inverse-01.svg'; +import thumbnailVideo from '../assets/ic-video-thumbnail-filled.svg'; +import thumbnailVoice from '../assets/ic-call-filled.svg'; + + const option = Object.assign( {}, @@ -39,9 +48,12 @@ jss.setup(option); const colors = { navy50: '#f6f8fc', + navy80: '#eef2fa', navy100: '#dee2f2', navy200: '#c9d0e6', navy300: '#b6bdd7', + navy400: '#8a92ba', + navy600: '#595e8a', navy800: '#353761', navy900: '#212242', white: '#ffffff', @@ -137,10 +149,13 @@ const styles = { display: 'flex', width: '100%', height: '100%', + flexDirection: 'column', + justifyContent: 'flex-start', + alignItems: 'flex-start', }, hidden: { - display: 'none' + display: 'none !important' }, invisible: { @@ -190,11 +205,21 @@ const styles = { marginBottom: '24px' }, + headerLogo: { + display: 'block', + width: '100%', + height: '24px', + backgroundImage: `url(${headerLogo})`, + backgroundRepeat: 'no-repeat', + marginLeft: '16px' + }, + /*** views ***/ view: { boxSizing: 'border-box', - width: '100vw', + // width: '100vw', + width: '100%', height: '100%', padding: '24px', display: 'relative' @@ -339,6 +364,71 @@ const styles = { fontWeight: 600 }, + /*** tab ***/ + tabToolBar: { + position: 'relative', + display: 'inline-flex', + justifyContent: 'center', + width: '100%', + height: '55px', + backgroundColor: colors.white, + textAlign: 'center', + borderBottom: 'solid 1px #dee2f2' + }, + + btnTab: { + display: 'inline-block', + width: '100px', + height: '55px', + cursor: 'pointer' + }, + + tabIco: { + width: '100%', + height: '32px', + backgroundRepeat: 'no-repeat', + backgroundPosition: 'center' + }, + + dialActive: { + backgroundImage: `url(${dialIconActive})` + }, + + dialDeactive: { + backgroundImage: `url(${dialIconDeactive})` + }, + + btnTabCaption: { + width: '100%', + height: '12px', + margin: 0, + lineHeight: 1, + textAlign: 'center' + }, + + icoTabCallLog: { + width: '100%', + height: '32px', + backgroundRepeat: 'no-repeat', + backgroundPosition: 'center', + }, + + callLogActive: { + backgroundImage: `url(${callhistoryIconActive})`, + }, + + callLogDeactive: { + backgroundImage: `url(${callhistoryIconDeactive})`, + }, + + btnTabActive: { + color: colors.purple300 + }, + + btnTabDeactive: { + color: colors.navy600 + }, + /*** components ***/ formContainer: { @@ -379,6 +469,9 @@ const styles = { } }, + dialTitle: { + marginBottom: '16px' + }, /*** buttons ***/ loginButton: { @@ -818,7 +911,10 @@ const styles = { borderRadius: '8px', boxShadow: '0 9px 15px -7px rgba(33, 34, 66, 0.04), 0 9px 46px 8px rgba(33, 34, 66, 0.08), 0 24px 38px 3px rgba(33, 34, 66, 0.12)', backgroundColor: colors.white, - overflow: 'hidden' + overflow: 'hidden', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center' }, widgetIcon: { @@ -833,14 +929,13 @@ const styles = { }, widgetHeader: { - position: 'absolute', - top: '0', - display: 'flex', + display: 'inline-flex', + position: 'relative', flexDirection: 'row-reverse', alignItems: 'center', width: '100%', height: '48px', - backgroundColor: colors.navy800, + backgroundColor: colors.purple300, }, userDiv: { @@ -916,7 +1011,8 @@ const styles = { backgroundPosition: 'center', '&:hover': { backgroundColor: colors.navy900 - } + }, + zIndex: 10, }, closeButton: { @@ -942,6 +1038,10 @@ const styles = { }, dialDesc: { + width: '312px', + height: '40px', + textAlign: 'center', + color: colors.navy400, marginBottom: '32px' }, @@ -959,6 +1059,142 @@ const styles = { backgroundColor: colors.purple300 }, + /* call Log View */ + callLogListContainer: { + display: 'inline-block', + position: 'relative', + width: '382px', + height: 'calc(100% - 103px)', + overflowY: 'auto', + listStyle: 'none', + margin: '0', + padding: '0', + }, + + /* call Log item */ + callLogItemWrap: { + display: 'flex', + flexDirection: 'row', + justifyContent: 'flex-start', + position: 'relative', + width: '376px', + minHeight: '88px', + height: 'auto', + borderRight: 'solid 1px #dee2f2', + paddingBottom: '5px', + }, + + callLogTypeDiv: { + display: 'inline-flex', + width: '44px', + height: '100%' + }, + + callLogProfileDiv: { + display: 'inline-flex', + width: '40px', + height: '100%' + }, + + callLogInfoDiv: { + display: 'inline-flex', + flexDirection: 'column', + justifyContent: 'flex-start', + width: '156px', + height: '100%' + }, + + callLogActionDiv: { + display: 'inline-flex', + flexDirection: 'column', + justifyContent: 'flex-start', + alignItems: 'right', + width: '136px', + height: '100%' + }, + + callLogItemWarpBorder: { + borderTop: 'solid 1px #dee2f2' + }, + + callLogItemType: { + display: 'block', + width: '20px', + height: '20px', + marginLeft: '18px', + marginTop: '26px', + }, + + callLogProfileImg: { + display: 'block', + width: '40px', + height: '40px', + marginTop: '16px', + borderRadius: '50%' + }, + + callLogDisplayName: { + display: 'inline-flex', + width: '140px', + height: 'auto', + marginTop: '16px', + marginLeft: '12px', + wordBreak: 'break-all', + }, + + callLogDuration: { + display: 'inline-flex', + width: '100%', + height: '16px', + marginLeft: '12px', + marginTop: '4px', + color: colors.navy600 + }, + + callLogStartTime: { + display: 'block', + width: '120px', + height: '16px', + textAlign: 'right', + marginTop: '16px', + marginRight: '16px', + color: colors.navy600 + }, + + callLogActionBtnWrap: { + display: 'inline-flex', + flexDirection: 'row', + justifyContent: 'flex-end', + width: '136px', + height: '56px' + }, + + callLogVideoActionBtn: { + width: '32px', + height: '32px', + borderRadius: '50%', + backgroundImage: `url(${thumbnailVideo})`, + backgroundPosition: 'center', + backgroundRepeat: 'no-repeat', + marginRight: '12px', + marginTop: '12px', + backgroundColor: colors.navy80, + cursor: 'pointer' + }, + + callLogVoiceActionBtn: { + width: '32px', + height: '32px', + borderRadius: '50%', + backgroundImage: `url(${thumbnailVoice})`, + backgroundPosition: 'center', + backgroundRepeat: 'no-repeat', + marginTop: '12px', + marginRight: '16px', + backgroundColor: colors.navy80, + cursor: 'pointer' + }, + welcomeDiv: {} }; diff --git a/lib/utils/domUtil.js b/lib/utils/domUtil.js index 509bb37..0fc9480 100644 --- a/lib/utils/domUtil.js +++ b/lib/utils/domUtil.js @@ -124,6 +124,25 @@ export function createImg({ id, className, src, onerror } = {}) { return element; } +export function createParagraph({ id, className, innerText } = {}) { + return _createElement({ tagName: 'p', id: id, className: className, innerText: innerText }); +} + +export function createList({ id, className } = {}) { + return _createElement({ tagName: 'ul', id: id, className: className }); +} + +export function createListItem({ id, className } = {}) { + return _createElement({ tagName: 'li', id: id, className: className }); +} + export function replaceClassName(element, searchValue, newValue) { element.classList.replace(searchValue, newValue); +} + +export function hasClassName(element, searchValue) { + if(element.classList.value.indexOf(searchValue) === -1) { + return false; + } + return true; } \ No newline at end of file diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js new file mode 100644 index 0000000..9f61036 --- /dev/null +++ b/lib/views/CallLogItem.js @@ -0,0 +1,132 @@ +import SendBirdCall from 'sendbird-calls'; +import outgoingVideo from '../assets/icon-call-video-outgoing-filled.svg'; +import incomingVideo from '../assets/icon-call-video-incoming-filled.svg'; +import outgoingVoice from '../assets/icon-call-voice-outgoing-filled.svg'; +import incomingVoice from '../assets/icon-call-voice-incoming-filled.svg'; + +import { createListItem, createDiv, createImg, createLabel } from "../utils/domUtil"; +import { sheet, classes } from "../css/styles"; + +export class CallLogItem { + constructor({ callLogInfo, className }) { + const wrapper = createListItem({ id: callLogInfo.callId, className: className }); + let callType = null; + if(callLogInfo.isVideoCall){ + if(callLogInfo.userRole === 'dc_caller'){ + callType = outgoingVideo; + } + else{ + callType = incomingVideo; + } + } + else{ + if(callLogInfo.userRole === 'dc_caller'){ + callType = outgoingVoice; + } + else{ + callType = incomingVoice; + } + } + + let profileImage = null; + let displayName = ""; + if(callLogInfo.userRole === 'dc_caller'){ + profileImage = callLogInfo.callee.profileUrl; + displayName = callLogInfo.callee.userId; + } + else{ + profileImage = callLogInfo.caller.profileUrl; + displayName = callLogInfo.caller.userId; + } + + const icoCallType = createImg({ className: `${classes['callLogItemType']}`, src: callType }); + const callTypeDiv = createDiv({ className: `${classes['callLogTypeDiv']}` }); + callTypeDiv.appendChild(icoCallType); + + const profileImg = createImg({ className: `${classes['callLogProfileImg']}`, src: profileImage }); + const profileDiv = createDiv({ className: `${classes['callLogProfileDiv']}` }); + profileDiv.appendChild(profileImg); + + //duration + let callDurationTime = ''; + callLogInfo.duration = 3603; + if(callLogInfo.duration > 0){ + let hour = parseInt(callLogInfo.duration / 3600); + let min = parseInt((callLogInfo.duration - (hour * 3600)) / 60); + let sec = callLogInfo.duration - (hour * 3600) - (min * 60); + if( hour > 0 ){ + callDurationTime = hour + 'h '; + } + if( min > 0 ){ + callDurationTime += (min + 'm '); + } + callDurationTime += (sec + 's'); + } + else { + callDurationTime = '0s'; + } + + const displayNameLabel = createLabel({ className: `${classes['callLogDisplayName']} ${classes['fontNormal']} ${classes['fontHeavy']}`, innerText: displayName }); + const callDuration = createLabel({ className: `${classes['callLogDuration']} ${classes['fontSmall']}`, innerText: callDurationTime }); + const callEndReason = createLabel({ className: `${classes['callLogDuration']} ${classes['fontSmall']}`, innerText: callLogInfo.endResult }); + + + const callLogInfoDiv = createDiv({ className: `${classes['callLogInfoDiv']}` }); + callLogInfoDiv.appendChild(displayNameLabel); + callLogInfoDiv.appendChild(callDuration); + callLogInfoDiv.appendChild(callEndReason); + + + let callStartTime = new Date(callLogInfo.startedAt); + let callStartTimeLabel = callStartTime.getFullYear() + '/' + + callStartTime.toLocaleString(['en-US'], {month: '2-digit'}) + '/' + + callStartTime.toLocaleString(['en-US'], {day: '2-digit'}) + ' ' + + this.formatAMPM(callStartTime); + + const callLogStartTime = createLabel({ className: `${classes['callLogStartTime']} ${classes['fontSmall']}`, innerText: callStartTimeLabel}); + const callActionBtnWrap = createDiv({ className: `${classes['callLogActionBtnWrap']}` }); + const btnCallVideo = createDiv({ className: `${classes['callLogVideoActionBtn']}`}); + const btnCallVoice = createDiv({ className: `${classes['callLogVoiceActionBtn']}`}); + callActionBtnWrap.appendChild(btnCallVoice); + callActionBtnWrap.appendChild(btnCallVideo); + + + const callLogActionDiv = createDiv({ className: `${classes['callLogActionDiv']}` }); + callLogActionDiv.appendChild(callLogStartTime); + callLogActionDiv.appendChild(callActionBtnWrap); + + + wrapper.appendChild(callTypeDiv); + wrapper.appendChild(profileDiv); + wrapper.appendChild(callLogInfoDiv); + wrapper.appendChild(callLogActionDiv); + + this.element = wrapper; + this.btnCallVideo = btnCallVideo; + this.btnCallVoice = btnCallVoice; + this.destPeerID = displayName; + } + + formatAMPM(date) { + let hours = date.getHours(); + let minutes = date.getMinutes(); + let ampm = hours >= 12 ? 'pm' : 'am'; + hours = hours % 12; + hours = hours ? hours : 12; // the hour '0' should be '12' + minutes = minutes < 10 ? '0'+minutes : minutes; + let strTime = hours + ':' + minutes + ampm; + return strTime; + } + + /** + * @param {(event: any, args: any) => void} eventhandler + */ + set onclick(eventhandler) { + this.btnCallVideo.onclick = (event) => { + eventhandler(event, {peerId: this.destPeerID, isVideoCall: true, callOption: null}); + }; + this.btnCallVoice.onclick = (event) => { + eventhandler(event, {peerId: this.destPeerID, isVideoCall: true, callOption: null}); + }; + } +} \ No newline at end of file diff --git a/lib/views/CallLogView.js b/lib/views/CallLogView.js new file mode 100644 index 0000000..500294f --- /dev/null +++ b/lib/views/CallLogView.js @@ -0,0 +1,54 @@ +import SendBirdCall from "sendbird-calls"; +import BaseElement from "../components/BaseElement"; +import { classes } from "../css/styles.js"; +import { createList } from "../utils/domUtil"; +import { CallLogItem } from "./CallLogItem"; + +export default class CallLogView extends BaseElement{ + constructor({ args }) { + super({ + id: 'calllog_view', + className: `${classes['container']} ${classes['center']} ${classes['viewDial']}`, + args + }); + this.callLogQuery = null; + this.callLogQueryData = []; + } + + build() { + const callLogList = createList({ id: 'call_log_list', className: `${classes['callLogListContainer']}` }); + this.callLogQuery = SendBirdCall.createDirectCallLogListQuery({limit: 30}); + this.getCallLogs(callLogList); + callLogList.onscroll = (e) => { + let scrollposition = e.target.scrollHeight - e.target.clientHeight; + + if( scrollposition === e.target.scrollTop ) { + this.getCallLogs(callLogList); + } + }; + this.element.appendChild(callLogList); + } + + getCallLogs(element){ + if(this.callLogQuery.hasNext && !this.callLogQuery.isLoading) { + this.callLogQuery.next((directCallLog) => { + if(directCallLog){ + for(let i = 0; i < directCallLog.length; i++){ + let callItem = null; + if( i === 0 ){ + callItem = new CallLogItem({callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']}`}); + } + else { + callItem = new CallLogItem({callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']} ${classes['callLogItemWarpBorder']}`}); + } + callItem.onclick = (event, args) => { + this.sendToParent('dial', args); + }; + + element.appendChild(callItem.element); + } + } + }); + } + } +} \ No newline at end of file diff --git a/lib/views/DialView.js b/lib/views/DialView.js index da4bb2d..1966445 100644 --- a/lib/views/DialView.js +++ b/lib/views/DialView.js @@ -1,9 +1,9 @@ import SendBirdCall from "sendbird-calls"; import BaseElement from "../components/BaseElement"; -import { sheet, classes } from "../css/styles.js"; +import { classes } from "../css/styles.js"; import { createButton, createDiv, createInput, createLabel } from "../utils/domUtil"; -import Menu from "../components/Menu"; + import pack from "../../package"; export default class DialView extends BaseElement { @@ -13,108 +13,32 @@ export default class DialView extends BaseElement { className: `${classes['container']} ${classes['column']} ${classes['center']} ${classes['view']} ${classes['viewDial']}`, args }); - - this.settingItems = [ - { - 'label': 'Device settings', - 'callback': () => { this.sendToParent('show_settings') } - }, - { - 'label': 'Sign out', - 'callback': () => { this.deauthenticate(); } - } - ]; } onLoaded() { } build() { - const header = createDiv({ id: 'header', className: classes['widgetHeader'] }); - const content = createDiv({ id: 'content', className: `${classes['content']} ${classes['column']} ${classes['center']}` }); - - const userDiv = createDiv({ - id: 'header_user_div', - className: `${classes['userDiv']} ${classes['center']}` - }); - - let profileImg; - if (this.args.user && this.args.user.profileUrl) { - sheet.update({ profileUrl: this.args.user.profileUrl }); - profileImg = createDiv({ id: 'header_profile_img', className: classes['profileSmall'] }); - } else { - profileImg = createDiv({ id: 'header_avatar', className: `${classes['avatar']}` }); - } - - const headerInfo = createDiv({ id: 'header_info', className: `${classes['headerInfo']}` }); - const userId = createDiv({ - id: 'header_user_id', - className: `${classes['headerUserId']} ${classes['fontNormal']} ${classes['fontHeavy']}`, - innerText: this.args.user.userId || '' - }); - const nickname = createDiv({ - id: 'header_nickname', - className: `${classes['headerNickname']} ${classes['fontSmall']}`, - innerText: this.args.user.nickname || 'no nickname' - }); - headerInfo.appendChild(userId); - headerInfo.appendChild(nickname); - - userDiv.appendChild(profileImg); - userDiv.appendChild(headerInfo); - - const headerButtons = createDiv({ - id: 'header_buttons', - className: `${classes['headerButtons']} ${classes['row']} ${classes['center']}` - }); - const settingsButton = new Menu({ - id: 'settings_button', - element: createDiv({ className: `${classes['settingsButton']}` }), - items: this.settingItems - }); - - const closeButton = createDiv({ - id: 'close_button', - className: `${classes['closeButton']}` - }); - closeButton.onclick = () => { - this.sendToParent('widgetclose'); - }; - settingsButton.appendToHTML(headerButtons); - headerButtons.appendChild(closeButton); - - const divider = createDiv({ - id: 'header_divider', - className: classes['headerDivider'] - }); - - header.appendChild(userDiv); - header.appendChild(divider); - header.appendChild(headerButtons); - + const formContainer = createDiv({ className: `${classes['formContainer']} ${classes['column']} ${classes['center']}` }); - const logoMid = createDiv({ id: 'logo_oval', className: `${classes['logoMidBlack']}` }); - const welcomeDiv = createDiv({ - id: 'welcome_div', - className: `${classes['fontBig']} ${classes['fontHeavy']}`, - innerText: 'SendBird Calls' - }); - const descDiv = createDiv({ - id: 'desc_div', - className: `${classes['dialDesc']} ${classes['fontNormal']}`, - innerText: 'Make a call' + const dialTitleDiv = createDiv({ id: 'title', className: `${classes['fontBig']} ${classes['fontDemi']} ${classes['dialTitle']}`, innerText: 'Make a call'}); + const descDiv = createDiv({id: 'desc_div', + innerText: 'Enter the user ID of the user you wish to call, then press one of the video or voice call buttons', + className: `${classes['fontNormal']} ${classes['fontHeavy']} ${classes['dialDesc']}` }); + const peerId = createInput({ id: 'peer_id', className: `${classes['field']} ${classes['fontNormal']}`, - placeholder: 'User ID' + placeholder: 'Enter user ID' }); + const btns = createDiv({ id: 'buttons', className: `${classes['row']} ${classes['center']} ${classes['btns']}` }); const btnVideo = createButton({ @@ -129,8 +53,7 @@ export default class DialView extends BaseElement { btns.appendChild(btnVideo); btns.appendChild(btnAudio); - formContainer.appendChild(logoMid); - formContainer.appendChild(welcomeDiv); + formContainer.appendChild(dialTitleDiv); formContainer.appendChild(descDiv); formContainer.appendChild(peerId); formContainer.appendChild(btns); @@ -156,7 +79,6 @@ export default class DialView extends BaseElement { versionInfo.appendChild(sampleVersionLabel); versionInfo.appendChild(sdkVersionLabel); - this.element.appendChild(header); this.element.appendChild(content); this.element.appendChild(versionInfo); @@ -181,4 +103,4 @@ export default class DialView extends BaseElement { SendBirdCall.deauthenticate(); this.sendToParent('deauthenticate'); } -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 6e347f8..60bdf4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1158,9 +1158,9 @@ } }, "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true }, "ajv": { @@ -1688,9 +1688,9 @@ "dev": true }, "cacache": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.3.tgz", - "integrity": "sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { "bluebird": "^3.5.5", @@ -1781,9 +1781,9 @@ } }, "chownr": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", - "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, "chrome-trace-event": { @@ -2869,9 +2869,9 @@ } }, "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "dev": true }, "file-loader": { @@ -4592,9 +4592,9 @@ "dev": true }, "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, "lcid": { @@ -4856,9 +4856,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mississippi": { @@ -4901,20 +4901,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "move-concurrently": { @@ -5472,9 +5464,9 @@ } }, "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", "dev": true, "requires": { "async": "^2.6.2", @@ -6460,9 +6452,9 @@ } }, "source-map-support": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", - "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -6633,9 +6625,9 @@ } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, "strict-uri-encode": { @@ -6742,9 +6734,9 @@ "dev": true }, "terser": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.4.2.tgz", - "integrity": "sha512-Uufrsvhj9O1ikwgITGsZ5EZS6qPokUOkCegS7fYOdGTv+OA90vndUbU6PEjr5ePqHfNUbGyMO7xyIZv2MhsALQ==", + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.13.tgz", + "integrity": "sha512-wMvqukYgVpQlymbnNbabVZbtM6PN63AzqexpwJL8tbh/mRT9LE5o+ruVduAGL7D6Fpjl+Q+06U5I9Ul82odAhw==", "dev": true, "requires": { "commander": "^2.20.0", @@ -6767,16 +6759,16 @@ } }, "terser-webpack-plugin": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.2.tgz", - "integrity": "sha512-fdEb91kR2l+BVgES77N/NTXWZlpX6vX+pYPjnX5grcDYBF2CMnzJiXX4NNlna4l04lvCW39lZ+O/jSvUhHH/ew==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", "dev": true, "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.1", + "serialize-javascript": "^2.1.2", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -7665,9 +7657,9 @@ } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", From 61d7724e38d85991ac9db233ded78db30c562ab2 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Wed, 13 May 2020 16:21:26 +0900 Subject: [PATCH 02/64] [CALLS-700]Call history design implementation 1. add call-log view in widget mode --- lib/assets/ic-layout-default.svg | 3 + lib/assets/ic-logo-horizontal.svg | 3 + lib/components/App.js | 2 +- lib/components/Header.js | 13 ++- lib/components/MainApp.js | 6 +- lib/components/TabToolBar.js | 18 ++- lib/components/WidgetApp.js | 1 + lib/css/styles.js | 130 +++++++++++++++++++++- lib/views/CallLogItem.js | 179 ++++++++++++++++-------------- lib/views/CallLogView.js | 62 +++++++---- lib/views/DialView.js | 4 +- 11 files changed, 300 insertions(+), 121 deletions(-) create mode 100644 lib/assets/ic-layout-default.svg create mode 100644 lib/assets/ic-logo-horizontal.svg diff --git a/lib/assets/ic-layout-default.svg b/lib/assets/ic-layout-default.svg new file mode 100644 index 0000000..da2789d --- /dev/null +++ b/lib/assets/ic-layout-default.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/ic-logo-horizontal.svg b/lib/assets/ic-logo-horizontal.svg new file mode 100644 index 0000000..1c3c7d4 --- /dev/null +++ b/lib/assets/ic-logo-horizontal.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/components/App.js b/lib/components/App.js index b76eff8..87c7342 100644 --- a/lib/components/App.js +++ b/lib/components/App.js @@ -45,7 +45,7 @@ export default class App extends BaseElement { const pageClass = this.pages[_pageName]; const view = new pageClass(opt); view.appendToBaseElement(this); - + if (this.onPageChange) this.onPageChange(_pageName); } } \ No newline at end of file diff --git a/lib/components/Header.js b/lib/components/Header.js index 3f35542..c737d7b 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -23,6 +23,9 @@ export default class Header extends BaseElement { } } ]; + + this.args = args; + this.parent = parent; } build() { @@ -71,7 +74,7 @@ export default class Header extends BaseElement { className: `${classes['closeButton']}` }); closeButton.onclick = () => { - this.element.sendToParent('widgetclose'); + this.parent.sendToParent('widgetclose'); }; settingsButton.appendToHTML(headerButtons); headerButtons.appendChild(closeButton); @@ -81,11 +84,13 @@ export default class Header extends BaseElement { className: classes['headerDivider'] }); - const headerLogo = createDiv({ id: 'header_logo', className: `${classes['headerLogo']}`}); - this.element.appendChild(userDiv); this.element.appendChild(divider); this.element.appendChild(headerButtons); - this.element.appendChild(headerLogo); + + if( !this.args.isWidget ){ + const headerLogo = createDiv({ id: 'header_logo', className: `${classes['headerLogo']}`}); + this.element.appendChild(headerLogo); + } } } \ No newline at end of file diff --git a/lib/components/MainApp.js b/lib/components/MainApp.js index e0b119f..56cd421 100644 --- a/lib/components/MainApp.js +++ b/lib/components/MainApp.js @@ -181,7 +181,7 @@ export default class MainApp extends App { this.recvClose(value); break; case 'show_calllog': - this.route('calllog_view', {}); + this.route('calllog_view', {args: this.args}); break; case 'show_dial': this.route('dial_view', {}); @@ -220,8 +220,8 @@ export default class MainApp extends App { } createHeaderNTab() { - const HeaderItem = new Header({element: createDiv({ id: 'header', className: `${classes['widgetHeader']}`})}); - const tabToolBar = new TabToolBar({element: createDiv({id: 'tabtoolbar', className: `${classes['tabToolBar']}`})}); + const HeaderItem = new Header({parent: this, element: createDiv({ id: 'header', className: `${classes['widgetHeader']}`})}); + const tabToolBar = new TabToolBar({ parent: this, element: createDiv({id: 'tabtoolbar', className: `${classes['tabToolBar']}`}), args: this.args }); HeaderItem.appendToBaseElement(this); tabToolBar.appendToBaseElement(this); diff --git a/lib/components/TabToolBar.js b/lib/components/TabToolBar.js index 8367ac7..6e011e0 100644 --- a/lib/components/TabToolBar.js +++ b/lib/components/TabToolBar.js @@ -3,14 +3,18 @@ import { createDiv, createParagraph, replaceClassName, hasClassName } from "../u import { classes } from "../css/styles"; export default class TabToolBar extends BaseElement { - constructor({ id, className, parent, element } = {}) { + constructor({ id, className, parent, element, args } = {}) { super({ id, className, parent, element }); this.element = element; + this.args = args; } build() { - // dial tab - const btnDial = createDiv({id: 'btn_tab_dial', className: `${classes['btnTab']}`}); + // dial tab + if( this.args.isWidget ) { + this.element.classList.add(classes['tabToolBarWidget']); + } + const btnDial = createDiv({ id: 'btn_tab_dial', className: `${classes['btnTab']}` }); const icoTabDial = createDiv({id: 'ico_tab_dial', className: `${classes['tabIco']} ${classes['dialActive']}`}); const btnDialCaption = createParagraph({id: 'btn_dial_caption', innerText: 'dial', className: `${classes['fontNormal']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabActive']}`}); @@ -28,6 +32,10 @@ export default class TabToolBar extends BaseElement { } }; + if( this.args.isWidget ) { + btnDial.classList.add(classes['btnTabWidget']); + } + const btnCallLog = createDiv({id: 'btn_tab_calllog', className: `${classes['btnTab']}`}); const icoCallLog = createDiv({id: 'ico_tab_callog', className: `${classes['tabIco']} ${classes['callLogDeactive']}`}); const btnCalllogCaption = createParagraph({id: 'btn_calllog_caption', innerText: 'History', className: `${classes['fontNormal']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabDeactive']}`}); @@ -47,6 +55,10 @@ export default class TabToolBar extends BaseElement { } }; + if( this.args.isWidget ) { + btnCallLog.classList.add(classes['btnTabWidget']); + } + this.element.appendChild(btnDial); this.element.appendChild(btnCallLog); } diff --git a/lib/components/WidgetApp.js b/lib/components/WidgetApp.js index 97b15ee..12070b0 100644 --- a/lib/components/WidgetApp.js +++ b/lib/components/WidgetApp.js @@ -63,6 +63,7 @@ export default class WidgetApp extends BaseElement { build() { if (!this.widgetIcon) this.widgetIcon = createDiv({ id: 'widget_icon', className: classes['widgetIcon'] }); + this.args.isWidget = true; this.mainApp = new MainApp({ className: `${classes['widgetDiv']} ${classes['hidden']}`, pages: this.pages, diff --git a/lib/css/styles.js b/lib/css/styles.js index a9d1b48..29f78c2 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -31,6 +31,8 @@ import callhistoryIconActive from '../assets/ic-layout-default-active.svg'; import headerLogo from '../assets/ic-logo-horizontal-inverse-01.svg'; import thumbnailVideo from '../assets/ic-video-thumbnail-filled.svg'; import thumbnailVoice from '../assets/ic-call-filled.svg'; +import callLogEmpty from '../assets/ic-layout-default.svg'; +import logoHorizon from '../assets/ic-logo-horizontal.svg'; @@ -250,6 +252,8 @@ const styles = { viewSettings: { position: 'absolute', + left: '0px', + top: '0px', width: '100%', height: '100%', zIndex: '100', @@ -330,6 +334,19 @@ const styles = { '-moz-osx-font-smoothing': 'grayscale' }, + font16: { + fontFamily: 'Avenir Next', + fontSize: '16px', + fontWeight: 'normal', + fontStretch: 'normal', + fontStyle: 'normal', + lineHeight: '1.25', + letterSpacing: '-0.15px', + textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' + }, + font20: { fontFamily: 'Avenir Next', fontSize: '20px', @@ -342,6 +359,19 @@ const styles = { '-moz-osx-font-smoothing': 'grayscale' }, + font24: { + fontFamily: 'Avenir Next', + fontSize: '24px', + fontWeight: 'normal', + fontStretch: 'normal', + fontStyle: 'normal', + lineHeight: '1.33', + letterSpacing: '-0.25px', + textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' + }, + fontBig: { fontFamily: 'Avenir Next', height: '32px', @@ -373,9 +403,19 @@ const styles = { height: '55px', backgroundColor: colors.white, textAlign: 'center', + borderTop: 'solid 1px #dee2f2', borderBottom: 'solid 1px #dee2f2' }, + tabToolBarWidget: { + position: 'absolute', + display: 'inline-block', + bottom: '0px', + left: '0px', + borderBottomLeftRadius: '8px', + borderBottomRightRadius: '8px' + }, + btnTab: { display: 'inline-block', width: '100px', @@ -383,6 +423,10 @@ const styles = { cursor: 'pointer' }, + btnTabWidget: { + width: '156px', + }, + tabIco: { width: '100%', height: '32px', @@ -841,11 +885,14 @@ const styles = { } }, '& $viewDial': { + height: 'calc(100% - 136px)', '& $content': { - marginTop: '144px' + // marginTop: '144px' + margin: 'auto' }, '& $versionInfo': { - display: 'flex' + // display: 'flex' + display: 'none' } }, '& $widgetHeader': { @@ -912,9 +959,7 @@ const styles = { boxShadow: '0 9px 15px -7px rgba(33, 34, 66, 0.04), 0 9px 46px 8px rgba(33, 34, 66, 0.08), 0 24px 38px 3px rgba(33, 34, 66, 0.12)', backgroundColor: colors.white, overflow: 'hidden', - flexDirection: 'column', - alignItems: 'center', - justifyContent: 'center' + display: 'block' }, widgetIcon: { @@ -1063,14 +1108,61 @@ const styles = { callLogListContainer: { display: 'inline-block', position: 'relative', - width: '382px', height: 'calc(100% - 103px)', + height: '100%', overflowY: 'auto', listStyle: 'none', margin: '0', padding: '0', }, + callLogListDesc: { + display: 'inline-flex', + position: 'absolute', + width: 'calc(100% - 382px)', + height: 'calc(100% - 103px)', + margin: '0', + padding: '0', + right: '0px', + justifyContent: 'center', + alignItems: 'center', + flexDirection: 'column' + }, + + callLogDescLogo: { + display: 'block', + position: 'relative', + width: '100%', + height: '40px', + backgroundImage: `url(${logoHorizon})`, + backgroundPosition: 'center', + backgroundRepeat: 'no-repeat' + }, + + callLogDescTitle: { + position: 'relative', + width: '100%', + height: '32px', + textAlign: 'center', + marginTop: '24px', + color: colors.navy900 + }, + + callLogDescLabel: { + position: 'relative', + width: '275px', + height: '40px', + textAlign: 'center', + marginTop: '16px', + color: colors.navy600 + }, + + widgetCallLog: { + height: '100%', + width: '100%', + overflowX: 'hidden', + }, + /* call Log item */ callLogItemWrap: { display: 'flex', @@ -1084,6 +1176,32 @@ const styles = { paddingBottom: '5px', }, + callLogEmptyWrap: { + position: 'relative', + width: '312px', + height: '116px', + marginTop: '158px', + marginLeft: '32px', + }, + + icoCallLogEmpty: { + display: 'inline-block', + width: '100%', + height: '64px', + backgroundImage: `url(${callLogEmpty})`, + backgroundPosition: 'center', + backgroundRepeat: 'no-repeat' + }, + + labelCallLogEmpty: { + display: 'inline-block', + width: '100%', + height: '20px', + marginTop: '12px', + textAlign: 'center', + color: colors.navy600 + }, + callLogTypeDiv: { display: 'inline-flex', width: '44px', diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index 9f61036..e6eb6e8 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -9,102 +9,113 @@ import { sheet, classes } from "../css/styles"; export class CallLogItem { constructor({ callLogInfo, className }) { - const wrapper = createListItem({ id: callLogInfo.callId, className: className }); - let callType = null; - if(callLogInfo.isVideoCall){ - if(callLogInfo.userRole === 'dc_caller'){ - callType = outgoingVideo; + if(callLogInfo) { + const wrapper = createListItem({ id: callLogInfo.callId, className: className }); + let callType = null; + if(callLogInfo.isVideoCall){ + if(callLogInfo.userRole === 'dc_caller'){ + callType = outgoingVideo; + } + else{ + callType = incomingVideo; + } } else{ - callType = incomingVideo; + if(callLogInfo.userRole === 'dc_caller'){ + callType = outgoingVoice; + } + else{ + callType = incomingVoice; + } } - } - else{ + + let profileImage = null; + let displayName = ""; if(callLogInfo.userRole === 'dc_caller'){ - callType = outgoingVoice; + profileImage = callLogInfo.callee.profileUrl; + displayName = callLogInfo.callee.userId; } else{ - callType = incomingVoice; + profileImage = callLogInfo.caller.profileUrl; + displayName = callLogInfo.caller.userId; } - } - let profileImage = null; - let displayName = ""; - if(callLogInfo.userRole === 'dc_caller'){ - profileImage = callLogInfo.callee.profileUrl; - displayName = callLogInfo.callee.userId; - } - else{ - profileImage = callLogInfo.caller.profileUrl; - displayName = callLogInfo.caller.userId; - } - - const icoCallType = createImg({ className: `${classes['callLogItemType']}`, src: callType }); - const callTypeDiv = createDiv({ className: `${classes['callLogTypeDiv']}` }); - callTypeDiv.appendChild(icoCallType); - - const profileImg = createImg({ className: `${classes['callLogProfileImg']}`, src: profileImage }); - const profileDiv = createDiv({ className: `${classes['callLogProfileDiv']}` }); - profileDiv.appendChild(profileImg); - - //duration - let callDurationTime = ''; - callLogInfo.duration = 3603; - if(callLogInfo.duration > 0){ - let hour = parseInt(callLogInfo.duration / 3600); - let min = parseInt((callLogInfo.duration - (hour * 3600)) / 60); - let sec = callLogInfo.duration - (hour * 3600) - (min * 60); - if( hour > 0 ){ - callDurationTime = hour + 'h '; + const icoCallType = createImg({ className: `${classes['callLogItemType']}`, src: callType }); + const callTypeDiv = createDiv({ className: `${classes['callLogTypeDiv']}` }); + callTypeDiv.appendChild(icoCallType); + + const profileImg = createImg({ className: `${classes['callLogProfileImg']}`, src: profileImage }); + const profileDiv = createDiv({ className: `${classes['callLogProfileDiv']}` }); + profileDiv.appendChild(profileImg); + + //duration + let callDurationTime = ''; + callLogInfo.duration = 3603; + if(callLogInfo.duration > 0){ + let hour = parseInt(callLogInfo.duration / 3600); + let min = parseInt((callLogInfo.duration - (hour * 3600)) / 60); + let sec = callLogInfo.duration - (hour * 3600) - (min * 60); + if( hour > 0 ){ + callDurationTime = hour + 'h '; + } + if( min > 0 ){ + callDurationTime += (min + 'm '); + } + callDurationTime += (sec + 's'); } - if( min > 0 ){ - callDurationTime += (min + 'm '); + else { + callDurationTime = '0s'; } - callDurationTime += (sec + 's'); - } - else { - callDurationTime = '0s'; + + const displayNameLabel = createLabel({ className: `${classes['callLogDisplayName']} ${classes['fontNormal']} ${classes['fontHeavy']}`, innerText: displayName }); + const callDuration = createLabel({ className: `${classes['callLogDuration']} ${classes['fontSmall']}`, innerText: callDurationTime }); + const callEndReason = createLabel({ className: `${classes['callLogDuration']} ${classes['fontSmall']}`, innerText: callLogInfo.endResult }); + + + const callLogInfoDiv = createDiv({ className: `${classes['callLogInfoDiv']}` }); + callLogInfoDiv.appendChild(displayNameLabel); + callLogInfoDiv.appendChild(callDuration); + callLogInfoDiv.appendChild(callEndReason); + + + let callStartTime = new Date(callLogInfo.startedAt); + let callStartTimeLabel = callStartTime.getFullYear() + '/' + + callStartTime.toLocaleString(['en-US'], {month: '2-digit'}) + '/' + + callStartTime.toLocaleString(['en-US'], {day: '2-digit'}) + ' ' + + this.formatAMPM(callStartTime); + + const callLogStartTime = createLabel({ className: `${classes['callLogStartTime']} ${classes['fontSmall']}`, innerText: callStartTimeLabel}); + const callActionBtnWrap = createDiv({ className: `${classes['callLogActionBtnWrap']}` }); + const btnCallVideo = createDiv({ className: `${classes['callLogVideoActionBtn']}`}); + const btnCallVoice = createDiv({ className: `${classes['callLogVoiceActionBtn']}`}); + callActionBtnWrap.appendChild(btnCallVoice); + callActionBtnWrap.appendChild(btnCallVideo); + + + const callLogActionDiv = createDiv({ className: `${classes['callLogActionDiv']}` }); + callLogActionDiv.appendChild(callLogStartTime); + callLogActionDiv.appendChild(callActionBtnWrap); + + + wrapper.appendChild(callTypeDiv); + wrapper.appendChild(profileDiv); + wrapper.appendChild(callLogInfoDiv); + wrapper.appendChild(callLogActionDiv); + + this.element = wrapper; + this.btnCallVideo = btnCallVideo; + this.btnCallVoice = btnCallVoice; + this.destPeerID = displayName; } + else{ + const wrapper = createDiv({ id: 'empty_calllog', className: className }); + const icoCallLogEmpty = createDiv({ className: `${classes['icoCallLogEmpty']}` }); + const labelCallLogEmpty = createDiv({ innerText: 'No call history', className: `${classes['labelCallLogEmpty']} ${classes['font16']} ${classes['fontHeavy']}` }); + wrapper.appendChild(icoCallLogEmpty); + wrapper.appendChild(labelCallLogEmpty); - const displayNameLabel = createLabel({ className: `${classes['callLogDisplayName']} ${classes['fontNormal']} ${classes['fontHeavy']}`, innerText: displayName }); - const callDuration = createLabel({ className: `${classes['callLogDuration']} ${classes['fontSmall']}`, innerText: callDurationTime }); - const callEndReason = createLabel({ className: `${classes['callLogDuration']} ${classes['fontSmall']}`, innerText: callLogInfo.endResult }); - - - const callLogInfoDiv = createDiv({ className: `${classes['callLogInfoDiv']}` }); - callLogInfoDiv.appendChild(displayNameLabel); - callLogInfoDiv.appendChild(callDuration); - callLogInfoDiv.appendChild(callEndReason); - - - let callStartTime = new Date(callLogInfo.startedAt); - let callStartTimeLabel = callStartTime.getFullYear() + '/' + - callStartTime.toLocaleString(['en-US'], {month: '2-digit'}) + '/' + - callStartTime.toLocaleString(['en-US'], {day: '2-digit'}) + ' ' + - this.formatAMPM(callStartTime); - - const callLogStartTime = createLabel({ className: `${classes['callLogStartTime']} ${classes['fontSmall']}`, innerText: callStartTimeLabel}); - const callActionBtnWrap = createDiv({ className: `${classes['callLogActionBtnWrap']}` }); - const btnCallVideo = createDiv({ className: `${classes['callLogVideoActionBtn']}`}); - const btnCallVoice = createDiv({ className: `${classes['callLogVoiceActionBtn']}`}); - callActionBtnWrap.appendChild(btnCallVoice); - callActionBtnWrap.appendChild(btnCallVideo); - - - const callLogActionDiv = createDiv({ className: `${classes['callLogActionDiv']}` }); - callLogActionDiv.appendChild(callLogStartTime); - callLogActionDiv.appendChild(callActionBtnWrap); - - - wrapper.appendChild(callTypeDiv); - wrapper.appendChild(profileDiv); - wrapper.appendChild(callLogInfoDiv); - wrapper.appendChild(callLogActionDiv); - - this.element = wrapper; - this.btnCallVideo = btnCallVideo; - this.btnCallVoice = btnCallVoice; - this.destPeerID = displayName; + this.element = wrapper; + } } formatAMPM(date) { diff --git a/lib/views/CallLogView.js b/lib/views/CallLogView.js index 500294f..2e9a3ca 100644 --- a/lib/views/CallLogView.js +++ b/lib/views/CallLogView.js @@ -1,7 +1,7 @@ import SendBirdCall from "sendbird-calls"; import BaseElement from "../components/BaseElement"; import { classes } from "../css/styles.js"; -import { createList } from "../utils/domUtil"; +import { createList, createDiv } from "../utils/domUtil"; import { CallLogItem } from "./CallLogItem"; export default class CallLogView extends BaseElement{ @@ -11,43 +11,67 @@ export default class CallLogView extends BaseElement{ className: `${classes['container']} ${classes['center']} ${classes['viewDial']}`, args }); + this.callLogQuery = null; this.callLogQueryData = []; + this.args = args; } build() { const callLogList = createList({ id: 'call_log_list', className: `${classes['callLogListContainer']}` }); - this.callLogQuery = SendBirdCall.createDirectCallLogListQuery({limit: 30}); + this.callLogQuery = SendBirdCall.createDirectCallLogListQuery({ limit: 30 }); this.getCallLogs(callLogList); callLogList.onscroll = (e) => { let scrollposition = e.target.scrollHeight - e.target.clientHeight; - if( scrollposition === e.target.scrollTop ) { this.getCallLogs(callLogList); } }; - this.element.appendChild(callLogList); + + if( this.args.isWidget ) { + callLogList.classList.add(classes['widgetCallLog']); + this.element.appendChild(callLogList); + } + else{ + const callLogDescription = createDiv({ id: 'call_log_desc', className: `${classes['callLogListDesc']}` }); + const callLogDescLogo = createDiv({ className: `${classes['callLogDescLogo']}` }); + const callLogDescTitle = createDiv({ innerText: 'Sendbird Calls Quickstart', className: `${classes['callLogDescTitle']} ${classes['font24']} ${classes['fontDemi']}` }); + const callLogDescLabel = createDiv({ innerText: 'This is the Sendbird Calls Quickstart page. Lorem ipsum', className: `${classes['callLogDescLabel']} ${classes['fontNormal']} ${classes['fontHeavy']}` }); + callLogDescription.appendChild(callLogDescLogo); + callLogDescription.appendChild(callLogDescTitle); + callLogDescription.appendChild(callLogDescLabel); + + this.element.appendChild(callLogList); + this.element.appendChild(callLogDescription); + } } getCallLogs(element){ - if(this.callLogQuery.hasNext && !this.callLogQuery.isLoading) { + if( this.callLogQuery.hasNext && !this.callLogQuery.isLoading ) { this.callLogQuery.next((directCallLog) => { - if(directCallLog){ - for(let i = 0; i < directCallLog.length; i++){ - let callItem = null; - if( i === 0 ){ - callItem = new CallLogItem({callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']}`}); - } - else { - callItem = new CallLogItem({callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']} ${classes['callLogItemWarpBorder']}`}); + if( directCallLog ){ + if( directCallLog.length > 0 ) { + for( let i = 0; i < directCallLog.length; i++ ){ + let callItem = null; + if( i === 0 ){ + callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']}` }); + } + else { + callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']} ${classes['callLogItemWarpBorder']}` }); + } + callItem.onclick = (event, args) => { + this.sendToParent('dial', args); + }; + + element.appendChild(callItem.element); } - callItem.onclick = (event, args) => { - this.sendToParent('dial', args); - }; - - element.appendChild(callItem.element); } - } + else{ + // empty call log + const emptyCallLog = new CallLogItem({ className: `${classes['callLogEmptyWrap']}` }); + element.appendChild(emptyCallLog.element); + } + } }); } } diff --git a/lib/views/DialView.js b/lib/views/DialView.js index 1966445..6222f6d 100644 --- a/lib/views/DialView.js +++ b/lib/views/DialView.js @@ -60,6 +60,8 @@ export default class DialView extends BaseElement { content.appendChild(formContainer); + this.element.appendChild(content); + const sampleVersion = pack.version; const sdkVersion = SendBirdCall.sdkVersion; const versionInfo = createDiv({ @@ -79,7 +81,7 @@ export default class DialView extends BaseElement { versionInfo.appendChild(sampleVersionLabel); versionInfo.appendChild(sdkVersionLabel); - this.element.appendChild(content); + this.element.appendChild(versionInfo); btnVideo.onclick = () => { From 97f0b93393e2dec7ccffd4196f45b7e151c1d214 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Wed, 13 May 2020 17:06:17 +0900 Subject: [PATCH 03/64] [CALLS-700]Call history design implementation 1. add profile image loading error exception. --- lib/assets/icon-avatar.jpg | Bin 0 -> 1720 bytes lib/views/CallLogItem.js | 9 ++++++--- 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 lib/assets/icon-avatar.jpg diff --git a/lib/assets/icon-avatar.jpg b/lib/assets/icon-avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f30ff57f88435da4814b975cb064916ca1202c73 GIT binary patch literal 1720 zcmbV~cTf{q9LHa>DI|)JP!vXr1QhXf=ta43^rDD}Q9%$P(!tO}i8SRzL>X*|r-LYn zs0W8s%h8*Zqf3(uML^UbMM40Ry$#;r%>Cuuci+DK&inoL_xAJl2lvAxK-|W{+5(_Z z09YXxfJear^9UbL0Bmi68UR29pf30T4C0U!AdB1pK=)7pLY^q$+CB7oRP`S8-3t?8 z4$wd3%?M?LcryYOwf3k3eG_Y2jIbJ_HLtQ}#e3vZ22#N@%yb;#)+e4x3|s|BB0v?W zLMSDGCZQk_3a$eR$evi#n$})JCKMXNU~za60&xS9P$CY{Ce~R|=BUj8DrFp_mj_OC9cl(#7Pf*RJ2VnSLwd_WcLh zIS+FmJF$Lu1qH=C1CZ-Zy>y1B0Vu63gux5BP-vzQoP@z{)4-99?eT6w5=xr!B9bO)S%uXE ziq_#-Dfi$`qO`L1sLGrWZH?^5z!Lr!**e&Ft|4HGG?q|kWI$*%@~a?37z67ZytF_ZtFL7$Uqq%# zYN6rA!(qR@Ii;!YkR4Oabc-Q+UY*9bbqMc>ma6D9%9vsV@R_Hl77DT}Bm{3NWn&~y zn*FqBt>a>#{yRN}qkRJJ-6A(fH}qHZlEDO>ybA*&of`&&^Dq!d;<;A}VL-6U;2Lq9 z&ADP_<9ye&RJ~^Q{F&jGOoO2|mi^=DGAG@a3s3nEtALh`zHL$kxoGRBw5D|MiGkGbKNY$QZTDaT} zf1>2G)Z9pzI8c4m^v-xQiyAdTx+CHGB6GG}APs|#sCI!sZ1(X)MeRgIBiz9^_Vjdb z@0kzz=)$fo0KBC!g`{pPUKm}6^Oe#rZ%?F%82{a+apadx2A+_N*MFbU;|ztRdEqHwD$C}RmQ3l+bg5YE0b%q zuX&;HuTT7$putLAsuB<1SSe;`v0_`KU3HgN2)Lkr}F3#ZYmGEmyzMETXcTUt)-_+_~E;!%lOb&|kTXGOc!k`8Q zD=0@8unPrJ*)C~*J#eRBlxoC+X45&)NITEs)h`WQ^Zmu8o97<+?9QRcZPKgzN}wp? zfjF&KE>^5!M@&oXR;nc1R{CXDTeOF~Bjd}W-*2Ag;HD>yEiO~Na6{90s9dyhMW=wm zTZDmfNL}pWI~a6bzgx10IMXWdQNgjP5d&rUGa8F+XGLdIxz4=Cx#St?j^aH3;sKNA zJ&d%G()oU}tgc7vKm-2z7U*)laa#ob5|z`}0RuHbN~K5YvYsnGwqH|W!lBiBIy*lA vX+O%SLOfN}j>vO6@T|!!op}aa9dkZaM8AI}DQ?s<*qZ(+)c)wHc6i_)Dn`%3 literal 0 HcmV?d00001 diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index e6eb6e8..27b90e5 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -1,11 +1,11 @@ -import SendBirdCall from 'sendbird-calls'; import outgoingVideo from '../assets/icon-call-video-outgoing-filled.svg'; import incomingVideo from '../assets/icon-call-video-incoming-filled.svg'; import outgoingVoice from '../assets/icon-call-voice-outgoing-filled.svg'; import incomingVoice from '../assets/icon-call-voice-incoming-filled.svg'; +import avatarIcon from '../assets/icon-avatar.svg'; import { createListItem, createDiv, createImg, createLabel } from "../utils/domUtil"; -import { sheet, classes } from "../css/styles"; +import { classes } from "../css/styles"; export class CallLogItem { constructor({ callLogInfo, className }) { @@ -44,7 +44,10 @@ export class CallLogItem { const callTypeDiv = createDiv({ className: `${classes['callLogTypeDiv']}` }); callTypeDiv.appendChild(icoCallType); - const profileImg = createImg({ className: `${classes['callLogProfileImg']}`, src: profileImage }); + const profileImg = createImg({ className: `${classes['callLogProfileImg']}`, src: profileImage, onerror: (error) => { + error.currentTarget.src = avatarIcon; + } }); + const profileDiv = createDiv({ className: `${classes['callLogProfileDiv']}` }); profileDiv.appendChild(profileImg); From 4905a7df157182886a2ed82e33b26981786a8c25 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Wed, 13 May 2020 18:41:33 +0900 Subject: [PATCH 04/64] call duration time bug fixed 1. body tag css is modified 2. dial_view height value is modified. --- css/main.css | 1 + lib/css/styles.js | 1 + lib/views/CallLogItem.js | 8 ++++---- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/css/main.css b/css/main.css index e0a1723..105941d 100644 --- a/css/main.css +++ b/css/main.css @@ -14,6 +14,7 @@ body { margin: 0 auto; + overflow: hidden; } .center { diff --git a/lib/css/styles.js b/lib/css/styles.js index 29f78c2..f0e6a87 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -228,6 +228,7 @@ const styles = { }, viewDial: { + height: 'calc(100% - 110px)', color: colors.navy900, '& $content': { marginTop: 'auto' diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index 27b90e5..efdb626 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -53,11 +53,11 @@ export class CallLogItem { //duration let callDurationTime = ''; - callLogInfo.duration = 3603; if(callLogInfo.duration > 0){ - let hour = parseInt(callLogInfo.duration / 3600); - let min = parseInt((callLogInfo.duration - (hour * 3600)) / 60); - let sec = callLogInfo.duration - (hour * 3600) - (min * 60); + let tempDuration = Math.ceil(callLogInfo.duration / 1000); + let hour = parseInt(tempDuration / 3600); + let min = parseInt((tempDuration - (hour * 3600)) / 60); + let sec = tempDuration - (hour * 3600) - (min * 60); if( hour > 0 ){ callDurationTime = hour + 'h '; } From 79509241a4c9bc6a0f34a3def45a89191aa35365 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Thu, 14 May 2020 10:49:37 +0900 Subject: [PATCH 05/64] [CALLS-700]Call history design implementation 1. intentation size change. 2. voice call bug fix in the call log --- lib/components/App.js | 2 +- lib/components/Header.js | 152 +++++++++++++++++++-------------------- lib/views/CallLogItem.js | 2 +- lib/views/CallLogView.js | 122 +++++++++++++++---------------- 4 files changed, 139 insertions(+), 139 deletions(-) diff --git a/lib/components/App.js b/lib/components/App.js index 87c7342..bbed294 100644 --- a/lib/components/App.js +++ b/lib/components/App.js @@ -1,5 +1,5 @@ import BaseElement from "./BaseElement"; -import { jss, sheet, classes } from "../css/styles.js"; +import { jss, sheet } from "../css/styles.js"; export default class App extends BaseElement { constructor({ id, className, pages, styles, args }) { diff --git a/lib/components/Header.js b/lib/components/Header.js index c737d7b..4c0d1b1 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -5,92 +5,92 @@ import Menu from "../components/Menu"; import { sheet, classes } from "../css/styles"; export default class Header extends BaseElement { - constructor({ id, className, parent, element, args } = {}) { - super({ id, className, parent, element, args }); - this.element = element; - this.parent = parent; + constructor({ id, className, parent, element, args } = {}) { + super({ id, className, parent, element, args }); + this.element = element; + this.parent = parent; - this.settingItems = [ - { - 'label': 'Device settings', - 'callback': () => { this.sendToParent('show_settings') } - }, - { - 'label': 'Sign out', - 'callback': () => { - SendBirdCall.deauthenticate(); - this.sendToParent('deauthenticate'); - } - } - ]; + this.settingItems = [ + { + 'label': 'Device settings', + 'callback': () => { this.sendToParent('show_settings') } + }, + { + 'label': 'Sign out', + 'callback': () => { + SendBirdCall.deauthenticate(); + this.sendToParent('deauthenticate'); + } + } + ]; - this.args = args; - this.parent = parent; - } + this.args = args; + this.parent = parent; + } - build() { - const userDiv = createDiv({ - id: 'header_user_div', - className: `${classes['userDiv']} ${classes['center']}` - }); + build() { + const userDiv = createDiv({ + id: 'header_user_div', + className: `${classes['userDiv']} ${classes['center']}` + }); - let profileImg; - if (this.args.user && this.args.user.profileUrl) { - sheet.update({ profileUrl: this.args.user.profileUrl }); - profileImg = createDiv({ id: 'header_profile_img', className: classes['profileSmall'] }); - } else { - profileImg = createDiv({ id: 'header_avatar', className: `${classes['avatar']}` }); - } + let profileImg; + if (this.args.user && this.args.user.profileUrl) { + sheet.update({ profileUrl: this.args.user.profileUrl }); + profileImg = createDiv({ id: 'header_profile_img', className: classes['profileSmall'] }); + } else { + profileImg = createDiv({ id: 'header_avatar', className: `${classes['avatar']}` }); + } - const headerInfo = createDiv({ id: 'header_info', className: `${classes['headerInfo']}` }); - const userId = createDiv({ - id: 'header_user_id', - className: `${classes['headerUserId']} ${classes['fontNormal']} ${classes['fontHeavy']}`, - innerText: this.args.user.userId || '' - }); - const nickname = createDiv({ - id: 'header_nickname', - className: `${classes['headerNickname']} ${classes['fontSmall']}`, - innerText: this.args.user.nickname || 'no nickname' - }); - headerInfo.appendChild(userId); - headerInfo.appendChild(nickname); + const headerInfo = createDiv({ id: 'header_info', className: `${classes['headerInfo']}` }); + const userId = createDiv({ + id: 'header_user_id', + className: `${classes['headerUserId']} ${classes['fontNormal']} ${classes['fontHeavy']}`, + innerText: this.args.user.userId || '' + }); + const nickname = createDiv({ + id: 'header_nickname', + className: `${classes['headerNickname']} ${classes['fontSmall']}`, + innerText: this.args.user.nickname || 'no nickname' + }); + headerInfo.appendChild(userId); + headerInfo.appendChild(nickname); - userDiv.appendChild(profileImg); - userDiv.appendChild(headerInfo); + userDiv.appendChild(profileImg); + userDiv.appendChild(headerInfo); - const headerButtons = createDiv({ - id: 'header_buttons', - className: `${classes['headerButtons']} ${classes['row']} ${classes['center']}` - }); - const settingsButton = new Menu({ - id: 'settings_button', - element: createDiv({ className: `${classes['settingsButton']}` }), - items: this.settingItems - }); + const headerButtons = createDiv({ + id: 'header_buttons', + className: `${classes['headerButtons']} ${classes['row']} ${classes['center']}` + }); + const settingsButton = new Menu({ + id: 'settings_button', + element: createDiv({ className: `${classes['settingsButton']}` }), + items: this.settingItems + }); - const closeButton = createDiv({ - id: 'close_button', - className: `${classes['closeButton']}` - }); - closeButton.onclick = () => { - this.parent.sendToParent('widgetclose'); - }; - settingsButton.appendToHTML(headerButtons); - headerButtons.appendChild(closeButton); + const closeButton = createDiv({ + id: 'close_button', + className: `${classes['closeButton']}` + }); + closeButton.onclick = () => { + this.parent.sendToParent('widgetclose'); + }; + settingsButton.appendToHTML(headerButtons); + headerButtons.appendChild(closeButton); - const divider = createDiv({ - id: 'header_divider', - className: classes['headerDivider'] - }); + const divider = createDiv({ + id: 'header_divider', + className: classes['headerDivider'] + }); - this.element.appendChild(userDiv); - this.element.appendChild(divider); - this.element.appendChild(headerButtons); + this.element.appendChild(userDiv); + this.element.appendChild(divider); + this.element.appendChild(headerButtons); - if( !this.args.isWidget ){ - const headerLogo = createDiv({ id: 'header_logo', className: `${classes['headerLogo']}`}); - this.element.appendChild(headerLogo); - } + if( !this.args.isWidget ){ + const headerLogo = createDiv({ id: 'header_logo', className: `${classes['headerLogo']}`}); + this.element.appendChild(headerLogo); } + } } \ No newline at end of file diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index efdb626..4a689ab 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -140,7 +140,7 @@ export class CallLogItem { eventhandler(event, {peerId: this.destPeerID, isVideoCall: true, callOption: null}); }; this.btnCallVoice.onclick = (event) => { - eventhandler(event, {peerId: this.destPeerID, isVideoCall: true, callOption: null}); + eventhandler(event, {peerId: this.destPeerID, isVideoCall: false, callOption: null}); }; } } \ No newline at end of file diff --git a/lib/views/CallLogView.js b/lib/views/CallLogView.js index 2e9a3ca..eecc113 100644 --- a/lib/views/CallLogView.js +++ b/lib/views/CallLogView.js @@ -5,74 +5,74 @@ import { createList, createDiv } from "../utils/domUtil"; import { CallLogItem } from "./CallLogItem"; export default class CallLogView extends BaseElement{ - constructor({ args }) { - super({ - id: 'calllog_view', - className: `${classes['container']} ${classes['center']} ${classes['viewDial']}`, - args - }); + constructor({ args }) { + super({ + id: 'calllog_view', + className: `${classes['container']} ${classes['center']} ${classes['viewDial']}`, + args + }); - this.callLogQuery = null; - this.callLogQueryData = []; - this.args = args; - } + this.callLogQuery = null; + this.callLogQueryData = []; + this.args = args; + } - build() { - const callLogList = createList({ id: 'call_log_list', className: `${classes['callLogListContainer']}` }); - this.callLogQuery = SendBirdCall.createDirectCallLogListQuery({ limit: 30 }); + build() { + const callLogList = createList({ id: 'call_log_list', className: `${classes['callLogListContainer']}` }); + this.callLogQuery = SendBirdCall.createDirectCallLogListQuery({ limit: 30 }); + this.getCallLogs(callLogList); + callLogList.onscroll = (e) => { + let scrollposition = e.target.scrollHeight - e.target.clientHeight; + if( scrollposition === e.target.scrollTop ) { this.getCallLogs(callLogList); - callLogList.onscroll = (e) => { - let scrollposition = e.target.scrollHeight - e.target.clientHeight; - if( scrollposition === e.target.scrollTop ) { - this.getCallLogs(callLogList); - } - }; + } + }; - if( this.args.isWidget ) { - callLogList.classList.add(classes['widgetCallLog']); - this.element.appendChild(callLogList); - } - else{ - const callLogDescription = createDiv({ id: 'call_log_desc', className: `${classes['callLogListDesc']}` }); - const callLogDescLogo = createDiv({ className: `${classes['callLogDescLogo']}` }); - const callLogDescTitle = createDiv({ innerText: 'Sendbird Calls Quickstart', className: `${classes['callLogDescTitle']} ${classes['font24']} ${classes['fontDemi']}` }); - const callLogDescLabel = createDiv({ innerText: 'This is the Sendbird Calls Quickstart page. Lorem ipsum', className: `${classes['callLogDescLabel']} ${classes['fontNormal']} ${classes['fontHeavy']}` }); - callLogDescription.appendChild(callLogDescLogo); - callLogDescription.appendChild(callLogDescTitle); - callLogDescription.appendChild(callLogDescLabel); + if( this.args.isWidget ) { + callLogList.classList.add(classes['widgetCallLog']); + this.element.appendChild(callLogList); + } + else{ + const callLogDescription = createDiv({ id: 'call_log_desc', className: `${classes['callLogListDesc']}` }); + const callLogDescLogo = createDiv({ className: `${classes['callLogDescLogo']}` }); + const callLogDescTitle = createDiv({ innerText: 'Sendbird Calls Quickstart', className: `${classes['callLogDescTitle']} ${classes['font24']} ${classes['fontDemi']}` }); + const callLogDescLabel = createDiv({ innerText: 'This is the Sendbird Calls Quickstart page. Lorem ipsum', className: `${classes['callLogDescLabel']} ${classes['fontNormal']} ${classes['fontHeavy']}` }); + callLogDescription.appendChild(callLogDescLogo); + callLogDescription.appendChild(callLogDescTitle); + callLogDescription.appendChild(callLogDescLabel); - this.element.appendChild(callLogList); - this.element.appendChild(callLogDescription); - } + this.element.appendChild(callLogList); + this.element.appendChild(callLogDescription); } + } + + getCallLogs(element){ + if( this.callLogQuery.hasNext && !this.callLogQuery.isLoading ) { + this.callLogQuery.next((directCallLog) => { + if( directCallLog ){ + if( directCallLog.length > 0 ) { + for( let i = 0; i < directCallLog.length; i++ ){ + let callItem = null; + if( i === 0 ){ + callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']}` }); + } + else { + callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']} ${classes['callLogItemWarpBorder']}` }); + } + callItem.onclick = (event, args) => { + this.sendToParent('dial', args); + }; - getCallLogs(element){ - if( this.callLogQuery.hasNext && !this.callLogQuery.isLoading ) { - this.callLogQuery.next((directCallLog) => { - if( directCallLog ){ - if( directCallLog.length > 0 ) { - for( let i = 0; i < directCallLog.length; i++ ){ - let callItem = null; - if( i === 0 ){ - callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']}` }); - } - else { - callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']} ${classes['callLogItemWarpBorder']}` }); - } - callItem.onclick = (event, args) => { - this.sendToParent('dial', args); - }; - - element.appendChild(callItem.element); - } - } - else{ - // empty call log - const emptyCallLog = new CallLogItem({ className: `${classes['callLogEmptyWrap']}` }); - element.appendChild(emptyCallLog.element); - } - } - }); + element.appendChild(callItem.element); + } + } + else{ + // empty call log + const emptyCallLog = new CallLogItem({ className: `${classes['callLogEmptyWrap']}` }); + element.appendChild(emptyCallLog.element); + } } + }); } + } } \ No newline at end of file From 099236104383e24c5366341a2eb7b2c87cbd63f5 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Thu, 14 May 2020 17:04:14 +0900 Subject: [PATCH 06/64] Update lib/views/CallLogView.js Co-authored-by: Dongjin Jung --- lib/views/CallLogView.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/views/CallLogView.js b/lib/views/CallLogView.js index eecc113..8b15fd2 100644 --- a/lib/views/CallLogView.js +++ b/lib/views/CallLogView.js @@ -47,7 +47,7 @@ export default class CallLogView extends BaseElement{ } getCallLogs(element){ - if( this.callLogQuery.hasNext && !this.callLogQuery.isLoading ) { + if (!this.callLogQuery.hasNext || this.callLogQuery.isLoading) return; this.callLogQuery.next((directCallLog) => { if( directCallLog ){ if( directCallLog.length > 0 ) { @@ -75,4 +75,4 @@ export default class CallLogView extends BaseElement{ }); } } -} \ No newline at end of file +} From d935e8e18ddc3e6ce399b75fb1e35a5291094b13 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Thu, 14 May 2020 17:10:04 +0900 Subject: [PATCH 07/64] Update lib/utils/domUtil.js Co-authored-by: Dongjin Jung --- lib/utils/domUtil.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/utils/domUtil.js b/lib/utils/domUtil.js index 0fc9480..ea71674 100644 --- a/lib/utils/domUtil.js +++ b/lib/utils/domUtil.js @@ -141,8 +141,8 @@ export function replaceClassName(element, searchValue, newValue) { } export function hasClassName(element, searchValue) { - if(element.classList.value.indexOf(searchValue) === -1) { + return (element.classList.value.indexOf(searchValue) !== -1); return false; } return true; -} \ No newline at end of file +} From 31efa8a40c3cffe06d60be9e425ad15c6a382e23 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Thu, 14 May 2020 17:19:16 +0900 Subject: [PATCH 08/64] Update lib/views/CallLogView.js Co-authored-by: Dongjin Jung --- lib/views/CallLogView.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/views/CallLogView.js b/lib/views/CallLogView.js index 8b15fd2..762bb33 100644 --- a/lib/views/CallLogView.js +++ b/lib/views/CallLogView.js @@ -49,7 +49,7 @@ export default class CallLogView extends BaseElement{ getCallLogs(element){ if (!this.callLogQuery.hasNext || this.callLogQuery.isLoading) return; this.callLogQuery.next((directCallLog) => { - if( directCallLog ){ + if (!directCallLog) return; if( directCallLog.length > 0 ) { for( let i = 0; i < directCallLog.length; i++ ){ let callItem = null; From 1f00f8f327b221753a5d2e9f4b0327b8cc994b6b Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Thu, 14 May 2020 17:34:44 +0900 Subject: [PATCH 09/64] [CALLS-700]Call history design implementation review apply --- lib/components/App.js | 4 ++-- lib/components/Header.js | 2 +- lib/components/TabToolBar.js | 6 +++--- lib/css/styles.js | 1 - lib/views/CallLogItem.js | 7 +++---- lib/views/CallLogView.js | 15 +++++++-------- 6 files changed, 16 insertions(+), 19 deletions(-) diff --git a/lib/components/App.js b/lib/components/App.js index bbed294..3448407 100644 --- a/lib/components/App.js +++ b/lib/components/App.js @@ -30,8 +30,8 @@ export default class App extends BaseElement { route(pageName, opt = {}) { for (let i = this.children.length - 1 ; i >= 0 ; i--) { const child = this.children[i]; - if( child.element.id === 'header' || child.element.id === 'tabtoolbar') { - if( opt.isRemoveHeader === true ) { + if(child.element.id === 'header' || child.element.id === 'tabtoolbar') { + if(opt.isRemoveHeader === true) { child.remove(); } } diff --git a/lib/components/Header.js b/lib/components/Header.js index 4c0d1b1..a2096b1 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -88,7 +88,7 @@ export default class Header extends BaseElement { this.element.appendChild(divider); this.element.appendChild(headerButtons); - if( !this.args.isWidget ){ + if(!this.args.isWidget){ const headerLogo = createDiv({ id: 'header_logo', className: `${classes['headerLogo']}`}); this.element.appendChild(headerLogo); } diff --git a/lib/components/TabToolBar.js b/lib/components/TabToolBar.js index 6e011e0..364f419 100644 --- a/lib/components/TabToolBar.js +++ b/lib/components/TabToolBar.js @@ -11,7 +11,7 @@ export default class TabToolBar extends BaseElement { build() { // dial tab - if( this.args.isWidget ) { + if(this.args.isWidget) { this.element.classList.add(classes['tabToolBarWidget']); } const btnDial = createDiv({ id: 'btn_tab_dial', className: `${classes['btnTab']}` }); @@ -32,7 +32,7 @@ export default class TabToolBar extends BaseElement { } }; - if( this.args.isWidget ) { + if(this.args.isWidget) { btnDial.classList.add(classes['btnTabWidget']); } @@ -55,7 +55,7 @@ export default class TabToolBar extends BaseElement { } }; - if( this.args.isWidget ) { + if(this.args.isWidget) { btnCallLog.classList.add(classes['btnTabWidget']); } diff --git a/lib/css/styles.js b/lib/css/styles.js index f0e6a87..c294e7d 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -1109,7 +1109,6 @@ const styles = { callLogListContainer: { display: 'inline-block', position: 'relative', - height: 'calc(100% - 103px)', height: '100%', overflowY: 'auto', listStyle: 'none', diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index 4a689ab..4b2e34c 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -58,15 +58,14 @@ export class CallLogItem { let hour = parseInt(tempDuration / 3600); let min = parseInt((tempDuration - (hour * 3600)) / 60); let sec = tempDuration - (hour * 3600) - (min * 60); - if( hour > 0 ){ + if(hour > 0){ callDurationTime = hour + 'h '; } - if( min > 0 ){ + if(min > 0){ callDurationTime += (min + 'm '); } callDurationTime += (sec + 's'); - } - else { + } else { callDurationTime = '0s'; } diff --git a/lib/views/CallLogView.js b/lib/views/CallLogView.js index eecc113..88a4371 100644 --- a/lib/views/CallLogView.js +++ b/lib/views/CallLogView.js @@ -23,12 +23,12 @@ export default class CallLogView extends BaseElement{ this.getCallLogs(callLogList); callLogList.onscroll = (e) => { let scrollposition = e.target.scrollHeight - e.target.clientHeight; - if( scrollposition === e.target.scrollTop ) { + if(scrollposition === e.target.scrollTop) { this.getCallLogs(callLogList); } }; - if( this.args.isWidget ) { + if(this.args.isWidget) { callLogList.classList.add(classes['widgetCallLog']); this.element.appendChild(callLogList); } @@ -47,16 +47,15 @@ export default class CallLogView extends BaseElement{ } getCallLogs(element){ - if( this.callLogQuery.hasNext && !this.callLogQuery.isLoading ) { + if(this.callLogQuery.hasNext && !this.callLogQuery.isLoading) { this.callLogQuery.next((directCallLog) => { - if( directCallLog ){ - if( directCallLog.length > 0 ) { + if(directCallLog){ + if(directCallLog.length > 0) { for( let i = 0; i < directCallLog.length; i++ ){ let callItem = null; - if( i === 0 ){ + if(i === 0){ callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']}` }); - } - else { + } else { callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']} ${classes['callLogItemWarpBorder']}` }); } callItem.onclick = (event, args) => { From d013352ac5007d70826d4285be92ea60da44b732 Mon Sep 17 00:00:00 2001 From: Cobb Jung Date: Thu, 14 May 2020 18:06:18 +0900 Subject: [PATCH 10/64] Update gitignore Add Editor configuration files into gitignore. Editors : Webstorm, VSCode --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 6704566..6de2d07 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,7 @@ dist # TernJS port file .tern-port + +# Editor configuration files +.idea/ +.vscode/ From 94471f14dac4757d2c6392878164083874eaca06 Mon Sep 17 00:00:00 2001 From: Cobb Jung Date: Thu, 14 May 2020 18:18:16 +0900 Subject: [PATCH 11/64] Update logo images Altered previous logos with new one. --- img/ic-logo-horizontal-purple-300.svg | 2 +- lib/assets/ic-logo-black-01.svg | 4 ++-- lib/assets/ic-logo-horizontal-purple-300.svg | 2 +- lib/assets/ic-logo-inverse-01.svg | 6 +----- 4 files changed, 5 insertions(+), 9 deletions(-) diff --git a/img/ic-logo-horizontal-purple-300.svg b/img/ic-logo-horizontal-purple-300.svg index 78d907c..1c3c7d4 100644 --- a/img/ic-logo-horizontal-purple-300.svg +++ b/img/ic-logo-horizontal-purple-300.svg @@ -1,3 +1,3 @@ - + diff --git a/lib/assets/ic-logo-black-01.svg b/lib/assets/ic-logo-black-01.svg index ddf7ac9..06a28d8 100644 --- a/lib/assets/ic-logo-black-01.svg +++ b/lib/assets/ic-logo-black-01.svg @@ -1,3 +1,3 @@ - - + + diff --git a/lib/assets/ic-logo-horizontal-purple-300.svg b/lib/assets/ic-logo-horizontal-purple-300.svg index 78d907c..1c3c7d4 100644 --- a/lib/assets/ic-logo-horizontal-purple-300.svg +++ b/lib/assets/ic-logo-horizontal-purple-300.svg @@ -1,3 +1,3 @@ - + diff --git a/lib/assets/ic-logo-inverse-01.svg b/lib/assets/ic-logo-inverse-01.svg index cf5a385..173f883 100644 --- a/lib/assets/ic-logo-inverse-01.svg +++ b/lib/assets/ic-logo-inverse-01.svg @@ -1,7 +1,3 @@ - - - - - + From 30ebe82f990d2885117c167f2ddd602a69ff6bfb Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Thu, 14 May 2020 18:19:34 +0900 Subject: [PATCH 12/64] [CALLS-700]Call history design implementation apply review comment. --- lib/components/App.js | 5 ++--- lib/css/styles.js | 12 +++++++----- lib/utils/domUtil.js | 3 --- lib/views/CallLogItem.js | 21 +++++++-------------- lib/views/CallLogView.js | 15 ++++----------- 5 files changed, 20 insertions(+), 36 deletions(-) diff --git a/lib/components/App.js b/lib/components/App.js index 3448407..7d140b7 100644 --- a/lib/components/App.js +++ b/lib/components/App.js @@ -31,11 +31,10 @@ export default class App extends BaseElement { for (let i = this.children.length - 1 ; i >= 0 ; i--) { const child = this.children[i]; if(child.element.id === 'header' || child.element.id === 'tabtoolbar') { - if(opt.isRemoveHeader === true) { + if(opt.isRemoveHeader) { child.remove(); } - } - else{ + } else { child.remove(); } } diff --git a/lib/css/styles.js b/lib/css/styles.js index c294e7d..08ff48e 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -1114,6 +1114,12 @@ const styles = { listStyle: 'none', margin: '0', padding: '0', + borderRight: 'solid 1px #dee2f2', + 'li': { + '&:first-child': { + borderTop: 'unset' + } + } }, callLogListDesc: { @@ -1172,7 +1178,7 @@ const styles = { width: '376px', minHeight: '88px', height: 'auto', - borderRight: 'solid 1px #dee2f2', + borderTop: 'solid 1px #dee2f2', paddingBottom: '5px', }, @@ -1231,10 +1237,6 @@ const styles = { height: '100%' }, - callLogItemWarpBorder: { - borderTop: 'solid 1px #dee2f2' - }, - callLogItemType: { display: 'block', width: '20px', diff --git a/lib/utils/domUtil.js b/lib/utils/domUtil.js index ea71674..4e9861d 100644 --- a/lib/utils/domUtil.js +++ b/lib/utils/domUtil.js @@ -142,7 +142,4 @@ export function replaceClassName(element, searchValue, newValue) { export function hasClassName(element, searchValue) { return (element.classList.value.indexOf(searchValue) !== -1); - return false; - } - return true; } diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index 4b2e34c..d3343b6 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -15,16 +15,13 @@ export class CallLogItem { if(callLogInfo.isVideoCall){ if(callLogInfo.userRole === 'dc_caller'){ callType = outgoingVideo; - } - else{ + } else { callType = incomingVideo; } - } - else{ + } else { if(callLogInfo.userRole === 'dc_caller'){ callType = outgoingVoice; - } - else{ + } else { callType = incomingVoice; } } @@ -34,8 +31,7 @@ export class CallLogItem { if(callLogInfo.userRole === 'dc_caller'){ profileImage = callLogInfo.callee.profileUrl; displayName = callLogInfo.callee.userId; - } - else{ + } else { profileImage = callLogInfo.caller.profileUrl; displayName = callLogInfo.caller.userId; } @@ -46,7 +42,7 @@ export class CallLogItem { const profileImg = createImg({ className: `${classes['callLogProfileImg']}`, src: profileImage, onerror: (error) => { error.currentTarget.src = avatarIcon; - } }); + }}); const profileDiv = createDiv({ className: `${classes['callLogProfileDiv']}` }); profileDiv.appendChild(profileImg); @@ -81,10 +77,7 @@ export class CallLogItem { let callStartTime = new Date(callLogInfo.startedAt); - let callStartTimeLabel = callStartTime.getFullYear() + '/' + - callStartTime.toLocaleString(['en-US'], {month: '2-digit'}) + '/' + - callStartTime.toLocaleString(['en-US'], {day: '2-digit'}) + ' ' + - this.formatAMPM(callStartTime); + let callStartTimeLabel = `${callStartTime.getFullYear()}/${callStartTime.toLocaleString(['en-US'], {month: '2-digit'})}/${callStartTime.toLocaleString(['en-US'], {day: '2-digit'})} ${this.formatAMPM(callStartTime)}`; const callLogStartTime = createLabel({ className: `${classes['callLogStartTime']} ${classes['fontSmall']}`, innerText: callStartTimeLabel}); const callActionBtnWrap = createDiv({ className: `${classes['callLogActionBtnWrap']}` }); @@ -125,7 +118,7 @@ export class CallLogItem { let minutes = date.getMinutes(); let ampm = hours >= 12 ? 'pm' : 'am'; hours = hours % 12; - hours = hours ? hours : 12; // the hour '0' should be '12' + hours = hours || 12; // the hour '0' should be '12' minutes = minutes < 10 ? '0'+minutes : minutes; let strTime = hours + ':' + minutes + ampm; return strTime; diff --git a/lib/views/CallLogView.js b/lib/views/CallLogView.js index a4d4b7a..62eb144 100644 --- a/lib/views/CallLogView.js +++ b/lib/views/CallLogView.js @@ -31,8 +31,7 @@ export default class CallLogView extends BaseElement{ if(this.args.isWidget) { callLogList.classList.add(classes['widgetCallLog']); this.element.appendChild(callLogList); - } - else{ + } else { const callLogDescription = createDiv({ id: 'call_log_desc', className: `${classes['callLogListDesc']}` }); const callLogDescLogo = createDiv({ className: `${classes['callLogDescLogo']}` }); const callLogDescTitle = createDiv({ innerText: 'Sendbird Calls Quickstart', className: `${classes['callLogDescTitle']} ${classes['font24']} ${classes['fontDemi']}` }); @@ -50,21 +49,15 @@ export default class CallLogView extends BaseElement{ if (!this.callLogQuery.hasNext || this.callLogQuery.isLoading) return; this.callLogQuery.next((directCallLog) => { if( directCallLog.length > 0 ) { - for( let i = 0; i < directCallLog.length; i++ ){ - let callItem = null; - if(i === 0){ - callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']}` }); - } else { - callItem = new CallLogItem({ callLogInfo: directCallLog[i], className: `${classes['callLogItemWrap']} ${classes['callLogItemWarpBorder']}` }); - } + for(let callLogItem of directCallLog) { + const callItem = new CallLogItem({ callLogInfo: callLogItem, className: `${classes['callLogItemWrap']}` }); callItem.onclick = (event, args) => { this.sendToParent('dial', args); }; element.appendChild(callItem.element); } - } - else{ + } else { // empty call log const emptyCallLog = new CallLogItem({ className: `${classes['callLogEmptyWrap']}` }); element.appendChild(emptyCallLog.element); From 8d22abe88dd6f7c9405b9683cdecbf87c14e6114 Mon Sep 17 00:00:00 2001 From: Cobb Jung Date: Thu, 14 May 2020 18:47:23 +0900 Subject: [PATCH 13/64] Add alt property into img tags --- views/index.html | 4 ++-- views/widget.html | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/views/index.html b/views/index.html index f88d1f7..7bde71b 100644 --- a/views/index.html +++ b/views/index.html @@ -11,7 +11,7 @@
- + logo
Calls Sample
@@ -30,4 +30,4 @@
- \ No newline at end of file + diff --git a/views/widget.html b/views/widget.html index 8b6c3ad..a2cd595 100644 --- a/views/widget.html +++ b/views/widget.html @@ -10,7 +10,7 @@
- + logo
Voice Sample Login
@@ -18,7 +18,7 @@ This is the Voice Sample page. To try our Voice widget, please click the button below.
- + arrow-down-right
@@ -27,11 +27,11 @@ - + tooltip-tail-down
- \ No newline at end of file + From 6d99f4503466c45bbdc62d3c2bdd92fa953d8a6c Mon Sep 17 00:00:00 2001 From: Cobb Jung Date: Fri, 15 May 2020 15:59:15 +0900 Subject: [PATCH 14/64] Update img tag alt attributes, SEO in mind Make dom util, create img accept alt parameter. Update alt texts with SEO in mind. Refer to https://blog.hubspot.com/marketing/image-alt-text --- lib/utils/domUtil.js | 4 ++-- lib/views/CallLogItem.js | 28 +++++++++++++++++++--------- lib/views/CallView.js | 1 + views/index.html | 2 +- views/widget.html | 2 +- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/lib/utils/domUtil.js b/lib/utils/domUtil.js index 4e9861d..816cafe 100644 --- a/lib/utils/domUtil.js +++ b/lib/utils/domUtil.js @@ -111,12 +111,12 @@ export function createButton({ id, className, innerText } = {}) { return _createElement({ tagName: 'button', id: id, className: className, innerText: innerText }); } -export function createImg({ id, className, src, onerror } = {}) { +export function createImg({ id, className, src, alt, onerror } = {}) { const element = _createElement({ tagName: 'img', id: id, className: className, - attrs: { src: src } + attrs: { src, alt } }); element.onerror = onerror; diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index d3343b6..01737db 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -12,17 +12,22 @@ export class CallLogItem { if(callLogInfo) { const wrapper = createListItem({ id: callLogInfo.callId, className: className }); let callType = null; + let callTypeAlt = ''; if(callLogInfo.isVideoCall){ if(callLogInfo.userRole === 'dc_caller'){ callType = outgoingVideo; + callTypeAlt = 'Outgoing call history'; } else { callType = incomingVideo; + callTypeAlt = 'Incoming call history'; } } else { if(callLogInfo.userRole === 'dc_caller'){ callType = outgoingVoice; + callTypeAlt = 'Outgoing call history'; } else { callType = incomingVoice; + callTypeAlt = 'Incoming call history'; } } @@ -36,14 +41,19 @@ export class CallLogItem { displayName = callLogInfo.caller.userId; } - const icoCallType = createImg({ className: `${classes['callLogItemType']}`, src: callType }); + const icoCallType = createImg({ className: `${classes['callLogItemType']}`, src: callType, alt: callTypeAlt }); const callTypeDiv = createDiv({ className: `${classes['callLogTypeDiv']}` }); callTypeDiv.appendChild(icoCallType); - const profileImg = createImg({ className: `${classes['callLogProfileImg']}`, src: profileImage, onerror: (error) => { - error.currentTarget.src = avatarIcon; - }}); - + const profileImg = createImg({ + className: `${classes['callLogProfileImg']}`, + src: profileImage, + alt: 'Opponent profile photo of call history', + onerror: (error) => { + error.currentTarget.src = avatarIcon; + } + }); + const profileDiv = createDiv({ className: `${classes['callLogProfileDiv']}` }); profileDiv.appendChild(profileImg); @@ -85,12 +95,12 @@ export class CallLogItem { const btnCallVoice = createDiv({ className: `${classes['callLogVoiceActionBtn']}`}); callActionBtnWrap.appendChild(btnCallVoice); callActionBtnWrap.appendChild(btnCallVideo); - - + + const callLogActionDiv = createDiv({ className: `${classes['callLogActionDiv']}` }); callLogActionDiv.appendChild(callLogStartTime); callLogActionDiv.appendChild(callActionBtnWrap); - + wrapper.appendChild(callTypeDiv); wrapper.appendChild(profileDiv); @@ -135,4 +145,4 @@ export class CallLogItem { eventhandler(event, {peerId: this.destPeerID, isVideoCall: false, callOption: null}); }; } -} \ No newline at end of file +} diff --git a/lib/views/CallView.js b/lib/views/CallView.js index f809b8c..202f38e 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -24,6 +24,7 @@ export default class CallView extends BaseElement { this.peerProfile = createImg({ src: remoteUser.profileUrl, + alt: 'Sendbird voice & video call opponent profile photo', className: classes['remoteProfile'], onerror: (e) => e.target.style.visibility = 'hidden' }); diff --git a/views/index.html b/views/index.html index 7bde71b..41a00b2 100644 --- a/views/index.html +++ b/views/index.html @@ -11,7 +11,7 @@
- logo + Sendbird horizontal logo svg icon
Calls Sample
diff --git a/views/widget.html b/views/widget.html index a2cd595..f58d5de 100644 --- a/views/widget.html +++ b/views/widget.html @@ -10,7 +10,7 @@
- logo + Sendbird horizontal svg icon
Voice Sample Login
From ed27a8fd258649a2224e7d898f4593a460af7749 Mon Sep 17 00:00:00 2001 From: Dongjin Jung Date: Mon, 18 May 2020 09:25:14 +0900 Subject: [PATCH 15/64] Update widget.html --- views/widget.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/widget.html b/views/widget.html index f58d5de..50a1f2e 100644 --- a/views/widget.html +++ b/views/widget.html @@ -10,7 +10,7 @@
- Sendbird horizontal svg icon + Sendbird horizontal logo svg icon
Voice Sample Login
From 6e3b0651010c39c1bcf7cd76cf5cc181196af2ae Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 18 May 2020 14:48:42 +0900 Subject: [PATCH 16/64] template --- lib/views/CallLogItem.js | 3 +-- lib/views/CallView.js | 6 ++++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index d3343b6..de1e424 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -101,8 +101,7 @@ export class CallLogItem { this.btnCallVideo = btnCallVideo; this.btnCallVoice = btnCallVoice; this.destPeerID = displayName; - } - else{ + } else { const wrapper = createDiv({ id: 'empty_calllog', className: className }); const icoCallLogEmpty = createDiv({ className: `${classes['icoCallLogEmpty']}` }); const labelCallLogEmpty = createDiv({ innerText: 'No call history', className: `${classes['labelCallLogEmpty']} ${classes['font16']} ${classes['fontHeavy']}` }); diff --git a/lib/views/CallView.js b/lib/views/CallView.js index f809b8c..2f9fa1a 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -104,14 +104,16 @@ export default class CallView extends BaseElement { this.sendToChildren('connected'); }; - call.onEnded = () => { + call.onEnded = (endedCall) => { this.drawEndResult(); - if (this.call.isVideoCall) { + if (endedCall.isVideoCall) { this.localMediaViewDiv.classList.add(classes['videoHidden']); this.remoteMediaViewDiv.classList.add(classes['videoHidden']); this.showSecondaryInfo(); } + + console.log(endedCall.getCallLog); this.sendToChildren('ended'); }; From da3ee93ec838d60537c731e50c8b67d00543d1c5 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Fri, 5 Jun 2020 15:24:30 +0900 Subject: [PATCH 17/64] calls-534 not complete issue --- css/main.css | 144 +++++++++++++++++---- envs.js | 5 +- img/ic-logo-horizontal.svg | 3 + lib/assets/ic-call-filled-purple.svg | 3 + lib/assets/ic-call-filled.svg | 4 +- lib/assets/ic-copy.svg | 3 + lib/assets/icon-camera-off.svg | 3 + lib/components/Header.js | 4 + lib/components/MainApp.js | 31 ++++- lib/css/styles.js | 184 ++++++++++++++++++++++----- lib/utils/domUtil.js | 2 +- lib/views/AppInfoView.js | 112 ++++++++++++++++ lib/views/CallView.js | 74 +++++++++-- lib/views/DialView.js | 3 +- lib/views/Settings.js | 10 +- views/index.html | 34 ++++- views/widget.html | 12 +- 17 files changed, 541 insertions(+), 90 deletions(-) create mode 100644 img/ic-logo-horizontal.svg create mode 100644 lib/assets/ic-call-filled-purple.svg create mode 100644 lib/assets/ic-copy.svg create mode 100644 lib/assets/icon-camera-off.svg create mode 100644 lib/views/AppInfoView.js diff --git a/css/main.css b/css/main.css index 105941d..c2989a9 100644 --- a/css/main.css +++ b/css/main.css @@ -37,6 +37,14 @@ body { flex-direction: row-reverse; } +.margin-top-24 { + margin-top: 24px; +} + +.margin-right-24 { + margin-right: 24px; +} + .btn { display: flex; cursor: pointer; @@ -78,6 +86,49 @@ body { width: 100%; } +.choose-background { + display: inline-block; + width: 260px; + height: 158px; + border-radius: 4px; + border: solid 1px #dee2f2; + background-color: var(--white); + cursor: pointer; +} + +.choose-background:hover { + border: solid 1px var(--purple-300); +} + +.choose-title { + margin: 24px 24px 8px 24px; + width: 88px; + height: 24px; + font-family: Avenir Next; + font-size: 18px; + font-weight: 500; + font-stretch: normal; + font-style: normal; + line-height: 1.33; + letter-spacing: -0.25px; + color: var(--navy-900); +} + +.choose-desc { + width: 212px; + height: 60px; + margin-left: 24px; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: -0.1px; + color: #595e8a; +} + + .title { height: 32px; font-family: Avenir Next; @@ -90,6 +141,10 @@ body { color: inherit; } +.demi { + font-weight: 600; +} + .input-title { display: inline-block; margin-top: 6px; @@ -112,15 +167,17 @@ body { .desc { font-family: Avenir Next; font-size: 14px; - font-weight: 500; + font-weight: normal; font-stretch: normal; font-style: normal; line-height: 1.43; letter-spacing: -0.1px; - color: inherit; + color: #595e8a; } .desc-light { + width: 100%; + height: 20px; font-family: Avenir Next; font-size: 14px; font-weight: normal; @@ -129,7 +186,36 @@ body { line-height: 1.43; letter-spacing: normal; text-align: center; - color: var(--white); + letter-spacing: -0.1px; + color: #595e8a; + margin-bottom: 24px; +} + +.desc-quick { + width: 275px; + height: 32px; + font-family: Avenir Next; + font-size: 24px; + font-weight: 600; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.33; + letter-spacing: -0.25px; + color: var(--navy-900); +} + +.choose-a-type { + width: 92px; + height: 20px; + font-family: Avenir Next; + font-size: 14px; + font-weight: 500; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: -0.1px; + color: #595e8a; } .smile-face { @@ -212,14 +298,22 @@ button label { margin-bottom: 24px; } +.ic-logo-horizontal { + display: block; + width: 180px; + height: 40px; + background: url("../img/ic-logo-horizontal.svg"); + margin-bottom: 24px; +} + .voice-sample-page { height: 32px; - margin-bottom: 20px; + margin-bottom: 16px; text-align: center; } .voice-sample-desc { - width: 280px; + width: 308px; height: 40px; margin-bottom: 28px; text-align: center; @@ -234,20 +328,24 @@ button label { .widget-tooltip { position: absolute; - right: 24px; - bottom: 88px; + right: 18px; + bottom: 112px; width: 296px; - height: 124px; + height: 108px; border-radius: 4px; + box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); + border: solid 1px #c9d0e6; } .img-tooltip-tail-down { position: absolute; right: 16px; bottom: -8px; - width: 12px; - height: 8px; - object-fit: contain; + width: 0; + height: 0; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 8px solid white; } .widget { @@ -257,15 +355,15 @@ button label { } ::-webkit-scrollbar { - width: 5px; /* 세로축 스크롤바 길이 */ - } - ::-webkit-scrollbar-track { - background-color: transparent; - } - ::-webkit-scrollbar-track-piece { - background-color: transparent; - } - ::-webkit-scrollbar-thumb { - border-radius: 8px; - background-color: gray; - } + width: 5px; /* 세로축 스크롤바 길이 */ +} +::-webkit-scrollbar-track { + background-color: transparent; +} +::-webkit-scrollbar-track-piece { + background-color: transparent; +} +::-webkit-scrollbar-thumb { + border-radius: 8px; + background-color: gray; +} diff --git a/envs.js b/envs.js index a6bcd54..72e3736 100644 --- a/envs.js +++ b/envs.js @@ -1,4 +1,7 @@ -export const TEST_APP_ID = BUILD_APP_ID || undefined; +// export const TEST_APP_ID = BUILD_APP_ID || undefined; +// export const TEST_APP_ID = "6C53468D-A6AB-4160-B586-7F5DB1DBF1D4"; +export const TEST_APP_ID = "7768FD30-5639-48BC-8B25-F5211F3DFEBB"; +// export const TEST_APP_ID = "80ED633C-5301-4BEB-B1DC-0605A395DFAC"; export const USER_ID = undefined; export const ACCESS_TOKEN = undefined; export const IS_ACCESS_TOKEN_NEEDED = false; diff --git a/img/ic-logo-horizontal.svg b/img/ic-logo-horizontal.svg new file mode 100644 index 0000000..1c3c7d4 --- /dev/null +++ b/img/ic-logo-horizontal.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/ic-call-filled-purple.svg b/lib/assets/ic-call-filled-purple.svg new file mode 100644 index 0000000..e875484 --- /dev/null +++ b/lib/assets/ic-call-filled-purple.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/ic-call-filled.svg b/lib/assets/ic-call-filled.svg index e875484..f35280c 100644 --- a/lib/assets/ic-call-filled.svg +++ b/lib/assets/ic-call-filled.svg @@ -1,3 +1,3 @@ - - + + diff --git a/lib/assets/ic-copy.svg b/lib/assets/ic-copy.svg new file mode 100644 index 0000000..59a010d --- /dev/null +++ b/lib/assets/ic-copy.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/assets/icon-camera-off.svg b/lib/assets/icon-camera-off.svg new file mode 100644 index 0000000..28bd930 --- /dev/null +++ b/lib/assets/icon-camera-off.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/components/Header.js b/lib/components/Header.js index a2096b1..8a71ef8 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -15,6 +15,10 @@ export default class Header extends BaseElement { 'label': 'Device settings', 'callback': () => { this.sendToParent('show_settings') } }, + { + 'label': 'Application information', + 'callback': () => { this.sendToParent('show_app_info') } + }, { 'label': 'Sign out', 'callback': () => { diff --git a/lib/components/MainApp.js b/lib/components/MainApp.js index 56cd421..ec85415 100644 --- a/lib/components/MainApp.js +++ b/lib/components/MainApp.js @@ -5,10 +5,10 @@ import { classes } from "../css/styles.js"; import { getCallOption } from "../utils/util"; import { Toast } from "./Toast"; import Settings from "../views/Settings"; - import Header from "../components/Header"; import TabToolBar from "../components/TabToolBar"; import { createDiv } from "../utils/domUtil"; +import AppInfoView from "../views/AppInfoView"; export default class MainApp extends App { constructor({ id, className, pages, styles, args }) { @@ -17,7 +17,8 @@ export default class MainApp extends App { this.onLoginSuccess = null; this.onLoginFailure = null; - + this.settings = null; + this.appInfoView = null; this.init(); } @@ -48,6 +49,18 @@ export default class MainApp extends App { } } + showAppInfo() { + this.appInfoView = new AppInfoView({}); + this.appInfoView.appendToBaseElement(this); + } + + closeAppInfo() { + if (this.appInfoView) { + this.appInfoView.remove(); + this.appInfoView = null; + } + } + async setAppId(appId) { await this._setArgs({ appId: appId }); } @@ -177,6 +190,12 @@ export default class MainApp extends App { case 'close_settings': this.recvCloseSettings(); break; + case 'show_app_info': + this.recvShowAppInfo(); + break; + case 'close_app_info': + this.recvCloseAppInfo(); + break; case 'close': this.recvClose(value); break; @@ -214,6 +233,14 @@ export default class MainApp extends App { this.closeSettings(); } + recvShowAppInfo() { + this.showAppInfo(); + } + + recvCloseAppInfo() { + this.closeAppInfo(); + } + recvClose() { this.createHeaderNTab(); this.route('dial_view', {}); diff --git a/lib/css/styles.js b/lib/css/styles.js index 08ff48e..28cd1bf 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -13,12 +13,13 @@ import videoWhiteIcon from '../assets/ic-video-thumbnail-white.svg'; import videoBlackIcon from '../assets/ic-video-thumbnail-black.svg'; import audioOffBlack from '../assets/ic-callkit-audio-off-black.svg'; import audioOffWhite from '../assets/ic-callkit-audio-off-white.svg'; +import cameraOff from '../assets/icon-camera-off.svg'; import declineWhiteIcon from '../assets/ic-callkit-decline.svg'; import declineBlackIcon from '../assets/ic-decline-black.svg'; import endIcon from '../assets/ic-callkit-end.svg'; import toastErrorIcon from '../assets/ic-error-20.svg'; import toastCloseBtn from '../assets/ic-close-20.svg'; -import widgetIcon from '../assets/ic-call-logs-filled.svg'; +import widgetIcon from '../assets/ic-call-filled.svg'; import settingsIcon from '../assets/ic-settings.svg'; import settingsCloseIcon from '../assets/ic-close-black-20.svg'; import widgetCloseIcon from '../assets/ic-close-24.svg'; @@ -30,9 +31,10 @@ import callhistoryIconDeactive from '../assets/ic-layout-default-deactive.svg'; import callhistoryIconActive from '../assets/ic-layout-default-active.svg'; import headerLogo from '../assets/ic-logo-horizontal-inverse-01.svg'; import thumbnailVideo from '../assets/ic-video-thumbnail-filled.svg'; -import thumbnailVoice from '../assets/ic-call-filled.svg'; +import thumbnailVoice from '../assets/ic-call-filled-purple.svg'; import callLogEmpty from '../assets/ic-layout-default.svg'; import logoHorizon from '../assets/ic-logo-horizontal.svg'; +import icCopy from '../assets/ic-copy.svg'; @@ -60,8 +62,10 @@ const colors = { navy900: '#212242', white: '#ffffff', purple300: '#825eeb', + purple400: '#6440c4', green300: '#1fcca1', green400: '#00998c', + green500: '#007a7a', red300: '#f24d6b', red400: '#d92148', mutegray: 'rgba(168, 168, 168, 0.38)' @@ -123,7 +127,8 @@ const styles = { height: '40px', '& label': { cursor: 'inherit' - } + }, + backgroundColor: colors.white }, btnPrimary: { @@ -263,7 +268,7 @@ const styles = { }, settingsCloseButton: { - marginLeft: 'auto', + display: 'inline-flex', width: '32px', height: '32px', cursor: 'pointer', @@ -286,14 +291,83 @@ const styles = { maxWidth: '480px', paddingTop: '16px', paddingBottom: '24px', - paddingLeft: '32px', - paddingRight: '32px', + paddingLeft: '24px', + paddingRight: '24px', zIndex: '1', boxShadow: '0 6px 10px -5px rgba(33, 34, 66, 0.04), 0 6px 30px 5px rgba(33, 34, 66, 0.08), 0 16px 24px 2px rgba(33, 34, 66, 0.12)', borderRadius: '4px', backgroundColor: colors.white }, + popupHeader: { + display: 'flex', + alignItems: 'center', + width: '100%' + }, + + popupTitle: { + display: 'inline-flex', + width: 'calc(100% - 20px)' + }, + + popupItemLabel: { + display: 'inline-block', + width: '100%', + height: '12px', + marginTop: '22px', + marginBottom: '6px', + lineHeight: '12px !important' + }, + + widgetpopup: { + width: '312px', + marginBottom: '2px' + }, + + appInfoLabelWrap: { + display: 'flex', + width: '100%', + height: '40px', + borderRadius: '4px', + alignItems: 'center', + justifyContent: 'space-between', + backgroundColor: colors.navy80, + }, + + appInfoLabel: { + display: 'inline-flex', + width: 'calc(100% - 60px)', + height: '40px', + borderRadius: '4px', + paddingLeft: '16px', + lineHeight: '40px !important', + textOverflow: 'clip', + overflow: 'hidden', + backgroundColor: colors.navy80, + color: colors.nany600, + }, + + appName: { + width: 'calc(100% - 16px) !important' + }, + + appInfoIdLabel: { + textOverflow: 'clip', + overflow: 'hidden', + whiteSpace: 'pre' + }, + + appInfoIdCopy: { + display: 'inline-flex', + width: '32px', + height: '32px', + borderRadius: '4px', + marginRight: '4px', + backgroundImage: `url(${icCopy})`, + backgroundRepeat: 'no-repeat', + backgroundPosition: 'center', + cursor: 'pointer' + }, /*** fonts ***/ fontSmall: { @@ -473,7 +547,6 @@ const styles = { btnTabDeactive: { color: colors.navy600 }, - /*** components ***/ formContainer: { @@ -500,6 +573,10 @@ const styles = { marginBottom: '16px' }, + dialField: { + width: '312px' + }, + fieldInvalid: { border: `solid 1px ${colors.red300}` }, @@ -587,21 +664,36 @@ const styles = { display: block; `, + peerVideoMuteIcon: ` + width: 40px; + height: 40px; + background-image: url(${cameraOff}); + background-repeat: no-repeat; + background-position: center; + margin-bottom: 16px; + `, + + peerVideoMuteLabel: ` + display: block; + `, + callButtons: { position: 'relative' }, btnCircle: { - width: '64px', - height: '64px', - border: 'none', + width: '56px', + height: '56px', + border: 'solid 1px var(--purple-300)', borderRadius: '50%', + backgroundColor: colors.white, + borderColor: 'transparent', cursor: 'pointer', '&::before': { content: '', display: 'block', - width: '64px', - height: '64px', + width: '56px', + height: '56px', borderRadius: '50%' }, 'btn-circle:hover::before': { @@ -616,52 +708,73 @@ const styles = { }, btnVideoAccept: { - backgroundColor: colors.green300, + backgroundColor: '#2eba9f', backgroundImage: `url(${videoIcon})`, backgroundRepeat: 'no-repeat', - backgroundPosition: 'center' + backgroundPosition: 'center', + '&:hover': { + backgroundColor: colors.green500 + } }, btnAccept: { - backgroundColor: colors.green300, + backgroundColor: '#2eba9f', backgroundImage: `url(${audioIcon})`, backgroundRepeat: 'no-repeat', - backgroundPosition: 'center' + backgroundPosition: 'center', + '&:hover': { + backgroundColor: colors.green500 + } }, btnMute: { backgroundColor: colors.mutegray, backgroundImage: `url(${audioOffWhite})`, backgroundRepeat: 'no-repeat', - backgroundPosition: 'center' + backgroundPosition: 'center', + '&:hover': { + backgroundColor: 'rgba(168, 168, 168, 0.5)' + } }, btnUnmute: { backgroundColor: colors.white, backgroundImage: `url(${audioOffBlack})`, backgroundRepeat: 'no-repeat', - backgroundPosition: 'center' + backgroundPosition: 'center', + '&:hover': { + backgroundColor: 'rgba(168, 168, 168, 0.5)' + } }, btnStopVideo: { backgroundColor: colors.mutegray, backgroundImage: `url(${videoWhiteIcon})`, backgroundRepeat: 'no-repeat', - backgroundPosition: 'center' + backgroundPosition: 'center', + '&:hover': { + backgroundColor: 'rgba(168, 168, 168, 0.5)' + } }, btnStartVideo: { backgroundColor: colors.white, backgroundImage: `url(${videoBlackIcon})`, backgroundRepeat: 'no-repeat', - backgroundPosition: 'center' + backgroundPosition: 'center', + '&:hover': { + backgroundColor: 'rgba(168, 168, 168, 0.5)' + } }, btnEnd: { - backgroundColor: colors.red300, + backgroundColor: '#e53157', backgroundImage: `url(${endIcon})`, backgroundRepeat: 'no-repeat', - backgroundPosition: 'center' + backgroundPosition: 'center', + '&:hover' : { + backgroundColor: '#a30e2d', + } }, videoView: { @@ -716,10 +829,13 @@ const styles = { }, btnDecline: { - backgroundColor: colors.red300, + backgroundColor: 'rgba(0, 0, 0, 0.12)', backgroundImage: `url(${declineWhiteIcon})`, backgroundRepeat: 'no-repeat', - backgroundPosition: 'center' + backgroundPosition: 'center', + '&:hover' : { + backgroundColor: 'rgba(0, 0, 0, 0.38)', + } }, closeDiv: {}, @@ -902,7 +1018,7 @@ const styles = { borderTopLeftRadius: '8px', borderTopRightRadius: '8px', '& $closeButton:hover': { - backgroundColor: colors.navy900 + backgroundColor: colors.purple400 } }, '& $userDiv': { @@ -965,13 +1081,14 @@ const styles = { widgetIcon: { cursor: 'pointer', - width: '56px', - height: '56px', - borderRadius: '32px', + width: '48px', + height: '48px', + borderRadius: '24px', backgroundColor: colors.purple300, backgroundImage: `url(${widgetIcon})`, backgroundRepeat: 'no-repeat', - backgroundPosition: 'center' + backgroundPosition: 'center', + marginBottom: '32px' }, widgetHeader: { @@ -1048,15 +1165,15 @@ const styles = { position: 'relative', marginLeft: '2px', marginRight: '2px', - width: '40px', - height: '40px', + width: '48px', + height: '48px', borderRadius: '4px', cursor: 'pointer', backgroundImage: `url(${settingsIcon})`, backgroundRepeat: 'no-repeat', backgroundPosition: 'center', '&:hover': { - backgroundColor: colors.navy900 + backgroundColor: colors.purple400 }, zIndex: 10, }, @@ -1088,7 +1205,8 @@ const styles = { height: '40px', textAlign: 'center', color: colors.navy400, - marginBottom: '32px' + marginBottom: '32px', + letterSpacing: '-0.1px' }, btnVideo: { diff --git a/lib/utils/domUtil.js b/lib/utils/domUtil.js index 816cafe..1491ae6 100644 --- a/lib/utils/domUtil.js +++ b/lib/utils/domUtil.js @@ -142,4 +142,4 @@ export function replaceClassName(element, searchValue, newValue) { export function hasClassName(element, searchValue) { return (element.classList.value.indexOf(searchValue) !== -1); -} +} \ No newline at end of file diff --git a/lib/views/AppInfoView.js b/lib/views/AppInfoView.js new file mode 100644 index 0000000..98fc1bc --- /dev/null +++ b/lib/views/AppInfoView.js @@ -0,0 +1,112 @@ +import SendBirdCall from "sendbird-calls"; +import BaseElement from "../components/BaseElement"; +import { classes } from "../css/styles"; +import { createDiv, createLabel, createOption, createSelect } from "../utils/domUtil"; + +export default class AppInfoView extends BaseElement { + constructor({ args }) { + super({ + id: 'appinfo_view', + className: `${classes['viewSettings']} ${classes['column']} ${classes['center']}`, + args + }); + + this.args = args; + } + + onLoaded() { + + } + + onRemoved() { + + } + + build() { + const cover = createDiv({ id: 'cover', className: classes['cover'] }); + cover.onclick = () => { + this.remove(); + }; + let popup; + if (this.args.isWidget) { + popup = createDiv({ id: 'settings_popup', className: `${classes['popup']} ${classes['widgetpopup']}` }); + } else { + popup = createDiv({ id: 'settings_popup', className: classes['popup'] }); + } + + const popupHeader = createDiv({ + id: 'settings_popup_header', + className: `${classes['popupHeader']}` + }); + + const popupTitle = createDiv({ + id: 'settings_popup_title', + className: `${classes['popupTitle']} ${classes['font20']} ${classes['fontDemi']}`, + innerText: 'Application information' + }); + const closeButton = createDiv({ + id: 'popup_close_button', + className: `${classes['settingsCloseButton']}` + }); + closeButton.onclick = () => { + this.remove(); + }; + popupHeader.appendChild(popupTitle); + popupHeader.appendChild(closeButton); + + const applicationInfoContainer = createDiv({ id: 'select_container', className: classes['selectContainer'] }); + const applicationNameLabel = createLabel({ + id: 'app_name_label', + innerText: 'Application name', + className: `${classes['popupItemLabel']} ${classes['fontSmall']} ${classes['fontHeavy']}` + }); + const applicationName = createLabel({ + id: 'app_name', + readonly: 'readonly', + innerText: 'Voice & Video', + className: `${classes['appInfoLabel']} ${classes['appName']} ${classes['fontNormal']}` + }); + + applicationInfoContainer.appendChild(applicationNameLabel); + applicationInfoContainer.appendChild(applicationName); + + const applicationIDLabel = createLabel({ + id: 'app_id_label', + innerText: 'Application ID', + className: `${classes['popupItemLabel']} ${classes['fontSmall']} ${classes['fontHeavy']}` + }); + + const applicationIdWrap = createDiv({ + id: 'app_id_wrap', + className: `${classes['appInfoLabelWrap']}` + }); + + const applicationID = createLabel({ + id: 'app_id', + readonly: 'readonly', + innerText: this.args.appId, + className: `${classes['appInfoLabel']} ${classes['appInfoIdLabel']} ${classes['fontNormal']}` + }); + + const appInfoIdCopy = createDiv({ + id: 'btn_app_id_copy', + className: `${classes['appInfoIdCopy']}` + }); + + appInfoIdCopy.onclick = () => { + navigator.clipboard.writeText(this.args.appId); + }; + + applicationIdWrap.appendChild(applicationID); + applicationIdWrap.appendChild(appInfoIdCopy); + + applicationInfoContainer.appendChild(applicationIDLabel); + applicationInfoContainer.appendChild(applicationIdWrap); + + popup.appendChild(popupHeader); + popup.appendChild(applicationInfoContainer); + + this.element.appendChild(cover); + this.element.appendChild(popup); + } +} \ No newline at end of file diff --git a/lib/views/CallView.js b/lib/views/CallView.js index e5dfe75..bf3d0f5 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -1,6 +1,7 @@ import BaseElement from "../components/BaseElement"; import { createAudio, createDiv, createImg, createLabel, createVideo } from "../utils/domUtil"; import { getCallOption } from "../utils/util"; +import { hasClassName } from "../utils/domUtil"; import CallButtons from "./CallButtons"; import { classes } from "../css/styles.js"; import PeriodicJob from "../modules/periodicJob"; @@ -12,6 +13,13 @@ export default class CallView extends BaseElement { this.call = call; this.state = state; this.connected = false; + + this.peerStateDiv = null; + this.peerMuteIcon = null; + this.peerMuteLabel = null; + this.peerVideoMuteIcon = null; + this.peerVideoMuteLabel = null; + this.addCallListeners(call); } @@ -42,23 +50,24 @@ export default class CallView extends BaseElement { innerText: connectionText }); - const peerStateDiv = createDiv({ id: 'peer_state', className: `${classes['column']} ${classes['peerStateDiv']} ${classes['invisible']}` }); - const peerMuteIcon = createDiv({ id: 'peer_mute_icon', className: classes['peerMuteIcon'] }); - const peerMuteLabel = createLabel({ id: 'peer_mute_label', className: `${classes['peerMuteLabel']} ${classes['fontSmall']}`, innerText: `${remoteUser.userId} muted this call` }); - peerStateDiv.appendChild(peerMuteIcon); - peerStateDiv.appendChild(peerMuteLabel); + this.peerStateDiv = createDiv({ id: 'peer_state', className: `${classes['column']} ${classes['peerStateDiv']} ${classes['invisible']}` }); + this.peerMuteIcon = createDiv({ id: 'peer_mute_icon', className: `${classes['peerMuteIcon']}` }); + this.peerMuteLabel = createLabel({ id: 'peer_mute_label', className: `${classes['peerMuteLabel']} ${classes['fontSmall']}`, innerText: `${remoteUser.userId} audio muted this call` }); + this.peerVideoMuteIcon = createDiv({ id: 'peer_video_mute_icon', className: `${classes['peerVideoMuteIcon']}` }); + this.peerVideoMuteLabel = createLabel({ id: 'peer_video_mute_label', className: `${classes['peerVideoMuteLabel']} ${classes['fontSmall']}`, innerText: 'The other person’s camera has been turned off.' }); const buttons = new CallButtons({ call: this.call }); if (this.call.isVideoCall) { - this.localMediaView = createVideo({ className: `${classes['videoView']}`, autoplay: true, muted: true }); + this.localMediaView = createVideo({ className: `${classes['videoView']}`, autoplay: true, muted: true, style: "background-color: #fff;" }); this.remoteMediaView = createVideo({ className: `${classes['videoView']}`, autoplay: true, muted: false, remote: true }); } else { this.localMediaView = createAudio({ autoplay: true, muted: true }); this.remoteMediaView = createAudio({ autoplay: true, muted: false, remote: true }); } + this.localMediaViewDiv = createDiv({ className: `${classes['videoViewDiv']} ${classes['videoFull']}` }); this.remoteMediaViewDiv = createDiv({ className: `${classes['videoViewDiv']} ${classes['videoHidden']}` }); this.localMediaViewDiv.appendChild(this.localMediaView); @@ -76,7 +85,7 @@ export default class CallView extends BaseElement { foreground.appendChild(this.peerProfile); foreground.appendChild(this.peerName); foreground.appendChild(this.connectionInfo); - foreground.appendChild(peerStateDiv); + foreground.appendChild(this.peerStateDiv); this.element.appendChild(background); this.element.appendChild(foreground); @@ -127,16 +136,57 @@ export default class CallView extends BaseElement { }; call.onRemoteAudioSettingsChanged = (call) => { - this.onRemoteMuted(call.isRemoteAudioEnabled); + this.onRemoteAudioMuted(call.isRemoteAudioEnabled); }; + + call.onRemoteVideoSettingsChanged = (call) => { + this.onRemoteVideoMuted(call.isRemoteVideoEnabled); + }; + } + + onRemoteAudioMuted(isEnabled) { + if (isEnabled) { + if (!hasClassName(this.peerStateDiv, classes['invisible'])) { + this.peerStateDiv.classList.add(classes['invisible']); + this.peerStateDiv.removeChild(this.peerMuteIcon); + this.peerStateDiv.removeChild(this.peerMuteLabel); + } else{ + this.peerStateDiv.removeChild(this.peerMuteIcon); + this.peerStateDiv.removeChild(this.peerMuteLabel); + } + } else { + if (hasClassName(this.peerStateDiv, classes['invisible'])) { + this.peerStateDiv.classList.remove(classes['invisible']); + this.peerStateDiv.appendChild(this.peerMuteIcon); + this.peerStateDiv.appendChild(this.peerMuteLabel); + } else { + this.peerStateDiv.appendChild(this.peerMuteIcon); + this.peerStateDiv.appendChild(this.peerMuteLabel); + } + } } - onRemoteMuted(isEnabled) { - const peerStateDiv = this.element.querySelector('#peer_state'); + onRemoteVideoMuted(isEnabled) { if (isEnabled) { - peerStateDiv.classList.add(classes['invisible']); + this.remoteMediaViewDiv.classList.remove(classes['videoHidden']); + if (!hasClassName(this.peerStateDiv, classes['invisible'])) { + this.peerStateDiv.classList.add(classes['invisible']); + this.peerStateDiv.removeChild(this.peerVideoMuteIcon); + this.peerStateDiv.removeChild(this.peerVideoMuteLabel); + } else{ + this.peerStateDiv.removeChild(this.peerVideoMuteIcon); + this.peerStateDiv.removeChild(this.peerVideoMuteLabel); + } } else { - peerStateDiv.classList.remove(classes['invisible']); + this.remoteMediaViewDiv.classList.add(classes['videoHidden']); + if (hasClassName(this.peerStateDiv, classes['invisible'])) { + this.peerStateDiv.classList.remove(classes['invisible']); + this.peerStateDiv.appendChild(this.peerVideoMuteIcon); + this.peerStateDiv.appendChild(this.peerVideoMuteLabel); + } else{ + this.peerStateDiv.appendChild(this.peerVideoMuteIcon); + this.peerStateDiv.appendChild(this.peerVideoMuteLabel); + } } } diff --git a/lib/views/DialView.js b/lib/views/DialView.js index 6222f6d..2a388de 100644 --- a/lib/views/DialView.js +++ b/lib/views/DialView.js @@ -13,6 +13,7 @@ export default class DialView extends BaseElement { className: `${classes['container']} ${classes['column']} ${classes['center']} ${classes['view']} ${classes['viewDial']}`, args }); + this.args = args; } onLoaded() { @@ -35,7 +36,7 @@ export default class DialView extends BaseElement { const peerId = createInput({ id: 'peer_id', - className: `${classes['field']} ${classes['fontNormal']}`, + className: `${classes['field']} ${classes['fontNormal']} ${classes['dialField']}`, placeholder: 'Enter user ID' }); diff --git a/lib/views/Settings.js b/lib/views/Settings.js index 8e9161a..a2972e1 100644 --- a/lib/views/Settings.js +++ b/lib/views/Settings.js @@ -14,6 +14,7 @@ export default class Settings extends BaseElement { this.microphone = null; this.speaker = null; this.camera = null; + this.args = args; } onLoaded() { @@ -40,11 +41,16 @@ export default class Settings extends BaseElement { cover.onclick = () => { this.remove(); }; - const popup = createDiv({ id: 'settings_popup', className: classes['popup'] }); + let popup; + if (this.args.isWidget) { + popup = createDiv({ id: 'settings_popup', className: `${classes['popup']} ${classes['widgetpopup']}` }); + } else { + popup = createDiv({ id: 'settings_popup', className: classes['popup'] }); + } const popupHeader = createDiv({ id: 'settings_popup_header', - className: `${classes['popupHeader']}, ${classes['row']} ${classes['center']}` + className: `${classes['popupHeader']}` }); const popupTitle = createDiv({ diff --git a/views/index.html b/views/index.html index 41a00b2..e90ab7e 100644 --- a/views/index.html +++ b/views/index.html @@ -11,20 +11,40 @@
- Sendbird horizontal logo svg icon + Sendbird horizontal logo svg icon
- Calls Sample + Sendbird Calls Quickstart
- diff --git a/views/widget.html b/views/widget.html index 50a1f2e..f8d3869 100644 --- a/views/widget.html +++ b/views/widget.html @@ -11,21 +11,21 @@
Sendbird horizontal logo svg icon -
- Voice Sample Login +
+ Sendbird Calls Quickstart
- This is the Voice Sample page. To try our - Voice widget, please click the button below. + This is the Sendbird Calls Quickstart page.
+ To try our widget, please click the button below.
arrow-down-right
-
+
😀
tooltip-tail-down
From 95ec783fad89b0af94b607cace92b051f48288b3 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Fri, 5 Jun 2020 15:59:11 +0900 Subject: [PATCH 18/64] [CALLS-534]widget Sample App Design Improvements 1. fixed disign issue 2. add application information menu --- envs.js | 5 +--- lib/css/styles.js | 1 + lib/views/CallView.js | 55 +++++++++---------------------------------- 3 files changed, 13 insertions(+), 48 deletions(-) diff --git a/envs.js b/envs.js index 72e3736..a6bcd54 100644 --- a/envs.js +++ b/envs.js @@ -1,7 +1,4 @@ -// export const TEST_APP_ID = BUILD_APP_ID || undefined; -// export const TEST_APP_ID = "6C53468D-A6AB-4160-B586-7F5DB1DBF1D4"; -export const TEST_APP_ID = "7768FD30-5639-48BC-8B25-F5211F3DFEBB"; -// export const TEST_APP_ID = "80ED633C-5301-4BEB-B1DC-0605A395DFAC"; +export const TEST_APP_ID = BUILD_APP_ID || undefined; export const USER_ID = undefined; export const ACCESS_TOKEN = undefined; export const IS_ACCESS_TOKEN_NEEDED = false; diff --git a/lib/css/styles.js b/lib/css/styles.js index 28cd1bf..78594c8 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -808,6 +808,7 @@ const styles = { left: '16px', width: '200px', height: '150px', + backgroundColor: colors.navy300, transition: 'all 1s' }, diff --git a/lib/views/CallView.js b/lib/views/CallView.js index bf3d0f5..1fa4873 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -14,12 +14,6 @@ export default class CallView extends BaseElement { this.state = state; this.connected = false; - this.peerStateDiv = null; - this.peerMuteIcon = null; - this.peerMuteLabel = null; - this.peerVideoMuteIcon = null; - this.peerVideoMuteLabel = null; - this.addCallListeners(call); } @@ -50,11 +44,11 @@ export default class CallView extends BaseElement { innerText: connectionText }); - this.peerStateDiv = createDiv({ id: 'peer_state', className: `${classes['column']} ${classes['peerStateDiv']} ${classes['invisible']}` }); - this.peerMuteIcon = createDiv({ id: 'peer_mute_icon', className: `${classes['peerMuteIcon']}` }); - this.peerMuteLabel = createLabel({ id: 'peer_mute_label', className: `${classes['peerMuteLabel']} ${classes['fontSmall']}`, innerText: `${remoteUser.userId} audio muted this call` }); - this.peerVideoMuteIcon = createDiv({ id: 'peer_video_mute_icon', className: `${classes['peerVideoMuteIcon']}` }); - this.peerVideoMuteLabel = createLabel({ id: 'peer_video_mute_label', className: `${classes['peerVideoMuteLabel']} ${classes['fontSmall']}`, innerText: 'The other person’s camera has been turned off.' }); + const peerStateDiv = createDiv({ id: 'peer_state', className: `${classes['column']} ${classes['peerStateDiv']} ${classes['invisible']}` }); + const peerMuteIcon = createDiv({ id: 'peer_mute_icon', className: `${classes['peerMuteIcon']}` }); + const peerMuteLabel = createLabel({ id: 'peer_mute_label', className: `${classes['peerMuteLabel']} ${classes['fontSmall']}`, innerText: `${remoteUser.userId} audio muted this call` }); + peerStateDiv.appendChild(peerMuteIcon); + peerStateDiv.appendChild(peerMuteLabel); const buttons = new CallButtons({ call: this.call @@ -85,7 +79,7 @@ export default class CallView extends BaseElement { foreground.appendChild(this.peerProfile); foreground.appendChild(this.peerName); foreground.appendChild(this.connectionInfo); - foreground.appendChild(this.peerStateDiv); + foreground.appendChild(peerStateDiv); this.element.appendChild(background); this.element.appendChild(foreground); @@ -145,48 +139,19 @@ export default class CallView extends BaseElement { } onRemoteAudioMuted(isEnabled) { + const peerStateDiv = this.element.querySelector('#peer_state'); if (isEnabled) { - if (!hasClassName(this.peerStateDiv, classes['invisible'])) { - this.peerStateDiv.classList.add(classes['invisible']); - this.peerStateDiv.removeChild(this.peerMuteIcon); - this.peerStateDiv.removeChild(this.peerMuteLabel); - } else{ - this.peerStateDiv.removeChild(this.peerMuteIcon); - this.peerStateDiv.removeChild(this.peerMuteLabel); - } + peerStateDiv.classList.add(classes['invisible']); } else { - if (hasClassName(this.peerStateDiv, classes['invisible'])) { - this.peerStateDiv.classList.remove(classes['invisible']); - this.peerStateDiv.appendChild(this.peerMuteIcon); - this.peerStateDiv.appendChild(this.peerMuteLabel); - } else { - this.peerStateDiv.appendChild(this.peerMuteIcon); - this.peerStateDiv.appendChild(this.peerMuteLabel); - } + peerStateDiv.classList.remove(classes['invisible']); } } onRemoteVideoMuted(isEnabled) { if (isEnabled) { this.remoteMediaViewDiv.classList.remove(classes['videoHidden']); - if (!hasClassName(this.peerStateDiv, classes['invisible'])) { - this.peerStateDiv.classList.add(classes['invisible']); - this.peerStateDiv.removeChild(this.peerVideoMuteIcon); - this.peerStateDiv.removeChild(this.peerVideoMuteLabel); - } else{ - this.peerStateDiv.removeChild(this.peerVideoMuteIcon); - this.peerStateDiv.removeChild(this.peerVideoMuteLabel); - } } else { this.remoteMediaViewDiv.classList.add(classes['videoHidden']); - if (hasClassName(this.peerStateDiv, classes['invisible'])) { - this.peerStateDiv.classList.remove(classes['invisible']); - this.peerStateDiv.appendChild(this.peerVideoMuteIcon); - this.peerStateDiv.appendChild(this.peerVideoMuteLabel); - } else{ - this.peerStateDiv.appendChild(this.peerVideoMuteIcon); - this.peerStateDiv.appendChild(this.peerVideoMuteLabel); - } } } @@ -238,7 +203,9 @@ export default class CallView extends BaseElement { toggleVideo() { if (this.call.isLocalVideoEnabled) { this.call.stopVideo(); + this.localMediaView.classList.add(classes['videoHidden']); } else { + this.localMediaView.classList.remove(classes['videoHidden']); this.call.startVideo(); } } From 4f7864adda0cbe4b6def16c5678bef42448bba36 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Fri, 5 Jun 2020 16:41:19 +0900 Subject: [PATCH 19/64] [CALLS-534]widget Sample App Design Improvements small video view add border radius. --- lib/css/styles.js | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/css/styles.js b/lib/css/styles.js index 78594c8..837f60f 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -808,6 +808,7 @@ const styles = { left: '16px', width: '200px', height: '150px', + borderRadius: '8px', backgroundColor: colors.navy300, transition: 'all 1s' }, From 651d9772e530edd2bf0725717ea51bbfcddab430 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Fri, 12 Jun 2020 18:16:36 +0900 Subject: [PATCH 20/64] [CALLS-534]widget Sample App Design Improvements apply review. --- lib/css/styles.js | 8 ++++---- views/index.html | 15 +++------------ 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/lib/css/styles.js b/lib/css/styles.js index 837f60f..093fd0c 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -831,12 +831,12 @@ const styles = { }, btnDecline: { - backgroundColor: 'rgba(0, 0, 0, 0.12)', - backgroundImage: `url(${declineWhiteIcon})`, + backgroundColor: '#e53157', + backgroundImage: `url(${endIcon})`, backgroundRepeat: 'no-repeat', backgroundPosition: 'center', '&:hover' : { - backgroundColor: 'rgba(0, 0, 0, 0.38)', + backgroundColor: '#a30e2d', } }, @@ -844,7 +844,7 @@ const styles = { btnClose: { width: '248px', - height: '64px', + height: '48px', border: 'none', borderRadius: '4px', marginBottom: '28px', diff --git a/views/index.html b/views/index.html index e90ab7e..3303f01 100644 --- a/views/index.html +++ b/views/index.html @@ -12,7 +12,7 @@
Sendbird horizontal logo svg icon -
+
Sendbird Calls Quickstart
@@ -24,7 +24,7 @@ Full-screen
- Make a call using a full-screen type. Lorem ipsum dolor sit amet, di os consectetur. + Make a call using a full-screen type.
@@ -33,18 +33,9 @@ Widget
- Make a call using a widget type. Lorem ipsum dolor sit amet, di os consectetur. + Make a call using a widget type.
- - - -
From c6d24d18f18bcc923e31e68eb47cbf6e92b88eee Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Fri, 12 Jun 2020 18:24:47 +0900 Subject: [PATCH 21/64] [CALLS-534] widget Sample App Design Improvements apply review --- lib/css/styles.js | 6 +++--- lib/views/CallButtons.js | 4 ---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/lib/css/styles.js b/lib/css/styles.js index 093fd0c..61b2d7d 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -831,12 +831,12 @@ const styles = { }, btnDecline: { - backgroundColor: '#e53157', - backgroundImage: `url(${endIcon})`, + backgroundColor: 'rgba(0, 0, 0, 0.12)', + backgroundImage: `url(${declineWhiteIcon})`, backgroundRepeat: 'no-repeat', backgroundPosition: 'center', '&:hover' : { - backgroundColor: '#a30e2d', + backgroundColor: 'rgba(0, 0, 0, 0.38)', } }, diff --git a/lib/views/CallButtons.js b/lib/views/CallButtons.js index 1575ab3..e4fbf7e 100644 --- a/lib/views/CallButtons.js +++ b/lib/views/CallButtons.js @@ -128,8 +128,6 @@ export default class CallButtons extends BaseElement { setAccepting() { this.hideActiveButtons(); this.showButtons(this.endBtn); - - replaceClassName(this.endBtn.icon, classes['btnDecline'], classes['btnEnd']); } setDialing() { @@ -140,8 +138,6 @@ export default class CallButtons extends BaseElement { setRinging() { this.hideActiveButtons(); this.showButtons(this.muteBtn, this.videoBtn, this.acceptBtn, this.endBtn); - - replaceClassName(this.endBtn.icon, classes['btnEnd'], classes['btnDecline']); } setConnected() { From 469f7b003d0b896a782c39bf72cba3a9cd3e1941 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Fri, 12 Jun 2020 18:50:43 +0900 Subject: [PATCH 22/64] [CALLS-534]widget Sample App Design Improvements remove place holder text --- views/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/index.html b/views/index.html index 3303f01..32f73a2 100644 --- a/views/index.html +++ b/views/index.html @@ -24,7 +24,7 @@ Full-screen
- Make a call using a full-screen type. + Make a call using a full-screen type.
@@ -33,7 +33,7 @@ Widget
- Make a call using a widget type. + Make a call using a widget type.
From bea207b11ce75244c857f9ae44b1424a87a5d877 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 14:11:40 +0900 Subject: [PATCH 23/64] [CALLS-534]widget Sample App Design Improvements apply review --- css/main.css | 367 ++++++++++++++++++++---------------------- lib/views/CallView.js | 3 +- views/index.html | 16 +- 3 files changed, 186 insertions(+), 200 deletions(-) diff --git a/css/main.css b/css/main.css index c2989a9..16de1de 100644 --- a/css/main.css +++ b/css/main.css @@ -1,112 +1,126 @@ :root { - --navy-50: #f6f8fc; - --navy-100: #dee2f2; - --navy-200: #c9d0e6; - --navy-900: #212242; - --white: #ffffff; - --purple-300: #825eeb; - --green-300: #1fcca1; - --green-400: #00998c; - --red-300: #f24d6b; - --red-400: #d92148; - --mute-gray: rgba(255, 255, 255, 0.2); + --navy-50: #f6f8fc; + --navy-100: #dee2f2; + --navy-200: #c9d0e6; + --navy-600: #595e8a; + --navy-900: #212242; + --white: #ffffff; + --purple-300: #825eeb; + --green-300: #1fcca1; + --green-400: #00998c; + --red-300: #f24d6b; + --red-400: #d92148; + --mute-gray: rgba(255, 255, 255, 0.2); } body { - margin: 0 auto; - overflow: hidden; + margin: 0 auto; + overflow: hidden; } .center { - align-items: center; - justify-content: center; + align-items: center; + justify-content: center; } .column { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .row { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .row-reverse { - display:flex; - flex-direction: row-reverse; + display:flex; + flex-direction: row-reverse; } .margin-top-24 { - margin-top: 24px; + margin-top: 24px; } .margin-right-24 { - margin-right: 24px; + margin-right: 24px; } .btn { - display: flex; - cursor: pointer; - align-items: center; - justify-content: center; - text-decoration: none; - border-radius: 4px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; - text-align: center; - height: 40px; + display: flex; + cursor: pointer; + align-items: center; + justify-content: center; + text-decoration: none; + border-radius: 4px; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: normal; + text-align: center; + height: 40px; } .btn-primary { - background-color: var(--purple-300); - color: var(--white); + background-color: var(--purple-300); + color: var(--white); } .btn.btn-big { - width: 180px; - height: 50px; - margin-left: 16px; - margin-right: 16px; + width: 180px; + height: 50px; + margin-left: 16px; + margin-right: 16px; } .btn.btn-mid { - width: 80px; - height: 40px; - margin-bottom: 23px; - margin-left: 10px; + width: 80px; + height: 40px; + margin-bottom: 23px; + margin-left: 10px; } .btn-block { - width: 100%; + width: 100%; +} + +.title-choice-type { + width: 92px; + height: 20px; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: -0.1px; + color: var(--navy-600); } -.choose-background { - display: inline-block; - width: 260px; - height: 158px; - border-radius: 4px; - border: solid 1px #dee2f2; - background-color: var(--white); - cursor: pointer; +.choice-item { + display: inline-block; + width: 260px; + height: 158px; + border-radius: 4px; + border: solid 1px #dee2f2; + background-color: var(--white); + cursor: pointer; } -.choose-background:hover { +.choice-item:hover { border: solid 1px var(--purple-300); } -.choose-title { +.title-choice-item { margin: 24px 24px 8px 24px; width: 88px; height: 24px; font-family: Avenir Next; font-size: 18px; - font-weight: 500; + font-weight: normal; font-stretch: normal; font-style: normal; line-height: 1.33; @@ -114,7 +128,7 @@ body { color: var(--navy-900); } -.choose-desc { +.desc-choice-item { width: 212px; height: 60px; margin-left: 24px; @@ -125,20 +139,20 @@ body { font-style: normal; line-height: 1.43; letter-spacing: -0.1px; - color: #595e8a; + color: var(--navy-600); } .title { - height: 32px; - font-family: Avenir Next; - font-size: 24px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.33; - letter-spacing: -0.25px; - color: inherit; + height: 32px; + font-family: Avenir Next; + font-size: 24px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.33; + letter-spacing: -0.25px; + color: inherit; } .demi { @@ -146,156 +160,129 @@ body { } .input-title { - display: inline-block; - margin-top: 6px; - height: 12px; - font-family: Avenir Next; - font-size: 12px; - font-weight: 500; - font-stretch: normal; - font-style: normal; - line-height: 1; - letter-spacing: normal; - color: var(--navy-900); - margin-bottom: 6px; + display: inline-block; + margin-top: 6px; + height: 12px; + font-family: Avenir Next; + font-size: 12px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1; + letter-spacing: normal; + color: var(--navy-900); + margin-bottom: 6px; } .input-title:first-of-type { - margin-top: 38px; + margin-top: 38px; } .desc { - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: -0.1px; - color: #595e8a; -} - -.desc-light { - width: 100%; - height: 20px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; - text-align: center; - letter-spacing: -0.1px; - color: #595e8a; - margin-bottom: 24px; -} - -.desc-quick { - width: 275px; - height: 32px; font-family: Avenir Next; - font-size: 24px; - font-weight: 600; + font-size: 14px; font-weight: normal; font-stretch: normal; font-style: normal; - line-height: 1.33; - letter-spacing: -0.25px; - color: var(--navy-900); + line-height: 1.43; + letter-spacing: -0.1px; + color: var(--navy-600); } -.choose-a-type { - width: 92px; +.desc-light { + width: 100%; height: 20px; font-family: Avenir Next; font-size: 14px; - font-weight: 500; + font-weight: normal; font-stretch: normal; font-style: normal; line-height: 1.43; + letter-spacing: normal; + text-align: center; letter-spacing: -0.1px; - color: #595e8a; + color: var(--navy-600); + margin-bottom: 24px; } .smile-face { - margin-top: 32px; - margin-bottom: 16px; - width: 40px; - height: 40px; - font-family: AppleColorEmoji; - font-size: 40px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1; - letter-spacing: normal; - color: var(--white); + margin-top: 32px; + margin-bottom: 16px; + width: 40px; + height: 40px; + font-family: AppleColorEmoji; + font-size: 40px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1; + letter-spacing: normal; + color: var(--white); } .wrapper { - display: flex; - width: 100vw; - height: 100vh; - overflow: hidden; + display: flex; + width: 100vw; + height: 100vh; + overflow: hidden; } .container { - display: flex; - width: 100%; - height: 100%; + display: flex; + width: 100%; + height: 100%; } .backdrop { - -webkit-backdrop-filter: blur(2px); - backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + backdrop-filter: blur(2px); } .bg-white { - background-color: var(--white); - color: var(--navy-900); + background-color: var(--white); + color: var(--navy-900); } .bg-light { - background-color: var(--navy-50); - color: var(--navy-900); + background-color: var(--navy-50); + color: var(--navy-900); } .bg-dark { - background-color: var(--navy-900); - color: var(--white); + background-color: var(--navy-900); + color: var(--white); } .bg-white .desc { - color: #595e8a; + color: var(--navy-600); } .bg-light .desc { - color: #595e8a; + color: var(--navy-600); } .bg-dark .desc { - color: var(--white); + color: var(--white); } .hidden { - display: none; + display: none; } .invisible { - visibility: hidden; + visibility: hidden; } button label { - cursor: inherit; + cursor: inherit; } .ic-logo-horizontal-purple-300 { - display: block; - width: 180px; - height: 40px; - background: url("../img/ic-logo-horizontal-purple-300.svg"); - margin-bottom: 24px; + display: block; + width: 180px; + height: 40px; + background: url("../img/ic-logo-horizontal-purple-300.svg"); + margin-bottom: 24px; } .ic-logo-horizontal { @@ -307,51 +294,51 @@ button label { } .voice-sample-page { - height: 32px; - margin-bottom: 16px; - text-align: center; + height: 32px; + margin-bottom: 16px; + text-align: center; } .voice-sample-desc { - width: 308px; - height: 40px; - margin-bottom: 28px; - text-align: center; + width: 308px; + height: 40px; + margin-bottom: 28px; + text-align: center; } .ic-arrow-down-right-24 { - display: block; - width: 32px; - height: 32px; - object-fit: contain; + display: block; + width: 32px; + height: 32px; + object-fit: contain; } .widget-tooltip { - position: absolute; - right: 18px; - bottom: 112px; - width: 296px; - height: 108px; - border-radius: 4px; - box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); - border: solid 1px #c9d0e6; + position: absolute; + right: 18px; + bottom: 112px; + width: 296px; + height: 108px; + border-radius: 4px; + box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); + border: solid 1px #c9d0e6; } .img-tooltip-tail-down { - position: absolute; - right: 16px; - bottom: -8px; - width: 0; - height: 0; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-top: 8px solid white; + position: absolute; + right: 16px; + bottom: -8px; + width: 0; + height: 0; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 8px solid white; } .widget { - position: absolute; - right: 16px; - bottom: 16px; + position: absolute; + right: 16px; + bottom: 16px; } ::-webkit-scrollbar { diff --git a/lib/views/CallView.js b/lib/views/CallView.js index 1fa4873..6ca1b5d 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -116,8 +116,7 @@ export default class CallView extends BaseElement { this.showSecondaryInfo(); } - - console.log(endedCall.getCallLog); + this.sendToChildren('ended'); }; diff --git a/views/index.html b/views/index.html index 32f73a2..7849e0c 100644 --- a/views/index.html +++ b/views/index.html @@ -12,27 +12,27 @@
Sendbird horizontal logo svg icon -
+
Sendbird Calls Quickstart
-
+
Choose a type
-
-
+
+
Full-screen
-
+
Make a call using a full-screen type.
-
-
+
+
Widget
-
+
Make a call using a widget type.
From eaa4516725eafc8c0e8b7e204d277561248ab446 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 16:03:15 +0900 Subject: [PATCH 24/64] [CALLS-534]widget Sample App Design Improvements apply review --- css/main.css | 66 ++++------------- img/ic-logo-horizontal-purple-300.svg | 3 - .../{ic-call-filled.svg => ic-call-white.svg} | 0 lib/css/styles.js | 17 +---- views/index.html | 70 +++++++++---------- views/widget.html | 2 +- 6 files changed, 49 insertions(+), 109 deletions(-) delete mode 100644 img/ic-logo-horizontal-purple-300.svg rename lib/assets/{ic-call-filled.svg => ic-call-white.svg} (100%) diff --git a/css/main.css b/css/main.css index 16de1de..cfc6453 100644 --- a/css/main.css +++ b/css/main.css @@ -16,6 +16,13 @@ body { margin: 0 auto; overflow: hidden; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: normal; } .center { @@ -46,6 +53,10 @@ body { margin-right: 24px; } +.font-weight-demi { + font-weight: 600; +} + .btn { display: flex; cursor: pointer; @@ -53,13 +64,6 @@ body { justify-content: center; text-decoration: none; border-radius: 4px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; text-align: center; height: 40px; } @@ -90,12 +94,6 @@ body { .title-choice-type { width: 92px; height: 20px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; letter-spacing: -0.1px; color: var(--navy-600); } @@ -118,11 +116,7 @@ body { margin: 24px 24px 8px 24px; width: 88px; height: 24px; - font-family: Avenir Next; font-size: 18px; - font-weight: normal; - font-stretch: normal; - font-style: normal; line-height: 1.33; letter-spacing: -0.25px; color: var(--navy-900); @@ -132,12 +126,6 @@ body { width: 212px; height: 60px; margin-left: 24px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; letter-spacing: -0.1px; color: var(--navy-600); } @@ -145,31 +133,18 @@ body { .title { height: 32px; - font-family: Avenir Next; font-size: 24px; - font-weight: normal; - font-stretch: normal; - font-style: normal; line-height: 1.33; letter-spacing: -0.25px; color: inherit; } -.demi { - font-weight: 600; -} - .input-title { display: inline-block; margin-top: 6px; height: 12px; - font-family: Avenir Next; font-size: 12px; - font-weight: normal; - font-stretch: normal; - font-style: normal; line-height: 1; - letter-spacing: normal; color: var(--navy-900); margin-bottom: 6px; } @@ -179,12 +154,6 @@ body { } .desc { - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; letter-spacing: -0.1px; color: var(--navy-600); } @@ -192,13 +161,6 @@ body { .desc-light { width: 100%; height: 20px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; text-align: center; letter-spacing: -0.1px; color: var(--navy-600); @@ -212,11 +174,7 @@ body { height: 40px; font-family: AppleColorEmoji; font-size: 40px; - font-weight: normal; - font-stretch: normal; - font-style: normal; line-height: 1; - letter-spacing: normal; color: var(--white); } @@ -281,7 +239,7 @@ button label { display: block; width: 180px; height: 40px; - background: url("../img/ic-logo-horizontal-purple-300.svg"); + background: url("../img/ic-logo-horizontal.svg"); margin-bottom: 24px; } diff --git a/img/ic-logo-horizontal-purple-300.svg b/img/ic-logo-horizontal-purple-300.svg deleted file mode 100644 index 1c3c7d4..0000000 --- a/img/ic-logo-horizontal-purple-300.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/lib/assets/ic-call-filled.svg b/lib/assets/ic-call-white.svg similarity index 100% rename from lib/assets/ic-call-filled.svg rename to lib/assets/ic-call-white.svg diff --git a/lib/css/styles.js b/lib/css/styles.js index 61b2d7d..0a6ad83 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -19,7 +19,7 @@ import declineBlackIcon from '../assets/ic-decline-black.svg'; import endIcon from '../assets/ic-callkit-end.svg'; import toastErrorIcon from '../assets/ic-error-20.svg'; import toastCloseBtn from '../assets/ic-close-20.svg'; -import widgetIcon from '../assets/ic-call-filled.svg'; +import widgetIcon from '../assets/ic-call-white.svg'; import settingsIcon from '../assets/ic-settings.svg'; import settingsCloseIcon from '../assets/ic-close-black-20.svg'; import widgetCloseIcon from '../assets/ic-close-24.svg'; @@ -225,7 +225,6 @@ const styles = { /*** views ***/ view: { boxSizing: 'border-box', - // width: '100vw', width: '100%', height: '100%', padding: '24px', @@ -379,8 +378,6 @@ const styles = { lineHeight: 'normal', letterSpacing: 'normal', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, fontNormal: { @@ -392,8 +389,6 @@ const styles = { lineHeight: '1.43', letterSpacing: 'normal', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, fontMidBig: { @@ -405,8 +400,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, font16: { @@ -418,8 +411,6 @@ const styles = { lineHeight: '1.25', letterSpacing: '-0.15px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, font20: { @@ -430,8 +421,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, font24: { @@ -443,8 +432,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, fontBig: { @@ -457,8 +444,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, fontHeavy: { diff --git a/views/index.html b/views/index.html index 7849e0c..aebafaf 100644 --- a/views/index.html +++ b/views/index.html @@ -1,44 +1,44 @@ - - - - - Sample - + + + + + Sample + - -
-
- Sendbird horizontal logo svg icon -
- Sendbird Calls Quickstart -
-
- Choose a type -
-
-
-
- Full-screen + +
+
+ Sendbird horizontal logo svg icon +
+ Sendbird Calls Quickstart +
+
+ Choose a type +
+
+
+
+ Full-screen +
+
+ Make a call using a full-screen type. +
-
- Make a call using a full-screen type. -
-
-
-
- Widget -
-
- Make a call using a widget type. +
+
+ Widget +
+
+ Make a call using a widget type. +
-
-
-
-
- +
+
+
+ diff --git a/views/widget.html b/views/widget.html index f8d3869..3a0437b 100644 --- a/views/widget.html +++ b/views/widget.html @@ -10,7 +10,7 @@
- Sendbird horizontal logo svg icon + Sendbird horizontal logo svg icon
Sendbird Calls Quickstart
From 4a106807dec3a2c77240798bfd2991272d0322ce Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 18:07:25 +0900 Subject: [PATCH 25/64] rollback_#1 rollback_#1 --- views/index.html | 62 ++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/views/index.html b/views/index.html index 7849e0c..c6e942c 100644 --- a/views/index.html +++ b/views/index.html @@ -2,43 +2,43 @@ - - - - Sample + + + + Sample -
-
- Sendbird horizontal logo svg icon -
- Sendbird Calls Quickstart -
-
- Choose a type -
-
-
-
- Full-screen -
-
- Make a call using a full-screen type. -
-
+
+
+ Sendbird horizontal logo svg icon +
+ Sendbird Calls Quickstart +
+
+ Choose a type +
+
+
+
+ Full-screen +
+
+ Make a call using a full-screen type. +
+
-
-
- Widget -
-
- Make a call using a widget type. -
-
-
+
+
+ Widget +
+
+ Make a call using a widget type. +
+
+
From 5eedc69c1c15e8564db79af64e45a4ad6addbaaa Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 18:14:57 +0900 Subject: [PATCH 26/64] Update index.html --- views/index.html | 62 ++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/views/index.html b/views/index.html index aebafaf..5766663 100644 --- a/views/index.html +++ b/views/index.html @@ -2,43 +2,43 @@ - - - - Sample + + + + Sample -
-
- Sendbird horizontal logo svg icon -
- Sendbird Calls Quickstart -
-
- Choose a type -
-
-
-
- Full-screen -
-
- Make a call using a full-screen type. -
-
+
+
+ Sendbird horizontal logo svg icon +
+ Sendbird Calls Quickstart +
+
+ Choose a type +
+
+
+
+ Full-screen +
+
+ Make a call using a full-screen type. +
+
-
-
- Widget -
-
- Make a call using a widget type. -
-
-
+
+
+ Widget +
+
+ Make a call using a widget type. +
+
+
From 402171271350a9091d28af1f658883e3c531cc8a Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 18:24:40 +0900 Subject: [PATCH 27/64] [CALLS-534]widget Sample App Design Improvements rollback_again_#1 --- css/main.css | 352 ++++++++++++++++++++++++------------------ lib/views/CallView.js | 3 +- views/index.html | 44 +++--- 3 files changed, 225 insertions(+), 174 deletions(-) diff --git a/css/main.css b/css/main.css index cfc6453..a2f0e2a 100644 --- a/css/main.css +++ b/css/main.css @@ -1,56 +1,48 @@ :root { - --navy-50: #f6f8fc; - --navy-100: #dee2f2; - --navy-200: #c9d0e6; - --navy-600: #595e8a; - --navy-900: #212242; - --white: #ffffff; - --purple-300: #825eeb; - --green-300: #1fcca1; - --green-400: #00998c; - --red-300: #f24d6b; - --red-400: #d92148; - --mute-gray: rgba(255, 255, 255, 0.2); + --navy-50: #f6f8fc; + --navy-100: #dee2f2; + --navy-200: #c9d0e6; + --navy-900: #212242; + --white: #ffffff; + --purple-300: #825eeb; + --green-300: #1fcca1; + --green-400: #00998c; + --red-300: #f24d6b; + --red-400: #d92148; + --mute-gray: rgba(255, 255, 255, 0.2); } body { - margin: 0 auto; - overflow: hidden; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; + margin: 0 auto; + overflow: hidden; } .center { - align-items: center; - justify-content: center; + align-items: center; + justify-content: center; } .column { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .row { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .row-reverse { - display:flex; - flex-direction: row-reverse; + display:flex; + flex-direction: row-reverse; } .margin-top-24 { - margin-top: 24px; + margin-top: 24px; } .margin-right-24 { - margin-right: 24px; + margin-right: 24px; } .font-weight-demi { @@ -58,189 +50,245 @@ body { } .btn { - display: flex; - cursor: pointer; - align-items: center; - justify-content: center; - text-decoration: none; - border-radius: 4px; - text-align: center; - height: 40px; + display: flex; + cursor: pointer; + align-items: center; + justify-content: center; + text-decoration: none; + border-radius: 4px; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: normal; + text-align: center; + height: 40px; } .btn-primary { - background-color: var(--purple-300); - color: var(--white); + background-color: var(--purple-300); + color: var(--white); } .btn.btn-big { - width: 180px; - height: 50px; - margin-left: 16px; - margin-right: 16px; + width: 180px; + height: 50px; + margin-left: 16px; + margin-right: 16px; } .btn.btn-mid { - width: 80px; - height: 40px; - margin-bottom: 23px; - margin-left: 10px; + width: 80px; + height: 40px; + margin-bottom: 23px; + margin-left: 10px; } .btn-block { - width: 100%; -} - -.title-choice-type { - width: 92px; - height: 20px; - letter-spacing: -0.1px; - color: var(--navy-600); + width: 100%; } -.choice-item { - display: inline-block; - width: 260px; - height: 158px; - border-radius: 4px; - border: solid 1px #dee2f2; - background-color: var(--white); - cursor: pointer; +.choose-background { + display: inline-block; + width: 260px; + height: 158px; + border-radius: 4px; + border: solid 1px #dee2f2; + background-color: var(--white); + cursor: pointer; } -.choice-item:hover { +.choose-background:hover { border: solid 1px var(--purple-300); } -.title-choice-item { +.choose-title { margin: 24px 24px 8px 24px; width: 88px; height: 24px; font-size: 18px; + font-weight: 500; + font-stretch: normal; + font-style: normal; line-height: 1.33; letter-spacing: -0.25px; color: var(--navy-900); } -.desc-choice-item { +.choose-desc { width: 212px; height: 60px; margin-left: 24px; letter-spacing: -0.1px; - color: var(--navy-600); + color: #595e8a; } .title { - height: 32px; - font-size: 24px; - line-height: 1.33; - letter-spacing: -0.25px; - color: inherit; + height: 32px; + font-family: Avenir Next; + font-size: 24px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.33; + letter-spacing: -0.25px; + color: inherit; } .input-title { - display: inline-block; - margin-top: 6px; - height: 12px; - font-size: 12px; - line-height: 1; - color: var(--navy-900); - margin-bottom: 6px; + display: inline-block; + margin-top: 6px; + height: 12px; + font-family: Avenir Next; + font-size: 12px; + font-weight: 500; + font-stretch: normal; + font-style: normal; + line-height: 1; + letter-spacing: normal; + color: var(--navy-900); + margin-bottom: 6px; } .input-title:first-of-type { - margin-top: 38px; + margin-top: 38px; } .desc { - letter-spacing: -0.1px; - color: var(--navy-600); + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: -0.1px; + color: #595e8a; } .desc-light { - width: 100%; + width: 100%; + height: 20px; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: normal; + text-align: center; + letter-spacing: -0.1px; + color: #595e8a; + margin-bottom: 24px; +} + +.desc-quick { + width: 275px; + height: 32px; + font-family: Avenir Next; + font-size: 24px; + font-weight: 600; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.33; + letter-spacing: -0.25px; + color: var(--navy-900); +} + +.choose-a-type { + width: 92px; height: 20px; - text-align: center; + font-family: Avenir Next; + font-size: 14px; + font-weight: 500; + font-stretch: normal; + font-style: normal; + line-height: 1.43; letter-spacing: -0.1px; - color: var(--navy-600); - margin-bottom: 24px; + color: #595e8a; } .smile-face { - margin-top: 32px; - margin-bottom: 16px; - width: 40px; - height: 40px; - font-family: AppleColorEmoji; - font-size: 40px; - line-height: 1; - color: var(--white); + margin-top: 32px; + margin-bottom: 16px; + width: 40px; + height: 40px; + font-family: AppleColorEmoji; + font-size: 40px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1; + letter-spacing: normal; + color: var(--white); } .wrapper { - display: flex; - width: 100vw; - height: 100vh; - overflow: hidden; + display: flex; + width: 100vw; + height: 100vh; + overflow: hidden; } .container { - display: flex; - width: 100%; - height: 100%; + display: flex; + width: 100%; + height: 100%; } .backdrop { - -webkit-backdrop-filter: blur(2px); - backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + backdrop-filter: blur(2px); } .bg-white { - background-color: var(--white); - color: var(--navy-900); + background-color: var(--white); + color: var(--navy-900); } .bg-light { - background-color: var(--navy-50); - color: var(--navy-900); + background-color: var(--navy-50); + color: var(--navy-900); } .bg-dark { - background-color: var(--navy-900); - color: var(--white); + background-color: var(--navy-900); + color: var(--white); } .bg-white .desc { - color: var(--navy-600); + color: #595e8a; } .bg-light .desc { - color: var(--navy-600); + color: #595e8a; } .bg-dark .desc { - color: var(--white); + color: var(--white); } .hidden { - display: none; + display: none; } .invisible { - visibility: hidden; + visibility: hidden; } button label { - cursor: inherit; + cursor: inherit; } .ic-logo-horizontal-purple-300 { - display: block; - width: 180px; - height: 40px; - background: url("../img/ic-logo-horizontal.svg"); - margin-bottom: 24px; + display: block; + width: 180px; + height: 40px; + background: url("../img/ic-logo-horizontal-purple-300.svg"); + margin-bottom: 24px; } .ic-logo-horizontal { @@ -252,51 +300,51 @@ button label { } .voice-sample-page { - height: 32px; - margin-bottom: 16px; - text-align: center; + height: 32px; + margin-bottom: 16px; + text-align: center; } .voice-sample-desc { - width: 308px; - height: 40px; - margin-bottom: 28px; - text-align: center; + width: 308px; + height: 40px; + margin-bottom: 28px; + text-align: center; } .ic-arrow-down-right-24 { - display: block; - width: 32px; - height: 32px; - object-fit: contain; + display: block; + width: 32px; + height: 32px; + object-fit: contain; } .widget-tooltip { - position: absolute; - right: 18px; - bottom: 112px; - width: 296px; - height: 108px; - border-radius: 4px; - box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); - border: solid 1px #c9d0e6; + position: absolute; + right: 18px; + bottom: 112px; + width: 296px; + height: 108px; + border-radius: 4px; + box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); + border: solid 1px #c9d0e6; } .img-tooltip-tail-down { - position: absolute; - right: 16px; - bottom: -8px; - width: 0; - height: 0; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-top: 8px solid white; + position: absolute; + right: 16px; + bottom: -8px; + width: 0; + height: 0; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 8px solid white; } .widget { - position: absolute; - right: 16px; - bottom: 16px; + position: absolute; + right: 16px; + bottom: 16px; } ::-webkit-scrollbar { diff --git a/lib/views/CallView.js b/lib/views/CallView.js index 6ca1b5d..1fa4873 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -116,7 +116,8 @@ export default class CallView extends BaseElement { this.showSecondaryInfo(); } - + + console.log(endedCall.getCallLog); this.sendToChildren('ended'); }; diff --git a/views/index.html b/views/index.html index 5766663..7efeab8 100644 --- a/views/index.html +++ b/views/index.html @@ -10,30 +10,32 @@
-
- Sendbird horizontal logo svg icon -
- Sendbird Calls Quickstart -
-
- Choose a type -
-
-
-
- Full-screen +
+ Sendbird horizontal logo svg icon +
+ Sendbird Calls Quickstart
-
- Make a call using a full-screen type. +
+ Choose a type
-
+
+
+
+ Full-screen +
+
+ Make a call using a full-screen type. +
+
-
-
- Widget -
-
- Make a call using a widget type. +
+
+ Widget +
+
+ Make a call using a widget type. +
+
From 6fef8f29e547884e76d35c37031fe1f8f7b72f86 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 18:30:42 +0900 Subject: [PATCH 28/64] [CALLS-534]widget Sample App Design Improvements change main.css indent --- css/main.css | 334 +++++++++++++++++++++++++-------------------------- 1 file changed, 167 insertions(+), 167 deletions(-) diff --git a/css/main.css b/css/main.css index a2f0e2a..c9fa750 100644 --- a/css/main.css +++ b/css/main.css @@ -1,48 +1,48 @@ :root { - --navy-50: #f6f8fc; - --navy-100: #dee2f2; - --navy-200: #c9d0e6; - --navy-900: #212242; - --white: #ffffff; - --purple-300: #825eeb; - --green-300: #1fcca1; - --green-400: #00998c; - --red-300: #f24d6b; - --red-400: #d92148; - --mute-gray: rgba(255, 255, 255, 0.2); + --navy-50: #f6f8fc; + --navy-100: #dee2f2; + --navy-200: #c9d0e6; + --navy-900: #212242; + --white: #ffffff; + --purple-300: #825eeb; + --green-300: #1fcca1; + --green-400: #00998c; + --red-300: #f24d6b; + --red-400: #d92148; + --mute-gray: rgba(255, 255, 255, 0.2); } body { - margin: 0 auto; - overflow: hidden; + margin: 0 auto; + overflow: hidden; } .center { - align-items: center; - justify-content: center; + align-items: center; + justify-content: center; } .column { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .row { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .row-reverse { - display:flex; - flex-direction: row-reverse; + display:flex; + flex-direction: row-reverse; } .margin-top-24 { - margin-top: 24px; + margin-top: 24px; } .margin-right-24 { - margin-right: 24px; + margin-right: 24px; } .font-weight-demi { @@ -50,54 +50,54 @@ body { } .btn { - display: flex; - cursor: pointer; - align-items: center; - justify-content: center; - text-decoration: none; - border-radius: 4px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; - text-align: center; - height: 40px; + display: flex; + cursor: pointer; + align-items: center; + justify-content: center; + text-decoration: none; + border-radius: 4px; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: normal; + text-align: center; + height: 40px; } .btn-primary { - background-color: var(--purple-300); - color: var(--white); + background-color: var(--purple-300); + color: var(--white); } .btn.btn-big { - width: 180px; - height: 50px; - margin-left: 16px; - margin-right: 16px; + width: 180px; + height: 50px; + margin-left: 16px; + margin-right: 16px; } .btn.btn-mid { - width: 80px; - height: 40px; - margin-bottom: 23px; - margin-left: 10px; + width: 80px; + height: 40px; + margin-bottom: 23px; + margin-left: 10px; } .btn-block { - width: 100%; + width: 100%; } .choose-background { - display: inline-block; - width: 260px; - height: 158px; - border-radius: 4px; - border: solid 1px #dee2f2; - background-color: var(--white); - cursor: pointer; + display: inline-block; + width: 260px; + height: 158px; + border-radius: 4px; + border: solid 1px #dee2f2; + background-color: var(--white); + cursor: pointer; } .choose-background:hover { @@ -127,61 +127,61 @@ body { .title { - height: 32px; - font-family: Avenir Next; - font-size: 24px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.33; - letter-spacing: -0.25px; - color: inherit; + height: 32px; + font-family: Avenir Next; + font-size: 24px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.33; + letter-spacing: -0.25px; + color: inherit; } .input-title { - display: inline-block; - margin-top: 6px; - height: 12px; - font-family: Avenir Next; - font-size: 12px; - font-weight: 500; - font-stretch: normal; - font-style: normal; - line-height: 1; - letter-spacing: normal; - color: var(--navy-900); - margin-bottom: 6px; + display: inline-block; + margin-top: 6px; + height: 12px; + font-family: Avenir Next; + font-size: 12px; + font-weight: 500; + font-stretch: normal; + font-style: normal; + line-height: 1; + letter-spacing: normal; + color: var(--navy-900); + margin-bottom: 6px; } .input-title:first-of-type { - margin-top: 38px; + margin-top: 38px; } .desc { - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: -0.1px; - color: #595e8a; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: -0.1px; + color: #595e8a; } .desc-light { - width: 100%; - height: 20px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; - text-align: center; - letter-spacing: -0.1px; - color: #595e8a; - margin-bottom: 24px; + width: 100%; + height: 20px; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: normal; + text-align: center; + letter-spacing: -0.1px; + color: #595e8a; + margin-bottom: 24px; } .desc-quick { @@ -212,83 +212,83 @@ body { } .smile-face { - margin-top: 32px; - margin-bottom: 16px; - width: 40px; - height: 40px; - font-family: AppleColorEmoji; - font-size: 40px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1; - letter-spacing: normal; - color: var(--white); + margin-top: 32px; + margin-bottom: 16px; + width: 40px; + height: 40px; + font-family: AppleColorEmoji; + font-size: 40px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1; + letter-spacing: normal; + color: var(--white); } .wrapper { - display: flex; - width: 100vw; - height: 100vh; - overflow: hidden; + display: flex; + width: 100vw; + height: 100vh; + overflow: hidden; } .container { - display: flex; - width: 100%; - height: 100%; + display: flex; + width: 100%; + height: 100%; } .backdrop { - -webkit-backdrop-filter: blur(2px); - backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + backdrop-filter: blur(2px); } .bg-white { - background-color: var(--white); - color: var(--navy-900); + background-color: var(--white); + color: var(--navy-900); } .bg-light { - background-color: var(--navy-50); - color: var(--navy-900); + background-color: var(--navy-50); + color: var(--navy-900); } .bg-dark { - background-color: var(--navy-900); - color: var(--white); + background-color: var(--navy-900); + color: var(--white); } .bg-white .desc { - color: #595e8a; + color: #595e8a; } .bg-light .desc { - color: #595e8a; + color: #595e8a; } .bg-dark .desc { - color: var(--white); + color: var(--white); } .hidden { - display: none; + display: none; } .invisible { - visibility: hidden; + visibility: hidden; } button label { - cursor: inherit; + cursor: inherit; } .ic-logo-horizontal-purple-300 { - display: block; - width: 180px; - height: 40px; - background: url("../img/ic-logo-horizontal-purple-300.svg"); - margin-bottom: 24px; + display: block; + width: 180px; + height: 40px; + background: url("../img/ic-logo-horizontal-purple-300.svg"); + margin-bottom: 24px; } .ic-logo-horizontal { @@ -300,51 +300,51 @@ button label { } .voice-sample-page { - height: 32px; - margin-bottom: 16px; - text-align: center; + height: 32px; + margin-bottom: 16px; + text-align: center; } .voice-sample-desc { - width: 308px; - height: 40px; - margin-bottom: 28px; - text-align: center; + width: 308px; + height: 40px; + margin-bottom: 28px; + text-align: center; } .ic-arrow-down-right-24 { - display: block; - width: 32px; - height: 32px; - object-fit: contain; + display: block; + width: 32px; + height: 32px; + object-fit: contain; } .widget-tooltip { - position: absolute; - right: 18px; - bottom: 112px; - width: 296px; - height: 108px; - border-radius: 4px; - box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); - border: solid 1px #c9d0e6; + position: absolute; + right: 18px; + bottom: 112px; + width: 296px; + height: 108px; + border-radius: 4px; + box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); + border: solid 1px #c9d0e6; } .img-tooltip-tail-down { - position: absolute; - right: 16px; - bottom: -8px; - width: 0; - height: 0; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-top: 8px solid white; + position: absolute; + right: 16px; + bottom: -8px; + width: 0; + height: 0; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 8px solid white; } .widget { - position: absolute; - right: 16px; - bottom: 16px; + position: absolute; + right: 16px; + bottom: 16px; } ::-webkit-scrollbar { From aee2995c7b14bd73c259a37c7c1e39bc4c6d76c4 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 19:12:42 +0900 Subject: [PATCH 29/64] [CALLS-534]widget Sample App Design Improvements last commit version --- css/main.css | 60 ++++++++++++----------------------------------- lib/css/styles.js | 15 ++++++++++++ views/index.html | 44 +++++++++++++++++----------------- views/widget.html | 2 +- 4 files changed, 52 insertions(+), 69 deletions(-) diff --git a/css/main.css b/css/main.css index c9fa750..a4111a9 100644 --- a/css/main.css +++ b/css/main.css @@ -15,6 +15,13 @@ body { margin: 0 auto; overflow: hidden; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: normal; } .center { @@ -56,13 +63,6 @@ body { justify-content: center; text-decoration: none; border-radius: 4px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; text-align: center; height: 40px; } @@ -90,7 +90,14 @@ body { width: 100%; } -.choose-background { +.title-choice-type { + width: 92px; + height: 20px; + letter-spacing: -0.1px; + color: var(--navy-600); +} + +.choice-item { display: inline-block; width: 260px; height: 158px; @@ -109,9 +116,6 @@ body { width: 88px; height: 24px; font-size: 18px; - font-weight: 500; - font-stretch: normal; - font-style: normal; line-height: 1.33; letter-spacing: -0.25px; color: var(--navy-900); @@ -128,11 +132,7 @@ body { .title { height: 32px; - font-family: Avenir Next; font-size: 24px; - font-weight: normal; - font-stretch: normal; - font-style: normal; line-height: 1.33; letter-spacing: -0.25px; color: inherit; @@ -142,13 +142,8 @@ body { display: inline-block; margin-top: 6px; height: 12px; - font-family: Avenir Next; font-size: 12px; - font-weight: 500; - font-stretch: normal; - font-style: normal; line-height: 1; - letter-spacing: normal; color: var(--navy-900); margin-bottom: 6px; } @@ -158,12 +153,6 @@ body { } .desc { - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; letter-spacing: -0.1px; color: #595e8a; } @@ -171,13 +160,6 @@ body { .desc-light { width: 100%; height: 20px; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; text-align: center; letter-spacing: -0.1px; color: #595e8a; @@ -218,11 +200,7 @@ body { height: 40px; font-family: AppleColorEmoji; font-size: 40px; - font-weight: normal; - font-stretch: normal; - font-style: normal; line-height: 1; - letter-spacing: normal; color: var(--white); } @@ -283,14 +261,6 @@ button label { cursor: inherit; } -.ic-logo-horizontal-purple-300 { - display: block; - width: 180px; - height: 40px; - background: url("../img/ic-logo-horizontal-purple-300.svg"); - margin-bottom: 24px; -} - .ic-logo-horizontal { display: block; width: 180px; diff --git a/lib/css/styles.js b/lib/css/styles.js index 0a6ad83..da60533 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -225,6 +225,7 @@ const styles = { /*** views ***/ view: { boxSizing: 'border-box', + // width: '100vw', width: '100%', height: '100%', padding: '24px', @@ -378,6 +379,8 @@ const styles = { lineHeight: 'normal', letterSpacing: 'normal', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, fontNormal: { @@ -389,6 +392,8 @@ const styles = { lineHeight: '1.43', letterSpacing: 'normal', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, fontMidBig: { @@ -400,6 +405,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, font16: { @@ -411,6 +418,8 @@ const styles = { lineHeight: '1.25', letterSpacing: '-0.15px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, font20: { @@ -421,6 +430,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, font24: { @@ -432,6 +443,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, fontBig: { @@ -444,6 +457,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, fontHeavy: { diff --git a/views/index.html b/views/index.html index 7efeab8..5766663 100644 --- a/views/index.html +++ b/views/index.html @@ -10,32 +10,30 @@
-
- Sendbird horizontal logo svg icon -
- Sendbird Calls Quickstart +
+ Sendbird horizontal logo svg icon +
+ Sendbird Calls Quickstart +
+
+ Choose a type +
+
+
+
+ Full-screen
-
- Choose a type +
+ Make a call using a full-screen type.
-
-
-
- Full-screen -
-
- Make a call using a full-screen type. -
-
+
-
-
- Widget -
-
- Make a call using a widget type. -
-
+
+
+ Widget +
+
+ Make a call using a widget type.
diff --git a/views/widget.html b/views/widget.html index 3a0437b..818daed 100644 --- a/views/widget.html +++ b/views/widget.html @@ -10,7 +10,7 @@
- Sendbird horizontal logo svg icon + Sendbird horizontal logo svg icon
Sendbird Calls Quickstart
From 36f31fac2fdf3b2b02bf45485f1a148d678c1f99 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 19:29:39 +0900 Subject: [PATCH 30/64] Update main.css 1. remove desc-quick, choose-a-type 2. change css class name --- css/main.css | 33 +++------------------------------ 1 file changed, 3 insertions(+), 30 deletions(-) diff --git a/css/main.css b/css/main.css index a4111a9..3326749 100644 --- a/css/main.css +++ b/css/main.css @@ -107,11 +107,11 @@ body { cursor: pointer; } -.choose-background:hover { +.choice-item:hover { border: solid 1px var(--purple-300); } -.choose-title { +.title-choice-item { margin: 24px 24px 8px 24px; width: 88px; height: 24px; @@ -121,7 +121,7 @@ body { color: var(--navy-900); } -.choose-desc { +.desc-choice-item { width: 212px; height: 60px; margin-left: 24px; @@ -166,33 +166,6 @@ body { margin-bottom: 24px; } -.desc-quick { - width: 275px; - height: 32px; - font-family: Avenir Next; - font-size: 24px; - font-weight: 600; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.33; - letter-spacing: -0.25px; - color: var(--navy-900); -} - -.choose-a-type { - width: 92px; - height: 20px; - font-family: Avenir Next; - font-size: 14px; - font-weight: 500; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: -0.1px; - color: #595e8a; -} - .smile-face { margin-top: 32px; margin-bottom: 16px; From 512cf9888e649d38d2def9eed883de0e6cc28502 Mon Sep 17 00:00:00 2001 From: Cobb Jung Date: Mon, 15 Jun 2020 19:42:25 +0900 Subject: [PATCH 31/64] Fix main.css indentation --- css/main.css | 328 +++++++++++++++++++++++++-------------------------- 1 file changed, 164 insertions(+), 164 deletions(-) diff --git a/css/main.css b/css/main.css index 3326749..a465476 100644 --- a/css/main.css +++ b/css/main.css @@ -1,305 +1,305 @@ :root { - --navy-50: #f6f8fc; - --navy-100: #dee2f2; - --navy-200: #c9d0e6; - --navy-900: #212242; - --white: #ffffff; - --purple-300: #825eeb; - --green-300: #1fcca1; - --green-400: #00998c; - --red-300: #f24d6b; - --red-400: #d92148; - --mute-gray: rgba(255, 255, 255, 0.2); + --navy-50: #f6f8fc; + --navy-100: #dee2f2; + --navy-200: #c9d0e6; + --navy-900: #212242; + --white: #ffffff; + --purple-300: #825eeb; + --green-300: #1fcca1; + --green-400: #00998c; + --red-300: #f24d6b; + --red-400: #d92148; + --mute-gray: rgba(255, 255, 255, 0.2); } body { - margin: 0 auto; - overflow: hidden; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; + margin: 0 auto; + overflow: hidden; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: normal; } .center { - align-items: center; - justify-content: center; + align-items: center; + justify-content: center; } .column { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .row { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .row-reverse { - display:flex; - flex-direction: row-reverse; + display:flex; + flex-direction: row-reverse; } .margin-top-24 { - margin-top: 24px; + margin-top: 24px; } .margin-right-24 { - margin-right: 24px; + margin-right: 24px; } .font-weight-demi { - font-weight: 600; + font-weight: 600; } .btn { - display: flex; - cursor: pointer; - align-items: center; - justify-content: center; - text-decoration: none; - border-radius: 4px; - text-align: center; - height: 40px; + display: flex; + cursor: pointer; + align-items: center; + justify-content: center; + text-decoration: none; + border-radius: 4px; + text-align: center; + height: 40px; } .btn-primary { - background-color: var(--purple-300); - color: var(--white); + background-color: var(--purple-300); + color: var(--white); } .btn.btn-big { - width: 180px; - height: 50px; - margin-left: 16px; - margin-right: 16px; + width: 180px; + height: 50px; + margin-left: 16px; + margin-right: 16px; } .btn.btn-mid { - width: 80px; - height: 40px; - margin-bottom: 23px; - margin-left: 10px; + width: 80px; + height: 40px; + margin-bottom: 23px; + margin-left: 10px; } .btn-block { - width: 100%; + width: 100%; } .title-choice-type { - width: 92px; - height: 20px; - letter-spacing: -0.1px; - color: var(--navy-600); + width: 92px; + height: 20px; + letter-spacing: -0.1px; + color: var(--navy-600); } .choice-item { - display: inline-block; - width: 260px; - height: 158px; - border-radius: 4px; - border: solid 1px #dee2f2; - background-color: var(--white); - cursor: pointer; + display: inline-block; + width: 260px; + height: 158px; + border-radius: 4px; + border: solid 1px #dee2f2; + background-color: var(--white); + cursor: pointer; } .choice-item:hover { - border: solid 1px var(--purple-300); + border: solid 1px var(--purple-300); } .title-choice-item { - margin: 24px 24px 8px 24px; - width: 88px; - height: 24px; - font-size: 18px; - line-height: 1.33; - letter-spacing: -0.25px; - color: var(--navy-900); + margin: 24px 24px 8px 24px; + width: 88px; + height: 24px; + font-size: 18px; + line-height: 1.33; + letter-spacing: -0.25px; + color: var(--navy-900); } .desc-choice-item { - width: 212px; - height: 60px; - margin-left: 24px; - letter-spacing: -0.1px; - color: #595e8a; + width: 212px; + height: 60px; + margin-left: 24px; + letter-spacing: -0.1px; + color: #595e8a; } .title { - height: 32px; - font-size: 24px; - line-height: 1.33; - letter-spacing: -0.25px; - color: inherit; + height: 32px; + font-size: 24px; + line-height: 1.33; + letter-spacing: -0.25px; + color: inherit; } .input-title { - display: inline-block; - margin-top: 6px; - height: 12px; - font-size: 12px; - line-height: 1; - color: var(--navy-900); - margin-bottom: 6px; + display: inline-block; + margin-top: 6px; + height: 12px; + font-size: 12px; + line-height: 1; + color: var(--navy-900); + margin-bottom: 6px; } .input-title:first-of-type { - margin-top: 38px; + margin-top: 38px; } .desc { - letter-spacing: -0.1px; - color: #595e8a; + letter-spacing: -0.1px; + color: #595e8a; } .desc-light { - width: 100%; - height: 20px; - text-align: center; - letter-spacing: -0.1px; - color: #595e8a; - margin-bottom: 24px; + width: 100%; + height: 20px; + text-align: center; + letter-spacing: -0.1px; + color: #595e8a; + margin-bottom: 24px; } .smile-face { - margin-top: 32px; - margin-bottom: 16px; - width: 40px; - height: 40px; - font-family: AppleColorEmoji; - font-size: 40px; - line-height: 1; - color: var(--white); + margin-top: 32px; + margin-bottom: 16px; + width: 40px; + height: 40px; + font-family: AppleColorEmoji; + font-size: 40px; + line-height: 1; + color: var(--white); } .wrapper { - display: flex; - width: 100vw; - height: 100vh; - overflow: hidden; + display: flex; + width: 100vw; + height: 100vh; + overflow: hidden; } .container { - display: flex; - width: 100%; - height: 100%; + display: flex; + width: 100%; + height: 100%; } .backdrop { - -webkit-backdrop-filter: blur(2px); - backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + backdrop-filter: blur(2px); } .bg-white { - background-color: var(--white); - color: var(--navy-900); + background-color: var(--white); + color: var(--navy-900); } .bg-light { - background-color: var(--navy-50); - color: var(--navy-900); + background-color: var(--navy-50); + color: var(--navy-900); } .bg-dark { - background-color: var(--navy-900); - color: var(--white); + background-color: var(--navy-900); + color: var(--white); } .bg-white .desc { - color: #595e8a; + color: #595e8a; } .bg-light .desc { - color: #595e8a; + color: #595e8a; } .bg-dark .desc { - color: var(--white); + color: var(--white); } .hidden { - display: none; + display: none; } .invisible { - visibility: hidden; + visibility: hidden; } button label { - cursor: inherit; + cursor: inherit; } .ic-logo-horizontal { - display: block; - width: 180px; - height: 40px; - background: url("../img/ic-logo-horizontal.svg"); - margin-bottom: 24px; + display: block; + width: 180px; + height: 40px; + background: url("../img/ic-logo-horizontal.svg"); + margin-bottom: 24px; } .voice-sample-page { - height: 32px; - margin-bottom: 16px; - text-align: center; + height: 32px; + margin-bottom: 16px; + text-align: center; } .voice-sample-desc { - width: 308px; - height: 40px; - margin-bottom: 28px; - text-align: center; + width: 308px; + height: 40px; + margin-bottom: 28px; + text-align: center; } .ic-arrow-down-right-24 { - display: block; - width: 32px; - height: 32px; - object-fit: contain; + display: block; + width: 32px; + height: 32px; + object-fit: contain; } .widget-tooltip { - position: absolute; - right: 18px; - bottom: 112px; - width: 296px; - height: 108px; - border-radius: 4px; - box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); - border: solid 1px #c9d0e6; + position: absolute; + right: 18px; + bottom: 112px; + width: 296px; + height: 108px; + border-radius: 4px; + box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); + border: solid 1px #c9d0e6; } .img-tooltip-tail-down { - position: absolute; - right: 16px; - bottom: -8px; - width: 0; - height: 0; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-top: 8px solid white; + position: absolute; + right: 16px; + bottom: -8px; + width: 0; + height: 0; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 8px solid white; } .widget { - position: absolute; - right: 16px; - bottom: 16px; + position: absolute; + right: 16px; + bottom: 16px; } ::-webkit-scrollbar { - width: 5px; /* 세로축 스크롤바 길이 */ + width: 5px; /* 세로축 스크롤바 길이 */ } ::-webkit-scrollbar-track { - background-color: transparent; + background-color: transparent; } ::-webkit-scrollbar-track-piece { - background-color: transparent; + background-color: transparent; } ::-webkit-scrollbar-thumb { - border-radius: 8px; - background-color: gray; + border-radius: 8px; + background-color: gray; } From 8cea8da1e923619bf7b2f35c9cd1b50647d916b3 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 19:47:20 +0900 Subject: [PATCH 32/64] [CALLS-534]widget Sample App Design Improvements "this.args = args" remove --- lib/components/Header.js | 1 - lib/components/TabToolBar.js | 1 - lib/views/AppInfoView.js | 2 -- lib/views/CallLogView.js | 1 - lib/views/DialView.js | 1 - lib/views/Settings.js | 1 - 6 files changed, 7 deletions(-) diff --git a/lib/components/Header.js b/lib/components/Header.js index 8a71ef8..8da53bd 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -28,7 +28,6 @@ export default class Header extends BaseElement { } ]; - this.args = args; this.parent = parent; } diff --git a/lib/components/TabToolBar.js b/lib/components/TabToolBar.js index 364f419..e3d0f74 100644 --- a/lib/components/TabToolBar.js +++ b/lib/components/TabToolBar.js @@ -6,7 +6,6 @@ export default class TabToolBar extends BaseElement { constructor({ id, className, parent, element, args } = {}) { super({ id, className, parent, element }); this.element = element; - this.args = args; } build() { diff --git a/lib/views/AppInfoView.js b/lib/views/AppInfoView.js index 98fc1bc..c794024 100644 --- a/lib/views/AppInfoView.js +++ b/lib/views/AppInfoView.js @@ -10,8 +10,6 @@ export default class AppInfoView extends BaseElement { className: `${classes['viewSettings']} ${classes['column']} ${classes['center']}`, args }); - - this.args = args; } onLoaded() { diff --git a/lib/views/CallLogView.js b/lib/views/CallLogView.js index 62eb144..a4f52bf 100644 --- a/lib/views/CallLogView.js +++ b/lib/views/CallLogView.js @@ -14,7 +14,6 @@ export default class CallLogView extends BaseElement{ this.callLogQuery = null; this.callLogQueryData = []; - this.args = args; } build() { diff --git a/lib/views/DialView.js b/lib/views/DialView.js index 2a388de..80ff155 100644 --- a/lib/views/DialView.js +++ b/lib/views/DialView.js @@ -13,7 +13,6 @@ export default class DialView extends BaseElement { className: `${classes['container']} ${classes['column']} ${classes['center']} ${classes['view']} ${classes['viewDial']}`, args }); - this.args = args; } onLoaded() { diff --git a/lib/views/Settings.js b/lib/views/Settings.js index a2972e1..66ea4fb 100644 --- a/lib/views/Settings.js +++ b/lib/views/Settings.js @@ -14,7 +14,6 @@ export default class Settings extends BaseElement { this.microphone = null; this.speaker = null; this.camera = null; - this.args = args; } onLoaded() { From c16654a38df911c92228335c45485f5a5240c7c4 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 19:50:46 +0900 Subject: [PATCH 33/64] [CALLS-534]widget Sample App Design Improvements add '--navy-600' color value. --- css/main.css | 1 + 1 file changed, 1 insertion(+) diff --git a/css/main.css b/css/main.css index a465476..89d30c5 100644 --- a/css/main.css +++ b/css/main.css @@ -2,6 +2,7 @@ --navy-50: #f6f8fc; --navy-100: #dee2f2; --navy-200: #c9d0e6; + --navy-600: #595e8a; --navy-900: #212242; --white: #ffffff; --purple-300: #825eeb; From 8a8a7b10b62145a7430155c5c160b2c2c99c1b36 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Mon, 15 Jun 2020 23:33:10 +0900 Subject: [PATCH 34/64] [CALLS-534]widget Sample App Design Improvements apply review --- css/main.css | 4 ++-- lib/views/CallView.js | 1 - views/widget.html | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/css/main.css b/css/main.css index 89d30c5..3650b5b 100644 --- a/css/main.css +++ b/css/main.css @@ -127,7 +127,7 @@ body { height: 60px; margin-left: 24px; letter-spacing: -0.1px; - color: #595e8a; + color: var(--navy-900); } @@ -271,7 +271,7 @@ button label { height: 108px; border-radius: 4px; box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); - border: solid 1px #c9d0e6; + border: solid 1px var(--navy-200); } .img-tooltip-tail-down { diff --git a/lib/views/CallView.js b/lib/views/CallView.js index 1fa4873..7d0c7da 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -117,7 +117,6 @@ export default class CallView extends BaseElement { this.showSecondaryInfo(); } - console.log(endedCall.getCallLog); this.sendToChildren('ended'); }; diff --git a/views/widget.html b/views/widget.html index 818daed..453514b 100644 --- a/views/widget.html +++ b/views/widget.html @@ -11,7 +11,7 @@
Sendbird horizontal logo svg icon -
+
Sendbird Calls Quickstart
From 1012806332e74949ec9a1029570c61e6a815a1f6 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Tue, 16 Jun 2020 11:05:01 +0900 Subject: [PATCH 35/64] [CALLS-534]widget Sample App Design Improvements update description in index.html --- css/main.css | 4 ++-- views/index.html | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/css/main.css b/css/main.css index 3650b5b..e3eaaeb 100644 --- a/css/main.css +++ b/css/main.css @@ -92,7 +92,7 @@ body { } .title-choice-type { - width: 92px; + width: 174px; height: 20px; letter-spacing: -0.1px; color: var(--navy-600); @@ -127,7 +127,7 @@ body { height: 60px; margin-left: 24px; letter-spacing: -0.1px; - color: var(--navy-900); + color: var(--navy-600); } diff --git a/views/index.html b/views/index.html index 5766663..20fbfdb 100644 --- a/views/index.html +++ b/views/index.html @@ -16,7 +16,7 @@ Sendbird Calls Quickstart
- Choose a type + Choose an application type
@@ -24,7 +24,7 @@ Full-screen
- Make a call using a full-screen type. + The full-screen application type provides an example of a standalone phone call web app.
@@ -33,7 +33,7 @@ Widget
- Make a call using a widget type. + The widget application type showcases how a phone call may be overlaid on top of an existing web application.
From 0f3c3c669de9c35bdf8c8fc57e693892f1d7dd36 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Tue, 16 Jun 2020 12:38:04 +0900 Subject: [PATCH 36/64] [CALLS-534]widget Sample App Design Improvements color code --> color variable in main.css --- css/main.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/css/main.css b/css/main.css index e3eaaeb..c7d5f36 100644 --- a/css/main.css +++ b/css/main.css @@ -155,7 +155,7 @@ body { .desc { letter-spacing: -0.1px; - color: #595e8a; + color: var(--navy-600); } .desc-light { @@ -163,7 +163,7 @@ body { height: 20px; text-align: center; letter-spacing: -0.1px; - color: #595e8a; + color: var(--navy-600); margin-bottom: 24px; } @@ -212,7 +212,7 @@ body { } .bg-white .desc { - color: #595e8a; + color: var(--navy-600); } .bg-light .desc { From 956650c86a54ce20594644bbd11eca27e49fd61f Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Tue, 16 Jun 2020 14:45:51 +0900 Subject: [PATCH 37/64] Update main.css --- css/main.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/css/main.css b/css/main.css index c7d5f36..4ee79dd 100644 --- a/css/main.css +++ b/css/main.css @@ -216,7 +216,7 @@ body { } .bg-light .desc { - color: #595e8a; + color: var(--navy-600); } .bg-dark .desc { From ca3adcf6e7c2f2582e4e242ae79f533609e2a079 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Tue, 16 Jun 2020 16:06:36 +0900 Subject: [PATCH 38/64] [CALLS-534]widget Sample App Design Improvements 1. remove antialiased attribute in text 2. add line break in case of display long nickname --- lib/css/styles.js | 18 ++++-------------- lib/views/CallView.js | 3 ++- 2 files changed, 6 insertions(+), 15 deletions(-) diff --git a/lib/css/styles.js b/lib/css/styles.js index da60533..1d89aa3 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -379,8 +379,6 @@ const styles = { lineHeight: 'normal', letterSpacing: 'normal', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, fontNormal: { @@ -392,8 +390,6 @@ const styles = { lineHeight: '1.43', letterSpacing: 'normal', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, fontMidBig: { @@ -405,8 +401,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, font16: { @@ -418,8 +412,6 @@ const styles = { lineHeight: '1.25', letterSpacing: '-0.15px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, font20: { @@ -430,8 +422,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, font24: { @@ -443,8 +433,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, fontBig: { @@ -457,8 +445,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'antialiased', - '-moz-osx-font-smoothing': 'grayscale' }, fontHeavy: { @@ -638,6 +624,10 @@ const styles = { `, peerName: ` + min-height: 32px; + height: auto; + text-align: center; + word-break: break-all; margin-bottom: 4px; `, diff --git a/lib/views/CallView.js b/lib/views/CallView.js index 7d0c7da..dabbcf5 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -24,13 +24,14 @@ export default class CallView extends BaseElement { const localUser = this.call.localUser; const remoteUser = this.call.remoteUser; + remoteUser.nickname = "1234567890123456789012345678901234567890"; this.peerProfile = createImg({ src: remoteUser.profileUrl, alt: 'Sendbird voice & video call opponent profile photo', className: classes['remoteProfile'], onerror: (e) => e.target.style.visibility = 'hidden' }); - this.peerName = createLabel({ id: 'peer_name', innerText: remoteUser.userId, className: `${classes['peerName']} ${classes['fontBig']}` }); + this.peerName = createLabel({ id: 'peer_name', innerText: (remoteUser.nickname ? remoteUser.nickname : remoteUser.userId), className: `${classes['peerName']} ${classes['fontBig']}` }); let connectionText; if (this.call.isVideoCall) { From 97767c49425bf5b557eb285d52c6b73b30e22719 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Wed, 17 Jun 2020 15:38:39 +0900 Subject: [PATCH 39/64] Update main.css indent change 4 --> 2 --- css/main.css | 330 +++++++++++++++++++++++++-------------------------- 1 file changed, 165 insertions(+), 165 deletions(-) diff --git a/css/main.css b/css/main.css index 4ee79dd..027367a 100644 --- a/css/main.css +++ b/css/main.css @@ -1,306 +1,306 @@ :root { - --navy-50: #f6f8fc; - --navy-100: #dee2f2; - --navy-200: #c9d0e6; - --navy-600: #595e8a; - --navy-900: #212242; - --white: #ffffff; - --purple-300: #825eeb; - --green-300: #1fcca1; - --green-400: #00998c; - --red-300: #f24d6b; - --red-400: #d92148; - --mute-gray: rgba(255, 255, 255, 0.2); + --navy-50: #f6f8fc; + --navy-100: #dee2f2; + --navy-200: #c9d0e6; + --navy-600: #595e8a; + --navy-900: #212242; + --white: #ffffff; + --purple-300: #825eeb; + --green-300: #1fcca1; + --green-400: #00998c; + --red-300: #f24d6b; + --red-400: #d92148; + --mute-gray: rgba(255, 255, 255, 0.2); } body { - margin: 0 auto; - overflow: hidden; - font-family: Avenir Next; - font-size: 14px; - font-weight: normal; - font-stretch: normal; - font-style: normal; - line-height: 1.43; - letter-spacing: normal; + margin: 0 auto; + overflow: hidden; + font-family: Avenir Next; + font-size: 14px; + font-weight: normal; + font-stretch: normal; + font-style: normal; + line-height: 1.43; + letter-spacing: normal; } .center { - align-items: center; - justify-content: center; + align-items: center; + justify-content: center; } .column { - display: flex; - flex-direction: column; + display: flex; + flex-direction: column; } .row { - display: flex; - flex-direction: row; + display: flex; + flex-direction: row; } .row-reverse { - display:flex; - flex-direction: row-reverse; + display:flex; + flex-direction: row-reverse; } .margin-top-24 { - margin-top: 24px; + margin-top: 24px; } .margin-right-24 { - margin-right: 24px; + margin-right: 24px; } .font-weight-demi { - font-weight: 600; + font-weight: 600; } .btn { - display: flex; - cursor: pointer; - align-items: center; - justify-content: center; - text-decoration: none; - border-radius: 4px; - text-align: center; - height: 40px; + display: flex; + cursor: pointer; + align-items: center; + justify-content: center; + text-decoration: none; + border-radius: 4px; + text-align: center; + height: 40px; } .btn-primary { - background-color: var(--purple-300); - color: var(--white); + background-color: var(--purple-300); + color: var(--white); } .btn.btn-big { - width: 180px; - height: 50px; - margin-left: 16px; - margin-right: 16px; + width: 180px; + height: 50px; + margin-left: 16px; + margin-right: 16px; } .btn.btn-mid { - width: 80px; - height: 40px; - margin-bottom: 23px; - margin-left: 10px; + width: 80px; + height: 40px; + margin-bottom: 23px; + margin-left: 10px; } .btn-block { - width: 100%; + width: 100%; } .title-choice-type { - width: 174px; - height: 20px; - letter-spacing: -0.1px; - color: var(--navy-600); + width: 174px; + height: 20px; + letter-spacing: -0.1px; + color: var(--navy-600); } .choice-item { - display: inline-block; - width: 260px; - height: 158px; - border-radius: 4px; - border: solid 1px #dee2f2; - background-color: var(--white); - cursor: pointer; + display: inline-block; + width: 260px; + height: 158px; + border-radius: 4px; + border: solid 1px #dee2f2; + background-color: var(--white); + cursor: pointer; } .choice-item:hover { - border: solid 1px var(--purple-300); + border: solid 1px var(--purple-300); } .title-choice-item { - margin: 24px 24px 8px 24px; - width: 88px; - height: 24px; - font-size: 18px; - line-height: 1.33; - letter-spacing: -0.25px; - color: var(--navy-900); + margin: 24px 24px 8px 24px; + width: 88px; + height: 24px; + font-size: 18px; + line-height: 1.33; + letter-spacing: -0.25px; + color: var(--navy-900); } .desc-choice-item { - width: 212px; - height: 60px; - margin-left: 24px; - letter-spacing: -0.1px; - color: var(--navy-600); + width: 212px; + height: 60px; + margin-left: 24px; + letter-spacing: -0.1px; + color: var(--navy-600); } .title { - height: 32px; - font-size: 24px; - line-height: 1.33; - letter-spacing: -0.25px; - color: inherit; + height: 32px; + font-size: 24px; + line-height: 1.33; + letter-spacing: -0.25px; + color: inherit; } .input-title { - display: inline-block; - margin-top: 6px; - height: 12px; - font-size: 12px; - line-height: 1; - color: var(--navy-900); - margin-bottom: 6px; + display: inline-block; + margin-top: 6px; + height: 12px; + font-size: 12px; + line-height: 1; + color: var(--navy-900); + margin-bottom: 6px; } .input-title:first-of-type { - margin-top: 38px; + margin-top: 38px; } .desc { - letter-spacing: -0.1px; - color: var(--navy-600); + letter-spacing: -0.1px; + color: var(--navy-600); } .desc-light { - width: 100%; - height: 20px; - text-align: center; - letter-spacing: -0.1px; - color: var(--navy-600); - margin-bottom: 24px; + width: 100%; + height: 20px; + text-align: center; + letter-spacing: -0.1px; + color: var(--navy-600); + margin-bottom: 24px; } .smile-face { - margin-top: 32px; - margin-bottom: 16px; - width: 40px; - height: 40px; - font-family: AppleColorEmoji; - font-size: 40px; - line-height: 1; - color: var(--white); + margin-top: 32px; + margin-bottom: 16px; + width: 40px; + height: 40px; + font-family: AppleColorEmoji; + font-size: 40px; + line-height: 1; + color: var(--white); } .wrapper { - display: flex; - width: 100vw; - height: 100vh; - overflow: hidden; + display: flex; + width: 100vw; + height: 100vh; + overflow: hidden; } .container { - display: flex; - width: 100%; - height: 100%; + display: flex; + width: 100%; + height: 100%; } .backdrop { - -webkit-backdrop-filter: blur(2px); - backdrop-filter: blur(2px); + -webkit-backdrop-filter: blur(2px); + backdrop-filter: blur(2px); } .bg-white { - background-color: var(--white); - color: var(--navy-900); + background-color: var(--white); + color: var(--navy-900); } .bg-light { - background-color: var(--navy-50); - color: var(--navy-900); + background-color: var(--navy-50); + color: var(--navy-900); } .bg-dark { - background-color: var(--navy-900); - color: var(--white); + background-color: var(--navy-900); + color: var(--white); } .bg-white .desc { - color: var(--navy-600); + color: var(--navy-600); } .bg-light .desc { - color: var(--navy-600); + color: var(--navy-600); } .bg-dark .desc { - color: var(--white); + color: var(--white); } .hidden { - display: none; + display: none; } .invisible { - visibility: hidden; + visibility: hidden; } button label { - cursor: inherit; + cursor: inherit; } .ic-logo-horizontal { - display: block; - width: 180px; - height: 40px; - background: url("../img/ic-logo-horizontal.svg"); - margin-bottom: 24px; + display: block; + width: 180px; + height: 40px; + background: url("../img/ic-logo-horizontal.svg"); + margin-bottom: 24px; } .voice-sample-page { - height: 32px; - margin-bottom: 16px; - text-align: center; + height: 32px; + margin-bottom: 16px; + text-align: center; } .voice-sample-desc { - width: 308px; - height: 40px; - margin-bottom: 28px; - text-align: center; + width: 308px; + height: 40px; + margin-bottom: 28px; + text-align: center; } .ic-arrow-down-right-24 { - display: block; - width: 32px; - height: 32px; - object-fit: contain; + display: block; + width: 32px; + height: 32px; + object-fit: contain; } .widget-tooltip { - position: absolute; - right: 18px; - bottom: 112px; - width: 296px; - height: 108px; - border-radius: 4px; - box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); - border: solid 1px var(--navy-200); + position: absolute; + right: 18px; + bottom: 112px; + width: 296px; + height: 108px; + border-radius: 4px; + box-shadow: 0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12); + border: solid 1px var(--navy-200); } .img-tooltip-tail-down { - position: absolute; - right: 16px; - bottom: -8px; - width: 0; - height: 0; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-top: 8px solid white; + position: absolute; + right: 16px; + bottom: -8px; + width: 0; + height: 0; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 8px solid white; } .widget { - position: absolute; - right: 16px; - bottom: 16px; + position: absolute; + right: 16px; + bottom: 16px; } ::-webkit-scrollbar { - width: 5px; /* 세로축 스크롤바 길이 */ + width: 5px; /* 세로축 스크롤바 길이 */ } ::-webkit-scrollbar-track { - background-color: transparent; + background-color: transparent; } ::-webkit-scrollbar-track-piece { - background-color: transparent; + background-color: transparent; } ::-webkit-scrollbar-thumb { - border-radius: 8px; - background-color: gray; + border-radius: 8px; + background-color: gray; } From 7c36634d99f0e3d956a544b09a07991e7c6ce47f Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Wed, 17 Jun 2020 15:41:13 +0900 Subject: [PATCH 40/64] [CALLS-534]widget Sample App Design Improvements Design QA apply 1. text antialiasing off 2. add shdow widget button --- css/main.css | 3 +++ lib/css/styles.js | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/css/main.css b/css/main.css index 027367a..f42fcdd 100644 --- a/css/main.css +++ b/css/main.css @@ -23,6 +23,8 @@ body { font-style: normal; line-height: 1.43; letter-spacing: normal; + --webkit-font-smooth: none; + -moz-osx-font-smoothing: none; } .center { @@ -117,6 +119,7 @@ body { width: 88px; height: 24px; font-size: 18px; + font-weight: 500; line-height: 1.33; letter-spacing: -0.25px; color: var(--navy-900); diff --git a/lib/css/styles.js b/lib/css/styles.js index 1d89aa3..a45f402 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -379,6 +379,8 @@ const styles = { lineHeight: 'normal', letterSpacing: 'normal', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'none', + '-moz-osx-font-smoothing': 'none' }, fontNormal: { @@ -390,6 +392,8 @@ const styles = { lineHeight: '1.43', letterSpacing: 'normal', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'none', + '-moz-osx-font-smoothing': 'none' }, fontMidBig: { @@ -401,6 +405,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'none', + '-moz-osx-font-smoothing': 'none' }, font16: { @@ -412,6 +418,8 @@ const styles = { lineHeight: '1.25', letterSpacing: '-0.15px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'none', + '-moz-osx-font-smoothing': 'none' }, font20: { @@ -422,6 +430,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'none', + '-moz-osx-font-smoothing': 'none' }, font24: { @@ -433,6 +443,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'none', + '-moz-osx-font-smoothing': 'none' }, fontBig: { @@ -445,6 +457,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'none', + '-moz-osx-font-smoothing': 'none' }, fontHeavy: { @@ -1080,6 +1094,7 @@ const styles = { backgroundImage: `url(${widgetIcon})`, backgroundRepeat: 'no-repeat', backgroundPosition: 'center', + boxShadow: '0 5px 8px -4px rgba(33, 34, 66, 0.04), 0 5px 22px 4px rgba(33, 34, 66, 0.08), 0 12px 17px 2px rgba(33, 34, 66, 0.12)', marginBottom: '32px' }, From e2410a144715f3d14094e45005c3b4a29d74b21c Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Wed, 17 Jun 2020 23:01:06 +0900 Subject: [PATCH 41/64] [CALLS-534]widget Sample App Design Improvements Design QA issue apply 1. default text color change 2. Tab bar "dial" -> "Dial" 3. change option height top 32px 4. settingsButton hover bug fixed 5. Call View Button position change in widget. 6. widget vidwo call radius apply 7. Dia view placeholder color change 8. application info popup text color change 9. GNB divider color change 10. Toast noti position change --- css/main.css | 26 ++++++++++++-- lib/components/Menu.js | 8 +++++ lib/components/TabToolBar.js | 4 +-- lib/css/styles.js | 69 +++++++++++++++++++++--------------- lib/views/AppInfoView.js | 6 ++-- lib/views/CallButtons.js | 8 ++++- lib/views/CallView.js | 13 ++++--- lib/views/LoginView.js | 2 +- 8 files changed, 93 insertions(+), 43 deletions(-) diff --git a/css/main.css b/css/main.css index f42fcdd..64d58cb 100644 --- a/css/main.css +++ b/css/main.css @@ -2,10 +2,12 @@ --navy-50: #f6f8fc; --navy-100: #dee2f2; --navy-200: #c9d0e6; + --navy-400: #8A92BA; --navy-600: #595e8a; --navy-900: #212242; --white: #ffffff; --purple-300: #825eeb; + --purple-400: #6440C4; --green-300: #1fcca1; --green-400: #00998c; --red-300: #f24d6b; @@ -13,6 +15,14 @@ --mute-gray: rgba(255, 255, 255, 0.2); } +input:-moz-read-only { /* For Firefox */ + color: var(--navy-600); +} + +input:read-only { + color: var(--navy-600); +} + body { margin: 0 auto; overflow: hidden; @@ -22,9 +32,8 @@ body { font-stretch: normal; font-style: normal; line-height: 1.43; + color: var(--navy-900); letter-spacing: normal; - --webkit-font-smooth: none; - -moz-osx-font-smoothing: none; } .center { @@ -307,3 +316,16 @@ button label { border-radius: 8px; background-color: gray; } + +::-webkit-input-placeholder { /* Chrome/Opera/Safari */ + color: var(--navy-400); +} +::-moz-placeholder { /* Firefox 19+ */ + color: var(--navy-400); +} +:-ms-input-placeholder { /* IE 10+ */ + color: var(--navy-400); +} +:-moz-placeholder { /* Firefox 18- */ + color: var(--navy-400); +} diff --git a/lib/components/Menu.js b/lib/components/Menu.js index 347dafa..5a5deba 100644 --- a/lib/components/Menu.js +++ b/lib/components/Menu.js @@ -11,6 +11,14 @@ export default class Menu extends BaseElement { } build() { + this.element.addEventListener('mouseenter', function(){ + this.style.backgroundColor = '#6440c4'; + }); + + this.element.addEventListener('mouseout', function(){ + this.style.backgroundColor = ''; + }); + this.menuItems = createDiv({ className: `${classes['menuItems']} ${classes['hidden']}` }); this.items.forEach((item) => { diff --git a/lib/components/TabToolBar.js b/lib/components/TabToolBar.js index e3d0f74..d982f9e 100644 --- a/lib/components/TabToolBar.js +++ b/lib/components/TabToolBar.js @@ -15,7 +15,7 @@ export default class TabToolBar extends BaseElement { } const btnDial = createDiv({ id: 'btn_tab_dial', className: `${classes['btnTab']}` }); const icoTabDial = createDiv({id: 'ico_tab_dial', className: `${classes['tabIco']} ${classes['dialActive']}`}); - const btnDialCaption = createParagraph({id: 'btn_dial_caption', innerText: 'dial', className: `${classes['fontNormal']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabActive']}`}); + const btnDialCaption = createParagraph({id: 'btn_dial_caption', innerText: 'Dial', className: `${classes['fontSmall']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabActive']}`}); btnDial.appendChild(icoTabDial); btnDial.appendChild(btnDialCaption); @@ -37,7 +37,7 @@ export default class TabToolBar extends BaseElement { const btnCallLog = createDiv({id: 'btn_tab_calllog', className: `${classes['btnTab']}`}); const icoCallLog = createDiv({id: 'ico_tab_callog', className: `${classes['tabIco']} ${classes['callLogDeactive']}`}); - const btnCalllogCaption = createParagraph({id: 'btn_calllog_caption', innerText: 'History', className: `${classes['fontNormal']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabDeactive']}`}); + const btnCalllogCaption = createParagraph({id: 'btn_calllog_caption', innerText: 'History', className: `${classes['fontSmall']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabDeactive']}`}); btnCallLog.appendChild(icoCallLog); btnCallLog.appendChild(btnCalllogCaption); diff --git a/lib/css/styles.js b/lib/css/styles.js index a45f402..a690c72 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -182,8 +182,8 @@ const styles = { }, profileSmall: { - width: '32px', - height: '32px', + width: '40px', + height: '40px', borderRadius: '50%', marginLeft: '24px', marginRight: '16px', @@ -376,11 +376,10 @@ const styles = { fontWeight: 'normal', fontStretch: 'normal', fontStyle: 'normal', + color: colors.navy900, lineHeight: 'normal', letterSpacing: 'normal', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'none', - '-moz-osx-font-smoothing': 'none' }, fontNormal: { @@ -389,11 +388,10 @@ const styles = { fontWeight: 'normal', fontStretch: 'normal', fontStyle: 'normal', + color: colors.navy900, lineHeight: '1.43', letterSpacing: 'normal', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'none', - '-moz-osx-font-smoothing': 'none' }, fontMidBig: { @@ -402,11 +400,10 @@ const styles = { fontWeight: 'normal', fontStretch: 'normal', fontStyle: 'normal', + color: colors.navy900, lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'none', - '-moz-osx-font-smoothing': 'none' }, font16: { @@ -415,11 +412,10 @@ const styles = { fontWeight: 'normal', fontStretch: 'normal', fontStyle: 'normal', + color: colors.navy900, lineHeight: '1.25', letterSpacing: '-0.15px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'none', - '-moz-osx-font-smoothing': 'none' }, font20: { @@ -430,8 +426,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'none', - '-moz-osx-font-smoothing': 'none' }, font24: { @@ -440,11 +434,10 @@ const styles = { fontWeight: 'normal', fontStretch: 'normal', fontStyle: 'normal', + color: colors.navy900, lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'none', - '-moz-osx-font-smoothing': 'none' }, fontBig: { @@ -457,8 +450,6 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', - '-webkit-font-smoothing': 'none', - '-moz-osx-font-smoothing': 'none' }, fontHeavy: { @@ -469,6 +460,14 @@ const styles = { fontWeight: 600 }, + fontColorWhite: { + color: colors.white + }, + + fonrReadOnlyColor: { + color: colors.navy600 + }, + /*** tab ***/ tabToolBar: { position: 'relative', @@ -630,8 +629,8 @@ const styles = { remoteProfile: ` display: block; - width: 120px; - height: 120px; + width: 80px; + height: 80px; border-radius: 50%; object-fit: contain; margin-bottom: 24px; @@ -681,14 +680,19 @@ const styles = { display: block; `, + callButtons: { position: 'relative' }, + callButtonsWidget: { + position: 'absolute', + bottom: '40px' + }, + btnCircle: { - width: '56px', - height: '56px', - border: 'solid 1px var(--purple-300)', + width: '64px', + height: '64px', borderRadius: '50%', backgroundColor: colors.white, borderColor: 'transparent', @@ -706,9 +710,8 @@ const styles = { }, btnCall: { - marginLeft: '16px', - marginRight: '16px', - marginBottom: '8px', + marginLeft: '10px', + marginRight: '10px' }, btnVideoAccept: { @@ -775,6 +778,7 @@ const styles = { backgroundColor: '#e53157', backgroundImage: `url(${endIcon})`, backgroundRepeat: 'no-repeat', + backgroundSize: '32px', backgroundPosition: 'center', '&:hover' : { backgroundColor: '#a30e2d', @@ -830,6 +834,10 @@ const styles = { overflow: 'hidden' }, + callBackgroundWidget: { + borderRadius: '8px' + }, + callForeground: { position: 'relative' }, @@ -1067,6 +1075,7 @@ const styles = { borderRadius: '8px' }, '& $toast': { + position: 'relative', left: 'auto', width: '80%', margin: 'auto' @@ -1139,7 +1148,8 @@ const styles = { width: '200px', borderRadius: '4px', boxShadow: '0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12)', - backgroundColor: colors.white + backgroundColor: colors.white, + zIndex: '1' }, menuItem: { @@ -1150,6 +1160,7 @@ const styles = { paddingLeft: '16px', paddingRight: '16px', width: '100%', + height: '32px !important', textAlign: 'left', '&:hover': { backgroundColor: colors.navy50 @@ -1161,7 +1172,7 @@ const styles = { height: '20px', marginLeft: '8px', marginRight: '16px', - backgroundColor: colors.navy900 + backgroundColor: colors.purple400 }, headerButtons: { @@ -1179,9 +1190,9 @@ const styles = { backgroundImage: `url(${settingsIcon})`, backgroundRepeat: 'no-repeat', backgroundPosition: 'center', - '&:hover': { - backgroundColor: colors.purple400 - }, + // '&:hover': { + // backgroundColor: colors.purple400 + // }, zIndex: 10, }, diff --git a/lib/views/AppInfoView.js b/lib/views/AppInfoView.js index c794024..7a8136f 100644 --- a/lib/views/AppInfoView.js +++ b/lib/views/AppInfoView.js @@ -60,9 +60,8 @@ export default class AppInfoView extends BaseElement { }); const applicationName = createLabel({ id: 'app_name', - readonly: 'readonly', innerText: 'Voice & Video', - className: `${classes['appInfoLabel']} ${classes['appName']} ${classes['fontNormal']}` + className: `${classes['appInfoLabel']} ${classes['appName']} ${classes['fontNormal']} ${classes['fonrReadOnlyColor']}` }); applicationInfoContainer.appendChild(applicationNameLabel); @@ -81,9 +80,8 @@ export default class AppInfoView extends BaseElement { const applicationID = createLabel({ id: 'app_id', - readonly: 'readonly', innerText: this.args.appId, - className: `${classes['appInfoLabel']} ${classes['appInfoIdLabel']} ${classes['fontNormal']}` + className: `${classes['appInfoLabel']} ${classes['appInfoIdLabel']} ${classes['fontNormal']} ${classes['fonrReadOnlyColor']}` }); const appInfoIdCopy = createDiv({ diff --git a/lib/views/CallButtons.js b/lib/views/CallButtons.js index e4fbf7e..3d1e719 100644 --- a/lib/views/CallButtons.js +++ b/lib/views/CallButtons.js @@ -19,7 +19,13 @@ export default class CallButtons extends BaseElement { } build() { - const element = createDiv({ className: `${classes['row']} ${classes['center']} ${classes['callButtons']}` }); + let element = null; + if (this.args.isWidget) { + element = createDiv({ className: `${classes['row']} ${classes['center']} ${classes['callButtonsWidget']}` }); + } else { + element = createDiv({ className: `${classes['row']} ${classes['center']} ${classes['callButtons']}` }); + } + this.element = element; if (this.call.isVideoCall) { diff --git a/lib/views/CallView.js b/lib/views/CallView.js index dabbcf5..74213c0 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -31,7 +31,7 @@ export default class CallView extends BaseElement { className: classes['remoteProfile'], onerror: (e) => e.target.style.visibility = 'hidden' }); - this.peerName = createLabel({ id: 'peer_name', innerText: (remoteUser.nickname ? remoteUser.nickname : remoteUser.userId), className: `${classes['peerName']} ${classes['fontBig']}` }); + this.peerName = createLabel({ id: 'peer_name', innerText: (remoteUser.nickname ? remoteUser.nickname : remoteUser.userId), className: `${classes['peerName']} ${classes['fontBig']} ${classes['fontDemi']}` }); let connectionText; if (this.call.isVideoCall) { @@ -41,13 +41,13 @@ export default class CallView extends BaseElement { } this.connectionInfo = createLabel({ id: 'conn_info_label', - className: `${classes['connectionInfo']} ${classes['fontNormal']}`, + className: `${classes['connectionInfo']} ${classes['fontNormal']} ${classes['fontColorWhite']}`, innerText: connectionText }); const peerStateDiv = createDiv({ id: 'peer_state', className: `${classes['column']} ${classes['peerStateDiv']} ${classes['invisible']}` }); const peerMuteIcon = createDiv({ id: 'peer_mute_icon', className: `${classes['peerMuteIcon']}` }); - const peerMuteLabel = createLabel({ id: 'peer_mute_label', className: `${classes['peerMuteLabel']} ${classes['fontSmall']}`, innerText: `${remoteUser.userId} audio muted this call` }); + const peerMuteLabel = createLabel({ id: 'peer_mute_label', className: `${classes['peerMuteLabel']} ${classes['fontSmall']} ${classes['fontColorWhite']}`, innerText: `${remoteUser.userId} audio muted this call` }); peerStateDiv.appendChild(peerMuteIcon); peerStateDiv.appendChild(peerMuteLabel); @@ -71,7 +71,12 @@ export default class CallView extends BaseElement { this.call.setLocalMediaView(this.localMediaView); this.call.setRemoteMediaView(this.remoteMediaView); - const background = createDiv({ className: classes['callBackground'] }); + let background = null; + if (this.args.isWidget) { + background = createDiv({ className: `${classes['callBackground']} ${classes['callBackgroundWidget']}` }); + } else { + background = createDiv({ className: classes['callBackground'] }); + } const foreground = createDiv({ className: `${classes['column']} ${classes['center']} ${classes['callForeground']}` }); background.appendChild(this.remoteMediaViewDiv); diff --git a/lib/views/LoginView.js b/lib/views/LoginView.js index 1bde781..8f1a6c2 100644 --- a/lib/views/LoginView.js +++ b/lib/views/LoginView.js @@ -49,7 +49,7 @@ export default class LoginView extends BaseElement { const inputAccessToken = createInput({ id: 'input_access_token', className: `${classes['field']} ${classes['fontNormal']}` }); const btnLogin = createButton({ id: 'btn_login', className: `${classes['btn']} ${classes['btnPrimary']} ${classes['btnMid']} ${classes['loginButton']} ${classes['fontNormal']}`, }); - const loginLabel = createLabel({ id: 'login_label', innerText: 'Sign in' }); + const loginLabel = createLabel({ id: 'login_label', className: `${classes['fontNormal']} ${classes['fontColorWhite']}`, innerText: 'Sign in' }); btnLogin.appendChild(loginLabel); btnLogin.onclick = () => { const appId = inputAppId.value; From 478a8172d1a1d28b372234c25e1f8f0596833a46 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Wed, 17 Jun 2020 23:02:18 +0900 Subject: [PATCH 42/64] Update CallView.js remote test code --- lib/views/CallView.js | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/views/CallView.js b/lib/views/CallView.js index 74213c0..504b503 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -24,7 +24,6 @@ export default class CallView extends BaseElement { const localUser = this.call.localUser; const remoteUser = this.call.remoteUser; - remoteUser.nickname = "1234567890123456789012345678901234567890"; this.peerProfile = createImg({ src: remoteUser.profileUrl, alt: 'Sendbird voice & video call opponent profile photo', From 50ec75ca40677add902381da1b3d1b859746acf3 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Thu, 18 Jun 2020 14:28:03 +0900 Subject: [PATCH 43/64] [CALLS-534]widget Sample App Design Improvements 1. set font-smoothing 2. change toast noti position to center in widget --- css/main.css | 3 +++ lib/css/styles.js | 29 +++++++++++++++++++---------- lib/views/DialView.js | 2 +- 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/css/main.css b/css/main.css index 64d58cb..6a31ba9 100644 --- a/css/main.css +++ b/css/main.css @@ -34,6 +34,9 @@ body { line-height: 1.43; color: var(--navy-900); letter-spacing: normal; + text-rendering: optimizeLegibility; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; } .center { diff --git a/lib/css/styles.js b/lib/css/styles.js index a690c72..fb0546d 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -380,6 +380,8 @@ const styles = { lineHeight: 'normal', letterSpacing: 'normal', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, fontNormal: { @@ -392,6 +394,8 @@ const styles = { lineHeight: '1.43', letterSpacing: 'normal', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, fontMidBig: { @@ -404,6 +408,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, font16: { @@ -416,6 +422,8 @@ const styles = { lineHeight: '1.25', letterSpacing: '-0.15px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, font20: { @@ -426,6 +434,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, font24: { @@ -438,6 +448,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, fontBig: { @@ -450,6 +462,8 @@ const styles = { lineHeight: '1.33', letterSpacing: '-0.25px', textRendering: 'optimizelegibility', + '-webkit-font-smoothing': 'antialiased', + '-moz-osx-font-smoothing': 'grayscale' }, fontHeavy: { @@ -874,7 +888,7 @@ const styles = { opacity: 0 }, to: { - bottom: '30px', + bottom: '24px', opacity: 1 } }, @@ -891,9 +905,10 @@ const styles = { toast: { visibility: 'hidden', + display: 'inline-flex', position: 'absolute', left: '32px', - bottom: '32px', + bottom: '24px', width: '33%', padding: '14px 16px', zIndex: '200', @@ -1075,10 +1090,8 @@ const styles = { borderRadius: '8px' }, '& $toast': { - position: 'relative', - left: 'auto', - width: '80%', - margin: 'auto' + left: 'calc((100% - 80% - 32px) / 2)', + width: '80%' } }, @@ -1091,7 +1104,6 @@ const styles = { boxShadow: '0 9px 15px -7px rgba(33, 34, 66, 0.04), 0 9px 46px 8px rgba(33, 34, 66, 0.08), 0 24px 38px 3px rgba(33, 34, 66, 0.12)', backgroundColor: colors.white, overflow: 'hidden', - display: 'block' }, widgetIcon: { @@ -1190,9 +1202,6 @@ const styles = { backgroundImage: `url(${settingsIcon})`, backgroundRepeat: 'no-repeat', backgroundPosition: 'center', - // '&:hover': { - // backgroundColor: colors.purple400 - // }, zIndex: 10, }, diff --git a/lib/views/DialView.js b/lib/views/DialView.js index 80ff155..93b0bb3 100644 --- a/lib/views/DialView.js +++ b/lib/views/DialView.js @@ -30,7 +30,7 @@ export default class DialView extends BaseElement { const dialTitleDiv = createDiv({ id: 'title', className: `${classes['fontBig']} ${classes['fontDemi']} ${classes['dialTitle']}`, innerText: 'Make a call'}); const descDiv = createDiv({id: 'desc_div', innerText: 'Enter the user ID of the user you wish to call, then press one of the video or voice call buttons', - className: `${classes['fontNormal']} ${classes['fontHeavy']} ${classes['dialDesc']}` + className: `${classes['fontNormal']} ${classes['dialDesc']}` }); const peerId = createInput({ From b2cce8240edbccbb7a22e69ab58c0774c5af13b1 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Thu, 18 Jun 2020 15:03:58 +0900 Subject: [PATCH 44/64] [CALLS-534]widget Sample App Design Improvements 1. nickname color font property change. 2. sign-in button font property change --- lib/components/Header.js | 2 +- lib/css/styles.js | 5 +++-- lib/views/DialView.js | 2 +- lib/views/LoginView.js | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/components/Header.js b/lib/components/Header.js index 8da53bd..90cbc9a 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -48,7 +48,7 @@ export default class Header extends BaseElement { const headerInfo = createDiv({ id: 'header_info', className: `${classes['headerInfo']}` }); const userId = createDiv({ id: 'header_user_id', - className: `${classes['headerUserId']} ${classes['fontNormal']} ${classes['fontHeavy']}`, + className: `${classes['headerUserId']} ${classes['fontMidBig']} ${classes['fontDemi']}`, innerText: this.args.user.userId || '' }); const nickname = createDiv({ diff --git a/lib/css/styles.js b/lib/css/styles.js index fb0546d..a7ec016 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -61,6 +61,7 @@ const colors = { navy800: '#353761', navy900: '#212242', white: '#ffffff', + purple50: '#ededff', purple300: '#825eeb', purple400: '#6440c4', green300: '#1fcca1', @@ -1076,7 +1077,7 @@ const styles = { display: 'block' }, '& $headerNickname': { - display: 'block' + display: 'block', }, '& $formContainer': { boxSizing: 'border-box', @@ -1146,7 +1147,7 @@ const styles = { headerNickname: { display: 'none', - color: colors.navy200 + color: colors.purple50 }, menuItems: { diff --git a/lib/views/DialView.js b/lib/views/DialView.js index 93b0bb3..12a27d5 100644 --- a/lib/views/DialView.js +++ b/lib/views/DialView.js @@ -30,7 +30,7 @@ export default class DialView extends BaseElement { const dialTitleDiv = createDiv({ id: 'title', className: `${classes['fontBig']} ${classes['fontDemi']} ${classes['dialTitle']}`, innerText: 'Make a call'}); const descDiv = createDiv({id: 'desc_div', innerText: 'Enter the user ID of the user you wish to call, then press one of the video or voice call buttons', - className: `${classes['fontNormal']} ${classes['dialDesc']}` + className: `${classes['fontNormal']} ${classes['dialDesc']} ${classes['fontHeavy']}` }); const peerId = createInput({ diff --git a/lib/views/LoginView.js b/lib/views/LoginView.js index 8f1a6c2..32baeeb 100644 --- a/lib/views/LoginView.js +++ b/lib/views/LoginView.js @@ -49,7 +49,7 @@ export default class LoginView extends BaseElement { const inputAccessToken = createInput({ id: 'input_access_token', className: `${classes['field']} ${classes['fontNormal']}` }); const btnLogin = createButton({ id: 'btn_login', className: `${classes['btn']} ${classes['btnPrimary']} ${classes['btnMid']} ${classes['loginButton']} ${classes['fontNormal']}`, }); - const loginLabel = createLabel({ id: 'login_label', className: `${classes['fontNormal']} ${classes['fontColorWhite']}`, innerText: 'Sign in' }); + const loginLabel = createLabel({ id: 'login_label', className: `${classes['fontNormal']} ${classes['fontColorWhite']} ${classes['fontDemi']}`, innerText: 'Sign in' }); btnLogin.appendChild(loginLabel); btnLogin.onclick = () => { const appId = inputAppId.value; From 68b193ec441e442f68350a77dc859dee200be71f Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Fri, 19 Jun 2020 12:27:04 +0900 Subject: [PATCH 45/64] [CALLS-534]widget Sample App Design Improvements Fix typo --- lib/css/styles.js | 2 +- lib/views/AppInfoView.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/css/styles.js b/lib/css/styles.js index a7ec016..7de439c 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -479,7 +479,7 @@ const styles = { color: colors.white }, - fonrReadOnlyColor: { + fontReadOnlyColor: { color: colors.navy600 }, diff --git a/lib/views/AppInfoView.js b/lib/views/AppInfoView.js index 7a8136f..7e22a52 100644 --- a/lib/views/AppInfoView.js +++ b/lib/views/AppInfoView.js @@ -61,7 +61,7 @@ export default class AppInfoView extends BaseElement { const applicationName = createLabel({ id: 'app_name', innerText: 'Voice & Video', - className: `${classes['appInfoLabel']} ${classes['appName']} ${classes['fontNormal']} ${classes['fonrReadOnlyColor']}` + className: `${classes['appInfoLabel']} ${classes['appName']} ${classes['fontNormal']} ${classes['fontReadOnlyColor']}` }); applicationInfoContainer.appendChild(applicationNameLabel); @@ -81,7 +81,7 @@ export default class AppInfoView extends BaseElement { const applicationID = createLabel({ id: 'app_id', innerText: this.args.appId, - className: `${classes['appInfoLabel']} ${classes['appInfoIdLabel']} ${classes['fontNormal']} ${classes['fonrReadOnlyColor']}` + className: `${classes['appInfoLabel']} ${classes['appInfoIdLabel']} ${classes['fontNormal']} ${classes['fontReadOnlyColor']}` }); const appInfoIdCopy = createDiv({ From 49e923028bc18178df2f5b04da7bc19f1bf3cb85 Mon Sep 17 00:00:00 2001 From: danney-chun <63285271+danney-chun@users.noreply.github.com> Date: Fri, 19 Jun 2020 13:39:29 +0900 Subject: [PATCH 46/64] [CALLS-534]widget Sample App Design Improvements version change 1.0.1 -> 1.1.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 60bdf4c..2666a53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "calls-quickstart", - "version": "1.0.1", + "version": "1.1.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b3c7269..127f99d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calls-quickstart", - "version": "1.0.1", + "version": "1.1.0", "description": "", "main": "app.js", "scripts": { From f241b57dbebbc2e1a01222c0f456cb252ff21b4d Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Fri, 22 May 2020 17:47:20 +0900 Subject: [PATCH 47/64] Update SDK version to 1.1.3 --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2666a53..81c2241 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6121,9 +6121,9 @@ } }, "sendbird-calls": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sendbird-calls/-/sendbird-calls-1.0.1.tgz", - "integrity": "sha512-f2EK+1dvaUnYrHYuyItpApi4RhQ3hEDnj2B3FuXlvF2K2BAVpr6F9DhaDs0Mqce8liiMEbx6+KLZ9zw1wNcxJA==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sendbird-calls/-/sendbird-calls-1.1.3.tgz", + "integrity": "sha512-bYKg8eFCciQQM3Pj5auIsX51JK9xhyrzL7zZpKZMQTJneA981BhxG0scNmHr+5DovdcnZHqgUoxUkCrIxFwVjw==" }, "serialize-javascript": { "version": "2.1.2", diff --git a/package.json b/package.json index 127f99d..20ae896 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "express": "^4.17.1", "jss": "^10.0.3", "jss-preset-default": "^10.0.3", - "sendbird-calls": "^1.0.1", + "sendbird-calls": "^1.1.3", "uuid": "^3.3.3" } } From 965a9797fc95ae476dcdc55308d52503444541d4 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Thu, 25 Jun 2020 19:16:08 +0900 Subject: [PATCH 48/64] Update design --- lib/components/Header.js | 63 +++++++++++++++++++++++++--------------- lib/components/Menu.js | 24 ++++++++++----- lib/css/styles.js | 55 ++++++++++++++++++++++++++++------- lib/views/CallLogItem.js | 34 +++++++++++++++------- lib/views/CallView.js | 9 ++++-- 5 files changed, 130 insertions(+), 55 deletions(-) diff --git a/lib/components/Header.js b/lib/components/Header.js index 90cbc9a..751d8a8 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -1,6 +1,6 @@ import SendBirdCall from "sendbird-calls"; import BaseElement from "./BaseElement"; -import { createDiv } from "../utils/domUtil"; +import { createDiv, replaceClassName } from "../utils/domUtil"; import Menu from "../components/Menu"; import { sheet, classes } from "../css/styles"; @@ -32,48 +32,62 @@ export default class Header extends BaseElement { } build() { - const userDiv = createDiv({ - id: 'header_user_div', - className: `${classes['userDiv']} ${classes['center']}` - }); + let userDiv = createDiv({ className: `${classes['userDiv']}` }); let profileImg; if (this.args.user && this.args.user.profileUrl) { sheet.update({ profileUrl: this.args.user.profileUrl }); - profileImg = createDiv({ id: 'header_profile_img', className: classes['profileSmall'] }); + profileImg = createDiv({ className: classes['profileSmall'] }); } else { - profileImg = createDiv({ id: 'header_avatar', className: `${classes['avatar']}` }); + profileImg = createDiv({ className: `${classes['avatar']}` }); } - const headerInfo = createDiv({ id: 'header_info', className: `${classes['headerInfo']}` }); - const userId = createDiv({ - id: 'header_user_id', - className: `${classes['headerUserId']} ${classes['fontMidBig']} ${classes['fontDemi']}`, - innerText: this.args.user.userId || '' - }); + const headerInfo = createDiv({ className: `${classes['headerInfo']}` }); const nickname = createDiv({ - id: 'header_nickname', - className: `${classes['headerNickname']} ${classes['fontSmall']}`, - innerText: this.args.user.nickname || 'no nickname' + className: `${classes['headerNickname']} ${classes['fontMidBig']} ${classes['fontDemi']}`, + innerText: this.args.user.nickname || '—' + }); + const userId = createDiv({ + className: `${classes['headerUserId']} ${classes['fontSmall']}`, + innerText: `User ID: ${this.args.user.userId || ''}` }); - headerInfo.appendChild(userId); headerInfo.appendChild(nickname); + headerInfo.appendChild(userId); userDiv.appendChild(profileImg); userDiv.appendChild(headerInfo); + if (!this.args.isWidget) { + const userDetail = userDiv.cloneNode(true); + replaceClassName(userDetail, classes['userDiv'], classes['userDetail']); + + userDiv = new Menu({ + element: userDiv, + items: [ + { + element: userDetail + }, + { + label: 'Sign out', + callback: () => { + SendBirdCall.deauthenticate(); + this.sendToParent('deauthenticate'); + } + } + ], + divider: createDiv({ className: classes['menuDivider']}) + }) + } + const headerButtons = createDiv({ - id: 'header_buttons', className: `${classes['headerButtons']} ${classes['row']} ${classes['center']}` }); const settingsButton = new Menu({ - id: 'settings_button', element: createDiv({ className: `${classes['settingsButton']}` }), items: this.settingItems }); const closeButton = createDiv({ - id: 'close_button', className: `${classes['closeButton']}` }); closeButton.onclick = () => { @@ -83,15 +97,18 @@ export default class Header extends BaseElement { headerButtons.appendChild(closeButton); const divider = createDiv({ - id: 'header_divider', className: classes['headerDivider'] }); - this.element.appendChild(userDiv); + if (userDiv instanceof BaseElement) { + userDiv.appendToBaseElement(this); + } else { + this.element.appendChild(userDiv); + } this.element.appendChild(divider); this.element.appendChild(headerButtons); - if(!this.args.isWidget){ + if (!this.args.isWidget) { const headerLogo = createDiv({ id: 'header_logo', className: `${classes['headerLogo']}`}); this.element.appendChild(headerLogo); } diff --git a/lib/components/Menu.js b/lib/components/Menu.js index 5a5deba..1ac3de4 100644 --- a/lib/components/Menu.js +++ b/lib/components/Menu.js @@ -1,12 +1,13 @@ import BaseElement from "./BaseElement"; -import {createButton, createDiv, createLabel} from "../utils/domUtil"; +import { createButton, createDiv, createLabel } from "../utils/domUtil"; import { classes } from "../css/styles"; export default class Menu extends BaseElement { - constructor({ id, className, parent, element, items } = {}) { + constructor({ id, className, divider, parent, element, items } = {}) { super({ id, className, parent, element }); this.items = items; + this.divider = divider; this.opened = false; } @@ -22,17 +23,26 @@ export default class Menu extends BaseElement { this.menuItems = createDiv({ className: `${classes['menuItems']} ${classes['hidden']}` }); this.items.forEach((item) => { - const { label, callback } = item; - const labelElem = createLabel({ + const { label, element, callback } = item; + const labelElem = element ? element : createLabel({ className: `${classes['fontNormal']} ${classes['fontHeavy']}`, innerText: label }); const itemElem = createButton({ className: `${classes['btn']} ${classes['menuItem']}` }); - itemElem.onclick = () => { - callback(); - }; + + if (callback) { + itemElem.onclick = () => { + callback(); + }; + } + itemElem.appendChild(labelElem); this.menuItems.appendChild(itemElem); + + if (this.divider && item !== this.items[this.items.length - 1]) { + const divider = this.divider.cloneNode(true); + this.menuItems.appendChild(divider); + } }); this.element.appendChild(this.menuItems); diff --git a/lib/css/styles.js b/lib/css/styles.js index 7de439c..588cae0 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -183,6 +183,7 @@ const styles = { }, profileSmall: { + flexShrink: '0', width: '40px', height: '40px', borderRadius: '50%', @@ -1052,16 +1053,13 @@ const styles = { } }, '& $userDiv': { + cursor: 'auto', flexDirection: 'row' }, '& $avatar': { width: '40px', height: '40px' }, - '& $profileSmall': { - width: '40px', - height: '40px' - }, '& $headerDivider': { display: 'none' }, @@ -1076,7 +1074,7 @@ const styles = { '& $closeButton': { display: 'block' }, - '& $headerNickname': { + '& $headerUserId': { display: 'block', }, '& $formContainer': { @@ -1132,6 +1130,7 @@ const styles = { userDiv: { display: 'flex', + cursor: 'pointer', flexDirection: 'row-reverse' }, @@ -1142,12 +1141,29 @@ const styles = { }, headerUserId: { - color: colors.white + display: 'none', + wordBreak: 'break-all', + color: colors.purple50 }, headerNickname: { - display: 'none', - color: colors.purple50 + wordBreak: 'break-all', + color: colors.white + }, + + userDetail: { + display: 'flex', + flexDirection: 'row', + '& $profileSmall': { + marginLeft: '0px' + }, + '& $headerNickname': { + color: colors.navy900 + }, + '& $headerUserId': { + color: colors.navy600, + display: 'block' + }, }, menuItems: { @@ -1173,13 +1189,22 @@ const styles = { paddingLeft: '16px', paddingRight: '16px', width: '100%', - height: '32px !important', + height: 'auto', + minHeight: '32px', textAlign: 'left', '&:hover': { backgroundColor: colors.navy50 } }, + menuDivider: { + width: '100%', + height: '1px', + marginTop: '8px', + marginBottom: '8px', + backgroundColor: colors.navy100 + }, + headerDivider: { width: '1px', height: '20px', @@ -1321,7 +1346,7 @@ const styles = { flexDirection: 'row', justifyContent: 'flex-start', position: 'relative', - width: '376px', + width: '100%', minHeight: '88px', height: 'auto', borderTop: 'solid 1px #dee2f2', @@ -1408,7 +1433,15 @@ const styles = { wordBreak: 'break-all', }, - callLogDuration: { + callLogDisplayId: { + display: 'inline-flex', + width: '140px', + height: 'auto', + marginLeft: '12px', + wordBreak: 'break-all', + }, + + callLogEndInfo: { display: 'inline-flex', width: '100%', height: '16px', diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index 14f0916..be14d98 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -11,8 +11,8 @@ export class CallLogItem { constructor({ callLogInfo, className }) { if(callLogInfo) { const wrapper = createListItem({ id: callLogInfo.callId, className: className }); - let callType = null; - let callTypeAlt = ''; + let callType; + let callTypeAlt; if(callLogInfo.isVideoCall){ if(callLogInfo.userRole === 'dc_caller'){ callType = outgoingVideo; @@ -31,14 +31,17 @@ export class CallLogItem { } } - let profileImage = null; - let displayName = ""; + let profileImage; + let displayName; + let displayId; if(callLogInfo.userRole === 'dc_caller'){ profileImage = callLogInfo.callee.profileUrl; - displayName = callLogInfo.callee.userId; + displayName = callLogInfo.callee.nickname || '—'; + displayId = callLogInfo.callee.userId; } else { profileImage = callLogInfo.caller.profileUrl; - displayName = callLogInfo.caller.userId; + displayName = callLogInfo.caller.nickname || '—'; + displayId = callLogInfo.caller.userId; } const icoCallType = createImg({ className: `${classes['callLogItemType']}`, src: callType, alt: callTypeAlt }); @@ -75,15 +78,24 @@ export class CallLogItem { callDurationTime = '0s'; } - const displayNameLabel = createLabel({ className: `${classes['callLogDisplayName']} ${classes['fontNormal']} ${classes['fontHeavy']}`, innerText: displayName }); - const callDuration = createLabel({ className: `${classes['callLogDuration']} ${classes['fontSmall']}`, innerText: callDurationTime }); - const callEndReason = createLabel({ className: `${classes['callLogDuration']} ${classes['fontSmall']}`, innerText: callLogInfo.endResult }); + const displayNameLabel = createLabel({ + className: `${classes['callLogDisplayName']} ${classes['fontNormal']} ${classes['fontHeavy']}`, + innerText: displayName + }); + const displayIdLabel = createLabel({ + className: `${classes['callLogDisplayId']} ${classes['fontNormal']} ${classes['fontHeavy']}`, + innerText: `User ID: ${displayId}` + }); + const callEndInfo = createLabel({ + className: `${classes['callLogEndInfo']} ${classes['fontSmall']}`, + innerText: `${callLogInfo.endResult} · ${callDurationTime}` + }); const callLogInfoDiv = createDiv({ className: `${classes['callLogInfoDiv']}` }); callLogInfoDiv.appendChild(displayNameLabel); - callLogInfoDiv.appendChild(callDuration); - callLogInfoDiv.appendChild(callEndReason); + callLogInfoDiv.appendChild(displayIdLabel); + callLogInfoDiv.appendChild(callEndInfo); let callStartTime = new Date(callLogInfo.startedAt); diff --git a/lib/views/CallView.js b/lib/views/CallView.js index 504b503..ca0fc37 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -1,7 +1,6 @@ import BaseElement from "../components/BaseElement"; import { createAudio, createDiv, createImg, createLabel, createVideo } from "../utils/domUtil"; import { getCallOption } from "../utils/util"; -import { hasClassName } from "../utils/domUtil"; import CallButtons from "./CallButtons"; import { classes } from "../css/styles.js"; import PeriodicJob from "../modules/periodicJob"; @@ -30,7 +29,11 @@ export default class CallView extends BaseElement { className: classes['remoteProfile'], onerror: (e) => e.target.style.visibility = 'hidden' }); - this.peerName = createLabel({ id: 'peer_name', innerText: (remoteUser.nickname ? remoteUser.nickname : remoteUser.userId), className: `${classes['peerName']} ${classes['fontBig']} ${classes['fontDemi']}` }); + this.peerName = createLabel({ + id: 'peer_name', + innerText: (remoteUser.nickname ? remoteUser.nickname : remoteUser.userId), + className: `${classes['peerName']} ${classes['fontBig']} ${classes['fontDemi']}` + }); let connectionText; if (this.call.isVideoCall) { @@ -70,7 +73,7 @@ export default class CallView extends BaseElement { this.call.setLocalMediaView(this.localMediaView); this.call.setRemoteMediaView(this.remoteMediaView); - let background = null; + let background; if (this.args.isWidget) { background = createDiv({ className: `${classes['callBackground']} ${classes['callBackgroundWidget']}` }); } else { From be6718e7ba1d6538dce94b8b3b3a71e686d645ec Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Mon, 29 Jun 2020 12:42:35 +0900 Subject: [PATCH 49/64] Use short-handed operator Co-authored-by: Dongjin Jung --- lib/components/Menu.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/components/Menu.js b/lib/components/Menu.js index 1ac3de4..eb1b87b 100644 --- a/lib/components/Menu.js +++ b/lib/components/Menu.js @@ -24,7 +24,7 @@ export default class Menu extends BaseElement { this.items.forEach((item) => { const { label, element, callback } = item; - const labelElem = element ? element : createLabel({ + const labelElem = element || createLabel({ className: `${classes['fontNormal']} ${classes['fontHeavy']}`, innerText: label }); @@ -69,4 +69,4 @@ export default class Menu extends BaseElement { this.menuItems.classList.add(classes['hidden']); this.opened = false; } -} \ No newline at end of file +} From 175574356a8d827b52fdbf19599c4e096dcef388 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Fri, 31 Jul 2020 16:11:08 +0900 Subject: [PATCH 50/64] Add playsinline in video tag --- lib/utils/domUtil.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/utils/domUtil.js b/lib/utils/domUtil.js index 1491ae6..67b670d 100644 --- a/lib/utils/domUtil.js +++ b/lib/utils/domUtil.js @@ -55,7 +55,10 @@ export function createAudio({ id, className, autoplay, muted, remote } = {}) { } export function createVideo({ id, className, autoplay, muted, remote } = {}) { - const attrs = {}; + const attrs = { + playsinline: '' + }; + const element = _createElement({ tagName: 'video', id: id, className: className, attrs: attrs }); element.autoplay = autoplay; From 6775489d8287a94a08dadb2672332f439a00bdd7 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Fri, 21 Aug 2020 17:23:52 +0900 Subject: [PATCH 51/64] Fix minors --- lib/components/Menu.js | 16 ++++++++-------- lib/css/styles.js | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/components/Menu.js b/lib/components/Menu.js index eb1b87b..8247141 100644 --- a/lib/components/Menu.js +++ b/lib/components/Menu.js @@ -20,9 +20,9 @@ export default class Menu extends BaseElement { this.style.backgroundColor = ''; }); - this.menuItems = createDiv({ className: `${classes['menuItems']} ${classes['hidden']}` }); + this.menuItemsDiv = createDiv({ className: `${classes['menuItemsDiv']} ${classes['hidden']}` }); - this.items.forEach((item) => { + this.items.forEach((item, idx) => { const { label, element, callback } = item; const labelElem = element || createLabel({ className: `${classes['fontNormal']} ${classes['fontHeavy']}`, @@ -37,15 +37,15 @@ export default class Menu extends BaseElement { } itemElem.appendChild(labelElem); - this.menuItems.appendChild(itemElem); + this.menuItemsDiv.appendChild(itemElem); - if (this.divider && item !== this.items[this.items.length - 1]) { + if (this.divider && idx < (this.items.length - 1)) { const divider = this.divider.cloneNode(true); - this.menuItems.appendChild(divider); + this.menuItemsDiv.appendChild(divider); } }); - this.element.appendChild(this.menuItems); + this.element.appendChild(this.menuItemsDiv); this.element.onclick = (e) => { e.stopPropagation(); if (this.opened) { @@ -61,12 +61,12 @@ export default class Menu extends BaseElement { } show() { - this.menuItems.classList.remove(classes['hidden']); + this.menuItemsDiv.classList.remove(classes['hidden']); this.opened = true; } hide() { - this.menuItems.classList.add(classes['hidden']); + this.menuItemsDiv.classList.add(classes['hidden']); this.opened = false; } } diff --git a/lib/css/styles.js b/lib/css/styles.js index 588cae0..bdf2b59 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -1166,7 +1166,7 @@ const styles = { }, }, - menuItems: { + menuItemsDiv: { position: 'absolute', top: '40px', right: '0', From 75a04df46c05855c0b58692831eb6f4953c3a82a Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Fri, 21 Aug 2020 17:33:10 +0900 Subject: [PATCH 52/64] Avoid the reuse of the same name --- lib/components/Header.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/components/Header.js b/lib/components/Header.js index 751d8a8..d9ee0ab 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -57,11 +57,12 @@ export default class Header extends BaseElement { userDiv.appendChild(profileImg); userDiv.appendChild(headerInfo); + let userDivMenu; if (!this.args.isWidget) { const userDetail = userDiv.cloneNode(true); replaceClassName(userDetail, classes['userDiv'], classes['userDetail']); - userDiv = new Menu({ + userDivMenu = new Menu({ element: userDiv, items: [ { @@ -100,8 +101,8 @@ export default class Header extends BaseElement { className: classes['headerDivider'] }); - if (userDiv instanceof BaseElement) { - userDiv.appendToBaseElement(this); + if (userDivMenu) { + userDivMenu.appendToBaseElement(this); } else { this.element.appendChild(userDiv); } From 163901670d618d8aeac780bcbd944c293180ae75 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Wed, 26 Aug 2020 01:15:48 +0900 Subject: [PATCH 53/64] Update UI by design QA --- lib/components/Header.js | 7 +++++-- lib/components/Menu.js | 6 ++++-- lib/css/styles.js | 30 +++++++++++++++++++++++++++--- lib/views/CallLogItem.js | 2 +- lib/views/CallLogView.js | 2 +- 5 files changed, 38 insertions(+), 9 deletions(-) diff --git a/lib/components/Header.js b/lib/components/Header.js index d9ee0ab..3d213d2 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -44,7 +44,9 @@ export default class Header extends BaseElement { const headerInfo = createDiv({ className: `${classes['headerInfo']}` }); const nickname = createDiv({ - className: `${classes['headerNickname']} ${classes['fontMidBig']} ${classes['fontDemi']}`, + className: (this.args.isWidget) + ? `${classes['headerNickname']} ${classes['fontMidBig']} ${classes['fontDemi']}` + : `${classes['headerNickname']} ${classes['fontNormal']} ${classes['fontDemi']}`, innerText: this.args.user.nickname || '—' }); const userId = createDiv({ @@ -66,7 +68,8 @@ export default class Header extends BaseElement { element: userDiv, items: [ { - element: userDetail + element: userDetail, + disabled: true, }, { label: 'Sign out', diff --git a/lib/components/Menu.js b/lib/components/Menu.js index 8247141..3ba7a1c 100644 --- a/lib/components/Menu.js +++ b/lib/components/Menu.js @@ -23,12 +23,14 @@ export default class Menu extends BaseElement { this.menuItemsDiv = createDiv({ className: `${classes['menuItemsDiv']} ${classes['hidden']}` }); this.items.forEach((item, idx) => { - const { label, element, callback } = item; + const { label, element, disabled, callback } = item; const labelElem = element || createLabel({ className: `${classes['fontNormal']} ${classes['fontHeavy']}`, innerText: label }); - const itemElem = createButton({ className: `${classes['btn']} ${classes['menuItem']}` }); + const itemElem = createButton({ + className: `${classes['btn']} ${disabled ? classes['disabledMenuItem'] : classes['menuItem']}` + }); if (callback) { itemElem.onclick = () => { diff --git a/lib/css/styles.js b/lib/css/styles.js index bdf2b59..9fc8dd0 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -171,6 +171,7 @@ const styles = { }, avatar: { + flexShrink: '0', width: '32px', height: '32px', borderRadius: '50%', @@ -1155,8 +1156,16 @@ const styles = { display: 'flex', flexDirection: 'row', '& $profileSmall': { + width: '32px', + height: '32px', + marginLeft: '0px' + }, + '& $avatar': { marginLeft: '0px' }, + '& $headerInfo': { + width: '164px' + }, '& $headerNickname': { color: colors.navy900 }, @@ -1174,11 +1183,11 @@ const styles = { paddingBottom: '8px', paddingLeft: '0px', paddingRight: '0px', - width: '200px', + width: '248px', borderRadius: '4px', boxShadow: '0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12)', backgroundColor: colors.white, - zIndex: '1' + zIndex: '1', }, menuItem: { @@ -1197,6 +1206,20 @@ const styles = { } }, + disabledMenuItem: { + display: 'block', + boxSizing: 'border-box', + cursor: 'default', + paddingTop: '0px', + paddingBottom: '0px', + paddingLeft: '16px', + paddingRight: '16px', + width: '100%', + height: 'auto', + minHeight: '32px', + textAlign: 'left', + }, + menuDivider: { width: '100%', height: '1px', @@ -1439,6 +1462,7 @@ const styles = { height: 'auto', marginLeft: '12px', wordBreak: 'break-all', + color: colors.navy600, }, callLogEndInfo: { @@ -1446,7 +1470,7 @@ const styles = { width: '100%', height: '16px', marginLeft: '12px', - marginTop: '4px', + marginTop: '8px', color: colors.navy600 }, diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index be14d98..120fcf1 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -83,7 +83,7 @@ export class CallLogItem { innerText: displayName }); const displayIdLabel = createLabel({ - className: `${classes['callLogDisplayId']} ${classes['fontNormal']} ${classes['fontHeavy']}`, + className: `${classes['callLogDisplayId']} ${classes['fontSmall']}`, innerText: `User ID: ${displayId}` }); const callEndInfo = createLabel({ diff --git a/lib/views/CallLogView.js b/lib/views/CallLogView.js index a4f52bf..a923c4a 100644 --- a/lib/views/CallLogView.js +++ b/lib/views/CallLogView.js @@ -34,7 +34,7 @@ export default class CallLogView extends BaseElement{ const callLogDescription = createDiv({ id: 'call_log_desc', className: `${classes['callLogListDesc']}` }); const callLogDescLogo = createDiv({ className: `${classes['callLogDescLogo']}` }); const callLogDescTitle = createDiv({ innerText: 'Sendbird Calls Quickstart', className: `${classes['callLogDescTitle']} ${classes['font24']} ${classes['fontDemi']}` }); - const callLogDescLabel = createDiv({ innerText: 'This is the Sendbird Calls Quickstart page. Lorem ipsum', className: `${classes['callLogDescLabel']} ${classes['fontNormal']} ${classes['fontHeavy']}` }); + const callLogDescLabel = createDiv({ innerText: 'This is the Sendbird Calls Quickstart page.', className: `${classes['callLogDescLabel']} ${classes['fontNormal']} ${classes['fontHeavy']}` }); callLogDescription.appendChild(callLogDescLogo); callLogDescription.appendChild(callLogDescTitle); callLogDescription.appendChild(callLogDescLabel); From b6f974d32f973ada3fcf99c54685ce754f236d2c Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Thu, 27 Aug 2020 11:34:42 +0900 Subject: [PATCH 54/64] Change border of list item from top to bottom --- lib/css/styles.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/css/styles.js b/lib/css/styles.js index 9fc8dd0..f1de68a 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -1372,7 +1372,7 @@ const styles = { width: '100%', minHeight: '88px', height: 'auto', - borderTop: 'solid 1px #dee2f2', + borderBottom: 'solid 1px #dee2f2', paddingBottom: '5px', }, From f772effc92f40fd1611f08dd5deaa2ce399b4fb2 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Thu, 27 Aug 2020 12:45:24 +0900 Subject: [PATCH 55/64] Prevent word break in headerInfo --- lib/css/styles.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/css/styles.js b/lib/css/styles.js index f1de68a..525e7be 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -1143,12 +1143,12 @@ const styles = { headerUserId: { display: 'none', - wordBreak: 'break-all', + whiteSpace: 'nowrap', color: colors.purple50 }, headerNickname: { - wordBreak: 'break-all', + whiteSpace: 'nowrap', color: colors.white }, @@ -1163,9 +1163,6 @@ const styles = { '& $avatar': { marginLeft: '0px' }, - '& $headerInfo': { - width: '164px' - }, '& $headerNickname': { color: colors.navy900 }, @@ -1183,7 +1180,7 @@ const styles = { paddingBottom: '8px', paddingLeft: '0px', paddingRight: '0px', - width: '248px', + minWidth: '248px', borderRadius: '4px', boxShadow: '0 3px 5px -3px rgba(33, 34, 66, 0.04), 0 3px 14px 2px rgba(33, 34, 66, 0.08), 0 8px 10px 1px rgba(33, 34, 66, 0.12)', backgroundColor: colors.white, From 4795827cc54e20276e3554dc4e19f60e6406ac56 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Thu, 27 Aug 2020 13:23:43 +0900 Subject: [PATCH 56/64] Fix CallLogView styles --- lib/css/styles.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/css/styles.js b/lib/css/styles.js index 525e7be..6e45b0a 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -1407,7 +1407,7 @@ const styles = { callLogProfileDiv: { display: 'inline-flex', - width: '40px', + width: '32px', height: '100%' }, @@ -1432,15 +1432,15 @@ const styles = { display: 'block', width: '20px', height: '20px', - marginLeft: '18px', - marginTop: '26px', + marginLeft: '15px', + marginTop: '24px', }, callLogProfileImg: { display: 'block', - width: '40px', - height: '40px', - marginTop: '16px', + width: '32px', + height: '32px', + marginTop: '18px', borderRadius: '50%' }, From f40e5ea106638f5933cfb4236156491384257a33 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Thu, 27 Aug 2020 13:29:19 +0900 Subject: [PATCH 57/64] Update SDK version to 1.2.4 --- package-lock.json | 6 +++--- package.json | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 81c2241..7b2f32d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6121,9 +6121,9 @@ } }, "sendbird-calls": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sendbird-calls/-/sendbird-calls-1.1.3.tgz", - "integrity": "sha512-bYKg8eFCciQQM3Pj5auIsX51JK9xhyrzL7zZpKZMQTJneA981BhxG0scNmHr+5DovdcnZHqgUoxUkCrIxFwVjw==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sendbird-calls/-/sendbird-calls-1.2.4.tgz", + "integrity": "sha512-wNhgD9zM+NKLXqH7d6xR3iLwws8jZxrx8vV5VWYASzot+7YOPv7g6ArOgVXn+m/twGGM1c2KQ4Y8HZYz/v3XiQ==" }, "serialize-javascript": { "version": "2.1.2", diff --git a/package.json b/package.json index 20ae896..76de27d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calls-quickstart", - "version": "1.1.0", + "version": "1.2.0", "description": "", "main": "app.js", "scripts": { @@ -34,7 +34,7 @@ "express": "^4.17.1", "jss": "^10.0.3", "jss-preset-default": "^10.0.3", - "sendbird-calls": "^1.1.3", + "sendbird-calls": "^1.2.4", "uuid": "^3.3.3" } } From d6e2bec9f69847b7718dd24b426afea6498905b6 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Thu, 27 Aug 2020 14:42:34 +0900 Subject: [PATCH 58/64] Fix CallLogView styles (2) --- lib/css/styles.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/css/styles.js b/lib/css/styles.js index 6e45b0a..9dd32ca 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -1370,7 +1370,6 @@ const styles = { minHeight: '88px', height: 'auto', borderBottom: 'solid 1px #dee2f2', - paddingBottom: '5px', }, callLogEmptyWrap: { @@ -1432,7 +1431,7 @@ const styles = { display: 'block', width: '20px', height: '20px', - marginLeft: '15px', + marginLeft: '16px', marginTop: '24px', }, @@ -1476,7 +1475,7 @@ const styles = { width: '120px', height: '16px', textAlign: 'right', - marginTop: '16px', + marginTop: '18px', marginRight: '16px', color: colors.navy600 }, @@ -1497,7 +1496,7 @@ const styles = { backgroundPosition: 'center', backgroundRepeat: 'no-repeat', marginRight: '12px', - marginTop: '12px', + marginTop: '8px', backgroundColor: colors.navy80, cursor: 'pointer' }, @@ -1509,7 +1508,7 @@ const styles = { backgroundImage: `url(${thumbnailVoice})`, backgroundPosition: 'center', backgroundRepeat: 'no-repeat', - marginTop: '12px', + marginTop: '8px', marginRight: '16px', backgroundColor: colors.navy80, cursor: 'pointer' From eef75b314b721ad94c963c672340c78165f8c6c2 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Wed, 9 Sep 2020 10:27:54 +0900 Subject: [PATCH 59/64] Update SDK version to 1.2.5 --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7b2f32d..5bdfae6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "calls-quickstart", - "version": "1.1.0", + "version": "1.2.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -6121,9 +6121,9 @@ } }, "sendbird-calls": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sendbird-calls/-/sendbird-calls-1.2.4.tgz", - "integrity": "sha512-wNhgD9zM+NKLXqH7d6xR3iLwws8jZxrx8vV5VWYASzot+7YOPv7g6ArOgVXn+m/twGGM1c2KQ4Y8HZYz/v3XiQ==" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/sendbird-calls/-/sendbird-calls-1.2.5.tgz", + "integrity": "sha512-HsPo6lpHi7wjhMNF9U7Gf6CH5vUWvLJ4qBFwEWOHx9203xkXf8JqsxXUo0je6nKtviWNAmDwP0BUABzy3rcV8g==" }, "serialize-javascript": { "version": "2.1.2", diff --git a/package.json b/package.json index 76de27d..2da4bab 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "express": "^4.17.1", "jss": "^10.0.3", "jss-preset-default": "^10.0.3", - "sendbird-calls": "^1.2.4", + "sendbird-calls": "^1.2.5", "uuid": "^3.3.3" } } From e17aa175129def8c8a464809638638ff3ef0d828 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Wed, 9 Sep 2020 10:32:41 +0900 Subject: [PATCH 60/64] Bump sample version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2da4bab..36f6027 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calls-quickstart", - "version": "1.2.0", + "version": "1.2.1", "description": "", "main": "app.js", "scripts": { From 4c2d89241bd8374525c6d69ef13cd24d59b2c17f Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Wed, 19 Aug 2020 13:32:50 +0900 Subject: [PATCH 61/64] Add sound effect features in sample --- README.md | 20 ++++++++++++++++++++ lib/assets/Dialing.mp3 | Bin 0 -> 179834 bytes lib/assets/Reconnected.mp3 | Bin 0 -> 95193 bytes lib/assets/Reconnecting.mp3 | Bin 0 -> 101462 bytes lib/assets/Ringing.mp3 | Bin 0 -> 250560 bytes lib/views/CallView.js | 1 - lib/views/LoginView.js | 11 ++++++++++- package-lock.json | 8 ++++---- package.json | 2 +- webpack.config.js | 2 +- 10 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 lib/assets/Dialing.mp3 create mode 100644 lib/assets/Reconnected.mp3 create mode 100644 lib/assets/Reconnecting.mp3 create mode 100644 lib/assets/Ringing.mp3 diff --git a/README.md b/README.md index 96f6f5f..d77f71e 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,26 @@ $ npm run start
+##Sound Effects +You can use different sound effects to enhance the user experience for events that take place while using Sendbird Calls. + +To add sound effects, use the `SendBirdCall.addDirectCallSound(type: SoundType, uri: string)` method for the following events: dialing, ringing, reconnecting, and reconnected. Remember to set sound effects before the mentioned events occur. To remove sound effects, use the `SendBirdCall.Options.removeDirectCallSound(type: SoundType)` method. + +Use `SendBirdCall.addDirectCallSound(type: SoundType, uri: string)` method to set sound effects for a number of types: dialing, ringing, reconnecting, reconnected. Sound effects must be set before the events occur. To unregister a sound effect, remove it by calling `SendBirdCall.Options.removeDirectCallSound(type: SoundType)`. + +```javascript +// Play on a caller’s side when making a call. +SendBirdCall.addDirectCallSound(SendBirdCall.SoundType.DIALING, DIALING_SOUND_URL); +// Play on a callee’s side when receiving a call. +SendBirdCall.addDirectCallSound(SendBirdCall.SoundType.RINGING, RINGING_SOUND_URL); +// Play when a connection is lost, but the SDK immediately attempts to reconnect. +SendBirdCall.addDirectCallSound(SendBirdCall.SoundType.RECONNECTING, RECONNECTING_SOUND_URL); +// Play when the connection is re-established. +SendBirdCall.addDirectCallSound(SendBirdCall.SoundType.RECONNECTED, RECONNECTED_SOUND_URL); +``` +For more information about sound effects, see the [SDK for JavaScript README for Sound effects](https://github.com/sendbird/sendbird-calls-javascript#sound-effect) + + ## Reference For further detail on Sendbird Calls for JavaScript, refer to [Sendbird Calls SDK for JavaScript README](https://github.com/sendbird/sendbird-calls-javascript/blob/master/README.md). diff --git a/lib/assets/Dialing.mp3 b/lib/assets/Dialing.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..41c46be333379d7e0caebfed92ac901c29042fe4 GIT binary patch literal 179834 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

aidF?yATT48lhszd`=y0mgH1xi88IQNmO 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%0AO8Ka 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�& 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

6tDW)K5x2?lg;_=4mME<#Y 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 XDqikDT=F!g^4w>{h}ea!MHaBQl45 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 A5&!@I literal 0 HcmV?d00001 diff --git a/lib/assets/Reconnecting.mp3 b/lib/assets/Reconnecting.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..a8e74ca6fdeb514e902d10590c60ff0a657d35de GIT binary patch literal 101462 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 XNDPP!1-_vI4n|w($%8-b!~XvOoIA4L literal 0 HcmV?d00001 diff --git a/lib/assets/Ringing.mp3 b/lib/assets/Ringing.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..ea201f19386873628122a045ac8f63e97c2c6ed5 GIT binary patch literal 250560 zcmeFZcR-WdmNp(BK&U3vfPkTgDhWl39ur6)R739yp;zgm9;Npp9fF_`YG~4>sPv9V z7gQ9H4)%hIkPnZZJJ&PwoA2KF-I=-PyS{&9XXj1!`>bc}JXve){f4r;hynl(eNH(( zD0tBqZ@5MT9`)8XLPKGI>Ml7=p-up2tCMA>sp&J=;j}@z9FVI(V63IFZet5vZ zbXW)Fi?R7*i9Lyzw~UvrfBEdeK{?jn(I(t>;{4Sy8WqOc@!Kaq{`R={ z3#GqfhVuDq=jE3##!t>sf=ka)KHlH|)Ui+OxVx|Tmh$P{E@g8!On%qB;uB}4`5inO zuUP&dB}(n;aGOJufQRTFD{K9FF!#Ip!SPe$g~>Xwfw0P+hHKZ!eE5$8!V)QENm71Y zXN`rygGYCS>bSC059b|u;P}~|H>z?`*Y&#OM;&FI0qh>e5z)}pP^%?YE3^(>8V%y^ip<)To|BLaLtFnh-Gt ze4zqjGK_J-7UK0MCi=8;!o_|ZXs3Zv!~;oALkdoh9szS`rF07|0r@3jn0dpo?8kdm z6WQhB;q6SIM3s9d3@xX(MXF@k1^n~2k0_T?C88REbpW8u2>>9G^1CKzf&lEkhDM++ z0IfG;w+h#RCJc#c6#)SZt$>gpuD!kaZaR7QRu6=)pT#%+h00w%9HWFDejOCnD;&uU zD}`E)O{RoagZfyLRe&^XJb(xljNovu1N_)IiMx3!Cx001XXl@ufzBg8K>U2k6t_Ma z1)r(U&wLL(?!bhzH_=of5+PdT0jOTNGZ(uAcKE(AqoC~!9VrDhcEpbrDA1>tQo@!O zp4^jR_vDAs{uMhvio#yVnY!&&6J+81rK zoWMl8ta3w*+S&lO(MWaeX zlE#e6b@6K_ESAkw8#sHG<*BJPSp(H!DJcVOE&YNZg_JnXuz$sA@MpGp@z4+G_oO${ zboJC*a|~%#;pw15hj2nYMFz!(x!4Ttsd{KEdQwzfx$mb884M||GK z)qX7Kq9XMOE;`k!k}Gs(KqQkjSyaHuMebz|oK@j0yeq~!S_1f|wg%E%+0p~bg&h37{5jt>;Y-SIae|HS z$FFe$gCCj;5USrL^dH6v`%&w6v04{0=eo)X`H|onBc47ESbCH?M`2GSNIhP*6axgW zaS5seB~o+bGK>uzBF-tm8tFFq<9JZh_Sk<>=l^-l{=>ArS#~MS#J!Rpd`PLr? zo`;yO6F2=djk%hP6QKBF0F@A{+$xeI79@=;vxDL83&n@4jIA+ZSx1?z3QWx{p`d=y ziWCR%wcU@}y>qt6Lv(I*bgU8|Xw;$(U6U#?HRD*nkRp)`Z3U|&mk|)*a!xehLUh_< zJQs8htoGm}b36yt~!p%}5@{S#8 zxD@1&9Eche-CVZQGlc@m{K|z%b)cKTf=nvrRgJlt7!<~(LQvCJ$dFYz?cN{F|Jnaj zFz{oXu>a&k>E=Br=e9%+2U0dXXRQCi)t$`R_7Yjgw9lHe+m5cag z5QFRX1YT7*UKp2PXrE=3K##7F1WuvAwRlVtjZNG zgyr-3m{1u9%J8d*2m4rBSePhS;OWe{U}=#(iz`MZF>+nurRwlzLsN}|6lDzP%vV*R z#TIl(1-#7pyC$T3%^iF-4cEWM2|C>;eyb8nxQN2@1mPsa&{y&+pf3upw>R4e=M>;(`X-Qen8t%V&stf+~`^fSaDi4ydM!; z%z+e^E|%-&G3Pqs#D?gN#mMB~@ozv3a{aJpAP~mJHI&#F7G0MEI>LpIZFvhp+n{ik z%0G@usZ7NWUE(~0j3?(<;37GB*NhkCmh5HQvRB0-)f9O-!#GUKa3MTbgYqdh3feH zK(UEdD!PKKVpYB1<2e06k>EPeO5KbOmnf@es=!(8Tc_%-G8zfb-Br;4nmBAKC_Y}scWmjQyNs0sB;aQh4S%!wYj}H+N{3J z7KU2j;|@a147X5*AQLB8Ld#QoO%(`M3v~6L-{k)WgkPwB81(&CmYbMMrY<};RnyQS z8Wx*V&#c_%*UE<-6k3!!Z=lFAKsAu!^M+nWMA;&MKun0OPlHLOABt;vE0t#}3zs}z zETCTSW41u?pUB4rXpl{`U&zJ#Msc!XxVWH4!G3wim2F~NjPhy6oO$DA%MjBRc6x~_ zng{_Apnw3kTdeQ0#3NIUbq&E`g;AIbEai7iNdB$HczP04`?a2M;lyt>M()9b8Y9CW zbBEdf+}MEX9r&6(dtJ;GK6bFgsBX$K10$bd&l+MTCAcmHgIYd>u`wtWC<=RY-ayO| z<=e|EhRCVXfR_2?Rq!eQ>L&AJ)bj&fKRf@_3|Ns)UQoQ&kI0oYY-lNb7V8IU>raU{ zjE1{k5h4$3BI8rs=2X#3toF2MGZ+5^!9ha@`ms%iga!^*Mn~Aoe`?$QH^BXvnLnS} zT5!&qD$FHNYqdiWsf~OVu;S;ohJCVScIEu^vLn8FSLsNY8N@1NQXho?$+Dt8I_dOQ` z)JE0NIOKoB0Y9(#_cPE50RHhqJD+b?y}4VI@`6ta$v|YbKPO=@xSoZqXW~z+5{p)K zcPX49Vti@Z$T~*hD%Uh1g;O^;>W=(zl%IXdAL_Sz=O#0~^o?gMM^Rd|7m*g*kR<7v z3bcCW+)BATSdz5_-x>QNS}d`Uwx`xiB{l#A0+%u`^YtsU15toK{>&CVUe{@0Gf~YS z6cZ}9rxT=&7=Q*yq@0ge%&Dr;3b1NWNnJ1<+$`@g?H-LtUW%12(ea=6YRA@;ZQ&2#P<#-0?=VU`LI+~lp3(owU6MqT@LQnoR%>5_T z9%X^YD^OedkrMdz60Qi?F$o^q6vwI;MiwMAsY_R`BJdAUL7^MiIGa_F(A27dI+ zhU%w}{`D|FpZ}r2K$+4CaVT=HF$)sDO|!mazhaN|z0h7b>z5kQooerMK@eDu8!TV- zb>xy@ED7`#jO~fytw?8x%k1aJpZ_tvqfi{%wls~v4ubeLBJDKpMOh$9InL%qQM@nO zAwzF$NmIFp3yb87a?a1}aq_w2#`MMo}cD2Z}{ z%9^pW<$2`QV2q$7Rygcgf5MeBKWD?AjDbJ=mQl7Ys)`L-Hsh0*=En_TBwa3_ zqyR}}R}YT9AVVia-f#?;i!CNOJiHRTtpN@zRmra?`o0PBPiFi-2=0${+Wl*zZK~@D zLh>)9#f)QU^B^3NQ01j!coNotB(!Yz3^~tf6UQeYcZ*cUC4m!wM=&)OLi!Euz8n|e zUVZ)KjbLx;z?C5p+$LJw1>R+)F6{t!GB$P7b^f$}zmB#k&o zqiB&sjB4-(CjJ4iWelG>As?uN7+V$!>oXZ9By&q)dTl{J#tDS4`xvRc8FUnXt0#ba z5B4$saoyql`zF>&$%&yc0td-Sc|u%{B=?>TZLAv441xI3Gm_FEgUj5kt=0kY^$?!UqeiDI6SCi_fTHhFIzqvHp`9_`eS8 zN5!C=qL`bQH@vBYrcQTr49KDU<~f{E6|9k_a>7b1;1~GB<`aN9Csa5(xk#PW*NLxt z)Hf_f$9Q;jCB(M0u;I`FzPEPQ8Dad zuP#M~u33|{SfuVxOb_`a zpB9+8ZG z@h}03LD{&5<*n3l@{josZ`TaNhFB9}!Rz*HKztc44$E)S2XU=D6(aO zRe^Fu^BJ;bxFt$B#wL8PF|uf-XtDrM0Kak%3V2Lz-+s9PE!QBN_QPFCMZlnx8g7 zJuOjgm*ULD8qV-J3u-JwF$83sWGgLb1Uc=?sOGH=6zSTco@_!b!_Vg}QfX*;Nm*M%m}W0Pd!Y zzj~tozPLB~RPqjmGTK5VGGZYOq2Wzw5wU|(+ffyyoTX59*nq>9BVja!afMX4+88|e z`hg82;>fzY76`eilL$Frk2)Qdv=Gtlt8M!qjD|)(JwBh!z(5U+CEj9!#xi(`r(Ej% zdXlpL^*~mE|LYku&gKw`WZudXWmR`t_e$m{byT<>H2_i6g;JcRoELksML7x4f+tovSHM=2E2e zmOhK9^YqH7Z*cBPvar;-M zC={#vZ<-#e9k`vcUr(V7b|)_>zKRp8^^rtc`Oc+S;_d4h$WN6)$RYj@D)M)tr$h=gjO`P7=?rAER*tgG z_1dip9H+(JCYW%j9h00@SAfb($1Cf$M6h>)MVClQ=6lh760*ZGqb_h|?l4}$j=dTA z?0nW5ky8M4zrP7U{?!t%&IYc4{Z2)KN-Dw!%EW4pC z5b)tr;1JT&STq{bBEICRgOX>rGuF`9F5(lzy{sF`3s548QuAH~+l{OH2Hcbg z&gvJYmwmk`DYL~^P&nUeRu3uYB03s&+x9}Qp~8-GLh3uVl_a!-480vx(4DtHQ{3&0 zO}dvyZyq0n1k?*Zb(hT^>;d%mav<%dA|>U8PH;ZWg2Zw$3JS9G31+D;Qcp#_f*OXN zeMH+C8@eDTrkze8N+U(PPO_^TQQ6rQ6s%ssOo+Ij{>2c6t>2Qu>R1MzI`htSFXTZp z<^IeT(s6>fJL?d}4`eT9i?q!sMY|i{%SW?|q$89NxqRO=fo0ou(xbJ=vrC^>|D1wX zwqTJ~jeAo4BGUE!UBjDL_ydW7z*MTN@&0cPL=xpp zg@;~W{}R-HWZ>mlY$~{5Q!j%dJLYM8&3ow!O*n>Zu~#x>#IOd;YGjvBpQ4Vo`yeEC zgIj`5w$83t5!Vuhfxwkl65Z^i*S!dO(y!Yzw8#4v37lahO-4@kSQ~^*zFwzS+@f#H zHWE#a$1|${3IL6O2X~X02jgf3do_z^u%4+0lK9)9oIE{g)ZRqDbFuoaKK}cQ|C-G^ zqa;$^Icq>H3*Ic_v~jAlF$9nbW2hO#g!U!!u{Dt9<<^U6c)=7N%7CZ+m&+gCSwdJD zi-%Ce;LFg8mqr7XCZR;Xv(yjH=NwiraMj~xHa02Fx1>h!O!%b`wzwEIOcG)xVR7gI zX$M^@7Yz?KdzYk1UW2Gz8gLa0n;gD8LW7EPXiA={Sv;)&NbL|^sRT-HnL3nuoW?^* zL0(9NBL>2oZd~mu;_=NxFDvziI4|x!*XCbHH70xdrjKKlsPo&0@by+q8I204jeZ_7#} zYKsP5mH8uZsOzILme23Bvn=2=8Bw7u-27>5$j@*@V!jpiIf7CWjGeUekwADXm#WJXmG+E^r% z@=}y`Sbouwnd&yHln|G&vCLsUsU&pnVbU0k5K0#rJ{mjzC_Fc(&ND(F;FJvKX2>_- zmFv}MCDVNev>*QUFQ&5qnw z3=cgML6b2NvMq3Eu;JqPQ|U!ix#*LlG*kG7(KMwoDl9M^n1bE6n65o{>a z9Y9Dcn`vc@0WMZA35Ir%BefGyuSTOy{q|0nn8YF7eal6{1jM_#<3)SeLfz}TrUFx* zX&463y4&zSdzxgK(66z4RbXhsjtWg}&rZ(FPtrHkc>djxg`I-jajSgbSetYC;nG08 zuy-T$ddd9q%JSbm^t1U#F)&X%8y@sfm|CH5aioTkPJk~!L0MNBEXi~$ zryD1(|0nKeHzU06dUNKR`)Lg0riUZy#ma9!{ASdicbkbo_zc=3ko2P2NCN4!hRM+^ z0(SggOrDT5(QCJsqNWGh-G}iqomd{_(@>8-tp^~eqvYVKZN_U0;3%2nC$6BvhG`7X z#3Mj*-JxR4e3mWnH)F+Rako-V2#cL6YOB5Z>XG={v3qZGr?2nq!e}z+NF5vmuzeIj531bYW4My9 zeTw}&?1HA=b*(`Avrk)2t>s@|QzXwWWUZD;REm|xi)RtZ0idoW@n`nrXU1eUq0SKT zL%uCaF>!LYwTwc(BiekBRTFj7Yx-&q`SEB`zozr>cTM=@I)y&$ zts494*2SFl_oIs5kz{KFuj(pLA|rGoo|^TH4?Pw4#r4QKn3}YXRo|nFRVP>S87dCl zPU$?PC~MmdFg1eZ+PFRbGy>tI@MShS8yQQtrPUmJef!$`t%p->GHMb6Ma9<-y+&6a%%kR*fkWfflj zx)K{tN!EEFFCmd-t8ISx)_o>XTKY_ySZuoVdHa!wzvCs_&sy(|52NNyVzcMjoV0beXSshHfIR@!b5M3F#-3MF1xXIw@s^$E%n)IAE9^Y`d;`-=Qy4SH>n(K?o!?-jgf(bWZ+G#%jko|5F!T?cSuH$jfNB=Jv)J!Y66r z|NH5m?f)tR^O74J?H*Fpg-m|o+Ngf^dU5$8)M#v|j!&N91b*8r|DEh>e%JP1@rs9e zkA#SwT$|m-51K5yu0}2w-EdJ$05*Molt3|&dblII)lhVac2U}uQmt<$Y4{hbjy0WL zf8kytp0{xxYdpfmOS+PL^Dig=NuTVB>hqqncC^D_tYlLP6z;Y8_+Zaz;WBO5!5-72BC|v%BEekCeT4Suef%IXWVX z@@VPz)R*#kPqM9AOnO(fjYrx(PDGpL|LbC+lYh&_Oe7QH8p;EXoZ7rMp?|EVuwd=; z_8Mo%@666FsLt*+1gbhnq!q97;gH`oVb}HERt~$Dv_8+CKebn)<<*nbgZiz}3NG(k z8Jbbt*0R6KG-u}E9v|;vT^9-f%FKG66woW&tC4b6i)NJ`3;m`J; zjDdCPEvFGrFTg-p)h3U+Z*5UGx>T3TkpU22scOf@dtUOF#n9Bvi}|({_Z?n^R5(k! zywJbx-041c+LdfSwtTJi?G9}J5`D+%@9sA_`n!SqyD!=luG&<&Sj|tn^&gbq|MbT$ z>{i-^2Q&bLAg$jsu8c3+xLAuuVu$*4BJL`wz}J+ci;hM|hzw^#d)symi=ckN91l?- zYzj3ipTU1(8o?;ik1_~cKcIn*mhwGMI_PXrvZje%nizk+?!+s4;cv9J?3fR-3(k>5 zE918fLV|=z=RGDP1gCfW!PX;VAe03jUwm+5b?Z5Lcq-r%`1O~Gg!1^gr?W~LKe!eG(91xlp-0w?^$9|aUFl|9m?$M#miqkPL=OPJk@$Tl>LUh z#Llr=YDe*_#t%_;pj&;^%pkh~Ix6pI9md@8ZXw}NJHg9ROn@5~F070JjkKtI#_8j^ zfGl(h(p6O~w4t5hg(V7o!^D+Rq5fEytp9xP6T|_C55Ge>SRS}>L8qQ+o=*4ri= zEhpQw-4F>PP1luu=GkFDIc>ILOF!3&>1BkZt}a)mI2@CzV2 z^0mUpJ^yP2L1$J*FqdmoKb%3fajC5G?H+}q9xBJ(EjexwE#yveAH55oQH|o)6ub7ahBMl(qJq zPtm(EC-<{t=tKPaZ>T&u_|)Fz4$Af4W}yn@&cT089;_)++O%9raK{-rOt5Y(_*>TYy3ws(p_EZ)OW!xeN>{ec_!~Khjbj+ zMMoo}sy#Fgk*N;iy-@d(6ovBX$(NG{%`3|4 z0gWB^4!)A>-{J)3In>N44;b^13@`aPo{Bh8WO}d`S^vJ!y=inMsARL^TE?8`Qtni4 zcbUxw|KO!Z_DQ>1v@&>83DXqS@S+PFvGOGZ;pJNu77KHYTqU;+UHUc?x{G7X35(21 zZXm|n<@sQTh^5A-btthP87d5vwnP#*{MM zknuK}B@}84%iI`t3#h1h8*C;8x$Nd!GV-QLJrha0lvClA?*ft(%(c%|Kdd&Hb2nT1 z<$+~;sA=AV=3nRdYuC8geEN5;iFymhL^Fa^?W_kaV*SErMS8YX%vo^WNd&PI2X)>2 zFjqk6Iu9(ABiJ|9Nbv%u!oHvI_XB+tQS8`)eYzUSk7N8#Jhz` z4WSKF;`a@^w)(DZqUCM0dhh}=J2b;&N%KQ}%+rj0pVmB1=j zFd-1nATABIe<0dZaFrF~$)b)KCmEyZF8$jnAajmu~ z5+d6XYHlY#AEE4Ceqv5GKkLZpbhN#-0oN*G*d)_z(&980Z@|ORB3v6E_CQ^*rqS-` zV%>LZS`7ba&E%JxVoeGktKJ-Z-C6@uL|7JfDEuL!;}Zb;-k!NF34wr9|q6N)+BnO#>?tURytM+l4EJH&nHw5232u7Bk7ZbMJ6&Vs1|JQE#uSh~qz5&8gSbDRoBfC>j*t zY@&{VV)MzslwY(AOzt{Ii97l%l-SpQzE#p?649O2SD;gTX(|gvNq=OB(K; z`9xkT$vnx@UDbD?S~OO+cfc;DKQiO%yt*f3(rIy^a6ga#oPk~q-^PbomOz<^z)}M| zHoZKc+EdVC?y8;oMML9qHf}-vZXt1Zbn&6osZ4pxLhX6JV{R6ncWy}dn8IF_)VZ>e z=_zvi`&^<@D~ymD{>-@!f#n5H-+{yDye2W0I(eqgD^p9Nuwl$yaon$&-k2UkOi@W= zXWULCG#qL?25QL9bMt&_zVCj1!|7CyPbK1Xr8a@74lyVA3Z(s8q0QkCFPli!V5^tW z!w-#wVR4;7(?yNWXeg8|t&2l%L5h8aW)bHTNxu|NcUfU>_=>RXPLN0@_=Ktr?na}P z5neznF-+i?8@%w*_S)EN^_x$Li8U;^M5SYXl4xDb!;HN8U{6+GlR>j^aOPO5;Rux? zfE1QkKnLJ@1+^2WA+12e!`Nb#o~FvWn@bkUicB3L+!ddk&7G?a_NRlD)+uNmKG-9$ z$!s@sy!fi_-kAfs$)~DKYf7xro5K~08)ejxdX9gDe;Nv9{SE$+zXiU~{~dm@6dI(n zh6AmH=7u6r!+071Q!uj}d)S0uA{rGd$G(~JKf|Z zMpS>PDB}kjyiK0}b?L;3h8qt@WY6c33bZ7I!m~L92du`dDx*6rM?Z+bl^xmE-(1Qn z&bw_G=hLP_=4Dvt((oEh(%6>{{nEP%diCK%U7U$`OfgsdFY)U+1@4}t3y$dPC78j{ zn5?lpET`P2MXUbz*}rRAeF#mvC$6t~kJ>hLP?&Cp#zjDT zsUrC+=#S4tgF{P8D^QNHW0q*2!6EKud)H1kWvE~=@DMTuIv2|riOM)$7G7m>JF>$- z*apH#t0}1bGMmX6qnD#CngjOZI4>B%Tuuu>=#3QF&=e@5#=#XRdKhO|spCB@PjIdOnx>RP0;`nwoN7y;Fr^2UnjLyD-^AS-Tdp%NfL4vr7> z7?qo#W=U4RO%)H@%M}Zk6xuc=rai0@yc@I*;sj;e42i;1Rqp!r zz6x&d6Nj38Vib~}?@uxoD)G+y0*t%Z#_#l8QCb#pmrbX4$SK=^3$7fJwU#_0COk?C z(j`S_s-QCnrPa&qd*qiYKnD)*~3Fhz$oMdjqNuNtN{;3S#yB3uq<`8zE! zWVlWmb}~RTsu3-i&ys_omA)iwXaO$oR+Md`YnQoua{3I~bG_P09;tBO{M(cdaIfAv zU84B7L^Y#zDk$V{{2u&#+kb(9M}l{S+bE6U<@(XhHYko)n2e*f&+fJ|@Fo=Z)QuXy z%MjcYuxU2=l_=oEUT@9mo{XKR=S+&=%5ctBlm!2hef?%d$L6$aW>OJb&N=e9{?41} zz}o{yhVirZcr))F&JjsVH^Hkj)2~X?=GP^mH)()9YE0VD&;whjMjNB*o%Y_*e}H0PcD50l+437yk9CP zg8@G7J7JuFArhO^fXQvqsiYHWvP-*sNO}`uqNGc|E1r% z=Wjn=`|ocD8OwOg&qhs?o4iLz!3&-I^{qE|agunWcAPJ3EIjftDexKj78PR|hxA@> zxm3zmfVg4Em$GsYUADb!p4)cnIqo^yapqSrm_vS>+Rcf{``F@f_8K%{fiVWHSiPc8hq5b1&ZihnGT`Be#vt$R>_YtD`LWGyBwZl|1_*4#6{ zarnIEhWq^&;rG$>fwQ@+Zc2aAgo&-(bnn^i&nNtiyi#q8jH_0v>yOL3HB}AW^of4v zZrfDdg5d}@oM#X_DFxNBu>$25`|`BmC8#=q)>E(W@HZdLRZZ0K;^y$j-S0(#`SG0( zgO__~^rg{|v=`Cz_A_PTX%GA;(;2amH{UC?C@E|g&l%=#3egs481ycmFQMvXT)&L2 z=yO+&nq0HGD&2vXO+GThIR%{3`T=F{}fU_|*)alQM(!Fc=*=U659LAj=aeoO>%bgFQ*wcxLaV62kiwTkZGau~~ zNBDSe=tcIX{Yr+}sq}Ss>`JccUD*o`s7Ndmrvv6Wvg)W_?_9Kol;odZc)yrO`P>bF zc{?}YR)xq8WI5y9Xo)({w!ZtF}Zr_rbI{ z=lbVY8z!x%&R7&b!v&d`95SF?5K!4|xYIC1zh4>_Bk%3ps8Qm%VK>yu&L694VHQ|fP z{KyTSBRvM&{R(?fQ&ncuiH zp?NPkYm`}%m$Qh54)gZZkXR2~s;K$#xKMw{yGxYaOBoK|eB4GfZ#R2cRG%zFyvkcW zdP+ti&aUIzsh^MklMH-_^;TZpwSpF*vbN`R0cd<@vXzZ;xc`lyP~t{^Rzo240ekeV z^IoRX?s}}R`@8cbzDSfbdX5PUu5l&;B82phx8Is}*QYFq$PZnc0lK{>vSwFJztPpp zvG`ztiX`w(ifEgxmgmqTjvRc=KPP{)ZC9$IBBL?UEzcMUDsC#aMLil_7@hjZ+5Hja zeGp1m0m@aQ{g&mMY*;=>NvrZn?lNGC4T8lLM}30L90u<RvBx!Rr zm#F&KPQ&=$R@?5ss0h4$?q-817Doyc!OJ^9|NmoQrqepWLfvwYWkq__xeKxMP|k>2 z=UV-zb9e6{nUDgX`xMTL>PEda7PlS+xnF+rJCW}c=Vz+<1FN&KdUqY~LNKp$@3MW< z1O{$rV{dOe;C<#{ue*zY>xS1)+1>@PKW`v!wHD9-03ZMmh%UrMzCoLmb#|8K)6m44 z0)*x4v(OQ-vToG<3KH};k7-xZvE;apB$odg_L&aB?;xhK?FtWHV*#>6u|EBEbXKkt zx}?gqE^8+p>Q#H8si2Ix1xBSLO`T3v7NaRo3udO?a`qFGl}}s;u+eOrD@gDbO>Qb& zllS{os|O}d#hV$gtvY||?o7bp)M1oCBuG{LlTCQY=c!}Hin%Jl@-v-%>b?MnC={2h zGwv#7S88FWH2=-h(BgidIQFGbw$SjWu2dq_Vxgpg;~l?K@(*hF0RS)n1d32kWmtYw zcPcDQUzLs?TmjIu>+y`B2ir{2Cb}9O^7c+QV?Hc5ajjhn5-e6lx7G2bcAT$~sKjY0 zu{FPQoH+=X%!;pPN-XKPr8pyJmDW5_5_7_IVJOA!*zTGdx9Enl5r(+c>N^8bkvfHL&aDr5XiDsC0($IUXXMRGXQ~Y(UN+j8b68{SJ9khbX!w1BF?$ zA|wxP{3F+LJMZ+w5;*i3wqMW1%GsE+`l6(To~d1!ToRgtt|_Z=u;iHI_-JWXmOF2B zkr8>zTy$=JX;s!pu#0V-QOa-HJ@=|~rO`~uTA;qZz()q%A||3r_FKA4_uO1t_eO;k z#qzr{M7?HbI7RK$-BDqq^$S#vuu%7;3%9owtuyBH)yCiFAxFM?JITt*so~No1cHh#fQyL3vnu=*1fc=`#eO8pb*5qfKbWN79 zBE$!g4JF-_(Ik`Whnr+9&#G0pyY6)A*g`EFSI>;{npU{G1y+ntWy}^SG&>>ZbBew^ zKY2_pNw;vFHYJ>@LUD7ac1F_JIpC$ntj~z-f#v&(Zf@?ABX#|i4Ps8ZJaH%M=iVlr z>d)xSE3aTrg!hO^Bve^m2rXrN;d`Uk=~jOR^qVFy8#zvU1Q&UCGUq0ptmk^^;#^*@D!t`V=hXBi4UYx1nnIE!bWXbmYV?_7MMF`{w9fuTE41UvArh@?fANCVagAMG}qfwu{H5-VuUeU z*@8_Yc)BPl_*XGcadRVWp{9<#z@7T(?RdSiYK|>jbhh>+pS$X)!C|$CkON-+UpXF% zlnJ9mti1&d`~rd)0XZ`&VYZnKIm{9p+@#&3rlOBO3`bG#Nt|>mpG*F*G_r?f3gdiy z((D6*ie&laeA2Cce3W6HYkfn$tSKYr6M39%E-c>S*00G(8PbC`8O>gkMt4C&tC;DU zlB^5)v|JFe;W1m>VDCBh;^0WZ%>=+IOBhxEJliqsbi7P}vGy2gc_WbCC>2ALVefe= zZ?D>xktStLncaF>Z7`zkeqlmCE0skyz1X*WCHue?#K%`fh$5KM>a-$8N(M}Um)SX~ z3u8BBumASMF^zx~%>r<|ibjneo#rrpkiB*x?WdCfT?+!K9c_xr9inXv z!k49Fc0RnQ=J(Ln(Rs0P?3k5isYEK0`QW~3wl_p>Vrfxao@bh4DqC)|PNLL4K6Km_ zk$a355}_Y;Y;=2pWh#?5R2{y;+Byi$zMCBB7+H2F$7wR6%QC}%ziDXg3*VQUpFEB; zR!Ql-49q_GPdmN}HT<9$e)gQIl(u4)#ZJfW+Ig4VY$u)9=gLvBP!g5>DZ-~K!iT=;<*==#*2BypvSVlE$4_{n@?PI^priZe+60E$Dv7>snO;7y->_-fQP_I@>x~ zXfqCq1e%sSGjeS!^2c0oyM`4NvE`&Oa@16RB;SkaLweR5DOowwvmuUNFHIX4W@VZ1 zg%Dm9B!N`uMKW@UQlvCp{VHNADHVHnTs-D@zTh&4eo-@pQmI{O8t@RS)HZI!8iyp- z)zKYOlC5X7mJsC?{C`Cl4(!+n*R3Nt1ZkUyu3n}I^K$Gi6^7xNNg%m&;Ci9S{3TuK zq@?qs7IYwd_CzzfUj21uhrUUI@5T8LpVTq#h$Hv+mFV?U>4e#`p4=piR_~~qNaX@v zg~m7Da@XfJ@piqUFF#mZoIomY*NYvrjt-8^Db>%?(Hzn1e3p}aZ%W%!lkYHT3D(~o zt^ix+OEYqJtcll_c`)YaT5O10pbqvQniN1|9;mr>eE3kkzIme}iK(>7mQC`&A;*bc zNvxyBmeUEV&qFzy8lSff=}_~PvMIArL*rG9PzYZrjbkDZasm_?hw^OX3gA&-ZxQMP za%47a*Nnh8*c-AaSFa@y@9}l>ww`j%2#PXhH)j?M$cBl30Er9>De?nkp;S}M^I$3F z+R@?2;Lpd9M>$Keji(N$0{XhLB34=9N)tMeXv~m+tcD4j-qXU?U-YD(rkCun$vizGs*$h}juX_a!y6sX<35yy(lF4?bqc>hKq`9?i?dbE+vKf1pve!R6( zWl1K@WLEQi+rzZ3eNTAsW9YBLCIp&PT0p0TYqMTx4zMD~%)OMhTJMQT>rppWM|T(1 zYvFW?SFQKGrT6k&5JRS;FD(TP&46CrMc1`a8!9s6H3XSryJI+76|kSrTmsk2XTC%h|4Yl=^2swN-i;f^nLewSo3<82rG zO%qs`oTs*e)4eO1KVLe_<~18tq+Pw_RX?HNrg%%g*(a?gsZ4fKCksjET?~LZ2h4gD zK3y&t(x?;@1rgA8CL(031O+@KJ)X{L2xoHGCFt?ctH@#bCo3IU04nd2k-f3RC{5Ui zTk9jQ$rVZQyL{8Q?pty7+Tur3BC-swf(f=l_8fef{1G_r=%QNno*`H%0!v z!uLp|vdC?uF|8yq>?#=m;>lOcT@OAFN8-1%9(y7`5h z^}h-t6L&tHT?qwPll>_EMS_MY$Oqo%4hOXA#J$y0WRtrgDvJ6{EFYSe9<8mDT z+P5-C0%)VO*erW(wM;4u8aR?u9a)%vbFS^3%=Zho133~CEpA;pdXU=~?T_3D8Z#!1 zHj2qOv^@myI5?m3WKE!!HAx0i$A&VilnV@zq~)d<7KSJ& zP&^aQB2C(gYPquTfHXo0lF7EM8otK#CJsVcR|BSmwIR#acR_V}jf6`=sY;_sx{kVoIbbjTGUh+6dm8R-LpKS8fe6y*kWpHcQaePHmlv4)-z+?t+eCd_vf*M z?7=n3_VO|fC5;gmlO?X_Q0Z~nbshM({MTNxPC zHn!$};w~mdcWI`Uk+n6kD)z2y=jh_B@H9XUW{p8J1l%FZ z)fc~V451xz_IXA8c3S0kbmrthnT#e0cjKvgoD2@WAohRQd+WHkwk=(>C|rXD3y`8H z++7k9JQPmh7Tlcx2_%HV-3oVtyGw#wa1z`JPJ#piK@zNPW$)dm&+U8qzP|6BbNcq{ zz5ZCgRSSM=e%}~#j=9#DbBrM<__qQ)7GC)|X=&6c{=O1|+^bZX+}&j>D{7JwCn}P?QWyWjCS0Sw9rPU>Pq=8D9Jrif z<62Svgh+R6zS6U{#^yM{PHkm-4W6v_8mw-R4-8@Oh1*M07tPzphGC@G(Ngip>+P`0 zRr#o6>oMPXLhv&C(K}K<+6f2WKEDSdnrWtAHWhDWv2F9O@O{9msY!#yrU2b0I(x zLyOKuu;jI(x|R|W344IKr8d8Lde~fFi;dG=dtKh4@9T}xEt9AiQZF?~WR{x>Qy889 z8ULO$b?58sfWjbTmzq5sSXJK9S?THF_dEV8jdJZ~#WE-)DZyHfg8xz4AAR}n#O`lB z<~lb?DE{kLI1El;aB{y5!h%H^XCW!4mtaGQ0hd=gBa%@x_?ikA9FDNhung2GUO2J| z&fU3>e9Fa$S0RC>>b7M{If4l%RFu^)o=^@U*{bE{m+g+r4D(Th+Jc6vOwTVNjpXVp z^6l*BM!)Fn^Shmaa$or8sZiZf#MRWN|1^)u3V2`5aMdI2YUV93h@l-W>=vhhVcDs^ zC0JOs5CoV=BA*c+LPs_J@n0KHu8h7{lfs`J0KdnnONVs(z;K_Dq^~57pK$#X0%3r| z?~p3dXd7RW7qTaGvxn5(_4|YV-t$uOG>C2G$46^i{}LA|V2k>8c;NVgY0=k(#4ru# zO0!}gzaDbm-ZRV0D-l>VDbb#br;e^aAr;R%&$LZD?f zm=~uPXJ(gplhItT%~?+E?r?rw+Rn4l2AzC7!cuLD#Jw|$-;l4grGIr+<($~;1yFTi zHZ3BA!|i#T9;~jE3z3g^2-pI#uqgIf(f0!6ZRZz6!_cB2oO~ExZc9h{ z+oAyAQwcVr?v*A)d(<>~W9l(X1ShH%pxzHMIP;n(pQQGmXlzZNj!l(>i zZH}%U&Klh7t?|~3>zf_}>>Z|u+vR0=aru-|6A0>Xb->IW z0#29XU1{U)IQY66J@T~$2V2*JEb&C%4TK+f0uNG4q1{9=Is+2F=0$UADu~WA$PP5M zJ{BCL#9O4pqs2To|M)Wy&$Qb=xMc+AGB-Y5SXdPdu)xJ9kP?4f=6+nw2*7E-qbO7J z+^L{?QwVTq{ZK1!!m=vAcN9 z0ln51pOAp0cxzFffi3q+F84MuDo$&|wHT7#|`B$+?OiX*vkLQiTaf;%VMO^T! zTOT~%biZ;AK$}^?*nSwFsQ_HN&SfCm?)mT-MT8hg{Ob4j1VR?uX(hc3$F?z=a0fD{ z)b<>WN^7oGu%NwA#rvi;ic%-7nGvgq(nwbRBs6l(Obrt2_baqEsnD)y)wn@*|pAV8}#VeYo2Ym~(5QqHj7H zYlT3Xun`25pndZUZyqD}jxd0a*uqjrPNCGJMNY-g@3(1WHWqny2Du!KTt)HxZ*g>S z!4^x)lSl4qQm9+816hkj^T1hFRb zf$G>90ID#)Iu3AwR*NyXsIqhJmrnMdAa7=1YL(#cmPt%1Lj`eK>L&K<n40y|w!cAT_~fQZ0G5=`lDEU%oiCr{*y8@tTMR@~ER!@`9Kh~wDt zckg^?b~xu4ahP{nl?;`o7ht8p;Z2J-f8m-?Jni~p2*2k?o%{=RVAR%pfh1MvFwQ)h z`nxzB^Rd|Y9=%V*4=hYYbRW+XsCCAl3lJ#1Z1?zqkJGe1N~jbniD!D=B9 z!&H-1dRim`BA9ov?ZJ4#YpOq1B+j;?)g0jOGg`I<#YiaZsTe?7l#}BIQ4s^Zn(XxLYuubfUvr9C%@ zA{G3@ChXWu?|WxB7k*yMauGF7eS=zeu#Rp838MBfPBcX!Dyu{!n(&m-@9>jLbMJ-> zr*)f3k4F*bW3=&|Z(JL4o`E0AZ>Y976MP%1>`PbT)?n4FWsP1Ljw^E&-)b?Q5N$%% zKJvS5hB8SJqvJ%9yq{bkXC~ugBO4O89C|fq6L=3hGm;COYf`fd+>>GrtFi8iizELI zoEO1igAFAx7Xl7dKA&gfC3rZffzw)akKG2-A77eSI*Rn$z*6L~WBqj4@x5^I z-M0e0!p)?1obP1csP>@>ptDPtcI_i}pUZA6-S+)NUamlrFyzvspOo5el1A-~Db*di zr~7;)ea1TK;H}EoQp04srL~r7F5R6!ozJasX6x`w!g7qI5+=`9ws8G(aI`e1u2dH5 zTz#MQ>O}{QaVg1EC-MgQ{`okk<(D>7Y$uq~VT}d|bKKl&&~PU$EhDiGxY<1~4Mg)V zr+#&R%bSWyd6F^RzS1x3={uJs3b4te#5)fR+}7UO)}%he@nq(;)WTM~pg6g0wyC>{ z{T4J%L#mQuOx9~|>(41o0`~a%O8@;d6hV)J6+R_xOhZ6S6{fQC{sRgfC-(7ac&R-qt%5S>m z?8{84oo${Qwrmf^Ur3jZ&zj+bE;imTeCfGme<*~>F!*+>4lIJZFM+NN-WWiHVjiivF$4EQ? zqZUUtd}{mHhEjuB;RT3>K8||L)K)4`+iVEk0RbjWBPh8;fW?V(>m6wYqcUVqCp5E3 zEeK#{hsg&Gb`b_~7yQ_YNfw0kn?4I;Py3w(^6;>wtZe^{c5+s{#gN$U!&R_lhH~{P3=65|3EUyn+`_P-Bi(pUPC@vG_8q z>yc8HnJEir4RMXtTiy3n(zXYxR&9Fe>~T2?OUkz){8r|^z zrNks%V7zkPJ_*LY#i}x=r{OJiaYQbl4dJ9bVaLUm=32x}_AG$d-$$Aay=RlannFte zgbh%@w|rIiK)%c1i@`CPXm|ux_&bkXn&SQGS4AF!O$Y_%M`07{!hXMzytz$2V=fC2K*+uS|m!^iB&xB4do$rO$XN(-ErlH50sUZdL*B zzG6$hHsQUJY_xzD!Wo3l?o`1t7C zyOgdzh)%r((#w9LcYQ;AHZbiKqgOW+$QOO^?XzE}MJEc$k14~>Y*7at(2GXYtLtS> zK|LloMxonOiw?{BU(r?i;~f0x#)+%lg%VQIzSRoeGvyJ2WJ;LjnQm;1V7kkNX*d4Q z=sx~$(0#Sxj#pwUy39J&TZqkN*iu>lj1v}G^(eo2JCZY1fa=qS_lL;W1AZuY$3@M4 z4_#*~9=kc1Ad#m~J2C=JmI?whsW^o{e2iBpAETIq<3PotlMR>ClyAO9#cpMt0R5g& zmXMbR;CyoEd=f8@x>=T~ej-3Jr$Tqo*{mR$7=&>US}6CVXOML`o9nb&7sw<~6wSDf zOBb^@DulJbNuZ+@9^XRw^A;qoKU%#N3dKYx6qH1T>4V&edTq57ERRQ7);Tl4is8AB z0Cq&CSi5nmar`OWkEkdgMV;Uq%c%~p0!YE0T>Cou9f(@f+85O2$>loC91AkgfSGz zS`6pL%SHtD0Al2WD>x}1Hc#t1uEu)xu1i#u6g6d(1Oy~8 zrLKq9^yK7j<*IdsQvtQqf@?nK*3}-eSdVFzS3W+6MRWO#Y3=^5p=Omv$YF+hDWyVB z|6ra!0+%`+9M8qe^mS+HrhvQxe?N$~1R#&=|0CHP3(b%?5F-J{{G&t1VXQwX#$oc= zDSIjh?&3%97qE8cr9|jTkx_~adKY8-8wY&Mk6fqduVhOp_0;+o5Sf~WD$`QZrJVg( z%)NN80}=j@fe=$%jVP`V`hcO$W!13^U#?%+?)!|C{fZm9;o*VNsB75@sQ+OTE>Z6Z zRFRGwV>G@NBu;T-`Dzs#Ty=B}sP_c9rbNK`$r8#Y$Qob`M@5aA+l^{$b=7za+4_|yQX`+4&N-UD2MA$F1S_o5ewM&=G5esaM~(bQmzCVf z1>TW^ghWoeGRnYZ#if?DAl&_hBsQRS+s99ka`6tIm4^I&lb_3{kJi5IrM}k6h`UA3 z{?C3F>YwL-vIMpP5^YU44FT~K{x$iG0#s$s$X}G?T>~garYj43YfrF=nMh#@7%YzE zJxwm0vp+%G-w{`LmwtBB1k(2uxW+uo4rs3V%w0i%{2cRP#3VUBjXcw~U0#ZY7RWG3 zwDE>PC0Y^uLCR%)`5mvt`=Qhj>~$e zmiv&ZP>bK3CXhqoGs)^@z7^tFBn}=Xz2TkO_<(C ztwsJE!^`@$7O9Q$Cs?VxI~Le&tSD`6Kp-z%ZhHvSrSG}oSKpzU4`GNK$JC|p>7~#6 z#LH3VKikdDIy&?$6R3wLcFpxhp=3hw=eFYEd+BYo@SJCN2}iHo*tQ;5cUP*uP9h^3 z7XDtDXYN;Y2Xa~hF|Je;p|*SJhg!K>{S6~hCsKD$iZNPYf=-!T`?je$yMaRz>{xx#p7){} zT9#0K)a7?tnhrOLI_-GVuNz2ZuksS^|C7o7PtC;vzJ51p%*7LADr61|f_>#Xor97D z5FZo-@lQ(b)W5DMcqK`!bgE9-RrW@%Wkw^vo3U)s*=%6rl_ZX&5>%6eFe2H$Gw0*s z5?#)uH1dhGn&=84*+b^&e(42_fkt_gzqB^j%IN3Q9{sR%Drt=SWku>MIJQgrO(j6% z4HuiBEI7q3wx~rRia68?!jO!>7RorYV%z`(nB>7bFtzcxX3L`Kap`oXo)JAJ+W<%d z4HVP#9LBGR8>Mx zqp>pV`8b_HX==(9ObiSZeG+WS{WE|H$9-vNv+mMkS!h*cRcJy$iLaOIo{TAu0veHh zk!>;&p+i1Hm{c5bwC02v4f6|IB#k@6NNqDHlZkA*Eh}7ueAXX5qKK@NL$8^Wz(~Jk3Os^(!oRc^aCnx=c3~nZNoM5jy}Hl!u-@1 z?+-?UQWIqC?m7&nOz<7^Ur(hAe6`siDG30e-T#Xq{wrNjp*ZQ@pNOD4s_SxQuqWyJddsViNV8d?{lKira+U$*>5dh5l} zk#A{Vrt*yW2LLVAUh}cQ+dK5InyCov#3GkhPifk-ZjgmXz8mO$>!S2^6rT09#pB;I z-^B&yF>7sANOvirjlTc&)CX8U2W;a3004%(22?m*RWRXcbt|v4y$68-pYeEt*qb+y zE5&u3TsOf89QVmHT*-0FMP)X3>#6c|0RK?PVsAg3LN`?AK7lu1W_U22E$@`L+nbW6JU;R*X~lpZ&4VGnTnf9{ za53IPVb5fp{KgduLnWmc4d!;``H`@JFI0jp+78FP>=Pw+m5+^*9#73rPO0`KHNuMU zQcKun3-?LbbI;u8gD~5ShJtQX-a9FVB;o}W8*hMg_#>bVlWqm+XTA%8&opz*Cn64m z(#8mJSr&D1_+Cl~zf@{5t<}Qcb@|iSBb&K5=N_Y)Vd{%~SD7t4$$^9p^>mES%d6(au+& zGI;)u-LJSd@qZ!p^KX*+qlPTuw#u}Fcdug|v?ba_)G3uAU*%UmMr6HR?Lv`mP2OJmEVf<2*vb37(&4!7tt8^G__F&FM zF&%W=o6879tFrtA&8wx4QRg(=R1$h&9V zzs_cjyhP5zvd2DpWi%G;ICYjBq-Y|Qo?VPNaDKZPpKUxV-Kf92Kj_xT7Oh#Kdvh0I z#9INLHqklmA1twHH@TtPb&UP5H0b}KSg$M*1<~*=cR5h~WH4wlcYH8IBOa%%rlpvqRgMP1~{On*@k^M@L|P~>%rb;?DBNWiy*gs_xc~V$eU+i z?F0)-^6q6vzQ6*50z z@^tZrq9V*%E*9Vgq<&v&`s;)WSxMb=k{z34-NO1L%R~#eMl$gvNSAv_7kPX3Ww%;W zcW=td*p}Vi)bjs50o%&|BLeGxi$FnGss9F^3Y~$fy{RGTq$`iR(xV3YgFOSbJWmP( zs2!w9|9fwNTE2%-J|{zg@!}P)#?S2 z$M9+MD!20m)QUOAfkcToFIZN9C1rK|UtR8Xj=DsE6GVQZI{zNbF#@+BEdFjH6+~|+ zeu!C>lo>M2tnmzCwn^k&QZJn=G@##Onf6Is8&O=5R!^R4d1n3Gs!EyAcY^_=} z($Mi{IZ0#(>mC=;tb|D^Xx`Pt7@4BtAWI$sqQf^ny8Di^N0c*i&mOm4_y5RaP4LS> z%>;$agSplSu&j={X}ksV6G$3AL>Zc>oc9_0OYiH}!IBO!^+BRpJdjo{3}w586kdMn z?r{StEi$Boms8>p7rKo3v1=4dC@I?b?8i&NY0g}#Obw=FN+C1Im{Xl^FvY$3|xy zlpxeJbl$WE0D9DH?7WrJMHd0xhp0Bh%MG%faVfWVIc~@_4{>Xu3zI8vwO@0K)xN~} z*y=FMtUN%QvmKcr%!Da7kQzDSiA+J(qEa#Sr9D!)J0|V=A)#R6WVbdV8dl_OAua&P z?I&87iRfyk&HxQ8RSji9p>+j|mgBW#Z1-<3sysz8Ims6@W?NA4$u?BVj-((mN5d5&cH76|4l$g!8_pi?Z7C z+&{b!-d5s_qo5BZQ7fgV_Ue$RdddS_mXIb-1cvYsvSR*7U{VNyre+FR_{_@5ws?4w zPS`_&H+R9SWl0P5x_s2!1*l$y)T}7diif$N48hIi-YIM8ltG5Ei_|2aWJ$Klf6Ed3 zPa}N+VA_YIEYX(MN_P-b+*0kb?$}iT-biEzcijsVf&e;BAqqH+AP5QQM}b0x)!=0h zd_cgSdm%p{B;fe==$W%t-4L4D7dP_D_%bm`~Cjk5QPE>qmGtg=OPpl@V1MAAS2B`)-+5%QgSyynSxh=P+1eMhfxl)6|_Yk z_Aljn(lCz%;W&kHIO|Pm6xOG}=!&w#YDU?a-tOF!?~JGQms_eRuc_Sl#0`=jA65y zVxk~J{9zM*qShU}9UO1v(tTY-4P&D6H7Y;jy8ZYS16A6TNorlUbTf_@MNI8aNyYJy z*fda{H=8CoJ)lb_mpk&CBw1qRIL_VAtc3jLLQ@vv!5{gHqYP*4&VXRmY@g1>fRb-H zv=0fu7J^G&cKK;mgjDy4%(foJU^fd27HxUj@>^%_PCOD(co`+yORoN8AGu#L#Dl{9 z>$tr9y7FbRARyjgw%J+^n&J2B=AXwuQvx4w1@xV6zhKJa5OhUG-Oa|~mFlHZBUDn6 zGG!R2l&1x;uo>nOb9_*zvFvjw>i5LYwo;>NE}PoJkj;8{=GTa+u`VzAjgO4FXsKR> zcDO+ZHZ4IBX=LkLYw`Uc$LLxtD;C-6dET7pg!C(R^_shqebR~Ica?d6Hbjt$#2@(U z*MHh^LYj2B)H#i&!Hi|k)_+MgT$^T$))c7_*b~@o`w&Rt$3L@0^@^1j4M$xLSL&_e z;+H!+o*}wSht#CSrFM?5d@5}$HA+}sY(6MYY^CdNnJ(5$eV1e7ds!DdTQi{9hHQN( zTNC~G7r&d#n1zDAoFNoWT2`7E6En}g%qC;sb!gbxL)^HYFwa#&KSmqk42jvLM3 zoA$0kV4;XoNpJ9T5BmD{F{6~4$@n+v(uk-@W7(=g zb+r}jyhxG1!dR_)n>}LBA@^L|=CAJldHJ6tf#ZP8#U*3|njD;CH@l$T4Hzmto{xo2 zL9K&@Me>s~$-v!nl>k={|B!%44I?S(k{#nE)%E)DWCQXA=SL+oe(i?ix7_JKn}t_R z*(nH6 zR$(wxI3_vH6{9yuFVfTy+$GN78U>?Krts(7!<6CU3AEpa2^TWLU<)CPJW4o2y$*aV zlRoV)m)lp9_z^U2xrN3rUhjpwpWQT@{H3AmRqKq;#@gj}7mA?QT1mZGak4(=hnK~*4_$_3P)#tShw!I~K^a8i^n zD6A)tf0|5^5Hf34{72J8RuI8WDaDp=H#4N$$i>FLw2Ztdwb?stu<{a55j9nC>tj+8 z%>BbADExX)c;M)?Wq^85P)hU9H>+6xT91n36v~unsv)nMT|LXiGr@oq^Quz-@rkK3 z-*Pk(_6EvH(*fX#%HF$$I5exEQdA+S{6w;#%Ay>QT_TMU6 z!2^gZJCL2O?q7L=2ltN=bPsS%YM9!>X@0%!r7pOX!l?P(@rqr%V$GYUG19{b;n)50 z>gKbh;cVvxRO9*9Z(IA2H!3RZZBr^?i8ufnu2MFUd+zcP(3sYJsVbNt16JiH5r7;O zO{?CwQ&fm{~!Cc+8ckgP0*;40m zJ+O{twVh4T{^B-==QE7`-olpxy~pG4z?xcxY$?ZUva9)HBITb=H9m9=vHLE(Ql#j! z@S)%Nu2=kK$kALT1$Z( zhL&B~QxGvV5xYz(z#Q!r%>zoi;LpWV)X`32%^A&Tx1Xjup4;3NPRtCD*Vn$L zp1PuPkULZ8t8$pIf8j-wQ%&O=XLjjhlInSrlNmjt4lrpx3wduo-@?tg9#ox>B;yeg zW2emsK2hQWRS0z1rGeNOl<0V(Pa}uG5jp%koHO;Ld(n}YW_kBLl=}4Mcgr4l=6#A_ zrHqcS48Y8@^@u0s)R|3g&>LbZgpL$W0Wl2uS)!v9%Fq)9r1|K!FuYJ7nb!RyN>6Sh z*;t?~211nzdBZ&7Ow-olJ72zzIs zxSs`~ZAU3p(wGmI8d0z2*``_@!DBV0??jz-KL?i^0hm{QdX73=k$D>*s1$#SX^AM5 z>?FbXc_8(qc)bs?(h)!edF|wnRfRSLYw36J$(SJ@cgZ{|REpt3woNWNCOyB|fa^=1 z|BLw|1&{%AD3k>J-pNjDYBD1A0;&k}TYrcOCdPLgVrPG(FC(mCCxne96NI)Fp#!S+n6lGsIQ;$YNkr3sG9A4P4_{+ zmtE$?+uP%vPQTwe&eiAJ&ejo=>z$ttOq^1;vJGDw)d$A4s|LscJ=nd*lLWjtyrN$g z3rTWGvzu~xmd!#C0XYnkIXkc_>hzG|{~;#{F&+2pzOhYmp<44fYXPE>upbGipjIpSkMk*>~;Qwo!SOjNHKbstS>87-jZv z2m%#@??+d+kzblReZIUl5Dap2W&mSEt-i;&NDU+bVYDUD<0!xC2@W4%L|JgH*h!o% z<^Ag;f%c&U0&lMuzOTI5vJyY#rO4)K^%qpxINcWL-F706KOI*l8(%*#Z;#qm7HY^% zYc^l0IIdqE+1GAQMryA$>7z-%Y4jx4nU$=Ir!iKFslDB&bKqETI9$K%e{T3m_@y<| z9cU>XGt_{qb@}LK?#Lkizs%tOI|4l zMqcSDONFms0%hVJptHES_6#u^F?oJxR@m>wrcINThMf>&!4!v5xcEouP7Oisah@$@ zRVZ%?qCZtY*{6ikMG}m!rJ4mtb+%P+08_f6sK0TcY#AV8`#e zcDYb|_*SRj?)D3XH-*Y$RiEi!vy?g>;bk-iJvKW&wt(RSo)aaR!zLfYWo7^`V!P>d0v3m~@A%9Dt%Er@L@+n$Dnz2TB_@bytI@EE>4kSHU5U{A*i#pirPJD$ z2NhKs^Yrd7cgv>QY-JCIjenlE8T(>5usTDbge2jc#p?mKkR;(V!MHYmw%s!KnpaseeW%Sv%lBXGYgSj09mqy=B z)7$7p2d2ePND-lvp=&@ZQq10WS_>NB+gD02$6cCb7Lh&2c%9_>UNDD#`jsnPYGim> znti`l?qq=OA=P>Ro;dLX#EkRXr1c$BuiQBcA@6oSm&yJwhc#kPOnp$vY|D)|rCF?D zM;{yaCSH>7>BrRea=rc*P{QfJG2@!n{{WPzpV-H`U2ANyjMTfOTiw3=RUFsk`snt> zFZ@L9oIl#WkVy9%!Be#$zrQCCX-lBiB7F|>uv?5>)QnTb@-?dLzSd*a?+J}bG;09J zorTXT-&P7yh|5Z_^@G%evBvqS;U(F)Cn?G6M}BAwt6@AGgO3#_xM~}cLS&_70Fv@{ zYqjhKlU$qWzOGgpqBxB&C#V_MyU=r6n`-HvX44Nb@?x1s1yY_;`vM@E%am?L410W` znDGeM>)Y7-Q{o3K_6YvTDw^!M74oaOe!sKOjO$l^;nE<`7u#55)0V)cd&A^FqWkE7 z&B6MggZeTIknh%9>Ga;Nq;`sASAh>0UL))uH;O6y?PG#b^PQJJaEY#^yq`*4>V!Y) zpVXly!NoyCqb?5UD|Jw4j%&m75G#)blj0uC4ZJbhlgghX{wNAR7RjJaO| z6pG(+Z@iV6wjjcL^Y5xMMdX9TK8nLbU za?9X;sw?x^SVA6yUIn&h2F06U!(7d4!`UjDem9eAoR`JXeva*xp2xTC7br{MheSTU zZ-~<0WxvZsDAn7K%YN zo3p=KrlEFu==F4UBWFly3&J*%k9afe^a zqC^V-gwVbm;=tu&|x_;QUd z1BV8ubKah**(Zwz2ws;P2D{a%)5w7NfD@tW)f9wbT|D^58ho7M*2NghTe8`#6bkw+ ztd-(nrq7guH#jwfxIs;1k;Zc{RuU`lpl+$1R@p@7FRiqj+*V(%OczcltmyZkZv1)t z10=8wN#RO1X+$L8^^PV{?cD_c!m;VkmD9`^e;&`-$ep3bZxi^S8}PiHaZwr6ogB_$voK4R0!2t6=EXv^X>Y zX|)dybiG<{3Z8G&oaz*8js-K7-*jd#3VJ2ntDn|$FnD$K2{rd>L!+kYDic~No`%}{ z4qaL-PbOex%D%`=r2RFDh8|5S%7VXvqNqrO!z8uP;l&i8d>$4nYB*TD0Ii7EPyBnu zvzmY;yvbuK68@5gK0uJuizyuDe-GmEkHI+nx2a*{=)1gP=&U7e3_+u8I*u3I1Y+!B zq2d0LqEYz4jE9ctz27d4_{3q1ph8xY=YF}K&cm08*NvXYndh^Ju z2JA9QzWrenexmj)c}F_7MP2%$_AE`Qp!O%AYQtGK*bB8aHhBQ(nx6R9MkJFaUNU3u z(Mf_r%skSi3t32Qq#=oPIKn&-3ie4|&=7M0Ym3y7^{t&c>>as8Gv( z^{>JHo9pXQ#9`COIl>ZGS5H=~MG6qW|6T3@jT3Lc_jGX{s9kDg8_;txc{wZ$TPXavMxSyxRb}bc4u18_Db)PU4+#A+X3d}Pl!mO9SE$C zU()48`d%JuleoxM)zCSg_qC?jX+3(Obf1=PVly-9_=+@O?=Dc8clUgPA= zX}V?_!gzM!^(28m`#w&nhysXM{;6%Tg-Q|e(`QfQcDV#dp2JmJVN3C3#5jv}BE#aL z$3Z`>)S!W3b@fv)iO>2DJ4$R+ZRIBy8T3waA+e3IdHHTEJVaf_JO~+Yc?6Itu>}jg zCYhc4UNojazmn6A>9t$trH(;3a?bCv^EWx2BHFdOrJ zft0)F<-2M1CCbpRV^u%s%Q?(lmb7@#yq33kxxn@!!X`Y?t%wi0p_}eMWedF?v1e(% zl^b-|_Z2|iS?(!hVv1sn+K4bwTX^RS^~HdphaSp{<%lecaOA-02EWJ4sohH%pzhO# zi9~aGb}Ir7lYK2{r2Qq=1g3k#0QNmlD-Ki+zh3;kWr1Y;0*>Ln8zk8Jj zYrTJ0wR9Q0CB{*eh73J4gCP+8B>is8DO2apCNL8za`^gHe2mT51>x}LHEj2XTN;}E z+sFNGceSE7m5g0r@CUhZ6&4EWth87@scx)Arta8lXlrzi2u)`bq>Q@%#!v!~Ra7jz zaM^?bHemVlwSRs9T>EP-DNsB&@v>4o z)=YG1&tniO^^z2P5v*440g47tl6WnnzN)ao-z^&L9X_)$;$awU;ED@8kk>Wh-3E8-P- z5=?)5RC+}uAovmAgx>Eqf#6tq#v!fOv8yz_@);@y>MM_0l>=ct3)Ak|m|0Ui*r>57 zvu@ZJXGIILsd~3L(>*)cYcpt5icjx~ z#KrvM>Ewi3oI>0Tb;53!U-99(9)ytbwo~rH?gg>m|1~539|B}Bp4(taRo{v`$hnM7 zD2aj}V|>=s+#fzjK4ca=n-@I^bS`(sfa}{53vCT13wTN^rqb?8=gbos)bLo4Caq+? z&X-fSs+}J!>G9SdxYIv?-2PbE=C+gI{Zdm#Q){MrJG)g^(=Y_YqMd>+%j@pgeq1uM zKb5i5d9T5ZMr=2|zW(b#ImSTh&0u5n5vTXUFYS=1ab=aPi;gSnJnA!?ufGv&(A*-0 z2+3Psy58TtdaHwrNpf`c_!&`c(Y!OiX$fjA2See@O9 zGpN4{!NVK{aRRL6IdAX2#5`9)QtoCc^o{Iz^x z`@QXKYu)jmaAEizx`4d>aUl=$PxgafI#B3 zs}l&S&!!X^0BI8-PJDTVJN8SeOQ<YG z6nrWDh}fSL7Tz_k(6WLlLzw7oH7ZPr`H)r0ga&GbrcO&xo54;L8xplpUY`6CIcD>; zf48Q4&%1K0V~S5Ns!HrxZPcEIfGx#SZM-8o(L~&g$E5ABj}Kzb=o;pXi%$ZQ8`JH4 z#JSJWn0rqu&Cg$0L{}N6C+Q5_(-LXbWS=d2&n?c0wx+{0IJ6elU_0)SfM$Njp=y5{ zmK+?;N$MJ<{JTvc>QF@4gqMzW(KMB)eT>Ow`D#_Dc!v=IyR$K&=A=C9#lfA~ML14` zFQ*PC1%TSI!ZoOy*qf5T1JfDzFuF?LgQ7vzGck++$5;Xm=9;smNo7glAl2Ye86jbA zf2ujlMCjK+EDj9*G{EhkbA^of@wo5fBigza8A=tWnmp_K1?gM~^onLGI)w@$)?b>Q zJ6!*mx*oab)j-L3eF1B05{a6+Ir5`v6gX2hd2q7-H3Ql(f`%1DE8)2K9C@Jim1U6Q zA2Q(n|NPKfo$w3?#tcJu0GRExRUKsN$Vr zlx#L_13|Orha!-EXHL2>Pp(H}rz`TlQB%48bzfz%D-lYKh`>O+qp1rf8#09E;VdJ+7f$#Ndf{Adw8gcBK zBJ7A)F0dP~!W=%HN-{>O9gVeXr94JR08{W5xwAb>;lc|ge`9RZBw#v51s;yODqn+% z$Kg&na|UIiV>;u{5=4-?Xq@uIJ-^1MjiqOh6TRhc7kt9as9I!AOU~7>*^y5z6q+Ry z{}ITB7r#R;vG{+09P__{Y)tjPLQeb_$Z^6dq-?TKX;xYVX777`NQ3FGFg2#=k9VGt zIcOtqJ1?h~I`?4`~rST?;yp2tSg1-ww^=zPLK7!%g*MUU+%5G9`-BPH%O8@ zNXHkqQV~pO`Ev>4A7a9`6w=O{)EeuVB72s}d}}~KJ&W~s8cbnbayFp<9sG9o8zGRQ{G8DA+|~hD0}wcL|jVd zS)+?d*-XVrEloOm=9-|JwFQn;iK@>-*G-c50eqY<2tm4c@$-ifF3-JqJ9DIrCo)jD z=C@fto7}c`cI32L&#By{S2m|nE!ZpwJO{eQ(Kjs!)waALJ#(d^*up@g*`i)37cc`* zeRnXnkpX!04CXaFFk5Gjd6%Ha91fZcSaue%;8OX+I-B;LKO za-W<3!QNZP#nmP2!cF7uE`i21XmEFF+$FfXhL8kzcXzkOB}f9n-6gn_U`a?q2-;sq z-t)~lXXf6y=gyJ2GwY8{vvB|g`Pe0Z?B8!EUv0BnBa?{5czErZf#&T zLCfVm1ZERhoDFtn(%nuUrbWA!)(Il+3N+2M2^q8Ma?Esdvx-cyB1VH47gYU z%<7k^cm#9HH(3_;SR>zG1x<#tG_LiRMp3bW70!So;ZLe37zqh?zBR-rW{PYQLl)zO zUVhf)6W9fUa9FCI;Yvz!@pMs?8TK)yx(vX-;mu#9c)Utxo1>-kBi{34OqY>jKVtz; zW!irzpIMY@!TojmpU3|q30!G1y!fzoCNT>9Nbf+-w*c#3;qk16lyz8sa z!YD5>vCIqd4L_*pZvyvQ@9t|q`Uwk0)JrS;hCuPB5aj+61j-)}u>TAMC5k_R;1ekl z+y54jYaG)54m-m?el?3Bcqf(Vn!l(1%N7j7ooxUtJoyoNp#;&06;;9_|DDH(eZw&4 znAK+jKd=h+6i|+DNszB|M0H=st%Ug#IAU>#R>v;_QPdG^;zZFv2NOK#BsCV)Pv!408drzMl z3Y@Y~Bif(z?q0aSy!n59@zwtVnT#m1oUt!SAdmq#w7GHMRyC+GM%}bbNZ5xZyw)*U@ z)@5-3bn8m*>Gblf>GgOA%>pyG_zx=gk9-JIr8Sv^|L4w)HApqMTvoUb5Q^r z<&f<6y(9o6fEw-)YRtJPD8pRnm;`=TiF7m!o6QNrxfmO>X=m5`kb;_}X|%E_%R)Oz zq&ZH01>+#wURpj%`J)UJ+SBptS68X@Np3PPuz&vQw3K-t5~krB|**1R%qW3QXI<1Yvm#1z0S)=B4a46g+h z^&q>0C=i$V@aEl&GM{Y%v*y_L9_Uso)N}Jf^%}rOFYWbHLh_b2%0*hzn!ZZvwPAQ? zb&BK);XRYWKgbWY9MOETKlHOYj_S8;-YuD7ReK4+5;Q1od=_pk#2I6C+BJtrlo<7d zQ!}xZ@xx7DVituUWKx&3F={mm9$EX%jknFvVvCXg&QHK3f%T9z$g!J-ki|LjI1`T| zgCVx)O*b^mt+hKoiy$NS4(FxV0<8JD#iBj$!u`i0Cqz!K#>~qQ7YJ#T6BA~RTf`eK zxV5562{382{dN0oQ_9Iy81BOBOC{KVZs9g)-hm_z8&67_XNeDuAWEbQ9e`jV8n7~* z_97ukN@a6GQHyFK9#B>W#F0(hKZ_7b(v8Loa00|(xaB^G*hjR&Fh}>ramST8GE1Nt zFn0nM&7wCWb2H~uc5{~`qsTBen1!o6R49!^S%)VHJeVPN+v9+YG+Lb#(T-KwwQHLG zTB*y;b?yJjC4m2XOu`>3%8vh~qRJmCN_Tp-`d6yR9i}3mK$7SUkKZbi`wyt7iAqhb**nY(f-F^Kg-x%Bj?G~fbj31I)gxw^* zUrMSm!^;ITQaH)ERjX)lzJ<%`wG|`9vC~2!%RWU$9JLfNj)|)&{EShzaP;6B<4KH- zx>9B9oP^$sEUgn3%Ju#>oZ+uAPdNfMaS#X%)YB>No-5b zubRu9fPf2hPm7K|p>YM;B|^tP^*p1&VRe59y$^C#&V0;SSt#-rp#ooVm>f5kC51r# z8^Fem^kcXT89^UXc^BLp5B+IkP;M(Pm1Np#9xYTd{@iv9Rfot>0qxdR`^-;Qhjv0% zLrx3D3#oVQkks5z&q56#Y+g+D(9v)TpD&H?Zf~lG<4}z+&F}DFMM0g}&}tjBAIjTJ zrE5$hMbE0(M{^$dpxXXB;hl$h#Z_i+BWo*j{c4vYx;^u89{Zohqz`|?xR+S zM!OTRtg7_1G18F84O01hT?O)mhQx>|u{9hwEQ*7_oPki(2Qk`u3~2l=FcBosipcjZ ze$M#&#Dus7Vk};`25W9^9nW35c!v1HP2Q%!2GBN{>|A3KgN-|U#0rQ_u%Aw_PY~~o zRHA`?5DJ!H?;C2oRPGs48uJ0-(IO$7Ld#x2U$S~H6}&vQO!Er+9~GCLeU#06d#o<;-?Kpf2mIC2~}}&i%;je-J#ooaAnHzn)D}v2$+maz-!p4u?S_= zMtpN<;hc`?A#qNVdb|vijX<+eESFJ6eCD9DddXfOz_B|LCz7JDlEm*3?-U+68qj`< zrJ9<#Nz9(f0wK$unz~#BhoDPI=cU0rarV38RjLj(AYLFR+ z`mTWhI7D*iJgA<9$Pf+@U|@%UOeZaixlKMnL;|nbPl#*b`!<6kCUg={JBDn|P^oxd zz(5*9pGZCpJW?5%q|qcm)CGzOIEJCWZx!2EHmQXm9M_)B%4!kp!7)3ePkIFx#gZKq z?iumuOp-P`Nn~DtBZj-wCl;? z)CQT!Ks?Jga4IcjMq&A$pSLz4&(#4Y{Vn;m@eFZsiL$dG&^tP02gJY*=_o6S9Hfx` zJ$MUkwiX~7EDrz$OCda(yq7jG9eXMZ{;QohCct))Y?Cz?Q(0 zlca$QDzS27_hV|muZJ;N+;UuP1&uHZ)7xmu#~fIe{C;*27lYMu?>nt=y3TXtc3xa5 zQiC{vo7#EpFCeg9^Qn-jlh;dV>L64@1ymb3-1DL(GlXKP>M(dt?JP4*#dHeU&Mp&_ z?iExO(AwiOY=J^>@hHcMy!M!_GvVMoM+2O?7AIRs!Mb3#BUn2v1Cl*h>zS#tXLE0w zI}!9|OWRqW@qT{jmihBk`q!Z{rK;Nf-M3mtM|2&lE9PNihKa^nH_)wqtxx?InEHJ= zZIxT2ue)GuYUXCHn@@OPul_my1`?oQHp*LmQAv}u3#e$0@UUM@0AYa~4rxeYDnvKDj!(guA=ru(kScJfNFCI7 z6nFz7ZeEdfAEA&znFW5yc|g&Z1B>we98Jsqb?>z*Jay?1t9ZHsT7xtC#2UgrMw0L# zS#}hN<;hm^0?j#j?-ZUoXW0AnBLwROF~c3|o!jnmmPxrxB(|tO^OWVkh$puL1I*q_ zXE1;}x-PxrR_)*Wqz<6M5(bk|5~|+W2$?cs5l!LKG{luuCIq^`<)iPSC!);8Q_SNZ zTF-4`MsYi9B=y@j`Z{DRT+S&J3R;bq+B_vr+V)i8q-%RAAJv$Lx}Y_^3e@$I|0YUCM1Fba>sU3fSB|G2*ykEciZF zVZ|Y9*~~q)ZfjC@@W@hB9o){7TV1s-^J>y9<eYcn7Ysyk5dvsN@)r?6kb?=2t%U7AuX0Pgf~Wm`t*$9Kmom{f$=7 zrQXn|>Ly>2NOQ^Sw@tXQ)j08sacPYs13Riarxd|*o2?;DPhh#twXJP#ct&+bt&m7I zS`!i3;G)??9y<(yFXhj*0i3hOr3ndKzH*U*QkW4NPvMh zsyHZpi}rE=JYT7k7mfs9iI11mA304ZcQew=@y4h&MJ0(vibxi$8Xd$CO{}Q&d=FX$Ki0WI|A6Lq9O7iTrlz`v-RaxWtngoE z%gn4?2J5Uu5{bc^TjZvJW6y)>3rgZ7!BFH$kYt0ff_t@i&T`F2i~D7X1Dc9$(1Nw& zrdkgU=`eV8C|E&b7Ba(Y_4(>n-;D3-Ms%x78ye+`JrJ4=hDpvS(ZfRsj2=iFWs;iJ zktX0}x+OhfAq#8rTWqs}E>)CYb_8`X{zP`?Skg+YiPe1KW8zY7sI9@zqtKga%E<4|JWso3$HGwn=)k&Qa!Zi>eKG_TKFRtDWvVFU%dX#8Rk#m zc20zpXw|~@J7DoRc;~jZClZu>3Amp_i{e5`4;{(e;o-L%gIE4q08hO~Tso%S9XhmZ z6-+FHPR2;|7;>nU0Z~{CrVMLg8|=~qtDz$V;>1*E9|amAYJIzG zwpX5+CI6y-iyaLuynaeL3Nkc={G2gC(EW?SG{O8d0>^Pi)M*ZG)hvAv9PiA~eOGk# z2At0#i3+>15ej4M93d`k&`k12*Qiwwe+qEL(J!wy*kN<(axyh(aj7|cUUOFbZ!TJU zW}^?#yHFB+Im0}OBGWy?5-)1u$YCl5xum$sjZ#x{WJc*J2~mro(47}P>PSrP0_%X! zyR~ClIf=ehHD($#@6V^1KnY!UEghSexD>nA4_LvD-h^!pL`zm8qu~S1o`A!A7uenU z@uOeZO~k$)Rq6Wp)kZJ0GSgMdT*s=!Lg-mvY{44rpredyRT3!QI%&H`!UvJ;4UEij zb#%4FoKo+#F(t3Q+bux<=6h{Z@ANM)>(rR29yg?iqgpK`elKf9M+*cK1WTspAoP5> zFPTU{uNpG(tWjH5%;R2OAfTfq0LP-9Nzw*y+`+J#F#N;{eLT5PUc6WZE1v8|%-+F263a`{yH)Ge7)rdYDGw1uxMcMW1gWvdDr(4kNSo`}XIXj49-U zHDT(dr5d+=bx1NGx6|}n3zuwo>p`?Z1;WHIH+J8S_Kxagr5(+7d0(d?Tq6}`M)4hu zZgE(TMoSEC96=2~q2Ex9%gMki4117#Nb%H%y_L(J@=?dHpP0v#Z@RQAOA5&lgK^ou z;2u_%QUt)fBCfy0IhT53+Nu4{eGi!qo#B^FKo7Ho1_?ZbOX?1 zn;f6;2g1Q@Lep6*WK5mDtk_RY04Z58jDsQTI zi5n{k078i^LXdf#B_M$kG&?~ZGMe>*kJ^Y==5&WsFmy*n9UgH0{B<@`D$ZA49A_9G zN$kraLs!*OvUWd*8pGp-8g;35oodL2JqgPw+vEg6l1RcY!hdhaTQhq43}=XoW)M3& z{@l|U-lPd;xBYFKeUPNQzG24eZzq+zwuxL?Sf3tk6R0D^M6I_y00?kC%51}uNI(>U zmkJvu2z*3=LBf?o2~VO-n#6sMPb@H*#2Z=If~HLh zkmn4>X0ZOc5X52E+#K3_h#$r!fdN1G`Pz<5U3z9lvIh#Ck-j^I%)e6La|Mg*=?Ro) zQ@6}3B3Ti9T?*za9p0EE>7_1RSHw$JEM2jtTXk0WSXoBhN6?anv)YTHuP_o6QIEwx zaS;ZPK(TvFHv*n%AeS~o8OD^_T&Pv$-PdPgvijt>u5!UP#h<9pSdoPlI7_1KPgZE_ zq>7wAxDqqK9u~w>6&xFzDS+3HQtoqg@J7FB*?QBp@Rp}a@iwjB-M2!lEF(TYd44+M z6}P|fI8@{a)(P5+vO|*Cy`rHMI)15qT{HPE{6?=iq$>@%&@&^2Qp<@=Mty-t-*O#%kAP=*fLcC$8elWO}+3#ilXEmer&! z4MnqmMX>=!@f%{`pQot){@+pz194W~@<~j+&BbPqX(o;|LI>(-A(E1Ey3vQ@s+@fp z4{o%s8}Htd{BEn6a>W|Hd#?II`5~n!eMP}TKdal0jQgka?_5RR3ws1}?5UY6LNh*O zTMWTzCn;|?86__T@w4b#yKuVo9%@Ak@@37N zKapew7e?sYJ4giXylHy(jQATNvS{pZhX<$<|2UtAG(xpO%VJ*1o3J!u<83;hy>%hW za_YF-jdxK|Ivpi_?bFTmdM%c^Re`SV4$Xuw5P6%l(kcr_aRZgjTgcluom=-;31V$J zCtm_o_j?<@c0Ic@EDz6KaLCBs`dIM#$4dWJJBcoszNeSEbPr)SG)y|-MDN0FjyQo` zGKJQ*=0BM5jz9X;&W|-^0(SoKfxnkAQufJ!ebiARCykA}okYOQlX;LLd;O@Pt1zv6 zM!J@_m0H4Wd&Tor%ne#d{*dK*2d*~ig&JvWe}z7CqkZ{b5_yftM;E=SG(BeulTG6) z`KzUpW~DjpM!tgDa#w%dQ@QGUfz9CpBbJM+o(c~$eLs^|_Yf^i%i6g$d&#J*rht?3A=6mq0q3`ccY>RTaKVAw`5BvSQfy2 zcA|!lehM?E;wcUb?o_OZtuPY>86d6(pUrW!fHX7;`0CL-h^Xx7A(&$*5HHHc*Xo7> z?UhcrMi(Ky?sj(o(aDsXtU^%zYjceq?MI#+?EQZGcUdaikc^gc4M(=U z3#JUmHVAhXBH;?*6?l1e%kP1XI@sC{5QP?ucc<@kqd+ zhBUV*%^ns^V{L;hHp-8s7jY45GVH33w%Z!tL%ki^OosJOvh-d(aW^pjD#&6p{f=k+ zeEcK+AKa30eslZ!2RDHq+^Rg;tpDIPH}~(jX}A3!aGNMz(*4bi>)&!i0Yt&QLG>>Y z3T6PgPON2lvbC?KF_>g7Ju4r^u(#w%<%Td3zP9#R>}+GYFRN6MU5I*_Znf52`wY5a zo!<3&?{@6fG3B78*UY|sj(8>?B17hHn-Fa|f0CJEH5%)e_XO8@4Y5E2atQA7;(^sq z*lAbCGm6bj-MY=^Cv*6oktsoB!I@S5*v9Q46@e2X98W4s^hhFilV_0_Se64fDT)cu`<7xz;*=^qR<*E_}7)`ycfzTJ5oR(GSakmw&}Q) zlpKdpfd`pDh?Ek3LB|UIuz8zmhqYLyM)DWKsWO^u>(ARyB%EVLsl4>HQQz$Ecu^-| zP%98B%hG&P4c}KvNGVPNNCTzJ4ES+k#qgM9LM-v3#5gS8uNmweTJQQcDW{`0y3z#W z;BraE&(WE+BylmKL>)A3RJI$U&2h`phWlZqFjsq%BoU@C68NWYE_c?PIZRG7Je{=b zRGG3?+M(;B)#$2iv4gwt2n9GI5cvY*a~D@K_Q|g#dW}kxYEMcLe$h()R0IbHA7Wb# zet6JCLrYAl)`3YOSwxRIy?z?C*RaNDLjMOX`sYUnXk(NPPW4Zy_)x7F4wyl@`+T8i z1PjFMs*6HBq}J4uQAlN&t%nVbkxjOZq|efnF8BOyH+UUR;~jLj`qBG1rgj@0a>mJ; zMj&TjUcCEK0PW_3ra3vvmpvaU*QvLja=6D!&+#Emuohj@4-mh)y$kTZf?k?VZ``b` zEav-nSd>qM{; zUQtF{%M?iJ)RjLhV5%ME6JmDNtcSQfdJ7ckkq|5O7`5UUqU)dSl*to`8Nv^d%H}0JI#0=RZDdBZBa?yzu>{;Y$_U95`bZKxWMYF8kj$YB zqi~-s9?ZOqK=qLr={8}D6zDdflr~GFLQUaXktCov3Ucdw42ykd;c{fpYDDcT4Y_2u zE2>!wgFecImTN1DB62U4aXr71IZn}n7;c$B!7Eb~vVz{k^u~|Oh*9Mf$=U;)M|pUA z6(lC;)SIXQSzo8DWM;2|M-XC$t=y#=q!UqQ+-pSAV@PS1q;u3xSsWbiW|(L|By{oZ*rWAgxmTPl?>`;VRFy2)Of=Gl|U1Bw#FL z>@zmx$|Y@ikk<;n(juQ13grH>Zi6zZqCaN0fcFEVLg_lE)X}a=A4oO0Tf&F2Y^_%hFsK=iS3H zmjuC1r?mAh>yeQosz43wTry)sJerWmERgLq2})un#%!VYu zP{m+jrHOv5tKfm6i6)~$@`Pa?AD_o7k|mLcBc*izLYq+NH2Tc{q(-m29%@@&2Lbo2 z)H~N*YR*}ClTzi-{K*RYhkE$|2u>PgTpiU2r;s2Kph4$!BeAQsE3ZnQV&otzilvA= zJ3V*ZvQDQH@H3SYLdxwRaOdeK`Z)N;-oZzB4ChW}LGwY>=+-fFW7e3XtvTg0pM4oQ zDL1^x=i77JOo`W6AgibX5i^jK8IN4hGUZ;TDoT)c3@O&9TR6EwmF&{2s3ZkWMFW}< z8hKP)4knn|2$TyJ%Z4^o}?4p!Ft4RWHEKH)2y~UM6<)O{dYS zk1Zv_d(jnfQ%-10C9%;}hsj$Pd+j#sTMO9(hYK{f?GFj(;wDMOd#|);cI17TM->m3juWWI#-mK(|_z z2i~E44I!46rLas_2C(Uc%!49TNuqM2`?Q!8Ay~&%eW+|5KKjMssm>i zNMJ4nPq5AT{R<~O$9TF)a4&f}HyS?*x7LUF5kOWS&cDOXfo1z8DTS8&2<((svj}SH z9hXr-&g3r=4dO`wj!+{uIgM z(Cyl>`N}d6OWNl!Bg`utw=RuVEtOT}x38qf|5yx#r{zsd&CE_?8UvNIo{^-b$tWGM zGrw#C_Dh@j6W~YDpEzxnO8G0)Oo}I_Om~OJfGTB#O{0n<}Xi&u4c%~*$4gpv^QjKv3ze0#OzRuMHOK?>;#iQZuxZt0d~ z^JOVG@91DNOka|a^p%?Tq-HClclAWMbk)fP^v?g|SsV0bZUt;zQtz>>p~` z|L2l*!)y6N?dDRIUTyH>LgH967&CXuf--!{uUN(<-8njdM;Kt&euzrdle=;27~e?;#1A z-I_$TV5uVBC>~ZrV=jH>k=Kz`C&fDkuqGRIbnIN|rST%G<`cutN^i#t=*R1=vv%ms z^`$pWX%|CRR&$jbfTFQVv@1%$GGt z^%9pqEsB3s5?HBI?FLw-BE5rCGf&>vc%$}gmbJy~xha(;?b1=1*%|t$RunffYW0B` z3FN|Wii(laJTdqh3vL5RbC&Lp5HE<23bWyl+!5JTjs)4>ce0Aa6m0O(R6v%>D=wF+ zt6}j*Xi4+q3-;9H{1M1%b2DDXoOp(m2~=TufT7caAOOrTbPBf8we->{0!V6)su-u3;=Q?*X<-nd*O+9O0-jf7#|eHZ zBA-`_J|nJ=$|zclmh1fy=TSF6v{SPi(+_7{-YYX3(soJKgmOgCJ27I7SFC9ll!k;m z$cu?Q>!e)DPpn2=VrJuQpg^Iong2*OwLB?j&TyKpGwoL_6}o!4aHnjDsy*VUG?JO8 z(w(F^Y9;=Y**_2ei4ypXr?WKJz8aKleq^fPw-FesU~IV%OkkOZ!4~rs2UM4(z*z-U zO(GVx@Cq!iOOHX=^qGkwkt-!PjZq+|!k$e4v6c5w5{P z&k#wfZcd>k@lsf}kt1>4L?k$-cjCAyQL}$^&&okdVbYnt_Oo)8NzYGqcl94WLI@1I zx+-inCv9vu=xt1Yp8u;3p8-0n!>+4vO7NzwGe*9>2)O7VnB94eMgs7iXi1<6pn{|)kP@p0bc&Kk|^ zGWMgYV%aMe~LA~hPS}S3@EfMp%Z-A z@i^%)fVyp%>6O|#$!*gUjqmf3>zn%#Hp-gtPxcZ9Ufcu^vaz59p-aUC2li7@Z=p+k zEngzEAK}2cRJ(V78S7SV8>IhfuQzg-RDbDknA8AC1k?5STiNCLQQq+<>S=s}^e2gD zkdJyn?B$#J(s6h<*VEA34+RFp8$7Qpe@MR5<`XL(Wov=Thi_$Pc$CEwKdkou_%WiW zsXL$6lHzGY^=Ob=in26Qv2Y=1i?9t@dDsWp{w&IYEHzM_XEvE4W4&JCi+G}uW$NRK z4;cOi!j-r711_!}(#`Z$a9!uayJB~5EYb-PB*Kbh-$)G z`X1IIS-4`!{Zi$l=?_u!VTug|IkgK%OW5-@ten6}tAlA-jm4s|@VbLXn`cv1*KAdeM!~LnRdmf? zU`g_mrT%}MrTbrI>GYfBlyW7Np*@D9ptIxmo%|1z1_wPK#3yRT={}yE!3}RSG)?4_ zgg=33DLJS~HxPio+Z=;i9n~%+OlMu$4e z4}5|~f-Bk^?-wyEr_Y(R2X%higzt7sj+rG+gJ)!uo&?U>kQ`;mJN7O;9+*GjpxvuD zx3S3p+_@^M=zn<{NAL zsT%o#R5tWdbJ4J)Ob8SY>uhWslYoYe)GKP^8nQoZ)a|b%j?5wf@ z%(N1mxk)?}I$}n_XO*LPTqD9^L@Im}%LZB5y);9{2NkSK1#^ip>9{O0KAVCP8mihR z4Dm{_o16sb>iXc7@1r;?Z>4v`xra@Lq^GZ2(wZ9;Ib!FUEAGg#aOu}S1pLsh-iP6x zNHIp+hc&PKdEDrqO<`Opua}pVH^WUe8y18;zH=Bq7Fy2zcKnziT*9!S575`LGIo9> z`@#?+Do<&sXY>|RQKsnR>r!La_0sWyLpErXtpCb3oedV^hehwd!^*W^T={oocx+vs zegBpsfk(NKA;j%W& zgvLA;GcY@$o80EZOh22g>jf?1+`%)MdiR6W zh5xBPNyx5`$93289zRg8dwab4@c|z@UnZ7!_QJi+hZ?Pil_!rq*Q$IqN#Pv6;UE#V z=GIfCnk-(=FSsw3wS9xv)L`Nox4+hI|Mk0+ETPyKr? z>RgT5V}9?I#t?wja`!E9>Q(YHaV2%mt}0Qkb7XH;h1Fi0)Mx_(2%L)zT?8_5PFkpu z74}GMxeVt$IMFh*4eYN_a8V+VsV$#Jv5nPSQKDez(zVSimQ+iBp!Q|z##HJblsA6m zS8ou8E!+|%@Mv8;r%xLCH5My9nHoX=4G=?++6f_CmL@7^uDGmF5&YIZ@y%xR@>rC%#!BNfDdhmn$-~0Hb29JMH1KEFE4XXu{J22<#SlKFD zQRJek^mNs>Qs4kj`<1`YX5%JBnxr~U8QLM~i#T&v;&1pANtT4^M$Im?4?P&_=NHbv z_dYI4`R}=r;$(=s1fMa`-IkqoH}l@lv%I%{Io;3t z^rMJi+TC#u(JY(+ty~vfsl@VzFX*K@%JPJ$Dc{TQy%O;38L@?0CXrzIDtq^A=QVd) zJeqc&+$8D~P7)@%sZBFfIeX`hM^7b~%AXq20aOY|wqtQ-jL$!=PeUh01cvdgR3_x; zn7S|}oBPRB*mZ{;stKStR!A^gnD_Q z9D_shlge=AkYoqNxL_6zS}!#XLp$AQ_wk41nZ$~F)ry2)TSaZkxc3;VH%!zd&Qzmq z=k2TKz`RSQ)CHgvHxCW4qR z8&-D+43iUK$hO8Jq9Wyu^=LHU)K_3JdZZM1NXr^j1*SLLJ&((z>yk#uJ}tu|3A45D z3P`@^dMR3HG@0z_lFTq?R6g~D zO?q+~SngmRkt}-_s(a0pedPV&roFU`-kFb?xbwL7yx8>b-7Ngy;J-hn>vE1efu#DP zi^QOtOdz7i`ht1K=-5QK?MV)b=gb-swcDK1;3nks;5DRM}k zQNql~-lgM}Yhvp|QopKVW$?kz$a}2knRkt4%uzh?Ww$$YygOBN94~ibDg38<^RKo0^T5 zLke1HhJgI46$`cj?*;1Lf#mDds-v0;gXTqP;!??nQt6aRO5;Y#0_jEHm9uX z9VBjwARFI82V>1F4{QixHW?^{`Jv&OCGBas-q{qb>{bu725R$ddBrK?nWiB+tWWxv z+T?FbiroL;p8R<)5GZ*Alp?OulGS{+6tR^0MQNqyim)iWB`4%VSO)fhnL?7&3BT;dV11 zB8H_W(>mho5N4Q-6iS=+!7eSZ-FCp1HtUTWy#R?xmYj7&h(gVjHkG2o5LKUSq`_SZ zhHT`qSVW>17M@!JGpat|mPrXqbOIlgq7q39bP&r%Y1Z6fz zR4H6zwFlxjJV6SECzK2Y#7hkEdR89cgzD1IMKZ|5_E*DUHQOE6p|~O7Wo=YSel zy{Y>`3(3$BMtK#ZrqFU82TIqj z3e^Ntz#)`Baljc+WNogm)}5UE@+gtcX4sQ*e=gB897Ro{I2Nv7>U~fk6NX3sz&y>S zsA_`yzLRps;Sfp!fd+(Tvs!MdO^fa2vf=8)SDPO1+fL>9u&)_ihDNX@)?1=ysb&mYyWhDD zJt-bbwMg@F^{t4;s)EdJ+z|G5%?^@eL(a%};Yg@zTOB5A|} zGsmy^qheyhB(X6N;lqOdjrzrP|M%*@EMA!w)Ic)6F=hgeL~07Si;Zp;WWaW5=oiXLisD$)$l0svaLjNG3qz*MAO0AfUTqTJVR!yw)W z_fT|;zLd)RtZ_?tX6AH)TK5p@DgkwbCB#~G;7mOUII|6%NGv#R#GX^3R7lP$GBaPq zZRZ6hLi!<+0=-Pj>Y9ODdU4OwXOd+BFgt7fwg#ViO~Pgp9a!|q>G!k4=ntD9?34_v zz2?g3oSF7Ot9B2)>7Mr3JJ;MN4bNt6?S2L$2e%ag1>P2rC{1R-H?JO)LWzo;OKr!b zAc6J~0XSZYy*N)w+$gLqh{&GhTyS48ZwFMYvCTG69v6@GF?#}xc{nAlm_ZnCT1d~< zu5(d>pcO%3t(I>u#by{m!1M0 zxDQc$ka$q})A#Z>pCtcaUpN-U<9r6SLjp&x1|z^V2P)9Sv1MOXN{q&bhD_n`63|g2 zJ_&}ioRJh_qc0=~8 zc%958$*dH8))-QoYU$Ren+~}*`c3t78X~;3ZtJUkUxhHXbb?B?p>XO_& zFtNaW_sFJjt2be-;pR=^1p7^-PLIWF{k8Tw+d5k}0(7K4CTQ~=nB1VxVjrLdf_0I7 z)Fw|@E>}m3OCZlHhFVJommoQr^Zx5{G8>Blu|!YoSAh`~5;R;uCJk8xa3Ksu*%1v` z!m5$hKg$H1Fm90C@7syhu{hC@Ybvl01TqIi6aou*-&@6?h&7R&xSUFA60>)THwbsI zPPy;_`7R}Qp5!i@+yp(Gf<1`kR!4KGiCVlG=l|6I;^Vt8Bi$p`36)9dhx0ZLm^YPo zUD(~E7=2qW!;HSMo{&F1$vVkeM+6Q@F~QWLO~U=lCScr1>sbo+eQ1C0aB3@HvSLu8 z2DWi-e$--rR6E<2glFUoy#qGL7&R9rmuDA~2bOV#bBg6K!Xb6xe%DX!^v4%{{%Y<* z4@f5^q|HU=p+%&dAyKMKXR3=)9w-%Sg@pje6>0?rhVjU6!UfWLtUAUKb~tr98{~*{ zM~Q?VbUK(AroN7I@!)`t;pdahFIA%)n><3Zjq*w4-mj}=E~z3Qc1d2%Qq>wiJWwAy zdBONBw}g$Zk+Do1pHO5g{n5-J>8Ni40%zISW*1x9dRCf&&{|gjjNw1R_zY5Z?tvES zqQv-k;c3rnOS=)2a}FWTTWwP>TZp6MWvKPp)@O7+uHKeKkyi?*i&wH3n|n_XWfdyX zV9g68u%vdQMvbKf*%2^ji+#d?BTt__zA)yY_b?|-nicXj?}JBdL-Ig=>a9ZR7k}*+ zMH8HJ=Ts=>%4x5B3|OmpSem@seZEU|DYVRKq*gq4mQ8(*yTAS!&fGp6#~_9sGovcC z-C|KTt6J1FFFouMe}^SQ6T%?c)p-mEBw~T`PYNWOH%y!ZNAj>^q>iVor|x^$4JwV) z3!_pZCeW+6YVyD_Lt&rEWb^g74M;FULeAkIB6DJZA4slHBnidf_*1)nVxe(M85->S z{IQmmZtA0 z6~$qj!HyT|d(JjX3uKy1cF@j1^NMnsdFQP}8lU7-JVy}2%1I<`*jgS@p#Gx5^1q=n z`jg7+|4#*Ewetmdtm5!a%i_G~d3cg-+C;h>yxI1xL|-mNFQ>HpjE_8>YVp8>NRqFB z;=h&*H3tqx<)347H+Ob(|1~e&qUrrFn}EsxtM*zc<7%FxfJrvYCO~ZBniXL=OE8<@ zlx!T;R@;PDXIbab(6slQfQb;0e6HqRC_d$=NujOlra6pEbUM^%On4)Toa@n8EBCt%WMTMKN z3%2MD(aZ7%5qka+mjC~X!Mpa1!-yNR_O-m?(Pl&m68Uf zQ@XobBm|@dBozdM77!@`;rbSCb#HY4e&6%n&;2~F`@LCzTx(*@Ip=xIx{ft#*33C} zTBcaK&vX`z%z8cx&);wk%5I9mK(*{La&-H*H==0ffy+CU|NxM_s zLw)ClASCAkIuE_iR$(yl3ZtyOYQv!KRp>^47+wT$xu}nO5~YMtW{e?NT^M75F=m?O z6953)L8xRQrRt7?oufWvxd!C3Ua2@NAN)wkKUagh9vCCuMKcy%WsYXcGMQky?h+5( z($9((QedTaWQx)mxf(`QnL#BR)JvwMDq}QEYHFD&Tqhw`%?Cd+-_b2(-AIDt`*y)r z&Myka6iyV=2}vj_6C;W&GcTGYRt)VrWRNA6GJu`3XYh9Md(|||Lfg(KmmB*ZXs&SG zpl5AZ*uapPxhfG8b2fhg3YD3-{<2O>8>tAXT|9l5VUdfKOxVaefok%GwI zV){`Ck&<5*mZj9A4I%V`rL&d`L+cGEA@5f0E#jw8Y!>-yk`~&ZCe7hXD?oifiw;i5 zaonad^R3mDn^y@ReH%|8_=6J)gI`91oR9!=Lg|uSbr1XM-lL(0s2JT%ox77LD6EY$ zl){aEv616Z{npl)yt8bopD0J7R_?XQYRxXu=5wz^$ z_}392CvO_BKQ6_Eix!#iwY;ooh1FAzF*&8wEARb!h{FByZh{(av636TOf_P!Ur`~~ zfcn*hvGB*t%&U#KU%R`*VO8OJo1&WaTWX;r_ zj;wap$S@`2ifozu0CxF$%rkwNPAQlL72S}NRrKlESc0v)r#pg-tGS#9?&&cZNz0s@ zG8y2uPmHzZ`I^%Js}*Go0GB-E@UlZZ)M%hff)iVM`japHd`w@WcJn0;BDLUY8@J}1 zklR}kUV;jn#_upl)a6EqKUw9yOQLgnnS(9Op@du6CZEP#*E;Ua#f?WOr$U)ePte<> zn#yG^l}dpsp6$oL;a^yjkhaxY}&s@oCboVG)i< zUp46m3hv3$>RGP{4w|W7F)Euvc|h^*lx<~OpeQ_o*G`K=$fhqp@quC1GwVTV>LD@Z z&J%9emy-udAI7IujbQQ>l5!1b`}20xO+%|OYqjaHa}?F^LOa6Hr^vGj@wpLh!b)cpm6+c+VfzL+p3wOr1LOn;UcGo}&>y2YdUfWRKgN#wINV2@>!9y7CdwmfO-*8T zN<`LpQCJL8K$5L;g4tS0hHoMvU@-cIgtYE^%=)(b{Y>N#CBsD}-jG*@&4wICQ}?6X z%N}e>k;+-M?(46^a{^w}d^ThcQC;Ir2pWbKpo9JIcEe04hI5G{Vs=wl6dlJV@{L&H zo<;>L+dtz8w1eJc@c~s|+~b(q+MA9Ly#hXT7OzXTM^dw*;Nls8Sr^Cu7y|t$3Lb7y zD|mdoyEvDb&>68{lVqy=gE4%mlBTT_>ge(=uMG$SG0)7By|F8{cC5&4XjyIysrDB^-rWe)=Y|vkY@`=J<5!|>an$7 zX>1r<_DSv~0s^ONIB!OWkqEGzk9{m-m4>xU_I{fo`G%&$%@;-*#++B4m0uDzQw29C z2_p6>ogC1$to}6Flz)4sB~r$b-f=E0sK@9oW)*kRsLFIIWuEbMiU^WD1sFwR5l+i6 z$MPrwZBaoU3FK;iqGlA@=U&M&LWioO;8x0Tb8Tm8LO};|zqOt8XbzCs$!rtfSP(z8PQI7di3l$Dy9ZF}%C_fkS6Zb4z@H;=b_w8gU7kthi< zNIBv*$|%A(EY{O0-`Jl{Cs7@VKLA7DFEMts*o(Js0w1MDX-H&bWO?>*{skAl%1 zhJu_RW*Xl_(St^~oeh9<48@R7E^${Mj}MSH6iyDj*q>2Cd#LS)*N6>oKi0a@!57|N zCn25eK|2xxcRPrrRp3e|j5U!7|8`!EN)f9YrtMwsB;4L+xewyH&5obn;vAVvV=gGb z2@PO&e3Xso*j3l3@PB?+#+1htx`aHV(DXDk{VU|)yFyBgo$~7y-E)BLdYnBwiKRy^i8SP9DZzNIld-GDn@ce{!x3r_?U$;!{UqJ zXP6l;*rkGD94QergD&~&nqSJU-bTasZjQ?rb@w^+cYose)}rmJeJ5%LMRv_IEb-FW z+1sV#hkrbr|25O&0P4*R@Wz(2MH@$o&4wtLi3r~3HW;7n$X0$~JR6iD*SU=pq{*IB zmH}nU66tH$m|033Vzn9{MNFEGDrI2oWX&h!*mT7exrrwVZAwD*^I!GdT01Q;m?M@^o=b=r?6(qvQP`Z{ zAkXdTP4WHYDr7ZSC>eEk;3zeTQ%2iXC+fv2pihB0fS~GD16|^z)8am95ga?rN9Ru= z-yy-e*I8EW^Arc7sxEJ;ie&gfo{Lo*vPhR-6=?Ha9iccB8OT_;bP=t;jPYk*srvlg z7--Sd8XZ2kp6H}b`KWtXS{GMXsPG#ne6cw5$7sKZc68>Cailv#9`w=LjK^tJ_Xu1A zb;b#xKSn{d1*Ngf9&YJzmI?T1_!InhcrJNqxk`@yQFZqcpSTvG)V-@;Dm4;`TjGJ? zAD(u!ZDutTIVFedt4$SL(|^b|;JM$S=pK;Hl9}2v?l>?|#H@-x!DJF7^2QSmWlcf- zD*6W4Q;aiT`(x48+{Ty+y=-+{D#PZkGMgTr7R>ggf35K^O8qwwI0R@0x1ieOIoZ<_s#o_Eg40wB&ochTPIBiT!C!Rt>&RmheqfqrNaqb8LL*Q*R&WX&zB? z+ulhV_=#+*M7hO{y;wP}*eZW%!&L$8zhTAyPtikw;twO+IVVanXpX=wW6WXfY?H|; z?`lk*a-wxF1hzt{Pmg+>}xhaAO&Q z6zsV@_5x+V3iCS0TG_JpsK?#>_BmGD=lBc%+I?%w%f)^Esqw zLK{mXOcA^xLbgVc|-!uROO$xeU_Zf9mlTz`njsoZ8ADg8wgav@Numt-)arA? zh_Y<1gxnTlU2FWzn^W<0T6YBGjO}$X+@7MQM9U-yXQ6$(VZ^9Dy4J(TXuW9}`;K?0 zMDTXh`_e6nmz<-oMFa6~$F=3#m96Vc^*EJ4BVO9{Y4@ZE3RT@4u{oLlWS$KtrZ|eN zXO|%EiC!CoXxih7KtCvwPNXktiy;tdH+^@mezbyKX5ZC3?^E}DiMqXkzkx+LY7p~O zf{KW)W9EZpp#vJt_;nfkt#?af880pG*XKTf56&tmuhplQG}b@m!{qNwbN5{$p3InW z&E_HONB7H={k+rMQ^#EDJ+P}fURVCzb#6U$+!FacSE<;0*w`Up-}@$E2hT3W-^_t!C`C z%VqJV<;Y}HFvk7Z|B1xVX;#+$>E=d#q^FEVO%B(!1eO!+8s{(A$JZTo+3X)zr(nMe zg!AO5YGUZB&{pyAxxyWHI*^V1GKLqQEGWHs^mZO;sQ2ghLhC4QFJY5xw0+FRLS{|q zxDouWy&GO99SvXbZCQZI3Sa%XD`ZIxzsH-2x{PAy&{V`}xpCoORe z-s9CHc(`XdbycSa8E3Y%S_Iv;I13yt`>bv{A+*gyzo;sHTA|qgNqGuae>t%jIsLrtTZoY@g8-PN?d^tO_QKgq_fwe-^1U)vE5b> zOE*`|`Bdn>4fs9K9pvwk?thYDdQgnu}Wzi^pT!d_iR6H#v z3z7sv6rrs}LX7E7E^mnA`;?-c2Q~woR@BY3RB?2j(WFJ!iidQFNaaQcwI*{zkgY@g zIQeo?h+NIOJH=-rv~264M{8|sX8g#PqT!{DyV?rQ4E#?&PL-AM2ZYMyy{Fp~Z5-8I zaNP*+;M2MhW(jpPn-+}g)XLYmKMEBbERtMQ+;|Itz1)=K7LgioD^9BE&|*k^h#(eO z!wdv58sQ4n4gXP|Vh-KwMwkqNL-@VCe+&Tq4(ZS17Bb!=| zdTHoXz_Q%^jT2h*#zEg}wpFtIk)ZFjBrQ*+^0$#K*eq*Yvq}w)ad8hsOk#LzNZ&h4 zyJH%2Z2NcnS{lO+I2%?*H!@rAZ4bRNibQaMHejcN!}jhFG&MJ+-YR|G;v1cg&$%*!_?CQ4mEnc&6xTg!ikC_sBbk zIiFNeA|Doag| zxFtR(2&eh9j)%O^N^YE4jG{$lirzQ2@I^TAktI0RlTswr*qfBtw@YoRrj8XQq9d@jN!4bS7asb?(t=x z;J`tYa_Zbg)2^tUV+~>9O0X`_j5^4@@2;CBUgFh@(2?LAtLvxE6gOYDi<RSa-+e zDZ@@xR4Y(_i&1m&;i(`C4uz34^_>n%*Rc3;J~6@RZ1(K81i~$_YI4lf+uVHJ6xR`# zM1pt;rObOwpE#L%@|)Urt!CNI3_OzvpngB&`wUr&I{B&5o0{RfGRo5A!TPGy1NT*n zlkaFqG@Ie2bKPr$Rzo$+JcNcCj!Mi;jId);6Qt&vXN1~q2#A3J)j>H@if5=F*{q+u zaP1^-ob;?tGZuXvgEiyqhF`W$PJ*D-FYgSmS*>z!YJ@#gIeTLJIak7ByBkFfjST^irPDVL0W59Iv4rA4p0L_FEcQ%> z5KAuVVPDf+s>yljlmRiea2qyxvl7?cPoGqRjAfWA-j!`7UA_UB!Gs)h@Y^cn`@L}C z;IP6IM9v%u%U?~2rO9!6KrPke_qe?}Ovc5M@FvM@`JJW{K3TC80}_S1ls(NoW16fk(08i;|~c_MGE=SE=2;gZYokR3Nt1i zRx}tWRWabUn5rvC+N`XlSqdlsAcR1LlIkOrF0~$JMsqY4R^dE1C13kow$acP=e;8x z{H&N|*~({;vEp6gBdbkS%qUf(Ck^FWmrmIl5u>Xv_iEP1^g3=(nuKIaqe{0A7zK7S z@GVgRiL`;0H-&p~i{amyIQK{7uZhd|qgKVlvZTAB-SUP`+>KWw{zKv8lKQE;@nT~zGi-sGs1gZo9s)LOd@o$VKyHu=hZ zOokBME2=gV?ls|{p((W^U+!hVGd$gLRXakK`8oB-N7WR6c&r=QM&Y_rF?lfMqRld* zN}4%tByw|1C$L<~xBsNTrHOD6&o8V)LK%s1YELmGR4SFy)buWOPAzE?a;!WXSpn?C> zB46(3Zq~o5uU2fg84t_@Xg~Itz*1284UsRv4(jem%BmV`*?ZCk`xbG*p&(@_v3A&m zVykAVI+Knm6Nj}&j$1MPwf*_e+W%N{QE{XkSme5K1JznFUHHd&Zq^jUkXhdQ+UZ0|lBROujFRbxupzp1GnPP2P?wmdr2mxBXV*4fz zm(v3vZiuCZ^HJ1|?Ct{Um=xZ{zC^7PmI^P7DkS=v#jr^gu4MbrW0u<* zipd2#p}D+=D}ENIbQSv=WsJnti2{vi^L1sr1f`e#74jG-ZZ(;8IVvE^M{!~5Zq;_e zb1Tea-gCGQ_`~}Wzp2^qRn7dd^JRcR)2|-x}s$KB1T&7i}U+|(o;W4 zd{Q>))mJZ5pIy5u+s@ucn5*h8{wW$|sRvH1*8}s}4RM*8K3wUp@ZQ|$&^-rG%RK?J zxVxpT+*?yRs&(19*hd=sC)Rq26%$j|tMso|*sZl)W7W+~zj4Ch*?Naq+m%Rgy#u&6 zoLSdhC{VhIU2`@xY7ThU@6BITJQxW!f74Ll zI`}tR|HZd@#&$AZHCMY=$!`k)ex!C82flIjw2 zH0>+)Kqd%%blna`f^iRQNrf3&!JLe3Oz0qOM50Jdi(~>W@x)UVKtJ+Pv!~o}#PsV4 zwhfxH@z$7iABR+*b)P@*h`NCFVo`|>bqfXxIlF;yL;vYE#%EjEsv zLo-skIl6d%vd(e5ogn8bOS%fX}m%vy@fi=B#k7GF3M!;KJ55dmKPIinE?iaTV6NS8JmY+g)FK@ZG@1OzVsQ9K(G< z%+hWvje(3=u0>@^_|FPybQn~y;0AM!^Vy!vS6>wzK%d_`arg$4f$Z_Rb|F>sUVh1V z^w-heZ@OQc{`V0$6t-2+??1&iKa)V zmu(K~Mzb-tBM(zx`YXSyW{ai6f}L|IEPc}ysuT->=8Q5=bWh(@FhpZs>vUaZ<&8kc z5_);o{tRPxn|*w~9Go_Mx9-^OMVZ^=N=s2B=Ko@6a1oMNn>c3!6N_L-jjg}3!n)gu z-<{eIk6#VQ-HRqqCByK?j+LJ<^k=uzWyG7X9g34~D&BQQOa5GcxBR(IWT|f6~> z=CtAheY7UQrA^MaR-(k>;Ta1|!XY6c1*XQbHh00~%fBvT*WF#F!eh**!%-B*HXqF| z1r~z3;iQ)N=Y)IN-pN{a&)6_5 zyn$I#kMio9q6ERIm-BE;o97UTJp8x0%=)` zj8t0h|82V$A$YZ^bFeURaE-ENutjLNg%I+~f=d;PsH~pdX=vJtxNWzjm)k}36^*dQ z!uUQ0n!ihnwJSx*Ak4({q3y6~d_+!ky`QzeS1j zG2uGQb7$Id>4-@uahN+%Ndz4qOxcd77+SqwkvpP0%Y4*LPWKB2INvCBz4x{ewAtC_ zwFf?~#hvDedFS?@O;BpvyZKGOeN*P*d+r27pMQb2ps!aZP|mI zklU`GNvDLhhBacS+mVPF2{R(ahX3Wcetf4=Pz^H{{2f9uysgx?Opot1T=P~%=EM9T-P)M7-S zJVipwzk~ds0_N6z60(wqOzdoNd3*CIFJd`nYS7-9zCXBfoc3jtRA8pA=+fD@?>~Q=N;956W9GtM=P zHd<!e4VN(;j7`$PP#xSIE40a#>JWeNU zl(jc&>$7yKT9o*Wmr!bR)h9P<0TeMLn-xo~#tuIr^Bb|raSTJ$eF%mkt~xC0W_C98 z(TX2cvV%&*bqee3XA3^8O3L0El4&sBy1isA!~aoiWqu^JisH=z4i` zbDDj@-4{ujc2b8;-@Zj&I<_1G=Qi8X4H3(ObDP7N+?2}J>DijVHBgV!>T7Y;Cg;vH zQVV5QbuJE|7!lv5eY&4dEAfcZA^GT$PAMI?45#AmxZNEj7$37kXa`LfG%fDa2K0d@ z#pTF3k5dPq;*Rk{&-uBwzv?nE<2IRZ;F>JAJ8o_mdL8CXRyD$vzg}<={v8lFfC+1U zRqqQy3ag_0;vcRi9MwyC7;AK_fR(%1-piSJys9YXnk^N4{+j#`4R5O4I%)e1z!Rf8 z#;G>XlEblDle?vBMH|?gKsOVi;liB}G@{v>;Ei zpR6^Qg%^zyHY;TZmUU+@-i)_%jVxr@Tze}=(a$;+h!r2ZRfBZwJ-9} zuqLaSeX4hf)&`6BPH_~cwcxjY!m;_7&21G2j(5%S4jj^9yB^YI=F)7joR)Q^r1iCN zUs(!C3}rT6Hwr~2P$*@=Dd4K%i=`VD6lH_&ke+$n5xS<7T{G3UdPNYO@3oym49A{V zo5yQ;S=38c?VF&&^RIz|VF`O1pK~ffeGak}!!BGOoCoE1i|xmRy_~BDAV~f?F(vUp zZr%~x6l?@R3ql6ZPSoU*(|wax33AkN%TljHbVb#7jfE?vvam3!w}&P_C^Nw6U$Rc6 zzkWL|-E;n%VPyy1LQf@to4=c#|4w~2Xz=P@SpzV1_mT1!3^Aw4le5H#-w2LxFhurK z-2NimQd2SoN4}6FZnP{$CfZBM?SZWOg&Sb{tqGu3S?zsqI72$wmD}Jbffw^~diA+6g7R zT|N~*k60cMFqk{2#Yah{deC-k|NM>bE$;bq*6vOS%m z(SG&C&xI86VVR72MbGXmfF8C4dNyr1PrP|O?k-w&W{n0zPb+*HDO}pl>9NXocbUEQ zq4o0Ro%msuKE!jG7m?owfuorIc?XaaWGh39XVGA>VUXAwL>tRzOZXgg>sSgoP z#(BF-Fr6DUeoexyM5Szv87_?6KxN9;s;TXq<=#tHn-7M^uNOR8rpO6qN_v;@XBCy! z(*%$Z{Lk&=Blu4-l_^d92=+el>avLV%4l8#vIj%At>E|Rsfn|^*vhoi9F#1nm0*t2 zAH&KIovY%+r)6$KBKO6k7m^>Wu}IKozx!xCHhpo-&gj5v`_ji;+-|@uT(V5AtjUFA zWv?i{!5oX7C&=ds08uvUF)hT%!&B{yh;X-@#=g8x3)j$z!4I1*7bV2{&hQgr`W;?h zR)4|KxU4b!kVtrq!VwxulV##k^z(W^+xA;_aMdWuw;6o>^#K-3c z?Er&Z<6t~wJi9naDf+<>35;l(X?wzF;b%fl@B83jF}N?0doFc!LGEKMMZ^S4X;Uex zc|C;7mAfmi{&Vv~kGQ}MX=R%3>mptG-OT;>>0_*Q_Zqwm&%nU}~0VTddOSO8F`)dgiU2v>3&aAL+*<5$46vws%%9$oUBqMhm<6 zwdW9<_dAWChYG{h?PFnA6nxZgJ1_cVLQTb7W$ig%2p9Q}F~+fVP8>V&4Prg>K)VPC z_$^XOzKR}om8(>mb{5Xyc)bunNnl@%4{j7OLXhX@KdConTugFJrV>rEHAK&R6NKf` zJxUmO?SYcd!>8e=os{0AUI*u^?H_|?MU(20$tH*f(xW*6=Z6~4UwaYzeGoWl7l%H1 z=?fH@uq11G-=_uVp5;`$GN*i^6(rV2e7P$EQhS-TljU|Z6=vRc|F!L1-i)$4A4Af2 z@BL)M%W+1A7fJ&*&Adyz#Y`wa<^De&J;n})-n9cD;=VQ18$?8;tVZIdh;ruJmYF*m z>G{17!OLTB#7JO;u0hy2<*v1pIu6rYv2kAYsMsfN)99Nzht4YBPTuHj&Gbqh7gC2D zbCMxW2zJXi`S8EUKhgI}^`YqxiZQMEOfLLTbK1a{|IH)iF=I=Gty}xVt;qvEe@H*= znypn+ydUz76Amq3c(dWyDU}gBnA6yW3K`t`@HUi9rPk^s1-afGpyUa@TL(bYtTQzX z4H-lHgg@OUTU$#)h}*ow90woKOpEot zrevK4;I)yAQ-np#{hz|S2u<(AY+QkDy;t5m7e(OHU#|74{%Vw4)fvLikK0b1M0^|pms)xEhVbrp%%QD6LeBy*w zy#K@J+MkfGXHyAqP{`3|4hCRq{uobCKIXu&lSU^tFgLRc(@K>8ASK@fazbk;a=jZC z$O#dw07Qub?n4&bHY}Vd&M5VKNKTk@8itu4!Br{0PoKHb43mOlEc{x5MTjY;*%GxV zlr97G-Ei&@^Eu9G#ugzLQ_fVPh|^{jYCD&G5&0bv*vzJu__$pT01VXRX>kOnKkxPEX4X$>E=&g8K6sRtt!hp_W2%0 zc!o|HzoV`HqdIN2BS>sx1pxq^k&>2?FnKXQK8m6RTP6L>n}dTDI?HTB{0AL^#NySC ziiVyhnlF;Du6*eN_mw(->^hW4Mb!3W2GUiABDVlUBwZ4O0FV_ZZWajVU$~-4FZ`&d zy}%-5em>K8RIHtu6i7#>oZ+Qo6|5??8bo?{>iV3gLXS}mz z55%!~1DZzRDKhYfBDZT@5HLZgep#P68=L(T_A*i;_3 zvwZ<9ByCYDREPp6-E&wK35!QAk^R$)9Av@AZth;!lwQ`iODtKqG((%_W4~K=BEvc! zet(F>%HVs-fBZQZ>~woXfPW@cnhEzPQO9Bt;+xn_y1dTAZi0mdlv318jUH*wgBK71 z4jS_@YUuG#h#h%thDz)g;j3v!N!f}AWC{~H!hp@w=?ma7>1kNO@u1{V)NC`xKMiJD zR_PD?MC~s!5F9=G`5xd1v&dW@eHA+Ylf=`eG#mXeXRZ+E?51HR6L^dt{e)2)W*j?p zv?FG-Y`eZ>kQ3zOt9Z^hA+-K;Tmp0i0FVq4+6QGfWDuAFJ8DQhwZ$$An4R{Rb)ja~ z3u%jUKsW$6iTg+W20v8^PF8Hr7rPh3hLVflN!%X!OZG*=Z;k+V3^-vAfS`VwBj~$Z zB-9=CnA@a+Q7RxfqHTJx(NYh-8fJ_>5#cgGM2xd6WAL*z>(G~*DQVK~3hPmfSANd? zkBxtPOD(av?F#^mavI2!rnuAoZb#UPD~MH=u2{{qvA zjYKxyhtd_vLN0e1zo#M5BrQFlNBq)JS)9^A`YJeK4%!bHbfd9cK4#R?MBC59Iyoh& zu?jmyu0P!0q99fL6GvhcI!pO*5F!O|*33Ewj=&c7l6;(Kt0?=>+EMOZj3AzV=ywu1R^Oeq*I zrpI$IH)OlmmZZG>Wdinye=U4;bB>|^!)L)T;f^mdx3*RQ08T%oJQD$_+LtZ}F6UMo zK6w<}u9jyr+?~V_lfkG1xcH31^COmDh3-+l-uDn?Qxau|N%-^K;h34x&a#Zyz%0)$ z?8UCL+7omR&0-ud=I6XWv0RZC(@ey!CztPL>HDRRUpOuHKu)-gMagY`#t963rBZ}? zovMMBa{XQ(v0xM0h6J3EC7vzFI8=O>|L6Hj{839f(iKL@Ka(y(|3Cx|{IIFaEkI7d z&Pi$Z3!J5qQorw8PyxZ@vpIP%>#tOL6Gm;%=V!zAp{p`VtFAd!EGCuF20!Os#Q%#3 zRM89A`2qk2&LwW#`efFp!dLA6bJQF|g&+&wH8XP+hbmHr#*>=HM zIX5Fh20MaAL%c57z!^%~hjzZ5{XQA0eG((c$KSR3QPByH zs!wZaOr1;~W~meK{73pl;Gc*<%%fL^;1hvHJ{yV#)94%3LM=ABQAwzM>m8JaMCjJv zm~>)a=<4B0Vg{#l^KWu5lKv|QocgNNj{vZeS$;E73mj796hS0KN)2r5-d2qQEMDA> zZGR)g$Bsu-ZGv!3G5wFi5^scmE$lK{6ZmV{Eoh5X%UYeeNk2HQxgZ1pm%dmGAJgF2 z1ltkKgPZ_A!Y3S|DDiQP(~>PJw7wrAYLy%X-WBul<;|#)Qo1?xRh!e)MrFw(66Hq) zG=e0*RslVI@UqR(UM0#U^lvgRlKw#me96S+PDTa*fOJlKZK2jRu%A7Z?8IM!cqR?b zdaKy^9{R7wY(djjN{bLiBxfN07rgK*KL1L}NBS0V0N^BL`4ks8q=vB&j8zz|sE5h9 zp?K<(`S6Ft;{0t2K6c6snABQD09IUi>nfe9b)g3wxwvYuw6e>3F!b4{zxnpJ?*kQg z^G+sJ?8E)W35RCS-%;Q=+>IpqVoGTj?3r;r0;#O=HOCnzG)%|kfnTCXr;UOWonIor zf6-HJaeg7ReB+tQ`cKnRzACnQuWcqk&Dc#l1^;o`al#uor(b;=X+25~syB*iR^ih*|=U zU_W6^Sy~5Ac{wv8H!+=dH1Zw!J==%SUsc;5^KqY=vL=P8%xXtbLioG-FVg-w2pm=6 zNkk!m{RFZ+>i8TrgrJ1Q%k|q_WPCBw zR-}GDKjmIT|A`390V%9!%@1tVNLzLbSz<0odvW#9lU9y#Z2e@<)Co~D?i%)%ir5a? zPgxhy{~7`*SYo%&z=l+aOl5g3`Y!m%#0K?I1YWsxx3|JC@o$8j&c39|F4Ef06~=B# zLZel(%EFcOJrhB^%Y2WZToVHcw}{s^hEVC_=a-9j(As_#v3qc!<3PJvZkL%BfcrM$ z8z&qg4j&Ws76lF-&V&5~@dXl|puty=SwD7@N1Z1K>uIv_6xjMbD>?&^aM8v>XYKD^Jr}R4Y86vxWQmvpI%JmU z@ZNIs`8)e|*BMJFH$`}3ssAqbBJE#5poD_U@T?IasWYfahB_?m8iJr`w;V=feJaQz# z@9QFuEzaH@Y?6kE+CWZ#HznbCV?mi&4V!=G@_W@(h+4>3bz01c&G<#%AdB_$f2zL? z%S|#l@I#-!1h&5Hi)k&3@|!gOCGjHoPeouyh@tAN`2ij)v*F>W&mv0f4<47L14BW3 z)qiKx>Yl01Eff2P%H#epK7V(?McTgyf&0kBe{|p;<98W`EMB2~u#Unj^~m8*>GwL> z6ye`y3NfU^MS_bWz(c7=2Q!E&?oNt8Dcu_e7oQ*3p3bzteMAxgo8Wl=$9RJL*}Fr4 z?O_J^?jR9yh3%}L@Roh)dK7Y93Kos;nLJ2!UZQAI7N_~7PPxmvH!LjapH{A&}y^j3(WwnE57ka`lGsL;?Bon{N3{t$gSlD8M`n}CcY3+Z5e zODU$L`?Zix%x8$%2sRvfgp~(2Yx}SUMgM1?ABDaKDir437;~E0)t*LO>iWhB$5t}y zF2^Qb4TQW)&_uUfr-z(`*@|C8Jm z*HN-MG}&l6cS6ml_mQX+9&R0@=-fLh$)P!~z(wpIg}_0~>{;_e_&!+-heCP`yS4G&krUX9jhLwdXIE7kJP!4#$k#R0H<`}X%4%m54T4DQRe=B%5K9^gR4@(gGNi$ ztx8%79=F|+q19QwDSOiSCv8umucqgagf&zUK$qwz4lr;Jz80jKqz+XRkwWT564$6$ zof_GTo&Qnr1Q)qWo{$m?@s|HW_)ReR`&#KE%l>y@Kf#olNEhrUAO&V!jqsJvqTtM} zio$z57kt)5A^V`x7W1hW-clm?RR29u%*Zbz&hp0zMNPM~b6_fku7!g`nI#cT0~J5& zz6kt75jZd!1e+hR1$XQH<7$X@lpi#)3Bk0M*XJjDPE+zj?DpMhhW*;aQ7m$VPVU?i zd%kn!r>icae}}*U&Sel|m`(1yx~TUkgn2y>a$ z{nMf+$r|9j1^{W#7@Ej6%c$gDzLH_BxM%azlD32O@|P?Y&H_!Z+2i{a>tK&x)Iisd zn%n+q=Kece|4C{gm+ z>O^7iNJxAJpjN~R9$nz)a|@;mj|1?{uxd7`8NmXu>(}JDa1v25m5$35|wV0&Al16 z@;2GKW!=57zRDA=M`|~JOXGeIr9QpQ1pxS9Y`D`zUM$wnW0whfyRknQ{HffNf~z+e zm?_na%q3zegF|t$B3fFh$hhDDg0cuErje$A(~LBOre4)mK{>Y02`FzkIM3WJi$`>te>DcL?j6I z6OeC{QW!2%W?kc?8U@D~6XC&{0D?D>QcO{lT9>U4pJur`{ix_$V1IK5FW$;boxZCC z8)?C!|80jNoWHETtAn)i2v>g>@R!(n;&MAqzNJW4dd|M zo%yIz-d~iSxZc24Vr7LFn(yhqDS{oG`eax0AZN{mNnzyXFBe}VoFNb@TM7V|4I_(u zX|sy1G--Pg5-aWefab)VrD2@U=^3QT*bac4QJAu^DJC8){E;^fgsT_VmXzU!X^9VK45`9szpfmdHnJ@UJp3n`!Z@%k=yw8IF- zghEf|gIHR_P!GB4gRl2mqfe)*|JW}wtmhRuql-#q?*~&Dd+Eq33R~Z@H^LG*ASbj+ z2V(*N-|GQl3u+X4-ikYA^btoE-sdZ9IBL67To~wu%2>lUD8gM_?rH>Xo$ZuQ)}Si- zXjDUhJ}CNG@{l?{PFye^eL72?+9k%@kl>3Yljl+VEn~Y`P9P^h?p^QE9hSrHod_H% z*p5Zd_(|8kie_wMLgQRhxLgabtdJKp%W9<}rIBhB$q|waF@eUi{QU6|n@H=m5d>z{ zxt6znD*hi9ZIA&MMPGT{K&Gy&qZqVInnQ2@69T6bGNecm3}aF%(K5s=gZp@$jbYE1ND zGs416QlS4KU#pgunR2>F?}r|WRP)OZDbJ`Wd za>~N^5x!*|a$-4lLdZ?X!DlmD37{Og_QuGg<(G3E2WuUC&Q-jBG&eemuG5^A@E#Y7 z@V&4Q?lZ=RlyR}qX{FQ*0~ma&Vj*vr#Q2Ex##eH6h=LdxE|Isw*OPK2^INx_6Lb;z z?GWfR>I7HGoz^5dcH!jc^3na;`p5eRE$qaJWdg$3VHQoeexm*^2t~u?>?EdUnyVCY zMgf@J$Q1pL;k(I(tvQ!bo(dVw{%816=nxkIuFP+&Vph^z?PR!mSSsmrzIl(Grn?=nj)62OY2=KCiAL906IQxp6pDeHD^5rqh=*%}n~T&EigF2qNCJbb zGoLTSB}z+*HQ^CC035!RLWQ8*A`OC3N1%f}U&Ze6{-oVJN@a2Bq78~D;V`aPuqY*3 zxeb~mL(wwlij(0-m-x#M&6@_-l~57Ik**5;n8z3;q3z4)B#t#*s|ar|<1b8N4aj%s z^-@s?;WfhJfs}Ba3Tqb$8-}u{m~aH)>iKG49Zkwaqou|bG9>xt1`~^8Iv1ni;0WqH z%^p@}%)uQNiEu+ox?y2PW~PQsFMmnOg^^xd&V+%rNDPgP%sD)`?Yy{)*l&eEyI3Va zDk(Wau8R~+oXbak`Pw=4PHq}(OeenXbY#|R!2PYUMM8bJsSBg4I{&VU>mrK!92 zfG#_Xy3^m5ftE?waiN1vjbT>TvSZU|RLS2sHncQ*#pj&F{}&@2Rw5v=Dvc4ssbU0h z4hUO4Ja1)Pt;VXi@{Fu<-Ao#Jyq*}mlQ|;_ACd{vxKf|Ml`aUHs=<1U?`PDS-d4>vcgO39dN&em8>Y^2me zL`Layn8_m{Bn?d7B5GdSEKNT#PUQ zGO*DRE=Bo<9Ip}RY6pND9}oy&7wnS>$$ie%{pz&(1x=E0xBcxF)~M=;Xx(bmE`Le3 zLCW&%;R3$baSIbMTxi}6Q1r{l@Z6V6dRyxuB~s0ZDGPTjrMp^=xf1C=kaX@$JUxhy88hRYjX zjUmDk7J!BlqG4+C$gh*HdsNA{q}GY z0#ZV6p&CMw(4;p}2?PjLx^zMb9i)qu-iwqVUFjX9D*cda#hW$*9I?8%q=6^kZ+T9J>wvQug14Q-rXwc?c;C$->Qri9JR$4u|ymdJaw!bwRonlj-tX;!AOy(zZV zD#7spz){S_`(x-VaH|J!`Tpe^#c2Q`)z&bN|v2G#~5BPJoMI;6E1K?iNvJ$c`a zV$k02Hi2>xi=YTmbo%SD9wO~^G}P3r+sI|&9n#;&4)?lpviUs>5;mTQ6S}FUOF&_O ziar@MCm3+*3BvM#I~b%wkFMpfP{$vnry1+U@?532rH`aQpk7(ChEdY3!byO=>jowJ8R2uqdeU#B){|%f2r%dn)lX9eRBr*J)H}ou(OtFqT?`<3DHJwiV zGYD{KoPex=ViazRm5P>+w}XkW|NmxA=^OADGQU24J*j5y5N^kMgP0x`xx5q&>&RRV zQ6Lj8$?%e;)Pt}W!Vc&?upFv1basldoJK3uuLV4?(C(|0DB~32Uw!(dZeI4G6Q?ZH zLfJqJ)~y3{&kXatz-knt3$bFLrLhu?NY|~-R3ep8GRkLGWb4yg<6tw=@GuJ^HAHrF z^^5<0-638n0>JN~U%k-=IL$Ez$^7OC@;^Pn|Cji8-AeRQJ|;Yv7%^vF)-TvF&Vl6vHq zgZ{Pg56i$J`3crE6M$Inw{-4S@e2(I4HM4qtCDbk>eipq|t=SIP8@y%38r zP)Hr@%p&e27mj3u^M+^Uy+)!^cZ3IdJK4M8a9BWaYN%pPu6ymT$2xh9KXB&Qva|On ze?wVe9N$eD=UKee-oteR6|&6ni6gGp5SE>gDj(;Q?Hv?OYz#K)$jd~cyQw{?q^;Vc z-Y~QN^n`CQ%ESPEFN<;F@18(Hf&A_XZQQ*-`U$_pe=@XtWXuI0OPjqW-PSADr^tjF zqN8E8B0+=3;94ST)~DA;F~!xSZ@nN_=|z=Gx_N^;hjcuKOQ}QXuAcoP6MvQe6b!uk z^;ZagJgz!EU&2=o?cxZI;8&C@FOXjqc^wA!Rbb@{Cn~s=+Kp=^Vj~TXBd!eR(2$QH zvS}oa@kBsGp8qM}{!a(ldiIYs?$6;XKRv6rQ(@nc;E8M0%J-Zsprd71vWo`lh7S3w z&{hQ@vLcZpY8>=&p|G+z8hu1Zo^tv{!ZX?bEVuY+-h3L@r0toi9Kr5|`-DKlWimBN z#q+&h+2p7*-k}SoCiYy8DJ&zuK-H_{qb-9zM?)W;s$;KA|NGeCM?XP(oVXf5=tipW z!xN-cIOzZ+jlcTP?){h3FKW3B)KrOsI0p=FWDX#0;;s{L3QsCVmjssz6nV+0B*du_ zM)wL8a{p&@Q^|Bobn8h@_(^-()Qf?FYojVh{0CGCy& zBi_0Toa^-bv~<2Q*{O(5erPyf>T*BS2JpbwGx#b6xwZl#-13h{`K$b=Vc^$(!m;;B z%VYivImv^{H&CgU_^cA+sBOZH3hyy`ij1}6mP6<$p9CrqpY=cos)-ZJ6(IwMGKMnf-$w2ql(ln-J#!5ut>}}mvUO8>OXA5-bLZu_qw5%hT zSZ@qp48gV6=A?zh={`B6MqsV8drMJ-ZcyB>$qD?GikV6upPVooCmp5`B{uSOEQ81^ z1+EU(J7kI`VN{GFP$iHOa*ZCL6iOvjX*ZYRzK3-E0hyt`NyODRsPd3@T(`_@yFhpqaV?}im5?8>GF$K%HmcW zq%?Hy+4ivNa~?#P0vKOv5m?R~Cpg*Gp6P|4Cn&Cw4uOkkOfWD#|I>i}FAntACUk7s zq(faG{${c?93J1EN1VgSuqvI)7L=;334tp>thARpfyu-$;WaE`ol3D0oli*}SKCY> z6J8ukTquphRK+iOgan-ZCB}svoW8QHBa{9*yR;meS8Bd=;yq=XR3zBUY#0lJ9b&Dl z7CE{Ig0RTSWeOofdXZ2F57H~%DgenzMrRfUS74QIhwxn|7K^C*ee7`Ww|s)WNAGVr z#+%>A4w`KW|7wmA@1N4!mTjBQF1f;;)TA2Lr#39gc6^p{cje@w@rW`cr_zndXElwpqhX~@4I=G9%*QFx1BPokrVQwkf?%#H ziqbHbH^QyIjvMf^_2td<-E8#zMlXZo&7I^os=7Ex#bvFmbR!YeD%JhG8~t`(R2^zu z@Zhe|P--e>12`WEX@Y))4pNtd^=SC#^9~fEvC3Uwd63Q6MsGF_V1|v>F&+Z2L{~fU z%VdLic;bPBuK>MFF}7a4%Kr*qWB!FjrcLRe#7g1@A(iE}Bn-tYauMaa#n5`i8aM*k zJGjyRe%e5%a^FzlOgMjbyAn*}+CO9EUpeewyZ$Q~m`XMPAfdwm1W?0<^MQiYwSRf= zy@^i}lf@gdTRP(O44za$xk1*2xSp~nfn%B8!$L*8K@sG7S}Hst2<6OGU*YjEGMxJo z(2&71N0-loBU`!|USeQeIGNyN;L`$0i3iREc9iEb;JbT5+G*xrhnf_;X8q2?-b@D`Z#LZ=cNYKk z#2+y&s9{+hI+A4?bymN$e8Ne!ZrMXQ-<8`VmLO&$QCR-f z*7+1_VNlL~n0kPALQ@%2cmO;nm?Vg*gkY|1aNlk=s45@AvEx5jC9jLy9wd$VJ0U{< z2_oTt8N{!rH2em!??*oYf;64HdJP8YbiNt2y9!L#%u~^Fimg=?bJ!fxc^q2ocutqF zuEbZrv#BV?1obrU-b)=ft?GMWN|VMm24Q;Mpj%V)$^2r^!YaxOvAz$|0_*OWrICH@ zQ_~M85F0Lb2;_d%Y!Z?i&1$VxFInP=YZM-k@o{vO)HiUhcJw`8PDZVzy{Oxiu7@bm zy5APat`bICViG3hQCLsolUEs~5JW%*%G6bJda{D>H=l8uHmt$pzg3(*8h-w}puaCY ztj*txr!z$E;ZN#H#p|M;z=c-IsIltzqwwoAlyQyXSewA zIisEq_?AF*X$PVScyTMLKRInd(QsN1VO~^-aXo9;%;A3np%%YrcVmj2imN%rSsSNg z6Qep^I3=W;!oy@QR3TW{A64NiDAaWjXpQJ+CB3SrhLu2!&j@q&zH2k!*Y18RKAo#o z=QD=Zmbb#_MX73DWyPM~ZYDSBpSHx~lPmEjr+WNtc`d!RaJqGTs*gYZpg^Y}-+ZsP7WZGKcfW!HNdT5Li)`1RavDMd5%obJHCZc+8d0GMyo2(yFk%nz{Eeup zL$eG1qKk_UZJ2d>BuVM6>=fIJegJl?(_gwb9_=E9ZUY1tum*wk zq?mJKWLq)Bwx=&~w-TV%mYZud1RUKq5amfHJbe6A@lqWc;?S zD#+;i@J&T*%<1C+dO92u=0zrXO<&|8P15(aaO;%)UoRG$+m_J);%Nj`C=DsveULD6BW^_Fc zBi>4hlqbxAj8*UVZVbl;Ed_+4a>;{0OA*A`Xka6*HM{^@;&bt*C6qq%z#p4z969A; zFaPb-{HyeLFi?{jpTgBN16I&{oNY@kLE0$nO$!7s67NwG^NpRYn;A-vb0 zqImd8QbbdsA$b}$`D~Yy{!}|RBk<35tyyl_JuD@?_1X?&VQfXSH5k*U z%LZRB_&^~avG~M&^UNPa5By#9RU&T}Mp6(xO@t&dSr`l+2qRiYr&8^g*IzIA32XQw z-)q_XSp;duvU-PHdkeer+4AHeNbUftHosIF0QdHWMVL?t)y?8wNiQ5}fK=H_XNHE? z6E>O1teCu88|+ku71+@EwcgiEJ_`^-i_#_2{BDC82F;7nd*Jv)C=+B z=QW}NeFuwq7t`8sMLVhs&*uW=16YWI)Bzkp@8!7w>MurHAm+NT1D$xHVb4Hq0&|O( zM)eJc889WGCGMxa zgb8DopX~ykp>xw?NSdF%$SI*c<1!{0CY%#~yHb0oaOcgr?t`YeSmQBWT>M)aPXm%X zxU^HlxI3Vf59_^U`?`O_j z+3f_hgDi zY?kSJ-{O{`Qzpx&n|Yl?hA-qJT|gR3InEfSE3F;?%yV~-{8$)RT`kvX)ep{g1d)== z!Yq(qqMQzdPW$iQm+4)f+|uc?(Gqo&6me6tWnL&v$g-pVZ{PhVSF?Q6(J!5yK~P>$ zb5?vY?{aGPQqAq&G}x$BNS-T|8IX9&LqSa{!DjlPWM#Hy1d)!(Cd@~%L~onqGf!K_ ztZKbK>bSk%;Bq4_9!#`KCgAjrJfk{Y1G2W@A+^bW8u@VS z>dz1lZf=|VyQVqMMa_s>1z&2~DWr{B2{P$az}u%;tHx{l50^WKET3xeeLAtigFUl?bvti2LaY z-yBAq)0|!Ku}r&Og0A-nGcH$RH5*sz><X?eCnJIM5csCeF5?lt$iwyyj^Dm z_LYn{;tfaftUR6aOnDmHN(!8&&vDiFQ+hQIE}uaaUYmMSFnMLWf2Q@r)B3`9dkcG) zqi36TB7L%as@mrg6Lh4nC=p10h3oXuil@D7`h7;8qlO&CtqQ^#il8l}d94DL=IR%} z2mjaS{{{p5Nbkh_8p!}`re%35m|PB$>6aLz?Ky%n2x201rF`G+f&!+C57+6#C7Qpe zGdbQ4S0KMKDX8HIinz zq^X6)V@?+Oino!U-Tn5F3EsRIxjf?&c9gqLCS88%k-#~4|*kLdiQo$%#-AMok zw+uT{@otAK2R41XH89RfMGu&naTmF2Bh05gLnUN(-c#F|^7ndguY9lf!D+qWTM}mt z{7&oD`CjkCz9QMtJ6~Eqe`8in%AY`!i{DiKLvHZR#>t2|>jP{CCl~yuCmiu#*-mwu zr|L33_98cpJg9YRB&QN3ugSZ>TZSKX+eYHi&f?G2 zr-}VfSwGQzbN|_gO-Tkuhm1dn@K^C4ih(i0$t2&=Ibd;c@k%NH?46`tm1FrF=uXBj zuPByEort&sA=bL-(tRjepK*D}q!9s!d$)eX7gnNU5ThqxiCX`2t z#zh&4GT#AyrCJs6ify!2s=-+PLjnHxg0U@2*LrCiK`ck*crDwE!nZF~+Axdab37NC zj)JfNg;Sus>yyqNUPNF#=niE+JkB1e4(feccXTY5{MHStEOYF$cm3cT{@csvUyhC0 zPW;YLUwb^h`+Kclre$VDZ7x}Z38U2!C{Bd+hNcveFX6_p=sd_n#R>u!>;dxb39 zdl))inw3l~k~f6?+qU>cN-d(=)J5ToyPMe~#Y?spCU@>qa^Lx_KG(hLACmAVt_$Dr zw*Di4Wx>NQDc63lZ+Oh@)m9ePUPec|TYTSI)${jfpuXCVI;ZhpLku>Nd%;}?J@OPQ zMk}gg#2tK^=o{pj(mh`)Vu)jfQMcUzPJSTF1<#<5k)-W_`%dlUIo79Z6FXZ$;+4+Q@#~j|F{r+*MOQiHqTJ4@Q!`T)tJ$McNGRcV5HKKfr%|ezJhi4*LV7Bm4_HZ;>o> zD%vcmKkWW97powB=PIg%!3sw}I-ZFY?QVE53Y$Ke_ie295`gUpBMBLk;ChxfFBI9vqm|TEJl9 z&6flKBt}_`OU>)jo=cUI_b4+64sxQ8Kgt~?b0N?nj?!RSl52$W6Y&75y|~iOvBlwH zsDvUOBxfn+oO;jE<-b+&^;}Ka1?DNi)bNtb>W(;J9-RQ`AN>UKclM*MZWxM8L1yxb zL13B$x1MnYfL1ualwT?vfMQJ7-7R+@4vpw70>IoKjc!=o1MvWOh1~&Dv5+S>f#9H0 z^3Jwwm^V|B060}pSeqa~7sCsvLoV8d2uX&xGiO_dJ|XHR$UjGbB8)f-C?I^mvSA8b z%sAJ@3(GDzGh@0q$j;OE(ThMSL1Bd{Eu*L~qr&lM{8;=ncvtXG2#4c(r6C7&Ni}2Q zHpPeu5h*c!%D;j8tMqR$@T+=N*Z!001&@+zpKsqMumO(K2Ihh~DFbwaM#%RC19o`& z-m4MwB9Mm+pT*8ZuYPF^%D>BfV9 zHaS3AF!8c&E37tfed+5VpXP*$tw6Vov#hamo>Rvc3N5T^XQOI;8(}O#ZtfLqXh=W5 z)hn5~``BHp2&J>@fx0zuW#Ox}Hi|;mOyXL^2D;Lh%9ysv{H#8k2WFf3o0UZYEbeI_ z2R@w`mZq6xBx*KHM!h(+}Id5z{^h+E#D69_DBC^PS;P?1}l3(5Q6Ej2<)RP)+f=v@%rV-Z{K7KsE;9G+0 zV$C-imptbz{q&XFaTHFn(B3qr+q6vWXs+r+Spcirb+dS8l_Az!UzIicynsS_kNdih zz`%@kXVeAt57srsB{m;0t+8~CElwmZBDM#XPp4uI!rePgc1#F+4*Hvs4^;|bYhUqv zKRrQ5eqzK+9#R^?eB-SHaJC}vN`+l)t<>pthw`z8)zT7+&&+CUMvitGA)dl=V}z9@ zdeN5vz*1G3_LTb6c157c{;2Ie&O`# z%V#WKdL4`r^t@`1zgucxb_(BqSI<`pyu591NFp?d25~V{ds0$T&`j$P-bd(!!J!6I zp4ghfg{zVe6kcSdG9)tlmrWMN%DaR>2ou-JgCYr2iLPZv6IdeUEg=KAL3%_(3(aaL$;Zs`% zPO;+x(vTB3o(T^papnygpeyd6hVX4Qiq6_yE6cdT;XFJ@rb>Q!YD-T!TT+1tlrySJ zDaO-smsZG7W4f%FFVReL>4=M9k~G3nk+oRC%4};y zIc$t#w}|l5xpRErZpVUv2YoNeDe~jUxuA1hoPgGQtSf^fHm~khO3ykAph~l87$h~P zZRK^0%P#Q9qG55NU|wpe&{Wu>Eg!L~e z7F4@p7@a9)5<@X2p&ho0EnKZ3O*pS6AowxS<)H2y^_lEIF<8B_Ty;VHBt%IfgqdT$ zZt>ab>Y9A&ka!jC>;KyAchZ(@slc#=xNC9)8~mDx zh?Io7gTSXg4*K!Zk_D+xNX!EonfWdD_F=X+3wgekNKd;^7(A;+5(_|)J)@vbmX!5L&x;kgpjUF_I}u56%@a$p zvcE>-`7lLhHz9}29rs*NuBL5|fRGRzxD?nl*8{on(ESmiY`gLm64ti|lvef>ANR(Z zsrbuGWV5R+!>x({PnLQ~!D&Re?A_jAN&EhGU0!B>d)8`KY(rrV%eUvO{x{uAUUsV> zBFAt4kTM{kEB5;L*l9yw0(<8?uebz-3BO2|3E}8R&LU*p;bc|s1A*d2B^Xji(mozK zhh|zm?%-o> zrr;PrhqJK3yAoboTceQn^sMR7cZ~5^`F{D9MNF&ZyD3zgnO6kh5n;AKU1vWxAqyR; zjhz0oK7pmw{R?Oh9=}<5L=_oM*7Nq5)^_c0Ok=%UEVZ^(P58ZMrz7_@VunnAM4$LC zq7Mi>jb8u%HF|mpt4lZT`CCD&t#*b*;tsxJ7LWE&rZ3RN|{c; z)u2%Z6KiY~sU$C5w_p8E;sBA&=q?*7ZN)YU-YTTM+4oWDLgfP9u*mZ0d11k>#fD2M z?$Km{V3Ic#l3ozh_;a2m@&$(}XOlda#+aiDXMNWfYk4{qcCIzMbxsoHLk;CAb#c4? zhcT=o7z`J28ff)CL9Fi5B!y7$Nwh0S_Z=-O1Nk!*wczgD>1L{YB9Q6$jJ5LD0h4hy zEt=#yd0So*XXHW2mwVgqD`NV1f#Cjprcnvm$aH}oV!#R;*4odrgM-)+odyG92sput zz+3?PJ1~GUB#WolJ)q4i0E{!{+$9i$-xx!6&Vw5!ZEY23l?hkGwdli)^t&)gO2^6H z^*O4ryHg?=oo73aK0;LRn2?mv%&A}gO}YQOE93KyY;*WssI+x!E1FuAus=EYUuvh3 zd?r?@Lh+wz2mkl9>x-+YmXooH4^G$RK?95cy=_#j4gqJL0s#a|=TvK?6@F;Pb@Ply z3?WU*~)m{=Z-aB*9YvLP0t+D({0y`3e#;eI4onS3lXBow!|dgFRH zIR+HCHgj%ShYXSBSVO4N)*)#CBPt)_E}KiP*S24z<5<`0Oo?!`e)c{!d{?(WD{(Jh zzrrO#+!*N|Qr%eEpWjwCem)Kq81Y0M=#|&6q8Y?#MB~7M0=*#MY42yf8rlhsaSV=8 zp;U>{Ag-=`YNO$*=U4%!>zoxUhTiY=<`wn$YJSn=)9G&!-o&wmD{a)U(3?6nO(tYp z-worT9GNEY<>Pf?-`=;+_Z)gn)lqzawkBbBs+z2C_k`aql>@Zpn!(@HIIvwn$%KdMm3FR88Fh|6gQxuj@V48n!*Mlj!O!hti3&ijo9QxGM?NX3fOd8_wf+$r zM#>L)Ydq6CPB>+jTka8JVD7sV9D)WOs|#g?j0^+mVf1BeTS6F$vK>Q_aOHYO^0(D? zWYUA9bNd-^^S<9rpSa9MVRu8XTdn|3NO}z`K2U)=Rs+-uN}O z7r@8Tx;jQyq6~e_CtBFJ+b%S_hv-=J^ET))z$S|L{5#2br!jQX2uYoG;GyhbV6Gl+ zi2Qj)-y~hx%y0Uiwn9AKK-1tTS*?G%Kz5dHr!I3`|LkuR>~eC)4mC_8Rf2?YG~wMs zlF-T~j5f2YG1rY#; z_&4WYn^IoC?A@gRUx?!2h!)gIi!x2%?7*p4?L!BjC5&&t{75skml^q!Y^jc1xX_9CTdN=+#SCTRK1Z zCK4fFy9n%87ln&)^_KPoPeX!G9}ZlD%w^F3G?)a{n^LijbPPGMLI0 z5+ZDM!ro-!NK&E89y)_(gz@=rQ8u(N=vCBh7v}3qPuNn3abYERW_o{K zi~Qy=;cT4b@}m66)mhYatRzpp5?fItD7NV{SpPUCoZrp$aGX@mD!s8+!C@qGag92M zwEKN=cCY?(7~|P*r2Pz}uNw@!^B%sMe4?$Ap}XO)p+HF$Lol?i8)kX-xxGY?%jXXd z5?GV5-}D0_4xsU+(*hkRt>mcX+czgKhx+Mta?zJOnd5`IxoHp~#IM^#`JOyCg&)<( zea!yBa1(p5u8$xWV|HJjEo5_BL{wEp=f^jHt^b=D_}uH+u)g5RmDkNwmKnkm^JSPu zhncF}Ejw)p zy<&Ni;*>FN`pNfoS#I5AKAV`Y#*jmH{R8R1RQtaVctgy6sq1s2UF-l!dRBUHn)Yq0 zd+tVb^X&m#yl8PFelTOg+a@(yM&;O({<@@F6>{_taccP8yo0EYjw;8LBwf*UhFzXV zA0?O0;g9k|<~v9+_b2m!Yilb8A|HvIc#!X?RT|-FD7CSpYGB$O&C_e|!T!I6Yo6uSmSAWLW=NXMWG||P_SzbNuBM|)-%E{K2;&z2&b^+o-b&)q@OiH6v_@^g) zJ@o_`XP3e6{RBbR@u57;`hI|@wCH9-qx>0nqHVWp2RTtF2&7nnRNg~l&G+JFaX(9w zEUaBoJ|mA;li2pZ%rcCgWk(s+Mp{`lsv z_5TV3ZvpeJLnn1ebYNgIF%nIINUeO+A_29zu7ZN19caC=BsmmkYdX29@T2Bz4E(tJ zhnm(-l;X+q*0;e@q&*FzYw(kqr%|L{HtHcSid(Z^J-MaC5xhki)X1dp{u0P;y*H{#6)i~=lm)7b(lpqiMuLQjtpOvt1Qb&Rgpx0)&w+^ODW#*FwVm8)$ zM=2t$+eBI+VV5{Ty#W}RMh%fC916rS6kvTNV2vVK$}lY#tB6q(#0}69(Z&X94F`JA z@SM#be0IB+DxLvZLMLYjt0Awxu&z=!usWp&bmCqwesB|4vqWyX^#j6j{fndd7UvDv z;A7Vp_4C}Lvrd}gniKMycWP*BF5ssF5LBR2(5P8!P!fR>T3&#Sb(R@8CSb%P4UF&U z#28aS&PXA`q`cG~hh-^u;mFJgs+u$&MMr3R&)C0K|GJuq-8CZ5aeyu&;6Y)EIEaj1f!6e^7W%L59*hBeA#KoKWyVozH<|s3kPj?fjWMenBTyW`P?Y z2)fVPt6CM-&S)TsW_@p`b6gf&8vMrQTYon(EbUG6$m^5D#4aAzwC4grULEfzFAm?W z#dr9Ae8Fjw{QLt0)46)ug|~J)kMZo+F5DVEIXlv9Na~v{2`CtS`+ndP{?qx1Q~!AO zX5r-eMJt<6xS=y{rv7=4Rz8%yda=H6%E9HYA4+HcM#ev}@()lrdQnj;NS7pdjyAF< zhe`tq0r(OdgyoKDPsk6kf_LW>yHjjd4@28J!xQO0yPLpMWghvLH8NXr)f5J?zML@* zTYh&_v}QU#A-CrtOwRhy`#!Vt#gI-a*A)A{T-pz>Sx4HgI$z!7b$oE^>G9qsLO|E5 zFXKb+Il0Shim%>mU;ZX_?V_hdi7B4LD)E-i#glcn0sr^wA0I#6Tl)639#iB*fFY@% z*kgU}kM}&5w8VdXdk6o;3te9fU2#b>MW3UyWF*0k`26_puuo3h1f)J=wZV3O5d zqa5?~XE%sBe!y$^0q@oic(Q*dyoUc*cn@T}Qcv)o)YT!w$Bizc-)38Ad^556Q3c0Z z$!e3_4Y!7_H~#{yf7U1&Ra9o)ZAu-hX5ysqqFi*W=g}hetbnNid>ahluX-uNtOP5DBL*Dv;7Kj?R7`V3|1A{|5;ec!+vt6$I z+*%V|B?8Zv2G>Xl>&;>`57_JQpS~ET3&1troHSq1;(ecU{r$ox%gA=W-UlSMY@o5p z;gW|(E>ZX67rA4*F=k6^WZ|si#K_2x;t+~7%_NSnElEipO=WcUrQWKb6);jHnK~Xj z&J~#`P%E=)D3=7*4`oJ)mky|#o1H=y2sj25x>jz|g54UE5087_(e ztU3f4)aW-_M6v4=69uH!M&6%hmZ##8-VBWhV0K?*cCInf9TNZ;M~`jNITBBAKe_MJ z3qp}y99|PMm45=>go{? z;JcbE$6HT7s_Yn*#lGS*2`i}?c2Z^_%?)St8@(z=d_ST9_bQszW8{lxq0IH&j}4-G zGcN>sZFHsDO%gPwhu^(^{{}C*_woFC^VgoQU-zyrjAXptn*KU#PbpvfXn#`K^y0ml zdDGdg3iy8%6Y+lyrkGPq7CkHt-!WCVeaDm-&LI6AQ%pobvYhEDrjvp}&%KxHhN5q) zUd+aK=kJBo!_z9VmReRuUWo3USdQ%N9i&|Uy5RrisXyyuyZV`lfg30HE?4cCq%cp& zeZBc}j#lzU`$^~2B)3*g=2$OU*A$skPuOy;`FfgTY|(6pNyJv?XHKiJQmZn2p)n(1 zVkBU+N+ckU3GL!84~jRq{ghwr1_%wb-J}abLiA%u(?(<>gzay99voI|L(PnQc|A{O zlu+~f^4Axukt=#$!Yt#ZJUj@I70x>OEP zn`O!*)HGv^&-}ej@X!DM-KwH9<66!<6vVmwwCSXcX!0!=yeuVfVEaE zzsB91VsVuB9a_y~^Qp30Uo2KPewn8WK!AmJ?GI{XM#ojRN1{iI-NHOLUZJ|4W(w0; zy*r&v(5p;;N{ngp5l^&TNLnPuD~i*$MCp3-ezKC9o&;B|uK3b2T%QZ~=##TlY1!nn zq}OG#CD4s5C7u#Hd&8)qE0O@A?wG_`Zgxn3A+f$7SXrnTRt>o!jGL&VS8*(W1skjA zxi{r2E_PO+mO*aniBn679D0Yhj=J|ZLI`NQ9ZhTw$dS36c^hd0rEe?DGiv$yaN*RF zyZ|Ny!}&sM+f_54I65`uP(^RCNQz}1!PTXJJjxLL+PuiA(kOd--KXh-=`?oSfy2D9 zi3RkvuaDGfaE0?+tdp_Qei4a;SnfxMa}`@PxTpiZ{G{wqL{t_nZNDB@qLW4w#$4oQ zKEYjWV%smtrF571&NUiW+|onMigog)*4j;pr+tsz6R|Z2$#Jz9u>tXBq`Vh*wAcuh zK6I$ps9w@S2g-RlM%g~TL@FcFBisa$;;Mli0Jw3g4)`Cn2ocdQbsr1mMBMhU(R&;x z*Iqx6th`AtOr=k{2t;t9)Vl3T=t5g%qX{Yv%2=@Z^Qo}2>x}orH6X8 z>p|CeW2hf?bBgs+Xs$1tSxrY_U+OV=wz5QwdoG+jQV$IE^LVa~6QPU~aPocMlWN%L zSv(If1d#@s0T5gfkw$}4@YW}1bTD_g&?)32f~RUrbb*aU7?!#n9BLxo-Iy%k|D)Ph z7Rp|j`hQpZ{;gqM`Wk#({ne#LtMVc7+f|{nv%NvdL{03L-(?Zj6mDx{O9VF1D zBC;`!k1e;Djh_UVe7-FN15gLO4*WuQ?u@a!Zz711rR;3fN}D5hcJ(`fWe~>JP?d{0 zkaJ6Q+Nu9g<7s4d`}_Ux$&jXbU;L*-e6#5bT|OtD3c~y-fnI$l=0!j=i{V!r?`&oL zcHNviOdvEsBl>A8Olwk{RVV=GNd|nb=5!nw#AC-5S?*m*R@rZ^0s*kfI6vH{`CJkf z0)3T{84h9h2pf?*8|{5~&4wwt6~NWLWF{<6wn(mhu}3%pazk2NE$H#t)tp9{iCRHI zFiteTOfC*Gb|+u2Y}(Egnrq%{az;>9hE)J$%XA=cn_G_?o1ZBGU-RO~+In z&ZFua%p}V*bAEclm(v`hU$jft5VPwwYS+Zj)B6*aDr(Hcog|)0G`Ir_s>|+Fsp05$ zz5v~3M9`>j;*%JFwPQC3)US@RBq9g3u5GF{s2MNe;M>n$7!>MCI5?-{ccT2LB>UKJ zI$Eb!<-Rd)cfCfLyk=eH&Bba562I5bexR5zKO&Yx(S4sy)MVDdlJ;;-eulYu7y z-I=LpGlXiSzPAG&yFl~dcbT1p0XpIVo_k1u>AjWgQz?56yT|c$Yf^+Evg1Js2 z?)g{v12B1w%7ZiwJwrOPZE4Mlr4LWb4Jkr`V>*b;fbn94@Enayq-darniL=WW_mPH zH&+nX*!ZUJIuZU^!6RR6#prd-;-ApG4@8p`g7-A(k~EW4P_Ld@C#3Vl{wH7~xaVDN z-N}af@vv(e5Gg5gatZSyg>cLh7U%&$+x;g^JXz*71V_-CLJjq&0Eg&y*!qlJ0et zcjouycuY;r@0}!FUHB2>Nj(Bgm+U%OP`R-sKP9UYkM0{xz$LzIxcF=oB1cQfQyL6g zN=Ss#zq0~RqgT41rEPqkpDyWL(Uw=vd{f9zz;&DGkUQFz*jDA?x8{q2!a11N4BH$x zxO9_iFq{w7vobz1N1{6SZ{d2arAZtigHPS^ysX;qsHm@n^?va9T<=Ab#1q_e_3HKK zMIsXx zHDupCfvq7PP*HQCrHWKeY1F_I(03OJ?!14F_<~U zvwA!>> zC2r3JbdTDb-Yh`WG9D?y9obGXEdl~4lHurR7>VL58Hi8sV0#zUr>ijIy6-|0MmCwY;wzt6xfwA}A~movoGEQ+){qZV)j#F8R2_`q)8lCx&OF)R zKN>$e`vc)gfl1|LNe=RiLa+I#vEQqQKX(5&t&aneB@%WI0<3ZfODE#P0!oJ-e;}f)$&HYwd7Q0ASa`?Aq;4GM>tcAD{RJpR&WWBZ!XUH!o}lTdkAiM)f~?0 zr>h2h_mo500zvY|j$T@$KrM#ZqR%rlJ#yvjI=;yNCjir%H5rO;i`Wx`!z=EkDXh8ptO_Cyt2gna>Lm)&sNa{>2j!Cq2nFw0Fkq?82UZ>0+j6W0Fjb5efM$9c zT-kGc2v0AVtSRbjqJq8iWsLg#fSe3Vd!jaF=n^Se7so|0(kE$Z$x!Pfk)H*QI%eG%Mq9SHZ~QBHe@fE{me0rq9(SDZtgsCNWbGuX`XICd9{3-zxE2p z)Sj)oQrWdZI8Ufvr@kx zNhO^jOsYHbmZ9H1d5Ge@Q=ZSgL0_<)4S(}R>Bsh$1 zbJgmyaE#69DXkQ-S7vopUdBC;#hQ2}R7J=zT47qQ` zW~Nh0_hXG^fw9+$iDYjyK84LRUggv6%Nrt7WLZJAl*!#BYUk)!z~cvmG6Lj56f}Bq z5?rqEw1TT7;$;2a>qd2VKICI0jgFk)4j5RK4(SRjE9mqUhN^uxfZ?GmX<`b&mhBjl zHxwyAy#i~WXR)Coz=&Yp%=AU3pcTa=GGYVo15?eR9oIsWD8Z8Ae%L5&1JomJ;P`x0 zv#_Cu(S(-;l{4Beogbt(@lJGJR2|crIFzUmP6yOv!L{@kiX&a-^wzvQBW+)$pS6Ij znNOZ5Z@mFuD(~Y|2|7c~XWbWYBIE@OB*W^5rz?0}-2_ncUL2t1zl|eH@BW;KJB`i#0uFSc5C#Lt`VV#!Zv5 zg2=OS%PXO&v5m4!6h*xh*r}FUgSi}?*@}_>?C0pAGB*x=nyb#2RhONhT@qe!s?=9H z`JbLZqARQ5@(jm_D_mrWbpI6 z&GxlM7vh+U9Dn;m=;(r)wrs z)!nTm{TbIyF(sgbLg5I8n6BIyY~VhWi8)V++f$s)nw^Yj#AK^Wj})xHws^y}m9X>* zgUSm>XBnNV+~<+%S<1XOZcmQgviFzZOHWZNDXqg9DPrgs9fa=;8F#E1qd)YA@vJZ- z0)s+r1&OJMIi#cEG9BJ5#G;F57SjPPm|zS9I82>rhaqt5xyG;HV)JFiq%EU^f{DRe8+P1aAz>-#T^O01~trZ zU4o{w7th~N<^O`J=qD=De;?IE&VL*g`d^|#{&Q3r8tFo@Ijvgh3A%HNyc)!4CSpOf zS?@U0vR@`+`v_4jB>N3>eq?pxn4a(Hogt@FGuDc>SZ=9m-QX9Q%C-363FLQ9#}39B zF6}XMuFhhvFRC*%PoH;a2Aq1r>GKZpfPzvfi5gNAx4*DLU%pjQsudG`s&ec5{_>nY zyVU_gWvU?P2jeCeb467U(@G_x_vkc+Y%VxOAiV&{4HQQ9kU$Q|*lN8G}~!ju1xz4ri$a@*2| zyP-jH&PhU(QlVa?UwtP(&o>+@vN-j*@c{keo9}5>P;*5mZFzuRX^z=g$An z)b~x*+(A( z{F)s#$yzMD7ok*YY=klcIHS*Ah+`+}+7iJfI1G3o;Upu7sRgSeI=JxbX_?xBG~1}P zfs85dHXh+PAZyI1Q)d09+iBxs6uCw%4y6iQoUj5V zI3OpuF!XKT3_$4vO*@nJkNZqz~8a_q+mVh2kC0_?$E&R9e^ZzMF@ZMN_? zAvZ?y5lmP_vU1FdpY$@*a{=6UnfXP$_+ooVzkSx<6b@v0k+o~3<7tm5;IVW|Hfd6} z5H`MjKIV+v`^e``kj68)pyupzpLO!in4DKk^AZr)#}#E`;1fCnECJ42@b%$5#F!KU zra(A7KQTmOfaR6NIN^h1(mI?_NMX#7VQQIyqP!52V>Cqg9@t7$@u4_u7!9HR`B=*gg*F2s}~#{YOtLs;)@@t_Mzu9;IaQ9%eE#MLzCFu=*kfu|}#jf?&#y}#PuMFOLMNA@=Bj##j4&W<}Q zVcgm`&MjFCqz6A5zZGUi(3WtY@oHEb$JnPsA7s{AEs^a&vg2cExbxg(mJSDjz*hN^sbMgdp#KLjPI= za~;lk3FQ_RUeeXM#rfozrq!n*=>tWurdcWKYD_5w*1VpcCVAN|<)=OjyHT3@ zs!eyM8;?d-^$C7)@zw$0sn`zpz109w5H?w%cJ7gA{AFoHtDBGjZ55kw+pQOP)?{yj ziIjf$SY{p3k}|Km>Mhmwx}w(>KU%^PoJA-0({s@9TKg)MFUOeA8UvP(I=+S| z;NT|p`}hQ00m!2>!%J`4p3IU^k4LC`SImpN%P3lHA8fa)NO0SDkIfwqPXtI&f1Hc7 zqY!3gX``!YGOt}XN9U;*`wiCa+GG$q$jnHnM*ty?nW6q=6Mi`8T>gx0R-=20 zj%`LLp?!>2{EbkwkMWsOt1>CMU4(Pc+8kndVKnqq(We+-1&LB3)D(%}jVLh5R4uZ2NjsJsB1$73A$sg-QH6rI*{ zthfj(H!V}qfr2bt2Qy{aCZ?A5AEI&7tpy3bbU8sr4pil)P#VPUZtrg{k*jwtMxAPv zAT3i4yGJ|%CHoG!|H&ZutNXuG0%w+_;tqOkS2eVJt}@YXi}#=qY&IMpjU{dN`pgR@ zTWzBD&HfM`Yw##IvnX85jERanQH+OnHRiF31Azm0wEM;LmdtOXWW?9LrzxMoNCEY7 zF->^;88p-enUj{O207r67p6{07DzJMctXYcxoDBJwpiP}s(F@Qy)#)Fj(`OP)m)+( zeb3b9C(P)?T~&EnRFzRGJtzBewmsm#MD^N3etqh}B~(b3&L#$nEGV{+z!$JHq{;v4 zDaI790!JPg8Uih-#@AYf`NY#rt;vVNOcGW`q!&w649jeayR*X>-r+@@zLzQ)@2IYd zIcIpeQzV$vR21_XkYF2}NLjy2P;kJi7*^C|1xYAxdX#f*S9(|TZ2sPFD6cx(9yH<~ zur;O#86}MQanVz%QCUl}xbAmdmCzIrmJHn>`Y$75luLYoCI97X?!2wZ(#HLY{SmzA z=Wf%n93?=y2_OR(%P6hftYXX!CA+~w`ule05Pmxs0qNgX+A&-Q9MJ~W~8C$zL75nsNZUcVs77cK#X zLG=~{gjBJj!7?T-JQZN_J-Yb5uy@VauPK4w*xQQ;8lA0!!>L3C*Yby+D2F%Tl*tZk zKYH>xp6tuRpx#eR+lM$cGknGSIJOG|$94doc-%1PwUd^uA>^#}0FBbH?Ki03-A=N5 zHpQGep(5OP2pfWzCDZ#gzdiZu;~y=7&tzt=u6kd}r4H)^Cp+S;*$#6DH-MtzGD>wp zp^u9-ktBi31sn1OcR_6wav5qa9wec|5f_Ii`nwKrl2{vpJ2%R&Jwwg5?rvQWd-#Ow zz0J`4Ok^s0(-?wYMyk@?`>d79t%`hP?1z5qYjXdM-T7%#r*Dnw8PiG3P($wG5?D*H zB%34XAIh8=XuQ{TEK7mZ|7h7CA|KB;T*s@G77zZ?YA&%NUC|!pwHHT0aQjwlJ%!Z9 zTRaSACi7?hT=BEvqTo#*vhl_lV%7b^r?;{h?9Vg!>0uOCU>|MnI|W6I_+eQNsjKkx z#QXoo=d0@`O!HJ*Z=xsx$|i?JFIp0e<(~1r2B2kWJ`{zGg$HS&>#kAJf~2mk`fQmT z6}@Jh$l%j}oW0}eQ+?~5%Y_r{|D<8JNJO4wHr3~VJ>52+DQimM&I3`&^<{%*SFrve zTTvG59E;?@gkeH4f86Am1@-B_{d`xza?Sdj>y4Vj#)LT@(SKVfEc~P+l58RlBH5<(6(5IS*>uKnItC==6=xyl^>;A`{GrgcG4JB$`FnzS8 z;$Rslkc;_R`-($PsWGtXD}T!8VufGdZG_bWXOE^Y)Lp-9@lHz zgO2fL3~3st0<%9N;**!{fCwe-_>tnbA{AUs@Zl|KJhJlTl_>k1UQVXPrC7;b22$u<39(4W^EPYM*T z+j!TlYt+NzAu4uSuaQA*z4g4EMzZbNmD(-|bqGOeYrRL+6)A=EJv&&~1@2S)%G*rP zs=DGVHQ+W^nSE+6>H0E8NVn!Ke-mLDPfPb6df%a>R*KD$d6tzhAzhl85&m6<{zMVO zwuVjCdpZphq76Dz!A$goQv2Y6j|+Z`ma9G(7siwX64H_d77B}=z_)kh)GFAnt1N6@ zj4)8#bU>;TOBQ^%)xe!7CwM|I$T(7S?PusE$%S#Ru~gG=yzg|qxHtoT$bF<=Lm;09 z-0{ndiFYvqrH|WRyt0q-^kR}Ujq~5=q0dFy5`!h=l-y1C{WpdaUWS=-3WQE;r?g}6 zbkcX79SOI=9q{7+U}IuecUgLA38Cl!VDfi;L?V z1p5jed~k0d!Odt+0L~a`5cI2(&v6k+4KbU}a;4UWeP+!Q+Tt1|*anH(z`lf!E;I;+ zrC^B{Bz><8NyTUI&DMfTr*R`<&5T2+!GTPI`{`SMccRz3G9F!2pF18&NI}M#pl+eDuev5bcO=j^ zU_Vzk#mZjzLoKg=s)d<9fL0v|B~bnnKEbyz@s_peQe~b@+e=(KL5za(++(3AZ6xYN z2B4@+Pll|jX0mT2J{;)Kzgj$gX-;%WYY?hjzbJ%_O%E- zQ+PTtYrh@WyI0qHAG6k$8ft%xv4}${K-BKar_C-u zh3mwm$w>IZVkV=B#n-ViG{gQ^Kxer=rUa-b3d^pIXm3d5H`$VTE0eG)?&_`x$J=`+%@1EVqD+a zcrJ3ws8wt$3tXS(>q)J(e6UjLT6@fi=j=d+wV`a^jXk)_@Z;xfJ-gxQG&OmYZh*??&*Nu0qk2=VluPb z?(SbFcUQv22+5i2>SoM)#}`%T2BhJSNg0hC{k?AMZkPAQcYP(x*L&H+6A(&e2nv?< zX}u-TF&!ipzD$g@sXIc~P%YSqOu>FYFYYzbdHo<@0?+M%f!90nrqZVP&Z{r7^Vak1 zOHYg)M9`Zm>#pYi^x67P1@Mkc2LaY;g;6Z^_-bKk1IUMYGiZZJs4;7V0C;?C0Aj$} zDWC#ZiB5@qgk1AAv-CB~M-@Svt`p_*Y%KoM>xfP52ij4^auTx{4 zvsTYcqvxY^s*e;q>n2>Wb-PgCgXH_75sg)YU%zaKVoZ>wNn()U2}9-z>lJ(HFnJ<{ zN}htS%5xpURlH?mFpP2LA5f6wyG3H*#$<$7*p(W(K={PZl2CM86G~wb81}A~=$L_* zlVzMK1*-96{q<^vQ!Fp?Iaobug))*FHNr}=f?fJOhauwiB8r&7Oy4LDZlpO7tkOYC zPGVA08a%RDhbPbCO6r>{^eRe@)W89b;2h~n>BVM!K`By3_Bl10IRI{|qGq7pB`ToJ zz3YMVCco%GSyt6OD!Y1C@UyCh+gELbfX2ZqB0zX(JUZ*S3#s66@OWXoBWFL*@hu$- zS?(;WY{m=Gyde;0PGN|=m2DvpZKa+u0X|_58)~@i)11YQY}UGg?H1~b2zSh`134S0 z-i6%38|qOW6P>H9YFm5~&;0Hu54m^?R|~u78-Uv%SZ0a2W@#HmQ(&v)Y;0CLqDl!_ zJWBHhMmoGYTE5b1-(einRq8GLloQj6_h3HS%A&FuHgn|YT}ZvsnjkHr(pybMWm--W z52Ra5VwY{Ke!V+%+Ala~g}GIoWV?DpTo((AHGk$*DMI@gCtF${l9;A6*UYPg)>cSz zSOGp~u!o-%v_F{y8DM2 zd~G@ZSe(k|K`2xXZNAtY8*>>SK^UC|dBXyTVLH1U!6=_Xym6QL2ZjcAA8ss*q^7X8 zc&GBSgxlnx(SG3gh-pUBCBN%MtdCwuqYXno50mPYnjY$^_tGr3+AI{h2`#eAcI2m+ z6|(-P&c}bPAKwB|+qm-jAPTChtRPYdoN0sTW$Wz9N??NxZgd}s0ulm>Gj##?^&Vme z_mm0=i4v_HN>4s`AL#H|+0|dFcR+?;4Qro^wd?}zC~(PoqqUmy_~UF3*ilw}M3n^k zr`}m;Km~-s+$M{-iljmPZ_H zS$!xYP^^|e9Lf_0y_YkSuUE#Z{ZWo#@P&OQT7xC#G?oP5u<#;jGFf6aOWC5K&s2gn zcsj#YAtW%R0$BK9tnfItgi{-I<4p~tB0}M%C4qL!*4H}JSqj*6TowHl+PpQ%J;yGu zmn{$(dE8l*hJ})wu=}HbcaT`@s&-t27%Kc2svKa=3=N?!UE>lr&*j7-7|RJHl6wuc z;ETFOfMeCQ?9ndUEGLyw)ALH0U}r}2Dku>t^6H&=l{g|Jd4Svk^MFYLDFb-24TnJC8>K_hkQ;EyG!x*30<$3s_<-+#1ZPc_snv;6Dmj#FvyDzS4oW= zY0wh49F|fnlIy3j!UzX4yQv&ro*W)k3I(A>%gmmdyN|x2dY^XkElSLJnce*PzrWf) zRstVG@mr0VT4Atonny3FYHVoeLh6M>4(4{?H{?yJkWq}U7gAgitTdxd9-4Ae^H^%2 zPem(UUoCTzY^g(}w)|=|?#Q93itlV=|;~Jz!onHox;EW|nRicTmA6iczi(Ap`GffY{G5`CR595j$^5?(AA|ogh zK9v>WhP10rCbMaUW?OvFPy{Aq(zGNrscC*>%}+yzT{IaKm~gBQlsM>~e80w#ljke? z_Qvrb7F|0Da3qClmDnKa$##!7hL&{K)0<3L^ z`7vDCDcr+#WzRMihWTk|>bziMr|O#N z+O+cVo%CR^oJ^GD6{EB#|1^T1jFcfwYFjw`&ic#Gh??_x(x&i0_wmJkemRX(3|V~q4%OcIyhmnZ$O)DAs#{_@JKHbKrcnY&t5_{tS4&iLW8G1 zQbifk8RsB&kF$GPHrio_zoZFn2NM{_<3TFg6s`Dw4S1%WU@`(6W*B3j%#Lk}xv-8H z6}%BD^yPcdAJo1F9641Vv{bXL=tCOpt+4*+|EFB9`(W7<;>*EYv!NvAB+2mvmJ!1f zTsKTW!4Mc_#D)|dul%%WS^)oCW1lkSJwm|

Tl* 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≫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 literal 0 HcmV?d00001 diff --git a/lib/views/CallView.js b/lib/views/CallView.js index fb556b0..ca0fc37 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -1,7 +1,6 @@ import BaseElement from "../components/BaseElement"; import { createAudio, createDiv, createImg, createLabel, createVideo } from "../utils/domUtil"; import { getCallOption } from "../utils/util"; -import { hasClassName } from "../utils/domUtil"; import CallButtons from "./CallButtons"; import { classes } from "../css/styles.js"; import PeriodicJob from "../modules/periodicJob"; diff --git a/lib/views/LoginView.js b/lib/views/LoginView.js index 32baeeb..24397f4 100644 --- a/lib/views/LoginView.js +++ b/lib/views/LoginView.js @@ -1,9 +1,13 @@ -import SendBirdCall from "sendbird-calls"; +import SendBirdCall, { SoundType } from "sendbird-calls"; import BaseElement from "../components/BaseElement"; import { createButton, createDiv, createInput, createLabel } from "../utils/domUtil"; import { classes } from "../css/styles.js"; import pack from "../../package.json"; +import DialingSound from "../assets/Dialing.mp3"; +import RingingSound from "../assets/Ringing.mp3"; +import ReconnectingSound from '../assets/Reconnecting.mp3'; +import ReconnectedSound from '../assets/Reconnected.mp3'; export default class LoginView extends BaseElement { constructor({ args }) { @@ -57,6 +61,11 @@ export default class LoginView extends BaseElement { const accessToken = inputAccessToken.value; if (appId) this.setAppId(appId); this.setCredentials(userId, accessToken); + + SendBirdCall.addDirectCallSound(SoundType.DIALING, DialingSound) + SendBirdCall.addDirectCallSound(SoundType.RINGING, RingingSound) + SendBirdCall.addDirectCallSound(SoundType.RECONNECTING, ReconnectingSound) + SendBirdCall.addDirectCallSound(SoundType.RECONNECTED, ReconnectedSound) }; if (!this.args.appId) { diff --git a/package-lock.json b/package-lock.json index 5bdfae6..b7520de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "calls-quickstart", - "version": "1.2.0", + "version": "1.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -6121,9 +6121,9 @@ } }, "sendbird-calls": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/sendbird-calls/-/sendbird-calls-1.2.5.tgz", - "integrity": "sha512-HsPo6lpHi7wjhMNF9U7Gf6CH5vUWvLJ4qBFwEWOHx9203xkXf8JqsxXUo0je6nKtviWNAmDwP0BUABzy3rcV8g==" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sendbird-calls/-/sendbird-calls-1.3.0.tgz", + "integrity": "sha512-gnhiDVf2ne/xRFXlhJEtpaEvT/72ZVqPT3DuIEraVIDPp9bi+39xoT0BeKSxO7vcQJXheWuramseZwes1Vz4JQ==" }, "serialize-javascript": { "version": "2.1.2", diff --git a/package.json b/package.json index 36f6027..f2fbb99 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "express": "^4.17.1", "jss": "^10.0.3", "jss-preset-default": "^10.0.3", - "sendbird-calls": "^1.2.5", + "sendbird-calls": "^1.3.0", "uuid": "^3.3.3" } } diff --git a/webpack.config.js b/webpack.config.js index cfaf872..1eab715 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -56,7 +56,7 @@ module.exports = env => ({ ] }, { - test: /\.(png|jpe?g|gif|svg)$/i, + test: /\.(png|jpe?g|gif|svg|mp3)$/i, use: [ { loader: 'file-loader', From aed8771dbcb99f4a6dd71f9802a64c056b1f85e4 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Thu, 24 Sep 2020 19:09:03 +0900 Subject: [PATCH 62/64] Update quickstart strings --- css/main.css | 2 +- lib/components/Header.js | 2 +- lib/components/TabToolBar.js | 4 ++-- lib/css/styles.js | 11 +---------- lib/views/AppInfoView.js | 7 +++---- lib/views/CallLogItem.js | 5 ++++- lib/views/CallView.js | 11 +++++------ lib/views/DialView.js | 5 ----- lib/views/LoginView.js | 4 ++-- views/index.html | 8 ++++---- views/widget.html | 5 ++--- 11 files changed, 25 insertions(+), 39 deletions(-) diff --git a/css/main.css b/css/main.css index 6a31ba9..c269918 100644 --- a/css/main.css +++ b/css/main.css @@ -106,7 +106,7 @@ body { } .title-choice-type { - width: 174px; + width: 185px; height: 20px; letter-spacing: -0.1px; color: var(--navy-600); diff --git a/lib/components/Header.js b/lib/components/Header.js index 3d213d2..2e980ed 100644 --- a/lib/components/Header.js +++ b/lib/components/Header.js @@ -12,7 +12,7 @@ export default class Header extends BaseElement { this.settingItems = [ { - 'label': 'Device settings', + 'label': 'Device Settings', 'callback': () => { this.sendToParent('show_settings') } }, { diff --git a/lib/components/TabToolBar.js b/lib/components/TabToolBar.js index d982f9e..b864744 100644 --- a/lib/components/TabToolBar.js +++ b/lib/components/TabToolBar.js @@ -15,7 +15,7 @@ export default class TabToolBar extends BaseElement { } const btnDial = createDiv({ id: 'btn_tab_dial', className: `${classes['btnTab']}` }); const icoTabDial = createDiv({id: 'ico_tab_dial', className: `${classes['tabIco']} ${classes['dialActive']}`}); - const btnDialCaption = createParagraph({id: 'btn_dial_caption', innerText: 'Dial', className: `${classes['fontSmall']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabActive']}`}); + const btnDialCaption = createParagraph({id: 'btn_dial_caption', innerText: 'Call', className: `${classes['fontSmall']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabActive']}`}); btnDial.appendChild(icoTabDial); btnDial.appendChild(btnDialCaption); @@ -37,7 +37,7 @@ export default class TabToolBar extends BaseElement { const btnCallLog = createDiv({id: 'btn_tab_calllog', className: `${classes['btnTab']}`}); const icoCallLog = createDiv({id: 'ico_tab_callog', className: `${classes['tabIco']} ${classes['callLogDeactive']}`}); - const btnCalllogCaption = createParagraph({id: 'btn_calllog_caption', innerText: 'History', className: `${classes['fontSmall']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabDeactive']}`}); + const btnCalllogCaption = createParagraph({id: 'btn_calllog_caption', innerText: 'Recents', className: `${classes['fontSmall']} ${classes['fontHeavy']} ${classes['btnTabCaption']} ${classes['btnTabDeactive']}`}); btnCallLog.appendChild(icoCallLog); btnCallLog.appendChild(btnCalllogCaption); diff --git a/lib/css/styles.js b/lib/css/styles.js index 9dd32ca..8f5720a 100644 --- a/lib/css/styles.js +++ b/lib/css/styles.js @@ -608,7 +608,7 @@ const styles = { }, dialTitle: { - marginBottom: '16px' + marginBottom: '32px' }, /*** buttons ***/ @@ -1273,15 +1273,6 @@ const styles = { backgroundPosition: 'center' }, - dialDesc: { - width: '312px', - height: '40px', - textAlign: 'center', - color: colors.navy400, - marginBottom: '32px', - letterSpacing: '-0.1px' - }, - btnVideo: { backgroundImage: `url(${videoPurpleIcon})`, backgroundRepeat: 'no-repeat', diff --git a/lib/views/AppInfoView.js b/lib/views/AppInfoView.js index 7e22a52..39483f7 100644 --- a/lib/views/AppInfoView.js +++ b/lib/views/AppInfoView.js @@ -1,7 +1,6 @@ -import SendBirdCall from "sendbird-calls"; import BaseElement from "../components/BaseElement"; import { classes } from "../css/styles"; -import { createDiv, createLabel, createOption, createSelect } from "../utils/domUtil"; +import { createDiv, createLabel } from "../utils/domUtil"; export default class AppInfoView extends BaseElement { constructor({ args }) { @@ -55,7 +54,7 @@ export default class AppInfoView extends BaseElement { const applicationInfoContainer = createDiv({ id: 'select_container', className: classes['selectContainer'] }); const applicationNameLabel = createLabel({ id: 'app_name_label', - innerText: 'Application name', + innerText: 'Name', className: `${classes['popupItemLabel']} ${classes['fontSmall']} ${classes['fontHeavy']}` }); const applicationName = createLabel({ @@ -69,7 +68,7 @@ export default class AppInfoView extends BaseElement { const applicationIDLabel = createLabel({ id: 'app_id_label', - innerText: 'Application ID', + innerText: 'ID', className: `${classes['popupItemLabel']} ${classes['fontSmall']} ${classes['fontHeavy']}` }); diff --git a/lib/views/CallLogItem.js b/lib/views/CallLogItem.js index 120fcf1..4452553 100644 --- a/lib/views/CallLogItem.js +++ b/lib/views/CallLogItem.js @@ -126,7 +126,10 @@ export class CallLogItem { } else { const wrapper = createDiv({ id: 'empty_calllog', className: className }); const icoCallLogEmpty = createDiv({ className: `${classes['icoCallLogEmpty']}` }); - const labelCallLogEmpty = createDiv({ innerText: 'No call history', className: `${classes['labelCallLogEmpty']} ${classes['font16']} ${classes['fontHeavy']}` }); + const labelCallLogEmpty = createDiv({ + innerText: 'The list of calls you make will show here.\nTap the phone button to start making a call.', + className: `${classes['labelCallLogEmpty']} ${classes['fontSmall']}` + }); wrapper.appendChild(icoCallLogEmpty); wrapper.appendChild(labelCallLogEmpty); diff --git a/lib/views/CallView.js b/lib/views/CallView.js index fb556b0..7708ece 100644 --- a/lib/views/CallView.js +++ b/lib/views/CallView.js @@ -1,7 +1,6 @@ import BaseElement from "../components/BaseElement"; import { createAudio, createDiv, createImg, createLabel, createVideo } from "../utils/domUtil"; import { getCallOption } from "../utils/util"; -import { hasClassName } from "../utils/domUtil"; import CallButtons from "./CallButtons"; import { classes } from "../css/styles.js"; import PeriodicJob from "../modules/periodicJob"; @@ -38,9 +37,9 @@ export default class CallView extends BaseElement { let connectionText; if (this.call.isVideoCall) { - connectionText = 'Incoming video call…'; + connectionText = 'incoming video call…'; } else { - connectionText = 'Incoming voice call…'; + connectionText = 'incoming voice call…'; } this.connectionInfo = createLabel({ id: 'conn_info_label', @@ -50,7 +49,7 @@ export default class CallView extends BaseElement { const peerStateDiv = createDiv({ id: 'peer_state', className: `${classes['column']} ${classes['peerStateDiv']} ${classes['invisible']}` }); const peerMuteIcon = createDiv({ id: 'peer_mute_icon', className: `${classes['peerMuteIcon']}` }); - const peerMuteLabel = createLabel({ id: 'peer_mute_label', className: `${classes['peerMuteLabel']} ${classes['fontSmall']} ${classes['fontColorWhite']}`, innerText: `${remoteUser.userId} audio muted this call` }); + const peerMuteLabel = createLabel({ id: 'peer_mute_label', className: `${classes['peerMuteLabel']} ${classes['fontSmall']} ${classes['fontColorWhite']}`, innerText: `${remoteUser.userId} is muted.` }); peerStateDiv.appendChild(peerMuteIcon); peerStateDiv.appendChild(peerMuteLabel); @@ -227,7 +226,7 @@ export default class CallView extends BaseElement { drawCallingText() { this.removeConnectionInfoDrawer(); - const rotatingTexts = ['Calling', 'Calling.', 'Calling..']; + const rotatingTexts = ['calling', 'calling.', 'calling..']; let frame = 0; this.connectionInfoDrawer = new PeriodicJob(() => { this.connectionInfo.innerText = rotatingTexts[frame]; @@ -237,7 +236,7 @@ export default class CallView extends BaseElement { drawReconnectingText() { this.removeConnectionInfoDrawer(); - const rotatingTexts = ['Reconnecting', 'Reconnecting.', 'Reconnecting..']; + const rotatingTexts = ['reconnecting', 'reconnecting.', 'reconnecting..']; let frame = 0; this.connectionInfoDrawer = new PeriodicJob(() => { this.connectionInfo.innerText = rotatingTexts[frame]; diff --git a/lib/views/DialView.js b/lib/views/DialView.js index 12a27d5..1eae0b7 100644 --- a/lib/views/DialView.js +++ b/lib/views/DialView.js @@ -28,10 +28,6 @@ export default class DialView extends BaseElement { className: `${classes['formContainer']} ${classes['column']} ${classes['center']}` }); const dialTitleDiv = createDiv({ id: 'title', className: `${classes['fontBig']} ${classes['fontDemi']} ${classes['dialTitle']}`, innerText: 'Make a call'}); - const descDiv = createDiv({id: 'desc_div', - innerText: 'Enter the user ID of the user you wish to call, then press one of the video or voice call buttons', - className: `${classes['fontNormal']} ${classes['dialDesc']} ${classes['fontHeavy']}` - }); const peerId = createInput({ id: 'peer_id', @@ -54,7 +50,6 @@ export default class DialView extends BaseElement { btns.appendChild(btnAudio); formContainer.appendChild(dialTitleDiv); - formContainer.appendChild(descDiv); formContainer.appendChild(peerId); formContainer.appendChild(btns); diff --git a/lib/views/LoginView.js b/lib/views/LoginView.js index 32baeeb..59676eb 100644 --- a/lib/views/LoginView.js +++ b/lib/views/LoginView.js @@ -41,11 +41,11 @@ export default class LoginView extends BaseElement { loginTitleDiv.appendChild(loginTitle); const formContainer = createDiv({ id: 'form_container', className: classes['formContainer'] }); - const inputAppIdLabel = createLabel({ id: 'input_app_id_label', htmlFor: 'input_app_id', innerText: 'App ID', className: `${classes['fieldLabel']} ${classes['fontSmall']} ${classes['fontHeavy']}` }); + const inputAppIdLabel = createLabel({ id: 'input_app_id_label', htmlFor: 'input_app_id', innerText: 'Application ID', className: `${classes['fieldLabel']} ${classes['fontSmall']} ${classes['fontHeavy']}` }); const inputAppId = createInput({ id: 'input_app_id', className: `${classes['field']} ${classes['fontNormal']}` }); const inputIdLabel = createLabel({ id: 'input_id_label', htmlFor: 'input_id', innerText: 'User ID', className: `${classes['fieldLabel']} ${classes['fontSmall']} ${classes['fontHeavy']}` }); const inputId = createInput({ id: 'input_id', className: `${classes['field']} ${classes['fontNormal']}` }); - const inputAccessTokenLabel = createLabel({ id: 'input_access_token_label', htmlFor: 'input_access_token', innerText: 'Access Token', className: `${classes['fieldLabel']} ${classes['fontSmall']} ${classes['fontHeavy']}` }); + const inputAccessTokenLabel = createLabel({ id: 'input_access_token_label', htmlFor: 'input_access_token', innerText: 'Access token', className: `${classes['fieldLabel']} ${classes['fontSmall']} ${classes['fontHeavy']}` }); const inputAccessToken = createInput({ id: 'input_access_token', className: `${classes['field']} ${classes['fontNormal']}` }); const btnLogin = createButton({ id: 'btn_login', className: `${classes['btn']} ${classes['btnPrimary']} ${classes['btnMid']} ${classes['loginButton']} ${classes['fontNormal']}`, }); diff --git a/views/index.html b/views/index.html index 20fbfdb..61f0844 100644 --- a/views/index.html +++ b/views/index.html @@ -13,10 +13,10 @@

- The widget application type showcases how a phone call may be overlaid on top of an existing web application. + The widget type allows you to make calls on your existing web application.
diff --git a/views/widget.html b/views/widget.html index 453514b..39c2b2b 100644 --- a/views/widget.html +++ b/views/widget.html @@ -12,11 +12,10 @@
Sendbird horizontal logo svg icon
- Sendbird Calls Quickstart + Sendbird Calls
- This is the Sendbird Calls Quickstart page.
- To try our widget, please click the button below. + Try our web widget for Calls by clicking the icon below.
arrow-down-right
From a005cb640e01c4b952a6e8bc96e005e0bd073670 Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Thu, 8 Oct 2020 11:03:26 +0900 Subject: [PATCH 63/64] Add auto-authentication in LoginView --- js/main.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/js/main.js b/js/main.js index 1394175..3bc8c93 100644 --- a/js/main.js +++ b/js/main.js @@ -7,6 +7,15 @@ import CallLogView from "../lib/views/CallLogView"; import { ACCESS_TOKEN, IS_ACCESS_TOKEN_NEEDED, TEST_APP_ID, USER_ID } from "../envs"; function onLoadedHandler() { + const urlParams = new URLSearchParams(window.location.search); + const query = urlParams.get('q'); + let args = {}; + if (query) { + try { + args = JSON.parse(atob(query)); + } catch(e) {} + } + const app = new MainApp({ id: 'main_app', pages: { @@ -18,9 +27,9 @@ function onLoadedHandler() { }, styles: {}, args: { - appId: TEST_APP_ID, - userId: USER_ID, - accessToken: ACCESS_TOKEN, + appId: args.app_id || TEST_APP_ID, + userId: args.user_id || USER_ID, + accessToken: args.access_token || ACCESS_TOKEN, isAccessTokenNeeded: IS_ACCESS_TOKEN_NEEDED, } }); From c2ca6f0a4e11a21b52ecebd35c36518648674c3d Mon Sep 17 00:00:00 2001 From: Junyoung Lim Date: Thu, 8 Oct 2020 13:50:22 +0900 Subject: [PATCH 64/64] Bump version to 1.3.1 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b7520de..55dfde7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "calls-quickstart", - "version": "1.2.1", + "version": "1.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f2fbb99..b99e5c0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "calls-quickstart", - "version": "1.2.1", + "version": "1.3.1", "description": "", "main": "app.js", "scripts": {