shells/dev/relay-app/FriendsList/Friends.js (43 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, { Fragment } from 'react';
import { graphql, createPaginationContainer } from 'react-relay';
import FriendCard from './FriendCard';
import styles from './Friends.css';
import type { Friends_user } from './__generated__/Friends_user.graphql';
import type { RelayProps } from 'react-relay';
type Props = {|
+user: Friends_user,
+relay: RelayProps,
|};
export default createPaginationContainer(
function Friends(props: Props) {
const edges = Array.isArray(props.user.friends?.edges)
? props.user.friends?.edges
: null;
if (edges == null) {
return null;
}
if (edges.length < 5) {
setTimeout(() => {
props.relay.loadMore();
}, 300);
}
return (
<Fragment>
<ul className={styles.FriendsList}>
{edges.map(edge => {
return (
<li key={edge?.node?.id} className={styles.ListRow}>
<FriendCard user={edge?.node} />
</li>
);
})}
</ul>
<button
disabled={props.relay.isLoading() || !props.relay.hasMore()}
onClick={() => {
props.relay.loadMore();
}}
>
Load more
</button>
</Fragment>
);
},
{
user: graphql`
fragment Friends_user on User {
friends(first: 10) @connection(key: "User_friends") {
count
edges {
node {
id
...FriendCard_user
}
}
}
}
`,
},
{
getConnectionFromProps(props) {
return props.user && props.user.friends;
},
getFragmentVariables() {
return {};
},
getVariables(props) {
return props;
},
query: graphql`
query FriendsQuery @relay_test_operation {
user: node(id: "my-id") {
... on User {
id
...Friends_user
}
}
}
`,
}
);