Unleash your web skills on native!

A presentation at DevDays Vilnius in May 2018 in Vilnius, Lithuania by Rowdy Rabouw

Slide 1

Slide 1

Slide 2

Slide 2

Unleash your web skills on native!

Slide 3

Slide 3

Slide 4

Slide 4

Web developer mood coaster

Slide 5

Slide 5

web developer in natural habitat

Slide 6

Slide 6

Slide 7

Slide 7

web developer • HTML • CSS • JavaScript • Sass • Node Package Manager Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 7/151

Slide 8

Slide 8

web developer on native iOS / Android

Slide 9

Slide 9

Slide 10

Slide 10

web developer & native • App stores • Provisioning files • Java or Kotlin for Android • Objective-C or Swift for iOS Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 10/151

Slide 11

Slide 11

web developer with nativescript

Slide 12

Slide 12

Slide 13

Slide 13

web developer & nativescript • App stores • Provisioning files • NativeScript • HTML • CSS • JavaScript • Sass • Node Package Manager Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 13/151

Slide 14

Slide 14

web developer ❤ nativescript

Slide 15

Slide 15

Slide 16

Slide 16

who?

Slide 17

Slide 17

Rowdy Rabouw @rowdyrabouw Gouda, The Netherlands I ❤ superhero movies Freelance web and app developer Lead developer Nationale-Nederlanden Pension App Progress Developer Expert for Nativescript Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 17/151

Slide 18

Slide 18

Got Questions? sli.do ! event code K100 Ask Me Anything Corner on 2nd floor Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 18/151

Slide 19

Slide 19

Slide 20

Slide 20

Mobile App framework decision guide

Slide 21

Slide 21

Mobile App framework decision guide Do you want/need a native User Interface and native performance? No Yes Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 21/151

Slide 22

Slide 22

Mobile App framework decision guide Do you want/need a native User Interface and native performance? No Yes Phonegap / Cordova with Ionic • WebView • DOM to manipulate • HTML styled like native Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 22/151

Slide 23

Slide 23

Mobile App framework decision guide Do you want/need a native User Interface and native performance? No Yes Phonegap / Cordova with Ionic • WebView • DOM to manipulate • HTML styled like native continue Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 23/151

Slide 24

Slide 24

Mobile App framework decision guide Do you have too much money and time? Yes No Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 24/151

Slide 25

Slide 25

Mobile App framework decision guide Do you have too much money and time? Yes No Native iOS and Android • Twice the work Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 25/151

Slide 26

Slide 26

Mobile App framework decision guide Do you have too much money and time? Yes No Native iOS and Android • Twice the work continue Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 26/151

Slide 27

Slide 27

Mobile App framework decision guide Do you potentially want/need to share code with the web? Or do you want/need to use web technologies? No Yes Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 27/151

Slide 28

Slide 28

Mobile App framework decision guide Do you potentially want/need to share code with the web? Or do you want/need to use web technologies? No Yes Xamarin • .NET or C# • Cross compiling • Bindings to access native APIs Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 28/151

Slide 29

Slide 29

Mobile App framework decision guide Do you potentially want/need to share code with the web? Or do you want/need to use web technologies? No Yes Flutter • Dart • Cross compiling • Beta Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 29/151

Slide 30

Slide 30

Mobile App framework decision guide Do you potentially want/need to share code with the web? Or do you want/need to use web technologies? No Yes Flutter • Dart • Cross compiling • Beta continue Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 30/151

Slide 31

Slide 31

Mobile App framework decision guide Do you want to use modern JavaScript? No Yes Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 31/151

Slide 32

Slide 32

Mobile App framework decision guide Do you want to use modern JavaScript? No Yes Titanium • No ES6/ES2015 support • Can't use NPM • Old MVC framework (Alloy) Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 32/151

Slide 33

Slide 33

Mobile App framework decision guide Do you want to use modern JavaScript? No Yes Titanium • No ES6/ES2015 support • Can't use NPM • Old MVC framework (Alloy) continue Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 33/151

Slide 34

Slide 34

Mobile App framework decision guide Do you know and like React? Yes No Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 34/151

