client/state/selectors/get-reader-stream-offset-item.js
function getOffsetItem( state, currentItem, offset ) {
	const streamKey = getCurrentStream( state );
	if ( ! streamKey || ! state.reader.streams[ streamKey ] ) {
		return null;
	}

	const stream = state.reader.streams[ streamKey ];
	let index = findIndex( stream.items, item => keysAreEqual( item, currentItem ) );

	// If we didn't find a match, check x-posts too
	if ( index < 0 ) {
		index = findIndex( stream.items, item => keysAreEqual( item.xPostMetadata, currentItem ) );
	}

	if ( index < 0 ) {
		return null;
	}

	const newIndex = index + offset;

	if ( newIndex < 0 || newIndex >= stream.items.length ) {
		return null;
	}

	const offsetItem = stream.items[ newIndex ];

	// If the item is an x-post, return the original post details
	if ( offsetItem && offsetItem.xPostMetadata ) {
		return offsetItem.xPostMetadata;
	}

	return offsetItem;
}
function getOffsetItem( state, currentItem, offset ) {
	const streamKey = getCurrentStream( state );
	if ( ! streamKey || ! state.reader.streams[ streamKey ] ) {
		return null;
	}

	const stream = state.reader.streams[ streamKey ];
	let index = findIndex( stream.items, item => keysAreEqual( item, currentItem ) );

	// If we didn't find a match, check x-posts too
	if ( index < 0 ) {
		index = findIndex( stream.items, item => keysAreEqual( item.xPostMetadata, currentItem ) );
	}

	if ( index < 0 ) {
		return null;
	}

	const newIndex = index + offset;

	if ( newIndex < 0 || newIndex >= stream.items.length ) {
		return null;
	}

	const offsetItem = stream.items[ newIndex ];

	// If the item is an x-post, return the original post details
	if ( offsetItem && offsetItem.xPostMetadata ) {
		return offsetItem.xPostMetadata;
	}

	return offsetItem;
}
function getOffsetItem ( state , currentItem , offset ) { const streamKey = getCurrentStream ( state ) ; if ( ! streamKey || ! state . reader . streams [ streamKey ] ) { return null ; } const stream = state . reader . streams [ streamKey ] ; let index = findIndex ( stream . items , item => keysAreEqual ( item , currentItem ) ) ; // If we didn't find a match, check x-posts too if ( index < 0 ) { index = findIndex ( stream . items , item => keysAreEqual ( item . xPostMetadata , currentItem ) ) ; } if ( index < 0 ) { return null ; } const newIndex = index + offset ; if ( newIndex < 0 || newIndex >= stream . items . length ) { return null ; } const offsetItem = stream . items [ newIndex ] ; // If the item is an x-post, return the original post details if ( offsetItem && offsetItem . xPostMetadata ) { return offsetItem . xPostMetadata ; } return offsetItem ; }
/*
Given state, an item, and an offset: return the item that is offset away from the currentItem in the list.

For example: in order to get the next item directly after the current one you can do: getOffsetItem( state, currentItem, 1 ).

@param  {object} Redux state
@param  {object} Current stream item
@param  {integer} Offset from current stream item (e.g. -1 for previous item)
@return {object|null} The stream item, or null if the offset would be out of bounds
/ * Given state an item and an offset : return the item that is offset away from the currentItem in the list .