Migrate to custom plugin
Summary: In this step, we want to visualize our mammals in a custom card view. For this reason, we need to replace `createTablePlugin` with a React component that extends `FlipperPlugin`. Reviewed By: jknoxville Differential Revision: D15183324 fbshipit-source-id: 329cdc5c6cbd7e1435538e8cdddf049d914ff221
This commit is contained in:
committed by
Facebook Github Bot
parent
a276af9c1f
commit
5afb148ffa
@@ -33,9 +33,9 @@ class SeaMammalFlipperPlugin : FlipperPlugin {
|
|||||||
connection = null
|
connection = null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun runInBackground(): Boolean = false
|
override fun runInBackground(): Boolean = true
|
||||||
|
|
||||||
private fun newRow(row: FlipperObject) {
|
private fun newRow(row: FlipperObject) {
|
||||||
connection?.send("newRow", row)
|
connection?.send("newRow", row)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,18 @@
|
|||||||
* @flow strict-local
|
* @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;
|
type Id = number;
|
||||||
|
|
||||||
@@ -16,24 +27,6 @@ type Row = {
|
|||||||
url: string,
|
url: string,
|
||||||
};
|
};
|
||||||
|
|
||||||
function buildRow(row: Row) {
|
|
||||||
return {
|
|
||||||
columns: {
|
|
||||||
title: {
|
|
||||||
value: <Text>{row.title}</Text>,
|
|
||||||
filterValue: row.title,
|
|
||||||
},
|
|
||||||
url: {
|
|
||||||
value: <Text>{row.url}</Text>,
|
|
||||||
filterValue: row.url,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
key: row.id,
|
|
||||||
copyText: JSON.stringify(row),
|
|
||||||
filterValue: `${row.title} ${row.url}`,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function renderSidebar(row: Row) {
|
function renderSidebar(row: Row) {
|
||||||
return (
|
return (
|
||||||
<Panel floating={false} heading={'Extras'}>
|
<Panel floating={false} heading={'Extras'}>
|
||||||
@@ -42,24 +35,114 @@ function renderSidebar(row: Row) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const columns = {
|
type State = {
|
||||||
title: {
|
selectedIndex: number,
|
||||||
value: 'Title',
|
|
||||||
},
|
|
||||||
url: {
|
|
||||||
value: 'URL',
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const columnSizes = {
|
type PersistedState = {
|
||||||
title: '15%',
|
data: Array<Row>,
|
||||||
url: 'flex',
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default createTablePlugin({
|
export default class SeaMammals extends FlipperPlugin<
|
||||||
method: 'newRow',
|
State,
|
||||||
columns,
|
void,
|
||||||
columnSizes,
|
PersistedState,
|
||||||
renderSidebar,
|
> {
|
||||||
buildRow,
|
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 (
|
||||||
|
<SeaMammals.Container>
|
||||||
|
{data.map((row, i) => (
|
||||||
|
<Card
|
||||||
|
{...row}
|
||||||
|
onSelect={() => this.setState({selectedIndex: i})}
|
||||||
|
selected={i === selectedIndex}
|
||||||
|
key={i}
|
||||||
|
/>
|
||||||
|
))}
|
||||||
|
<DetailSidebar>
|
||||||
|
{this.state.selectedIndex > -1 &&
|
||||||
|
renderSidebar(this.props.persistedState.data[selectedIndex])}
|
||||||
|
</DetailSidebar>
|
||||||
|
</SeaMammals.Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 (
|
||||||
|
<Card.Container
|
||||||
|
onClick={this.props.onSelect}
|
||||||
|
selected={this.props.selected}>
|
||||||
|
<Card.Image style={{backgroundImage: `url(${this.props.url || ''})`}} />
|
||||||
|
<Card.Title>{this.props.title}</Card.Title>
|
||||||
|
</Card.Container>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user