Skip to content

add docompositions folder #77

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

Open
wants to merge 106 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
106 commits
Select commit Hold shift + click to select a range
001374d
add docompositions folder
ilyanikitash Mar 13, 2025
cf6ec55
add statistic screen decomposition
ilyanikitash Mar 14, 2025
ac2c1cd
feat: users list UI, Sort alert
ilyanikitash Mar 15, 2025
ebc9e48
feat: add sort
ilyanikitash Mar 15, 2025
ed84ff6
Update statistic-decompositions.md
ilyanikitash Mar 19, 2025
58836e5
feat: logic development/networking
ilyanikitash Mar 19, 2025
2170b2a
Merge branch 'epic/statistics_1' of https://github.com/ilyanikitash/i…
ilyanikitash Mar 19, 2025
29db1fa
Update statistic-decompositions.md
ilyanikitash Mar 19, 2025
d4ef9c8
feat: profile view
ilyanikitash Mar 21, 2025
1e169ea
Верстка главного экрана корзины
KirillDrobin Mar 21, 2025
469f964
Логика отображения плейсхолдера главного экрана
KirillDrobin Mar 22, 2025
12da46a
Добавлен файл декомпозиции
KirillDrobin Mar 22, 2025
1ebbfe6
Форматирование текста
KirillDrobin Mar 22, 2025
1f2c4a8
Исправлено отображение начального состояния экрана для проверки вестк…
KirillDrobin Mar 22, 2025
bff54f8
add decomposition
DavidBekoev Mar 22, 2025
c818fd9
update Kingfisher
DavidBekoev Mar 22, 2025
462467d
кингфишер
DavidBekoev Mar 23, 2025
8519473
update kingFisher
DavidBekoev Mar 23, 2025
fca2b1a
assets
DavidBekoev Mar 23, 2025
f643c50
add TabBar,ProfileViewController,add token
DavidBekoev Mar 23, 2025
879bed6
Merge pull request #1 from ilyanikitash/epic/statistics_1
ilyanikitash Mar 23, 2025
9935b76
feat: user screen UI
ilyanikitash Mar 23, 2025
e357208
feat: profile data
ilyanikitash Mar 23, 2025
3939619
feat: activity indicator
ilyanikitash Mar 23, 2025
1eb130c
add assets,add profileviewcontroller,add webviewcontroller
DavidBekoev Mar 23, 2025
c214edc
Мерж веток epic/cart_1 и epic/cart
KirillDrobin Mar 23, 2025
502b634
Создание экрана оплаты
KirillDrobin Mar 23, 2025
7d36eb2
Добавление декомпозиции эпика 2/3, работа с экраном оплаты
KirillDrobin Mar 23, 2025
134faaf
feat: user site opening
ilyanikitash Mar 24, 2025
5fa8f6f
fix: delete unnecessary code
ilyanikitash Mar 24, 2025
a6fe7e4
ProfileViewController done,add ProfileRequest, add ProfileModel, add…
DavidBekoev Mar 24, 2025
4daa846
fix: ui and minor improvements
ilyanikitash Mar 25, 2025
e5814ab
конфликты
DavidBekoev Mar 25, 2025
b9580c5
токен
DavidBekoev Mar 25, 2025
fba17b5
таб бар
DavidBekoev Mar 25, 2025
b2aee20
Merge pull request #7 from ilyanikitash/epic/profile_1
DavidBekoev Mar 25, 2025
b759bed
.
DavidBekoev Mar 25, 2025
db67f90
+ Edit ProfileView, + EditProfileViewController
DavidBekoev Mar 25, 2025
b544672
feat: labeling added
ilyanikitash Mar 25, 2025
833f63f
add decomposition
DavidBekoev Mar 25, 2025
fe7abfe
удаление лишних полей
DavidBekoev Mar 25, 2025
261057a
New Group For Edit
DavidBekoev Mar 25, 2025
5e18b83
feat: add unit tests
ilyanikitash Mar 26, 2025
defab53
Merge pull request #9 from ilyanikitash/epic/statistic_2
ilyanikitash Mar 26, 2025
26c885e
FIx after team Review
DavidBekoev Mar 26, 2025
32e9612
feat: view and view controller init
ilyanikitash Mar 27, 2025
b779592
fix: delete empty file
ilyanikitash Mar 27, 2025
c614aff
Merge branch 'epic/statistics' of https://github.com/ilyanikitash/iOS…
ilyanikitash Mar 27, 2025
c27b417
Merge pull request #10 from ilyanikitash/epic/profile_2
DavidBekoev Mar 27, 2025
fcc122b
fix
DavidBekoev Mar 27, 2025
ef96563
Верстка экрана оплаты, верстка экрана успешной оплаты, добавление алерта
KirillDrobin Mar 27, 2025
4e44a5a
Исправление бага с исчезновением navigationBar на экране оплаты
KirillDrobin Mar 27, 2025
9ef1d48
Обновление декомпозиции
KirillDrobin Mar 27, 2025
5574ac7
Исправления
KirillDrobin Mar 28, 2025
f62f6be
add My NFT
DavidBekoev Mar 29, 2025
b244aa9
add myNFT
DavidBekoev Apr 1, 2025
ac62ea8
Добавление сетевого слоя
KirillDrobin Apr 1, 2025
b25d8d9
Обновление PUT запроса
KirillDrobin Apr 1, 2025
6df4f1e
add FavoritesNFT
DavidBekoev Apr 2, 2025
d689c8f
fix after review
DavidBekoev Apr 3, 2025
23c4cd8
fix after review 2
DavidBekoev Apr 4, 2025
b1842bf
отступы
DavidBekoev Apr 4, 2025
bc09745
Реализация удаления из корзины
KirillDrobin Apr 4, 2025
fdb8e35
Реализация сортировки, правка багов
KirillDrobin Apr 5, 2025
97b7b46
Мелкие правки
KirillDrobin Apr 5, 2025
d5df25d
Обновление файла декомпозиции
KirillDrobin Apr 5, 2025
4870d39
Исправление блокировки интерфейса при ошибке оплаты
KirillDrobin Apr 5, 2025
354bf4e
feat: collectionView with network, improve ui
ilyanikitash Apr 5, 2025
6087558
feat: empty collection processing
ilyanikitash Apr 5, 2025
62a30da
Исправление краша при performBatchUpdates
KirillDrobin Apr 5, 2025
b06a08a
Правка ui для темного режима
KirillDrobin Apr 5, 2025
71fb206
Исправление проверки такс на nil
KirillDrobin Apr 5, 2025
f63bd32
Добавление анимированного удаления ячеек таблицы корзины, анимированн…
KirillDrobin Apr 6, 2025
85ced20
fix: review changes
ilyanikitash Apr 6, 2025
a622386
Merge pull request #11 from ilyanikitash/epic/profile_3
DavidBekoev Apr 6, 2025
b9d7a60
Merge pull request #12 from ilyanikitash/epic/statistic_3
ilyanikitash Apr 6, 2025
852e358
.
DavidBekoev Apr 6, 2025
6330c7e
Merge branch 'epic/profile' into development
DavidBekoev Apr 6, 2025
bc2a9cd
Merge pull request #14 from ilyanikitash/epic/statistics
ilyanikitash Apr 6, 2025
09ddba6
fix: update kingfisher
ilyanikitash Apr 6, 2025
cd3ae01
fix: tabBar
ilyanikitash Apr 6, 2025
79a6331
Merge branch 'development' of github.com:ilyanikitash/iOS-FakeNFT-Sta…
DavidBekoev Apr 7, 2025
294052b
Merge branch 'development' of github.com:ilyanikitash/iOS-FakeNFT-Sta…
DavidBekoev Apr 7, 2025
fe6f4f5
Обновление таблицы по reloadData
KirillDrobin Apr 7, 2025
6cbfd2a
fix: tabBar and packeges
ilyanikitash Apr 8, 2025
ef59258
Исправление ошибок, мерж в development
KirillDrobin Apr 8, 2025
39ea597
Исправление конфликта TabBarController
KirillDrobin Apr 8, 2025
5687647
Обновление kingfisher
KirillDrobin Apr 8, 2025
f0065c9
Merge branch 'development' of https://github.com/ilyanikitash/iOS-Fak…
KirillDrobin Apr 8, 2025
d25f5c3
Исправления
KirillDrobin Apr 8, 2025
ce621c9
Merge branch 'epic/cart' into development
KirillDrobin Apr 8, 2025
bce302c
Update project.pbxproj
KirillDrobin Apr 8, 2025
bb6fdd8
Update TabBarController.swift
KirillDrobin Apr 8, 2025
e1405b9
Update Contents.json
KirillDrobin Apr 8, 2025
0d67af4
Update project.pbxproj
KirillDrobin Apr 8, 2025
7ffd3c0
Update TabBarController.swift.orig
KirillDrobin Apr 8, 2025
24e5a37
Update TabBarController_BACKUP_79588.swift
KirillDrobin Apr 8, 2025
64d1a44
fix: minor commit
ilyanikitash Apr 8, 2025
a6ef399
rollback
ilyanikitash Apr 8, 2025
44bc514
Мерж веток
KirillDrobin Apr 8, 2025
63170e2
Добавление скринкаста корзины
KirillDrobin Apr 8, 2025
15d11a6
add statistic screencast
ilyanikitash Apr 8, 2025
e90e3cd
add profile screencast
ilyanikitash Apr 8, 2025
638681b
Обновление readme
KirillDrobin Apr 8, 2025
d2ebac0
fix: cart image
ilyanikitash Apr 10, 2025
2c4686b
Merge branch 'development' of https://github.com/ilyanikitash/iOS-Fak…
ilyanikitash Apr 10, 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
Empty file added Decompositions/.gitkeep
Empty file.
16 changes: 16 additions & 0 deletions Decompositions/statistic-decompositions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Архетектура
MVC
# Способ верски
Верстка кодом
## 1. экран со списком пользователей
верстка (4 часа)
разработка логики/сеть (7 часов)
добавление сортировки (3 часа)
## 2. экран профиля
верстка (3,5 часа)
разработка логики/сеть (6 часов)
## 3. экран коллекции
верстка (3,5 часа)
разработка логики/сеть (6 часов)

