diff --git a/CHANGELOG.md b/CHANGELOG.md index d4a3823a8..2c186e010 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 ----- diff --git a/Source/Internal/UICollectionViewLayout+InteractiveReordering.m b/Source/Internal/UICollectionViewLayout+InteractiveReordering.m index 7a0d13dbd..b8b2470b1 100644 --- a/Source/Internal/UICollectionViewLayout+InteractiveReordering.m +++ b/Source/Internal/UICollectionViewLayout+InteractiveReordering.m @@ -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) { diff --git a/Tests/IGListAdapterTests.m b/Tests/IGListAdapterTests.m index e1364c8b6..26250fb99 100644 --- a/Tests/IGListAdapterTests.m +++ b/Tests/IGListAdapterTests.m @@ -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