Skip to content

Instantly share code, notes, and snippets.

@cyrildiagne
Last active December 16, 2015 21:39
Show Gist options
  • Save cyrildiagne/5500870 to your computer and use it in GitHub Desktop.
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)
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