245 lines
8.8 KiB
JavaScript
245 lines
8.8 KiB
JavaScript
/** @jsx React.DOM */
|
||
|
||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||
|
||
/* jshint newcap:false */
|
||
/* global loop:true, React */
|
||
|
||
(function() {
|
||
"use strict";
|
||
|
||
// 1. Desktop components
|
||
// 1.1 Panel
|
||
var PanelView = loop.panel.PanelView;
|
||
// 1.2. Conversation Window
|
||
var IncomingCallView = loop.conversation.IncomingCallView;
|
||
|
||
// 2. Standalone webapp
|
||
var CallUrlExpiredView = loop.webapp.CallUrlExpiredView;
|
||
var StartConversationView = loop.webapp.StartConversationView;
|
||
|
||
// 3. Shared components
|
||
var ConversationToolbar = loop.shared.views.ConversationToolbar;
|
||
var ConversationView = loop.shared.views.ConversationView;
|
||
var FeedbackView = loop.shared.views.FeedbackView;
|
||
|
||
// Local helpers
|
||
function returnTrue() {
|
||
return true;
|
||
}
|
||
|
||
function returnFalse() {
|
||
return false;
|
||
}
|
||
|
||
function noop(){}
|
||
|
||
// Feedback API client configured to send data to the stage input server,
|
||
// which is available at https://input.allizom.org
|
||
var stageFeedbackApiClient = new loop.FeedbackAPIClient(
|
||
"https://input.allizom.org/api/v1/feedback", {
|
||
product: "Loop"
|
||
}
|
||
);
|
||
|
||
var mockClient = {
|
||
requestCallUrl: noop,
|
||
requestCallUrlInfo: noop
|
||
};
|
||
|
||
var mockConversationModel = new loop.shared.models.ConversationModel({}, {sdk: {}});
|
||
|
||
// Fake notifier
|
||
var mockNotifier = {};
|
||
|
||
var Example = React.createClass({displayName: 'Example',
|
||
render: function() {
|
||
var cx = React.addons.classSet;
|
||
return (
|
||
React.DOM.div({className: "example"},
|
||
React.DOM.h3(null, this.props.summary),
|
||
React.DOM.div({className: cx({comp: true, dashed: this.props.dashed}),
|
||
style: this.props.style || {}},
|
||
this.props.children
|
||
)
|
||
)
|
||
);
|
||
}
|
||
});
|
||
|
||
var Section = React.createClass({displayName: 'Section',
|
||
render: function() {
|
||
return (
|
||
React.DOM.section({id: this.props.name},
|
||
React.DOM.h1(null, this.props.name),
|
||
this.props.children
|
||
)
|
||
);
|
||
}
|
||
});
|
||
|
||
var ShowCase = React.createClass({displayName: 'ShowCase',
|
||
render: function() {
|
||
return (
|
||
React.DOM.div({className: "showcase"},
|
||
React.DOM.header(null,
|
||
React.DOM.h1(null, "Loop UI Components Showcase"),
|
||
React.DOM.nav({className: "showcase-menu"},
|
||
React.Children.map(this.props.children, function(section) {
|
||
return (
|
||
React.DOM.a({className: "btn btn-info", href: "#" + section.props.name},
|
||
section.props.name
|
||
)
|
||
);
|
||
})
|
||
)
|
||
),
|
||
this.props.children
|
||
)
|
||
);
|
||
}
|
||
});
|
||
|
||
var App = React.createClass({displayName: 'App',
|
||
render: function() {
|
||
return (
|
||
ShowCase(null,
|
||
Section({name: "PanelView"},
|
||
React.DOM.p({className: "note"},
|
||
React.DOM.strong(null, "Note:"), " 332px wide."
|
||
),
|
||
Example({summary: "Call URL retrieved", dashed: "true", style: {width: "332px"}},
|
||
PanelView({client: mockClient, notifier: mockNotifier,
|
||
callUrl: "http://invalid.example.url/"})
|
||
),
|
||
Example({summary: "Pending call url retrieval", dashed: "true", style: {width: "332px"}},
|
||
PanelView({client: mockClient, notifier: mockNotifier})
|
||
)
|
||
),
|
||
|
||
Section({name: "IncomingCallView"},
|
||
Example({summary: "Default", dashed: "true", style: {width: "280px"}},
|
||
IncomingCallView({model: mockConversationModel})
|
||
)
|
||
),
|
||
|
||
Section({name: "ConversationToolbar"},
|
||
React.DOM.h3(null, "Desktop Conversation Window"),
|
||
React.DOM.div({className: "conversation-window"},
|
||
Example({summary: "Default (260x265)", dashed: "true"},
|
||
ConversationToolbar({video: {enabled: true},
|
||
audio: {enabled: true},
|
||
hangup: noop,
|
||
publishStream: noop})
|
||
),
|
||
Example({summary: "Video muted"},
|
||
ConversationToolbar({video: {enabled: false},
|
||
audio: {enabled: true},
|
||
hangup: noop,
|
||
publishStream: noop})
|
||
),
|
||
Example({summary: "Audio muted"},
|
||
ConversationToolbar({video: {enabled: true},
|
||
audio: {enabled: false},
|
||
hangup: noop,
|
||
publishStream: noop})
|
||
)
|
||
),
|
||
|
||
React.DOM.h3(null, "Standalone"),
|
||
React.DOM.div({className: "standalone"},
|
||
Example({summary: "Default"},
|
||
ConversationToolbar({video: {enabled: true},
|
||
audio: {enabled: true},
|
||
hangup: noop,
|
||
publishStream: noop})
|
||
),
|
||
Example({summary: "Video muted"},
|
||
ConversationToolbar({video: {enabled: false},
|
||
audio: {enabled: true},
|
||
hangup: noop,
|
||
publishStream: noop})
|
||
),
|
||
Example({summary: "Audio muted"},
|
||
ConversationToolbar({video: {enabled: true},
|
||
audio: {enabled: false},
|
||
hangup: noop,
|
||
publishStream: noop})
|
||
)
|
||
)
|
||
),
|
||
|
||
Section({name: "StartConversationView"},
|
||
Example({summary: "Start conversation view", dashed: "true"},
|
||
React.DOM.div({className: "standalone"},
|
||
StartConversationView({model: mockConversationModel,
|
||
client: mockClient,
|
||
notifier: mockNotifier})
|
||
)
|
||
)
|
||
),
|
||
|
||
Section({name: "ConversationView"},
|
||
Example({summary: "Desktop conversation window", dashed: "true",
|
||
style: {width: "260px", height: "265px"}},
|
||
React.DOM.div({className: "conversation-window"},
|
||
ConversationView({sdk: {},
|
||
model: mockConversationModel,
|
||
video: {enabled: true},
|
||
audio: {enabled: true}})
|
||
)
|
||
),
|
||
Example({summary: "Standalone version"},
|
||
React.DOM.div({className: "standalone"},
|
||
ConversationView({sdk: {},
|
||
model: mockConversationModel,
|
||
video: {enabled: true},
|
||
audio: {enabled: true}})
|
||
)
|
||
),
|
||
Example({summary: "Default"},
|
||
ConversationView({sdk: {},
|
||
model: mockConversationModel,
|
||
video: {enabled: true},
|
||
audio: {enabled: true}})
|
||
)
|
||
),
|
||
|
||
Section({name: "FeedbackView"},
|
||
React.DOM.p({className: "note"},
|
||
React.DOM.strong(null, "Note:"), " For the useable demo, you can access submitted data at ",
|
||
React.DOM.a({href: "https://input.allizom.org/"}, "input.allizom.org"), "."
|
||
),
|
||
Example({summary: "Default (useable demo)", dashed: "true", style: {width: "280px"}},
|
||
FeedbackView({feedbackApiClient: stageFeedbackApiClient})
|
||
),
|
||
Example({summary: "Detailed form", dashed: "true", style: {width: "280px"}},
|
||
FeedbackView({feedbackApiClient: stageFeedbackApiClient, step: "form"})
|
||
),
|
||
Example({summary: "Thank you!", dashed: "true", style: {width: "280px"}},
|
||
FeedbackView({feedbackApiClient: stageFeedbackApiClient, step: "finished"})
|
||
)
|
||
),
|
||
|
||
Section({name: "CallUrlExpiredView"},
|
||
Example({summary: "Firefox User"},
|
||
CallUrlExpiredView({helper: {isFirefox: returnTrue}})
|
||
),
|
||
Example({summary: "Non-Firefox User"},
|
||
CallUrlExpiredView({helper: {isFirefox: returnFalse}})
|
||
)
|
||
)
|
||
)
|
||
);
|
||
}
|
||
});
|
||
|
||
window.addEventListener("DOMContentLoaded", function() {
|
||
var body = document.body;
|
||
body.className = loop.shared.utils.getTargetPlatform();
|
||
React.renderComponent(App(null), document.body);
|
||
});
|
||
})();
|