Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
a97251a
Integrate Tuist for project generation
May 4, 2026
360ae51
Introduce Project+Templates.swift
May 4, 2026
aadeec6
Add new modules: Common, Models
May 5, 2026
ab88ac7
Add API Module
May 5, 2026
86712a6
Introduce DesignSystem as module
May 5, 2026
82f7c59
Remove redurent @preconcurrency
May 5, 2026
99e95d6
Add public Localization inside Localizations package
May 5, 2026
7e4006e
Remove redundant video-play
May 5, 2026
ffc3d03
Introduce Localizations module
May 5, 2026
7ccbaeb
Introduce SignInComponent
May 6, 2026
35c6a08
Fix localizations inside module Models
May 6, 2026
5a88c1d
Introdude OnboardingComponent as frameork
May 13, 2026
c0dc08d
Add snapshot tests for SignInComponent
May 13, 2026
052776d
Add new UI component module: WhereToWarchComponent
May 14, 2026
59ac161
Introduce module TabBarComponent
May 14, 2026
a6c5aae
Introduce new component ImageComponent
May 14, 2026
65a63b1
Implement new way to pass Router inside component
May 14, 2026
dac504c
Introduce new module CustomViews
May 14, 2026
2ec4d04
Introduce new UI module ReviewsComponent
May 14, 2026
beb20c6
Introduce new module ReviewDetails
May 14, 2026
d9e4514
Introduce new module ItemDetailsReviewsComponent
May 15, 2026
2d238eb
Introduce SearchComponent module
May 15, 2026
9964e3c
Introduce new module ItemDetailsRecommendationsComponent
May 17, 2026
ea70c08
Introduce SettingsComponent module
May 17, 2026
282174a
Introduce new module MyFavorites
May 17, 2026
10e0fe3
Introduce new module ItemDetailsComponent
May 17, 2026
e6d5c2f
Introduce new module HomeComponent
May 17, 2026
6b61f2c
Introduce new module MainHomeSectionComponent
May 17, 2026
12666e4
Introduce new module HomeSectionComponent
May 17, 2026
4ffe58f
Introduce new module CasrComponent
May 17, 2026
ae13a30
Introduce new module ItemDetailsCastComponent
May 17, 2026
c3a234b
Remove all unused CustomViews
May 17, 2026
fd0fcb1
Remove .DS_Store from repo
May 18, 2026
2190267
Update README file
May 18, 2026
cd327d0
Fill section "To run the app properly, you need to"
May 18, 2026
44e6ecd
Remove old Localizations package
May 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Binary file removed .DS_Store
Binary file not shown.
8 changes: 8 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -60,3 +60,11 @@ fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output

### Projects ###
*.xcodeproj
*.xcworkspace
### Tuist derived files ###
graph.dot
Derived/
.DS_Store
33 changes: 33 additions & 0 deletions .package.resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"originHash" : "9d2c391dc946ad5b30f17826ffdc1e8790a14b5f4064662b59cfbbb44d2be204",
"pins" : [
{
"identity" : "r.swift",
"kind" : "remoteSourceControl",
"location" : "https://github.com/mac-cain13/R.swift.git",
"state" : {
"revision" : "a9abc6b0afe0fc4a5a71e1d7d2872143dff2d2f1",
"version" : "7.8.0"
}
},
{
"identity" : "swift-argument-parser",
"kind" : "remoteSourceControl",
"location" : "https://github.com/apple/swift-argument-parser",
"state" : {
"revision" : "626b5b7b2f45e1b0b1c6f4a309296d1d21d7311b",
"version" : "1.7.1"
}
},
{
"identity" : "xcodeedit",
"kind" : "remoteSourceControl",
"location" : "https://github.com/tomlokhorst/XcodeEdit",
"state" : {
"revision" : "0e550cdee72844b35431afc3a1e176042be6d0f0",
"version" : "2.13.0"
}
}
],
"version" : 3
}
9 changes: 0 additions & 9 deletions API/.gitignore

This file was deleted.

This file was deleted.

30 changes: 0 additions & 30 deletions API/Package.swift

This file was deleted.

3 changes: 0 additions & 3 deletions API/README.md

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Foundation
import SwiftFoundation

let kBaseURLPath: String = "https://api.themoviedb.org/3"
public let kTMDBApiKey = ""
public let kTMDBApiKey = "<YOUR_API_KEY>"
let kURLTimeoutInterval: TimeInterval = 10