Slide 35

Slide 35

Mobile App framework decision guide Do you know and like React? Yes No React Native • React • Native code to access APIs • Version 0.55 Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 35/151

Slide 36

Slide 36

Mobile App framework decision guide Do you know and like React? Yes No React Native • React • Native code to access APIs • Version 0.55 continue Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 36/151

Slide 37

Slide 37

Slide 38

Slide 38

NATIVESCRIPT

Slide 39

Slide 39

NATIVESCRIPT

Slide 40

Slide 40

What is NativeScript? • Open source framework for building truly native mobile apps • JavaScript, markup (XML/HTML) and CSS • Native code inside your JavaScript if you want and dare • Cross Platform: one codebase for iOS and Android • Backed by software company Progress • Android 4.2 or a later stable official release • iOS 7.0 or later stable official release Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 40/151

Slide 41

Slide 41

Slide 42

Slide 42

How to start?

Slide 43

Slide 43

docs.nativescript.org

Slide 44

Slide 44

nativescript.org/get-the-nativescript-book

Slide 45

Slide 45

forum.nativescript.org

Slide 46

Slide 46

nativescriptcommunity.slack.com

Slide 47

Slide 47

nativescript.org/nativescript-sidekick

Slide 48

Slide 48

play.nativescript.org

Slide 49

Slide 49

market.nativescript.org

Slide 50

Slide 50

nativescripting.com

Slide 51

Slide 51

Slide 52

Slide 52

markup like on the web

Slide 53

Slide 53

Markup http://2xr.nl/markup https://docs.nativescript.org/ui/components < ActionBar

title ="Native elements"/> < StackLayout

< Button

text ="Button" tap ="{{ onButtonTap }}"/>

< Switch

checked ="false"/>

< SegmentedBar

items ="{{ segmentedBarItems }}"/>

< Progress

value ="0" maxValue ="100"/>

< Slider

value ="0" minValue ="0" maxValue ="100"/>

< DatePicker

year ="2018" month ="1" day ="1"

minDate ="1970-01-01" maxDate ="2100-12-31"/> </ StackLayout

Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 53/151

Slide 54

Slide 54

Slide 55

Slide 55

TextField https://docs.nativescript.org/api-reference/modules/ui_text_field.textfield < TextField /> < TextField

text =""/> < TextField

hint ="Enter your name"/> Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 55/151

Slide 56

Slide 56

TextField: autocapitalization https://docs.nativescript.org/api-reference/modules/ui_text_field.textfield < TextField

autocapitalizationType ="allCharacters"/> < TextField

autocapitalizationType ="sentences"/> < TextField

autocapitalizationType ="words"/> Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 56/151

Slide 57

Slide 57

TextField: autocapitalization https://docs.nativescript.org/api-reference/modules/ui_text_field.textfield < TextField

autocapitalizationType ="allCharacters"/> < TextField

autocapitalizationType ="sentences"/> < TextField

autocapitalizationType ="words"/> < TextField

autocapitalizationType ="none"/> Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 57/151

Slide 58

Slide 58

TextField: autocorrect https://docs.nativescript.org/api-reference/modules/ui_text_field.textfield < TextField

autocorrect ="true"/> < TextField

autocorrect ="false"/> Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 58/151

Slide 59

Slide 59

TextField: keyboardType http://2xr.nl/keyboardType https://docs.nativescript.org/api-reference/modules/ui_enums.keyboardtype < TextField

keyboardType ="number"/> < TextField

keyboardType ="datetime"/> < TextField

keyboardType ="phone"/> < TextField

keyboardType ="email"/> < TextField

keyboardType ="url"/> Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 59/151

Slide 60

Slide 60

Slide 61

Slide 61

TextField: more attributes https://docs.nativescript.org/api-reference/modules/ui_text_field.textfield < TextField

textAlignment =""/> < TextField

visibility =""/> < TextField

width =""/> < TextField

maxLength =""/> Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 61/151

Slide 62

Slide 62

Layouts https://docs.nativescript.org/ui/layouts Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 62/151

Slide 63

