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

fix: Part #4 sync to upstream #540

Merged
merged 14 commits into from
Nov 7, 2024
1 change: 1 addition & 0 deletions Core/Core/Data/Model/Data_Discovery.swift
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ public extension DataLayer.DiscoveryResponce {
courseID: $0.courseID ?? "",
numPages: pagination.numPages,
coursesCount: pagination.count,
courseRawImage: $0.media.image?.raw,
progressEarned: 0,
progressPossible: 0)
})
Expand Down
1 change: 1 addition & 0 deletions Core/Core/Data/Model/Data_Enrollments.swift
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ public extension DataLayer.CourseEnrollments {
courseID: course.id,
numPages: enrollments.numPages ?? 1,
coursesCount: enrollments.count ?? 0,
courseRawImage: course.media.courseImage?.url,
progressEarned: 0,
progressPossible: 0
)
Expand Down
1 change: 1 addition & 0 deletions Core/Core/Data/Model/Data_PrimaryEnrollment.swift
Original file line number Diff line number Diff line change
Expand Up @@ -262,6 +262,7 @@ public extension DataLayer.PrimaryEnrollment {
courseID: enrollment.course.id,
numPages: numPages,
coursesCount: count,
courseRawImage: enrollment.course.media.image?.raw,
progressEarned: enrollment.progress?.assignmentsCompleted ?? 0,
progressPossible: enrollment.progress?.totalAssignmentsCount ?? 0
)
Expand Down
3 changes: 3 additions & 0 deletions Core/Core/Domain/Model/CourseItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public struct CourseItem: Hashable {
public let courseID: String
public let numPages: Int
public let coursesCount: Int
public let courseRawImage: String?
public let progressEarned: Int
public let progressPossible: Int

Expand All @@ -35,6 +36,7 @@ public struct CourseItem: Hashable {
courseID: String,
numPages: Int,
coursesCount: Int,
courseRawImage: String?,
progressEarned: Int,
progressPossible: Int) {
self.name = name
Expand All @@ -49,6 +51,7 @@ public struct CourseItem: Hashable {
self.courseID = courseID
self.numPages = numPages
self.coursesCount = coursesCount
self.courseRawImage = courseRawImage
self.progressEarned = progressEarned
self.progressPossible = progressPossible
}
Expand Down
1 change: 1 addition & 0 deletions Core/Core/View/Base/CourseCellView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ struct CourseCellView_Previews: PreviewProvider {
courseID: "1",
numPages: 1,
coursesCount: 10,
courseRawImage: nil,
progressEarned: 4,
progressPossible: 10
)
Expand Down
10 changes: 9 additions & 1 deletion Core/Core/View/Base/DynamicOffsetView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public struct DynamicOffsetView: View {

@Environment(\.isHorizontal) private var isHorizontal

@State private var isOnTheScreen: Bool = false
public init(
coordinate: Binding<CGFloat>,
collapsed: Binding<Bool>,
Expand All @@ -45,6 +46,9 @@ public struct DynamicOffsetView: View {
.frame(height: collapseHeight)
.overlay(
GeometryReader { geometry -> Color in
if !isOnTheScreen {
return .clear
}
guard idiom != .pad else {
return .clear
}
Expand All @@ -59,8 +63,12 @@ public struct DynamicOffsetView: View {
}
)
.onAppear {
isOnTheScreen = true
changeCollapsedHeight(collapsed: collapsed, isHorizontal: isHorizontal)
}
.onDisappear {
isOnTheScreen = false
}
.onChange(of: collapsed) { collapsed in
if !collapsed {
changeCollapsedHeight(collapsed: collapsed, isHorizontal: isHorizontal)
Expand All @@ -87,7 +95,7 @@ public struct DynamicOffsetView: View {
collapseHeight = collapsedVerticalHeight
}
} else {
collapseHeight = 240
collapseHeight = expandedHeight
}
viewHeight = collapseHeight
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="22758" systemVersion="23F79" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="23507" systemVersion="24A348" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
<entity name="CDCourseBlock" representedClassName="CDCourseBlock" syncable="YES" codeGenerationType="class">
<attribute name="allSources" optional="YES" attributeType="Transformable" valueTransformerName="NSSecureUnarchiveFromData" customClassName="[String]"/>
<attribute name="assignmentType" optional="YES" attributeType="String"/>
Expand Down Expand Up @@ -68,6 +68,7 @@
<attribute name="courseCount" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES"/>
<attribute name="courseEnd" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="courseID" optional="YES" attributeType="String"/>
<attribute name="courseRawImage" optional="YES" attributeType="String"/>
<attribute name="courseStart" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="desc" optional="YES" attributeType="String"/>
<attribute name="enrollmentEnd" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
Expand Down
27 changes: 17 additions & 10 deletions Course/Course/Presentation/Container/CourseContainerView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import Core
import Discussion
import Swinject
import Theme
@_spi(Advanced) import SwiftUIIntrospect

public struct CourseContainerView: View {

Expand All @@ -30,6 +31,7 @@ public struct CourseContainerView: View {
private var idiom: UIUserInterfaceIdiom { UIDevice.current.userInterfaceIdiom }

private let coordinateBoundaryLower: CGFloat = -115
private let courseRawImage: String?

private var coordinateBoundaryHigher: CGFloat {
let topInset = UIApplication.shared.windowInsets.top
Expand All @@ -52,7 +54,8 @@ public struct CourseContainerView: View {
viewModel: CourseContainerViewModel,
courseDatesViewModel: CourseDatesViewModel,
courseID: String,
title: String
title: String,
courseRawImage: String?
) {
self.viewModel = viewModel
Task {
Expand All @@ -68,6 +71,7 @@ public struct CourseContainerView: View {
self.courseID = courseID
self.title = title
self.courseDatesViewModel = courseDatesViewModel
self.courseRawImage = courseRawImage
}

public var body: some View {
Expand Down Expand Up @@ -108,22 +112,24 @@ public struct CourseContainerView: View {
collapsed: $collapsed,
containerWidth: proxy.size.width,
animationNamespace: animationNamespace,
isAnimatingForTap: $isAnimatingForTap
isAnimatingForTap: $isAnimatingForTap,
courseRawImage: courseRawImage
)
}
.offset(
y: ignoreOffset
? (collapsed ? coordinateBoundaryLower : .zero)
: ((coordinateBoundaryLower...coordinateBoundaryHigher).contains(coordinate)
? coordinate
? (collapsed ? coordinateBoundaryLower : coordinate)
: (collapsed ? coordinateBoundaryLower : .zero))
)
backButton(containerWidth: proxy.size.width)
}
}.ignoresSafeArea(edges: idiom == .pad ? .leading : .top)
.onAppear {
self.collapsed = isHorizontal
}
}
.ignoresSafeArea(edges: idiom == .pad ? .leading : .top)
.onAppear {
self.collapsed = isHorizontal
}
}
}

Expand Down Expand Up @@ -282,7 +288,7 @@ public struct CourseContainerView: View {
}
}
.tabViewStyle(.page(indexDisplayMode: .never))
.introspect(.scrollView, on: .iOS(.v15, .v16, .v17), customize: { tabView in
.introspect(.scrollView, on: .iOS(.v16...), customize: { tabView in
tabView.isScrollEnabled = false
})
.onFirstAppear {
Expand Down Expand Up @@ -379,11 +385,12 @@ struct CourseScreensView_Previews: PreviewProvider {
config: ConfigMock(),
courseID: "1",
courseName: "a",
analytics: CourseAnalyticsMock(),
analytics: CourseAnalyticsMock(),
calendarManager: CalendarManagerMock()
),
courseID: "",
title: "Title of Course"
title: "Title of Course",
courseRawImage: nil
)
}
}
Expand Down
1 change: 0 additions & 1 deletion Course/Course/Presentation/Outline/ContinueWithView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ struct ContinueWithView: View {
.frame(width: 200)
}
.padding(.horizontal, 24)
.padding(.top, 32)
} else {
VStack(alignment: .leading) {
ContinueTitle(vertical: courseContinueUnit)
Expand Down
132 changes: 67 additions & 65 deletions Course/Course/Presentation/Outline/CourseOutlineView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,79 +61,81 @@ public struct CourseOutlineView: View {
GeometryReader { proxy in
VStack(alignment: .center) {
ScrollView {
DynamicOffsetView(
coordinate: $coordinate,
collapsed: $collapsed,
viewHeight: $viewHeight
)
RefreshProgressView(isShowRefresh: $viewModel.isShowRefresh)
VStack(alignment: .leading) {

if isVideo,
viewModel.isShowProgress == false {
downloadQualityBars(proxy: proxy)
}
certificateView

if viewModel.courseStructure == nil,
viewModel.isShowProgress == false,
!isVideo {
FullScreenErrorView(
type: .noContent(
CourseLocalization.Error.coursewareUnavailable,
image: CoreAssets.information.swiftUIImage
)
)
.frame(maxWidth: .infinity)
.frame(height: proxy.size.height - viewHeight)
} else {
if let continueWith = viewModel.continueWith,
let courseStructure = viewModel.courseStructure,
!isVideo {
let chapter = courseStructure.childs[continueWith.chapterIndex]
let sequential = chapter.childs[continueWith.sequentialIndex]
let continueUnit = sequential.childs[continueWith.verticalIndex]

ContinueWithView(
data: continueWith,
courseContinueUnit: continueUnit
) {
viewModel.openLastVisitedBlock()
}
VStack(spacing: 0) {
DynamicOffsetView(
coordinate: $coordinate,
collapsed: $collapsed,
viewHeight: $viewHeight
)
RefreshProgressView(isShowRefresh: $viewModel.isShowRefresh)
VStack(alignment: .leading) {

if isVideo,
viewModel.isShowProgress == false {
downloadQualityBars(proxy: proxy)
}
certificateView

if let course = isVideo
? viewModel.courseVideosStructure
: viewModel.courseStructure {

if !isVideo,
let progress = course.courseProgress,
progress.totalAssignmentsCount != 0 {
CourseProgressView(progress: progress)
.padding(.horizontal, 24)
.padding(.top, 16)
.padding(.bottom, 8)
}

// MARK: - Sections
CustomDisclosureGroup(
isVideo: isVideo,
course: course,
proxy: proxy,
viewModel: viewModel
if viewModel.courseStructure == nil,
viewModel.isShowProgress == false,
!isVideo {
FullScreenErrorView(
type: .noContent(
CourseLocalization.Error.coursewareUnavailable,
image: CoreAssets.information.swiftUIImage
)
)
.frame(maxWidth: .infinity)
.frame(height: proxy.size.height - viewHeight)
} else {
if let courseStart = viewModel.courseStart {
Text(courseStart > Date() ? CourseLocalization.Outline.courseHasntStarted : "")
.frame(maxWidth: .infinity)
.frame(maxHeight: .infinity)
.padding(.top, 100)
if let continueWith = viewModel.continueWith,
let courseStructure = viewModel.courseStructure,
!isVideo {
let chapter = courseStructure.childs[continueWith.chapterIndex]
let sequential = chapter.childs[continueWith.sequentialIndex]
let continueUnit = sequential.childs[continueWith.verticalIndex]

ContinueWithView(
data: continueWith,
courseContinueUnit: continueUnit
) {
viewModel.openLastVisitedBlock()
}
}

if let course = isVideo
? viewModel.courseVideosStructure
: viewModel.courseStructure {

if !isVideo,
let progress = course.courseProgress,
progress.totalAssignmentsCount != 0 {
CourseProgressView(progress: progress)
.padding(.horizontal, 24)
.padding(.top, 16)
.padding(.bottom, 8)
}

// MARK: - Sections
CustomDisclosureGroup(
isVideo: isVideo,
course: course,
proxy: proxy,
viewModel: viewModel
)
} else {
if let courseStart = viewModel.courseStart {
Text(courseStart > Date() ? CourseLocalization.Outline.courseHasntStarted : "")
.frame(maxWidth: .infinity)
.frame(maxHeight: .infinity)
.padding(.top, 100)
}
Spacer(minLength: viewHeight < 200 ? 200 : viewHeight)
}
}
Spacer(minLength: 200)
}
.frameLimit(width: proxy.size.width)
}
.frameLimit(width: proxy.size.width)
}
.refreshable {
Task {
Expand Down
Loading
Loading