office-ui-fabric-react
Version:
Reusable React components for building experiences for Office 365.
80 lines • 3.63 kB
JavaScript
import * as tslib_1 from "tslib";
import * as React from 'react';
import { BaseDecorator } from './BaseDecorator';
import { getWindow, hoistStatics } from '../../Utilities';
export var ResponsiveMode;
(function (ResponsiveMode) {
ResponsiveMode[ResponsiveMode["small"] = 0] = "small";
ResponsiveMode[ResponsiveMode["medium"] = 1] = "medium";
ResponsiveMode[ResponsiveMode["large"] = 2] = "large";
ResponsiveMode[ResponsiveMode["xLarge"] = 3] = "xLarge";
ResponsiveMode[ResponsiveMode["xxLarge"] = 4] = "xxLarge";
ResponsiveMode[ResponsiveMode["xxxLarge"] = 5] = "xxxLarge";
})(ResponsiveMode || (ResponsiveMode = {}));
var RESPONSIVE_MAX_CONSTRAINT = [479, 639, 1023, 1365, 1919, 99999999];
var _defaultMode;
/**
* Allows a server rendered scenario to provide a default responsive mode.
*/
export function setResponsiveMode(responsiveMode) {
_defaultMode = responsiveMode;
}
export function withResponsiveMode(ComposedComponent) {
var resultClass = /** @class */ (function (_super) {
tslib_1.__extends(WithResponsiveMode, _super);
function WithResponsiveMode(props) {
var _this = _super.call(this, props) || this;
_this._updateComposedComponentRef = _this._updateComposedComponentRef.bind(_this);
_this.state = {
responsiveMode: _this._getResponsiveMode()
};
return _this;
}
WithResponsiveMode.prototype.componentDidMount = function () {
var _this = this;
this._events.on(window, 'resize', function () {
var responsiveMode = _this._getResponsiveMode();
if (responsiveMode !== _this.state.responsiveMode) {
_this.setState({
responsiveMode: responsiveMode
});
}
});
};
WithResponsiveMode.prototype.componentWillUnmount = function () {
this._events.dispose();
};
WithResponsiveMode.prototype.render = function () {
var responsiveMode = this.state.responsiveMode;
return (React.createElement(ComposedComponent, tslib_1.__assign({ ref: this._updateComposedComponentRef, responsiveMode: responsiveMode }, this.props)));
};
WithResponsiveMode.prototype._getResponsiveMode = function () {
var responsiveMode = ResponsiveMode.small;
var win = getWindow();
if (typeof win !== 'undefined') {
try {
while (win.innerWidth > RESPONSIVE_MAX_CONSTRAINT[responsiveMode]) {
responsiveMode++;
}
}
catch (e) {
// Return a best effort result in cases where we're in the browser but it throws on getting innerWidth.
responsiveMode = ResponsiveMode.large;
}
}
else {
if (_defaultMode !== undefined) {
responsiveMode = _defaultMode;
}
else {
throw new Error('Content was rendered in a server environment without providing a default responsive mode. ' +
'Call setResponsiveMode to define what the responsive mode is.');
}
}
return responsiveMode;
};
return WithResponsiveMode;
}(BaseDecorator));
return hoistStatics(ComposedComponent, resultClass);
}
//# sourceMappingURL=withResponsiveMode.js.map