Slide 63

Layouts https://docs.nativescript.org/ui/layouts Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 63/151

Slide 64

Slide 64

DockLayout https://docs.nativescript.org/ui/layouts < DockLayout

height ="100%"

stretchLastChild ="true">

< Label

text ="1" dock ="top"/>

< Label

text ="2" dock ="bottom"/>

< Label

text ="3" dock ="right"/>

< Label

text ="4" dock ="left"/> </ DockLayout

<!-- 1 + 2 have fixed height 3 has fixed width 4 will get all remaining space -->

Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 64/151

Slide 65

Slide 65

GridLayout https://docs.nativescript.org/ui/layouts < GridLayout

rows ="100, auto, *"

columns ="100, auto, *">

< Label

text ="1" row ="0" col ="0">

< Label

text ="2" row ="0" col ="1"

colSpan ="2"/>

< Label

text ="3" row ="1" col ="0"

rowSpan ="2"/>

< Label

text ="4" row ="1" col ="1"/>

< Label

text ="5" row ="1" col ="2"/>

< Label

text ="6" row ="2" col ="1"/>

< Label

text ="7" row ="2" col ="2"/> </ GridLayout

Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 65/151

Slide 66

Slide 66

Slide 67

Slide 67

Cascading Style Sheets

Slide 68

Slide 68

Cascading Style Sheets https://docs.nativescript.org/ui/styling • a large subset of CSS properties is supported • device-independent pixels • application-wide, page-specific or inline • platform-specific possible Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 68/151

Slide 69

Slide 69

Cascading Style Sheets button, .btn, button[btn-type="primary"] {

height : 40 ;

font-size : 16 ;

color : rgb (197, 46, 54);

background-color : #f6c600 ;

text-transform : uppercase;

opacity : 0.5 ; } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 69/151

Slide 70

Slide 70

CSS Animations https://docs.nativescript.org/ui/animation-css • opacity • background-color • transform: translate • transform: scale • transform: rotate Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 70/151

Slide 71

Slide 71

CSS Animations @ keyframes example { 0% { background-color : red; transform : translate (0, 0); } 25% { background-color : yellow; transform : translate (200, 0); } 50% { background-color : blue; transform : translate (200, 200); } 75% { background-color : green; transform : translate (0, 200); } 100% { background-color : red; transform : translate (0, 0); } } .view {

animation-name : example;

animation-duration : 4s ;

animation-fill-mode : forwards; } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 71/151

Slide 72

Slide 72

SASS (CSS with superpowers) https://docs.nativescript.org/ui/theme#sass-usage • variables $dark : #022734 ; .button-primary { background-color : $dark ; } • nested rules StackLayout.error { Label { color : red; } } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 72/151

Slide 73

Slide 73

TabView < TabView

height ="100%">

< StackLayout * tabItem ="{title: 'Rocket Raccoon'}" class ="full rocket"/>

< StackLayout * tabItem ="{title: 'Harley Quinn'}" class ="full harley"/>

< StackLayout * tabItem ="{title: 'Hulk'}" class ="full hulk"/> </ TabView

Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 73/151

Slide 74

Slide 74

TabView .full {

background-size : cover;

background-position : center;

background-repeat : no-repeat; } .rocket { background-image : url ( "~/images/rocket-raccoon.jpg" ); } .harley { background-image : url ( "~/images/harley-quinn.jpg" ); } .hulk { background-image : url ( "~/images/hulk.jpg" ); } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 74/151

Slide 75

Slide 75

Slide 76

Slide 76

{N} Core Themes https://docs.nativescript.org/ui/theme • ready to use color schemes • tailored for iOS and Android Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw

Slide 77

Slide 77

NativeScript Theme Builder https://www.nativescriptthemebuilder.com Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 77/151

Slide 78

Slide 78

Slide 79

Slide 79

4 Fantastic Choices

Slide 80

Slide 80

JavaScript

Slide 81

Slide 81

TypeScript

Slide 82

Slide 82

Vue.js

Slide 83

Slide 83

Angular

Slide 84

Slide 84

