/** * Copyright (c) 2017-present, Facebook, Inc. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * * @providesModule SnackPlayer */ 'use strict'; var Prism = require('./Prism'); var React = require('react'); const PropTypes = require('prop-types'); const LatestSDKVersion = '21.0.0'; var ReactNativeToExpoSDKVersionMap = { '0.48': '21.0.0', '0.47': '20.0.0', '0.46': '19.0.0', '0.45': '18.0.0', '0.44': '17.0.0', '0.43': '16.0.0', '0.42': '15.0.0', '0.41': '14.0.0', }; /** * Use the SnackPlayer by including a ```SnackPlayer``` block in markdown. * * Optionally, include url parameters directly after the block's language. * Valid options are name, description, and platform. * * E.g. * ```SnackPlayer?platform=android&name=Hello%20world! * import React from 'react'; * import { Text } from 'react-native'; * * export default class App extends React.Component { * render() { * return <Text>Hello World!</Text>; * } * } * ``` */ class SnackPlayer extends React.Component { constructor(props, context) { super(props, context); this.parseParams = this.parseParams.bind(this); } componentDidMount() { window.ExpoSnack && window.ExpoSnack.initialize(); } render() { var code = encodeURIComponent(this.props.children); var params = this.parseParams(this.props.params); var platform = params.platform ? params.platform : 'ios'; var name = params.name ? decodeURIComponent(params.name) : 'Example'; var description = params.description ? decodeURIComponent(params.description) : 'Example usage'; var optionalProps = {}; var { version } = this.context; if (version === 'next') { optionalProps[ 'data-snack-sdk-version' ] = LatestSDKVersion; } else { optionalProps[ 'data-snack-sdk-version' ] = ReactNativeToExpoSDKVersionMap[version] || LatestSDKVersion; } return ( <div className="snack-player"> <div className="mobile-friendly-snack" style={{ display: 'none' }} > <Prism> {this.props.children} </Prism> </div> <div className="desktop-friendly-snack" style={{ marginTop: 15, marginBottom: 15 }} > <div data-snack-name={name} data-snack-description={description} data-snack-code={code} data-snack-platform={platform} data-snack-preview="true" {...optionalProps} style={{ overflow: 'hidden', background: '#fafafa', border: '1px solid rgba(0,0,0,.16)', borderRadius: '4px', height: '514px', width: '880px', }} /> </div> </div> ); } parseParams(paramString) { var params = {}; if (paramString) { var pairs = paramString.split('&'); for (var i = 0; i < pairs.length; i++) { var pair = pairs[i].split('='); params[pair[0]] = pair[1]; } } return params; } } SnackPlayer.contextTypes = { version: PropTypes.number.isRequired, }; module.exports = SnackPlayer;