shells/dev/relay-app/FriendsList/App.js (89 lines of code) (raw):
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @flow
*/
import React, { useCallback, useState, Fragment } from 'react';
import { Environment, RecordSource, Store } from 'relay-runtime';
import { graphql, QueryRenderer } from 'react-relay';
import createInBrowserNetwork from './createInBrowserNetwork';
import Friends from './Friends';
function createNewEnvironment(configName) {
const source = new RecordSource();
const store = new Store(source);
var environment = new Environment({
configName,
network: createInBrowserNetwork(),
store,
log(event) {
console.log('[APP]', event);
},
});
return environment;
}
const initialEnvironment = createNewEnvironment('Example Environment');
export type Item = {|
id: number,
isComplete: boolean,
text: string,
|};
type Props = {||};
export default function App(props: Props) {
// Add initial environment to environmentList
const [environmentList, updateEnvironmentList] = useState({
'Example Environment': initialEnvironment,
});
const [currentEnvironment, setCurrentEnvironment] = useState(
initialEnvironment
);
const createUpdateEnvironmentList = useCallback(() => {
const newEnvironment = createNewEnvironment(
'Example Environment ' + Object.keys(environmentList).length
);
updateEnvironmentList({
...environmentList,
[newEnvironment.configName]: newEnvironment,
});
}, [environmentList]);
const selectNewEnvironment = useCallback(
e => {
setCurrentEnvironment(environmentList[e.target.value]);
},
[environmentList]
);
return (
<Fragment>
<div className="addEnvironment">
<h1>Example Relay App</h1>
<button onClick={createUpdateEnvironmentList}>
Create Environment
</button>
<select onChange={selectNewEnvironment}>
{Object.keys(environmentList).map(key => (
<option>{key}</option>
))}
</select>
</div>
<QueryRenderer
environment={currentEnvironment}
query={graphql`
query AppQuery {
user: node(id: "my-id") {
... on User {
name
...Friends_user
}
}
}
`}
variables={{}}
// eslint-disable-next-line no-shadow
render={({ props }) => {
if (props) {
return (
<Fragment>
<div>Hello, {props.user.name}!</div>
<Friends user={props.user} />
</Fragment>
);
}
return 'Data is not ready.';
}}
/>
</Fragment>
);
}