Angular • Opinionated JavaScript framework • Typescript • Full-featured routing • Dependency injection • Data binding Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 84/151

Slide 85

Slide 85

Angular import { LanguageService } from

"../../services/language.service" ; export

class HomeComponent {

constructor ( private languageService: LanguageService ) {} changeLanguage(lang: string ) {

this .languageService.setLanguage(lang); } } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 85/151

Slide 86

Slide 86

Angular one-way data binding < Label [ text ]="text"></ Label

< Label

text ="{{text}}"></ Label

text: string

"Hello Vilnius!" ; Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 86/151

Slide 87

Slide 87

Angular two-way data binding !

!

" < TextField

keyboardType ="number" ( focus )="OnInputFocus($event)" ( blur )="OnInputBlur($event)" [ maxLength ]="maxLengthSalary" [( ngModel )]="salary"> </ TextField

Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 87/151

Slide 88

Slide 88

Slide 89

Slide 89

Catwoman (2004) “ I want to thank Warner Bros. for casting me in this piece-of-sh*t, god- awful movie. ” Halle Berry

Slide 90

Slide 90

Slide 91

Slide 91

Angular: Performance • Uglify • code minification • reduces names of local variables • Webpack • traverses your source tree via module imports • only include modules that are used Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 91/151

Slide 92

Slide 92

Angular: Performance • Ahead-of-Time compilation • pre-compiles application components and templates • Angular compiler not included in bundle • Lazy-Load modules • not all modules are needed at startup • pre-load in background Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 92/151

Slide 93

Slide 93

Slide 94

Slide 94

Native Code

Slide 95

Slide 95

{N} Angular directory structure app/components/slider/ slider.component.html slider.component.ts slider.component.css slider-routing.module.ts slider-module.ts Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 95/151

Slide 96

Slide 96

slider.component.html < ActionBar

title ="Slider"></ ActionBar

< StackLayout

< Slider

value ="70"></ Slider

</ StackLayout

Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 96/151

Slide 97

Slide 97

slider.component.ts import { Component } from

"@angular/core" ; @Component({

selector : "app-slider" ,

moduleId : module .id,

templateUrl : "slider.component.html" ,

styleUrls : [ "slider.component.css" ] }) export

class SliderComponent {

constructor () {} } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 97/151

Slide 98

Slide 98

slider.component.css ActionBar {

color : white;

background-color : red; } StackLayout {

padding : 50 ; } Slider {

background-color : red; } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 98/151

Slide 99

Slide 99

Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 99/151

Slide 100

Slide 100

slider.component.html < ActionBar

title ="Slider"></ ActionBar

< StackLayout

< Slider

slider-icon

value ="70"></ Slider

</ StackLayout

• attribute directive • changes the appearance or behavior of an element Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 100/151

Slide 101

Slide 101

slider.directive.ts import { Directive, ElementRef } from

"@angular/core" ; import { isIOS } from

"platform" ; @Directive({

selector : "[slider-icon]" }) export

class SliderIconDirective {

constructor (private el: ElementRef) {

if (isIOS) {

let uiSlider = this .el.nativeElement.ios; uiSlider.setThumbImageForState( UIImage.imageNamed( "image.png" ), UIControlState.Normal); } } } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 101/151

Slide 102

Slide 102

slider.directive.ts import { Directive, ElementRef } from

"@angular/core" ; import { isIOS } from

"platform" ; @Directive({

selector : "[slider-icon]" }) export

class SliderIconDirective {

constructor (private el: ElementRef) {

if (isIOS) {

let uiSlider = this .el.nativeElement.ios; uiSlider.setThumbImageForState( UIImage.imageNamed( "image.png" ), UIControlState.Normal); } } } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 102/151

Slide 103

Slide 103

slider.directive.ts import { Directive, ElementRef } from

"@angular/core" ; import { isIOS } from

"platform" ; @Directive({

selector : "[slider-icon]" }) export

class SliderIconDirective {

constructor (private el: ElementRef) {

if (isIOS) {

let uiSlider = this .el.nativeElement.ios; uiSlider.setThumbImageForState( UIImage.imageNamed( "image.png" ), UIControlState.Normal); } } } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 103/151

