blob: 4089e77b4ce69cb47b4eae4efa8a83974961304a [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
import app from './app';
import React from 'react';
import ReactDOM from 'react-dom';
import FauxtonAPI from './core/api';
import LoadAddons from './load_addons';
import Backbone from 'backbone';
import $ from 'jquery';
import AppWrapper from './addons/fauxton/appwrapper';
import { createStore, applyMiddleware, combineReducers } from 'redux';
import thunk from 'redux-thunk';
import { Provider } from 'react-redux';
FauxtonAPI.addMiddleware(thunk);
const store = createStore(
combineReducers(FauxtonAPI.reducers),
applyMiddleware(...FauxtonAPI.middlewares)
);
FauxtonAPI.reduxDispatch = (action) => {
store.dispatch(action);
};
FauxtonAPI.reduxState = () => {
return store.getState();
};
app.addons = LoadAddons;
FauxtonAPI.router = app.router = new FauxtonAPI.Router(app.addons);
// Trigger the initial route and enable HTML5 History API support, set the
// root folder to '/' by default. Change in app.js.
Backbone.history.start({ pushState: false, root: app.root });
// feature detect IE
if ('ActiveXObject' in window) {
$.ajaxSetup({ cache: false });
}
// Walks up the element tree to look for a link to see if it is part
// of the click nodes
const findLink = (target) => {
if (!target) {
return null;
}
if (target.tagName === 'A') {
return target;
}
return findLink(target.parentNode);
};
// All navigation that is relative should be passed through the navigate
// method, to be processed by the router. If the link has a `data-bypass`
// attribute, bypass the delegation completely.
document.addEventListener("click", evt => {
const target = findLink(evt.target);
if (!target) {
return;
}
//"a:not([data-bypass])"
const dataBypass = target.getAttribute('data-bypass');
if (dataBypass) {
return;
}
// Get the absolute anchor href.
const href = { prop: target.href, attr: target.getAttribute("href") };
if (!href.prop) {
return;
}
// Get the absolute root
const root = location.protocol + "//" + location.host;
// Ensure the root is part of the anchor href, meaning it's relative
if (href.prop && href.prop.slice(0, root.length) === root) {
// Stop the default event to ensure the link will not cause a page
// refresh.
evt.preventDefault();
//User app navigate so that navigate goes through a central place
app.router.navigate(href.attr, true);
}
});
ReactDOM.render(
<Provider store={store}>
<AppWrapper router={app.router}/>
</Provider>,
document.getElementById('app')
);