@@ -1547,7 +1547,7 @@ angular.module('myApp.directives', ['myApp.filters'])
15471547 }
15481548 } )
15491549
1550- . directive ( 'mySendForm' , function ( _ , $q , $timeout , $compile , $modalStack , $http , $interpolate , Storage , AppStickersManager , AppDocsManager , ErrorService , AppInlineBotsManager , FileManager , shouldFocusOnInteraction ) {
1550+ . directive ( 'mySendForm' , function ( _ , $q , $timeout , $interval , $window , $ compile, $modalStack , $http , $interpolate , Storage , AppStickersManager , AppDocsManager , ErrorService , AppInlineBotsManager , FileManager , shouldFocusOnInteraction ) {
15511551 return {
15521552 link : link ,
15531553 scope : {
@@ -1564,17 +1564,25 @@ angular.module('myApp.directives', ['myApp.filters'])
15641564 var fileSelects = $ ( 'input' , element )
15651565 var dropbox = $ ( '.im_send_dropbox_wrap' , element ) [ 0 ]
15661566 var messageFieldWrap = $ ( '.im_send_field_wrap' , element ) [ 0 ]
1567+ var sendFieldPanel = $ ( '.im_send_field_panel' , element ) [ 0 ]
15671568 var dragStarted
15681569 var dragTimeout
15691570 var submitBtn = $ ( '.im_submit' , element ) [ 0 ]
1570- var voiceRecord = $ ( '.im_record' , element ) ;
1571+ var voiceRecordBtn = $ ( '.im_record' , element ) [ 0 ]
15711572
15721573 var stickerImageCompiled = $compile ( '<a class="composer_sticker_btn" data-sticker="{{::document.id}}" my-load-sticker document="document" thumb="true" img-class="composer_sticker_image"></a>' )
15731574 var cachedStickerImages = { }
15741575
1575- var audioRecorder = null ;
1576- var audioPromise = null ;
1577- var audioStream = null ;
1576+ var voiceRecorder = null
1577+ var voiceRecordSuccess = false
1578+ var voiceRecordSupported = Recorder . isRecordingSupported ( )
1579+ var voiceRecordDurationInterval = null
1580+ var voiceRecorderPromise = null
1581+ if ( voiceRecordSupported ) {
1582+ $ ( sendFieldPanel ) . addClass ( 'im_record_supported' )
1583+ }
1584+
1585+ $scope . voiceRecorder = { duration : 0 , recording : false , processing : false }
15781586
15791587 var emojiTooltip = new EmojiTooltip ( emojiButton , {
15801588 getStickers : function ( callback ) {
@@ -1688,82 +1696,82 @@ angular.module('myApp.directives', ['myApp.filters'])
16881696 } )
16891697 } )
16901698
1691- navigator . getUserMedia = ( navigator . getUserMedia || navigator . webkitGetUserMedia || navigator . mozGetUserMedia || navigator . msGetUserMedia ) ;
1692-
1693- voiceRecord . on ( 'touchstart' , function ( e ) {
1694- if ( $scope . $parent . $parent . voiceRecorder . processing ) { return ; }
1699+ $ ( voiceRecordBtn ) . on ( 'contextmenu' , cancelEvent )
16951700
1696- navigator . getUserMedia ( { audio : true } , function ( stream ) {
1697- var start = Date . now ( ) ;
1698- var touch = null ;
1699-
1700- audioPromise = null ;
1701- audioStream = stream ;
1702- audioRecorder = new MediaRecorder ( stream ) ;
1703-
1704- var interval = setInterval ( function ( ) {
1705- var time = ( new Date ( ) ) ;
1701+ $ ( voiceRecordBtn ) . on ( 'touchstart' , function ( e ) {
1702+ if ( $scope . voiceRecorder . processing ) {
1703+ return
1704+ }
17061705
1707- time . setTime ( Date . now ( ) - start ) ;
1706+ voiceRecorderPromise = null
17081707
1709- $scope . $apply ( function ( ) {
1710- $scope . $parent . $parent . voiceRecorder . time = ( time . getMinutes ( ) < 10 ? '0' : '' ) + time . getMinutes ( ) + ':' + ( time . getSeconds ( ) < 10 ? '0' : '' ) + time . getSeconds ( ) ;
1711- } ) ;
1712- } , 1000 ) ;
1708+ voiceRecorder = new Recorder ( {
1709+ monitorGain : 0 ,
1710+ numberOfChannels : 1 ,
1711+ bitRate : 64000 ,
1712+ encoderSampleRate : 48000 ,
1713+ encoderPath : 'vendor/recorderjs/encoder_worker.js'
1714+ } )
17131715
1714- $scope . $apply ( function ( ) {
1715- $scope . $parent . $parent . voiceRecorder . time = '00:00' ;
1716- $scope . $parent . $parent . voiceRecorder . recording = interval ;
1717- } ) ;
1716+ voiceRecorder . addEventListener ( 'start' , function ( e ) {
1717+ var startTime = tsNow ( true )
17181718
1719- audioRecorder . start ( ) ;
1719+ voiceRecordSuccess = false
17201720
1721- console . log ( 'recording now!' ) ;
1721+ voiceRecordDurationInterval = $interval ( function ( ) {
1722+ $scope . voiceRecorder . duration = tsNow ( true ) - startTime
1723+ } , 1000 )
17221724
1723- } , function ( e ) {
1724- console . error ( e ) ;
1725- } ) ;
1726- } ) ;
1725+ $scope . $apply ( function ( ) {
1726+ $scope . voiceRecorder . recording = true
1727+ } )
17271728
1728- voiceRecord . on ( 'click' , function ( ) {
1729- if ( audioPromise ) {
1730- $scope . $parent . $parent . voiceRecorder . processing = true ;
1729+ console . warn ( dT ( ) , 'recording now!' )
1730+ } )
17311731
1732- audioPromise . then ( function ( e ) {
1733- var blob = e . data ;
1732+ voiceRecorder . addEventListener ( 'streamReady' , function ( e ) {
1733+ voiceRecorder . start ( )
1734+ } )
17341735
1735- console . log ( blob ) ;
1736- $scope . draftMessage . files = [ blob ] ;
1737- $scope . draftMessage . isMedia = true ;
1736+ voiceRecorder . initStream ( )
17381737
1739- $scope . $parent . $parent . voiceRecorder . processing = false ;
1738+ $ ( $window ) . one ( 'touchend' , function ( ) {
1739+ var deferred = $q . defer ( )
1740+ voiceRecorder . addEventListener ( 'dataAvailable' , function ( e ) {
1741+ var blob = blobConstruct ( [ e . detail ] , 'audio/ogg' )
1742+ deferred . resolve ( blob )
1743+ } )
1744+ voiceRecorderPromise = deferred . promise
1745+ voiceRecorder . stop ( )
17401746
1741- audioPromise = null ;
1742- } ) ;
1743- }
1744- } ) ;
1747+ $interval . cancel ( voiceRecordDurationInterval )
17451748
1746- $ ( $window ) . on ( 'touchend' , function ( ) {
1747- if ( audioStream && audioRecorder ) {
1748- audioPromise = new Promise ( function ( resolve ) {
1749- audioRecorder . ondataavailable = resolve ;
1750- } ) ;
1749+ $scope . $apply ( function ( ) {
1750+ $scope . voiceRecorder . recording = false
1751+ } )
1752+ } )
1753+ } )
17511754
1752- audioRecorder . stop ( ) ;
1753- audioStream . stop ( ) ;
1755+ $ ( voiceRecordBtn ) . on ( 'touchend' , function ( e ) {
1756+ voiceRecordSuccess = true
1757+ $timeout ( function ( ) {
1758+ if ( voiceRecorderPromise ) {
1759+ $scope . voiceRecorder . processing = true
17541760
1755- audioRecorder = null ;
1756- audioStream = null ;
1761+ voiceRecorderPromise . then ( function ( blob ) {
1762+ console . warn ( dT ( ) , 'got audio' , blob )
1763+ $scope . draftMessage . files = [ blob ]
1764+ $scope . draftMessage . isMedia = true
17571765
1758- clearInterval ( $scope . $parent . $parent . voiceRecorder . recording ) ;
1766+ $scope . voiceRecorder . processing = false
17591767
1760- $scope . $apply ( function ( ) {
1761- $scope . $parent . $parent . voiceRecorder . recording = null ;
1762- } ) ;
1763- }
1764- } ) ;
1768+ voiceRecorderPromise = null
1769+ } )
1770+ }
1771+ } , 100 )
1772+ } )
17651773
1766- var sendOnEnter = true ;
1774+ var sendOnEnter = true
17671775 function updateSendSettings ( ) {
17681776 Storage . get ( 'send_ctrlenter' ) . then ( function ( sendOnCtrl ) {
17691777 sendOnEnter = ! sendOnCtrl
0 commit comments