Slide 104

Slide 104

slider.module.ts import { NgModule, NO_ERRORS_SCHEMA } from

"@angular/core" ; import { NativeScriptModule } from

"nativescript-angular/nativescript.module" ; import { SliderIconDirective } from

"./slider.directive" ; import { SliderRoutingModule } from

"./slider-routing.module" ; import { SliderComponent } from

"./slider.component" ; @NgModule({

imports : [NativeScriptModule, SliderRoutingModule],

declarations : [SliderComponent, SliderIconDirective],

schemas : [NO_ERRORS_SCHEMA] }) export

class SliderModule {} Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 104/151

Slide 105

Slide 105

Slide 106

Slide 106

106/151

Slide 107

Slide 107

Slide 108

Slide 108

Packages & Libraries

Slide 109

Slide 109

Node Package Manager • commonly known as npm • ready to use JavaScript modules • about 650.000 packages of free, reusable code • npm install packagename --save • package.json Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 109/151

Slide 110

Slide 110

Node Package Manager crypto-js Cryptography standards (AES-256) accounting.js Number, money and currency formatting email-validator Email syntax validator Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 110/151

Slide 111

Slide 111

Android Arsenal • libraries for Android (Java / Kotlin) Cocoapods • libraries for iOS (Objective-C / Swift) Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 111/151

Slide 112

Slide 112

Slide 113

Slide 113

Multilingual: ngx-translate

Slide 114

Slide 114

Multilingual: ngx-translate • internationalization library for Angular 2+ • define translations in different languages • switch between them easily • no hardcoded text/labels, all in one place • start directly, even with one language Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 114/151

Slide 115

Slide 115

Multilingual: ngx-translate {

"HOME" : {

"TITLE" : "Hello DevDays Vilnius!" ,

"TEXT" : "It's great to be here and introduce NativeScript to you." ,

"SLIDER" : "Slider" ,

"ENGLISH" : "English" ,

"FOREIGN" : "Lithuanian" ,

"MACHINE_LEARNING" : "Machine Learning" ,

"SPEECH_RECOGNITION" : "Speech Recognition" } } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 115/151

Slide 116

Slide 116

Multilingual: ngx-translate < ActionBar

[ title ]="'HOME.TITLE' | translate"> </ ActionBar

< Button

[ text ]="'HOME.ENGLISH' | translate" ( tap )="changeLanguage('en')"> </ Button

[] = one way data binding in Angular | = display-value transformations Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 116/151

Slide 117

Slide 117

117/151

Slide 118

Slide 118

Slide 119

Slide 119

NativeScript Plugins

Slide 120

Slide 120

{N} Plugins Anatomy

Slide 121

Slide 121

version-number.ios.ts export

class VersionNumber { get() {

let version = NSBundle.mainBundle.objectForInfoDictionaryKey( "CFBundleShortVersionString" );

return version; } } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 121/151

Slide 122

Slide 122

version-number.android.ts import * as application from

"application" ; export

class VersionNumber { get() {

let PackageManager = android.content.pm.PackageManager;

let pkg = application.android.context .getPackageManager() .getPackageInfo(application.android.context.getPackageName(), PackageManager.GET_META_DATA);

return pkg.versionName; } } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 122/151

Slide 123

Slide 123

version-number.d.ts export declare class VersionNumber { get(): any; } Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 123/151

Slide 124

Slide 124

Install tns plugin add nativescript-version-number use import { VersionNumber } from

"nativescript-version-number" ; let version = new VersionNumber().get(); Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 124/151

Slide 125

Slide 125

Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 125/151

Slide 126

Slide 126

Slide 127

Slide 127

Machine Learning

Slide 128

Slide 128

Slide 129

Slide 129

Slide 130

Slide 130

Text Recognition • Dutch synopsis • Translate to English with Yandex 130/151

Slide 131

Slide 131

Slide 132

Slide 132

Slide 133

Slide 133

Landmark Recognition • Bridge in London • Near St Paul's Cathedral 133/151

