Skip to content

Commit

Permalink
Merge pull request #1006 from StepicOrg/release/1.180
Browse files Browse the repository at this point in the history
Release 1.180
  • Loading branch information
ivan-magda authored Jul 8, 2021
2 parents c1cc6c7 + 3079b72 commit d258122
Show file tree
Hide file tree
Showing 51 changed files with 1,081 additions and 134 deletions.
64 changes: 52 additions & 12 deletions Stepic.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions Stepic/Info-Develop.plist
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.179-develop</string>
<string>1.180-develop</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
Expand Down Expand Up @@ -62,7 +62,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>348</string>
<string>350</string>
<key>FacebookAppID</key>
<string>171127739724012</string>
<key>FacebookDisplayName</key>
Expand Down
4 changes: 2 additions & 2 deletions Stepic/Info-Production.plist
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.179</string>
<string>1.180</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
Expand Down Expand Up @@ -62,7 +62,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>348</string>
<string>350</string>
<key>FacebookAppID</key>
<string>171127739724012</string>
<key>FacebookDisplayName</key>
Expand Down
4 changes: 2 additions & 2 deletions Stepic/Info-Release.plist
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.179-release</string>
<string>1.180-release</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
Expand Down Expand Up @@ -62,7 +62,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>348</string>
<string>350</string>
<key>FacebookAppID</key>
<string>171127739724012</string>
<key>FacebookDisplayName</key>
Expand Down
13 changes: 13 additions & 0 deletions Stepic/Legacy/Analytics/Events/AmplitudeAnalyticsEvents.swift
Original file line number Diff line number Diff line change
Expand Up @@ -987,6 +987,19 @@ extension AnalyticsEvent {
)
}

// MARK: - UserCourses -

static let myCoursesScreenOpened = AmplitudeAnalyticsEvent(name: "My courses screen opened")

static func myCoursesScreenTabOpened(tab: UserCourses.Tab) -> AmplitudeAnalyticsEvent {
AmplitudeAnalyticsEvent(
name: "My courses screen tab opened",
parameters: [
"tab": tab.rawValue
]
)
}

// MARK: - Wishlist -