# Decomposition board: https://github.com/users/ilyanikitash/projects/2/views/1
400 changes: 374 additions & 26 deletions FakeNFT.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
{
"originHash" : "6577d1efd10193e37882c2375d72d60147984d595634f9f934df8bdab2235299",
"pins" : [
{
"identity" : "kingfisher",
"kind" : "remoteSourceControl",
"location" : "https://github.com/onevcat/Kingfisher.git",
"state" : {
"revision" : "af4be924ad984cf4d16f4ae4df424e79a443d435",
"version" : "7.6.2"
<<<<<<< HEAD
<<<<<<< HEAD
"revision" : "2ef543ee21d63734e1c004ad6c870255e8716c50",
"version" : "7.12.0"
=======
"revision" : "4c6b067f96953ee19526e49e4189403a2be21fb3",
"version" : "8.3.1"
>>>>>>> epic/profile
=======
"revision" : "4c6b067f96953ee19526e49e4189403a2be21fb3",
"version" : "8.3.1"
>>>>>>> 09ddba61d04d952381ee5a750f8e5dd4aea69ea5
}
},
{
Expand All @@ -19,5 +30,5 @@
}
}
],
"version" : 2
"version" : 3
}
1,180 changes: 1,180 additions & 0 deletions FakeNFT.xcodeproj/project_BACKUP_72602.pbxproj

