Skip to content
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
a736540
HorizonUI - WrappingHStack
szabinst Sep 25, 2025
2196f92
fix: Y position, alignment not being respected
szabinst Sep 25, 2025
be83e63
wip
szabinst Sep 26, 2025
09551e0
feat: refresh action
szabinst Oct 7, 2025
704a74c
feat: auto-accept course invitations
szabinst Oct 7, 2025
f0598d8
chore: view model tests
szabinst Oct 7, 2025
5007dda
feat: sort courses based on progress
szabinst Oct 8, 2025
f8a8c83
chore: make asyncPublisher public
szabinst Oct 8, 2025
7bc2ff0
chore: interactor tests
szabinst Oct 8, 2025
3892241
fix: double voice over read out
szabinst Oct 8, 2025
d4bd60c
wip: a11y
szabinst Oct 9, 2025
836aeb2
chore: clean up
szabinst Oct 9, 2025
7156b2a
feat: a11y
szabinst Oct 9, 2025
f32de9e
fix: StatusChip typo
szabinst Oct 9, 2025
adfa6a1
feat: use StatusChip, loading a11y string
szabinst Oct 9, 2025
8035ca7
Learner Dashboard Course Cards
szabinst Oct 9, 2025
2de4b44
Merge remote-tracking branch 'origin/master' into feature/learner-das…
szabinst Oct 9, 2025
5c6aabe
fix: tapping on the course image opens the course now
szabinst Oct 10, 2025
855bc5c
fix: reset pagination index upon pull to refresh
szabinst Oct 10, 2025
4b6c940
fix: review suggestions
szabinst Oct 10, 2025
2d9aea5
Merge remote-tracking branch 'origin/master' into feature/learner-das…
szabinst Oct 13, 2025
5d6b0d1
feat: add svg support for remote image loading
szabinst Oct 13, 2025
93b1b4e
fix: renamings and widget reload mechanism
szabinst Oct 13, 2025
a489ee0
chore: further renamings
szabinst Oct 13, 2025
a3d8196
Merge remote-tracking branch 'origin/master' into feature/learner-das…
szabinst Oct 13, 2025
83d3764
fix: xcstring
szabinst Oct 13, 2025
f656105
chore: re-merge master to resolve GitHub conflict
szabinst Oct 13, 2025
7be80ec
fix: stub object
szabinst Oct 13, 2025
64d6123
chore: xcstrings update
szabinst Oct 13, 2025
eb1c6e7
[CLX-2933][S] Add my skills widget (#3691)
Ahmed-Naguib93 Oct 15, 2025
3384f5f
chore: update a11y strings
szabinst Oct 15, 2025
c872c6c
chore: refactor SkillsCountWidget
szabinst Oct 15, 2025
da9c8be
chore: SkeletonLoad cleanup
szabinst Oct 15, 2025
86bb221
feat: SkillsCount error view
szabinst Oct 15, 2025
3fa20ee
fix: disable user interaction when skeleton loading
szabinst Oct 15, 2025
523774a
Merge branch 'master' into feature/learner-dashboard
Ahmed-Naguib93 Oct 20, 2025
16a2466
[CLX-2935][S] Add announcement banner (#3705)
Ahmed-Naguib93 Oct 21, 2025
b0465fe
fix: test target
szabinst Oct 22, 2025
ec7ccc5
fix: lint
szabinst Oct 22, 2025
eeb2268
[CLX-2934][S] Time spent widget (#3712)
Ahmed-Naguib93 Oct 22, 2025
0a6bf5c
[S] Config read & unread notifications (#3717)
Ahmed-Naguib93 Oct 22, 2025
c6c61ce
[CLX-2934][S] Add course Activities widget (#3719)
Ahmed-Naguib93 Oct 27, 2025
9ab1458
[S] Update announcements banner (#3725)
Ahmed-Naguib93 Oct 27, 2025
cb74283
Merge remote-tracking branch 'origin/master' into feature/learner-das…
szabinst Oct 28, 2025
a844665
chore: renaming
szabinst Oct 28, 2025
7091e33
fix: course pagination display logic
szabinst Oct 28, 2025
cb93143
fix: course list view state
szabinst Oct 28, 2025
4277af8
chore: renamings
szabinst Oct 29, 2025
07eac0d
chore: use completion.error
szabinst Oct 29, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -71,21 +71,3 @@ public class AnalyticsMetadataInteractorLive: AnalyticsMetadataInteractor {
)
}
}

private extension Publisher {
func asyncPublisher() async throws -> Output {
try await withCheckedThrowingContinuation { continuation in
var cancellable: AnyCancellable?
cancellable = self.first()
.sink(receiveCompletion: { completion in
if case let .failure(error) = completion {
continuation.resume(throwing: error)
}
cancellable?.cancel()
}, receiveValue: { value in
continuation.resume(returning: value)
cancellable?.cancel()
})
}
}
}
21 changes: 18 additions & 3 deletions Core/Core/Common/Extensions/Combine/PublisherExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,12 @@
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//

import Foundation
import Combine
import CombineExt
import CoreData
import Foundation

extension Publisher {

/// Sinks the publisher and ignores both completion and value events.
public func sink() -> AnyCancellable {
sink { _ in } receiveValue: { _ in }
Expand All @@ -34,7 +33,7 @@ extension Publisher {
) -> AnyCancellable {
sink(
receiveCompletion: { completion in
if case .failure(let error) = completion {
if case let .failure(error) = completion {
receiveFailure(error)
}
},
Expand All @@ -53,4 +52,20 @@ extension Publisher {
)
.eraseToAnyPublisher()
}

public func asyncPublisher() async throws -> Output {
try await withCheckedThrowingContinuation { continuation in
var cancellable: AnyCancellable?
cancellable = self.first()
.sink(receiveCompletion: { completion in
if case let .failure(error) = completion {
continuation.resume(throwing: error)
}
cancellable?.cancel()
}, receiveValue: { value in
continuation.resume(returning: value)
cancellable?.cancel()
})
}
}
}
2 changes: 2 additions & 0 deletions Core/Core/Features/Career/CourseProgression/CDHCourse.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public final class CDHCourse: NSManagedObject, WriteableModel {
@NSManaged public var completionPercentage: Double
@NSManaged public var state: String
@NSManaged public var enrollmentID: String
@NSManaged public var imageUrl: String?
@NSManaged public var institutionName: String?
@NSManaged public var incompleteModulesRaw: NSOrderedSet?
@NSManaged public var nextModuleItemID: String?
Expand Down Expand Up @@ -102,6 +103,7 @@ public final class CDHCourse: NSManagedObject, WriteableModel {
model.courseID = courseId
model.name = enrollmentModel.course.name
model.overviewDescription = enrollmentModel.course.syllabusBody
model.imageUrl = enrollmentModel.course.imageUrl
model.institutionName = institutionName
model.state = enrollmentModel.state
model.enrollmentID = enrollmentModel.id
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="23788.4" systemVersion="24G222" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="24299" systemVersion="24G222" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
<entity name="AccountNotification" representedClassName="Core.AccountNotification" syncable="YES">
<attribute name="endAt" optional="YES" attributeType="Date" usesScalarValueType="NO"/>
<attribute name="iconRaw" attributeType="String"/>
Expand Down Expand Up @@ -266,6 +266,7 @@
<attribute name="completionPercentage" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES"/>
<attribute name="courseID" attributeType="String"/>
<attribute name="enrollmentID" attributeType="String"/>
<attribute name="imageUrl" optional="YES" attributeType="String"/>
<attribute name="institutionName" optional="YES" attributeType="String"/>
<attribute name="name" optional="YES" attributeType="String"/>
<attribute name="nextModuleID" optional="YES" attributeType="String"/>
Expand Down
Loading