# react-panorama **Repository Path**: pilaoda/react-panorama ## Basic Information - **Project Name**: react-panorama - **Description**: No description available - **Primary Language**: TypeScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-29 - **Last Updated**: 2021-04-29 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # `react-panorama` > React for Valve's Panorama UI (for Dota 2 Custom Games). To get started, check out an [introductory tutorial on ModDota](https://moddota.com/panorama/react). ## Installation To avoid wasting time on configuration, it's recommended to start with the [JavaScript](https://github.com/ark120202/dota-templates/tree/webpack-react) or [TypeScript](https://github.com/ark120202/dota-templates/tree/webpack-typescript-react) templates, even if you're integrating it into an existing project. If you want to configure tools yourself, you can follow these instructions: ### Using webpack webpack is the recommended way to use React with Panorama. To see how webpack can be configured for use with Panorama, check out [webpack tutorial on ModDota](https://moddota.com/panorama/webpack). ```shell npm install react react-panorama ``` > If you are using TypeScript you also need to install `@types/react` ```jsx import React, { useState } from 'react'; import { render } from 'react-panorama'; function Counter() { const [count, setCount] = useState(0); const increment = () => setCount(count + 1); return ( ); } render(, $.GetContextPanel()); ``` ### Using UMD > Warning: UMD builds don't have a wide ecosystem support and make it harder to write idiomatic > React code. While UMD might seem like an easier way to get started, using a bundler allows for a > better code organization and gives you an access to a huge list of libraries built for React. 1. Download UMD bundles of [React](https://unpkg.com/react/umd/react.development.js) and [`react-panorama`](https://unpkg.com/react-panorama/dist/umd/react-panorama.development.js) 2. Put all downloaded files to `panorama/scripts/custom_game/libraries` 3. Include them in your layout file: ```xml ``` 4. Use `React` and `ReactPanorama` globals in your script: ```js function Counter() { const [count, setCount] = React.useState(0); const increment = () => setCount(count + 1); return React.createElement( 'Panel', { style: { flowChildren: 'down' } }, React.createElement('Label', { text: `Count: ${count}` }), React.createElement('TextButton', { className: 'ButtonBevel', text: 'Increment', onactivate: increment, }), ); } ReactPanorama.render(React.createElement(Counter), $.GetContextPanel()); ``` #### UMD and TypeScript If you are using TypeScript directly via `tsc` CLI, you need to install `@types/react` and `react-panorama` from npm, and change your `tsconfig.json` like this: ```diff { "compilerOptions": { - "types": ["panorama-types"], + "types": ["panorama-types", "react", "react-panorama"], + "jsx": "react", } } ``` Then you can use React UMD globals and JSX with type safety: ```tsx function Counter() { const [count, setCount] = React.useState(0); const increment = () => setCount(count + 1); return ( ); } ReactPanorama.render(, $.GetContextPanel()); ``` ## JSX `react-panorama` allows to use most of known Panorama panel types as bare elements (i.e. ``). For a full list of supported elements check out [renderer/panels.ts](src/renderer/panels.ts). All unsupported panel types can be used with `` pseudo-element. ## API ### Renderer #### `render(element: ReactElement, container: Panel, callback?: () => void): void` Render a React element into the layout in the supplied container. See [ReactDOM.render](https://reactjs.org/docs/react-dom.html#render) for more information. #### `createPortal(children: ReactNode, container: Panel, key?: null | string): ReactPortal` Creates a [React Portal](https://reactjs.org/docs/portals.html). ### Hooks #### `useGameEvent(eventName: string, callback: (event: object) => void, dependencies?: DependencyList): void` Executes `callback` every time `eventName` game event is fired. #### `useRegisterForUnhandledEvent(event: string, callback: (...args: any[]) => void, dependencies?: DependencyList): void` Executes `callback` every time `event` UI event is fired. #### `useNetTableKey(name: string, key: string): object` Gets the value of a key in a custom NetTable and updates component when it changes. #### `useNetTableValues(name: string): object` Gets all values in a custom NetTable and updates component when it changes.