Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[iOS] Crash when trying to navigate to locked content #191

Merged
merged 5 commits into from
Dec 8, 2023
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 10 additions & 39 deletions Course/Course/Presentation/Unit/CourseNavigationView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -43,28 +43,18 @@ struct CourseNavigationView: View {
})
}
UnitButtonView(type: .last, action: {
let sequentials = viewModel.chapters[viewModel.chapterIndex].childs
let verticals = viewModel
.chapters[viewModel.chapterIndex]
.childs[viewModel.sequentialIndex]
.childs
let chapters = viewModel.chapters
let currentVertical = viewModel.verticals[viewModel.verticalIndex]

viewModel.router.presentAlert(
alertTitle: CourseLocalization.Courseware.goodWork,
alertMessage: (CourseLocalization.Courseware.section
+ currentVertical.displayName + CourseLocalization.Courseware.isFinished),
nextSectionName: {
if viewModel.verticals.count > viewModel.verticalIndex + 1 {
return viewModel.verticals[viewModel.verticalIndex + 1].displayName
} else if sequentials.count > viewModel.sequentialIndex + 1 {
return sequentials[viewModel.sequentialIndex + 1].childs.first?.displayName ?? ""
} else if chapters.count > viewModel.chapterIndex + 1 {
return chapters[viewModel.chapterIndex + 1].childs.first?.childs.first?.displayName
} else {
return nil
if let data = viewModel.nextData,
let vertical = viewModel.vertical(for: data) {
return vertical.displayName
}
return nil
}(),
action: CourseLocalization.Courseware.backToOutline,
image: CoreAssets.goodWork.swiftUIImage,
Expand All @@ -82,44 +72,25 @@ struct CourseNavigationView: View {
playerStateSubject.send(VideoPlayerState.kill)
viewModel.router.dismiss(animated: false)

let chapterIndex: Int
let sequentialIndex: Int
let verticalIndex: Int

// Switch to the next Vertical
if verticals.count - 1 > viewModel.verticalIndex {
chapterIndex = viewModel.chapterIndex
sequentialIndex = viewModel.sequentialIndex
verticalIndex = viewModel.verticalIndex + 1
// Switch to the next Sequential
} else if sequentials.count - 1 > viewModel.sequentialIndex {
chapterIndex = viewModel.chapterIndex
sequentialIndex = viewModel.sequentialIndex + 1
verticalIndex = 0
} else {
// Switch to the next Chapter
chapterIndex = viewModel.chapterIndex + 1
sequentialIndex = 0
verticalIndex = 0
}

viewModel.analytics
.finishVerticalNextSectionClicked(
courseId: viewModel.courseID,
courseName: viewModel.courseName,
blockId: viewModel.selectedLesson().blockId,
blockName: viewModel.selectedLesson().displayName
)


guard let data = viewModel.nextData else { return }
viewModel.router.replaceCourseUnit(
courseName: viewModel.courseName,
blockId: viewModel.lessonID,
courseID: viewModel.courseID,
sectionName: viewModel.selectedLesson().displayName,
verticalIndex: verticalIndex,
verticalIndex: data.verticalIndex,
chapters: viewModel.chapters,
chapterIndex: chapterIndex,
sequentialIndex: sequentialIndex)
chapterIndex: data.chapterIndex,
sequentialIndex: data.sequentialIndex
)
}
)
playerStateSubject.send(VideoPlayerState.pause)
Expand Down
54 changes: 54 additions & 0 deletions Course/Course/Presentation/Unit/CourseUnitViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -180,4 +180,58 @@ public class CourseUnitViewModel: ObservableObject {
func trackFinishVerticalBackToOutlineClicked() {
analytics.finishVerticalBackToOutlineClicked(courseId: courseID, courseName: courseName)
}

//MARK: Navigation to next vertical
typealias VerticalData = (chapterIndex: Int, sequentialIndex: Int, verticalIndex: Int)
var nextData: VerticalData? {
nextData(from: (chapterIndex, sequentialIndex, verticalIndex))
}

private func chapter(for data: VerticalData) -> CourseChapter? {
guard data.chapterIndex >= 0 && data.chapterIndex < chapters.count else { return nil }
return chapters[data.chapterIndex]
}

private func sequential(for data: VerticalData) -> CourseSequential? {
guard let chapter = chapter(for: data),
data.sequentialIndex >= 0 && data.sequentialIndex < chapter.childs.count
else { return nil }
return chapter.childs[data.sequentialIndex]
}

func vertical(for data: VerticalData) -> CourseVertical? {
guard let sequential = sequential(for: data),
data.verticalIndex >= 0 && data.verticalIndex < sequential.childs.count
else { return nil }
return sequential.childs[data.verticalIndex]
}

private func sequentials(for data: VerticalData) -> [CourseSequential]? {
guard let chapter = chapter(for: data) else { return nil }
return chapter.childs
}

private func verticals(for data: VerticalData) -> [CourseVertical]? {
guard let sequential = sequential(for: data) else { return nil }
return sequential.childs
}

private func nextData(from data: VerticalData) -> VerticalData? {
var resultData: VerticalData = data
if let verticals = verticals(for: data), verticals.count > data.verticalIndex + 1 {
resultData = (data.chapterIndex, data.sequentialIndex, data.verticalIndex + 1)
} else if let sequentials = sequentials(for: data), sequentials.count > data.sequentialIndex + 1 {
resultData = (data.chapterIndex, data.sequentialIndex + 1, 0)
} else if chapters.count > data.chapterIndex + 1 {
resultData = (data.chapterIndex + 1, 0, 0)
} else {
return nil
}

if let vertical = vertical(for: resultData), vertical.childs.count > 0 {
return resultData
} else {
return nextData(from: resultData)
}
}
}