Large diffs are not rendered by default.

912 changes: 912 additions & 0 deletions FakeNFT.xcodeproj/project_BASE_72602.pbxproj

Large diffs are not rendered by default.

1,010 changes: 1,010 additions & 0 deletions FakeNFT.xcodeproj/project_LOCAL_72602.pbxproj

Large diffs are not rendered by default.

1,076 changes: 1,076 additions & 0 deletions FakeNFT.xcodeproj/project_REMOTE_72602.pbxproj

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions FakeNFT.xcodeproj/xcshareddata/swiftpm/Package.resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"originHash" : "a69a2e8b28d6b7bf531f8f35489db4b4e76b4fc31c39049c45b200bf7d503b7c",
"pins" : [
{
"identity" : "kingfisher",
"kind" : "remoteSourceControl",
"location" : "https://github.com/onevcat/Kingfisher",
"state" : {
"revision" : "4c6b067f96953ee19526e49e4189403a2be21fb3",
"version" : "8.3.1"
}
},
{
"identity" : "progresshud",
"kind" : "remoteSourceControl",
"location" : "https://github.com/relatedcode/ProgressHUD",
"state" : {
"revision" : "46792db49f80454879a939f9b2be31bb61c37b0c",
"version" : "13.8.6"
}
}
],
"version" : 3
}
2 changes: 1 addition & 1 deletion FakeNFT.xcodeproj/xcshareddata/xcschemes/FakeNFT.xcscheme
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1430"
LastUpgradeVersion = "1620"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
6 changes: 5 additions & 1 deletion FakeNFT/AppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ final class AppDelegate: UIResponder, UIApplicationDelegate {
configurationForConnecting connectingSceneSession: UISceneSession,
options _: UIScene.ConnectionOptions
) -> UISceneConfiguration {
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
let configuration = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
configuration.storyboard = nil
configuration.sceneClass = UIWindowScene.self
configuration.delegateClass = SceneDelegate.self
return configuration
}
}
11 changes: 9 additions & 2 deletions FakeNFT/DesignSystem/Colors.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ extension UIColor {
static let secondary = UIColor(red: 255 / 255, green: 193 / 255, blue: 7 / 255, alpha: 1.0)

// Background Colors
static let background = UIColor.white
private static let backgroundLight = UIColor.white
private static let backgroundDark = UIColor.black

// Text Colors
static let textPrimary = UIColor.black
Expand All @@ -46,7 +47,13 @@ extension UIColor {
private static let yaBlackDark = UIColor.white
private static let yaLightGrayLight = UIColor(hexString: "#F7F7F8")
private static let yaLightGrayDark = UIColor(hexString: "#2C2C2E")


static let background = UIColor { traits in
return traits.userInterfaceStyle == .dark
? .backgroundDark
: .backgroundLight
}

static let segmentActive = UIColor { traits in
return traits.userInterfaceStyle == .dark
? .yaBlackDark
Expand Down
55 changes: 55 additions & 0 deletions FakeNFT/Foundation/MemoryStorage/Storage.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
//
// Storage.swift
// FakeNFT
//
// Created by Кирилл Дробин on 30.03.2025.
//

import Foundation

final class Storage {

static let shared = Storage()

private init() { }

var forCurrenciesCollection: [Currency] = []

var cellIndexToDelete = Int()

// мок данные nft для отладки
let data = [MockNft(createdAt: "2023-10-08T07:43:22.944Z[GMT]",
name: "Rosario Dejesus",
images: ["https://code.s3.yandex.net/Mobile/iOS/NFT/Beige/Finn/1.png",
"https://code.s3.yandex.net/Mobile/iOS/NFT/Beige/Finn/2.png",
"https://code.s3.yandex.net/Mobile/iOS/NFT/Beige/Finn/3.png"],
rating: 3,
description: "explicari lobortis rutrum evertitur fugit convenire ligula",
price: 28.27,
autor: "https://unruffled_cohen.fakenfts.org/",
id: "7773e33c-ec15-4230-a102-92426a3a6d5a"),

MockNft(createdAt: "2023-10-19T06:08:33.207Z[GMT]",
name: "Christi Noel",
images: ["https://code.s3.yandex.net/Mobile/iOS/NFT/Beige/April/1.png",
"https://code.s3.yandex.net/Mobile/iOS/NFT/Beige/April/2.png",
"https://code.s3.yandex.net/Mobile/iOS/NFT/Beige/April/3.png"],
rating: 2,
description: "fringilla eam vim sonet faucibus impetus",
price: 36.54,
autor: "https://condescending_almeida.fakenfts.org/",
id: "739e293c-1067-43e5-8f1d-4377e744ddde"),

MockNft(createdAt: "2023-10-20T10:23:01.305Z[GMT]",
name: "Kieth Clarke",
images: [ "https://code.s3.yandex.net/Mobile/iOS/NFT/Gray/Kaydan/1.png",
"https://code.s3.yandex.net/Mobile/iOS/NFT/Gray/Kaydan/2.png",
"https://code.s3.yandex.net/Mobile/iOS/NFT/Gray/Kaydan/3.png"],
rating: 2,
description: "tacimates docendi efficitur tempus non quod cras pellentesque commune",
price: 16.95,
autor: "https://goofy_napier.fakenfts.org/",
id: "5093c01d-e79e-4281-96f1-76db5880ba70")]

var mockCartNfts = [MockNft]()
}
9 changes: 9 additions & 0 deletions FakeNFT/Foundation/NetworkClient/NetworkRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ enum HttpMethod: String {
case delete = "DELETE"
}

enum HttpStrings: String {
case order = "/api/v1/orders/1"
case currencies = "/api/v1/currencies"
case currency = "/api/v1/currencies/1"
case payment = "/api/v1/orders/1/payment/"
case nfts = "/api/v1/nft"
}


protocol NetworkRequest {
var endpoint: URL? { get }
var httpMethod: HttpMethod { get }
Expand Down
182 changes: 182 additions & 0 deletions FakeNFT/Foundation/NetworkClient/Payment/PaymentNetworkService.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
//
// PaymentNetworkService.swift
// FakeNFT
//
// Created by Кирилл Дробин on 29.03.2025.
//

import Foundation

final class PaymentNetworkService {
// MARK: - Singleton
static let shared = PaymentNetworkService()
private let storage = Storage.shared

// MARK: - Private Properties
private var task: URLSessionTask?
private let urlSession = URLSession.shared
private(set) var orderId = String()
private init() {}

private enum PaymentNetworkServiceError: Error {
case paymentNetworkServiceError
}

// MARK: - Order Fetch
func getOrder(_ completion: @escaping (Result<Order, Error>) -> Void) {
if task != nil {
task?.cancel()
}

guard let request = makeRequest(string: HttpStrings.order.rawValue,
httpMethod: HttpMethod.get.rawValue),
task == nil
else {
print("Order request error")
return
}

let task = URLSession.shared.objectTask(for: request) { [weak self] (result: Result<Order, Error>) in
guard let self else { return }
self.task = nil
switch result {
case .success(let data):
DispatchQueue.main.async {
self.orderId = data.id
}

case .failure(let error):
print("responce error: \(error)")
}
}
self.task = task
task.resume()
}

// MARK: - Currencies Fetch
func getCurrencies(_ completion: @escaping (Result<[Currency], Error>) -> Void) {
if task != nil {
task?.cancel()
}

guard let request = makeRequest(string: HttpStrings.currencies.rawValue,
httpMethod: HttpMethod.get.rawValue),
task == nil
else {
print("Currencies request error")
return
}

let task = URLSession.shared.objectTask(for: request) { [weak self] (result: Result<[Currency], Error>) in
guard let self else { return }
self.task = nil
switch result {
case .success(let data):
DispatchQueue.main.async {
self.storage.forCurrenciesCollection = data
}
completion(.success(data))
case .failure(let error):
print("responce error: \(error)")
}
}
self.task = task
task.resume()

}

// MARK: - Before Pay
func setCurrencyBeforePay(currencyID: String, _ completion: @escaping (Result<SetCurrency, Error>) -> Void) {
if task != nil {
task?.cancel()
}
guard let request = makeRequest(string: "\(HttpStrings.payment.rawValue)" + "\(currencyID)",
httpMethod: HttpMethod.get.rawValue),
task == nil
else {
print("setCurrency request error")
return
}

let task = URLSession.shared.objectTask(for: request) { [weak self] (result: Result<SetCurrency, Error>) in
guard let self else { return }
self.task = nil
switch result {
case .success(let responce):
completion(.success(responce))
print("\(responce)")
case .failure(let error):
completion(.failure(error))
print("responce error: \(error)")
}
}
self.task = task
task.resume()

}

// MARK: - Order Update/Pay
func updateOrder(_ completion: @escaping (Result<Order, Error>) -> Void) {
if task != nil {
task?.cancel()
}

var nfts: [String] = []

for i in storage.mockCartNfts { // брать из данных для построения таблицы корзины
nfts.append(i.id)
}

guard var request = makeRequest(string: HttpStrings.order.rawValue,
httpMethod: HttpMethod.put.rawValue),
task == nil
else {
return
}

request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
var requestComponents = URLComponents()
requestComponents.queryItems = [URLQueryItem(name: "nfts", value: arrayToStringConverter(nfts: nfts))]

request.httpBody = requestComponents.query?.data(using: .utf8)

let task = URLSession.shared.objectTask(for: request) { [weak self] (result: Result<Order, Error>) in
guard let self else { return }
self.task = nil
switch result {
case .success(let responce):
DispatchQueue.main.async {
completion(.success(responce))
}
case .failure(let error):
completion(.failure(error))
print("responce error: \(error)")
}
}
task.resume()
return
}
}

// MARK: - Private Methods
private func makeRequest(string: String, httpMethod: String) -> URLRequest? {
guard let url = URL(
string: string,
relativeTo: URL(string: RequestConstants.baseURL)
) else {
preconditionFailure("Unable to construct url")
}

var request = URLRequest(url: url)
request.httpMethod = httpMethod
request.setValue(RequestConstants.token, forHTTPHeaderField: "X-Practicum-Mobile-Token")
return request
}

private func arrayToStringConverter(nfts: [String]) -> String {
var dateStringArray = [String]()
for i in nfts {
dateStringArray.append(i)
}
return dateStringArray.joined(separator: ",")
}
Loading