let kRequestHeaders: [String: String] = [
Expand Down
42 changes: 42 additions & 0 deletions Core/Common/Sources/Common.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
//
// Common.swift
// Flick
//
// Created by Alexander Sharko on 20.01.2023.
// Copyright © 2023 urlaunched.com. All rights reserved.
//

import SwiftUI

// MARK: - Typealiases

public typealias Minutes = Int

// MARK: - Constants

public let kPerPage: Int = 20

// MARK: - AppLink

public enum AppLink: String, Identifiable {
case aboutUs = "https://www.themoviedb.org/about"
case tmdbAPI = "https://developer.themoviedb.org/docs/getting-started"
case privacyPolicy = "https://www.themoviedb.org/privacy-policy"

public var id: Self { self }
public var urlValue: URL { URL(string: rawValue)! }
}

// MARK: - Helpers

public func areEqual<Lhs: Equatable>(_ lhs: Lhs, _ rhs: some Equatable) -> Bool {
guard let rhsAs = rhs as? Lhs else {
return false
}

return lhs == rhsAs
}

public enum ImageType {
case backdrop, logo, poster, profile, still
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,23 @@
// PrimaryButton.swift
// Flick
//
// Created by Alexander Sharko on 18.11.2022.
// Copyright © 2022 urlaunched.com. All rights reserved.
// Created by Bogdan Petkanych on 06.05.2026.
// Copyright © 2026 urlaunched. All rights reserved.
//

import DesignSystem
import SwiftUI

struct PrimaryButton: View {
public struct PrimaryButton: View {
var title: String
var action: () -> Void

public init(title: String, action: @escaping () -> Void) {
self.title = title
self.action = action
}

var body: some View {
public var body: some View {
Button(action: action) {
Text(title)
.customFont(.title3)
Expand Down
18 changes: 18 additions & 0 deletions Core/Common/Sources/DropdownItem.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
//
// DropDownItem.swift
// Flick
//
// Created by Bogdan Petkanych on 14.05.2026.
// Copyright © 2026 urlaunched. All rights reserved.
//
import UIKit

public struct DropdownItem {
public var title: String
public var image: UIImage

public init(title: String, image: UIImage) {
self.title = title
self.image = image
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@

import CoreFoundation

enum ItemSizeStyle {
public enum ItemSizeStyle {
case `default`, main
var coverSize: CGSize {
public var coverSize: CGSize {
switch self {
case .main: return .init(width: 202, height: 283)
case .default: return .init(width: 135, height: 189)
}
}

var isMain: Bool { self == .main }
public var isMain: Bool { self == .main }
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@

import Foundation

enum TabBarItem: String, Hashable, CaseIterable {
public enum TabBarItem: String, Hashable, CaseIterable {
case home, search, randomizer, favorites, profile

var id: Self { self }
public var id: Self { self }
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import Foundation

extension Array {
public extension Array {
subscript(safe range: Range<Index>) -> ArraySlice<Element>? {
if range.endIndex > endIndex {
if range.startIndex >= endIndex {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,4 @@

import Foundation

extension Collection {
var isNotEmpty: Bool {
!isEmpty
}
}
// REMOVE
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import Foundation

extension Date {
public extension Date {
static var testItem = Date(timeIntervalSince1970: 0)

var asShortDateString: String {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import Foundation

extension DateFormatter {
public extension DateFormatter {
static var customIso8601ShortFromServer: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import Foundation

extension Int {
public extension Int {
var asAmountOfMoney: String {
guard let amountOfMoney = NumberFormatter.amountOfMoney.string(from: NSNumber(value: self)), self > 0 else {
return "-"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import Foundation

extension NumberFormatter {
public extension NumberFormatter {
static var amountOfMoney: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import StoreKit
import UIKit

extension UIApplication {
public extension UIApplication {
func requestReview() {
DispatchQueue.main.async {
if let scene = self.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ import Combine
import Foundation
import Network

extension NWPathMonitor {
public extension NWPathMonitor {
final class NetworkStatusSubscription<S: Subscriber>: Subscription where S.Input == NWPath.Status {
private let subscriber: S?
private let monitor: NWPathMonitor
private let queue: DispatchQueue

init(
public init(
subscriber: S,
monitor: NWPathMonitor,
queue: DispatchQueue
Expand All @@ -26,26 +26,26 @@ extension NWPathMonitor {
self.queue = queue
}

func request(_: Subscribers.Demand) {
public func request(_: Subscribers.Demand) {
monitor.pathUpdateHandler = { [weak self] path in
_ = self?.subscriber?.receive(path.status)
}

monitor.start(queue: queue)
}

func cancel() {
public func cancel() {
monitor.cancel()
}
}
}

// MARK: - NWPathMonitor Publisher

extension NWPathMonitor {
public extension NWPathMonitor {
struct NetworkStatusPublisher: Publisher {
typealias Output = NWPath.Status
typealias Failure = Never
public typealias Output = NWPath.Status
public typealias Failure = Never

private let monitor: NWPathMonitor
private let queue: DispatchQueue
Expand All @@ -55,7 +55,7 @@ extension NWPathMonitor {
self.queue = queue
}

func receive<S>(subscriber: S) where S: Subscriber, Never == S.Failure, NWPath.Status == S.Input {
public func receive<S>(subscriber: S) where S: Subscriber, Never == S.Failure, NWPath.Status == S.Input {
let subscription = NetworkStatusSubscription(
subscriber: subscriber,
monitor: monitor,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import DesignSystem
import SwiftUI
import SwiftUI_Kit

extension View {
public extension View {
func animatedRedacted(_ isActive: Bool) -> some View {
modifier(
AnimatedRedactedModifier(
Expand All @@ -26,18 +26,18 @@ extension View {
}
}

struct IsRedactedKey: EnvironmentKey {
static let defaultValue = false
public struct IsRedactedKey: EnvironmentKey {
public static let defaultValue = false
}

extension EnvironmentValues {
public extension EnvironmentValues {
var isRedacted: Bool {
get { self[IsRedactedKey.self] }
set { self[IsRedactedKey.self] = newValue }
}
}

extension View {
public extension View {
func isRedacted(_ isRedacted: Bool) -> some View {
environment(\.isRedacted, isRedacted)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

import SwiftUI

extension View {
public extension View {
func width(_ width: CGFloat) -> some View {
environment(\.width, width)
}
Expand All @@ -18,7 +18,7 @@ private struct WidthKey: EnvironmentKey {
static let defaultValue: CGFloat = 0
}

extension EnvironmentValues {
public extension EnvironmentValues {
var width: CGFloat {
get { self[WidthKey.self] }
set { self[WidthKey.self] = newValue }
Expand Down
Loading