Skip to content

Commit

Permalink
Fix inconsistent state caused in UICollectionViewLayout+InteractiveRe…
Browse files Browse the repository at this point in the history
…ordering. (Instagram#1289)

Summary:
Issue fixed: Instagram#1288

- [x] All tests pass. Demo project builds and runs.
- [x] I added tests, an experiment, or detailed why my change isn't tested.
- [x] I added an entry to the `CHANGELOG.md` for any breaking changes, enhancements, or bug fixes.
- [x] I have reviewed the [contributing guide](https://github.com/Instagram/IGListKit/blob/master/.github/CONTRIBUTING.md)
Pull Request resolved: Instagram#1289

Reviewed By: timonus

Differential Revision: D13590406

Pulled By: rnystrom

fbshipit-source-id: 0814b0c2383a185da747176bad57dfb15c7e883f
  • Loading branch information
ofirgluzman authored and barakwei committed Feb 11, 2019
1 parent aa5fbd9 commit 20036cf
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -29,6 +29,8 @@ The changelog for `IGListKit`. Also see the [releases](https://github.com/instag

- Fixed binding section controllers failing to update their cells when the section controller's section changes. [Chrisna Aing](https://github.com/ccrazy88) [(#1144)](https://github.com/Instagram/IGListKit/pull/1144)

- Fixed a bug caused when applying interactive reordering on a single section item while dragging it through the last spot of the collection view and back to some (non-last) target position. [Ofir Gluzman](https://github.com/ofirgluzman) [#1289](https://github.com/Instagram/IGListKit/pull/1289)

3.2.0
-----

Expand Down
Expand Up @@ -95,6 +95,8 @@ - (nullable NSIndexPath *)updatedTargetForInteractivelyMovingItem:(NSIndexPath *
IGListSectionController *sourceSectionController = [adapter sectionControllerForSection:sourceSectionIndex];
IGListSectionController *destinationSectionController = [adapter sectionControllerForSection:destinationSectionIndex];

adapter.isLastInteractiveMoveToLastSectionIndex = NO;

// this is a reordering of sections themselves
if ([sourceSectionController numberOfItems] == 1
&& [destinationSectionController numberOfItems] == 1) {
Expand Down
30 changes: 30 additions & 0 deletions Tests/IGListAdapterTests.m
Expand Up @@ -1727,4 +1727,34 @@ - (void)test_whenItemsAreInteractivelyReorderedAcrossSections_thatIndexesRevertT
XCTAssertEqual(section1Objects[2], section1.sectionObject.objects[2]);
}

- (void)test_whenSingleItemInSectionIsInteractivelyReorderedThorughLastSpot_indexesUpdateCorrectly {
IGListTestAdapterReorderingDataSource *dataSource = [IGListTestAdapterReorderingDataSource new];
dataSource.objects = @[@0, @1, @2];
self.adapter.dataSource = dataSource;
self.adapter.moveDelegate = dataSource;

IGTestReorderableSection *section0 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:0];
IGTestReorderableSection *section1 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:1];
IGTestReorderableSection *section2 = (IGTestReorderableSection *)[self.adapter sectionControllerForSection:2];
section0.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];
section0.isReorderable = YES;
section1.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];
section2.sectionObject = [IGTestReorderableSectionObject sectionWithObjects:@[@0]];

[self.adapter performUpdatesAnimated:NO completion:nil];

NSIndexPath *fromIndexPath = [NSIndexPath indexPathForItem:0 inSection:0];
NSIndexPath *lastSpotIndexPath = [NSIndexPath indexPathForItem:1 inSection:2];
NSIndexPath *toIndexPath = [NSIndexPath indexPathForItem:1 inSection:1];

// move the first section item to the middle while simulating dragging to the last spot and back.
NSIndexPath *interpretedPath = [self interpretedIndexPathFromIndexPath:fromIndexPath toIndexPath:lastSpotIndexPath];
interpretedPath = [self interpretedIndexPathFromIndexPath:interpretedPath toIndexPath:toIndexPath];
[self.adapter collectionView:self.collectionView moveItemAtIndexPath:fromIndexPath toIndexPath:interpretedPath];

XCTAssertEqual(section0, [self.adapter sectionControllerForSection:1]);
XCTAssertEqual(section1, [self.adapter sectionControllerForSection:0]);
XCTAssertEqual(section2, [self.adapter sectionControllerForSection:2]);
}

@end

0 comments on commit 20036cf

Please sign in to comment.