├── home ├── home.component.css ├── home.component.scss ├── tabs │ ├── tabs.component.css │ ├── tabs.component.ios.css │ ├── tabs.component.ios.scss │ ├── .DS_Store │ ├── tabs.component.android.css │ ├── tabs.component.android.scss │ ├── tabs.component.android.html │ ├── tabs.component.ios.html │ ├── tabs.component.ts │ └── tabs.component.js ├── .DS_Store ├── chats │ ├── _chats.component.common.scss │ ├── chats.component.ios.scss │ ├── chats.component.android.scss │ ├── chats.component.ts │ ├── chats.component.html │ ├── short-when.pipe.ts │ ├── chats.component.js │ ├── short-when.pipe.js │ ├── chats.component.css │ └── chats.component.ios.css ├── home.component.ts ├── home-routing.module.ts ├── home.module.ts ├── home.component.html ├── home.component.js ├── home-routing.module.js └── home.module.js ├── app.component.html ├── _app-common.scss ├── chat ├── _chat.component.common.scss ├── chat.component.ios.css ├── message-box │ ├── _message-box.component.common.scss │ ├── message-box.component.ts │ ├── message-box.component.android.scss │ ├── message-box.component.ios.scss │ ├── message-box.component.html │ ├── new-message.component.js │ └── message-box.component.js ├── chat.component.android.css ├── chat-routing.module.ts ├── chat.component.ios.scss ├── chat.component.android.scss ├── messages-area │ ├── messages-area.component.html │ ├── messages-area.component.ts │ ├── messages-area.component.css │ ├── messages-area.component.scss │ └── messages-area.component.js ├── chat.module.ts ├── chat.component.ts ├── chat-routing.module.js ├── chat.component.html ├── chat.module.js └── chat.component.js ├── core ├── .DS_Store ├── models │ ├── contact.model.ts │ ├── sent-status.model.ts │ ├── chat.model.ts │ ├── image-message.model.ts │ ├── message.model.ts │ ├── contact.model.js │ ├── chat.model.js │ ├── sent-status.model.js │ ├── message.model.js │ └── image-message.model.js ├── index.ts ├── core.module.ts ├── core.module.js ├── index.js ├── chats.service.ts └── chats.service.js ├── assets ├── .DS_Store └── wallpaper.jpg ├── App_Resources ├── .DS_Store ├── iOS │ ├── .DS_Store │ ├── Assets.xcassets │ │ ├── Contents.json │ │ ├── .DS_Store │ │ ├── AppIcon.appiconset │ │ │ ├── .DS_Store │ │ │ ├── icon.png │ │ │ ├── icon-120.png │ │ │ ├── icon-152.png │ │ │ ├── icon-16.png │ │ │ ├── icon-167.png │ │ │ ├── icon-180.png │ │ │ ├── icon-24.png │ │ │ ├── icon-32.png │ │ │ ├── icon-40.png │ │ │ ├── icon-60.png │ │ │ ├── icon-64.png │ │ │ ├── icon-72.png │ │ │ ├── icon-76.png │ │ │ ├── icon@2x.png │ │ │ ├── icon@3x.png │ │ │ ├── icon-40@2x.png │ │ │ ├── icon-40@3x.png │ │ │ ├── icon-60@2x.png │ │ │ ├── icon-60@3x.png │ │ │ ├── icon-72@2x.png │ │ │ ├── icon-76@2x.png │ │ │ ├── icon-Small.png │ │ │ ├── icon-Small-40.png │ │ │ ├── icon-Small-50.png │ │ │ ├── icon-Small@2x.png │ │ │ ├── icon-Small@3x.png │ │ │ ├── icon-Small-40@2x.png │ │ │ ├── icon-Small-40@3x.png │ │ │ ├── icon-Small-50@2x.png │ │ │ └── Contents.json │ │ ├── LaunchImage.launchimage │ │ │ ├── Default.png │ │ │ ├── Default@2x.png │ │ │ ├── Default-568h@2x.png │ │ │ ├── Default-667h@2x.png │ │ │ ├── Default-736h@3x.png │ │ │ ├── Default-Landscape.png │ │ │ ├── Default-Portrait.png │ │ │ ├── Default-Landscape@2x.png │ │ │ ├── Default-Landscape@3x.png │ │ │ ├── Default-Portrait@2x.png │ │ │ └── Contents.json │ │ ├── LaunchScreen.Center.imageset │ │ │ ├── LaunchScreen-Center.png │ │ │ ├── LaunchScreen-Center@2x.png │ │ │ └── Contents.json │ │ └── LaunchScreen.AspectFill.imageset │ │ │ ├── LaunchScreen-AspectFill.png │ │ │ ├── LaunchScreen-AspectFill@2x.png │ │ │ └── Contents.json │ ├── tabs │ │ ├── .DS_Store │ │ ├── calls.png │ │ ├── chats.png │ │ ├── calls@2x.png │ │ ├── calls@3x.png │ │ ├── camera.png │ │ ├── chats@2x.png │ │ ├── chats@3x.png │ │ ├── settings.png │ │ ├── status.png │ │ ├── camera@2x.png │ │ ├── status@2x.png │ │ ├── status@3x.png │ │ ├── calls-filled.png │ │ ├── chats-filled.png │ │ ├── settings@2x.png │ │ ├── settings@3x.png │ │ ├── calls-filled@2x.png │ │ ├── calls-filled@3x.png │ │ ├── chats-filled@2x.png │ │ ├── chats-filled@3x.png │ │ ├── settings-filled.png │ │ ├── settings-filled@2x.png │ │ └── settings-filled@3x.png │ ├── video-call.png │ ├── video-call@2x.png │ ├── video-call@3x.png │ ├── build.xcconfig │ ├── Info.plist │ └── LaunchScreen.storyboard └── Android │ ├── .DS_Store │ ├── values-v21 │ ├── colors.xml │ └── styles.xml │ ├── drawable-hdpi │ ├── .DS_Store │ ├── icon.png │ ├── logo.png │ ├── background.png │ ├── ic_comment.png │ ├── ic_arrow_back.png │ └── ic_photo_camera.png │ ├── drawable-ldpi │ ├── .DS_Store │ ├── icon.png │ ├── logo.png │ └── background.png │ ├── drawable-mdpi │ ├── .DS_Store │ ├── icon.png │ ├── logo.png │ ├── background.png │ ├── ic_comment.png │ ├── ic_arrow_back.png │ └── ic_photo_camera.png │ ├── drawable-xhdpi │ ├── icon.png │ ├── logo.png │ ├── .DS_Store │ ├── background.png │ ├── ic_comment.png │ ├── ic_arrow_back.png │ └── ic_photo_camera.png │ ├── drawable-xxhdpi │ ├── .DS_Store │ ├── icon.png │ ├── logo.png │ ├── background.png │ ├── ic_comment.png │ ├── ic_arrow_back.png │ └── ic_photo_camera.png │ ├── drawable-xxxhdpi │ ├── icon.png │ ├── logo.png │ ├── .DS_Store │ ├── background.png │ ├── ic_comment.png │ ├── ic_arrow_back.png │ └── ic_photo_camera.png │ ├── drawable │ ├── bubble_shadow.9.png │ ├── bubble_shadow_me.9.png │ ├── bubble_shadow_continuation.9.png │ └── bubble_shadow_me_continuation.9.png │ ├── values │ ├── colors.xml │ └── styles.xml │ ├── drawable-nodpi │ └── splash_screen.xml │ ├── app.gradle │ └── AndroidManifest.xml ├── app.android.scss ├── app.ios.scss ├── app.component.ts ├── _nativesapp.scss ├── main.ts ├── main.aot.ts ├── tslint.json ├── tools ├── tslint.json ├── preinstall.js └── postinstall.js ├── app-routing.module.ts ├── main.js ├── app.component.js ├── app.module.ts ├── .gitignore ├── package.json ├── app-routing.module.js ├── app.module.js ├── README.md └── LICENSE /home/home.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /home/home.component.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /home/tabs/tabs.component.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /home/tabs/tabs.component.ios.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /home/tabs/tabs.component.ios.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app.component.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /_app-common.scss: -------------------------------------------------------------------------------- 1 | @import 'nativesapp'; 2 | @import '~nativescript-theme-core/scss/index'; -------------------------------------------------------------------------------- /chat/_chat.component.common.scss: -------------------------------------------------------------------------------- 1 | .wallpaper { 2 | background-image: url('~/assets/wallpaper.jpg'); 3 | } -------------------------------------------------------------------------------- /core/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/core/.DS_Store -------------------------------------------------------------------------------- /home/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/home/.DS_Store -------------------------------------------------------------------------------- /assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/assets/.DS_Store -------------------------------------------------------------------------------- /assets/wallpaper.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/assets/wallpaper.jpg -------------------------------------------------------------------------------- /home/tabs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/home/tabs/.DS_Store -------------------------------------------------------------------------------- /core/models/contact.model.ts: -------------------------------------------------------------------------------- 1 | export class Contact { 2 | id?: number; 3 | avatar: string; 4 | name: string; 5 | } 6 | -------------------------------------------------------------------------------- /App_Resources/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/.DS_Store -------------------------------------------------------------------------------- /core/models/sent-status.model.ts: -------------------------------------------------------------------------------- 1 | export enum SentStatus { 2 | NOT_SENT, 3 | SENT, 4 | RECEIVED, 5 | VIEWED, 6 | } 7 | -------------------------------------------------------------------------------- /App_Resources/iOS/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/.DS_Store -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /App_Resources/Android/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/.DS_Store -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/.DS_Store -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/calls.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/calls.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/chats.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/chats.png -------------------------------------------------------------------------------- /App_Resources/iOS/video-call.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/video-call.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/calls@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/calls@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/calls@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/calls@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/camera.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/chats@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/chats@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/chats@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/chats@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/settings.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/status.png -------------------------------------------------------------------------------- /App_Resources/iOS/video-call@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/video-call@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/video-call@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/video-call@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/camera@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/camera@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/status@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/status@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/status@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/status@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/calls-filled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/calls-filled.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/chats-filled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/chats-filled.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/settings@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/settings@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/settings@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/settings@3x.png -------------------------------------------------------------------------------- /app.android.scss: -------------------------------------------------------------------------------- 1 | @import '~nativescript-theme-core/scss/forest'; 2 | @import 'app-common'; 3 | @import '~nativescript-theme-core/scss/platforms/index.android'; -------------------------------------------------------------------------------- /App_Resources/Android/values-v21/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #3d5afe 4 | -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/calls-filled@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/calls-filled@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/calls-filled@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/calls-filled@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/chats-filled@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/chats-filled@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/chats-filled@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/chats-filled@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/settings-filled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/settings-filled.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-hdpi/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-hdpi/.DS_Store -------------------------------------------------------------------------------- /App_Resources/Android/drawable-hdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-hdpi/icon.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-hdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-hdpi/logo.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-ldpi/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-ldpi/.DS_Store -------------------------------------------------------------------------------- /App_Resources/Android/drawable-ldpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-ldpi/icon.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-ldpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-ldpi/logo.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-mdpi/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-mdpi/.DS_Store -------------------------------------------------------------------------------- /App_Resources/Android/drawable-mdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-mdpi/icon.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-mdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-mdpi/logo.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xhdpi/icon.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xhdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xhdpi/logo.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/.DS_Store -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/settings-filled@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/settings-filled@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/tabs/settings-filled@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/tabs/settings-filled@3x.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xhdpi/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xhdpi/.DS_Store -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxhdpi/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxhdpi/.DS_Store -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxhdpi/icon.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxhdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxhdpi/logo.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxxhdpi/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxxhdpi/icon.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxxhdpi/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxxhdpi/logo.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-hdpi/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-hdpi/background.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-hdpi/ic_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-hdpi/ic_comment.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-ldpi/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-ldpi/background.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-mdpi/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-mdpi/background.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-mdpi/ic_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-mdpi/ic_comment.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxxhdpi/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxxhdpi/.DS_Store -------------------------------------------------------------------------------- /App_Resources/Android/drawable/bubble_shadow.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable/bubble_shadow.9.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xhdpi/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xhdpi/background.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xhdpi/ic_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xhdpi/ic_comment.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxhdpi/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxhdpi/background.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxhdpi/ic_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxhdpi/ic_comment.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-hdpi/ic_arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-hdpi/ic_arrow_back.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-hdpi/ic_photo_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-hdpi/ic_photo_camera.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-mdpi/ic_arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-mdpi/ic_arrow_back.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-mdpi/ic_photo_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-mdpi/ic_photo_camera.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xhdpi/ic_arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xhdpi/ic_arrow_back.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxhdpi/ic_arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxhdpi/ic_arrow_back.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxxhdpi/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxxhdpi/background.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxxhdpi/ic_comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxxhdpi/ic_comment.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable/bubble_shadow_me.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable/bubble_shadow_me.9.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xhdpi/ic_photo_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xhdpi/ic_photo_camera.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxhdpi/ic_photo_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxhdpi/ic_photo_camera.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxxhdpi/ic_arrow_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxxhdpi/ic_arrow_back.png -------------------------------------------------------------------------------- /app.ios.scss: -------------------------------------------------------------------------------- 1 | @import '~nativescript-theme-core/scss/light'; 2 | @import 'app-common'; 3 | @import '~nativescript-theme-core/scss/platforms/index.ios'; 4 | 5 | .link { 6 | color: $blue; 7 | } -------------------------------------------------------------------------------- /App_Resources/Android/drawable-xxxhdpi/ic_photo_camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable-xxxhdpi/ic_photo_camera.png -------------------------------------------------------------------------------- /app.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'ns-app', 5 | templateUrl: 'app.component.html', 6 | }) 7 | export class AppComponent { 8 | } 9 | -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/.DS_Store -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable/bubble_shadow_continuation.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable/bubble_shadow_continuation.9.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-120.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-152.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-16.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-167.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-167.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-180.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-24.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-32.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-64.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon@3x.png -------------------------------------------------------------------------------- /App_Resources/Android/drawable/bubble_shadow_me_continuation.9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/Android/drawable/bubble_shadow_me_continuation.9.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-40@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-60@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-72@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-40.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-50.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-40@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-40@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-50@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/icon-Small-50@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-568h@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-667h@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-736h@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Landscape@3x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Default-Portrait@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/LaunchScreen-Center@2x.png -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill.png -------------------------------------------------------------------------------- /core/models/chat.model.ts: -------------------------------------------------------------------------------- 1 | import { Contact } from './contact.model'; 2 | 3 | export class Chat { 4 | id?: number; 5 | contact: Contact; 6 | type: string; 7 | when: number; 8 | muted: boolean; 9 | unread: number; 10 | text: string; 11 | } 12 | -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Especializa/nativescript-whatsapp-template/HEAD/App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/LaunchScreen-AspectFill@2x.png -------------------------------------------------------------------------------- /_nativesapp.scss: -------------------------------------------------------------------------------- 1 | .mdi { 2 | font-family: "Material Icons", "MaterialIcons-Regular"; 3 | } 4 | 5 | .action-bar { 6 | .action-bar-button { 7 | border-color: transparent; 8 | background-color: transparent; 9 | font-size: 20; 10 | border-width: 1; 11 | } 12 | } -------------------------------------------------------------------------------- /home/chats/_chats.component.common.scss: -------------------------------------------------------------------------------- 1 | .thumb { 2 | border-radius: 50%; 3 | } 4 | 5 | .muted { 6 | font-weight: normal; 7 | opacity: 0.4; 8 | font-size: 20; 9 | } 10 | 11 | .unread { 12 | text-align: center; 13 | min-width: 20; 14 | min-height: 20; 15 | color: $white; 16 | } -------------------------------------------------------------------------------- /home/tabs/tabs.component.android.css: -------------------------------------------------------------------------------- 1 | .fab-button{height:56;width:56;margin:15;background-color:#25D366;horizontal-align:right;vertical-align:bottom}.tab-view{font-weight:bold;font-size:14;tab-text-color:rgba(255,255,255,0.5);selected-tab-text-color:white;android-selected-tab-highlight-color:white} 2 | -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | // this import should be first in order to load some required settings 2 | // (like globals and reflect-metadata) 3 | import { platformNativeScriptDynamic } from 'nativescript-angular/platform'; 4 | 5 | import { AppModule } from './app.module'; 6 | 7 | platformNativeScriptDynamic().bootstrapModule(AppModule); 8 | -------------------------------------------------------------------------------- /App_Resources/Android/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #006968 4 | #005958 5 | #33B5E5 6 | #272734 7 | #FFFFFF 8 | -------------------------------------------------------------------------------- /home/chats/chats.component.ios.scss: -------------------------------------------------------------------------------- 1 | @import '~nativescript-theme-core/scss/light'; 2 | @import '~nativescript-theme-core/scss/index'; 3 | @import 'chats.component.common'; 4 | 5 | .unread { 6 | font-size: 10; 7 | border-radius: 50%; 8 | background-color: $blue; 9 | } 10 | 11 | .time { 12 | color: $grey-dark; 13 | font-size: 12; 14 | } -------------------------------------------------------------------------------- /main.aot.ts: -------------------------------------------------------------------------------- 1 | // this import should be first in order to load some required settings 2 | // (like globals and reflect-metadata) 3 | import { platformNativeScript } from 'nativescript-angular/platform-static'; 4 | 5 | import { AppModuleNgFactory } from './app.module.ngfactory'; 6 | 7 | platformNativeScript().bootstrapModuleFactory(AppModuleNgFactory); 8 | -------------------------------------------------------------------------------- /chat/chat.component.ios.css: -------------------------------------------------------------------------------- 1 | .wallpaper{background-image:url("~/assets/wallpaper.jpg")}.action-bar .back{margin:0;padding:0}.action-bar .action-bar-title .thumb{width:36;height:36;border-radius:50%;margin-right:10}.action-bar .action-bar-title .title{font-weight:bold;font-size:16}.action-bar .action-bar-title .subtitle{font-weight:100;font-size:12;color:#5c687c} 2 | -------------------------------------------------------------------------------- /chat/message-box/_message-box.component.common.scss: -------------------------------------------------------------------------------- 1 | .message-box { 2 | width: 100%; 3 | align-items: flex-end; 4 | 5 | .icon { 6 | padding: 5; 7 | flex-grow: 0; 8 | border-radius: 50%; 9 | } 10 | 11 | .text-area { 12 | flex-grow: 1; 13 | align-items: flex-end; 14 | 15 | .text-view { 16 | flex-grow: 1; 17 | } 18 | } 19 | } -------------------------------------------------------------------------------- /App_Resources/Android/drawable-nodpi/splash_screen.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /home/home.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, OnInit } from '@angular/core'; 2 | 3 | @Component({ 4 | moduleId: module.id, 5 | selector: 'ns-home', 6 | templateUrl: './home.component.html', 7 | styleUrls: ['./home.component.css'], 8 | }) 9 | export class HomeComponent { 10 | constructor( 11 | @Inject('platform') public platform, 12 | ) {} 13 | } 14 | -------------------------------------------------------------------------------- /core/index.ts: -------------------------------------------------------------------------------- 1 | export { CoreModule } from './core.module'; 2 | export { ChatsService } from './chats.service'; 3 | 4 | export { Message } from './models/message.model'; 5 | export { ImageMessage } from './models/image-message.model'; 6 | export { Chat } from './models/chat.model'; 7 | export { Contact } from './models/contact.model'; 8 | export { SentStatus } from './models/sent-status.model'; 9 | -------------------------------------------------------------------------------- /chat/message-box/message-box.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, Inject, Input } from '@angular/core'; 2 | 3 | @Component({ 4 | moduleId: module.id, 5 | selector: 'ns-message-box', 6 | templateUrl: './message-box.component.html', 7 | styleUrls: ['./message-box.component.css'], 8 | }) 9 | export class MessageBoxComponent { 10 | constructor(@Inject('platform') public platform) {} 11 | } 12 | -------------------------------------------------------------------------------- /core/core.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { NativeScriptModule } from 'nativescript-angular/nativescript.module'; 3 | 4 | import { ChatsService } from './chats.service'; 5 | 6 | @NgModule({ 7 | imports: [ 8 | NativeScriptModule, 9 | ], 10 | declarations: [], 11 | providers: [ 12 | ChatsService, 13 | ], 14 | }) 15 | export class CoreModule { } 16 | -------------------------------------------------------------------------------- /home/tabs/tabs.component.android.scss: -------------------------------------------------------------------------------- 1 | .fab-button { 2 | height: 56; 3 | width: 56; 4 | margin: 15; 5 | background-color: #25D366; 6 | horizontal-align: right; 7 | vertical-align: bottom; 8 | } 9 | .tab-view { 10 | font-weight: bold; 11 | font-size: 14; 12 | tab-text-color: rgba(255, 255, 255, 0.5); 13 | selected-tab-text-color: white; 14 | android-selected-tab-highlight-color: white; 15 | } -------------------------------------------------------------------------------- /App_Resources/Android/app.gradle: -------------------------------------------------------------------------------- 1 | // Add your native dependencies here: 2 | 3 | // Uncomment to add recyclerview-v7 dependency 4 | //dependencies { 5 | // compile 'com.android.support:recyclerview-v7:+' 6 | //} 7 | 8 | android { 9 | defaultConfig { 10 | generatedDensities = [] 11 | applicationId = "__PACKAGE__" 12 | } 13 | aaptOptions { 14 | additionalParameters "--no-version-vectors" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /chat/chat.component.android.css: -------------------------------------------------------------------------------- 1 | .wallpaper{background-image:url("~/assets/wallpaper.jpg")}.action-bar .action-bar-title .thumb{width:40;height:40;border-radius:50%;margin-right:10}.action-bar .action-bar-title .title{font-weight:bold;font-size:17}.action-bar .action-bar-title .subtitle{font-weight:normal;font-size:12}.action-bar .action-item .icon{font-size:25;padding-right:15}.action-bar .action-item .icon.phone{padding-right:5} 2 | -------------------------------------------------------------------------------- /core/models/image-message.model.ts: -------------------------------------------------------------------------------- 1 | import { Message } from './message.model'; 2 | 3 | export class ImageMessage extends Message { 4 | url: string = ''; 5 | thumbnail: string = ''; 6 | 7 | /** 8 | * Method overriden 9 | * @returns String 10 | */ 11 | toString(): string { 12 | return `Photo${super.toString()} ` + 13 | `- Url: ${this.url} ` + 14 | `- Thumbnail: ${this.thumbnail}`; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /home/chats/chats.component.android.scss: -------------------------------------------------------------------------------- 1 | @import '~nativescript-theme-core/scss/forest'; 2 | @import '~nativescript-theme-core/scss/index'; 3 | @import 'chats.component.common'; 4 | 5 | $lightgreen: #25D366; 6 | 7 | .unread { 8 | font-size: 11; 9 | padding-top: 2; 10 | border-radius: 50%; 11 | background-color: $lightgreen; 12 | } 13 | 14 | .time { 15 | &-unread { 16 | color: $lightgreen; 17 | } 18 | color: $grey-dark; 19 | font-size: 12; 20 | } -------------------------------------------------------------------------------- /chat/chat-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes } from '@angular/router'; 3 | import { NativeScriptRouterModule } from 'nativescript-angular/router'; 4 | 5 | import { ChatComponent } from './chat.component'; 6 | 7 | const routes: Routes = [ 8 | { path: '', component: ChatComponent }, 9 | ]; 10 | 11 | @NgModule({ 12 | imports: [NativeScriptRouterModule.forChild(routes)], 13 | exports: [NativeScriptRouterModule], 14 | }) 15 | export class ChatRoutingModule { } 16 | -------------------------------------------------------------------------------- /core/models/message.model.ts: -------------------------------------------------------------------------------- 1 | import { Chat } from './chat.model'; 2 | import { Contact } from './contact.model'; 3 | import { SentStatus } from './sent-status.model'; 4 | 5 | export class Message { 6 | id?: number; 7 | text: string = ''; 8 | chat: Chat; 9 | sender: Contact; 10 | readonly created: number = Date.now(); 11 | sent: SentStatus; 12 | 13 | toString(): string { 14 | const { created, text } = this; 15 | return `Message created at: ${created} - Text: ${text}`; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /home/home-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes } from '@angular/router'; 3 | import { NativeScriptRouterModule } from 'nativescript-angular/router'; 4 | 5 | import { HomeComponent } from './home.component'; 6 | 7 | const routes: Routes = [ 8 | { path: '', component: HomeComponent }, 9 | ]; 10 | 11 | @NgModule({ 12 | imports: [NativeScriptRouterModule.forChild(routes)], 13 | exports: [NativeScriptRouterModule], 14 | }) 15 | export class HomeRoutingModule { } 16 | -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchScreen.Center.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchScreen-Center.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchScreen-Center@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": { 8 | "quotemark": [ 9 | true, 10 | "single" 11 | ], 12 | "max-line-length": [ 13 | true, 14 | 80 15 | ], 16 | "object-literal-sort-keys": false, 17 | "member-access": [ 18 | true, 19 | "no-public" 20 | ] 21 | }, 22 | "rulesDirectory": [] 23 | } -------------------------------------------------------------------------------- /tools/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": { 8 | "quotemark": [ 9 | true, 10 | "single" 11 | ], 12 | "max-line-length": [ 13 | true, 14 | 80 15 | ], 16 | "object-literal-sort-keys": false, 17 | "member-access": [ 18 | true, 19 | "no-public" 20 | ] 21 | }, 22 | "rulesDirectory": [] 23 | } -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchScreen.AspectFill.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchScreen-AspectFill.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchScreen-AspectFill@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "scale" : "3x" 16 | } 17 | ], 18 | "info" : { 19 | "version" : 1, 20 | "author" : "xcode" 21 | } 22 | } -------------------------------------------------------------------------------- /App_Resources/iOS/build.xcconfig: -------------------------------------------------------------------------------- 1 | // You can add custom settings here 2 | // for example you can uncomment the following line to force distribution code signing 3 | // CODE_SIGN_IDENTITY = iPhone Distribution 4 | // To build for device with XCode 8 you need to specify your development team. More info: https://developer.apple.com/library/prerelease/content/releasenotes/DeveloperTools/RN-Xcode/Introduction.html 5 | // DEVELOPMENT_TEAM = YOUR_TEAM_ID; 6 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 7 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 8 | -------------------------------------------------------------------------------- /chat/chat.component.ios.scss: -------------------------------------------------------------------------------- 1 | @import '~nativescript-theme-core/scss/light'; 2 | @import 'chat.component.common'; 3 | 4 | .action-bar { 5 | .back { 6 | margin: 0; 7 | padding: 0; 8 | } 9 | .action-bar-title { 10 | .thumb { 11 | width: 36; 12 | height: 36; 13 | border-radius: 50%; 14 | margin-right: 10; 15 | } 16 | .title { 17 | font-weight: bold; 18 | font-size: 16; 19 | } 20 | .subtitle { 21 | font-weight: 100; 22 | font-size: 12; 23 | color: $grey-dark; 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app-routing.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core'; 2 | import { Routes } from '@angular/router'; 3 | import { NativeScriptRouterModule } from 'nativescript-angular/router'; 4 | 5 | const routes: Routes = [ 6 | { path: '', redirectTo: '/home', pathMatch: 'full' }, 7 | { path: 'home', loadChildren: './home/home.module#HomeModule' }, 8 | { path: 'chat/:index', loadChildren: './chat/chat.module#ChatModule' }, 9 | ]; 10 | 11 | @NgModule({ 12 | imports: [NativeScriptRouterModule.forRoot(routes)], 13 | exports: [NativeScriptRouterModule], 14 | }) 15 | export class AppRoutingModule { } 16 | -------------------------------------------------------------------------------- /chat/chat.component.android.scss: -------------------------------------------------------------------------------- 1 | @import 'chat.component.common'; 2 | 3 | .action-bar { 4 | .action-bar-title { 5 | .thumb { 6 | width: 40; 7 | height: 40; 8 | border-radius: 50%; 9 | margin-right: 10; 10 | } 11 | .title { 12 | font-weight: bold; 13 | font-size: 17; 14 | } 15 | .subtitle { 16 | font-weight: normal; 17 | font-size: 12; 18 | } 19 | } 20 | .action-item { 21 | .icon { 22 | font-size: 25; 23 | padding-right: 15; 24 | 25 | &.phone { 26 | padding-right: 5; 27 | } 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /core/models/contact.model.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var Contact = (function () { 4 | function Contact() { 5 | } 6 | return Contact; 7 | }()); 8 | exports.Contact = Contact; 9 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRhY3QubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTtJQUFBO0lBSUEsQ0FBQztJQUFELGNBQUM7QUFBRCxDQUFDLEFBSkQsSUFJQztBQUpZLDBCQUFPIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIENvbnRhY3Qge1xuICBpZD86IG51bWJlcjtcbiAgYXZhdGFyOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbn1cbiJdfQ== -------------------------------------------------------------------------------- /chat/message-box/message-box.component.android.scss: -------------------------------------------------------------------------------- 1 | @import '~nativescript-theme-core/scss/forest'; 2 | @import '~nativescript-theme-core/scss/index'; 3 | @import 'message-box.component.common'; 4 | 5 | .message-box { 6 | 7 | .icon { 8 | font-size: 24; 9 | margin: 0 0 5 0; 10 | } 11 | .text-area { 12 | background: white; 13 | border-radius: 50%; 14 | padding: 0 5; 15 | margin: 5; 16 | 17 | .text-view { 18 | flex-grow: 1; 19 | border-color: transparent; 20 | background-color: transparent; 21 | } 22 | } 23 | .send { 24 | color: white; 25 | padding: 10; 26 | margin: 0 5 5 0; 27 | } 28 | } -------------------------------------------------------------------------------- /home/tabs/tabs.component.android.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /core/models/chat.model.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var Chat = (function () { 4 | function Chat() { 5 | } 6 | return Chat; 7 | }()); 8 | exports.Chat = Chat; 9 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoYXQubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTtJQUFBO0lBUUEsQ0FBQztJQUFELFdBQUM7QUFBRCxDQUFDLEFBUkQsSUFRQztBQVJZLG9CQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udGFjdCB9IGZyb20gJy4vY29udGFjdC5tb2RlbCc7XG5cbmV4cG9ydCBjbGFzcyBDaGF0IHtcbiAgaWQ/OiBudW1iZXI7XG4gIGNvbnRhY3Q6IENvbnRhY3Q7XG4gIHR5cGU6IHN0cmluZztcbiAgd2hlbjogbnVtYmVyO1xuICBtdXRlZDogYm9vbGVhbjtcbiAgdW5yZWFkOiBudW1iZXI7XG4gIHRleHQ6IHN0cmluZztcbn1cbiJdfQ== -------------------------------------------------------------------------------- /chat/message-box/message-box.component.ios.scss: -------------------------------------------------------------------------------- 1 | @import '~nativescript-theme-core/scss/light'; 2 | @import '~nativescript-theme-core/scss/index'; 3 | @import 'message-box.component.common'; 4 | 5 | .message-box { 6 | background-color: #FAFAFA; 7 | border-top-color: #D6D3CD; 8 | border-top-width: 1; 9 | 10 | .icon { 11 | font-size: 28; 12 | color: $blue; 13 | opacity: .8; 14 | margin: 4; 15 | } 16 | 17 | .text-area { 18 | 19 | .text-view { 20 | border-radius: 50%; 21 | border-width: 1; 22 | border-color: #d8d8d8; 23 | font-size: 16; 24 | padding: 5; 25 | margin-bottom: 8; 26 | } 27 | .camera { 28 | height: 80%; 29 | } 30 | } 31 | 32 | .separator { 33 | margin-bottom: 15; 34 | opacity: .4; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /home/chats/chats.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { NavigationExtras } from '@angular/router'; 3 | import { RouterExtensions } from 'nativescript-angular/router'; 4 | 5 | import { ChatsService } from '../../core'; 6 | 7 | @Component({ 8 | moduleId: module.id, 9 | selector: 'ns-chats', 10 | templateUrl: './chats.component.html', 11 | styleUrls: ['./chats.component.css'], 12 | }) 13 | export class ChatsComponent { 14 | chats = []; 15 | constructor( 16 | chatsService: ChatsService, 17 | private routerExtensions: RouterExtensions, 18 | ) { 19 | this.chats = chatsService.chats; 20 | } 21 | 22 | goToChat(args) { 23 | const extras: NavigationExtras = { 24 | queryParams: { 25 | unread: 2, 26 | }, 27 | }; 28 | this.routerExtensions.navigate([ 29 | 'chat', 30 | args.index, 31 | ], extras); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /core/models/sent-status.model.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var SentStatus; 4 | (function (SentStatus) { 5 | SentStatus[SentStatus["NOT_SENT"] = 0] = "NOT_SENT"; 6 | SentStatus[SentStatus["SENT"] = 1] = "SENT"; 7 | SentStatus[SentStatus["RECEIVED"] = 2] = "RECEIVED"; 8 | SentStatus[SentStatus["VIEWED"] = 3] = "VIEWED"; 9 | })(SentStatus = exports.SentStatus || (exports.SentStatus = {})); 10 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VudC1zdGF0dXMubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzZW50LXN0YXR1cy5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQixtREFBUSxDQUFBO0lBQ1IsMkNBQUksQ0FBQTtJQUNKLG1EQUFRLENBQUE7SUFDUiwrQ0FBTSxDQUFBO0FBQ1IsQ0FBQyxFQUxXLFVBQVUsR0FBVixrQkFBVSxLQUFWLGtCQUFVLFFBS3JCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGVudW0gU2VudFN0YXR1cyB7XG4gIE5PVF9TRU5ULFxuICBTRU5ULFxuICBSRUNFSVZFRCxcbiAgVklFV0VELFxufVxuIl19 -------------------------------------------------------------------------------- /home/chats/chats.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /home/chats/short-when.pipe.ts: -------------------------------------------------------------------------------- 1 | import { DatePipe } from '@angular/common'; 2 | import { Pipe, PipeTransform } from '@angular/core'; 3 | import { device } from 'platform'; 4 | 5 | import * as isToday from 'date-fns/is_today'; 6 | import * as isYesterday from 'date-fns/is_yesterday'; 7 | import * as parse from 'date-fns/parse'; 8 | 9 | @Pipe({ 10 | name: 'shortWhen', 11 | pure: true, 12 | }) 13 | export class ShortWhenPipe implements PipeTransform { 14 | 15 | transform(value: number | string | Date): string { 16 | let language = device.language; 17 | if (device.region) { 18 | language += `-${device.region}`; 19 | } 20 | const datePipe = new DatePipe(language); 21 | const parsedDate = parse(value); 22 | 23 | if (isToday(parsedDate)) { 24 | return datePipe.transform(parsedDate, 'shortTime'); 25 | } 26 | 27 | if (isYesterday(parsedDate)) { 28 | return 'yesterday'; 29 | } 30 | 31 | return datePipe.transform(parsedDate, 'shortDate'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /App_Resources/Android/values-v21/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 11 | 14 | 15 | 16 | 19 | 20 | 23 | -------------------------------------------------------------------------------- /home/home.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; 2 | import { NativeScriptFormsModule } from 'nativescript-angular/forms'; 3 | import { NativeScriptModule } from 'nativescript-angular/nativescript.module'; 4 | import { TNSFontIconModule } from 'nativescript-ngx-fonticon'; 5 | 6 | import { ChatsComponent } from './chats/chats.component'; 7 | import { ShortWhenPipe } from './chats/short-when.pipe'; 8 | import { HomeRoutingModule } from './home-routing.module'; 9 | import { HomeComponent } from './home.component'; 10 | import { TabsComponent } from './tabs/tabs.component'; 11 | 12 | @NgModule({ 13 | imports: [ 14 | NativeScriptModule, 15 | NativeScriptFormsModule, 16 | HomeRoutingModule, 17 | TNSFontIconModule.forRoot({ 18 | mdi: 'material-design-icons.css', 19 | }), 20 | ], 21 | declarations: [ 22 | HomeComponent, 23 | TabsComponent, 24 | ChatsComponent, 25 | ShortWhenPipe, 26 | ], 27 | schemas: [ 28 | NO_ERRORS_SCHEMA, 29 | ], 30 | }) 31 | export class HomeModule { } 32 | -------------------------------------------------------------------------------- /chat/messages-area/messages-area.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | 11 | 13 | 14 | 17 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /chat/chat.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; 2 | import { NativeScriptFormsModule } from 'nativescript-angular/forms'; 3 | import { NativeScriptModule } from 'nativescript-angular/nativescript.module'; 4 | import { TNSFontIconModule } from 'nativescript-ngx-fonticon'; 5 | 6 | import { NgShadowModule } from 'nativescript-ng-shadow'; 7 | import { ChatRoutingModule } from './chat-routing.module'; 8 | import { ChatComponent } from './chat.component'; 9 | import { MessageBoxComponent } from './message-box/message-box.component'; 10 | import { MessagesAreaComponent } from './messages-area/messages-area.component'; 11 | 12 | @NgModule({ 13 | imports: [ 14 | NativeScriptModule, 15 | NativeScriptFormsModule, 16 | ChatRoutingModule, 17 | NgShadowModule, 18 | TNSFontIconModule.forRoot({ 19 | mdi: 'material-design-icons.css', 20 | }), 21 | ], 22 | declarations: [ 23 | ChatComponent, 24 | MessagesAreaComponent, 25 | MessageBoxComponent, 26 | ], 27 | schemas: [ 28 | NO_ERRORS_SCHEMA, 29 | ], 30 | }) 31 | export class ChatModule { } 32 | -------------------------------------------------------------------------------- /main.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | // this import should be first in order to load some required settings 4 | // (like globals and reflect-metadata) 5 | var platform_1 = require("nativescript-angular/platform"); 6 | var app_module_1 = require("./app.module"); 7 | platform_1.platformNativeScriptDynamic().bootstrapModule(app_module_1.AppModule); 8 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1haW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzRUFBc0U7QUFDdEUsc0NBQXNDO0FBQ3RDLDBEQUE0RTtBQUU1RSwyQ0FBeUM7QUFFekMsc0NBQTJCLEVBQUUsQ0FBQyxlQUFlLENBQUMsc0JBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdGhpcyBpbXBvcnQgc2hvdWxkIGJlIGZpcnN0IGluIG9yZGVyIHRvIGxvYWQgc29tZSByZXF1aXJlZCBzZXR0aW5nc1xuLy8gKGxpa2UgZ2xvYmFscyBhbmQgcmVmbGVjdC1tZXRhZGF0YSlcbmltcG9ydCB7IHBsYXRmb3JtTmF0aXZlU2NyaXB0RHluYW1pYyB9IGZyb20gJ25hdGl2ZXNjcmlwdC1hbmd1bGFyL3BsYXRmb3JtJztcblxuaW1wb3J0IHsgQXBwTW9kdWxlIH0gZnJvbSAnLi9hcHAubW9kdWxlJztcblxucGxhdGZvcm1OYXRpdmVTY3JpcHREeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSk7XG4iXX0= -------------------------------------------------------------------------------- /app.component.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var AppComponent = (function () { 5 | function AppComponent() { 6 | } 7 | AppComponent = __decorate([ 8 | core_1.Component({ 9 | selector: 'ns-app', 10 | templateUrl: 'app.component.html', 11 | }) 12 | ], AppComponent); 13 | return AppComponent; 14 | }()); 15 | exports.AppComponent = AppComponent; 16 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFwcC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBMEM7QUFNMUM7SUFBQTtJQUNBLENBQUM7SUFEWSxZQUFZO1FBSnhCLGdCQUFTLENBQUM7WUFDVCxRQUFRLEVBQUUsUUFBUTtZQUNsQixXQUFXLEVBQUUsb0JBQW9CO1NBQ2xDLENBQUM7T0FDVyxZQUFZLENBQ3hCO0lBQUQsbUJBQUM7Q0FBQSxBQURELElBQ0M7QUFEWSxvQ0FBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICducy1hcHAnLFxuICB0ZW1wbGF0ZVVybDogJ2FwcC5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIEFwcENvbXBvbmVudCB7XG59XG4iXX0= -------------------------------------------------------------------------------- /app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule, NgModuleFactoryLoader, 2 | NO_ERRORS_SCHEMA } from '@angular/core'; 3 | import { NativeScriptModule } from 'nativescript-angular/nativescript.module'; 4 | import { NSModuleFactoryLoader } from 'nativescript-angular/router'; 5 | import * as platform from 'platform'; 6 | 7 | import { AppRoutingModule } from './app-routing.module'; 8 | import { AppComponent } from './app.component'; 9 | import { CoreModule } from './core'; 10 | 11 | import { registerElement } from 'nativescript-angular'; 12 | import { Fab } from 'nativescript-floatingactionbutton'; 13 | 14 | registerElement('Fab', () => Fab); 15 | 16 | @NgModule({ 17 | bootstrap: [ 18 | AppComponent, 19 | ], 20 | imports: [ 21 | NativeScriptModule, 22 | AppRoutingModule, 23 | CoreModule, 24 | ], 25 | declarations: [ 26 | AppComponent, 27 | ], 28 | providers: [ 29 | { provide: NgModuleFactoryLoader, useClass: NSModuleFactoryLoader }, 30 | { provide: 'platform', useValue: platform }, 31 | ], 32 | schemas: [ 33 | NO_ERRORS_SCHEMA, 34 | ], 35 | }) 36 | export class AppModule { } 37 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | # Compiled binary addons (http://nodejs.org/api/addons.html) 33 | build/Release 34 | 35 | # Dependency directories 36 | node_modules/ 37 | jspm_packages/ 38 | 39 | # Typescript v1 declaration files 40 | typings/ 41 | 42 | # Optional npm cache directory 43 | .npm 44 | 45 | # Optional eslint cache 46 | .eslintcache 47 | 48 | # Optional REPL history 49 | .node_repl_history 50 | 51 | # Output of 'npm pack' 52 | *.tgz 53 | 54 | # Yarn Integrity file 55 | .yarn-integrity 56 | 57 | # dotenv environment variables file 58 | .env 59 | 60 | -------------------------------------------------------------------------------- /home/tabs/tabs.component.ios.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /home/tabs/tabs.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectorRef, Component, Inject, OnInit } from '@angular/core'; 2 | import { AndroidActivityBackPressedEventData } from 'application'; 3 | import * as application from 'application'; 4 | 5 | @Component({ 6 | moduleId: module.id, 7 | selector: 'ns-tabs', 8 | templateUrl: './tabs.component.html', 9 | styleUrls: ['./tabs.component.css'], 10 | }) 11 | export class TabsComponent implements OnInit { 12 | selectedIndex: number; 13 | constructor( 14 | @Inject('platform') public platform, 15 | private changeDetectorRef: ChangeDetectorRef, 16 | ) {} 17 | 18 | ngOnInit(): void { 19 | this.selectedIndex = this.platform.isAndroid ? 1 : 3; 20 | 21 | if (this.platform.isAndroid) { 22 | application.android.on( 23 | application.AndroidApplication.activityBackPressedEvent, 24 | (args: AndroidActivityBackPressedEventData) => { 25 | if (this.selectedIndex !== 1) { 26 | this.selectedIndex = 1; 27 | args.cancel = true; 28 | this.changeDetectorRef.detectChanges(); 29 | } 30 | }, 31 | ); 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /tools/preinstall.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const exec = require('child_process').exec; 4 | 5 | console.log('preinstall script running...'); 6 | 7 | const tslintConfig = 'tslint.json'; 8 | 9 | getAppRootFolder().then(appRootFolder => 10 | copyConfig(tslintConfig, appRootFolder) 11 | ).then(appRootFolder => { 12 | fs.mkdir(path.join(appRootFolder, 'app')) 13 | }); 14 | 15 | function copyConfig(configFilename, appRootFolder) { 16 | return new Promise((resolve, reject) => { 17 | const sourcePath = path.join(__dirname, configFilename); 18 | const destPath = path.join(appRootFolder, configFilename); 19 | 20 | console.log(`creating ${path.resolve(destPath)}...`); 21 | fs.rename(sourcePath, destPath, err => { 22 | if (err) { 23 | return reject(err); 24 | } 25 | resolve(appRootFolder); 26 | }); 27 | }); 28 | } 29 | 30 | function getAppRootFolder() { 31 | return new Promise((resolve, reject) => { 32 | // npm prefix returns the closest parent directory to contain a package.json file 33 | exec('cd .. && npm prefix', (err, stdout) => { 34 | if (err) { 35 | return reject(err); 36 | } 37 | 38 | resolve(stdout.toString().trim()); 39 | }); 40 | }); 41 | } 42 | -------------------------------------------------------------------------------- /home/home.component.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | 9 | 12 | 13 | 16 | 17 | 20 | 21 | 24 | 25 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /chat/messages-area/messages-area.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, 2 | Inject, Input, OnInit } from '@angular/core'; 3 | import { Message, SentStatus } from '../../core'; 4 | 5 | @Component({ 6 | moduleId: module.id, 7 | selector: 'ns-messages-area', 8 | templateUrl: './messages-area.component.html', 9 | styleUrls: ['./messages-area.component.css'], 10 | changeDetection: ChangeDetectionStrategy.OnPush, 11 | }) 12 | export class MessagesAreaComponent implements OnInit { 13 | @Input() messages: Message[]; 14 | 15 | constructor(@Inject('platform') public platform) {} 16 | 17 | ngOnInit() { 18 | this.messages = this.messages.slice(0, 50); 19 | } 20 | 21 | isContinuation(idx: number) { 22 | return (!this.messages[idx].sender && this.messages[idx - 1] && 23 | !this.messages[idx - 1].sender) || 24 | (this.messages[idx].sender && this.messages[idx - 1] && 25 | this.messages[idx - 1].sender); 26 | } 27 | 28 | getIcon(message: Message) { 29 | switch (message.sent) { 30 | case SentStatus.NOT_SENT: 31 | return 'mdi-access-time'; 32 | case SentStatus.SENT: 33 | return 'mdi-done'; 34 | default: 35 | return 'mdi-done-all'; 36 | } 37 | } 38 | 39 | isViewed(message: Message) { 40 | return message.sent === SentStatus.VIEWED; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /chat/message-box/message-box.component.html: -------------------------------------------------------------------------------- 1 | 2 | 6 | 13 | 18 | 23 | 28 | 32 | 33 | 38 | 47 | -------------------------------------------------------------------------------- /chat/chat.component.ts: -------------------------------------------------------------------------------- 1 | import { ChangeDetectionStrategy, Component, 2 | Inject, OnInit } from '@angular/core'; 3 | import { ActivatedRoute } from '@angular/router'; 4 | import { RouterExtensions } from 'nativescript-angular/router'; 5 | 6 | import { Chat, ChatsService } from '../core'; 7 | import {Message} from '../core/models/message.model'; 8 | 9 | @Component({ 10 | moduleId: module.id, 11 | selector: 'ns-chat', 12 | templateUrl: './chat.component.html', 13 | styleUrls: ['./chat.component.css'], 14 | changeDetection: ChangeDetectionStrategy.OnPush, 15 | }) 16 | export class ChatComponent implements OnInit { 17 | chatIndex: number; 18 | chat: Chat; 19 | unread: number; 20 | messages: Message[]; 21 | 22 | constructor( 23 | private route: ActivatedRoute, 24 | private chatsService: ChatsService, 25 | private router: RouterExtensions, 26 | @Inject('platform') public platform, 27 | ) { 28 | } 29 | 30 | ngOnInit() { 31 | this.route.params.subscribe((params) => { 32 | this.chatIndex = +params.index; 33 | this.chat = this.chatsService.chats[this.chatIndex]; 34 | }); 35 | this.route.queryParams.subscribe((params) => { 36 | this.unread = +params.unread; 37 | }); 38 | this.getMessages(); 39 | } 40 | 41 | getMessages() { 42 | this.messages = this.chatsService.getMessages(this.chat); 43 | } 44 | 45 | goBack() { 46 | this.router.back(); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /chat/messages-area/messages-area.component.css: -------------------------------------------------------------------------------- 1 | .messages-area{width:100%}.messages-area .messages{flex-direction:column;align-items:flex-start;padding:0 10 5 10}.messages-area .messages .message-bubble{margin:10 15 2 0;padding:0}.messages-area .messages .message-bubble.myself{align-self:flex-end;margin-right:0;margin-left:15}.messages-area .messages .message-bubble.myself .message-bubble-content{background-color:#dcf8c6}.messages-area .messages .message-bubble.continuation{margin-top:1}.messages-area .messages .message-bubble .message-bubble-content{align-items:flex-start;flex-wrap:wrap;justify-content:flex-end;border-radius:8;background-color:white}.messages-area .messages .message-bubble .message-bubble-content .message-text{color:#8D1B1B;font-size:15;margin:5}.messages-area .messages .message-bubble .message-bubble-content .meta{align-self:flex-end;justify-content:flex-end;margin:0 5 5 5}.messages-area .messages .message-bubble .message-bubble-content .meta .time{font-size:13;opacity:.7;margin-right:5}.messages-area .messages .message-bubble .message-bubble-content .meta .time.ios{font-size:11;opacity:.4}.messages-area .messages .message-bubble .message-bubble-content .meta .check{font-size:14;padding-top:2;margin-left:-4}.messages-area .messages .message-bubble .message-bubble-content .meta .check.ios{opacity:.6}.messages-area .messages .message-bubble .message-bubble-content .meta .check.blue{color:#52c5f7}.messages-area .messages .message-bubble .message-bubble-content .meta .check.blue.ios{color:#2F97F3;opacity:1} 2 | -------------------------------------------------------------------------------- /App_Resources/Android/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 12 | 13 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /core/models/message.model.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var Message = (function () { 4 | function Message() { 5 | this.text = ''; 6 | this.created = Date.now(); 7 | } 8 | Message.prototype.toString = function () { 9 | var _a = this, created = _a.created, text = _a.text; 10 | return "Message created at: " + created + " - Text: " + text; 11 | }; 12 | return Message; 13 | }()); 14 | exports.Message = Message; 15 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm1lc3NhZ2UubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFJQTtJQUFBO1FBRUUsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUdULFlBQU8sR0FBVyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFPeEMsQ0FBQztJQUpDLDBCQUFRLEdBQVI7UUFDUSxJQUFBLFNBQXdCLEVBQXRCLG9CQUFPLEVBQUUsY0FBSSxDQUFVO1FBQy9CLE1BQU0sQ0FBQyx5QkFBdUIsT0FBTyxpQkFBWSxJQUFNLENBQUM7SUFDMUQsQ0FBQztJQUNILGNBQUM7QUFBRCxDQUFDLEFBWkQsSUFZQztBQVpZLDBCQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdCB9IGZyb20gJy4vY2hhdC5tb2RlbCc7XG5pbXBvcnQgeyBDb250YWN0IH0gZnJvbSAnLi9jb250YWN0Lm1vZGVsJztcbmltcG9ydCB7IFNlbnRTdGF0dXMgfSBmcm9tICcuL3NlbnQtc3RhdHVzLm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIE1lc3NhZ2Uge1xuICBpZD86IG51bWJlcjtcbiAgdGV4dDogc3RyaW5nID0gJyc7XG4gIGNoYXQ6IENoYXQ7XG4gIHNlbmRlcjogQ29udGFjdDtcbiAgcmVhZG9ubHkgY3JlYXRlZDogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgc2VudDogU2VudFN0YXR1cztcblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHsgY3JlYXRlZCwgdGV4dCB9ID0gdGhpcztcbiAgICByZXR1cm4gYE1lc3NhZ2UgY3JlYXRlZCBhdDogJHtjcmVhdGVkfSAtIFRleHQ6ICR7dGV4dH1gO1xuICB9XG59XG4iXX0= -------------------------------------------------------------------------------- /App_Resources/iOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiresFullScreen 28 | 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /core/core.module.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var nativescript_module_1 = require("nativescript-angular/nativescript.module"); 5 | var chats_service_1 = require("./chats.service"); 6 | var CoreModule = (function () { 7 | function CoreModule() { 8 | } 9 | CoreModule = __decorate([ 10 | core_1.NgModule({ 11 | imports: [ 12 | nativescript_module_1.NativeScriptModule, 13 | ], 14 | declarations: [], 15 | providers: [ 16 | chats_service_1.ChatsService, 17 | ], 18 | }) 19 | ], CoreModule); 20 | return CoreModule; 21 | }()); 22 | exports.CoreModule = CoreModule; 23 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb3JlLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUF5QztBQUN6QyxnRkFBOEU7QUFFOUUsaURBQStDO0FBVy9DO0lBQUE7SUFBMEIsQ0FBQztJQUFkLFVBQVU7UUFUdEIsZUFBUSxDQUFDO1lBQ1IsT0FBTyxFQUFFO2dCQUNQLHdDQUFrQjthQUNuQjtZQUNELFlBQVksRUFBRSxFQUFFO1lBQ2hCLFNBQVMsRUFBRTtnQkFDVCw0QkFBWTthQUNiO1NBQ0YsQ0FBQztPQUNXLFVBQVUsQ0FBSTtJQUFELGlCQUFDO0NBQUEsQUFBM0IsSUFBMkI7QUFBZCxnQ0FBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXRpdmVTY3JpcHRNb2R1bGUgfSBmcm9tICduYXRpdmVzY3JpcHQtYW5ndWxhci9uYXRpdmVzY3JpcHQubW9kdWxlJztcblxuaW1wb3J0IHsgQ2hhdHNTZXJ2aWNlIH0gZnJvbSAnLi9jaGF0cy5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIE5hdGl2ZVNjcmlwdE1vZHVsZSxcbiAgXSxcbiAgZGVjbGFyYXRpb25zOiBbXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAgQ2hhdHNTZXJ2aWNlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb3JlTW9kdWxlIHsgfVxuIl19 -------------------------------------------------------------------------------- /chat/message-box/new-message.component.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var NewMessageComponent = (function () { 5 | function NewMessageComponent() { 6 | } 7 | NewMessageComponent.prototype.ngOnInit = function () { 8 | }; 9 | return NewMessageComponent; 10 | }()); 11 | NewMessageComponent = __decorate([ 12 | core_1.Component({ 13 | moduleId: module.id, 14 | selector: "ns-new-message", 15 | templateUrl: "./new-message.component.html", 16 | styleUrls: ["./new-message.component.css"] 17 | }) 18 | ], NewMessageComponent); 19 | exports.NewMessageComponent = NewMessageComponent; 20 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LW1lc3NhZ2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibmV3LW1lc3NhZ2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQWlFO0FBUWpFLElBQWEsbUJBQW1CO0lBQWhDO0lBSUEsQ0FBQztJQUZDLHNDQUFRLEdBQVI7SUFDQSxDQUFDO0lBQ0gsMEJBQUM7QUFBRCxDQUFDLEFBSkQsSUFJQztBQUpZLG1CQUFtQjtJQU4vQixnQkFBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1FBQ25CLFFBQVEsRUFBRSxnQkFBZ0I7UUFDMUIsV0FBVyxFQUFFLDhCQUE4QjtRQUMzQyxTQUFTLEVBQUUsQ0FBQyw2QkFBNkIsQ0FBQztLQUMzQyxDQUFDO0dBQ1csbUJBQW1CLENBSS9CO0FBSlksa0RBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIEluamVjdCwgSW5wdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6IFwibnMtbmV3LW1lc3NhZ2VcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9uZXctbWVzc2FnZS5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFtcIi4vbmV3LW1lc3NhZ2UuY29tcG9uZW50LmNzc1wiXVxufSlcbmV4cG9ydCBjbGFzcyBOZXdNZXNzYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxufSJdfQ== -------------------------------------------------------------------------------- /chat/messages-area/messages-area.component.scss: -------------------------------------------------------------------------------- 1 | .messages-area { 2 | width: 100%; 3 | 4 | .messages { 5 | flex-direction: column; 6 | align-items: flex-start; 7 | padding: 0 10 5 10; 8 | 9 | .message-bubble { 10 | margin: 10 15 2 0; 11 | padding: 0; 12 | 13 | &.myself { 14 | align-self: flex-end; 15 | margin-right: 0; 16 | margin-left: 15; 17 | 18 | .message-bubble-content { 19 | background-color: #dcf8c6; 20 | } 21 | } 22 | 23 | &.continuation { 24 | margin-top: 1; 25 | } 26 | 27 | .message-bubble-content { 28 | align-items: flex-start; 29 | flex-wrap: wrap; 30 | justify-content: flex-end; 31 | border-radius: 8; 32 | background-color: white; 33 | 34 | .message-text { 35 | color: #8D1B1B; 36 | font-size: 15; 37 | margin: 5; 38 | } 39 | 40 | .meta{ 41 | align-self: flex-end; 42 | justify-content: flex-end; 43 | margin: 0 5 5 5; 44 | 45 | .time { 46 | font-size: 13; 47 | opacity: .7; 48 | margin-right: 5; 49 | &.ios { 50 | font-size: 11; 51 | opacity: .4; 52 | } 53 | } 54 | 55 | .check { 56 | font-size: 14; 57 | padding-top: 2; 58 | margin-left: -4; 59 | 60 | &.ios { 61 | opacity: .6; 62 | } 63 | 64 | &.blue { 65 | color: #52c5f7; 66 | &.ios { 67 | color: #2F97F3; 68 | opacity: 1; 69 | } 70 | } 71 | } 72 | } 73 | } 74 | } 75 | } 76 | } -------------------------------------------------------------------------------- /home/home.component.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var HomeComponent = (function () { 5 | function HomeComponent(platform) { 6 | this.platform = platform; 7 | } 8 | HomeComponent = __decorate([ 9 | core_1.Component({ 10 | moduleId: module.id, 11 | selector: 'ns-home', 12 | templateUrl: './home.component.html', 13 | styleUrls: ['./home.component.css'], 14 | }), 15 | __param(0, core_1.Inject('platform')), 16 | __metadata("design:paramtypes", [Object]) 17 | ], HomeComponent); 18 | return HomeComponent; 19 | }()); 20 | exports.HomeComponent = HomeComponent; 21 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJob21lLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUEwRDtBQVExRDtJQUNFLHVCQUM2QixRQUFRO1FBQVIsYUFBUSxHQUFSLFFBQVEsQ0FBQTtJQUNsQyxDQUFDO0lBSE8sYUFBYTtRQU56QixnQkFBUyxDQUFDO1lBQ1AsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ25CLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFdBQVcsRUFBRSx1QkFBdUI7WUFDcEMsU0FBUyxFQUFFLENBQUMsc0JBQXNCLENBQUM7U0FDdEMsQ0FBQztRQUdHLFdBQUEsYUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBOztPQUZWLGFBQWEsQ0FJekI7SUFBRCxvQkFBQztDQUFBLEFBSkQsSUFJQztBQUpZLHNDQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICAgIHNlbGVjdG9yOiAnbnMtaG9tZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2hvbWUuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2hvbWUuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBIb21lQ29tcG9uZW50IHtcbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgncGxhdGZvcm0nKSBwdWJsaWMgcGxhdGZvcm0sXG4gICkge31cbn1cbiJdfQ== -------------------------------------------------------------------------------- /core/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_module_1 = require("./core.module"); 4 | exports.CoreModule = core_module_1.CoreModule; 5 | var chats_service_1 = require("./chats.service"); 6 | exports.ChatsService = chats_service_1.ChatsService; 7 | var message_model_1 = require("./models/message.model"); 8 | exports.Message = message_model_1.Message; 9 | var image_message_model_1 = require("./models/image-message.model"); 10 | exports.ImageMessage = image_message_model_1.ImageMessage; 11 | var chat_model_1 = require("./models/chat.model"); 12 | exports.Chat = chat_model_1.Chat; 13 | var contact_model_1 = require("./models/contact.model"); 14 | exports.Contact = contact_model_1.Contact; 15 | var sent_status_model_1 = require("./models/sent-status.model"); 16 | exports.SentStatus = sent_status_model_1.SentStatus; 17 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUEyQztBQUFsQyxtQ0FBQSxVQUFVLENBQUE7QUFDbkIsaURBQStDO0FBQXRDLHVDQUFBLFlBQVksQ0FBQTtBQUVyQix3REFBaUQ7QUFBeEMsa0NBQUEsT0FBTyxDQUFBO0FBQ2hCLG9FQUE0RDtBQUFuRCw2Q0FBQSxZQUFZLENBQUE7QUFDckIsa0RBQTJDO0FBQWxDLDRCQUFBLElBQUksQ0FBQTtBQUNiLHdEQUFpRDtBQUF4QyxrQ0FBQSxPQUFPLENBQUE7QUFDaEIsZ0VBQXdEO0FBQS9DLHlDQUFBLFVBQVUsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENvcmVNb2R1bGUgfSBmcm9tICcuL2NvcmUubW9kdWxlJztcbmV4cG9ydCB7IENoYXRzU2VydmljZSB9IGZyb20gJy4vY2hhdHMuc2VydmljZSc7XG5cbmV4cG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL21vZGVscy9tZXNzYWdlLm1vZGVsJztcbmV4cG9ydCB7IEltYWdlTWVzc2FnZSB9IGZyb20gJy4vbW9kZWxzL2ltYWdlLW1lc3NhZ2UubW9kZWwnO1xuZXhwb3J0IHsgQ2hhdCB9IGZyb20gJy4vbW9kZWxzL2NoYXQubW9kZWwnO1xuZXhwb3J0IHsgQ29udGFjdCB9IGZyb20gJy4vbW9kZWxzL2NvbnRhY3QubW9kZWwnO1xuZXhwb3J0IHsgU2VudFN0YXR1cyB9IGZyb20gJy4vbW9kZWxzL3NlbnQtc3RhdHVzLm1vZGVsJztcbiJdfQ== -------------------------------------------------------------------------------- /chat/message-box/message-box.component.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var MessageBoxComponent = (function () { 5 | function MessageBoxComponent(platform) { 6 | this.platform = platform; 7 | } 8 | MessageBoxComponent = __decorate([ 9 | core_1.Component({ 10 | moduleId: module.id, 11 | selector: 'ns-message-box', 12 | templateUrl: './message-box.component.html', 13 | styleUrls: ['./message-box.component.css'], 14 | }), 15 | __param(0, core_1.Inject('platform')), 16 | __metadata("design:paramtypes", [Object]) 17 | ], MessageBoxComponent); 18 | return MessageBoxComponent; 19 | }()); 20 | exports.MessageBoxComponent = MessageBoxComponent; 21 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS1ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibWVzc2FnZS1ib3guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXlEO0FBUXpEO0lBQ0UsNkJBQXVDLFFBQVE7UUFBUixhQUFRLEdBQVIsUUFBUSxDQUFBO0lBQUcsQ0FBQztJQUR4QyxtQkFBbUI7UUFOL0IsZ0JBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNuQixRQUFRLEVBQUUsZ0JBQWdCO1lBQzFCLFdBQVcsRUFBRSw4QkFBOEI7WUFDM0MsU0FBUyxFQUFFLENBQUMsNkJBQTZCLENBQUM7U0FDM0MsQ0FBQztRQUVhLFdBQUEsYUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBOztPQURwQixtQkFBbUIsQ0FFL0I7SUFBRCwwQkFBQztDQUFBLEFBRkQsSUFFQztBQUZZLGtEQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgbW9kdWxlSWQ6IG1vZHVsZS5pZCxcbiAgc2VsZWN0b3I6ICducy1tZXNzYWdlLWJveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXNzYWdlLWJveC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21lc3NhZ2UtYm94LmNvbXBvbmVudC5jc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZUJveENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoJ3BsYXRmb3JtJykgcHVibGljIHBsYXRmb3JtKSB7fVxufVxuIl19 -------------------------------------------------------------------------------- /App_Resources/Android/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 18 | 19 | 21 | 22 | 23 | 32 | 33 | 35 | 36 | 37 | 43 | 44 | 46 | 47 | -------------------------------------------------------------------------------- /core/models/image-message.model.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var message_model_1 = require("./message.model"); 4 | var ImageMessage = (function (_super) { 5 | __extends(ImageMessage, _super); 6 | function ImageMessage() { 7 | var _this = _super !== null && _super.apply(this, arguments) || this; 8 | _this.url = ''; 9 | _this.thumbnail = ''; 10 | return _this; 11 | } 12 | /** 13 | * Method overriden 14 | * @returns String 15 | */ 16 | ImageMessage.prototype.toString = function () { 17 | return "Photo" + _super.prototype.toString.call(this) + " " + 18 | ("- Url: " + this.url + " ") + 19 | ("- Thumbnail: " + this.thumbnail); 20 | }; 21 | return ImageMessage; 22 | }(message_model_1.Message)); 23 | exports.ImageMessage = ImageMessage; 24 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtbWVzc2FnZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImltYWdlLW1lc3NhZ2UubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpREFBMEM7QUFFMUM7SUFBa0MsZ0NBQU87SUFBekM7UUFBQSxxRUFhQztRQVpDLFNBQUcsR0FBVyxFQUFFLENBQUM7UUFDakIsZUFBUyxHQUFXLEVBQUUsQ0FBQzs7SUFXekIsQ0FBQztJQVRDOzs7T0FHRztJQUNILCtCQUFRLEdBQVI7UUFDRSxNQUFNLENBQUMsVUFBUSxpQkFBTSxRQUFRLFdBQUUsTUFBRzthQUMzQixZQUFVLElBQUksQ0FBQyxHQUFHLE1BQUcsQ0FBQTthQUNyQixrQkFBZ0IsSUFBSSxDQUFDLFNBQVcsQ0FBQSxDQUFDO0lBQzFDLENBQUM7SUFDSCxtQkFBQztBQUFELENBQUMsQUFiRCxDQUFrQyx1QkFBTyxHQWF4QztBQWJZLG9DQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vbWVzc2FnZS5tb2RlbCc7XG5cbmV4cG9ydCBjbGFzcyBJbWFnZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgdXJsOiBzdHJpbmcgPSAnJztcbiAgdGh1bWJuYWlsOiBzdHJpbmcgPSAnJztcblxuICAvKipcbiAgICogTWV0aG9kIG92ZXJyaWRlblxuICAgKiBAcmV0dXJucyBTdHJpbmdcbiAgICovXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBQaG90byR7c3VwZXIudG9TdHJpbmcoKX0gYCArXG4gICAgICAgICAgIGAtIFVybDogJHt0aGlzLnVybH0gYCArXG4gICAgICAgICAgIGAtIFRodW1ibmFpbDogJHt0aGlzLnRodW1ibmFpbH1gO1xuICB9XG59XG4iXX0= -------------------------------------------------------------------------------- /chat/chat-routing.module.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var router_1 = require("nativescript-angular/router"); 5 | var chat_component_1 = require("./chat.component"); 6 | var routes = [ 7 | { path: '', component: chat_component_1.ChatComponent }, 8 | ]; 9 | var ChatRoutingModule = (function () { 10 | function ChatRoutingModule() { 11 | } 12 | ChatRoutingModule = __decorate([ 13 | core_1.NgModule({ 14 | imports: [router_1.NativeScriptRouterModule.forChild(routes)], 15 | exports: [router_1.NativeScriptRouterModule], 16 | }) 17 | ], ChatRoutingModule); 18 | return ChatRoutingModule; 19 | }()); 20 | exports.ChatRoutingModule = ChatRoutingModule; 21 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1yb3V0aW5nLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoYXQtcm91dGluZy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBeUM7QUFFekMsc0RBQXVFO0FBRXZFLG1EQUFpRDtBQUVqRCxJQUFNLE1BQU0sR0FBVztJQUNyQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLDhCQUFhLEVBQUU7Q0FDdkMsQ0FBQztBQU1GO0lBQUE7SUFBaUMsQ0FBQztJQUFyQixpQkFBaUI7UUFKN0IsZUFBUSxDQUFDO1lBQ1IsT0FBTyxFQUFFLENBQUMsaUNBQXdCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sRUFBRSxDQUFDLGlDQUF3QixDQUFDO1NBQ3BDLENBQUM7T0FDVyxpQkFBaUIsQ0FBSTtJQUFELHdCQUFDO0NBQUEsQUFBbEMsSUFBa0M7QUFBckIsOENBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOYXRpdmVTY3JpcHRSb3V0ZXJNb2R1bGUgfSBmcm9tICduYXRpdmVzY3JpcHQtYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBDaGF0Q29tcG9uZW50IH0gZnJvbSAnLi9jaGF0LmNvbXBvbmVudCc7XG5cbmNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICB7IHBhdGg6ICcnLCBjb21wb25lbnQ6IENoYXRDb21wb25lbnQgfSxcbl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtOYXRpdmVTY3JpcHRSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQocm91dGVzKV0sXG4gIGV4cG9ydHM6IFtOYXRpdmVTY3JpcHRSb3V0ZXJNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGF0Um91dGluZ01vZHVsZSB7IH1cbiJdfQ== -------------------------------------------------------------------------------- /home/home-routing.module.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var router_1 = require("nativescript-angular/router"); 5 | var home_component_1 = require("./home.component"); 6 | var routes = [ 7 | { path: '', component: home_component_1.HomeComponent }, 8 | ]; 9 | var HomeRoutingModule = (function () { 10 | function HomeRoutingModule() { 11 | } 12 | HomeRoutingModule = __decorate([ 13 | core_1.NgModule({ 14 | imports: [router_1.NativeScriptRouterModule.forChild(routes)], 15 | exports: [router_1.NativeScriptRouterModule], 16 | }) 17 | ], HomeRoutingModule); 18 | return HomeRoutingModule; 19 | }()); 20 | exports.HomeRoutingModule = HomeRoutingModule; 21 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS1yb3V0aW5nLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImhvbWUtcm91dGluZy5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBeUM7QUFFekMsc0RBQXVFO0FBRXZFLG1EQUFpRDtBQUVqRCxJQUFNLE1BQU0sR0FBVztJQUNyQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLDhCQUFhLEVBQUU7Q0FDdkMsQ0FBQztBQU1GO0lBQUE7SUFBaUMsQ0FBQztJQUFyQixpQkFBaUI7UUFKN0IsZUFBUSxDQUFDO1lBQ1IsT0FBTyxFQUFFLENBQUMsaUNBQXdCLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3BELE9BQU8sRUFBRSxDQUFDLGlDQUF3QixDQUFDO1NBQ3BDLENBQUM7T0FDVyxpQkFBaUIsQ0FBSTtJQUFELHdCQUFDO0NBQUEsQUFBbEMsSUFBa0M7QUFBckIsOENBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJvdXRlcyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBOYXRpdmVTY3JpcHRSb3V0ZXJNb2R1bGUgfSBmcm9tICduYXRpdmVzY3JpcHQtYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBIb21lQ29tcG9uZW50IH0gZnJvbSAnLi9ob21lLmNvbXBvbmVudCc7XG5cbmNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICB7IHBhdGg6ICcnLCBjb21wb25lbnQ6IEhvbWVDb21wb25lbnQgfSxcbl07XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtOYXRpdmVTY3JpcHRSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQocm91dGVzKV0sXG4gIGV4cG9ydHM6IFtOYXRpdmVTY3JpcHRSb3V0ZXJNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBIb21lUm91dGluZ01vZHVsZSB7IH1cbiJdfQ== -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nativescript-whatsapp-template", 3 | "version": "1.0.1", 4 | "main": "main.js", 5 | "scripts": { 6 | "tslint": "tslint", 7 | "preinstall": "node tools/preinstall.js", 8 | "postinstall": "node tools/postinstall.js" 9 | }, 10 | "description": "NativeScript Template Similar to WhatsApp", 11 | "author": { 12 | "name": "Jose Berardo Cunha", 13 | "email": "josebeardo@gmail.com" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "https://github.com/Especializa/nativescript-whatsapp-template.git" 18 | }, 19 | "bugs": { 20 | "url": "https://github.com/Especializa/nativescript-whatsapp-template/issues" 21 | }, 22 | "license": "Apache-2.0", 23 | "homepage": "https://github.com/Especializa/nativescript-whatsapp-template", 24 | "android": { 25 | "v8Flags": "--expose_gc" 26 | }, 27 | "readmeFilename": "README.md", 28 | "nativescript": { 29 | "id": "br.com.especializa.nativesapp", 30 | "tns-android": { 31 | "version": "3.2.0" 32 | }, 33 | "tns-ios": { 34 | "version": "3.2.0" 35 | } 36 | }, 37 | "dependencies": { 38 | "@angular/animations": "~4.3.6", 39 | "@angular/common": "~4.3.6", 40 | "@angular/compiler": "~4.3.6", 41 | "@angular/core": "~4.3.6", 42 | "@angular/forms": "~4.3.6", 43 | "@angular/http": "~4.3.6", 44 | "@angular/platform-browser": "~4.3.6", 45 | "@angular/router": "~4.3.6", 46 | "date-fns": "^1.28.5", 47 | "nativescript-angular": "~4.2.0", 48 | "nativescript-floatingactionbutton": "^4.1.0", 49 | "nativescript-material-icons": "^1.0.3", 50 | "nativescript-ng-shadow": "^1.1.2", 51 | "nativescript-ngx-fonticon": "^2.2.3", 52 | "nativescript-ripple": "^2.0.0", 53 | "nativescript-theme-core": "~1.0.4", 54 | "reflect-metadata": "~0.1.10", 55 | "rxjs": "~5.4.3", 56 | "sass-loader": "^6.0.6", 57 | "tns-core-modules": "^3.1.1", 58 | "zone.js": "~0.8.17" 59 | }, 60 | "devDependencies": { 61 | "babel-traverse": "6.25.0", 62 | "babel-types": "6.25.0", 63 | "babylon": "6.17.4", 64 | "codelyzer": "^3.2.0", 65 | "lazy": "1.0.11", 66 | "nativescript-css-loader": "~0.26.0", 67 | "nativescript-dev-sass": "^1.3.0", 68 | "nativescript-dev-typescript": "~0.5.0", 69 | "tslint": "^5.7.0", 70 | "typescript": "~2.4.1" 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app-routing.module.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var router_1 = require("nativescript-angular/router"); 5 | var routes = [ 6 | { path: '', redirectTo: '/home', pathMatch: 'full' }, 7 | { path: 'home', loadChildren: './home/home.module#HomeModule' }, 8 | { path: 'chat/:index', loadChildren: './chat/chat.module#ChatModule' }, 9 | ]; 10 | var AppRoutingModule = (function () { 11 | function AppRoutingModule() { 12 | } 13 | AppRoutingModule = __decorate([ 14 | core_1.NgModule({ 15 | imports: [router_1.NativeScriptRouterModule.forRoot(routes)], 16 | exports: [router_1.NativeScriptRouterModule], 17 | }) 18 | ], AppRoutingModule); 19 | return AppRoutingModule; 20 | }()); 21 | exports.AppRoutingModule = AppRoutingModule; 22 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXJvdXRpbmcubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiYXBwLXJvdXRpbmcubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQXlDO0FBRXpDLHNEQUF1RTtBQUV2RSxJQUFNLE1BQU0sR0FBVztJQUNyQixFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFO0lBQ3BELEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsK0JBQStCLEVBQUU7SUFDL0QsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSwrQkFBK0IsRUFBRTtDQUN2RSxDQUFDO0FBTUY7SUFBQTtJQUFnQyxDQUFDO0lBQXBCLGdCQUFnQjtRQUo1QixlQUFRLENBQUM7WUFDUixPQUFPLEVBQUUsQ0FBQyxpQ0FBd0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbkQsT0FBTyxFQUFFLENBQUMsaUNBQXdCLENBQUM7U0FDcEMsQ0FBQztPQUNXLGdCQUFnQixDQUFJO0lBQUQsdUJBQUM7Q0FBQSxBQUFqQyxJQUFpQztBQUFwQiw0Q0FBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUm91dGVzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IE5hdGl2ZVNjcmlwdFJvdXRlck1vZHVsZSB9IGZyb20gJ25hdGl2ZXNjcmlwdC1hbmd1bGFyL3JvdXRlcic7XG5cbmNvbnN0IHJvdXRlczogUm91dGVzID0gW1xuICB7IHBhdGg6ICcnLCByZWRpcmVjdFRvOiAnL2hvbWUnLCBwYXRoTWF0Y2g6ICdmdWxsJyB9LFxuICB7IHBhdGg6ICdob21lJywgbG9hZENoaWxkcmVuOiAnLi9ob21lL2hvbWUubW9kdWxlI0hvbWVNb2R1bGUnIH0sXG4gIHsgcGF0aDogJ2NoYXQvOmluZGV4JywgbG9hZENoaWxkcmVuOiAnLi9jaGF0L2NoYXQubW9kdWxlI0NoYXRNb2R1bGUnIH0sXG5dO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbTmF0aXZlU2NyaXB0Um91dGVyTW9kdWxlLmZvclJvb3Qocm91dGVzKV0sXG4gIGV4cG9ydHM6IFtOYXRpdmVTY3JpcHRSb3V0ZXJNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBSb3V0aW5nTW9kdWxlIHsgfVxuIl19 -------------------------------------------------------------------------------- /chat/chat.component.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 18 | 19 | 22 | 23 | 26 | 27 | 30 | 31 | 34 | 35 | 38 | 39 | 42 | 43 | 46 | 47 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /core/chats.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | 3 | import { Chat } from './models/chat.model'; 4 | import { Message } from './models/message.model'; 5 | import { SentStatus } from './models/sent-status.model'; 6 | 7 | @Injectable() 8 | export class ChatsService { 9 | get chats(): Chat[] { 10 | return Array(200).fill('').map((ele, idx) => ({ 11 | contact: { 12 | avatar: `https://randomuser.me/api/portraits/med/${ 13 | idx % 2 === 0 ? 'women' : 'men' 14 | }/${idx}.jpg`, 15 | // Random names 16 | name: idx % 2 === 0 ? 17 | (['Leeanna Munoz', 'Yolanda Karlin', 'Trish Peer'][idx % 3]) 18 | : (['Chuck Pulver', 'Oscar Blundell', 'Irwin Weathersby'][idx % 3]), 19 | }, 20 | type: 'DIRECT', 21 | when: Date.now() - ((idx + 1) * 40 * 60 * 1000), 22 | muted: idx % 7 === 0, 23 | unread: parseInt(Math.random() * 10 + '', 10) - 3, 24 | // Non-sense phrases 25 | text: [ 26 | '\u263A Yay, this course is amazing !!! \u270C', 27 | 'Sixty-four doesn\'t like paying taxes.', 28 | 'A river a thousand paces wide ever stuns the onlooker.', 29 | 'That stolen figurine is often one floor above you.', 30 | '\u263A Yay, this course is amazing !!! \u270C', 31 | 'Spam sat down once more.', 32 | 'Whiskey on the table set a treehouse on fire.', 33 | ][idx % 7], 34 | })); 35 | } 36 | getMessages(chat: Chat): Message[] { 37 | return Array(200).fill('').map((ele, idx) => ({ 38 | // Non-sense phrases 39 | text: [ 40 | '\u263A Yay, this course is amazing !!! \u270C', 41 | 'Sixty-four doesn\'t like paying taxes.', 42 | 'A river a thousand paces wide ever stuns the onlooker.', 43 | 'That stolen figurine is often one floor above you.', 44 | '\u263A Yay, this course is amazing !!! \u270C', 45 | 'Spam sat down once more!', 46 | 'Whiskey on the table set a treehouse on fire.', 47 | 'That memory we used to share stole the goods.', 48 | 'Clear water rains heavily', 49 | 'Style is interdependant on the relatedness of ' + 50 | 'motivation, subcultures, and management', 51 | ][Math.floor(Math.random() * 10)], 52 | chat, 53 | sender: Math.random() > .5 ? chat.contact : null, 54 | created: Date.now() - ((idx + 1) * 40 * 60 * 1000), 55 | sent: Math.floor(4 * Math.random()), 56 | })); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /tools/postinstall.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const path = require('path'); 3 | const exec = require('child_process').exec; 4 | 5 | console.log('postinstall script running...'); 6 | 7 | getPackageJson() 8 | .then(packageJsonData => { 9 | // results of glob parameter expansion can vary depending on shell, and its configuration 10 | // quote the parameter to use node glob syntax (using double quotes if you need it to run in Windows) 11 | addScriptCommand(packageJsonData, { 12 | commandName: 'lint', 13 | command: 'tslint \'app/**/*.ts\'', 14 | message: 'Updating package.json scripts for linting...' 15 | }); 16 | addScriptCommand(packageJsonData, { 17 | commandName: 'lint:fix', 18 | command: 'tslint \'app/**/*.ts\' --fix', 19 | message: 'Updating package.json scripts for linting with auto fix...' 20 | }); 21 | }) 22 | .catch(err => { 23 | console.error(err); 24 | }) 25 | .then(() => { 26 | // Remove tools folder including this script 27 | console.log('Removing tools directory...'); 28 | deleteFolderSync(__dirname); 29 | }); 30 | 31 | function getPackageJson() { 32 | return getAppRootFolder().then(appRootFolder => { 33 | const packageJsonPath = path.join(appRootFolder, 'package.json'); 34 | const packageJson = require(packageJsonPath); 35 | 36 | if (!packageJson) { 37 | throw new Error('package.json file not found'); 38 | } 39 | 40 | return { 41 | packageJson, 42 | packageJsonPath 43 | }; 44 | }); 45 | } 46 | 47 | function getAppRootFolder() { 48 | return new Promise((resolve, reject) => { 49 | // npm prefix returns the closest parent directory to contain a package.json file 50 | exec('cd .. && npm prefix', (err, stdout) => { 51 | if (err) { 52 | return reject(err); 53 | } 54 | 55 | resolve(stdout.toString().trim()); 56 | }); 57 | }); 58 | } 59 | 60 | function addScriptCommand(packageJsonData, options) { 61 | return new Promise((resolve, reject) => { 62 | if (options.message) { 63 | console.log(options.message); 64 | } 65 | 66 | const { packageJson, packageJsonPath } = packageJsonData; 67 | if (!packageJson.scripts) { 68 | packageJson.scripts = {}; 69 | } 70 | 71 | packageJson.scripts[options.commandName] = options.command; 72 | 73 | const updatedContent = JSON.stringify(packageJson); 74 | fs.writeFile(packageJsonPath, updatedContent, err => { 75 | if (err) { 76 | return reject(err); 77 | } 78 | 79 | resolve(); 80 | }); 81 | }); 82 | } 83 | 84 | function deleteFolderSync(folderPath) { 85 | if (fs.statSync(folderPath).isDirectory()) { 86 | fs.readdirSync(folderPath).forEach(file => { 87 | const content = path.join(folderPath, file); 88 | const contentDirs = fs.statSync(content).isDirectory(); 89 | 90 | if (contentDirs) { 91 | deleteFolderSync(content); 92 | } else { 93 | fs.unlinkSync(content); 94 | } 95 | }); 96 | 97 | fs.rmdirSync(folderPath); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "29x29", 5 | "idiom" : "iphone", 6 | "filename" : "icon-29.png", 7 | "scale" : "1x" 8 | }, 9 | { 10 | "size" : "29x29", 11 | "idiom" : "iphone", 12 | "filename" : "icon-29@2x.png", 13 | "scale" : "2x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "icon-29@3x.png", 19 | "scale" : "3x" 20 | }, 21 | { 22 | "size" : "40x40", 23 | "idiom" : "iphone", 24 | "filename" : "icon-40@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "40x40", 29 | "idiom" : "iphone", 30 | "filename" : "icon-40@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "57x57", 35 | "idiom" : "iphone", 36 | "filename" : "icon-57.png", 37 | "scale" : "1x" 38 | }, 39 | { 40 | "size" : "57x57", 41 | "idiom" : "iphone", 42 | "filename" : "icon-57@2x.png", 43 | "scale" : "2x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "icon-60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "icon-60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "29x29", 59 | "idiom" : "ipad", 60 | "filename" : "icon-29.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "29x29", 65 | "idiom" : "ipad", 66 | "filename" : "icon-29@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "40x40", 71 | "idiom" : "ipad", 72 | "filename" : "icon-40.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "40x40", 77 | "idiom" : "ipad", 78 | "filename" : "icon-40@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "50x50", 83 | "idiom" : "ipad", 84 | "filename" : "icon-50.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "50x50", 89 | "idiom" : "ipad", 90 | "filename" : "icon-50@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "72x72", 95 | "idiom" : "ipad", 96 | "filename" : "icon-72.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "72x72", 101 | "idiom" : "ipad", 102 | "filename" : "icon-72@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "76x76", 107 | "idiom" : "ipad", 108 | "filename" : "icon-76.png", 109 | "scale" : "1x" 110 | }, 111 | { 112 | "size" : "76x76", 113 | "idiom" : "ipad", 114 | "filename" : "icon-76@2x.png", 115 | "scale" : "2x" 116 | }, 117 | { 118 | "size" : "83.5x83.5", 119 | "idiom" : "ipad", 120 | "filename" : "icon-83.5@2x.png", 121 | "scale" : "2x" 122 | } 123 | ], 124 | "info" : { 125 | "version" : 1, 126 | "author" : "xcode" 127 | } 128 | } -------------------------------------------------------------------------------- /home/chats/chats.component.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var router_1 = require("nativescript-angular/router"); 5 | var core_2 = require("../../core"); 6 | var ChatsComponent = (function () { 7 | function ChatsComponent(chatsService, routerExtensions) { 8 | this.routerExtensions = routerExtensions; 9 | this.chats = []; 10 | this.chats = chatsService.chats; 11 | } 12 | ChatsComponent.prototype.goToChat = function (args) { 13 | var extras = { 14 | queryParams: { 15 | unread: 2, 16 | }, 17 | }; 18 | this.routerExtensions.navigate([ 19 | 'chat', 20 | args.index, 21 | ], extras); 22 | }; 23 | ChatsComponent = __decorate([ 24 | core_1.Component({ 25 | moduleId: module.id, 26 | selector: 'ns-chats', 27 | templateUrl: './chats.component.html', 28 | styleUrls: ['./chats.component.css'], 29 | }), 30 | __metadata("design:paramtypes", [core_2.ChatsService, 31 | router_1.RouterExtensions]) 32 | ], ChatsComponent); 33 | return ChatsComponent; 34 | }()); 35 | exports.ChatsComponent = ChatsComponent; 36 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2hhdHMuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBQWtEO0FBRWxELHNEQUErRDtBQUUvRCxtQ0FBMEM7QUFRMUM7SUFFRSx3QkFDRSxZQUEwQixFQUNsQixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUg1QyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBS1QsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxpQ0FBUSxHQUFSLFVBQVMsSUFBSTtRQUNYLElBQU0sTUFBTSxHQUFxQjtZQUMvQixXQUFXLEVBQUU7Z0JBQ1gsTUFBTSxFQUFFLENBQUM7YUFDVjtTQUNGLENBQUM7UUFDRixJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDO1lBQzdCLE1BQU07WUFDTixJQUFJLENBQUMsS0FBSztTQUNYLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDYixDQUFDO0lBbkJVLGNBQWM7UUFOMUIsZ0JBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNuQixRQUFRLEVBQUUsVUFBVTtZQUNwQixXQUFXLEVBQUUsd0JBQXdCO1lBQ3JDLFNBQVMsRUFBRSxDQUFDLHVCQUF1QixDQUFDO1NBQ3JDLENBQUM7eUNBSWdCLG1CQUFZO1lBQ0EseUJBQWdCO09BSmpDLGNBQWMsQ0FvQjFCO0lBQUQscUJBQUM7Q0FBQSxBQXBCRCxJQW9CQztBQXBCWSx3Q0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uRXh0cmFzIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IFJvdXRlckV4dGVuc2lvbnMgfSBmcm9tICduYXRpdmVzY3JpcHQtYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBDaGF0c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiAnbnMtY2hhdHMnLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hhdHMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jaGF0cy5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENoYXRzQ29tcG9uZW50IHtcbiAgY2hhdHMgPSBbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgY2hhdHNTZXJ2aWNlOiBDaGF0c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXJFeHRlbnNpb25zOiBSb3V0ZXJFeHRlbnNpb25zLFxuICApIHtcbiAgICB0aGlzLmNoYXRzID0gY2hhdHNTZXJ2aWNlLmNoYXRzO1xuICB9XG5cbiAgZ29Ub0NoYXQoYXJncykge1xuICAgIGNvbnN0IGV4dHJhczogTmF2aWdhdGlvbkV4dHJhcyA9IHtcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7XG4gICAgICAgIHVucmVhZDogMixcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLnJvdXRlckV4dGVuc2lvbnMubmF2aWdhdGUoW1xuICAgICAgJ2NoYXQnLFxuICAgICAgYXJncy5pbmRleCxcbiAgICBdLCBleHRyYXMpO1xuICB9XG59XG4iXX0= -------------------------------------------------------------------------------- /home/home.module.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var forms_1 = require("nativescript-angular/forms"); 5 | var nativescript_module_1 = require("nativescript-angular/nativescript.module"); 6 | var nativescript_ngx_fonticon_1 = require("nativescript-ngx-fonticon"); 7 | var chats_component_1 = require("./chats/chats.component"); 8 | var short_when_pipe_1 = require("./chats/short-when.pipe"); 9 | var home_routing_module_1 = require("./home-routing.module"); 10 | var home_component_1 = require("./home.component"); 11 | var tabs_component_1 = require("./tabs/tabs.component"); 12 | var HomeModule = (function () { 13 | function HomeModule() { 14 | } 15 | HomeModule = __decorate([ 16 | core_1.NgModule({ 17 | imports: [ 18 | nativescript_module_1.NativeScriptModule, 19 | forms_1.NativeScriptFormsModule, 20 | home_routing_module_1.HomeRoutingModule, 21 | nativescript_ngx_fonticon_1.TNSFontIconModule.forRoot({ 22 | mdi: 'material-design-icons.css', 23 | }), 24 | ], 25 | declarations: [ 26 | home_component_1.HomeComponent, 27 | tabs_component_1.TabsComponent, 28 | chats_component_1.ChatsComponent, 29 | short_when_pipe_1.ShortWhenPipe, 30 | ], 31 | schemas: [ 32 | core_1.NO_ERRORS_SCHEMA, 33 | ], 34 | }) 35 | ], HomeModule); 36 | return HomeModule; 37 | }()); 38 | exports.HomeModule = HomeModule; 39 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG9tZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJob21lLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUEyRDtBQUMzRCxvREFBcUU7QUFDckUsZ0ZBQThFO0FBQzlFLHVFQUE4RDtBQUU5RCwyREFBeUQ7QUFDekQsMkRBQXdEO0FBQ3hELDZEQUEwRDtBQUMxRCxtREFBaUQ7QUFDakQsd0RBQXNEO0FBcUJ0RDtJQUFBO0lBQTBCLENBQUM7SUFBZCxVQUFVO1FBbkJ0QixlQUFRLENBQUM7WUFDUixPQUFPLEVBQUU7Z0JBQ1Asd0NBQWtCO2dCQUNsQiwrQkFBdUI7Z0JBQ3ZCLHVDQUFpQjtnQkFDakIsNkNBQWlCLENBQUMsT0FBTyxDQUFDO29CQUN4QixHQUFHLEVBQUUsMkJBQTJCO2lCQUNqQyxDQUFDO2FBQ0g7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osOEJBQWE7Z0JBQ2IsOEJBQWE7Z0JBQ2IsZ0NBQWM7Z0JBQ2QsK0JBQWE7YUFDZDtZQUNELE9BQU8sRUFBRTtnQkFDUCx1QkFBZ0I7YUFDakI7U0FDRixDQUFDO09BQ1csVUFBVSxDQUFJO0lBQUQsaUJBQUM7Q0FBQSxBQUEzQixJQUEyQjtBQUFkLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUsIE5PX0VSUk9SU19TQ0hFTUEgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5hdGl2ZVNjcmlwdEZvcm1zTW9kdWxlIH0gZnJvbSAnbmF0aXZlc2NyaXB0LWFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmF0aXZlU2NyaXB0TW9kdWxlIH0gZnJvbSAnbmF0aXZlc2NyaXB0LWFuZ3VsYXIvbmF0aXZlc2NyaXB0Lm1vZHVsZSc7XG5pbXBvcnQgeyBUTlNGb250SWNvbk1vZHVsZSB9IGZyb20gJ25hdGl2ZXNjcmlwdC1uZ3gtZm9udGljb24nO1xuXG5pbXBvcnQgeyBDaGF0c0NvbXBvbmVudCB9IGZyb20gJy4vY2hhdHMvY2hhdHMuY29tcG9uZW50JztcbmltcG9ydCB7IFNob3J0V2hlblBpcGUgfSBmcm9tICcuL2NoYXRzL3Nob3J0LXdoZW4ucGlwZSc7XG5pbXBvcnQgeyBIb21lUm91dGluZ01vZHVsZSB9IGZyb20gJy4vaG9tZS1yb3V0aW5nLm1vZHVsZSc7XG5pbXBvcnQgeyBIb21lQ29tcG9uZW50IH0gZnJvbSAnLi9ob21lLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWJzQ29tcG9uZW50IH0gZnJvbSAnLi90YWJzL3RhYnMuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW1xuICAgIE5hdGl2ZVNjcmlwdE1vZHVsZSxcbiAgICBOYXRpdmVTY3JpcHRGb3Jtc01vZHVsZSxcbiAgICBIb21lUm91dGluZ01vZHVsZSxcbiAgICBUTlNGb250SWNvbk1vZHVsZS5mb3JSb290KHtcbiAgICAgIG1kaTogJ21hdGVyaWFsLWRlc2lnbi1pY29ucy5jc3MnLFxuICAgIH0pLFxuICBdLFxuICBkZWNsYXJhdGlvbnM6IFtcbiAgICBIb21lQ29tcG9uZW50LFxuICAgIFRhYnNDb21wb25lbnQsXG4gICAgQ2hhdHNDb21wb25lbnQsXG4gICAgU2hvcnRXaGVuUGlwZSxcbiAgXSxcbiAgc2NoZW1hczogW1xuICAgIE5PX0VSUk9SU19TQ0hFTUEsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEhvbWVNb2R1bGUgeyB9XG4iXX0= -------------------------------------------------------------------------------- /home/chats/short-when.pipe.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var common_1 = require("@angular/common"); 4 | var core_1 = require("@angular/core"); 5 | var platform_1 = require("platform"); 6 | var isToday = require("date-fns/is_today"); 7 | var isYesterday = require("date-fns/is_yesterday"); 8 | var parse = require("date-fns/parse"); 9 | var ShortWhenPipe = (function () { 10 | function ShortWhenPipe() { 11 | } 12 | ShortWhenPipe.prototype.transform = function (value) { 13 | var language = platform_1.device.language; 14 | if (platform_1.device.region) { 15 | language += "-" + platform_1.device.region; 16 | } 17 | var datePipe = new common_1.DatePipe(language); 18 | var parsedDate = parse(value); 19 | if (isToday(parsedDate)) { 20 | return datePipe.transform(parsedDate, 'shortTime'); 21 | } 22 | if (isYesterday(parsedDate)) { 23 | return 'yesterday'; 24 | } 25 | return datePipe.transform(parsedDate, 'shortDate'); 26 | }; 27 | ShortWhenPipe = __decorate([ 28 | core_1.Pipe({ 29 | name: 'shortWhen', 30 | pure: true, 31 | }) 32 | ], ShortWhenPipe); 33 | return ShortWhenPipe; 34 | }()); 35 | exports.ShortWhenPipe = ShortWhenPipe; 36 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hvcnQtd2hlbi5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic2hvcnQtd2hlbi5waXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMENBQTJDO0FBQzNDLHNDQUFvRDtBQUNwRCxxQ0FBa0M7QUFFbEMsMkNBQTZDO0FBQzdDLG1EQUFxRDtBQUNyRCxzQ0FBd0M7QUFNeEM7SUFBQTtJQW9CQSxDQUFDO0lBbEJDLGlDQUFTLEdBQVQsVUFBVSxLQUE2QjtRQUNyQyxJQUFJLFFBQVEsR0FBRyxpQkFBTSxDQUFDLFFBQVEsQ0FBQztRQUMvQixFQUFFLENBQUMsQ0FBQyxpQkFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDbEIsUUFBUSxJQUFJLE1BQUksaUJBQU0sQ0FBQyxNQUFRLENBQUM7UUFDbEMsQ0FBQztRQUNELElBQU0sUUFBUSxHQUFHLElBQUksaUJBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN4QyxJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDckQsQ0FBQztRQUVELEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUIsTUFBTSxDQUFDLFdBQVcsQ0FBQztRQUNyQixDQUFDO1FBRUQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFuQlUsYUFBYTtRQUp6QixXQUFJLENBQUM7WUFDSixJQUFJLEVBQUUsV0FBVztZQUNqQixJQUFJLEVBQUUsSUFBSTtTQUNYLENBQUM7T0FDVyxhQUFhLENBb0J6QjtJQUFELG9CQUFDO0NBQUEsQUFwQkQsSUFvQkM7QUFwQlksc0NBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBQaXBlLCBQaXBlVHJhbnNmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZXZpY2UgfSBmcm9tICdwbGF0Zm9ybSc7XG5cbmltcG9ydCAqIGFzIGlzVG9kYXkgZnJvbSAnZGF0ZS1mbnMvaXNfdG9kYXknO1xuaW1wb3J0ICogYXMgaXNZZXN0ZXJkYXkgZnJvbSAnZGF0ZS1mbnMvaXNfeWVzdGVyZGF5JztcbmltcG9ydCAqIGFzIHBhcnNlIGZyb20gJ2RhdGUtZm5zL3BhcnNlJztcblxuQFBpcGUoe1xuICBuYW1lOiAnc2hvcnRXaGVuJyxcbiAgcHVyZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgU2hvcnRXaGVuUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHRyYW5zZm9ybSh2YWx1ZTogbnVtYmVyIHwgc3RyaW5nIHwgRGF0ZSk6IHN0cmluZyB7XG4gICAgbGV0IGxhbmd1YWdlID0gZGV2aWNlLmxhbmd1YWdlO1xuICAgIGlmIChkZXZpY2UucmVnaW9uKSB7XG4gICAgICBsYW5ndWFnZSArPSBgLSR7ZGV2aWNlLnJlZ2lvbn1gO1xuICAgIH1cbiAgICBjb25zdCBkYXRlUGlwZSA9IG5ldyBEYXRlUGlwZShsYW5ndWFnZSk7XG4gICAgY29uc3QgcGFyc2VkRGF0ZSA9IHBhcnNlKHZhbHVlKTtcblxuICAgIGlmIChpc1RvZGF5KHBhcnNlZERhdGUpKSB7XG4gICAgICByZXR1cm4gZGF0ZVBpcGUudHJhbnNmb3JtKHBhcnNlZERhdGUsICdzaG9ydFRpbWUnKTtcbiAgICB9XG5cbiAgICBpZiAoaXNZZXN0ZXJkYXkocGFyc2VkRGF0ZSkpIHtcbiAgICAgIHJldHVybiAneWVzdGVyZGF5JztcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZVBpcGUudHJhbnNmb3JtKHBhcnNlZERhdGUsICdzaG9ydERhdGUnKTtcbiAgfVxufVxuIl19 -------------------------------------------------------------------------------- /chat/chat.module.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var forms_1 = require("nativescript-angular/forms"); 5 | var nativescript_module_1 = require("nativescript-angular/nativescript.module"); 6 | var nativescript_ngx_fonticon_1 = require("nativescript-ngx-fonticon"); 7 | var nativescript_ng_shadow_1 = require("nativescript-ng-shadow"); 8 | var chat_routing_module_1 = require("./chat-routing.module"); 9 | var chat_component_1 = require("./chat.component"); 10 | var message_box_component_1 = require("./message-box/message-box.component"); 11 | var messages_area_component_1 = require("./messages-area/messages-area.component"); 12 | var ChatModule = (function () { 13 | function ChatModule() { 14 | } 15 | ChatModule = __decorate([ 16 | core_1.NgModule({ 17 | imports: [ 18 | nativescript_module_1.NativeScriptModule, 19 | forms_1.NativeScriptFormsModule, 20 | chat_routing_module_1.ChatRoutingModule, 21 | nativescript_ng_shadow_1.NgShadowModule, 22 | nativescript_ngx_fonticon_1.TNSFontIconModule.forRoot({ 23 | mdi: 'material-design-icons.css', 24 | }), 25 | ], 26 | declarations: [ 27 | chat_component_1.ChatComponent, 28 | messages_area_component_1.MessagesAreaComponent, 29 | message_box_component_1.MessageBoxComponent, 30 | ], 31 | schemas: [ 32 | core_1.NO_ERRORS_SCHEMA, 33 | ], 34 | }) 35 | ], ChatModule); 36 | return ChatModule; 37 | }()); 38 | exports.ChatModule = ChatModule; 39 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGF0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUEyRDtBQUMzRCxvREFBcUU7QUFDckUsZ0ZBQThFO0FBQzlFLHVFQUE4RDtBQUU5RCxpRUFBd0Q7QUFDeEQsNkRBQTBEO0FBQzFELG1EQUFpRDtBQUNqRCw2RUFBMEU7QUFDMUUsbUZBQWdGO0FBcUJoRjtJQUFBO0lBQTBCLENBQUM7SUFBZCxVQUFVO1FBbkJ0QixlQUFRLENBQUM7WUFDUixPQUFPLEVBQUU7Z0JBQ1Asd0NBQWtCO2dCQUNsQiwrQkFBdUI7Z0JBQ3ZCLHVDQUFpQjtnQkFDakIsdUNBQWM7Z0JBQ2QsNkNBQWlCLENBQUMsT0FBTyxDQUFDO29CQUN4QixHQUFHLEVBQUUsMkJBQTJCO2lCQUNqQyxDQUFDO2FBQ0g7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osOEJBQWE7Z0JBQ2IsK0NBQXFCO2dCQUNyQiwyQ0FBbUI7YUFDcEI7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsdUJBQWdCO2FBQ2pCO1NBQ0YsQ0FBQztPQUNXLFVBQVUsQ0FBSTtJQUFELGlCQUFDO0NBQUEsQUFBM0IsSUFBMkI7QUFBZCxnQ0FBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlLCBOT19FUlJPUlNfU0NIRU1BIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOYXRpdmVTY3JpcHRGb3Jtc01vZHVsZSB9IGZyb20gJ25hdGl2ZXNjcmlwdC1hbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE5hdGl2ZVNjcmlwdE1vZHVsZSB9IGZyb20gJ25hdGl2ZXNjcmlwdC1hbmd1bGFyL25hdGl2ZXNjcmlwdC5tb2R1bGUnO1xuaW1wb3J0IHsgVE5TRm9udEljb25Nb2R1bGUgfSBmcm9tICduYXRpdmVzY3JpcHQtbmd4LWZvbnRpY29uJztcblxuaW1wb3J0IHsgTmdTaGFkb3dNb2R1bGUgfSBmcm9tICduYXRpdmVzY3JpcHQtbmctc2hhZG93JztcbmltcG9ydCB7IENoYXRSb3V0aW5nTW9kdWxlIH0gZnJvbSAnLi9jaGF0LXJvdXRpbmcubW9kdWxlJztcbmltcG9ydCB7IENoYXRDb21wb25lbnQgfSBmcm9tICcuL2NoYXQuY29tcG9uZW50JztcbmltcG9ydCB7IE1lc3NhZ2VCb3hDb21wb25lbnQgfSBmcm9tICcuL21lc3NhZ2UtYm94L21lc3NhZ2UtYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNzYWdlc0FyZWFDb21wb25lbnQgfSBmcm9tICcuL21lc3NhZ2VzLWFyZWEvbWVzc2FnZXMtYXJlYS5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgTmF0aXZlU2NyaXB0TW9kdWxlLFxuICAgIE5hdGl2ZVNjcmlwdEZvcm1zTW9kdWxlLFxuICAgIENoYXRSb3V0aW5nTW9kdWxlLFxuICAgIE5nU2hhZG93TW9kdWxlLFxuICAgIFROU0ZvbnRJY29uTW9kdWxlLmZvclJvb3Qoe1xuICAgICAgbWRpOiAnbWF0ZXJpYWwtZGVzaWduLWljb25zLmNzcycsXG4gICAgfSksXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW1xuICAgIENoYXRDb21wb25lbnQsXG4gICAgTWVzc2FnZXNBcmVhQ29tcG9uZW50LFxuICAgIE1lc3NhZ2VCb3hDb21wb25lbnQsXG4gIF0sXG4gIHNjaGVtYXM6IFtcbiAgICBOT19FUlJPUlNfU0NIRU1BLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGF0TW9kdWxlIHsgfVxuIl19 -------------------------------------------------------------------------------- /app.module.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var nativescript_module_1 = require("nativescript-angular/nativescript.module"); 5 | var router_1 = require("nativescript-angular/router"); 6 | var platform = require("platform"); 7 | var app_routing_module_1 = require("./app-routing.module"); 8 | var app_component_1 = require("./app.component"); 9 | var core_2 = require("./core"); 10 | var nativescript_angular_1 = require("nativescript-angular"); 11 | var nativescript_floatingactionbutton_1 = require("nativescript-floatingactionbutton"); 12 | nativescript_angular_1.registerElement('Fab', function () { return nativescript_floatingactionbutton_1.Fab; }); 13 | var AppModule = (function () { 14 | function AppModule() { 15 | } 16 | AppModule = __decorate([ 17 | core_1.NgModule({ 18 | bootstrap: [ 19 | app_component_1.AppComponent, 20 | ], 21 | imports: [ 22 | nativescript_module_1.NativeScriptModule, 23 | app_routing_module_1.AppRoutingModule, 24 | core_2.CoreModule, 25 | ], 26 | declarations: [ 27 | app_component_1.AppComponent, 28 | ], 29 | providers: [ 30 | { provide: core_1.NgModuleFactoryLoader, useClass: router_1.NSModuleFactoryLoader }, 31 | { provide: 'platform', useValue: platform }, 32 | ], 33 | schemas: [ 34 | core_1.NO_ERRORS_SCHEMA, 35 | ], 36 | }) 37 | ], AppModule); 38 | return AppModule; 39 | }()); 40 | exports.AppModule = AppModule; 41 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImFwcC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FDaUQ7QUFDakQsZ0ZBQThFO0FBQzlFLHNEQUFvRTtBQUNwRSxtQ0FBcUM7QUFFckMsMkRBQXdEO0FBQ3hELGlEQUErQztBQUMvQywrQkFBb0M7QUFFcEMsNkRBQXVEO0FBQ3ZELHVGQUF3RDtBQUV4RCxzQ0FBZSxDQUFDLEtBQUssRUFBRSxjQUFNLE9BQUEsdUNBQUcsRUFBSCxDQUFHLENBQUMsQ0FBQztBQXNCbEM7SUFBQTtJQUF5QixDQUFDO0lBQWIsU0FBUztRQXBCckIsZUFBUSxDQUFDO1lBQ04sU0FBUyxFQUFFO2dCQUNQLDRCQUFZO2FBQ2Y7WUFDRCxPQUFPLEVBQUU7Z0JBQ1Asd0NBQWtCO2dCQUNsQixxQ0FBZ0I7Z0JBQ2hCLGlCQUFVO2FBQ1g7WUFDRCxZQUFZLEVBQUU7Z0JBQ1osNEJBQVk7YUFDYjtZQUNELFNBQVMsRUFBRTtnQkFDVCxFQUFFLE9BQU8sRUFBRSw0QkFBcUIsRUFBRSxRQUFRLEVBQUUsOEJBQXFCLEVBQUU7Z0JBQ25FLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFO2FBQzVDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLHVCQUFnQjthQUNqQjtTQUNKLENBQUM7T0FDVyxTQUFTLENBQUk7SUFBRCxnQkFBQztDQUFBLEFBQTFCLElBQTBCO0FBQWIsOEJBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSwgTmdNb2R1bGVGYWN0b3J5TG9hZGVyLFxuICAgICAgICAgTk9fRVJST1JTX1NDSEVNQSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmF0aXZlU2NyaXB0TW9kdWxlIH0gZnJvbSAnbmF0aXZlc2NyaXB0LWFuZ3VsYXIvbmF0aXZlc2NyaXB0Lm1vZHVsZSc7XG5pbXBvcnQgeyBOU01vZHVsZUZhY3RvcnlMb2FkZXIgfSBmcm9tICduYXRpdmVzY3JpcHQtYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0ICogYXMgcGxhdGZvcm0gZnJvbSAncGxhdGZvcm0nO1xuXG5pbXBvcnQgeyBBcHBSb3V0aW5nTW9kdWxlIH0gZnJvbSAnLi9hcHAtcm91dGluZy5tb2R1bGUnO1xuaW1wb3J0IHsgQXBwQ29tcG9uZW50IH0gZnJvbSAnLi9hcHAuY29tcG9uZW50JztcbmltcG9ydCB7IENvcmVNb2R1bGUgfSBmcm9tICcuL2NvcmUnO1xuXG5pbXBvcnQgeyByZWdpc3RlckVsZW1lbnQgfSBmcm9tICduYXRpdmVzY3JpcHQtYW5ndWxhcic7XG5pbXBvcnQgeyBGYWIgfSBmcm9tICduYXRpdmVzY3JpcHQtZmxvYXRpbmdhY3Rpb25idXR0b24nO1xuXG5yZWdpc3RlckVsZW1lbnQoJ0ZhYicsICgpID0+IEZhYik7XG5cbkBOZ01vZHVsZSh7XG4gICAgYm9vdHN0cmFwOiBbXG4gICAgICAgIEFwcENvbXBvbmVudCxcbiAgICBdLFxuICAgIGltcG9ydHM6IFtcbiAgICAgIE5hdGl2ZVNjcmlwdE1vZHVsZSxcbiAgICAgIEFwcFJvdXRpbmdNb2R1bGUsXG4gICAgICBDb3JlTW9kdWxlLFxuICAgIF0sXG4gICAgZGVjbGFyYXRpb25zOiBbXG4gICAgICBBcHBDb21wb25lbnQsXG4gICAgXSxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgIHsgcHJvdmlkZTogTmdNb2R1bGVGYWN0b3J5TG9hZGVyLCB1c2VDbGFzczogTlNNb2R1bGVGYWN0b3J5TG9hZGVyIH0sXG4gICAgICB7IHByb3ZpZGU6ICdwbGF0Zm9ybScsIHVzZVZhbHVlOiBwbGF0Zm9ybSB9LFxuICAgIF0sXG4gICAgc2NoZW1hczogW1xuICAgICAgTk9fRVJST1JTX1NDSEVNQSxcbiAgICBdLFxufSlcbmV4cG9ydCBjbGFzcyBBcHBNb2R1bGUgeyB9XG4iXX0= -------------------------------------------------------------------------------- /App_Resources/iOS/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /home/tabs/tabs.component.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var application = require("application"); 5 | var TabsComponent = (function () { 6 | function TabsComponent(platform, changeDetectorRef) { 7 | this.platform = platform; 8 | this.changeDetectorRef = changeDetectorRef; 9 | } 10 | TabsComponent.prototype.ngOnInit = function () { 11 | var _this = this; 12 | this.selectedIndex = this.platform.isAndroid ? 1 : 3; 13 | if (this.platform.isAndroid) { 14 | application.android.on(application.AndroidApplication.activityBackPressedEvent, function (args) { 15 | if (_this.selectedIndex !== 1) { 16 | _this.selectedIndex = 1; 17 | args.cancel = true; 18 | _this.changeDetectorRef.detectChanges(); 19 | } 20 | }); 21 | } 22 | }; 23 | TabsComponent = __decorate([ 24 | core_1.Component({ 25 | moduleId: module.id, 26 | selector: 'ns-tabs', 27 | templateUrl: './tabs.component.html', 28 | styleUrls: ['./tabs.component.css'], 29 | }), 30 | __param(0, core_1.Inject('platform')), 31 | __metadata("design:paramtypes", [Object, core_1.ChangeDetectorRef]) 32 | ], TabsComponent); 33 | return TabsComponent; 34 | }()); 35 | exports.TabsComponent = TabsComponent; 36 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0YWJzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUE2RTtBQUU3RSx5Q0FBMkM7QUFRM0M7SUFFRSx1QkFDNkIsUUFBUSxFQUMzQixpQkFBb0M7UUFEakIsYUFBUSxHQUFSLFFBQVEsQ0FBQTtRQUMzQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO0lBQzNDLENBQUM7SUFFSixnQ0FBUSxHQUFSO1FBQUEsaUJBZUM7UUFkQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFckQsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQzVCLFdBQVcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNwQixXQUFXLENBQUMsa0JBQWtCLENBQUMsd0JBQXdCLEVBQ3ZELFVBQUMsSUFBeUM7Z0JBQ3hDLEVBQUUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxhQUFhLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0IsS0FBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7b0JBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO29CQUNuQixLQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3pDLENBQUM7WUFDSCxDQUFDLENBQ0YsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBdEJVLGFBQWE7UUFOekIsZ0JBQVMsQ0FBQztZQUNQLFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNuQixRQUFRLEVBQUUsU0FBUztZQUNuQixXQUFXLEVBQUUsdUJBQXVCO1lBQ3BDLFNBQVMsRUFBRSxDQUFDLHNCQUFzQixDQUFDO1NBQ3RDLENBQUM7UUFJRyxXQUFBLGFBQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtpREFDUSx3QkFBaUI7T0FKbkMsYUFBYSxDQXVCekI7SUFBRCxvQkFBQztDQUFBLEFBdkJELElBdUJDO0FBdkJZLHNDQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFuZHJvaWRBY3Rpdml0eUJhY2tQcmVzc2VkRXZlbnREYXRhIH0gZnJvbSAnYXBwbGljYXRpb24nO1xuaW1wb3J0ICogYXMgYXBwbGljYXRpb24gZnJvbSAnYXBwbGljYXRpb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICAgIHNlbGVjdG9yOiAnbnMtdGFicycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYnMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3RhYnMuY29tcG9uZW50LmNzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBUYWJzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgc2VsZWN0ZWRJbmRleDogbnVtYmVyO1xuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KCdwbGF0Zm9ybScpIHB1YmxpYyBwbGF0Zm9ybSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IHRoaXMucGxhdGZvcm0uaXNBbmRyb2lkID8gMSA6IDM7XG5cbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5pc0FuZHJvaWQpIHtcbiAgICAgIGFwcGxpY2F0aW9uLmFuZHJvaWQub24oXG4gICAgICAgIGFwcGxpY2F0aW9uLkFuZHJvaWRBcHBsaWNhdGlvbi5hY3Rpdml0eUJhY2tQcmVzc2VkRXZlbnQsXG4gICAgICAgIChhcmdzOiBBbmRyb2lkQWN0aXZpdHlCYWNrUHJlc3NlZEV2ZW50RGF0YSkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkSW5kZXggIT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IDE7XG4gICAgICAgICAgICBhcmdzLmNhbmNlbCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NativeScript WhatsApp Template ![apple](https://cdn3.iconfinder.com/data/icons/picons-social/57/16-apple-32.png) ![android](https://cdn3.iconfinder.com/data/icons/logos-3/228/android-32.png) 2 | 3 | [![NPM version][npm-image]][npm-url] 4 | [![Downloads][downloads-image]][npm-url] 5 | [![Dependencies][dependencies-image]][npm-url] 6 | [![DevDependencies][dev-dependencies-image]][npm-url] 7 | [![Twitter Follow][twitter-image]][twitter-url] 8 | 9 | [npm-image]:http://img.shields.io/npm/v/nativescript-whatsapp-template.svg 10 | [npm-url]:https://npmjs.org/package/nativescript-whatsapp-template 11 | [downloads-image]:http://img.shields.io/npm/dt/nativescript-whatsapp-template.svg 12 | [dependencies-image]:https://david-dm.org/Especializa/nativescript-whatsapp-template/status.svg 13 | [dev-dependencies-image]:https://david-dm.org/Especializa/nativescript-whatsapp-template/dev-status.svg 14 | [twitter-image]:https://img.shields.io/twitter/follow/especializa.svg?style=social&label=Follow%20us 15 | [twitter-url]:https://twitter.com/especializa 16 | 17 | ## Installation 18 | From the command prompt, start a new Nativescript project doing: 19 | ```sh 20 | tns create your-project-name --template nativescript-whatsapp-template 21 | ``` 22 | ## Introduction 23 | [![N|Solid](https://udemy-images.udemy.com/course/750x422/1011174_0030_5.jpg)](https://www.udemy.com/angular-native) 24 | 25 | This project is heavily based on [this repo](https://github.com/Especializa/nativesapp), created as part of the course: 26 | - [Aprenda Angular 2 + Nativescript e crie um WhatsApp](https://www.udemy.com/angular-native) 27 | **[CLICK HERE FOR ~90% OFF COUPON](https://www.udemy.com/angular-native/?couponCode=LANCAMENTO)** 28 | 29 | At the moment, only available in Portuguese, but English version is coming soon. 30 | Reach out to us on Twitter [![Twitter Follow][twitter-image]][twitter-url] if you want to push us to get it done sooner :) 31 | 32 | ### First run 33 | Right after creating a project and then npm install, it should be ready to go. Just move into your project's folder and execute the normal `tns` command to run any app: 34 | ```sh 35 | cd your-project-name 36 | npm i 37 | tns run 38 | ``` 39 | Alternatively you can target any specifc platform: 40 | ```sh 41 | tns run android 42 | ``` 43 | ```sh 44 | tns run ios 45 | ``` 46 | That's pretty much what you should expect to see for the initial screen: 47 | #### - Screenshot 1: Chats tab (iOS / Android) 48 | [![N|Solid](https://raw.githubusercontent.com/Especializa/nativesapp/master/app/tools/assets/screenshot-1.png)](https://www.udemy.com/angular-native) 49 | 50 | And that's the chat screen upon clicking on any chat item in the previous screen: 51 | #### - Screenshot 2: Chat screen (iOS / Android) 52 | [![N|Solid](https://raw.githubusercontent.com/Especializa/nativesapp/master/app/tools/assets/screenshot-2.png)](https://www.udemy.com/angular-native) 53 | ### Removing initial data 54 | You might want to remove all the dummy data as well as some boilerplate code. The content shown relies upon the service `core/chats.services.ts` inside your `app` folder. Just replace the content returned there with what you need. 55 | #### Emptying chats.services.ts 56 | ```javascript 57 | import { Injectable } from '@angular/core'; 58 | 59 | import { Chat } from './models/chat.model'; 60 | import { Message } from './models/message.model'; 61 | 62 | @Injectable() 63 | export class ChatsService { 64 | get chats(): Chat[] { 65 | return []; 66 | } 67 | getMessages(chat: Chat): Message[] { 68 | return []; 69 | } 70 | } 71 | ``` 72 | Another advisable tweak is removing the line which slices the list of messages in the selected chat to get only a chunck of initial 50 ones. The reason for that is just to illustrate that not all messages should appear on landing on that screen, but we wouldn't like to sound too opinionated at this point telling you how to fetch and show your own data. 73 | #### Replace the slice command on messages-area.component.ts 74 | ```diff 75 | export class MessagesAreaComponent implements OnInit { 76 | // ... 77 | ngOnInit() { 78 | - this.messages = this.messages.slice(0, 50); 79 | + // your own code 80 | } 81 | // ... 82 | } 83 | ``` 84 | 85 | ## Changelog 86 | - 1.0.0 Initial implementation 87 | 88 | ## License 89 | Apache License Version 2.0, January 2004 90 | -------------------------------------------------------------------------------- /App_Resources/iOS/Assets.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "extent" : "full-screen", 5 | "idiom" : "iphone", 6 | "subtype" : "736h", 7 | "filename" : "Default-736h@3x.png", 8 | "minimum-system-version" : "8.0", 9 | "orientation" : "portrait", 10 | "scale" : "3x" 11 | }, 12 | { 13 | "extent" : "full-screen", 14 | "idiom" : "iphone", 15 | "subtype" : "736h", 16 | "filename" : "Default-Landscape@3x.png", 17 | "minimum-system-version" : "8.0", 18 | "orientation" : "landscape", 19 | "scale" : "3x" 20 | }, 21 | { 22 | "extent" : "full-screen", 23 | "idiom" : "iphone", 24 | "subtype" : "667h", 25 | "filename" : "Default-667h@2x.png", 26 | "minimum-system-version" : "8.0", 27 | "orientation" : "portrait", 28 | "scale" : "2x" 29 | }, 30 | { 31 | "orientation" : "portrait", 32 | "idiom" : "iphone", 33 | "filename" : "Default@2x.png", 34 | "extent" : "full-screen", 35 | "minimum-system-version" : "7.0", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "extent" : "full-screen", 40 | "idiom" : "iphone", 41 | "subtype" : "retina4", 42 | "filename" : "Default-568h@2x.png", 43 | "minimum-system-version" : "7.0", 44 | "orientation" : "portrait", 45 | "scale" : "2x" 46 | }, 47 | { 48 | "orientation" : "portrait", 49 | "idiom" : "ipad", 50 | "filename" : "Default-Portrait.png", 51 | "extent" : "full-screen", 52 | "minimum-system-version" : "7.0", 53 | "scale" : "1x" 54 | }, 55 | { 56 | "orientation" : "landscape", 57 | "idiom" : "ipad", 58 | "filename" : "Default-Landscape.png", 59 | "extent" : "full-screen", 60 | "minimum-system-version" : "7.0", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "orientation" : "portrait", 65 | "idiom" : "ipad", 66 | "filename" : "Default-Portrait@2x.png", 67 | "extent" : "full-screen", 68 | "minimum-system-version" : "7.0", 69 | "scale" : "2x" 70 | }, 71 | { 72 | "orientation" : "landscape", 73 | "idiom" : "ipad", 74 | "filename" : "Default-Landscape@2x.png", 75 | "extent" : "full-screen", 76 | "minimum-system-version" : "7.0", 77 | "scale" : "2x" 78 | }, 79 | { 80 | "orientation" : "portrait", 81 | "idiom" : "iphone", 82 | "filename" : "Default.png", 83 | "extent" : "full-screen", 84 | "scale" : "1x" 85 | }, 86 | { 87 | "orientation" : "portrait", 88 | "idiom" : "iphone", 89 | "filename" : "Default@2x.png", 90 | "extent" : "full-screen", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "orientation" : "portrait", 95 | "idiom" : "iphone", 96 | "filename" : "Default-568h@2x.png", 97 | "extent" : "full-screen", 98 | "subtype" : "retina4", 99 | "scale" : "2x" 100 | }, 101 | { 102 | "orientation" : "portrait", 103 | "idiom" : "ipad", 104 | "extent" : "to-status-bar", 105 | "scale" : "1x" 106 | }, 107 | { 108 | "orientation" : "portrait", 109 | "idiom" : "ipad", 110 | "filename" : "Default-Portrait.png", 111 | "extent" : "full-screen", 112 | "scale" : "1x" 113 | }, 114 | { 115 | "orientation" : "landscape", 116 | "idiom" : "ipad", 117 | "extent" : "to-status-bar", 118 | "scale" : "1x" 119 | }, 120 | { 121 | "orientation" : "landscape", 122 | "idiom" : "ipad", 123 | "filename" : "Default-Landscape.png", 124 | "extent" : "full-screen", 125 | "scale" : "1x" 126 | }, 127 | { 128 | "orientation" : "portrait", 129 | "idiom" : "ipad", 130 | "extent" : "to-status-bar", 131 | "scale" : "2x" 132 | }, 133 | { 134 | "orientation" : "portrait", 135 | "idiom" : "ipad", 136 | "filename" : "Default-Portrait@2x.png", 137 | "extent" : "full-screen", 138 | "scale" : "2x" 139 | }, 140 | { 141 | "orientation" : "landscape", 142 | "idiom" : "ipad", 143 | "extent" : "to-status-bar", 144 | "scale" : "2x" 145 | }, 146 | { 147 | "orientation" : "landscape", 148 | "idiom" : "ipad", 149 | "filename" : "Default-Landscape@2x.png", 150 | "extent" : "full-screen", 151 | "scale" : "2x" 152 | } 153 | ], 154 | "info" : { 155 | "version" : 1, 156 | "author" : "xcode" 157 | } 158 | } -------------------------------------------------------------------------------- /chat/chat.component.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var router_1 = require("@angular/router"); 5 | var router_2 = require("nativescript-angular/router"); 6 | var core_2 = require("../core"); 7 | var ChatComponent = (function () { 8 | function ChatComponent(route, chatsService, router, platform) { 9 | this.route = route; 10 | this.chatsService = chatsService; 11 | this.router = router; 12 | this.platform = platform; 13 | } 14 | ChatComponent.prototype.ngOnInit = function () { 15 | var _this = this; 16 | this.route.params.subscribe(function (params) { 17 | _this.chatIndex = +params.index; 18 | _this.chat = _this.chatsService.chats[_this.chatIndex]; 19 | }); 20 | this.route.queryParams.subscribe(function (params) { 21 | _this.unread = +params.unread; 22 | }); 23 | this.getMessages(); 24 | }; 25 | ChatComponent.prototype.getMessages = function () { 26 | this.messages = this.chatsService.getMessages(this.chat); 27 | }; 28 | ChatComponent.prototype.goBack = function () { 29 | this.router.back(); 30 | }; 31 | ChatComponent = __decorate([ 32 | core_1.Component({ 33 | moduleId: module.id, 34 | selector: 'ns-chat', 35 | templateUrl: './chat.component.html', 36 | styleUrls: ['./chat.component.css'], 37 | changeDetection: core_1.ChangeDetectionStrategy.OnPush, 38 | }), 39 | __param(3, core_1.Inject('platform')), 40 | __metadata("design:paramtypes", [router_1.ActivatedRoute, 41 | core_2.ChatsService, 42 | router_2.RouterExtensions, Object]) 43 | ], ChatComponent); 44 | return ChatComponent; 45 | }()); 46 | exports.ChatComponent = ChatComponent; 47 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjaGF0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUMrQztBQUMvQywwQ0FBaUQ7QUFDakQsc0RBQStEO0FBRS9ELGdDQUE2QztBQVU3QztJQU1FLHVCQUNVLEtBQXFCLEVBQ3JCLFlBQTBCLEVBQzFCLE1BQXdCLEVBQ0wsUUFBUTtRQUgzQixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixXQUFNLEdBQU4sTUFBTSxDQUFrQjtRQUNMLGFBQVEsR0FBUixRQUFRLENBQUE7SUFFckMsQ0FBQztJQUVELGdDQUFRLEdBQVI7UUFBQSxpQkFTQztRQVJDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFDLE1BQU07WUFDakMsS0FBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDL0IsS0FBSSxDQUFDLElBQUksR0FBRyxLQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsVUFBQyxNQUFNO1lBQ3RDLEtBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxtQ0FBVyxHQUFYO1FBQ0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELDhCQUFNLEdBQU47UUFDRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUEvQlUsYUFBYTtRQVB6QixnQkFBUyxDQUFDO1lBQ1QsUUFBUSxFQUFFLE1BQU0sQ0FBQyxFQUFFO1lBQ25CLFFBQVEsRUFBRSxTQUFTO1lBQ25CLFdBQVcsRUFBRSx1QkFBdUI7WUFDcEMsU0FBUyxFQUFFLENBQUMsc0JBQXNCLENBQUM7WUFDbkMsZUFBZSxFQUFFLDhCQUF1QixDQUFDLE1BQU07U0FDaEQsQ0FBQztRQVdHLFdBQUEsYUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO3lDQUhKLHVCQUFjO1lBQ1AsbUJBQVk7WUFDbEIseUJBQWdCO09BVHZCLGFBQWEsQ0FnQ3pCO0lBQUQsb0JBQUM7Q0FBQSxBQWhDRCxJQWdDQztBQWhDWSxzQ0FBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsXG4gICAgICAgICBJbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgUm91dGVyRXh0ZW5zaW9ucyB9IGZyb20gJ25hdGl2ZXNjcmlwdC1hbmd1bGFyL3JvdXRlcic7XG5cbmltcG9ydCB7IENoYXQsIENoYXRzU2VydmljZSB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHtNZXNzYWdlfSBmcm9tICcuLi9jb3JlL21vZGVscy9tZXNzYWdlLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIG1vZHVsZUlkOiBtb2R1bGUuaWQsXG4gIHNlbGVjdG9yOiAnbnMtY2hhdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGF0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vY2hhdC5jb21wb25lbnQuY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDaGF0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY2hhdEluZGV4OiBudW1iZXI7XG4gIGNoYXQ6IENoYXQ7XG4gIHVucmVhZDogbnVtYmVyO1xuICBtZXNzYWdlczogTWVzc2FnZVtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgY2hhdHNTZXJ2aWNlOiBDaGF0c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlckV4dGVuc2lvbnMsXG4gICAgQEluamVjdCgncGxhdGZvcm0nKSBwdWJsaWMgcGxhdGZvcm0sXG4gICkge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXMpID0+IHtcbiAgICAgIHRoaXMuY2hhdEluZGV4ID0gK3BhcmFtcy5pbmRleDtcbiAgICAgIHRoaXMuY2hhdCA9IHRoaXMuY2hhdHNTZXJ2aWNlLmNoYXRzW3RoaXMuY2hhdEluZGV4XTtcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnN1YnNjcmliZSgocGFyYW1zKSA9PiB7XG4gICAgICB0aGlzLnVucmVhZCA9ICtwYXJhbXMudW5yZWFkO1xuICAgIH0pO1xuICAgIHRoaXMuZ2V0TWVzc2FnZXMoKTtcbiAgfVxuXG4gIGdldE1lc3NhZ2VzKCkge1xuICAgIHRoaXMubWVzc2FnZXMgPSB0aGlzLmNoYXRzU2VydmljZS5nZXRNZXNzYWdlcyh0aGlzLmNoYXQpO1xuICB9XG5cbiAgZ29CYWNrKCkge1xuICAgIHRoaXMucm91dGVyLmJhY2soKTtcbiAgfVxufVxuIl19 -------------------------------------------------------------------------------- /chat/messages-area/messages-area.component.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var core_2 = require("../../core"); 5 | var MessagesAreaComponent = (function () { 6 | function MessagesAreaComponent(platform) { 7 | this.platform = platform; 8 | } 9 | MessagesAreaComponent.prototype.ngOnInit = function () { 10 | this.messages = this.messages.slice(0, 50); 11 | }; 12 | MessagesAreaComponent.prototype.isContinuation = function (idx) { 13 | return (!this.messages[idx].sender && this.messages[idx - 1] && 14 | !this.messages[idx - 1].sender) || 15 | (this.messages[idx].sender && this.messages[idx - 1] && 16 | this.messages[idx - 1].sender); 17 | }; 18 | MessagesAreaComponent.prototype.getIcon = function (message) { 19 | switch (message.sent) { 20 | case core_2.SentStatus.NOT_SENT: 21 | return 'mdi-access-time'; 22 | case core_2.SentStatus.SENT: 23 | return 'mdi-done'; 24 | default: 25 | return 'mdi-done-all'; 26 | } 27 | }; 28 | MessagesAreaComponent.prototype.isViewed = function (message) { 29 | return message.sent === core_2.SentStatus.VIEWED; 30 | }; 31 | __decorate([ 32 | core_1.Input(), 33 | __metadata("design:type", Array) 34 | ], MessagesAreaComponent.prototype, "messages", void 0); 35 | MessagesAreaComponent = __decorate([ 36 | core_1.Component({ 37 | moduleId: module.id, 38 | selector: 'ns-messages-area', 39 | templateUrl: './messages-area.component.html', 40 | styleUrls: ['./messages-area.component.css'], 41 | changeDetection: core_1.ChangeDetectionStrategy.OnPush, 42 | }), 43 | __param(0, core_1.Inject('platform')), 44 | __metadata("design:paramtypes", [Object]) 45 | ], MessagesAreaComponent); 46 | return MessagesAreaComponent; 47 | }()); 48 | exports.MessagesAreaComponent = MessagesAreaComponent; 49 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZXMtYXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtZXNzYWdlcy1hcmVhLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUNzRDtBQUN0RCxtQ0FBaUQ7QUFTakQ7SUFHRSwrQkFBdUMsUUFBUTtRQUFSLGFBQVEsR0FBUixRQUFRLENBQUE7SUFBRyxDQUFDO0lBRW5ELHdDQUFRLEdBQVI7UUFDRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsOENBQWMsR0FBZCxVQUFlLEdBQVc7UUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7WUFDcEQsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDaEMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCx1Q0FBTyxHQUFQLFVBQVEsT0FBZ0I7UUFDdEIsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDckIsS0FBSyxpQkFBVSxDQUFDLFFBQVE7Z0JBQ3RCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUMzQixLQUFLLGlCQUFVLENBQUMsSUFBSTtnQkFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUNwQjtnQkFDRSxNQUFNLENBQUMsY0FBYyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0lBRUQsd0NBQVEsR0FBUixVQUFTLE9BQWdCO1FBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLGlCQUFVLENBQUMsTUFBTSxDQUFDO0lBQzVDLENBQUM7SUE1QlE7UUFBUixZQUFLLEVBQUU7OzJEQUFxQjtJQURsQixxQkFBcUI7UUFQakMsZ0JBQVMsQ0FBQztZQUNULFFBQVEsRUFBRSxNQUFNLENBQUMsRUFBRTtZQUNuQixRQUFRLEVBQUUsa0JBQWtCO1lBQzVCLFdBQVcsRUFBRSxnQ0FBZ0M7WUFDN0MsU0FBUyxFQUFFLENBQUMsK0JBQStCLENBQUM7WUFDNUMsZUFBZSxFQUFFLDhCQUF1QixDQUFDLE1BQU07U0FDaEQsQ0FBQztRQUlhLFdBQUEsYUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBOztPQUhwQixxQkFBcUIsQ0E4QmpDO0lBQUQsNEJBQUM7Q0FBQSxBQTlCRCxJQThCQztBQTlCWSxzREFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LFxuICAgICAgICAgSW5qZWN0LCBJbnB1dCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNZXNzYWdlLCBTZW50U3RhdHVzIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogJ25zLW1lc3NhZ2VzLWFyZWEnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZXMtYXJlYS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL21lc3NhZ2VzLWFyZWEuY29tcG9uZW50LmNzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWVzc2FnZXNBcmVhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgbWVzc2FnZXM6IE1lc3NhZ2VbXTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KCdwbGF0Zm9ybScpIHB1YmxpYyBwbGF0Zm9ybSkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLm1lc3NhZ2VzID0gdGhpcy5tZXNzYWdlcy5zbGljZSgwLCA1MCk7XG4gIH1cblxuICBpc0NvbnRpbnVhdGlvbihpZHg6IG51bWJlcikge1xuICAgIHJldHVybiAoIXRoaXMubWVzc2FnZXNbaWR4XS5zZW5kZXIgJiYgdGhpcy5tZXNzYWdlc1tpZHggLSAxXSAmJlxuICAgICAgICAgICAgIXRoaXMubWVzc2FnZXNbaWR4IC0gMV0uc2VuZGVyKSB8fFxuICAgICAgICAgICAodGhpcy5tZXNzYWdlc1tpZHhdLnNlbmRlciAmJiB0aGlzLm1lc3NhZ2VzW2lkeCAtIDFdICYmXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VzW2lkeCAtIDFdLnNlbmRlcik7XG4gIH1cblxuICBnZXRJY29uKG1lc3NhZ2U6IE1lc3NhZ2UpIHtcbiAgICBzd2l0Y2ggKG1lc3NhZ2Uuc2VudCkge1xuICAgICAgY2FzZSBTZW50U3RhdHVzLk5PVF9TRU5UOlxuICAgICAgICByZXR1cm4gJ21kaS1hY2Nlc3MtdGltZSc7XG4gICAgICBjYXNlIFNlbnRTdGF0dXMuU0VOVDpcbiAgICAgICAgcmV0dXJuICdtZGktZG9uZSc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gJ21kaS1kb25lLWFsbCc7XG4gICAgfVxuICB9XG5cbiAgaXNWaWV3ZWQobWVzc2FnZTogTWVzc2FnZSkge1xuICAgIHJldHVybiBtZXNzYWdlLnNlbnQgPT09IFNlbnRTdGF0dXMuVklFV0VEO1xuICB9XG59XG4iXX0= -------------------------------------------------------------------------------- /core/chats.service.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | var core_1 = require("@angular/core"); 4 | var ChatsService = (function () { 5 | function ChatsService() { 6 | } 7 | Object.defineProperty(ChatsService.prototype, "chats", { 8 | get: function () { 9 | return Array(200).fill('').map(function (ele, idx) { return ({ 10 | contact: { 11 | avatar: "https://randomuser.me/api/portraits/med/" + (idx % 2 === 0 ? 'women' : 'men') + "/" + idx + ".jpg", 12 | // Random names 13 | name: idx % 2 === 0 ? 14 | (['Leeanna Munoz', 'Yolanda Karlin', 'Trish Peer'][idx % 3]) 15 | : (['Chuck Pulver', 'Oscar Blundell', 'Irwin Weathersby'][idx % 3]), 16 | }, 17 | type: 'DIRECT', 18 | when: Date.now() - ((idx + 1) * 40 * 60 * 1000), 19 | muted: idx % 7 === 0, 20 | unread: parseInt(Math.random() * 10 + '', 10) - 3, 21 | // Non-sense phrases 22 | text: [ 23 | '\u263A Yay, this course is amazing !!! \u270C', 24 | 'Sixty-four doesn\'t like paying taxes.', 25 | 'A river a thousand paces wide ever stuns the onlooker.', 26 | 'That stolen figurine is often one floor above you.', 27 | '\u263A Yay, this course is amazing !!! \u270C', 28 | 'Spam sat down once more.', 29 | 'Whiskey on the table set a treehouse on fire.', 30 | ][idx % 7], 31 | }); }); 32 | }, 33 | enumerable: true, 34 | configurable: true 35 | }); 36 | ChatsService.prototype.getMessages = function (chat) { 37 | return Array(200).fill('').map(function (ele, idx) { return ({ 38 | // Non-sense phrases 39 | text: [ 40 | '\u263A Yay, this course is amazing !!! \u270C', 41 | 'Sixty-four doesn\'t like paying taxes.', 42 | 'A river a thousand paces wide ever stuns the onlooker.', 43 | 'That stolen figurine is often one floor above you.', 44 | '\u263A Yay, this course is amazing !!! \u270C', 45 | 'Spam sat down once more!', 46 | 'Whiskey on the table set a treehouse on fire.', 47 | 'That memory we used to share stole the goods.', 48 | 'Clear water rains heavily', 49 | 'Style is interdependant on the relatedness of ' + 50 | 'motivation, subcultures, and management', 51 | ][Math.floor(Math.random() * 10)], 52 | chat: chat, 53 | sender: Math.random() > .5 ? chat.contact : null, 54 | created: Date.now() - ((idx + 1) * 40 * 60 * 1000), 55 | sent: Math.floor(4 * Math.random()), 56 | }); }); 57 | }; 58 | ChatsService = __decorate([ 59 | core_1.Injectable() 60 | ], ChatsService); 61 | return ChatsService; 62 | }()); 63 | exports.ChatsService = ChatsService; 64 | //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNoYXRzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBMkM7QUFPM0M7SUFBQTtJQWtEQSxDQUFDO0lBakRDLHNCQUFJLCtCQUFLO2FBQVQ7WUFDRSxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxHQUFHLEVBQUUsR0FBRyxJQUFLLE9BQUEsQ0FBQztnQkFDNUMsT0FBTyxFQUFFO29CQUNQLE1BQU0sRUFBRSw4Q0FDRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLEdBQUcsS0FBSyxVQUM3QixHQUFHLFNBQU07b0JBQ3JCLGVBQWU7b0JBQ2YsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzt3QkFDYixDQUFDLENBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQzswQkFDNUQsQ0FBQyxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDeEU7Z0JBQ0QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO2dCQUMvQyxLQUFLLEVBQUUsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNwQixNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2pELG9CQUFvQjtnQkFDcEIsSUFBSSxFQUFFO29CQUNKLCtDQUErQztvQkFDL0Msd0NBQXdDO29CQUN4Qyx3REFBd0Q7b0JBQ3hELG9EQUFvRDtvQkFDcEQsK0NBQStDO29CQUMvQywwQkFBMEI7b0JBQzFCLCtDQUErQztpQkFDaEQsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO2FBQ1gsQ0FBQyxFQXhCMkMsQ0F3QjNDLENBQUMsQ0FBQztRQUNOLENBQUM7OztPQUFBO0lBQ0Qsa0NBQVcsR0FBWCxVQUFZLElBQVU7UUFDcEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSyxPQUFBLENBQUM7WUFDNUMsb0JBQW9CO1lBQ3BCLElBQUksRUFBRTtnQkFDSiwrQ0FBK0M7Z0JBQy9DLHdDQUF3QztnQkFDeEMsd0RBQXdEO2dCQUN4RCxvREFBb0Q7Z0JBQ3BELCtDQUErQztnQkFDL0MsMEJBQTBCO2dCQUMxQiwrQ0FBK0M7Z0JBQy9DLCtDQUErQztnQkFDL0MsMkJBQTJCO2dCQUMzQixnREFBZ0Q7b0JBQzlDLHlDQUF5QzthQUM1QyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQ2pDLElBQUksTUFBQTtZQUNKLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSTtZQUNoRCxPQUFPLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDbEQsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztTQUNwQyxDQUFDLEVBbkIyQyxDQW1CM0MsQ0FBQyxDQUFDO0lBQ04sQ0FBQztJQWpEVSxZQUFZO1FBRHhCLGlCQUFVLEVBQUU7T0FDQSxZQUFZLENBa0R4QjtJQUFELG1CQUFDO0NBQUEsQUFsREQsSUFrREM7QUFsRFksb0NBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENoYXQgfSBmcm9tICcuL21vZGVscy9jaGF0Lm1vZGVsJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICcuL21vZGVscy9tZXNzYWdlLm1vZGVsJztcbmltcG9ydCB7IFNlbnRTdGF0dXMgfSBmcm9tICcuL21vZGVscy9zZW50LXN0YXR1cy5tb2RlbCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDaGF0c1NlcnZpY2Uge1xuICBnZXQgY2hhdHMoKTogQ2hhdFtdIHtcbiAgICByZXR1cm4gQXJyYXkoMjAwKS5maWxsKCcnKS5tYXAoKGVsZSwgaWR4KSA9PiAoe1xuICAgICAgY29udGFjdDoge1xuICAgICAgICBhdmF0YXI6IGBodHRwczovL3JhbmRvbXVzZXIubWUvYXBpL3BvcnRyYWl0cy9tZWQvJHtcbiAgICAgICAgICAgICAgICAgIGlkeCAlIDIgPT09IDAgPyAnd29tZW4nIDogJ21lbidcbiAgICAgICAgICAgICAgICB9LyR7aWR4fS5qcGdgLFxuICAgICAgICAvLyBSYW5kb20gbmFtZXNcbiAgICAgICAgbmFtZTogaWR4ICUgMiA9PT0gMCA/XG4gICAgICAgICAgICAgIChbJ0xlZWFubmEgTXVub3onLCAnWW9sYW5kYSBLYXJsaW4nLCAnVHJpc2ggUGVlciddW2lkeCAlIDNdKVxuICAgICAgICAgICAgOiAoWydDaHVjayBQdWx2ZXInLCAnT3NjYXIgQmx1bmRlbGwnLCAnSXJ3aW4gV2VhdGhlcnNieSddW2lkeCAlIDNdKSxcbiAgICAgIH0sXG4gICAgICB0eXBlOiAnRElSRUNUJyxcbiAgICAgIHdoZW46IERhdGUubm93KCkgLSAoKGlkeCArIDEpICogNDAgKiA2MCAqIDEwMDApLFxuICAgICAgbXV0ZWQ6IGlkeCAlIDcgPT09IDAsXG4gICAgICB1bnJlYWQ6IHBhcnNlSW50KE1hdGgucmFuZG9tKCkgKiAxMCArICcnLCAxMCkgLSAzLFxuICAgICAgLy8gTm9uLXNlbnNlIHBocmFzZXNcbiAgICAgIHRleHQ6IFtcbiAgICAgICAgJ1xcdTI2M0EgWWF5LCB0aGlzIGNvdXJzZSBpcyBhbWF6aW5nICEhISBcXHUyNzBDJyxcbiAgICAgICAgJ1NpeHR5LWZvdXIgZG9lc25cXCd0IGxpa2UgcGF5aW5nIHRheGVzLicsXG4gICAgICAgICdBIHJpdmVyIGEgdGhvdXNhbmQgcGFjZXMgd2lkZSBldmVyIHN0dW5zIHRoZSBvbmxvb2tlci4nLFxuICAgICAgICAnVGhhdCBzdG9sZW4gZmlndXJpbmUgaXMgb2Z0ZW4gb25lIGZsb29yIGFib3ZlIHlvdS4nLFxuICAgICAgICAnXFx1MjYzQSBZYXksIHRoaXMgY291cnNlIGlzIGFtYXppbmcgISEhIFxcdTI3MEMnLFxuICAgICAgICAnU3BhbSBzYXQgZG93biBvbmNlIG1vcmUuJyxcbiAgICAgICAgJ1doaXNrZXkgb24gdGhlIHRhYmxlIHNldCBhIHRyZWVob3VzZSBvbiBmaXJlLicsXG4gICAgICBdW2lkeCAlIDddLFxuICAgIH0pKTtcbiAgfVxuICBnZXRNZXNzYWdlcyhjaGF0OiBDaGF0KTogTWVzc2FnZVtdIHtcbiAgICByZXR1cm4gQXJyYXkoMjAwKS5maWxsKCcnKS5tYXAoKGVsZSwgaWR4KSA9PiAoe1xuICAgICAgLy8gTm9uLXNlbnNlIHBocmFzZXNcbiAgICAgIHRleHQ6IFtcbiAgICAgICAgJ1xcdTI2M0EgWWF5LCB0aGlzIGNvdXJzZSBpcyBhbWF6aW5nICEhISBcXHUyNzBDJyxcbiAgICAgICAgJ1NpeHR5LWZvdXIgZG9lc25cXCd0IGxpa2UgcGF5aW5nIHRheGVzLicsXG4gICAgICAgICdBIHJpdmVyIGEgdGhvdXNhbmQgcGFjZXMgd2lkZSBldmVyIHN0dW5zIHRoZSBvbmxvb2tlci4nLFxuICAgICAgICAnVGhhdCBzdG9sZW4gZmlndXJpbmUgaXMgb2Z0ZW4gb25lIGZsb29yIGFib3ZlIHlvdS4nLFxuICAgICAgICAnXFx1MjYzQSBZYXksIHRoaXMgY291cnNlIGlzIGFtYXppbmcgISEhIFxcdTI3MEMnLFxuICAgICAgICAnU3BhbSBzYXQgZG93biBvbmNlIG1vcmUhJyxcbiAgICAgICAgJ1doaXNrZXkgb24gdGhlIHRhYmxlIHNldCBhIHRyZWVob3VzZSBvbiBmaXJlLicsXG4gICAgICAgICdUaGF0IG1lbW9yeSB3ZSB1c2VkIHRvIHNoYXJlIHN0b2xlIHRoZSBnb29kcy4nLFxuICAgICAgICAnQ2xlYXIgd2F0ZXIgcmFpbnMgaGVhdmlseScsXG4gICAgICAgICdTdHlsZSBpcyBpbnRlcmRlcGVuZGFudCBvbiB0aGUgcmVsYXRlZG5lc3Mgb2YgJyArXG4gICAgICAgICAgJ21vdGl2YXRpb24sIHN1YmN1bHR1cmVzLCBhbmQgbWFuYWdlbWVudCcsXG4gICAgICBdW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwKV0sXG4gICAgICBjaGF0LFxuICAgICAgc2VuZGVyOiBNYXRoLnJhbmRvbSgpID4gLjUgPyBjaGF0LmNvbnRhY3QgOiBudWxsLFxuICAgICAgY3JlYXRlZDogRGF0ZS5ub3coKSAtICgoaWR4ICsgMSkgKiA0MCAqIDYwICogMTAwMCksXG4gICAgICBzZW50OiBNYXRoLmZsb29yKDQgKiBNYXRoLnJhbmRvbSgpKSxcbiAgICB9KSk7XG4gIH1cbn1cbiJdfQ== -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /home/chats/chats.component.css: -------------------------------------------------------------------------------- 1 | .c-white{color:#fff}.c-bg-white{background-color:#fff}.c-black{color:#000}.c-bg-black{background-color:#000}.c-aqua{color:#00caab}.c-bg-aqua{background-color:#00caab}.c-blue{color:#3d5afe}.c-bg-blue{background-color:#3d5afe}.c-charcoal{color:#303030}.c-bg-charcoal{background-color:#303030}.c-brown{color:#795548}.c-bg-brown{background-color:#795548}.c-forest{color:#006968}.c-bg-forest{background-color:#006968}.c-grey{color:#e0e0e0}.c-bg-grey{background-color:#e0e0e0}.c-grey-light{color:#bababa}.c-bg-grey-light{background-color:#bababa}.c-grey-dark{color:#5c687c}.c-bg-grey-dark{background-color:#5c687c}.c-purple{color:#8130ff}.c-bg-purple{background-color:#8130ff}.c-lemon{color:#ffea00}.c-bg-lemon{background-color:#ffea00}.c-lime{color:#aee406}.c-bg-lime{background-color:#aee406}.c-orange{color:#f57c00}.c-bg-orange{background-color:#f57c00}.c-ruby{color:#ff1744}.c-bg-ruby{background-color:#ff1744}.c-sky{color:#30bcff}.c-bg-sky{background-color:#30bcff}.w-full{width:100%}.w-100{width:100}.h-full{height:100%}.h-100{height:100}.m-0{margin:0}.m-t-0{margin-top:0}.m-r-0{margin-right:0}.m-b-0{margin-bottom:0}.m-l-0{margin-left:0}.m-x-0{margin-right:0;margin-left:0}.m-y-0{margin-top:0;margin-bottom:0}.m-2{margin:2}.m-t-2{margin-top:2}.m-r-2{margin-right:2}.m-b-2{margin-bottom:2}.m-l-2{margin-left:2}.m-x-2{margin-right:2;margin-left:2}.m-y-2{margin-top:2;margin-bottom:2}.m-4{margin:4}.m-t-4{margin-top:4}.m-r-4{margin-right:4}.m-b-4{margin-bottom:4}.m-l-4{margin-left:4}.m-x-4{margin-right:4;margin-left:4}.m-y-4{margin-top:4;margin-bottom:4}.m-5{margin:5}.m-t-5{margin-top:5}.m-r-5{margin-right:5}.m-b-5{margin-bottom:5}.m-l-5{margin-left:5}.m-x-5{margin-right:5;margin-left:5}.m-y-5{margin-top:5;margin-bottom:5}.m-8{margin:8}.m-t-8{margin-top:8}.m-r-8{margin-right:8}.m-b-8{margin-bottom:8}.m-l-8{margin-left:8}.m-x-8{margin-right:8;margin-left:8}.m-y-8{margin-top:8;margin-bottom:8}.m-10{margin:10}.m-t-10{margin-top:10}.m-r-10{margin-right:10}.m-b-10{margin-bottom:10}.m-l-10{margin-left:10}.m-x-10{margin-right:10;margin-left:10}.m-y-10{margin-top:10;margin-bottom:10}.m-12{margin:12}.m-t-12{margin-top:12}.m-r-12{margin-right:12}.m-b-12{margin-bottom:12}.m-l-12{margin-left:12}.m-x-12{margin-right:12;margin-left:12}.m-y-12{margin-top:12;margin-bottom:12}.m-15{margin:15}.m-t-15{margin-top:15}.m-r-15{margin-right:15}.m-b-15{margin-bottom:15}.m-l-15{margin-left:15}.m-x-15{margin-right:15;margin-left:15}.m-y-15{margin-top:15;margin-bottom:15}.m-16{margin:16}.m-t-16{margin-top:16}.m-r-16{margin-right:16}.m-b-16{margin-bottom:16}.m-l-16{margin-left:16}.m-x-16{margin-right:16;margin-left:16}.m-y-16{margin-top:16;margin-bottom:16}.m-20{margin:20}.m-t-20{margin-top:20}.m-r-20{margin-right:20}.m-b-20{margin-bottom:20}.m-l-20{margin-left:20}.m-x-20{margin-right:20;margin-left:20}.m-y-20{margin-top:20;margin-bottom:20}.m-24{margin:24}.m-t-24{margin-top:24}.m-r-24{margin-right:24}.m-b-24{margin-bottom:24}.m-l-24{margin-left:24}.m-x-24{margin-right:24;margin-left:24}.m-y-24{margin-top:24;margin-bottom:24}.m-25{margin:25}.m-t-25{margin-top:25}.m-r-25{margin-right:25}.m-b-25{margin-bottom:25}.m-l-25{margin-left:25}.m-x-25{margin-right:25;margin-left:25}.m-y-25{margin-top:25;margin-bottom:25}.m-28{margin:28}.m-t-28{margin-top:28}.m-r-28{margin-right:28}.m-b-28{margin-bottom:28}.m-l-28{margin-left:28}.m-x-28{margin-right:28;margin-left:28}.m-y-28{margin-top:28;margin-bottom:28}.m-30{margin:30}.m-t-30{margin-top:30}.m-r-30{margin-right:30}.m-b-30{margin-bottom:30}.m-l-30{margin-left:30}.m-x-30{margin-right:30;margin-left:30}.m-y-30{margin-top:30;margin-bottom:30}.p-0{padding:0}.p-t-0{padding-top:0}.p-r-0{padding-right:0}.p-b-0{padding-bottom:0}.p-l-0{padding-left:0}.p-x-0{padding-right:0;padding-left:0}.p-y-0{padding-top:0;padding-bottom:0}.p-2{padding:2}.p-t-2{padding-top:2}.p-r-2{padding-right:2}.p-b-2{padding-bottom:2}.p-l-2{padding-left:2}.p-x-2{padding-right:2;padding-left:2}.p-y-2{padding-top:2;padding-bottom:2}.p-4{padding:4}.p-t-4{padding-top:4}.p-r-4{padding-right:4}.p-b-4{padding-bottom:4}.p-l-4{padding-left:4}.p-x-4{padding-right:4;padding-left:4}.p-y-4{padding-top:4;padding-bottom:4}.p-5{padding:5}.p-t-5{padding-top:5}.p-r-5{padding-right:5}.p-b-5{padding-bottom:5}.p-l-5{padding-left:5}.p-x-5{padding-right:5;padding-left:5}.p-y-5{padding-top:5;padding-bottom:5}.p-8{padding:8}.p-t-8{padding-top:8}.p-r-8{padding-right:8}.p-b-8{padding-bottom:8}.p-l-8{padding-left:8}.p-x-8{padding-right:8;padding-left:8}.p-y-8{padding-top:8;padding-bottom:8}.p-10{padding:10}.p-t-10{padding-top:10}.p-r-10{padding-right:10}.p-b-10{padding-bottom:10}.p-l-10{padding-left:10}.p-x-10{padding-right:10;padding-left:10}.p-y-10{padding-top:10;padding-bottom:10}.p-12{padding:12}.p-t-12{padding-top:12}.p-r-12{padding-right:12}.p-b-12{padding-bottom:12}.p-l-12{padding-left:12}.p-x-12{padding-right:12;padding-left:12}.p-y-12{padding-top:12;padding-bottom:12}.p-15{padding:15}.p-t-15{padding-top:15}.p-r-15{padding-right:15}.p-b-15{padding-bottom:15}.p-l-15{padding-left:15}.p-x-15{padding-right:15;padding-left:15}.p-y-15{padding-top:15;padding-bottom:15}.p-16{padding:16}.p-t-16{padding-top:16}.p-r-16{padding-right:16}.p-b-16{padding-bottom:16}.p-l-16{padding-left:16}.p-x-16{padding-right:16;padding-left:16}.p-y-16{padding-top:16;padding-bottom:16}.p-20{padding:20}.p-t-20{padding-top:20}.p-r-20{padding-right:20}.p-b-20{padding-bottom:20}.p-l-20{padding-left:20}.p-x-20{padding-right:20;padding-left:20}.p-y-20{padding-top:20;padding-bottom:20}.p-24{padding:24}.p-t-24{padding-top:24}.p-r-24{padding-right:24}.p-b-24{padding-bottom:24}.p-l-24{padding-left:24}.p-x-24{padding-right:24;padding-left:24}.p-y-24{padding-top:24;padding-bottom:24}.p-25{padding:25}.p-t-25{padding-top:25}.p-r-25{padding-right:25}.p-b-25{padding-bottom:25}.p-l-25{padding-left:25}.p-x-25{padding-right:25;padding-left:25}.p-y-25{padding-top:25;padding-bottom:25}.p-28{padding:28}.p-t-28{padding-top:28}.p-r-28{padding-right:28}.p-b-28{padding-bottom:28}.p-l-28{padding-left:28}.p-x-28{padding-right:28;padding-left:28}.p-y-28{padding-top:28;padding-bottom:28}.p-30{padding:30}.p-t-30{padding-top:30}.p-r-30{padding-right:30}.p-b-30{padding-bottom:30}.p-l-30{padding-left:30}.p-x-30{padding-right:30;padding-left:30}.p-y-30{padding-top:30;padding-bottom:30}.hr-light{height:1;background-color:#e0e0e0;width:100%}.hr-dark{height:1;background-color:#303030;width:100%}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.font-weight-normal{font-weight:normal}.font-weight-bold{font-weight:bold}.font-italic{font-style:italic}.t-10{font-size:10}.t-12{font-size:12}.t-14{font-size:14}.t-15{font-size:15}.t-16{font-size:16}.t-17{font-size:17}.t-18{font-size:18}.t-19{font-size:19}.t-20{font-size:20}.t-25{font-size:25}.t-30{font-size:30}.img-rounded{border-radius:5}.img-circle{border-radius:20}.img-thumbnail{border-radius:0}.invisible{visibility:collapse}.pull-left{horizontal-align:left}.pull-right{horizontal-align:right}.m-x-auto{horizontal-align:center}.m-y-auto{vertical-align:center}.text-primary{color:#30bcff}.text-danger{color:#d50000}.text-muted{color:#9e9e9e}.bg-primary{background-color:#30bcff;color:#fff}.bg-danger{background-color:#d50000;color:#fff}.action-bar{background-color:#F8F8F8;color:#212121}.action-bar .action-bar-title{font-weight:bold;font-size:17;vertical-align:center}.action-bar .action-item{font-weight:normal}.activity-indicator{color:#30bcff;width:30;height:30}.btn{color:#30bcff;background-color:transparent;min-height:36;min-width:64;padding:10 10 10 10;font-size:18;margin:8 16 8 16}.btn.btn-active:highlighted{color:#fff;background-color:#c0ebff}.btn-primary{background-color:#30bcff;border-color:#30bcff;color:#fff}.btn-primary.btn-active:highlighted{background-color:#01a0ec;border-color:#01a0ec}.btn-primary.btn-aqua{background-color:#00caab}.btn-primary.btn-blue{background-color:#3d5afe}.btn-primary.btn-brown{background-color:#795548}.btn-primary.btn-forest{background-color:#006968}.btn-primary.btn-grey{background-color:#5c687c}.btn-primary.btn-lemon{background-color:#ffea00;color:#000}.btn-primary.btn-lime{background-color:#aee406;color:#000}.btn-primary.btn-orange{background-color:#f57c00}.btn-primary.btn-purple{background-color:#8130ff}.btn-primary.btn-ruby{background-color:#ff1744}.btn-primary.btn-sky{background-color:#30bcff}.btn-outline{background-color:transparent;border-color:#30bcff;color:#30bcff}.btn-outline.btn-active:highlighted{background-color:#c0ebff}.btn[isEnabled=false]{color:#a4a4a4;background-color:#e0e0e0;border-color:#e0e0e0}.fa{font-family:FontAwesome, fontawesome-webfont}.form .input{padding:16 8 16 8;background-color:transparent}.form .input.input-border{border-width:1;border-color:#e0e0e0;border-radius:2;padding:16}.form .input.input-rounded{border-width:1;border-color:#e0e0e0;border-radius:28;padding:16}.form .input[isEnabled='false']{background-color:#fafafa}.form .input-field{margin:8}.form .input-field .label{font-size:12;color:#bababa}.form .input-field .input{padding:0;margin:0 0 8 0}.form .input-field .hr-light.active,.form .input-field .hr-dark.active{background-color:#30bcff}.form .input-field.input-sides .label{font-size:18;margin:0 0 8 0}.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:4;font-weight:normal;color:#212121}.body,.body2,.footnote{font-weight:normal;color:#757575}.h1{font-size:32}.h2{font-size:22}.h3{font-size:15}.h4{font-size:12}.h5{font-size:11}.h6{font-size:10}.body{font-size:14}.body2{font-size:17}.footnote{font-size:13}.list-group .list-group-item{color:#212121;font-size:16;margin:0;padding:16}.list-group .list-group-item Label{vertical-align:center}.list-group .list-group-item .thumb{stretch:fill;width:40;height:40;margin-right:16}.list-group .list-group-item.active{background-color:#e0e0e0}.list-group .list-group-item .list-group-item-text{color:#757575;font-size:14}.page{background-color:#fff}.progress{color:#30bcff;background-color:#bababa}.segmented-bar{font-size:13;background-color:#fff;color:#212121;selected-background-color:#30bcff}.sidedrawer-left,.sidedrawer-center{background-color:#fafafa}.sidedrawer-header{background-color:#fafafa;height:148;width:100%}.sidedrawer-left .sidedrawer-header{padding:16 16 0 16}.sidedrawer-center .sidedrawer-header{padding:20 15 0 15}.sidedrawer-header-image{background-color:#e0e0e0}.sidedrawer-left .sidedrawer-header-image{height:64;width:64;border-radius:32;horizontal-align:left;margin-bottom:36}.sidedrawer-center .sidedrawer-header-image{height:74;width:74;border-radius:37;horizontal-align:center;margin-bottom:24}.sidedrawer-header-brand{color:#737373}.sidedrawer-left .sidedrawer-header-brand{horizontal-align:left;font-size:14}.sidedrawer-center .sidedrawer-header-brand{horizontal-align:center;font-size:15}.sidedrawer-list-item{height:48;horizontal-align:left;width:100%;orientation:horizontal}.sidedrawer-list-item .sidedrawer-list-item-icon{width:24;text-align:center;font-size:20;height:48;vertical-align:center}.sidedrawer-list-item.active{color:#fff;background-color:#30bcff}.sidedrawer-list-item.active .sidedrawer-list-item-icon{color:#fff}.sidedrawer-left .sidedrawer-list-item-icon{margin:0 16 0 16}.sidedrawer-center .sidedrawer-list-item-icon{margin:0 0 0 15}.sidedrawer-list-item-text{horizontal-align:left;text-align:left;font-size:15;background-color:transparent;border-width:0.1;width:80%;vertical-align:center}.sidedrawer-left .sidedrawer-list-item-text{padding-left:16}.sidedrawer-center .sidedrawer-list-item-text{padding-left:15}.slider{background-color:#30bcff}.slider[isEnabled=false]{background-color:#e0e0e0;color:#e0e0e0}.switch[checked=true]{background-color:#30bcff}.switch[checked=true][isEnabled=false]{background-color:#e0e0e0;color:#fff}.switch[isEnabled=false]{background-color:#e0e0e0;color:#e0e0e0}.tab-view{selected-color:#30bcff;tabs-background-color:#fff}.tab-view .tab-view-item{background-color:#fff;tabs-background-color:#fff}#login-background{margin-top:-20;background-size:cover;background-position:center}.login-wrap{padding:0 40}.logo-wrap{margin:60 0 10 0;padding:20 0}.logo-wrap .login-logo{text-align:center;font-size:30;font-weight:bold;margin-bottom:10;opacity:1;color:#212121;opacity:.9}.logo-wrap .login-logo-sub{color:#212121;opacity:.8;text-align:center}.login-wrapper{padding:20;background-color:#fff;border-radius:3}.login-wrapper TextField{padding:10 10;margin:10 0 0 0}.go-back{font-size:14;text-align:center;color:#212121;margin-top:10}.thumb{border-radius:50%}.muted{font-weight:normal;opacity:0.4;font-size:20}.unread{text-align:center;min-width:20;min-height:20;color:#fff}.unread{font-size:10;border-radius:50%;background-color:#3d5afe}.time{color:#5c687c;font-size:12} 2 | -------------------------------------------------------------------------------- /home/chats/chats.component.ios.css: -------------------------------------------------------------------------------- 1 | .c-white{color:#fff}.c-bg-white{background-color:#fff}.c-black{color:#000}.c-bg-black{background-color:#000}.c-aqua{color:#00caab}.c-bg-aqua{background-color:#00caab}.c-blue{color:#3d5afe}.c-bg-blue{background-color:#3d5afe}.c-charcoal{color:#303030}.c-bg-charcoal{background-color:#303030}.c-brown{color:#795548}.c-bg-brown{background-color:#795548}.c-forest{color:#006968}.c-bg-forest{background-color:#006968}.c-grey{color:#e0e0e0}.c-bg-grey{background-color:#e0e0e0}.c-grey-light{color:#bababa}.c-bg-grey-light{background-color:#bababa}.c-grey-dark{color:#5c687c}.c-bg-grey-dark{background-color:#5c687c}.c-purple{color:#8130ff}.c-bg-purple{background-color:#8130ff}.c-lemon{color:#ffea00}.c-bg-lemon{background-color:#ffea00}.c-lime{color:#aee406}.c-bg-lime{background-color:#aee406}.c-orange{color:#f57c00}.c-bg-orange{background-color:#f57c00}.c-ruby{color:#ff1744}.c-bg-ruby{background-color:#ff1744}.c-sky{color:#30bcff}.c-bg-sky{background-color:#30bcff}.w-full{width:100%}.w-100{width:100}.h-full{height:100%}.h-100{height:100}.m-0{margin:0}.m-t-0{margin-top:0}.m-r-0{margin-right:0}.m-b-0{margin-bottom:0}.m-l-0{margin-left:0}.m-x-0{margin-right:0;margin-left:0}.m-y-0{margin-top:0;margin-bottom:0}.m-2{margin:2}.m-t-2{margin-top:2}.m-r-2{margin-right:2}.m-b-2{margin-bottom:2}.m-l-2{margin-left:2}.m-x-2{margin-right:2;margin-left:2}.m-y-2{margin-top:2;margin-bottom:2}.m-4{margin:4}.m-t-4{margin-top:4}.m-r-4{margin-right:4}.m-b-4{margin-bottom:4}.m-l-4{margin-left:4}.m-x-4{margin-right:4;margin-left:4}.m-y-4{margin-top:4;margin-bottom:4}.m-5{margin:5}.m-t-5{margin-top:5}.m-r-5{margin-right:5}.m-b-5{margin-bottom:5}.m-l-5{margin-left:5}.m-x-5{margin-right:5;margin-left:5}.m-y-5{margin-top:5;margin-bottom:5}.m-8{margin:8}.m-t-8{margin-top:8}.m-r-8{margin-right:8}.m-b-8{margin-bottom:8}.m-l-8{margin-left:8}.m-x-8{margin-right:8;margin-left:8}.m-y-8{margin-top:8;margin-bottom:8}.m-10{margin:10}.m-t-10{margin-top:10}.m-r-10{margin-right:10}.m-b-10{margin-bottom:10}.m-l-10{margin-left:10}.m-x-10{margin-right:10;margin-left:10}.m-y-10{margin-top:10;margin-bottom:10}.m-12{margin:12}.m-t-12{margin-top:12}.m-r-12{margin-right:12}.m-b-12{margin-bottom:12}.m-l-12{margin-left:12}.m-x-12{margin-right:12;margin-left:12}.m-y-12{margin-top:12;margin-bottom:12}.m-15{margin:15}.m-t-15{margin-top:15}.m-r-15{margin-right:15}.m-b-15{margin-bottom:15}.m-l-15{margin-left:15}.m-x-15{margin-right:15;margin-left:15}.m-y-15{margin-top:15;margin-bottom:15}.m-16{margin:16}.m-t-16{margin-top:16}.m-r-16{margin-right:16}.m-b-16{margin-bottom:16}.m-l-16{margin-left:16}.m-x-16{margin-right:16;margin-left:16}.m-y-16{margin-top:16;margin-bottom:16}.m-20{margin:20}.m-t-20{margin-top:20}.m-r-20{margin-right:20}.m-b-20{margin-bottom:20}.m-l-20{margin-left:20}.m-x-20{margin-right:20;margin-left:20}.m-y-20{margin-top:20;margin-bottom:20}.m-24{margin:24}.m-t-24{margin-top:24}.m-r-24{margin-right:24}.m-b-24{margin-bottom:24}.m-l-24{margin-left:24}.m-x-24{margin-right:24;margin-left:24}.m-y-24{margin-top:24;margin-bottom:24}.m-25{margin:25}.m-t-25{margin-top:25}.m-r-25{margin-right:25}.m-b-25{margin-bottom:25}.m-l-25{margin-left:25}.m-x-25{margin-right:25;margin-left:25}.m-y-25{margin-top:25;margin-bottom:25}.m-28{margin:28}.m-t-28{margin-top:28}.m-r-28{margin-right:28}.m-b-28{margin-bottom:28}.m-l-28{margin-left:28}.m-x-28{margin-right:28;margin-left:28}.m-y-28{margin-top:28;margin-bottom:28}.m-30{margin:30}.m-t-30{margin-top:30}.m-r-30{margin-right:30}.m-b-30{margin-bottom:30}.m-l-30{margin-left:30}.m-x-30{margin-right:30;margin-left:30}.m-y-30{margin-top:30;margin-bottom:30}.p-0{padding:0}.p-t-0{padding-top:0}.p-r-0{padding-right:0}.p-b-0{padding-bottom:0}.p-l-0{padding-left:0}.p-x-0{padding-right:0;padding-left:0}.p-y-0{padding-top:0;padding-bottom:0}.p-2{padding:2}.p-t-2{padding-top:2}.p-r-2{padding-right:2}.p-b-2{padding-bottom:2}.p-l-2{padding-left:2}.p-x-2{padding-right:2;padding-left:2}.p-y-2{padding-top:2;padding-bottom:2}.p-4{padding:4}.p-t-4{padding-top:4}.p-r-4{padding-right:4}.p-b-4{padding-bottom:4}.p-l-4{padding-left:4}.p-x-4{padding-right:4;padding-left:4}.p-y-4{padding-top:4;padding-bottom:4}.p-5{padding:5}.p-t-5{padding-top:5}.p-r-5{padding-right:5}.p-b-5{padding-bottom:5}.p-l-5{padding-left:5}.p-x-5{padding-right:5;padding-left:5}.p-y-5{padding-top:5;padding-bottom:5}.p-8{padding:8}.p-t-8{padding-top:8}.p-r-8{padding-right:8}.p-b-8{padding-bottom:8}.p-l-8{padding-left:8}.p-x-8{padding-right:8;padding-left:8}.p-y-8{padding-top:8;padding-bottom:8}.p-10{padding:10}.p-t-10{padding-top:10}.p-r-10{padding-right:10}.p-b-10{padding-bottom:10}.p-l-10{padding-left:10}.p-x-10{padding-right:10;padding-left:10}.p-y-10{padding-top:10;padding-bottom:10}.p-12{padding:12}.p-t-12{padding-top:12}.p-r-12{padding-right:12}.p-b-12{padding-bottom:12}.p-l-12{padding-left:12}.p-x-12{padding-right:12;padding-left:12}.p-y-12{padding-top:12;padding-bottom:12}.p-15{padding:15}.p-t-15{padding-top:15}.p-r-15{padding-right:15}.p-b-15{padding-bottom:15}.p-l-15{padding-left:15}.p-x-15{padding-right:15;padding-left:15}.p-y-15{padding-top:15;padding-bottom:15}.p-16{padding:16}.p-t-16{padding-top:16}.p-r-16{padding-right:16}.p-b-16{padding-bottom:16}.p-l-16{padding-left:16}.p-x-16{padding-right:16;padding-left:16}.p-y-16{padding-top:16;padding-bottom:16}.p-20{padding:20}.p-t-20{padding-top:20}.p-r-20{padding-right:20}.p-b-20{padding-bottom:20}.p-l-20{padding-left:20}.p-x-20{padding-right:20;padding-left:20}.p-y-20{padding-top:20;padding-bottom:20}.p-24{padding:24}.p-t-24{padding-top:24}.p-r-24{padding-right:24}.p-b-24{padding-bottom:24}.p-l-24{padding-left:24}.p-x-24{padding-right:24;padding-left:24}.p-y-24{padding-top:24;padding-bottom:24}.p-25{padding:25}.p-t-25{padding-top:25}.p-r-25{padding-right:25}.p-b-25{padding-bottom:25}.p-l-25{padding-left:25}.p-x-25{padding-right:25;padding-left:25}.p-y-25{padding-top:25;padding-bottom:25}.p-28{padding:28}.p-t-28{padding-top:28}.p-r-28{padding-right:28}.p-b-28{padding-bottom:28}.p-l-28{padding-left:28}.p-x-28{padding-right:28;padding-left:28}.p-y-28{padding-top:28;padding-bottom:28}.p-30{padding:30}.p-t-30{padding-top:30}.p-r-30{padding-right:30}.p-b-30{padding-bottom:30}.p-l-30{padding-left:30}.p-x-30{padding-right:30;padding-left:30}.p-y-30{padding-top:30;padding-bottom:30}.hr-light{height:1;background-color:#e0e0e0;width:100%}.hr-dark{height:1;background-color:#303030;width:100%}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.font-weight-normal{font-weight:normal}.font-weight-bold{font-weight:bold}.font-italic{font-style:italic}.t-10{font-size:10}.t-12{font-size:12}.t-14{font-size:14}.t-15{font-size:15}.t-16{font-size:16}.t-17{font-size:17}.t-18{font-size:18}.t-19{font-size:19}.t-20{font-size:20}.t-25{font-size:25}.t-30{font-size:30}.img-rounded{border-radius:5}.img-circle{border-radius:20}.img-thumbnail{border-radius:0}.invisible{visibility:collapse}.pull-left{horizontal-align:left}.pull-right{horizontal-align:right}.m-x-auto{horizontal-align:center}.m-y-auto{vertical-align:center}.text-primary{color:#30bcff}.text-danger{color:#d50000}.text-muted{color:#9e9e9e}.bg-primary{background-color:#30bcff;color:#fff}.bg-danger{background-color:#d50000;color:#fff}.action-bar{background-color:#F8F8F8;color:#212121}.action-bar .action-bar-title{font-weight:bold;font-size:17;vertical-align:center}.action-bar .action-item{font-weight:normal}.activity-indicator{color:#30bcff;width:30;height:30}.btn{color:#30bcff;background-color:transparent;min-height:36;min-width:64;padding:10 10 10 10;font-size:18;margin:8 16 8 16}.btn.btn-active:highlighted{color:#fff;background-color:#c0ebff}.btn-primary{background-color:#30bcff;border-color:#30bcff;color:#fff}.btn-primary.btn-active:highlighted{background-color:#01a0ec;border-color:#01a0ec}.btn-primary.btn-aqua{background-color:#00caab}.btn-primary.btn-blue{background-color:#3d5afe}.btn-primary.btn-brown{background-color:#795548}.btn-primary.btn-forest{background-color:#006968}.btn-primary.btn-grey{background-color:#5c687c}.btn-primary.btn-lemon{background-color:#ffea00;color:#000}.btn-primary.btn-lime{background-color:#aee406;color:#000}.btn-primary.btn-orange{background-color:#f57c00}.btn-primary.btn-purple{background-color:#8130ff}.btn-primary.btn-ruby{background-color:#ff1744}.btn-primary.btn-sky{background-color:#30bcff}.btn-outline{background-color:transparent;border-color:#30bcff;color:#30bcff}.btn-outline.btn-active:highlighted{background-color:#c0ebff}.btn[isEnabled=false]{color:#a4a4a4;background-color:#e0e0e0;border-color:#e0e0e0}.fa{font-family:FontAwesome, fontawesome-webfont}.form .input{padding:16 8 16 8;background-color:transparent}.form .input.input-border{border-width:1;border-color:#e0e0e0;border-radius:2;padding:16}.form .input.input-rounded{border-width:1;border-color:#e0e0e0;border-radius:28;padding:16}.form .input[isEnabled='false']{background-color:#fafafa}.form .input-field{margin:8}.form .input-field .label{font-size:12;color:#bababa}.form .input-field .input{padding:0;margin:0 0 8 0}.form .input-field .hr-light.active,.form .input-field .hr-dark.active{background-color:#30bcff}.form .input-field.input-sides .label{font-size:18;margin:0 0 8 0}.h1,.h2,.h3,.h4,.h5,.h6{margin-bottom:4;font-weight:normal;color:#212121}.body,.body2,.footnote{font-weight:normal;color:#757575}.h1{font-size:32}.h2{font-size:22}.h3{font-size:15}.h4{font-size:12}.h5{font-size:11}.h6{font-size:10}.body{font-size:14}.body2{font-size:17}.footnote{font-size:13}.list-group .list-group-item{color:#212121;font-size:16;margin:0;padding:16}.list-group .list-group-item Label{vertical-align:center}.list-group .list-group-item .thumb{stretch:fill;width:40;height:40;margin-right:16}.list-group .list-group-item.active{background-color:#e0e0e0}.list-group .list-group-item .list-group-item-text{color:#757575;font-size:14}.page{background-color:#fff}.progress{color:#30bcff;background-color:#bababa}.segmented-bar{font-size:13;background-color:#fff;color:#212121;selected-background-color:#30bcff}.sidedrawer-left,.sidedrawer-center{background-color:#fafafa}.sidedrawer-header{background-color:#fafafa;height:148;width:100%}.sidedrawer-left .sidedrawer-header{padding:16 16 0 16}.sidedrawer-center .sidedrawer-header{padding:20 15 0 15}.sidedrawer-header-image{background-color:#e0e0e0}.sidedrawer-left .sidedrawer-header-image{height:64;width:64;border-radius:32;horizontal-align:left;margin-bottom:36}.sidedrawer-center .sidedrawer-header-image{height:74;width:74;border-radius:37;horizontal-align:center;margin-bottom:24}.sidedrawer-header-brand{color:#737373}.sidedrawer-left .sidedrawer-header-brand{horizontal-align:left;font-size:14}.sidedrawer-center .sidedrawer-header-brand{horizontal-align:center;font-size:15}.sidedrawer-list-item{height:48;horizontal-align:left;width:100%;orientation:horizontal}.sidedrawer-list-item .sidedrawer-list-item-icon{width:24;text-align:center;font-size:20;height:48;vertical-align:center}.sidedrawer-list-item.active{color:#fff;background-color:#30bcff}.sidedrawer-list-item.active .sidedrawer-list-item-icon{color:#fff}.sidedrawer-left .sidedrawer-list-item-icon{margin:0 16 0 16}.sidedrawer-center .sidedrawer-list-item-icon{margin:0 0 0 15}.sidedrawer-list-item-text{horizontal-align:left;text-align:left;font-size:15;background-color:transparent;border-width:0.1;width:80%;vertical-align:center}.sidedrawer-left .sidedrawer-list-item-text{padding-left:16}.sidedrawer-center .sidedrawer-list-item-text{padding-left:15}.slider{background-color:#30bcff}.slider[isEnabled=false]{background-color:#e0e0e0;color:#e0e0e0}.switch[checked=true]{background-color:#30bcff}.switch[checked=true][isEnabled=false]{background-color:#e0e0e0;color:#fff}.switch[isEnabled=false]{background-color:#e0e0e0;color:#e0e0e0}.tab-view{selected-color:#30bcff;tabs-background-color:#fff}.tab-view .tab-view-item{background-color:#fff;tabs-background-color:#fff}#login-background{margin-top:-20;background-size:cover;background-position:center}.login-wrap{padding:0 40}.logo-wrap{margin:60 0 10 0;padding:20 0}.logo-wrap .login-logo{text-align:center;font-size:30;font-weight:bold;margin-bottom:10;opacity:1;color:#212121;opacity:.9}.logo-wrap .login-logo-sub{color:#212121;opacity:.8;text-align:center}.login-wrapper{padding:20;background-color:#fff;border-radius:3}.login-wrapper TextField{padding:10 10;margin:10 0 0 0}.go-back{font-size:14;text-align:center;color:#212121;margin-top:10}.thumb{border-radius:50%}.muted{font-weight:normal;opacity:0.4;font-size:20}.unread{text-align:center;min-width:20;min-height:20;color:#fff}.unread{font-size:10;border-radius:50%;background-color:#3d5afe}.time{color:#5c687c;font-size:12} 2 | --------------------------------------------------------------------------------