static func wishlistCourseAdded(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ import SwiftyJSON
final class CourseReviewSummary: NSManagedObject, JSONSerializable, IDFetchable {
typealias IdType = Int

var rating: Int {
self.count > 0 ? Int(round(self.average)) : 0
}

required convenience init(json: JSON) {
self.init()
self.initialize(json)
Expand Down
13 changes: 13 additions & 0 deletions Stepic/Sources/Helpers/FormatterHelper.swift
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,19 @@ enum FormatterHelper {
return "\(count) \(pluralizedCountString)"
}

/// Format reviews count with localized and pluralized suffix; 1 -> "1 review", 5 -> "5 reviews"
static func reviewSummariesCount(_ count: Int) -> String {
let pluralizedCountString = StringHelper.pluralize(
number: count,
forms: [
NSLocalizedString("reviewSummaries1", comment: ""),
NSLocalizedString("reviewSummaries234", comment: ""),
NSLocalizedString("reviewSummaries567890", comment: "")
]
)
return "\(count) \(pluralizedCountString)"
}

// MARK: Date

/// Format days count with localized and pluralized suffix; 1 -> "1 day", 5 -> "5 days"
Expand Down
2 changes: 1 addition & 1 deletion Stepic/Sources/Modules/CourseInfo/CourseInfoAssembly.swift
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,6 @@ final class CourseInfoAssembly: Assembly {
let adaptiveManager = AdaptiveStorageManager()
return adaptiveManager.canOpenInAdaptiveMode(courseId: self.courseID)
? [.info, .reviews]
: [.info, .syllabus, .reviews]
: [.info, .reviews, .syllabus]
}
}
9 changes: 1 addition & 8 deletions Stepic/Sources/Modules/CourseInfo/CourseInfoPresenter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -253,14 +253,7 @@ final class CourseInfoPresenter: CourseInfoPresenterProtocol {
isCourseRevenueAvailable: Bool,
promoCode: PromoCode?
) -> CourseInfoHeaderViewModel {
let rating: Int = {
if let reviewsCount = course.reviewSummary?.count,
let averageRating = course.reviewSummary?.average,
reviewsCount > 0 {
return Int(round(averageRating))
}
return 0
}()
let rating = course.reviewSummary?.rating ?? 0

let progress: CourseInfoProgressViewModel? = {
if let progress = course.progress {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ enum CourseInfoTabReviews {
struct ReviewsResult {
let reviews: [CourseInfoTabReviewsViewModel]
let hasNextPage: Bool
let summary: CourseInfoTabReviewsSummaryViewModel?
let writeCourseReviewState: WriteCourseReviewState
}

Expand Down Expand Up @@ -123,7 +124,7 @@ enum CourseInfoTabReviews {
enum WriteCourseReviewState {
case write
case edit
case hide
case summary
case banner(String)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ final class CourseInfoTabReviewsPresenter: CourseInfoTabReviewsPresenterProtocol
)
},
hasNextPage: data.hasNextPage,
summary: self.makeSummaryViewModel(course: data.course),
writeCourseReviewState: self.getWriteCourseReviewState(
course: data.course,
currentUserReview: data.currentUserReview
Expand All @@ -49,6 +50,7 @@ final class CourseInfoTabReviewsPresenter: CourseInfoTabReviewsPresenterProtocol
)
},
hasNextPage: response.hasNextPage,
summary: self.makeSummaryViewModel(course: response.course),
writeCourseReviewState: self.getWriteCourseReviewState(
course: response.course,
currentUserReview: response.currentUserReview
Expand Down Expand Up @@ -133,12 +135,28 @@ final class CourseInfoTabReviewsPresenter: CourseInfoTabReviewsPresenterProtocol
)
}

private func makeSummaryViewModel(course: Course) -> CourseInfoTabReviewsSummaryViewModel? {
guard let reviewSummary = course.reviewSummary else {
return nil
}

return CourseInfoTabReviewsSummaryViewModel(
rating: reviewSummary.rating,
averageRating: reviewSummary.average,
reviewsCount: reviewSummary.count,
reviewsDistribution: reviewSummary.distribution,
formattedRating: String(format: "%.1f", reviewSummary.average),
formattedReviewsCount: FormatterHelper.reviewSummariesCount(reviewSummary.count),
formattedReviewsDistribution: reviewSummary.distribution.map(FormatterHelper.longNumber(_:))
)
}

private func getWriteCourseReviewState(
course: Course,
currentUserReview: CourseReview?
) -> CourseInfoTabReviews.WriteCourseReviewState {
if course.progressId == nil {
return .hide
return .summary
}

if currentUserReview != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ final class CourseInfoTabReviewsViewController: UIViewController {

self.tableDataSource.viewModels = data.reviews
self.courseInfoTabReviewsView?.updateTableViewData(dataSource: self.tableDataSource)
self.courseInfoTabReviewsView?.summaryViewModel = data.summary
self.courseInfoTabReviewsView?.writeCourseReviewState = data.writeCourseReviewState

self.updatePagination(hasNextPage: data.hasNextPage, hasError: false)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,25 @@ struct CourseInfoTabReviewsViewModel {
let score: Int
let isCurrentUserReview: Bool
}

struct CourseInfoTabReviewsSummaryViewModel {
let rating: Int
let averageRating: Float
let reviewsCount: Int
let reviewsDistribution: [Int]
let formattedRating: String
let formattedReviewsCount: String
let formattedReviewsDistribution: [String]

static var empty: CourseInfoTabReviewsSummaryViewModel {
.init(
rating: 0,
averageRating: 0,
reviewsCount: 0,
reviewsDistribution: [],
formattedRating: "",
formattedReviewsCount: "",
formattedReviewsDistribution: []
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ extension CourseInfoTabReviewsCellView {
let textLabelFont = Typography.subheadlineFont
let textLabelInsets = UIEdgeInsets(top: 8, left: 0, bottom: 20, right: 20)

let clearStarsColor = UIColor.stepikMaterialPrimaryText
let clearStarsColor = UIColor.stepikMaterialDisabledText
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,29 +31,24 @@ final class CourseInfoTabReviewsView: UIView {

private lazy var headerView: CourseInfoTabReviewsHeaderView = {
let headerView = CourseInfoTabReviewsHeaderView()

// Disable masks to prevent constraints breaking
headerView.translatesAutoresizingMaskIntoConstraints = false
headerView.snp.makeConstraints { make in
make.height.equalTo(self.appearance.headerViewHeight)
self.headerViewHeightConstraint = make.height.equalTo(self.appearance.headerViewHeight).constraint
}

headerView.onWriteReviewButtonClick = { [weak self] in
guard let strongSelf = self else {
return
}

strongSelf.delegate?.courseInfoTabReviewsViewDidRequestWriteReview(strongSelf)
}

headerView.onEditReviewButtonClick = { [weak self] in
guard let strongSelf = self else {
return
}

strongSelf.delegate?.courseInfoTabReviewsViewDidRequestEditReview(strongSelf)
}

return headerView
}()

Expand Down Expand Up @@ -94,6 +89,9 @@ final class CourseInfoTabReviewsView: UIView {
return view
}()

private var headerViewHeightConstraint: Constraint?
private var currentHeaderHeight: CGFloat?

private var errorPlaceholderViewTopConstraint: Constraint?

// Proxify delegates
Expand All @@ -102,7 +100,7 @@ final class CourseInfoTabReviewsView: UIView {
private var shouldShowPaginationView = false
var paginationView: UIView?

var writeCourseReviewState: CourseInfoTabReviews.WriteCourseReviewState = .hide {
var writeCourseReviewState: CourseInfoTabReviews.WriteCourseReviewState = .summary {
didSet {
switch self.writeCourseReviewState {
case .write:
Expand All @@ -111,8 +109,11 @@ final class CourseInfoTabReviewsView: UIView {
case .edit:
self.tableView.tableHeaderView = self.headerView
self.headerView.shouldShowEditReviewButton = true
case .hide:
self.tableView.tableHeaderView = nil
case .summary:
self.tableView.tableHeaderView = self.headerView
self.headerView.shouldShowWriteReviewButton = false
self.headerView.shouldShowEditReviewButton = false
self.headerView.shouldShowWriteReviewBanner = false
case .banner(let text):
self.tableView.tableHeaderView = self.headerView
self.headerView.writeReviewBannerText = text
Expand All @@ -121,6 +122,12 @@ final class CourseInfoTabReviewsView: UIView {
}
}

var summaryViewModel: CourseInfoTabReviewsSummaryViewModel? {
didSet {
self.headerView.summaryViewModel = self.summaryViewModel
}
}

init(frame: CGRect = .zero, appearance: Appearance = Appearance()) {
self.appearance = appearance
super.init(frame: frame)
Expand All @@ -137,6 +144,13 @@ final class CourseInfoTabReviewsView: UIView {

override func layoutSubviews() {
super.layoutSubviews()

let newHeaderHeight = self.headerView.intrinsicContentSize.height
if self.currentHeaderHeight != newHeaderHeight {
self.currentHeaderHeight = newHeaderHeight
self.headerViewHeightConstraint?.update(offset: newHeaderHeight)
}

self.tableView.layoutTableHeaderView()
}

Expand Down
Loading

0 comments on commit d258122

Please sign in to comment.