Last active
December 16, 2015 21:39
-
-
Save cyrildiagne/5500870 to your computer and use it in GitHub Desktop.
Haxe Test App for a Rails JSON API (with Devise register / login) - (only tested with Flash output)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package; | |
import flash.display.Shape; | |
import flash.events.Event; | |
import flash.events.IOErrorEvent; | |
import flash.display.Sprite; | |
import flash.events.MouseEvent; | |
import flash.external.ExternalInterface; | |
import flash.text.TextField; | |
import flash.text.TextFieldAutoSize; | |
import flash.net.URLLoader; | |
import flash.net.URLRequest; | |
import flash.net.URLVariables; | |
import haxe.Json; | |
import haxe.Log; | |
import haxe.macro.Expr.Function; | |
typedef SongArray = Array<Array<Int>>; | |
/* | |
* @class RailsAppTest | |
*/ | |
class RailsAppTest extends Sprite { | |
static public var restURL:String = "http://localhost:3000"; | |
private var currY:Float = 0; | |
public var shareOn:String; | |
public function new () { | |
super (); | |
#if (flash9 || flash10) | |
haxe.Log.trace = function(v,?pos) { untyped __global__["trace"](pos.className+"#"+pos.methodName+"("+pos.lineNumber+"):",v); } | |
#elseif flash | |
haxe.Log.trace = function(v,?pos) { flash.Lib.trace(pos.className+"#"+pos.methodName+"("+pos.lineNumber+"): "+v); } | |
#end | |
addEventListener(Event.ADDED_TO_STAGE, init); | |
} | |
private function init (e:Event) { | |
if(loaderInfo.parameters.restURL != null) { | |
restURL = loaderInfo.parameters.restURL; | |
} | |
initGui(); | |
if(loaderInfo.parameters.id != null) { | |
var songId = loaderInfo.parameters.id; | |
var firstname = loaderInfo.parameters.firstname; | |
var lastname = loaderInfo.parameters.lastname; | |
var data = loaderInfo.parameters.data; | |
Log.trace("> Initializing player mode from " + firstname + " " + lastname); | |
playSong(songId, firstname, lastname, data); | |
} | |
else { | |
Log.trace("> Initializing recorder mode"); | |
} | |
} | |
private function initGui() { | |
currY = Button.margin; | |
addButton("save random song", saveRandomSong ); | |
addButton("save & share on Facebook", saveRandomSong, ["fb"] ); | |
addButton("save & share on Twitter", saveRandomSong, ["tw"] ); | |
addButton("save & share via Email", saveRandomSong, ["mail"] ); | |
//addButton("login", login, ["diagne.cyril@gmail.com", "zobizobi"] ); | |
addButton("login", login, ["contact@kikko.fr", "zobzob"] ); | |
addButton("register", register, ["contact@kikko.fr", "zobzob", "zobzob"] ); | |
} | |
private function login(?email:String, ?pass:String) { | |
Log.trace("> Login in with email: " + email + " and pass: " + pass.substr(0, 3) + "..."); | |
var params:URLVariables = new URLVariables(); | |
Reflect.setField(params, "user_login[login]", email); | |
Reflect.setField(params, "user_login[password]", pass); | |
Reflect.setField(params, "user_login[remember_me]", 1); | |
var req:URLRequest = new URLRequest(restURL+"/api/v1/users/sign_in.json"); | |
req.method = "POST"; | |
req.data = params; | |
var saver = new URLLoader(); | |
saver.addEventListener(Event.COMPLETE, loginSuccess, false , 0, true); | |
saver.addEventListener(IOErrorEvent.IO_ERROR, loginError, false , 0, true); | |
saver.load(req); | |
} | |
private function loginSuccess(e:Event) { | |
Log.trace(e.currentTarget.data); | |
} | |
private function loginError(e:Event) { | |
Log.trace(e.currentTarget.data); | |
} | |
private function register(?email:String, ?pass:String, ?pass_confirm:String) { | |
Log.trace("> Registering in with email: " + email + " and pass: " + pass.substr(0, 3) + "..."); | |
var params:URLVariables = new URLVariables(); | |
Reflect.setField(params, "user[email]", email); | |
Reflect.setField(params, "user[password]", pass); | |
Reflect.setField(params, "user[password_confirmation]", pass_confirm); | |
var req:URLRequest = new URLRequest(restURL+"/api/v1/users.json"); | |
req.method = "POST"; | |
req.data = params; | |
var saver = new URLLoader(); | |
saver.addEventListener(Event.COMPLETE, registerSuccess, false , 0, true); | |
saver.addEventListener(IOErrorEvent.IO_ERROR, registerError, false , 0, true); | |
saver.load(req); | |
} | |
private function registerSuccess(e:Event) { | |
Log.trace(e.currentTarget.data); | |
} | |
private function registerError(e:Event) { | |
Log.trace(e.currentTarget.data); | |
} | |
private function playSong(songId:String, firstname:String, lastname:String, data:String) { | |
Log.trace("> Playing song " + songId + " from " + firstname + " " + lastname); | |
var song:SongArray = cast( Json.parse( data ) ); | |
var gridToString:String = ""; | |
for (line in song) { | |
gridToString += "\n"; | |
for (v in line) gridToString += v+" "; | |
} | |
Log.trace(gridToString); | |
Log.trace("< Successfully parsed song."); | |
} | |
private function saveRandomSong(?shareOn:String) { | |
var firstname = "Unit"; | |
var lastname = "Test"; | |
var email = "diagne.cyril@gmail.com"; | |
var data = createRandomSongData(); | |
this.shareOn = shareOn; | |
saveSong(firstname, lastname, email, data); | |
} | |
private function saveSong (firstname:String, lastname:String, email:String, data:SongArray) { | |
Log.trace("> Saving song from " + firstname + " " + lastname + " to server "+restURL); | |
var params:URLVariables = new URLVariables(); | |
Reflect.setField(params, "song[firstname]", firstname); | |
Reflect.setField(params, "song[lastname]", lastname); | |
Reflect.setField(params, "song[email]", email); | |
Reflect.setField(params, "song[data]", Json.stringify( data ) ); | |
var req:URLRequest = new URLRequest(restURL+"/songs.json"); | |
req.method = "POST"; | |
req.data = params; | |
var saver = new URLLoader(); | |
saver.addEventListener(Event.COMPLETE, songSaved, false , 0, true); | |
saver.load(req); | |
} | |
private function songSaved(e:Event) { | |
var data = Json.parse(e.currentTarget.data); | |
Log.trace("< Song successfully saved with ID " + data.id); | |
if(shareOn!=null) { | |
if(shareOn == "fb") shareOnFacebook(data.id); | |
if(shareOn == "tw") shareOnTwitter(data.id); | |
if(shareOn == "mail") shareAndMail(data, ["diagne.cyril@gmail.com", "erik.escoffier@gmail.com"]); | |
shareOn = null; | |
} | |
} | |
private function shareOnFacebook(id:String) { | |
if(ExternalInterface.available) { | |
ExternalInterface.call("share", "http://www.facebook.com/sharer/sharer.php?u=", id) ; | |
} | |
else Log.trace("ExternalInterface not available"); | |
} | |
private function shareOnTwitter(id:String) { | |
if(ExternalInterface.available) { | |
ExternalInterface.call("share", "http://twitter.com/intent/tweet?url=", id) ; | |
} | |
else Log.trace("ExternalInterface not available"); | |
} | |
private function shareAndMail(song:Dynamic, mails:Dynamic) { | |
var params:URLVariables = new URLVariables(); | |
params.song_id = song.id; | |
params.firstname = song.firstname; | |
params.lastname = song.lastname; | |
params.email = song.email; | |
params.emails = mails.join(","); | |
var req:URLRequest = new URLRequest(restURL+"/mailer/share"); | |
req.method = "POST"; | |
req.data = params; | |
var mailSender = new URLLoader(); | |
mailSender.addEventListener(Event.COMPLETE, shareMailsSent, false , 0, true); | |
mailSender.load(req); | |
} | |
private function shareMailsSent(e:Event) { | |
Log.trace("Share emails reponse :"); | |
Log.trace(e.currentTarget.data); | |
} | |
private function createRandomSongData():SongArray { | |
var gridW = 10; | |
var gridH = 4; | |
var numInstrus = 3; | |
var data:SongArray = []; | |
for (i in 0...gridH) { | |
data[i] = []; | |
for (j in 0...gridW) { | |
data[i][j] = Std.int( Math.random() * numInstrus ); | |
} | |
} | |
return data; | |
} | |
private function addButton(label:String, f:Dynamic, ?fparams:Dynamic) { | |
var bt = new Button(label, f, fparams); | |
bt.x = Button.margin; | |
bt.y = currY; | |
currY += bt.height + Button.margin; | |
addChild(bt); | |
} | |
} | |
/* | |
* @class Button | |
*/ | |
class Button extends Sprite { | |
static public var margin = 10.0; | |
public function new(label:String, f:Dynamic, ?fparams:Dynamic) { | |
super(); | |
var bg = new Shape(); | |
var g = bg.graphics; | |
g.beginFill(0xcccccc); g.drawRect(0, 0, 10, 10); g.endFill(); | |
addChild(bg); | |
var tf = new TextField(); | |
tf.selectable = false; | |
tf.autoSize = TextFieldAutoSize.LEFT; | |
tf.text = label; | |
addChild(tf); | |
bg.width = tf.width; bg.height = tf.height; | |
mouseChildren = false; buttonMode = true; | |
addEventListener(MouseEvent.CLICK, function(e){ Reflect.callMethod(null, f, fparams); }); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment