Skip to content
Snippets Groups Projects
Commit cdf94cc0 authored by Brian Peiris's avatar Brian Peiris
Browse files

preload environment images

parent 26431c68
No related branches found
No related tags found
No related merge requests found
...@@ -7,7 +7,7 @@ import faAngleLeft from "@fortawesome/fontawesome-free-solid/faAngleLeft"; ...@@ -7,7 +7,7 @@ import faAngleLeft from "@fortawesome/fontawesome-free-solid/faAngleLeft";
import faAngleRight from "@fortawesome/fontawesome-free-solid/faAngleRight"; import faAngleRight from "@fortawesome/fontawesome-free-solid/faAngleRight";
import FontAwesomeIcon from "@fortawesome/react-fontawesome"; import FontAwesomeIcon from "@fortawesome/react-fontawesome";
import deafault_scene_preview_thumbnail from "../assets/images/default_thumbnail.png"; import default_scene_preview_thumbnail from "../assets/images/default_thumbnail.png";
const HUB_NAME_PATTERN = "^[A-Za-z0-9-'\":!@#$%^&*(),.?~ ]{4,64}$"; const HUB_NAME_PATTERN = "^[A-Za-z0-9-'\":!@#$%^&*(),.?~ ]{4,64}$";
...@@ -21,15 +21,34 @@ class HubCreatePanel extends Component { ...@@ -21,15 +21,34 @@ class HubCreatePanel extends Component {
super(props); super(props);
this.state = { this.state = {
ready: false,
name: generateHubName(), name: generateHubName(),
environmentIndex: Math.floor(Math.random() * props.environments.length), environmentIndex: Math.floor(Math.random() * props.environments.length)
// HACK: expand on small screens by default to ensure scene selection possible.
// Eventually this could/should be done via media queries.
expanded: window.innerWidth < 420
}; };
// HACK: expand on small screens by default to ensure scene selection possible.
// Eventually this could/should be done via media queries.
if (window.innerWidth < 420) {
(async () => {
const environmentThumbnail = this._getEnvironmentThumbnail(this.state.environmentIndex);
await this._preloadImage(environmentThumbnail.srcset);
this.setState({ ready: true, expanded: true });
})();
} else {
this.state.ready = true;
}
} }
_getEnvironmentThumbnail = environmentIndex => {
const environment = this.props.environments[environmentIndex];
const meta = environment.meta || {};
return (
(meta.images || []).find(i => i.type === "preview-thumbnail") || {
srcset: default_scene_preview_thumbnail
}
);
};
createHub = async e => { createHub = async e => {
e.preventDefault(); e.preventDefault();
const environment = this.props.environments[this.state.environmentIndex]; const environment = this.props.environments[this.state.environmentIndex];
...@@ -64,12 +83,21 @@ class HubCreatePanel extends Component { ...@@ -64,12 +83,21 @@ class HubCreatePanel extends Component {
return new RegExp(HUB_NAME_PATTERN).test(this.state.name) && new RegExp(hubAlphaPattern).test(this.state.name); return new RegExp(HUB_NAME_PATTERN).test(this.state.name) && new RegExp(hubAlphaPattern).test(this.state.name);
}; };
setToEnvironmentOffset = offset => { _preloadImage = async src => {
const img = new Image();
const imgLoad = new Promise(resolve => img.addEventListener("load", resolve));
img.srcset = src;
await imgLoad;
};
setToEnvironmentOffset = async offset => {
const numEnvs = this.props.environments.length; const numEnvs = this.props.environments.length;
this.setState(state => ({ const environmentIndex = ((this.state.environmentIndex + offset) % numEnvs + numEnvs) % numEnvs;
environmentIndex: ((state.environmentIndex + offset) % this.props.environments.length + numEnvs) % numEnvs const environmentThumbnail = this._getEnvironmentThumbnail(environmentIndex);
})); await this._preloadImage(environmentThumbnail.srcset);
this.setState({ environmentIndex });
}; };
setToNextEnvironment = () => { setToNextEnvironment = () => {
...@@ -88,6 +116,7 @@ class HubCreatePanel extends Component { ...@@ -88,6 +116,7 @@ class HubCreatePanel extends Component {
}; };
render() { render() {
if (!this.state.ready) return null;
const { formatMessage } = this.props.intl; const { formatMessage } = this.props.intl;
if (this.props.environments.length == 0) { if (this.props.environments.length == 0) {
...@@ -99,9 +128,7 @@ class HubCreatePanel extends Component { ...@@ -99,9 +128,7 @@ class HubCreatePanel extends Component {
const environmentTitle = meta.title || environment.name; const environmentTitle = meta.title || environment.name;
const environmentAuthor = (meta.authors || [])[0]; const environmentAuthor = (meta.authors || [])[0];
const environmentThumbnail = (meta.images || []).find(i => i.type === "preview-thumbnail") || { const environmentThumbnail = this._getEnvironmentThumbnail(this.state.environmentIndex);
srcset: deafault_scene_preview_thumbnail
};
const formNameClassNames = classNames("create-panel__form__name", { const formNameClassNames = classNames("create-panel__form__name", {
"create-panel__form__name--expanded": this.state.expanded "create-panel__form__name--expanded": this.state.expanded
...@@ -118,10 +145,11 @@ class HubCreatePanel extends Component { ...@@ -118,10 +145,11 @@ class HubCreatePanel extends Component {
<div className="create-panel__form"> <div className="create-panel__form">
<div <div
className="create-panel__form__left-container" className="create-panel__form__left-container"
onClick={() => { onClick={async () => {
if (this.state.expanded) { if (this.state.expanded) {
this.shuffle(); this.shuffle();
} else { } else {
await this._preloadImage(this._getEnvironmentThumbnail(this.state.environmentIndex).srcset);
this.setState({ expanded: true }); this.setState({ expanded: true });
} }
}} }}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment