diff --git a/android/tutorial/src/main/java/com/facebook/flipper/sample/tutorial/plugin/SeaMammalFlipperPlugin.kt b/android/tutorial/src/main/java/com/facebook/flipper/sample/tutorial/plugin/SeaMammalFlipperPlugin.kt index 45f2f2be1..91f0d65e8 100644 --- a/android/tutorial/src/main/java/com/facebook/flipper/sample/tutorial/plugin/SeaMammalFlipperPlugin.kt +++ b/android/tutorial/src/main/java/com/facebook/flipper/sample/tutorial/plugin/SeaMammalFlipperPlugin.kt @@ -33,9 +33,9 @@ class SeaMammalFlipperPlugin : FlipperPlugin { connection = null } - override fun runInBackground(): Boolean = false + override fun runInBackground(): Boolean = true private fun newRow(row: FlipperObject) { connection?.send("newRow", row) } -} \ No newline at end of file +} diff --git a/src/plugins/seamammals/index.js b/src/plugins/seamammals/index.js index dd98fdbda..d2ed5c506 100644 --- a/src/plugins/seamammals/index.js +++ b/src/plugins/seamammals/index.js @@ -6,7 +6,18 @@ * @flow strict-local */ -import {Text, Panel, ManagedDataInspector, createTablePlugin} from 'flipper'; +import { + Text, + Panel, + ManagedDataInspector, + FlipperPlugin, + DetailSidebar, + FlexRow, + FlexColumn, + styled, + colors, +} from 'flipper'; +import React from 'react'; type Id = number; @@ -16,24 +27,6 @@ type Row = { url: string, }; -function buildRow(row: Row) { - return { - columns: { - title: { - value: {row.title}, - filterValue: row.title, - }, - url: { - value: {row.url}, - filterValue: row.url, - }, - }, - key: row.id, - copyText: JSON.stringify(row), - filterValue: `${row.title} ${row.url}`, - }; -} - function renderSidebar(row: Row) { return ( @@ -42,24 +35,114 @@ function renderSidebar(row: Row) { ); } -const columns = { - title: { - value: 'Title', - }, - url: { - value: 'URL', - }, +type State = { + selectedIndex: number, }; -const columnSizes = { - title: '15%', - url: 'flex', +type PersistedState = { + data: Array, }; -export default createTablePlugin({ - method: 'newRow', - columns, - columnSizes, - renderSidebar, - buildRow, -}); +export default class SeaMammals extends FlipperPlugin< + State, + void, + PersistedState, +> { + static defaultPersistedState = { + data: [], + }; + + static persistedStateReducer = ( + persistedState: PersistedState, + method: string, + payload: Row, + ) => { + if (method === 'newRow') { + return { + data: [...persistedState.data, payload], + }; + } + return persistedState; + }; + + static Container = styled(FlexRow)({ + backgroundColor: colors.macOSTitleBarBackgroundBlur, + flexWrap: 'wrap', + alignItems: 'flex-start', + alignContent: 'flex-start', + flexGrow: 1, + }); + + state = { + selectedIndex: -1, + }; + + render() { + const {selectedIndex} = this.state; + const {data} = this.props.persistedState; + + return ( + + {data.map((row, i) => ( + this.setState({selectedIndex: i})} + selected={i === selectedIndex} + key={i} + /> + ))} + + {this.state.selectedIndex > -1 && + renderSidebar(this.props.persistedState.data[selectedIndex])} + + + ); + } +} + +class Card extends React.Component<{ + ...Row, + onSelect: () => void, + selected: boolean, +}> { + static Container = styled(FlexColumn)(props => ({ + margin: 10, + borderRadius: 5, + border: '2px solid black', + backgroundColor: colors.white, + borderColor: props.selected + ? colors.macOSTitleBarIconSelected + : colors.white, + padding: 0, + width: 150, + overflow: 'hidden', + boxShadow: '1px 1px 4px rgba(0,0,0,0.1)', + cursor: 'pointer', + })); + + static Image = styled('div')({ + backgroundSize: 'cover', + width: '100%', + paddingTop: '100%', + }); + + static Title = styled(Text)({ + fontSize: 14, + fontWeight: 'bold', + padding: '10px 5px', + overflow: 'hidden', + textOverflow: 'ellipsis', + whiteSpace: 'nowrap', + }); + + render() { + return ( + + + {this.props.title} + + ); + } +}