Slide 134

Slide 134

Slide 135

Slide 135

Slide 136

Slide 136

Slide 137

Slide 137

Slide 138

Slide 138

{N} Plugins live demo

Slide 139

Slide 139

Nativescript plugins • nativescript-bluetooth • nativescript-camera • nativescript-social-share • nativescript-speech-recognition • nativescript-texttospeech • nativescript-videoplayer Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 139/151

Slide 140

Slide 140

nativescript-bluetooth import * as bluetooth from

"nativescript-bluetooth" ; bluetooth.isBluetoothEnabled() .then( function ( enabled ) { alert( "Enabled? "

  • enabled); }); Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 140/151

Slide 141

Slide 141

nativescript-bluetooth private uuid = "CA9F644C-1920-4572-8833-1D137A6T2A05" ; bluetooth.startScanning({

seconds : 4 ,

onDiscovered : peripheral => {

if (peripheral.UUID == this .uuid) { bluetooth.connect({

UUID : peripheral.UUID,

onConnected : peripheral => { bluetooth.stopScanning();

// do stuff } }); } } }); Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 141/151

Slide 142

Slide 142

nativescript-camera import * as camera from

"nativescript-camera" ; import { ImageSource } from

"tns-core-modules/image-source" ; camera.requestPermissions(); camera.takePicture({

width : 1000 ,

height : 1000 }) .then( imageAsset => {

new ImageSource().fromAsset(imageAsset).then( imageSource => {

// do something with the image }); }); Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 142/151

Slide 143

Slide 143

nativescript-social-share import * as camera from

"nativescript-camera" ; import { ImageSource } from

"tns-core-modules/image-source" ; import * as SocialShare from

"nativescript-social-share" ; camera.requestPermissions(); camera.takePicture({

width : 1000 ,

height : 1000 }) .then( imageAsset => {

new ImageSource().fromAsset(imageAsset).then( imageSource => { SocialShare.shareImage(imageSource); }); }); Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 143/151

Slide 144

Slide 144

nativescript-speech-recognition import { SpeechRecognition, SpeechRecognitionTranscription }

from

"nativescript-speech-recognition" ; private speechRecognition = new SpeechRecognition(); this .speechRecognition.available().then(

( available: boolean ) =>

console .log(available ? "YES!" : "NO" ), (err: string) => console .log(err) ); this .speechRecognition.requestPermission().then( ( granted: boolean ) => {

console .log( "Granted? "

  • granted); }); Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 144/151

Slide 145

Slide 145

nativescript-speech-recognition this .speechRecognition.startListening({

locale : "en-US" ,

returnPartialResults : true ,

onResult : ( transcription: SpeechRecognitionTranscription ) => {

console .log( User said: ${transcription.text} ); } }); this .speechRecognition.stopListening().then( () => {

// do something with the recognized text }); Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 145/151

Slide 146

Slide 146

nativescript-texttospeech import { TNSTextToSpeech, SpeakOptions }

from

"nativescript-texttospeech" ; let textToSpeech = new TNSTextToSpeech(); let speakOptions: SpeakOptions = {

text : "Hello world!" ,

locale : "en-GB" ,

speakRate : 0.5 ,

pitch : 0.8 }; textToSpeech.speak(speakOptions); Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 146/151

Slide 147

Slide 147

nativescript-videoplayer < VideoPlayer

src ="video.mp4"

controls ="true"

loop ="true"

autoplay ="false"> </ VideoPlayer

Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 147/151

Slide 148

Slide 148

Win {N} Socks! @rowdyrabouw

Slide 149

Slide 149

Slide 150

Slide 150

A č i ū ! 2xr.nl/DevDaysVilnius

Slide 151

Slide 151

Links Native elements playground: http://2xr.nl/markup keyboardType playground: http://2xr.nl/keyboardType TabView playground: http://2xr.nl/TabView Plugin demo app: http://2xr.nl/DevDaysVilnius2018code Unleash your web skills on native! - Rowdy Rabouw - DevDays Vilnius 2018 - @rowdyrabouw 151/151