shsunmoonlee / SparkAR-HotAir

0 stars 0 forks source link

Realtime Database Example code using firebase #2

Open shsunmoonlee opened 5 years ago

shsunmoonlee commented 5 years ago
// -- Firebase

const Firebase = (function () {
    // -- Modules

    const D = require("Diagnostics");
    const N = require("Networking");

    // -- Public

    /**
     * Firebase class.
     *
     * @constructor
     * @param {String} url - The url of your realtime database.
     */
    function Firebase(url) {
        this._url = url;
        this._isObserving = false;
        this._onUpdate = null;
    }

    /**
     * Update the realtime database and set the data as current value.
     */
    Firebase.prototype.set = function(data) {
        let options = {
            method: 'PUT',
            body: JSON.stringify(data)
        }

        N.fetch(this._url, options).then(function(result) {
            if (!((result.status >= 200) && (result.status < 300))) {
                D.log("Failed to post data!");
            }
        });
    }

    /**
     * Update the realtime database and set the data as current value.
     */
    Firebase.prototype.subscribe = function(onUpdate) {
        this._onUpdate = onUpdate;
    }

    /**
     * Start observing changes in your realtime database.
     */
    Firebase.prototype.start = function() {
        this._isObserving = true;
        fetch.call(this);
    }

    /**
     * Stop observing changes in your realtime database.
     */
    Firebase.prototype.stop = function() {
        this._isObserving = false;
    }

    /**
     * Get a description for debugging purposes.
     *
     * @return {String}
     */
    Firebase.prototype.toString = function() {
      return 'Firebase("' + this._url + '")';
    }

    // -- Private

    /**
     * Fetch realtime database once.
     */
    function fetch() {
        const self = this;

        N.fetch(self._url).then(function(result) {
            if (self._isObserving) {
                fetch.call(self);
            }

        if ((result.status >= 200) && (result.status < 300)) {
          return result.json();
        }

        throw new Error("HTTP status code " + result.status);
        }).then(function(json) {
            if (self._onUpdate != null) {
                self._onUpdate(json);
            }
        }).catch(function(error) {
            D.log("There was an issue with fetch operation: " + error.message);
        });
    }

    // -- Export

  return Firebase;
})();

// -- Modules

const S = require("Scene");
const TG = require("TouchGestures");

// -- Constants

const URL = "https://ar-studio-hackathon.firebaseio.com/data.json";

// -- Scene

const counterText = S.root.find("Counter Text");
const decrementButton = S.root.find("Decrement Button");
const incrementButton = S.root.find("Increment Button");

// -- Example

const D = require("Diagnostics");

var data = null;

var firebase = new Firebase(URL);
firebase.subscribe(function(e) {
    data = e;
    D.log(data)
    counterText.text = `${data.counter}`;
});
firebase.start();

var state = {
    user1: {
        sequences: [
            { expression: 'eyebrowUp', time: 1.5 },
            { expression: 'smile', time: 3 },
            { expression: 'frown', time: 5 },
            { expression: 'mouthOpen', time: 7 },
        ],
        scsore: 10,
    }
}
// firebase.set({counter: 6, seunghun: 1, array: ['hi', 'hello']})
firebase.set({counter: 6, seunghun: 1, array: ['hi', 'hello']})

TG.onTap(decrementButton).subscribe(function(e) {
    data.counter = data.counter - 1;
    firebase.set(data);
});

TG.onTap(incrementButton).subscribe(function(e) {
    data.counter = data.counter + 1;
    firebase.set(data);
});