UNPKG

ng-voice-inputs

Version:

This library provides Voice Recognition service to fill the form input fields (text, datepicker, textarea, button-click) for Angular application.

1,121 lines (1,107 loc) 46.1 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rxjs'), require('moment/moment'), require('@angular/common'), require('@angular/core')) : typeof define === 'function' && define.amd ? define('ng-voice-inputs', ['exports', 'rxjs', 'moment/moment', '@angular/common', '@angular/core'], factory) : (factory((global['ng-voice-inputs'] = {}),global.rxjs,global.moment_,global.ng.common,global.ng.core)); }(this, (function (exports,rxjs,moment_,common,i0) { 'use strict'; /*! ***************************************************************************** Copyright (c) Microsoft Corporation. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ***************************************************************************** */ var __assign = function () { __assign = Object.assign || function __assign(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; function __read(o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; } function __spread() { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; } /** * @fileoverview added by tsickle * Generated from: lib/ng-voice-inputs.service.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** @type {?} */ var moment = moment_; /** @type {?} */ var UNIT = { zero: 0, first: 1, one: 1, second: 2, two: 2, third: 3, thirteenth: 13, thirteen: 13, three: 3, fourth: 4, fourteenth: 14, fourteen: 14, four: 4, fifteenth: 15, fifteen: 15, fifth: 5, five: 5, sixth: 6, sixteenth: 16, sixteen: 16, six: 6, seventeenth: 17, seventeen: 17, seventh: 7, seven: 7, eighteenth: 18, eighteen: 18, eighth: 8, eight: 8, nineteenth: 19, nineteen: 19, ninth: 9, nine: 9, tenth: 10, ten: 10, eleventh: 11, eleven: 11, twelfth: 12, twelve: 12, a: 1, }; /** @type {?} */ var TWOS = { ten: 10, eleven: 11, twelve: 12, thirteen: 13, fourteen: 14, fifteen: 15, sixteen: 16, seventeen: 17, eighteen: 18, nineteen: 19 }; /** @type {?} */ var TEN = { twenty: 20, twentieth: 20, thirty: 30, thirtieth: 30, forty: 40, fortieth: 40, fifty: 50, fiftieth: 50, sixty: 60, sixtieth: 60, seventy: 70, seventieth: 70, eighty: 80, eightieth: 80, ninety: 90, ninetieth: 90, }; /** @type {?} */ var MAGNITUDE = { hundred: 100, hundredth: 100, thousand: 1000, million: 1000000, billion: 1000000000, trillion: 1000000000000, quadrillion: 1000000000000000, quintillion: 1000000000000000000, sextillion: 1000000000000000000000, septillion: 1000000000000000000000000, octillion: 1000000000000000000000000000, nonillion: 1000000000000000000000000000000, decillion: 1000000000000000000000000000000000, }; /** @type {?} */ var NUMBER = __assign({}, UNIT, TEN, MAGNITUDE); /** @type {?} */ var SUFFIXES = ['st', 'nd', 'rd', 'th']; /** @type {?} */ var MONTHS = ["JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER", "OCTOBER", "NOVEMBER", "DECEMBER"]; /** @type {?} */ var KEY_WORDS_FWD_NAV = ['forward', 'next']; /** @type {?} */ var KEY_WORDS_BCK_NAV = ['back', 'backward', 'previous']; /** @type {?} */ var KEY_WORDS_CLEAR = ['clear', 'clean', 'delete', 'remove']; /** @type {?} */ var KEY_WORDS_CLICK = ['click', 'submit', 'expand', 'open', 'show']; /** @type {?} */ var KEY_WORDS_STOP = ['stop', 'end', 'done']; /** @type {?} */ var KEY_WORDS_SCROLL_UP = ['scroll up', 'go up', 'up']; /** @type {?} */ var KEY_WORDS_SCROLL_DOWN = ['scroll down', 'go down', 'down']; /** @type {?} */ var KEY_WORDS_SCROLL_RIGHT = ['scroll right', 'go right', 'right']; /** @type {?} */ var KEY_WORDS_SCROLL_LEFT = ['scroll left', 'go left', 'left']; /** @type {?} */ var KEY_WORDS_SCROLL_TOP = ['scroll top', 'go top', 'top']; /** @type {?} */ var KEY_WORDS_SCROLL_BOTTOM = ['scroll bottom', 'go bottom', 'bottom']; /** @type {?} */ var KEY_WORDS_SCROLL_CONTINUE = ['keep scrolling', 'scroll', 'scrolling', 'continue scrolling']; /** @type {?} */ var KEY_WORDS_SCROLL = __spread(KEY_WORDS_SCROLL_UP, KEY_WORDS_SCROLL_DOWN, KEY_WORDS_SCROLL_RIGHT, KEY_WORDS_SCROLL_LEFT, KEY_WORDS_SCROLL_TOP, KEY_WORDS_SCROLL_BOTTOM, KEY_WORDS_SCROLL_CONTINUE); /** @type {?} */ var KEY_WORDS_INST = __spread(['goto', 'switch', 'go'], KEY_WORDS_CLEAR, KEY_WORDS_CLICK, KEY_WORDS_SCROLL); // Instruction types /** @type {?} */ var KEY_WORDS_NAV = __spread(KEY_WORDS_FWD_NAV, KEY_WORDS_BCK_NAV, KEY_WORDS_STOP, KEY_WORDS_SCROLL, [ 'first', 'last', ]); // Navigation types /** @type {?} */ var KEY_WORDS = __spread(KEY_WORDS_INST, KEY_WORDS_NAV); /** @type {?} */ var INST_MAPPINGS = { next: KEY_WORDS_FWD_NAV, previous: KEY_WORDS_BCK_NAV, first: ['first'], last: ['last'], clear: KEY_WORDS_CLEAR, click: KEY_WORDS_CLICK, stop: KEY_WORDS_STOP, scrollUp: KEY_WORDS_SCROLL_UP, scrollDown: KEY_WORDS_SCROLL_DOWN, scrollLeft: KEY_WORDS_SCROLL_LEFT, scrollRight: KEY_WORDS_SCROLL_RIGHT, scrollTop: KEY_WORDS_SCROLL_TOP, scrollBottom: KEY_WORDS_SCROLL_BOTTOM, scrollContinue: KEY_WORDS_SCROLL_CONTINUE }; var VuiVoiceRecognitionService = /** @class */ (function () { function VuiVoiceRecognitionService() { this.response = new rxjs.Subject(); this.inputRefs = []; this.currentRef = 0; } /** * @param {?} speechKeys * @param {?} inputType * @return {?} */ VuiVoiceRecognitionService.prototype.isInputSwitch = /** * @param {?} speechKeys * @param {?} inputType * @return {?} */ function (speechKeys, inputType) { if (inputType == 'address' && !speechKeys.some(( /** * @param {?} key * @return {?} */function (key) { return KEY_WORDS_INST.includes(key); }))) { return false; } if (speechKeys.some(( /** * @param {?} key * @return {?} */function (key) { return KEY_WORDS.includes(key); }))) { return true; } return false; }; /** * @param {?} speechText * @param {?} inputType * @return {?} */ VuiVoiceRecognitionService.prototype.findInstructionType = /** * @param {?} speechText * @param {?} inputType * @return {?} */ function (speechText, inputType) { /** @type {?} */ var type = ''; speechText = speechText.trim().toLocaleLowerCase(); /** @type {?} */ var speechKeys = speechText.trim().toLocaleLowerCase().split(' '); if (this.isInputSwitch(speechKeys, inputType)) { /** @type {?} */ var foundKey = Object.keys(INST_MAPPINGS).find(( /** * @param {?} instType * @return {?} */function (instType) { return speechKeys.some(( /** * @param {?} key * @return {?} */function (key) { return INST_MAPPINGS[instType].includes(key); })); })); type = foundKey ? "COMMAND_" + foundKey.toUpperCase() : ''; } else { type = 'INPUT'; } return type; }; /** * @param {?} speechText * @param {?} inputType * @return {?} */ VuiVoiceRecognitionService.prototype.interpretSpeech = /** * @param {?} speechText * @param {?} inputType * @return {?} */ function (speechText, inputType) { var _this = this; /** @type {?} */ var instType = this.findInstructionType(speechText, inputType); if (instType != 'INPUT') { return instType; } if (inputType == 'text' || inputType == 'address') { return speechText; } if (inputType == 'number') { return this.wordsToNumber(speechText); } if (inputType == 'date') { speechText = speechText.replace('from', ''); /** @type {?} */ var dates = speechText.trim().split('to '); /** @type {?} */ var parsedDates_1 = []; dates.forEach(( /** * @param {?} dateStr * @return {?} */function (dateStr) { parsedDates_1.push(_this.dateParser(dateStr)); })); if (parsedDates_1[0].isValid()) { return parsedDates_1; } } return null; }; /** * @param {?} dateStr * @return {?} */ VuiVoiceRecognitionService.prototype.dateParser = /** * @param {?} dateStr * @return {?} */ function (dateStr) { var _this = this; /** @type {?} */ var parsedDate; /** @type {?} */ var cleanDateStr = dateStr; /** @type {?} */ var dateParts = dateStr.trim().split(' '); /** @type {?} */ var datePartObj = {}; /** @type {?} */ var isPureNumber = false; /** @type {?} */ var cleanDateParts = []; if (dateParts.length == 3) { cleanDateParts = dateParts.map(( /** * @param {?} dateStr * @return {?} */function (dateStr) { return _this.eliminateString(dateStr); })); isPureNumber = cleanDateParts.every(( /** * @param {?} dateStr * @return {?} */function (dateStr) { return Number.isInteger(dateStr); })); } if (isPureNumber) { cleanDateStr = cleanDateParts.join('-'); } else { /** @type {?} */ var currentDate = moment(); dateParts.forEach(( /** * @param {?} dateStr * @return {?} */function (dateStr) { datePartObj = _this.parseDatePart(dateStr, datePartObj); })); /** @type {?} */ var availableKeys = Object.keys(datePartObj).join('-'); switch (availableKeys) { case 'date': datePartObj.month = currentDate.format('MM'); case 'date-month': datePartObj.year = currentDate.format('YYYY'); break; case 'year': datePartObj.month = '01'; case 'month-year': datePartObj.date = '01'; break; case 'month': datePartObj.year = currentDate.format('YYYY'); datePartObj.date = '01'; } cleanDateStr = this.dateBuilder(datePartObj); } parsedDate = moment(cleanDateStr).toDate(); return parsedDate; }; /** * @param {?} datePartObj * @return {?} */ VuiVoiceRecognitionService.prototype.dateBuilder = /** * @param {?} datePartObj * @return {?} */ function (datePartObj) { /** @type {?} */ var dateStr = ''; dateStr = datePartObj.year + "-" + datePartObj.month + "-" + datePartObj.date; return dateStr; }; /** * * @param datePart Incomplete date part eg, '21st' is the date part for the date '21st July 2020' * @param datePartObj // Inherited from caller & updated with parsed object. Can be year, month or date */ /** * * @param {?} datePart Incomplete date part eg, '21st' is the date part for the date '21st July 2020' * @param {?} datePartObj // Inherited from caller & updated with parsed object. Can be year, month or date * @return {?} */ VuiVoiceRecognitionService.prototype.parseDatePart = /** * * @param {?} datePart Incomplete date part eg, '21st' is the date part for the date '21st July 2020' * @param {?} datePartObj // Inherited from caller & updated with parsed object. Can be year, month or date * @return {?} */ function (datePart, datePartObj) { if (this.isYearType(datePart)) { /** @type {?} */ var year = this.wordsToNumber(datePart); datePartObj.year = year; } else if (this.isDateType(datePart)) { /** @type {?} */ var date = this.wordsToNumber(datePart); datePartObj.date = date; } else if (this.isMonthType(datePart)) { /** @type {?} */ var month = MONTHS.indexOf(datePart.toUpperCase()) + 1; datePartObj.month = month < 10 ? '0' + month : month; } return datePartObj; }; /** * @param {?} datePart * @return {?} */ VuiVoiceRecognitionService.prototype.isDateType = /** * @param {?} datePart * @return {?} */ function (datePart) { /** @type {?} */ var isDatePart = false; isDatePart = (/\d/.test(datePart) && SUFFIXES.includes(datePart.substr(datePart.length - 2))); if (!isDatePart) { /** @type {?} */ var number = this.wordsToNumber(datePart); if (number > 0 && number <= 31) { isDatePart = true; } } return isDatePart; }; /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ VuiVoiceRecognitionService.prototype.parseDateVal = /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ function (datePart, datePartObj) { /** @type {?} */ var isDatePart = false; /** @type {?} */ var convertedNum = 0; isDatePart = SUFFIXES.some(( /** * @param {?} key * @return {?} */function (key) { return datePart.includes(key); })); if (!isDatePart) { convertedNum = this.wordsToNumber(datePart); if (convertedNum > 0 && convertedNum <= 31) { isDatePart = true; } } if (isDatePart) { datePartObj.date = convertedNum; } }; /** * @param {?} datePart * @return {?} */ VuiVoiceRecognitionService.prototype.isMonthType = /** * @param {?} datePart * @return {?} */ function (datePart) { /** @type {?} */ var month = MONTHS.indexOf(datePart.toUpperCase()); return month > -1; }; /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ VuiVoiceRecognitionService.prototype.parseMonthVal = /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ function (datePart, datePartObj) { /** @type {?} */ var month = MONTHS.indexOf(datePart.toUpperCase()); if (month > -1) { datePartObj.month = month < 10 ? '0' + month : month; } }; /** * @param {?} datePart * @return {?} */ VuiVoiceRecognitionService.prototype.isYearType = /** * @param {?} datePart * @return {?} */ function (datePart) { /** @type {?} */ var year = this.wordsToNumber(datePart); return year > 1000; }; /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ VuiVoiceRecognitionService.prototype.parseYearVal = /** * @param {?} datePart * @param {?} datePartObj * @return {?} */ function (datePart, datePartObj) { /** @type {?} */ var year = this.wordsToNumber(datePart); if (year > 1000) { datePartObj.year = year; } }; /** * @param {?} word * @return {?} */ VuiVoiceRecognitionService.prototype.wordsToNumber = /** * @param {?} word * @return {?} */ function (word) { var _this = this; // Returning integer if it is not actual word if (!Number.isNaN(parseInt(word))) { return parseInt(word); } word = word.replace(/and/g, ''); // Replace joiners // Replace joiners /** @type {?} */ var words = word.toLowerCase().trim().split(' '); /** @type {?} */ var num = 0; words = this.parseColloquialWords(words); words.forEach(( /** * @param {?} wordStr * @return {?} */function (wordStr) { wordStr = _this.eliminateString(wordStr); if (typeof wordStr == 'number') { num = wordStr; } else { if (UNIT[wordStr]) { num = num + NUMBER[wordStr]; } else if (TEN[wordStr]) { num = num + TEN[wordStr]; } else if (MAGNITUDE[wordStr]) { num = num * MAGNITUDE[wordStr]; } } })); return num; }; /** * @param {?} wordsArr * @return {?} */ VuiVoiceRecognitionService.prototype.parseColloquialWords = /** * @param {?} wordsArr * @return {?} */ function (wordsArr) { if (wordsArr.length == 2) { if (TEN[wordsArr[0]] && (TEN[wordsArr[1]] || TWOS[wordsArr[1]])) { wordsArr.splice(1, 0, 'hundred'); } } if (MAGNITUDE[wordsArr[0]]) { wordsArr.splice(0, 0, 'one'); } return wordsArr; }; /** * @param {?} word * @return {?} */ VuiVoiceRecognitionService.prototype.eliminateString = /** * @param {?} word * @return {?} */ function (word) { if (/\d/.test(word) && SUFFIXES.includes(word.substr(word.length - 2))) { word = word.substr(0, word.length - 2); // Remove last suffixes such as 'st', 'th' from 1st, 10th word = parseInt(word); } return word; }; VuiVoiceRecognitionService.decorators = [ { type: i0.Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ VuiVoiceRecognitionService.ngInjectableDef = i0.defineInjectable({ factory: function VuiVoiceRecognitionService_Factory() { return new VuiVoiceRecognitionService(); }, token: VuiVoiceRecognitionService, providedIn: "root" }); return VuiVoiceRecognitionService; }()); /** * @fileoverview added by tsickle * Generated from: lib/vui-input.directive.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** @type {?} */ var moment$1 = moment_; /** @type {?} */ var DEFAULT_OPTS = { type: 'text', format: 'DD/MM/YYYY' }; var VuiInputDirective = /** @class */ (function () { function VuiInputDirective(vuiService, el) { var _this = this; this.vuiService = vuiService; this.el = el; this.el.nativeElement.setAttribute('vui-ref', this.vuiService.inputRefs.length); this.vuiService.inputRefs.push(this.el); this.el.nativeElement.addEventListener('focus', ( /** * @param {?} evt * @return {?} */function (evt) { _this.vuiService.currentRef = parseInt(evt.target.getAttribute('vui-ref')); })); } /** * @return {?} */ VuiInputDirective.prototype.ngOnInit = /** * @return {?} */ function () { this.options = __assign({}, DEFAULT_OPTS, this.options); this.el['options'] = this.options; }; /** * @param {?} date * @return {?} */ VuiInputDirective.prototype.formatDate = /** * @param {?} date * @return {?} */ function (date) { return moment$1(date).format(this.options.format); }; VuiInputDirective.decorators = [ { type: i0.Directive, args: [{ selector: '[vuiInput]' },] } ]; /** @nocollapse */ VuiInputDirective.ctorParameters = function () { return [ { type: VuiVoiceRecognitionService }, { type: i0.ElementRef } ]; }; VuiInputDirective.propDecorators = { options: [{ type: i0.Input, args: ['vuiInput',] }] }; return VuiInputDirective; }()); /** * @fileoverview added by tsickle * Generated from: lib/vui-response.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @param type Type of response * Possible values for type are: * 'date-range', 'date', 'text', 'number' * @param value Response value which can be text, number, date * */ var /** * @param type Type of response * Possible values for type are: * 'date-range', 'date', 'text', 'number' * @param value Response value which can be text, number, date * */ VuiResponse = /** @class */ (function () { function VuiResponse(type, value) { this.type = type || 'text'; this.value = value; } return VuiResponse; }()); /** * @fileoverview added by tsickle * Generated from: lib/ng-voice-inputs.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** @type {?} */ var moment$2 = moment_; /** @type {?} */ var DEFAULT_STYLE = { containerClass: 'centered', iconStart: 'icon icon-mic', iconParse: 'icon icon-mic', iconStop: 'icon icon-mic', animationParse: 'parsing', animationListen: 'listening' }; /** @type {?} */ var DEFAULT_SCROLL_OFFSET = 200; /** @type {?} */ var DEFAULT_SCROLL_DURATION = 300; /** @type {?} */ var DEFAULT_SCROLL_DIRECTION = 'vertical'; var NgVoiceInputsComponent = /** @class */ (function () { function NgVoiceInputsComponent(vuiService, ref) { var _this = this; this.vuiService = vuiService; this.ref = ref; this.onValueChange = new i0.EventEmitter(); /** * Decides direction of scroll movement ( Up or Down ) or ( Left or Right) * +ve value indicates Down/Right and -ve value idicates Up/Left */ this.activeDirection = +1; /** * Decides direction of Scroll ( Vertical or Horizontal ) */ this.scrollDirection = DEFAULT_SCROLL_DIRECTION; this.scrollToTop = ( /** * @param {?} duration * @return {?} */function (duration) { /** @type {?} */ var interval = setInterval(( /** * @return {?} */function () { /** @type {?} */ var pos = Math.abs(Math.round((window.pageYOffset / (duration / 100)))); if (pos > 0) { window.scrollTo(0, pos - 20); // how far to scroll on each step } else { clearInterval(interval); } }), 100); }); this.scrollBy = ( /** * @param {?} offset * @param {?} duration * @param {?=} direction * @return {?} */function (offset, duration, direction) { _this.activeDirection = (offset / offset); _this.scrollDirection = direction || DEFAULT_SCROLL_DIRECTION; if (offset == 1) { offset = window.outerHeight; } /** @type {?} */ var val = Math.abs(Math.round((offset / (duration / 100)))); /** @type {?} */ var totalOffset = 0; /** @type {?} */ var interval = setInterval(( /** * @return {?} */function () { if (totalOffset >= Math.abs(offset)) { clearInterval(interval); } else { /** @type {?} */ var opt = { top: offset < 0 ? -1 * val : val, left: 0 }; if (direction == 'horizontal') { opt = { top: 0, left: offset < 0 ? -1 * val : val }; } window.scrollBy(__assign({}, opt, { behavior: 'smooth' })); totalOffset = totalOffset + val; } }), 100); }); this.scroll = { SCROLLDOWN: ( /** * @return {?} */function () { _this.scrollBy(_this.scrollOffset, _this.scrollDuration); }), SCROLLUP: ( /** * @return {?} */function () { _this.scrollBy(-1 * _this.scrollOffset, _this.scrollDuration); }), SCROLLRIGHT: ( /** * @return {?} */function () { _this.scrollBy(_this.scrollOffset, _this.scrollDuration, 'horizontal'); }), SCROLLLEFT: ( /** * @return {?} */function () { _this.scrollBy(-1 * _this.scrollOffset, _this.scrollDuration, 'horizontal'); }), SCROLLBOTTOM: ( /** * @return {?} */function () { _this.scrollBy(1, _this.scrollDuration); }), SCROLLTOP: ( /** * @return {?} */function () { _this.scrollToTop(_this.scrollDuration); }), SCROLLCONTINUE: ( /** * @return {?} */function () { /** @type {?} */ var factor = Math.ceil(window.outerHeight / _this.scrollDuration); console.log(factor * _this.scrollDuration, factor); _this.scrollBy(window.outerHeight, factor * 1000); }) }; } /** * @return {?} */ NgVoiceInputsComponent.prototype.ngOnInit = /** * @return {?} */ function () { this.style = __assign({}, DEFAULT_STYLE, this.style); this.scrollOffset = this.scrollOffset || DEFAULT_SCROLL_OFFSET; this.scrollDuration = this.scrollDuration || DEFAULT_SCROLL_DURATION; try { this.initVoiceRecognition(); } catch (e) { console.error('Failed to initialize or parse'); this.stopRecognition(); } this.vuiService.response.subscribe(this.vuiResponseSubscription.bind(this)); }; /** * @param {?} data * @return {?} */ NgVoiceInputsComponent.prototype.vuiResponseSubscription = /** * @param {?} data * @return {?} */ function (data) { this.transcript = ''; /** @type {?} */ var currentRef = this.vuiService.currentRef; if (data.type == 'COMMAND_NEXT') { currentRef = ++this.vuiService.currentRef; } else if (data.type == 'COMMAND_PREVIOUS') { currentRef = --this.vuiService.currentRef; } else if (data.type == 'COMMAND_FIRST') { currentRef = 0; } else if (data.type == 'COMMAND_LAST') { currentRef = this.vuiService.inputRefs.length - 1; } else if (data.type == 'COMMAND_CLEAR') { this.vuiService.inputRefs[currentRef].nativeElement.value = ''; } else if (data.type == 'COMMAND_CLICK') { this.vuiService.inputRefs[currentRef].nativeElement.click(); } else if (data.type.includes('COMMAND_SCROLL')) { this.scroll[data.type.replace('COMMAND_', '')].call(); } else if (data.type == 'COMMAND_STOP') { this.stopRecognition(); } else { /** @type {?} */ var currentInputObj = this.vuiService.inputRefs[currentRef]; /** @type {?} */ var currentEl = currentInputObj.nativeElement; /** @type {?} */ var opts = currentInputObj['options']; if (data.value && data.value[0] instanceof Date) { if (currentEl.type == 'date' || currentEl.type == 'datetime') { currentEl.value = this.formatDate(data.value[0], 'YYYY-MM-DD'); } else { currentEl.value = this.formatDate(data.value[0], opts && opts.format); } } else { currentEl.value = data.value; } currentEl.dispatchEvent(new Event('input')); this.onValueChange.emit(data); } this.vuiService.inputRefs[currentRef].nativeElement.focus(); this.setProcess('listening'); }; /** * @param {?} processType * @return {?} */ NgVoiceInputsComponent.prototype.setProcess = /** * @param {?} processType * @return {?} */ function (processType) { this.process = processType; this.ref.detectChanges(); }; /** * @param {?} date * @param {?=} format * @return {?} */ NgVoiceInputsComponent.prototype.formatDate = /** * @param {?} date * @param {?=} format * @return {?} */ function (date, format) { return moment$2(date).format(format || 'DD/MM/YYYY'); }; /** * @return {?} */ NgVoiceInputsComponent.prototype.initVoiceRecognition = /** * @return {?} */ function () { var _this = this; this.recognition = new window['webkitSpeechRecognition'](); this.recognition.continuous = true; this.recognition.interimResults = true; this.recognition.onstart = ( /** * @param {?} event * @return {?} */function (event) { _this.setProcess('listening'); }); this.recognition.onresult = ( /** * @param {?} event * @return {?} */function (event) { /** @type {?} */ var currentInputObj = _this.vuiService.inputRefs[_this.vuiService.currentRef]; /** @type {?} */ var opts = currentInputObj['options']; _this.setProcess('parsing'); for (var i = event.resultIndex; i < event.results.length; ++i) { if (event.results[i].isFinal) { _this.transcript += event.results[i][0].transcript; /** @type {?} */ var data = _this.vuiService.interpretSpeech(_this.transcript, opts && opts.type); /** @type {?} */ var resp = new VuiResponse('invalid', data); if (data) { resp = new VuiResponse('date-range', data); if (typeof data == 'string') { resp = new VuiResponse(data, data.includes('_') ? '' : data); } } _this.vuiService.response.next(resp); } } }); this.recognition.onerror = ( /** * @return {?} */function () { _this.setProcess(null); }); this.recognition.onend = ( /** * @return {?} */function () { _this.setProcess(null); }); }; /** * @return {?} */ NgVoiceInputsComponent.prototype.startRecognition = /** * @return {?} */ function () { this.transcript = ''; this.recognition.start(); }; /** * @return {?} */ NgVoiceInputsComponent.prototype.stopRecognition = /** * @return {?} */ function () { this.transcript = ''; this.recognition.stop(); this.setProcess(null); }; NgVoiceInputsComponent.decorators = [ { type: i0.Component, args: [{ selector: 'ng-voice-input', template: "\n <div [class]=\"style.containerClass\">\n <i [class]=\"style.iconStart\" mat-raised-button (click)=\"startRecognition()\" *ngIf=\"!process\"></i>\n <i [ngClass]=\"process == 'parsing' ? style.iconParse + ' ' + style.animationParse : style.iconStop + ' ' + style.animationListen\" (click)=\"stopRecognition()\" *ngIf=\"process\"></i>\n </div>\n ", encapsulation: i0.ViewEncapsulation.None, styles: [".centered{margin:auto;text-align:center}.listening{color:red}.parsing{color:green}.icon{position:relative;width:45px;height:45px;display:inline-block;background-size:26px 26px;background-position:7px 7px;background-repeat:no-repeat;cursor:pointer}.icon.parsing::after{opacity:0;position:absolute;top:-5px;left:-5px;right:0;bottom:0;content:'';border:3px solid #42c0fb;border-radius:100%;-webkit-animation-name:ripple;animation-name:ripple;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:cubic-bezier(.65,0,.34,1);animation-timing-function:cubic-bezier(.65,0,.34,1);z-index:-1}.icon.parsing::before{opacity:0;position:absolute;top:-5px;left:-5px;right:0;bottom:0;content:'';border:3px solid #42c0fb;border-radius:100%;-webkit-animation-name:ripple;animation-name:ripple;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-delay:.3s;animation-delay:.3s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:cubic-bezier(.65,0,.34,1);animation-timing-function:cubic-bezier(.65,0,.34,1);z-index:-1}.icon.listening::after{opacity:0;position:absolute;top:-5px;left:-5px;right:0;bottom:0;content:'';border:3px solid #42c0fb44;border-radius:100%;-webkit-animation-name:ripple;animation-name:ripple;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-delay:0s;animation-delay:0s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-timing-function:cubic-bezier(.65,0,.34,1);animation-timing-function:cubic-bezier(.65,0,.34,1);z-index:-1}.icon-small{width:25px;height:25px;background-size:15px 15px;background-position:5px 10px}.icon-mic{background-image:url(\"data:image/svg+xml;utf8,<svg version='1.0' xmlns='http://www.w3.org/2000/svg' width='853.000000pt' height='1280.000000pt' viewBox='0 0 853.000000 1280.000000' preserveAspectRatio='xMidYMid meet'> <metadata> Created by potrace 1.15, written by Peter Selinger 2001-2017 </metadata> <g transform='translate(0.000000,1280.000000) scale(0.100000,-0.100000)' fill='rgb(66,192,251)' > <path d='M4060 12789 c-194 -22 -402 -81 -577 -164 -472 -224 -789 -626 -894 -1135 l-24 -115 0 -2575 c0 -2452 1 -2579 18 -2665 145 -710 755 -1260 1492 -1345 327 -37 671 21 975 166 473 226 789 629 892 1137 l23 112 0 2575 c0 2448 -1 2579 -18 2665 -116 576 -556 1066 -1134 1264 -227 78 -508 108 -753 80z'/><path d='M301 8004 c-158 -42 -262 -156 -292 -319 -7 -38 -9 -312 -6 -839 3 -648 7 -805 21 -921 64 -538 177 -928 391 -1350 184 -361 380 -630 670 -920 529 -528 1216 -906 2020 -1110 116 -29 231 -56 258 -60 l47 -7 0 -854 0 -854 -657 0 c-717 0 -743 -2 -851 -57 -69 -35 -155 -127 -176 -189 -53 -155 36 -357 203 -463 103 -66 -69 -61 2341 -61 2377 0 2235 -3 2349 54 64 33 144 122 173 194 19 49 23 75 23 182 0 120 -1 128 -32 192 -36 76 -100 146 -165 179 -95 48 -100 49 -820 49 l-678 0 0 854 c0 805 1 855 18 860 9 2 33 7 52 11 406 77 934 271 1313 484 1088 609 1778 1567 1971 2736 48 288 51 352 51 1150 l0 760 -23 58 c-63 155 -190 243 -367 254 -147 10 -260 -32 -350 -129 -32 -34 -63 -80 -76 -115 l-24 -58 -6 -785 c-6 -737 -11 -850 -39 -1050 -100 -705 -417 -1330 -913 -1794 -538 -505 -1229 -810 -2052 -908 -146 -17 -674 -17 -820 0 -663 79 -1253 297 -1735 642 -683 489 -1111 1202 -1230 2050 -28 194 -33 327 -39 1060 l-6 785 -24 58 c-44 111 -161 208 -282 236 -62 15 -175 12 -238 -5z'/></g> </svg>\")}.icon-mic-blue{background-image:url(../../assets/icons/mic-blue-solid.png)}.icon-mic-red{background-image:url(../../assets/icons/mic-red-solid.png)}.icon-mic-green{background-image:url(../../assets/icons/mic-green-solid.png)}@-webkit-keyframes ripple{from{opacity:1;transform:scale3d(.75,.75,1)}to{opacity:0;transform:scale3d(1.5,1.5,1)}}@keyframes ripple{from{opacity:1;transform:scale3d(.75,.75,1)}to{opacity:0;transform:scale3d(1.5,1.5,1)}}"] }] } ]; /** @nocollapse */ NgVoiceInputsComponent.ctorParameters = function () { return [ { type: VuiVoiceRecognitionService }, { type: i0.ChangeDetectorRef } ]; }; NgVoiceInputsComponent.propDecorators = { style: [{ type: i0.Input }], scrollOffset: [{ type: i0.Input }], scrollDuration: [{ type: i0.Input }], onValueChange: [{ type: i0.Output }] }; return NgVoiceInputsComponent; }()); Date.prototype['isValid'] = ( /** * @return {?} */function () { // If the date object is invalid it // will return 'NaN' on getTime() // and NaN is never equal to itself. return this.getTime() === this.getTime(); }); /** * @fileoverview added by tsickle * Generated from: lib/ng-voice-inputs.module.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NgVoiceInputsModule = /** @class */ (function () { function NgVoiceInputsModule() { } NgVoiceInputsModule.decorators = [ { type: i0.NgModule, args: [{ declarations: [ NgVoiceInputsComponent, VuiInputDirective ], imports: [common.CommonModule], exports: [ NgVoiceInputsComponent, VuiInputDirective ] },] } ]; return NgVoiceInputsModule; }()); /** * @fileoverview added by tsickle * Generated from: public_api.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * Generated from: ng-voice-inputs.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ exports.VuiInputDirective = VuiInputDirective; exports.NgVoiceInputsComponent = NgVoiceInputsComponent; exports.NgVoiceInputsModule = NgVoiceInputsModule; exports.ɵa = VuiVoiceRecognitionService; Object.defineProperty(exports, '__esModule', { value: true }); }))); //# sourceMappingURL=ng-voice-inputs.umd.js.map