2014-01-25 15:37:15 +00:00
( function ( context , $ ) {
2014-02-14 07:17:36 +00:00
"use strict" ;
context . JK = context . JK || { } ;
context . JK . ShareDialog = function ( app , entityId , entityType ) {
var logger = context . JK . logger ;
var rest = context . JK . Rest ( ) ;
var facebookRest = context . JK . FacebookRest ( ) ;
var facebookHelper = null ;
var dialogId = '#share-dialog' ;
var userDetail = null ;
var entity = null ;
var remainingCap = 140 - 22 - 1 ; // 140 tweet max, minus 22 for link size, minus 1 for space
2016-12-15 18:47:08 +00:00
var clipboard = null ;
2014-02-14 07:17:36 +00:00
function showSpinner ( ) {
$ ( dialogId + ' .dialog-inner' ) . hide ( ) ;
var spinner = $ ( '<div class="spinner spinner-large"></div>' )
$ ( dialogId + ' .content-head' ) . after ( spinner ) ;
}
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
function hideSpinner ( ) {
$ ( dialogId + ' .spinner' ) . remove ( ) ;
$ ( dialogId + ' .dialog-inner' ) . show ( ) ;
}
function checkShareCheckbox ( provider , checked ) {
var checkbox = $ ( dialogId + ' .share-with-' + provider + ' input' ) ;
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
if ( checked ) {
checkbox . attr ( 'checked' , 'checked' ) ;
2014-02-06 16:31:52 +00:00
}
2014-02-14 07:17:36 +00:00
else {
checkbox . removeAttr ( 'checked' ) ;
}
}
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
function handleRecordingShareWithGoogle ( message ) {
var defer = $ . Deferred ( ) ;
2014-02-07 21:28:47 +00:00
2014-02-14 07:17:36 +00:00
defer . resolve ( ) ; // remove when implemented
2014-02-07 21:28:47 +00:00
2014-02-14 07:17:36 +00:00
return defer ;
}
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
function handleShareWithTwitter ( message ) {
var defer = $ . Deferred ( ) ;
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
rest . tweet ( { message : message + ' ' + entity . share _url } )
. done ( function ( ) {
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
// uncheck facebook, because we don't want the user to re-post to their timeline by accident
checkShareCheckbox ( 'twitter' , false ) ;
defer . resolve ( ) ;
} )
. fail ( function ( jqXHR ) {
if ( jqXHR . status == 422 ) {
// implies twitter token error.
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
var response = JSON . parse ( jqXHR . responseText ) ;
if ( response . errors . token ) {
app . notify ( {
title : "Failed to Tweet" ,
text : "You need to re-authorize JamKazam to access your Twitter account. Click (sign in) in the Share Dialog." ,
"icon_url" : "/assets/content/icon_alert_big.png"
} ) ;
disableTwitter ( ) ;
}
else if ( response . errors . twitter ) {
app . notify ( {
title : "Failed to Tweet" ,
text : "Twitter rejected the tweet because '" + response . errors . twitter [ 0 ] + "'" ,
"icon_url" : "/assets/content/icon_alert_big.png"
} ) ;
2014-02-07 17:18:57 +00:00
}
else {
app . notifyServerError ( jqXHR , "Unable to Share with Twitter" ) ;
}
2014-02-14 07:17:36 +00:00
}
else {
app . notifyServerError ( jqXHR , "Unable to Share with Twitter" ) ;
}
defer . reject ( ) ;
} ) ;
return defer ;
}
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
function handleRecordingShareWithTwitter ( message ) {
return handleShareWithTwitter ( message ) ;
}
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
function handleRecordingShareWithFacebook ( message ) {
var defer = $ . Deferred ( ) ;
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
rest . getShareRecording ( { provider : 'facebook' , claimed _recording : entityId } )
. done ( function ( data ) {
facebookHelper . promptLogin ( )
. done ( function ( response ) {
handleFbStateChange ( response ) ;
if ( response . status == "connected" ) {
facebookRest . post ( {
access _token : response . authResponse . accessToken ,
message : message ,
description : data . description ,
caption : data . caption ,
name : data . title ,
2014-03-10 16:24:36 +00:00
picture : data . photo _url ,
link : data . url
2014-07-21 05:36:57 +00:00
} ) . done ( function ( response ) {
checkShareCheckbox ( 'facebook' , false ) ;
defer . resolve ( ) ;
} )
. fail ( function ( response ) {
app . notify ( {
title : "Unable to Share with Facebook" ,
text : "Error: " + response ,
"icon_url" : "/assets/content/icon_alert_big.png"
} ) ;
defer . reject ( ) ;
2014-02-14 07:17:36 +00:00
} )
}
else {
// user doesn't want to auth; this is a form of success
defer . resolve ( ) ;
}
} )
} )
. fail ( function ( jqXHR ) {
app . notifyServerError ( jqXHR , "Unable to Populate Share Data" ) ;
defer . reject ( ) ;
} )
2014-02-07 14:07:08 +00:00
2014-02-14 07:17:36 +00:00
return defer ;
2014-02-06 18:59:19 +00:00
2014-02-14 07:17:36 +00:00
}
2014-02-06 18:59:19 +00:00
2014-02-14 07:17:36 +00:00
function handleSessionShareWithGoogle ( message ) {
var defer = $ . Deferred ( ) ;
2014-02-05 01:55:51 +00:00
2014-02-14 07:17:36 +00:00
defer . resolve ( ) ; // remove when implemented
2014-02-05 03:17:19 +00:00
2014-02-14 07:17:36 +00:00
return defer ;
}
2014-02-07 14:07:08 +00:00
2014-02-14 07:17:36 +00:00
function handleSessionShareWithTwitter ( message ) {
return handleShareWithTwitter ( message ) ;
}
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
function handleSessionShareWithFacebook ( message ) {
var defer = $ . Deferred ( ) ;
2014-02-07 17:18:57 +00:00
2014-02-14 07:17:36 +00:00
rest . getShareSession ( { provider : 'facebook' , music _session : entityId } )
. done ( function ( data ) {
facebookHelper . promptLogin ( )
. done ( function ( response ) {
handleFbStateChange ( response ) ;
if ( response . status == "connected" ) {
facebookRest . post ( {
access _token : response . authResponse . accessToken ,
message : message ,
description : data . description ,
caption : data . caption ,
name : data . title ,
2014-03-10 16:24:36 +00:00
picture : data . photo _url ,
link : data . url
2014-02-14 07:17:36 +00:00
} )
. done ( function ( response ) {
checkShareCheckbox ( 'facebook' , false ) ;
defer . resolve ( ) ;
} )
. fail ( function ( response ) {
app . notify ( {
title : "Unable to Share with Facebook" ,
text : "Error: " + response ,
"icon_url" : "/assets/content/icon_alert_big.png"
} ) ;
defer . reject ( ) ;
} )
}
else {
// user doesn't want to auth; this is a form of success
defer . resolve ( ) ;
}
} )
} )
. fail ( function ( jqXHR ) {
app . notifyServerError ( jqXHR , "Unable to Populate Share Data" ) ;
defer . reject ( ) ;
} )
2014-02-07 17:18:57 +00:00
2014-02-14 07:17:36 +00:00
return defer ;
}
2014-02-07 17:18:57 +00:00
2014-02-14 07:17:36 +00:00
function messageTooLongForTwitter ( message ) {
return message && message . length > remainingCap ;
}
2014-02-07 17:18:57 +00:00
2014-02-14 07:17:36 +00:00
function socialShare ( ) {
var facebookCheckbox = $ ( dialogId + ' .share-with-facebook input' ) ;
var shareWithFacebook = facebookCheckbox . is ( ':checked' ) && ! facebookCheckbox . is ( ':disabled' ) ;
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
var googleCheckbox = $ ( dialogId + ' .share-with-google input' ) ;
var shareWithGoogle = googleCheckbox . is ( ':checked' ) && ! googleCheckbox . is ( ':disabled' ) ;
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
var twitterCheckbox = $ ( dialogId + ' .share-with-twitter input' ) ;
var shareWithTwitter = twitterCheckbox . is ( ':checked' ) && ! twitterCheckbox . is ( ':disabled' ) ;
2014-02-06 16:31:52 +00:00
2014-02-14 07:17:36 +00:00
if ( ! shareWithFacebook && ! shareWithGoogle && ! shareWithTwitter ) {
$ ( dialogId + ' .share-options' ) . addClass ( 'error' )
return ;
2014-02-05 01:55:51 +00:00
}
2014-02-14 07:17:36 +00:00
else {
$ ( dialogId + ' .share-options' ) . removeClass ( 'error' )
2014-02-06 18:59:19 +00:00
}
2014-02-14 07:17:36 +00:00
var message = $ ( dialogId + ' .share-message' ) . val ( ) ;
if ( ! message ) { message = undefined ; }
2014-02-07 14:07:08 +00:00
2014-02-14 07:17:36 +00:00
if ( shareWithTwitter && ! message ) {
$ ( dialogId + ' .share-message-holder' ) . addClass ( 'error' )
$ ( dialogId + ' .share-message-holder .error-msg' ) . text ( "You must specify a message for Twitter." ) ;
return ;
2014-02-06 18:59:19 +00:00
}
2014-02-14 07:17:36 +00:00
else
{
$ ( dialogId + ' .share-message-holder' ) . removeClass ( 'error' )
$ ( dialogId + ' .share-message-holder .error-msg' ) . text ( '' ) ;
2014-02-04 18:04:12 +00:00
}
2014-02-14 07:17:36 +00:00
// validate twitter message length
if ( shareWithTwitter && messageTooLongForTwitter ( message ) ) {
$ ( dialogId + ' .share-message-holder' ) . addClass ( 'error' )
$ ( dialogId + ' .share-message-holder .error-msg' ) . text ( "Your message must be less than " + ( remainingCap + 1 ) + " characters in length for Twitter (currently " + message . length + ")." ) ;
return ;
}
else
{
$ ( dialogId + ' .share-message-holder' ) . removeClass ( 'error' )
$ ( dialogId + ' .share-message-holder .error-msg' ) . text ( '' ) ;
2014-01-30 02:37:36 +00:00
}
2014-02-14 07:17:36 +00:00
showSpinner ( ) ;
2014-02-02 23:14:47 +00:00
2014-02-14 07:17:36 +00:00
var chain = [ ] ;
2014-02-02 23:14:47 +00:00
2014-02-14 07:17:36 +00:00
if ( entityType == 'session' ) {
if ( shareWithFacebook ) {
chain . push ( handleSessionShareWithFacebook ( message ) )
2014-02-02 23:14:47 +00:00
}
2014-02-14 07:17:36 +00:00
if ( shareWithTwitter ) {
chain . push ( handleSessionShareWithTwitter ( message ) )
}
if ( shareWithGoogle ) {
chain . push ( handleSessionShareWithGoogle ( message ) )
}
}
else {
if ( shareWithFacebook ) {
chain . push ( handleRecordingShareWithFacebook ( message ) )
}
if ( shareWithTwitter ) {
chain . push ( handleRecordingShareWithTwitter ( message ) )
}
if ( shareWithGoogle ) {
chain . push ( handleRecordingShareWithGoogle ( message ) )
}
}
2014-02-02 23:14:47 +00:00
2014-02-14 07:17:36 +00:00
$ . when . apply ( $ , chain )
. done ( function ( ) {
app . layout . closeDialog ( 'share-dialog' ) ;
} )
. fail ( function ( ) {
logger . error ( "share failed" )
} )
. always ( function ( ) {
hideSpinner ( ) ;
} ) ;
}
2014-02-02 23:14:47 +00:00
2014-02-14 07:17:36 +00:00
function enableFacebook ( ) {
$ ( dialogId + ' .share-with-facebook input' ) . removeAttr ( 'disabled' )
$ ( dialogId + ' .share-with-facebook a' ) . css ( 'visibility' , 'hidden' ) ;
}
2014-02-02 23:14:47 +00:00
2014-02-14 07:17:36 +00:00
function disableFacebook ( ) {
$ ( dialogId + ' .share-with-facebook input' ) . attr ( 'disabled' , 'disabled' )
$ ( dialogId + ' .share-with-facebook a' ) . css ( 'visibility' , 'visible' ) ;
}
2014-02-07 05:57:31 +00:00
2014-02-14 07:17:36 +00:00
function enableTwitter ( ) {
$ ( dialogId + ' .share-with-twitter input' ) . removeAttr ( 'disabled' )
$ ( dialogId + ' .share-with-twitter a' ) . css ( 'visibility' , 'hidden' ) ;
}
2014-02-02 23:14:47 +00:00
2014-02-14 07:17:36 +00:00
function disableTwitter ( ) {
$ ( dialogId + ' .share-with-twitter input' ) . attr ( 'disabled' , 'disabled' )
$ ( dialogId + ' .share-with-twitter a' ) . css ( 'visibility' , 'visible' ) ;
}
2014-02-02 23:14:47 +00:00
2014-02-14 07:17:36 +00:00
function handleFbStateChange ( response ) {
2014-02-02 23:14:47 +00:00
2014-02-14 07:17:36 +00:00
if ( response && response . status == "connected" ) {
2014-07-21 05:36:57 +00:00
enableFacebook ( ) ;
checkShareCheckbox ( 'facebook' , true ) ;
2014-02-14 07:17:36 +00:00
}
else {
disableFacebook ( ) ;
2014-07-21 05:36:57 +00:00
checkShareCheckbox ( 'facebook' , false ) ;
2014-02-02 23:14:47 +00:00
}
2014-02-14 07:17:36 +00:00
}
2014-02-02 23:14:47 +00:00
2014-02-14 07:17:36 +00:00
function registerEvents ( onOff ) {
$ ( dialogId + ' .dialog-share-button' ) . unbind ( 'click' ) . click ( function ( e ) {
socialShare ( ) ;
return false ;
} ) ;
2014-02-07 14:07:08 +00:00
2014-02-14 07:17:36 +00:00
$ ( dialogId + ' .share-with-facebook a' ) . unbind ( 'click' ) . click ( function ( e ) {
facebookHelper . promptLogin ( ) . done ( function ( response ) {
handleFbStateChange ( response ) ;
} ) ;
return false ;
} ) ;
2014-02-07 14:07:08 +00:00
2014-02-14 07:17:36 +00:00
$ ( dialogId + ' .share-with-twitter a' ) . unbind ( 'click' ) . click ( function ( e ) {
app . layout . queueDialog ( 'share-dialog' )
window . location = '/auth/twitter' ;
return false ;
2014-02-07 17:18:57 +00:00
2014-02-14 07:17:36 +00:00
} )
}
2014-01-25 15:37:15 +00:00
2014-02-14 07:17:36 +00:00
function showDialog ( ) {
2014-06-27 19:17:56 +00:00
return app . layout . showDialog ( 'share-dialog' ) ;
2014-02-14 07:17:36 +00:00
}
// function initDialog() {
// var sessionText = textMap.SESSION;
// var liveSessionText = textMap.LIVE_SESSION;
// var fill = entityType === sessionText.toLowerCase() ? "teal-fill" : "orange-fill";
// $("#shareType").text(entityType);
// $("#divWidgetCodeHeader").addClass(fill);
// $("#divWidgetPreviewHeader").addClass(fill);
// $("#divWidgetPreview").addClass(entityType);
// // SESSION
// if (entityType === sessionText.toLowerCase()) {
// $("#lblWidgetCodeType").html(sessionText.toLowerCase());
// $("#lblWidgetPreviewType").html(sessionText.toLowerCase());
// $("#spnWidgetCodeBranding").text(liveSessionText.toLowerCase());
// $("#spnWidgetPreviewBranding").text(liveSessionText.toLowerCase());
// rest.getSessionHistory(entityId)
// .done(function(response) {
// $(".link-contents").html(response.share_url);
// });
// }
// // RECORDING
// else if (entityType === "recording") {
// var recordedText = textMap.RECORDED.toLowerCase();
// $("#lblWidgetCodeType").text(textMap.RECORDING);
// $("#lblWidgetPreviewType").text(textMap.RECORDING);
// $("#spnWidgetCodeBranding").text(recordedText);
// $("#spnWidgetPreviewBranding").text(recordedText);
// rest.getClaimedRecording(entityId)
// .done(function(response) {
// var name, photoUrl;
// if (response.recording.band) {
// name = response.recording.band.name;
// photoUrl = context.JK.resolveBandAvatarUrl(response.recording.band.photo_url);
// }
// else {
// name = response.recording.owner.name;
// photoUrl = context.JK.resolveAvatarUrl(response.recording.owner.photo_url);
// }
// $(".link-contents").html(response.share_url);
// $("#imgWidgetCodeAvatar").attr('src', photoUrl);
// $("#imgWidgetPreviewAvatar").attr('src', photoUrl);
// $("#divWidgetPreviewTitle").html(response.recording.name);
// $("#spnWidgetCodeArtistName").html(name);
// $("#spnWidgetPreviewArtistName").html(name);
// $.each(response.recording.recorded_tracks, function(index, val) {
// $(".widget-members").append('<div class="widget-avatar-small">' + '<img src="' + context.JK.resolveAvatarUrl(val.user.photo_url) + '" alt="" />' + '</div>');
// });
// });
// }
// }
function beforeShow ( ) {
disableTwitter ( ) ;
// no disableFacebook on purpose
if ( entityType == 'recording' ) {
rest . getClaimedRecording ( entityId )
. done ( function ( data ) {
entity = data ;
$ ( dialogId + ' .link-contents' ) . text ( entity . share _url )
} )
. fail ( function ( jqXHR ) {
2014-04-27 03:59:38 +00:00
app . notifyServerError ( jqXHR , "Unable to Fetch Recording Data" ) ;
2014-02-14 07:17:36 +00:00
} )
}
else {
rest . getSession ( entityId )
. done ( function ( data ) {
entity = data ;
$ ( dialogId + ' .link-contents' ) . text ( entity . share _url )
} )
. fail ( function ( jqXHR ) {
app . notifyServerError ( jqXHR , "Unable to Fetch Session Data" ) ;
} ) ;
}
rest . getUserDetail ( )
. done ( function ( data ) {
userDetail = data ;
if ( data . auth _twitter ) {
enableTwitter ( ) ;
2014-02-13 17:51:51 +00:00
}
else {
2014-02-14 07:17:36 +00:00
disableTwitter ( ) ;
2014-02-13 17:51:51 +00:00
}
2014-02-14 07:17:36 +00:00
} ) ;
2014-02-13 17:51:51 +00:00
2014-02-14 07:17:36 +00:00
$ ( dialogId + ' .share-message-holder' ) . removeClass ( 'error' )
$ ( dialogId + ' .share-message-holder .error-msg' ) . text ( '' ) ;
$ ( dialogId + ' .share-options' ) . removeClass ( 'error' ) ;
registerEvents ( true ) ;
}
2014-02-07 17:18:57 +00:00
2014-02-14 07:17:36 +00:00
function afterShow ( ) {
$ ( "#shareType" ) . text ( entityType ) ;
}
2014-01-25 15:37:15 +00:00
2014-02-14 07:17:36 +00:00
function afterHide ( ) {
hideSpinner ( ) ;
registerEvents ( false ) ;
}
2014-02-05 03:17:19 +00:00
2014-02-14 07:17:36 +00:00
function initialize ( _facebookHelper ) {
facebookHelper = _facebookHelper ;
2014-01-25 15:37:15 +00:00
2014-02-14 07:17:36 +00:00
var dialogBindings = {
'beforeShow' : beforeShow ,
'afterShow' : afterShow ,
'afterHide' : afterHide
} ;
2014-02-06 18:59:19 +00:00
2014-02-14 07:17:36 +00:00
app . bindDialog ( 'share-dialog' , dialogBindings ) ;
2014-02-06 18:59:19 +00:00
2014-02-14 07:17:36 +00:00
//initDialog();
2014-01-25 15:37:15 +00:00
2014-02-14 07:17:36 +00:00
facebookHelper . deferredLoginStatus ( ) . done ( function ( response ) { handleFbStateChange ( response ) ; } ) ;
2016-12-15 18:47:08 +00:00
if ( context . jamClient . IsNativeClient ( ) ) {
$ ( "#btn-share-copy" ) . unbind ( 'click' ) . click ( function ( ) {
context . jamClient . SaveToClipboard ( $ ( "#link-contents" ) . text ( ) ) ;
return false ;
} )
}
else {
clipboard = new Clipboard ( '#btn-share-copy' , {
text : function ( trigger ) {
return $ ( "#link-contents" ) . text ( ) ;
}
} )
}
2014-01-25 15:37:15 +00:00
}
2014-02-14 07:17:36 +00:00
this . initialize = initialize ;
this . showDialog = showDialog ;
}
2014-01-25 15:37:15 +00:00
return this ;
2014-02-14 01:52:47 +00:00
} ) ( window , jQuery ) ;