123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- import * as React from "react";
- import { GlobalState } from "../globalState";
- require("../scss/examples.scss");
- interface IExamplesComponentProps {
- globalState: GlobalState;
- }
- export class ExamplesComponent extends React.Component<IExamplesComponentProps, { filter: string }> {
- private _state = "removed";
- private _rootRef: React.RefObject<HTMLDivElement>;
- private _scripts: {
- title: string;
- samples: {
- title: string;
- doc: string;
- icon: string;
- PGID: string;
- description: string;
- }[];
- }[];
- public constructor(props: IExamplesComponentProps) {
- super(props);
- this._loadScripts();
- this.state = { filter: "" };
- this._rootRef = React.createRef();
- this.props.globalState.onExamplesDisplayChangedObservable.add(() => {
- if (this._state !== "visible") {
- this._rootRef.current!.classList.remove("removed");
- setTimeout(() => {
- this._rootRef.current!.classList.add("visible");
- this._state = "visible";
- }, 16);
- } else {
- this._rootRef.current!.classList.remove("visible");
- this._state = "";
- setTimeout(() => {
- this._rootRef.current!.classList.add("removed");
- }, 200);
- }
- });
- }
- private _loadScripts() {
- var xhr = new XMLHttpRequest();
- if (this.props.globalState.language === "JS") {
- xhr.open("GET", "https://raw.githubusercontent.com/BabylonJS/Documentation/master/examples/list.json", true);
- } else {
- xhr.open("GET", "https://raw.githubusercontent.com/BabylonJS/Documentation/master/examples/list_ts.json", true);
- }
- xhr.onreadystatechange = () => {
- if (xhr.readyState === 4) {
- if (xhr.status === 200) {
- this._scripts = JSON.parse(xhr.response)["examples"];
- this._scripts.sort((a, b) => {
- if (a.title < b.title) {
- return -1;
- }
- return 1;
- });
- this._scripts.forEach((s) => {
- s.samples.sort((a, b) => {
- if (a.title < b.title) {
- return -1;
- }
- return 1;
- });
- });
- this.forceUpdate();
- }
- }
- };
- xhr.send(null);
- }
- private _onLoadPG(id: string) {
- this.props.globalState.onLoadRequiredObservable.notifyObservers(id);
- if (window.innerWidth < this.props.globalState.MobileSizeTrigger) {
- this.props.globalState.onExamplesDisplayChangedObservable.notifyObservers();
- }
- }
- public render() {
- if (!this._scripts) {
- return null;
- }
- return (
- <div id="examples" className={this._state} ref={this._rootRef}>
- <div id="examples-header">Examples</div>
- <div id="examples-filter">
- <input
- id="examples-filter-text"
- type="text"
- placeholder="Filter examples"
- value={this.state.filter}
- onChange={(evt) => {
- this.setState({ filter: evt.target.value });
- }}
- />
- </div>
- <div id="examples-list">
- {this._scripts.map((s) => {
- let active = s.samples.filter((ss) => {
- return !this.state.filter || ss.title.toLowerCase().indexOf(this.state.filter.toLowerCase()) !== -1 || ss.description.toLowerCase().indexOf(this.state.filter.toLowerCase()) !== -1;
- });
- if (active.length === 0) {
- return null;
- }
- return (
- <div key={s.title} className="example-category">
- <div className="example-category-title">{s.title}</div>
- {active.map((ss) => {
- return (
- <div className="example" key={ss.title} onClick={() => this._onLoadPG(ss.PGID)}>
- <img src={ss.icon.replace("icons", "https://doc.babylonjs.com/examples/icons")} />
- <div className="example-title">{ss.title}</div>
- <div className="example-description">{ss.description}</div>
- <a className="example-link" href={ss.doc} target="_blank">
- Documentation
- </a>
- </div>
- );
- })}
- </div>
- );
- })}
- </div>
- </div>
- );
- }
- }
|