/** * 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. * * @format */ import { Text, Panel, ManagedDataInspector, FlipperPlugin, DetailSidebar, FlexRow, FlexColumn, styled, colors, } from 'flipper'; import React from 'react'; type Id = number; type Row = { id: Id; title: string; url: string; }; function renderSidebar(row: Row) { return ( ); } type State = { selectedID: string | null; }; type PersistedState = { [key: string]: Row; }; export default class SeaMammals extends FlipperPlugin< State, any, PersistedState > { static defaultPersistedState = {}; static persistedStateReducer( persistedState: PersistedState, method: string, payload: Row, ) { if (method === 'newRow') { return Object.assign({}, persistedState, { [payload.id]: payload, }); } return persistedState; } static Container = styled(FlexRow)({ backgroundColor: colors.macOSTitleBarBackgroundBlur, flexWrap: 'wrap', alignItems: 'flex-start', alignContent: 'flex-start', flexGrow: 1, overflow: 'scroll', }); state = { selectedID: null as string | null, }; render() { const {selectedID} = this.state; const {persistedState} = this.props; return ( {Object.entries(persistedState).map(([id, row]) => ( this.setState({selectedID: id})} selected={id === selectedID} key={id} /> ))} {selectedID && renderSidebar(persistedState[selectedID])} ); } } class Card extends React.Component< { onSelect: () => void; selected: boolean; } & Row > { static Container = styled(FlexColumn)<{selected?: boolean}>(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} ); } }