Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
62860ce
Подготовка проекта под разработку на SwiftUI
Maxoscaro May 25, 2025
1247f2f
Убрал два желтых warning
Maxoscaro May 25, 2025
1bfee29
Тоже удаляю ненужное
Maxoscaro May 25, 2025
247fcd7
Добавила папки Docs, ViewModels
May 25, 2025
5c81c87
Добавила иконки
May 25, 2025
d087428
Добавила TabBar
May 25, 2025
afa8553
Добавила NavigationBarStyle
May 25, 2025
553b180
Добавила LoadingView
May 25, 2025
c6a701b
Merge pull request #24 from Maxoscaro/prepairingProject/MaxAnisimov
Maxoscaro May 26, 2025
c23481d
Поправил работу таббара и внес модель
Maxoscaro May 29, 2025
c5d7c2f
Поправил фон таббара при скролле
Maxoscaro May 29, 2025
c6d8e3a
Merge pull request #43 from Maxoscaro/CartModule1
Maxoscaro May 29, 2025
4ba8995
Инициализация ServicesAssembly
Jun 3, 2025
56076d5
Добавила WebView
Jun 3, 2025
8b02f4e
Добавила декомпозиции эпиков
Jun 3, 2025
e9d764c
Merge pull request #44 from Maxoscaro/preparingProject
anastkrp Jun 3, 2025
7547fc5
feat: setup RatingView
Jun 3, 2025
1c9b6f8
feat: create RatingList and RatingRow
Jun 3, 2025
ceea3fd
feat: setup ViewModel
Jun 3, 2025
aaf9436
feat: setup filter
Jun 3, 2025
77b7d10
feat: add error alert
Jun 3, 2025
486364d
feat: add navigation to UserCardView
Jun 3, 2025
1d94fd5
feat: create and connect a request to get a list of users
Jun 3, 2025
612dd70
docs: add task completion time
Jun 3, 2025
6185a9c
Merge pull request #45 from Maxoscaro/StatisticsModule1
anastkrp Jun 3, 2025
b8131f9
feat: create userInfo
Jun 4, 2025
6f624ec
feat: add a button to show the WebView
Jun 4, 2025
85cbdba
feat: add a button to show the collection
Jun 4, 2025
163dd7e
feat: setup ViewModel
Jun 4, 2025
e46002b
feat: add navigation to UserCollectionView
Jun 4, 2025
30532fe
docs: add task completion time
Jun 4, 2025
e8fc394
Merge pull request #46 from Maxoscaro/StatisticsModule2
anastkrp Jun 4, 2025
3c05087
feat: create CollectionRow
Jun 7, 2025
1359053
feat: create UserNFTCollection
Jun 7, 2025
a047d23
feat: setup ViewModel
Jun 7, 2025
b9d800d
feat: load NFT info
Jun 7, 2025
ffc9487
feat: load user likes
Jun 7, 2025
0d75b29
feat: load user orders
Jun 7, 2025
8bd2eba
feat: add put requests
Jun 7, 2025
d44312f
docs: add task completion time
Jun 7, 2025
f772f0e
Merge pull request #48 from Maxoscaro/StatisticsModule3
anastkrp Jun 8, 2025
429ab48
Merge pull request #49 from Maxoscaro/statistics
anastkrp Jun 8, 2025
26e535b
Created profile
Jun 12, 2025
d1968ba
Сделал первый модуль(Экран Профиль)
Jun 17, 2025
ca50a27
Добавил фактическое время выполнения задач
Jun 18, 2025
f5d9142
Внес изменения по модулю 2
Jun 19, 2025
b12d1c8
commit
Jun 19, 2025
afacfb3
Добавил ссылку в .md, удалил лишнюю кнопку навигации
Jun 20, 2025
4347351
Сделал 1 модуль без mvvm
Jun 23, 2025
9ad1b1e
Добавил mvvm
Jun 23, 2025
af1190a
Revert "Добавил mvvm"
Jun 24, 2025
3f02869
Reapply "Добавил mvvm"
Jun 24, 2025
3e67c13
Завершил 1 модуль
Jun 24, 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
503 changes: 349 additions & 154 deletions FakeNFT.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

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 = "1630"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
21 changes: 0 additions & 21 deletions FakeNFT/AppDelegate.swift

This file was deleted.

100 changes: 44 additions & 56 deletions FakeNFT/DesignSystem/Colors.swift
Original file line number Diff line number Diff line change
@@ -1,67 +1,55 @@
import UIKit

extension UIColor {
// Creates color from a hex string
convenience init(hexString: String) {
let hex = hexString.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
var int = UInt64()
import SwiftUI

extension Color {

// MARK: - Day/Night Theme
static let blackDay = Color("blackDay")
static let whiteDay = Color("whiteDay")
static let lightGrayDay = Color("lightGrayDay")

// MARK: - Universal Colors
static let yaGrayUniversal = Color(hex: "#625C5C")
static let yaRedUniversal = Color(hex: "#F56B6C")
static let yaBackgroundUniversal = Color(hex: "#1A1B2280")
static let yaGreenUniversal = Color(hex: "#1C9F00")
static let yaBlueUniversal = Color(hex: "#0A84FF")
static let yaBlackUniversal = Color(hex: "#1A1B22")
static let yaWhiteUniversal = Color(hex: "#FFFFFF")
static let yaYellowUniversal = Color(hex: "#FEEF0D")

// MARK: - Init with HEX
init(hex: String) {
let hex = hex.trimmingCharacters(in: CharacterSet.alphanumerics.inverted)
var int: UInt64 = 0
Scanner(string: hex).scanHexInt64(&int)
let alpha, red, green, blue: UInt64

let a, r, g, b: UInt64
switch hex.count {
case 3: // RGB (12-bit)
(alpha, red, green, blue) = (255, (int >> 8) * 17, (int >> 4 & 0xF) * 17, (int & 0xF) * 17)
(a, r, g, b) = (255,
(int >> 8) * 17,
(int >> 4 & 0xF) * 17,
(int & 0xF) * 17)
case 6: // RGB (24-bit)
(alpha, red, green, blue) = (255, int >> 16, int >> 8 & 0xFF, int & 0xFF)
(a, r, g, b) = (255,
int >> 16,
int >> 8 & 0xFF,
int & 0xFF)
case 8: // ARGB (32-bit)
(alpha, red, green, blue) = (int >> 24, int >> 16 & 0xFF, int >> 8 & 0xFF, int & 0xFF)
(a, r, g, b) = (int >> 24,
int >> 16 & 0xFF,
int >> 8 & 0xFF,
int & 0xFF)
default:
(alpha, red, green, blue) = (255, 0, 0, 0)
(a, r, g, b) = (255, 0, 0, 0)
}

self.init(
red: CGFloat(red) / 255,
green: CGFloat(green) / 255,
blue: CGFloat(blue) / 255,
alpha: CGFloat(alpha) / 255
.sRGB,
red: Double(r) / 255,
green: Double(g) / 255,
blue: Double(b) / 255,
opacity: Double(a) / 255
)
}

// Ниже приведены примеры цветов, настоящие цвета надо взять из фигмы

// Primary Colors
static let primary = UIColor(red: 0 / 255, green: 122 / 255, blue: 255 / 255, alpha: 1.0)

// Secondary Colors
static let secondary = UIColor(red: 255 / 255, green: 193 / 255, blue: 7 / 255, alpha: 1.0)

// Background Colors
static let background = UIColor.white

// Text Colors
static let textPrimary = UIColor.black
static let textSecondary = UIColor.gray
static let textOnPrimary = UIColor.white
static let textOnSecondary = UIColor.black

private static let yaBlackLight = UIColor(hexString: "1A1B22")
private static let yaBlackDark = UIColor.white
private static let yaLightGrayLight = UIColor(hexString: "#F7F7F8")
private static let yaLightGrayDark = UIColor(hexString: "#2C2C2E")

static let segmentActive = UIColor { traits in
return traits.userInterfaceStyle == .dark
? .yaBlackDark
: .yaBlackLight
}

static let segmentInactive = UIColor { traits in
return traits.userInterfaceStyle == .dark
? .yaLightGrayDark
: .yaLightGrayLight
}

static let closeButton = UIColor { traits in
return traits.userInterfaceStyle == .dark
? .yaBlackDark
: .yaBlackLight
}
}
27 changes: 9 additions & 18 deletions FakeNFT/DesignSystem/Fonts.swift
Original file line number Diff line number Diff line change
@@ -1,19 +1,10 @@
import UIKit

extension UIFont {
// Ниже приведены примеры шрифтов, настоящие шрифты надо взять из фигмы

// Headline Fonts
static var headline1 = UIFont.systemFont(ofSize: 34, weight: .bold)
static var headline2 = UIFont.systemFont(ofSize: 28, weight: .bold)
static var headline3 = UIFont.systemFont(ofSize: 22, weight: .bold)
static var headline4 = UIFont.systemFont(ofSize: 20, weight: .bold)

// Body Fonts
static var bodyRegular = UIFont.systemFont(ofSize: 17, weight: .regular)
static var bodyBold = UIFont.systemFont(ofSize: 17, weight: .bold)

// Caption Fonts
static var caption1 = UIFont.systemFont(ofSize: 15, weight: .regular)
static var caption2 = UIFont.systemFont(ofSize: 13, weight: .regular)
import SwiftUI

extension Font {
static let regular13 = Font.system(size: 13, weight: .regular)
static let regular15 = Font.system(size: 15, weight: .regular)
static let regular17 = Font.system(size: 17, weight: .regular)
static let medium10 = Font.system(size: 10, weight: .medium)
static let bold17 = Font.system(size: 17, weight: .bold)
static let bold22 = Font.system(size: 22, weight: .bold)
}
Binary file added FakeNFT/DesignSystem/SFProText-Regular.ttf
Binary file not shown.
44 changes: 44 additions & 0 deletions FakeNFT/Docs/CartAnisimov.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
Анисимов Максим Сергеевич
Когорта: 22
Группа: 2
Эпик: Корзина

Ссылка на доску: [ссылка](https://github.com/users/Maxoscaro/projects/1/views/4)


# Декомпозиция эпика Корзина

## Модуль 1:

#### Верстка
- Основной экран корзины и состояние пустой корзины (est: 1 час; fact: x часов).
- Ячейка с картинкой и ценой (est: 1 час; fact: x часов).
- Верстка кнопки покупки с ценой - (est: 1 час; fact: х часов)

#### Логика
- Сортировка NFT (по названию, рейтингу, цене) (est: 1 час; fact: x часов).
- Сохранение выбранного способа сортировки (est: 1 час; fact: x часов).
- Заполнение ячеек данными из сервиса NFTService - (est: 2 часа; fact: х часов)
- Навигация на экран выбора способа оплаты (est: 40 минут; fact: x часов).

## Модуль 2:

#### Верстка
- Экран выбора способа оплаты (est: 1 час; fact: x часов).
- Ячейка с картинкой и криптовалютами (est: 50 минут; fact: x часов).
- Кнопка оплатить (est: 30 минут; fact: x часов).
- Ссылка на пользовательское соглашение (est: 30 минут; fact: x часов).

#### Логика
- Открытие сайта пользователя в WebView (est: 30 минут; fact: x часов).
- Навигация на экран успешной покупки (est: 20 минут; fact: x часов).

## Module 3:

#### Верстка
- Экран удаления товара из корзины (est: 50 минут; fact: x часов).
- Экран успешной покупки (est: 1 час; fact: x часов).

#### Логика
- Логика покупки: удаление из корзины и добавление в аккаунт пользователя (est: 2 часа; fact: x часов).
- Обработка возврата в каталог (est: 1 час; fact: x часов).
44 changes: 44 additions & 0 deletions FakeNFT/Docs/Profile.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
Егиазаров Вадим Каренович

Когорта: 22

Группа: 2

Эпик: Профиль
Ссылка на доску: [ссылка](https://github.com/users/Maxoscaro/projects/1/views/6)


# Декомпозиция эпика Профиль

## Модуль 1:

#### Верстка
- Экран профиля и редактирование экрана профиля (est: 1 час; fact: 5 часов).
- Фото профиля (est: 1 час; fact: 2 часа).
- Кнопки для перехода на страницы "Мои NFT", "Избранные NFT", "О разработчике"- (est: 1 час; fact: 2 часа)

#### Логика
- Редактирование профиля (имя пользователя, описание, сайт и ссылка на изображение) (est: 1 час; fact: 6 часов).


## Модуль 2:

#### Верстка
- Экраны Мои NFT, Фильтрация NFT, Нет NFT (est: 1 час; fact: x часов).
- Ячейки с добавленными NFT и их ценой (est: 50 минут; fact: x часов).



#### Логика
- Сортировка по (цене, рейтингу, названию) (est: 30 минут; fact: x часов).
- Сохранение выбранного способа сортировки (est: 20 минут; fact: x часов).

## Module 3:

#### Верстка
- Экраны Favoriets, No favoriets (est: 50 минут; fact: x часов).
- Экран успешной покупки (est: 1 час; fact: x часов).

#### Логика
- Добавление NFT в избранное при нажатии на сердечко (est: 1 часа; fact: x часов).
- Удаление NFT из избранного при нажатии на сердечко (est: 1 часа; fact: x часов).
55 changes: 55 additions & 0 deletions FakeNFT/Docs/Statistics.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
Кирпинева Анастасия Валерьевна

Когорта: 22

Группа: 2

Эпик: Статистика

Ссылка на доску: [ссылка](https://github.com/users/Maxoscaro/projects/1/views/3)


# Декомпозиция эпика Статистика

## Модуль 1:

#### Верстка
- Экран рейтинга (кнопка сортировки, список пользователей) (est: 30 минут; fact: 30 минут).
- Ячейка для списка пользователей на экране рейтинга (est: 1 час; fact: 30 минут).

#### Логика
- Сортировка списка пользователей (по имени, рейтингу) (est: 1 час; fact: 20 минут).
- Сохранение выбранного способа сортировки (est: 1 час; fact: 25 минут).
- Навигация на экран информации о пользователе (est: 20 минут; fact: 15 минут).

#### Работа с сетью
- Создать запрос на получение списка пользователей (est: 2 часа; fact: 1 час).
- Подключить запрос (est: 1 час; fact: 30 минут).

## Модуль 2:

#### Верстка
- Экран информации о пользователе (аватар, имя, описание) (est: 30 минут; fact: 30 минут).
- Кнопка перехода на сайт пользователя (est: 30 минут; fact: 20 минут).
- Кнопка перехода на экран коллекции пользователя (est: 30 минут; fact: 30 минут).
- Создать WebView (est: 1 час; fact: 1 час).

#### Логика
- Открытие сайта пользователя в WebView (est: 30 минут; fact: 10 минут).
- Навигация на экран коллекции пользователя (est: 20 минут; fact: 15 минут).

## Module 3:

#### Верстка
- Экран коллекции пользователя (est: 20 минут; fact: 20 минут).
- Ячейка с информацией об NFT (est: 1 час; fact: 50 минут).

#### Логика
- Обработка нажатия на сердечко (est: 1 час; fact: 1 час).
- Обработка нажатия на кнопку корзины (добавить/удалить NFT) (est: 1 час; fact: 1 час).

#### Работа с сетью
- Загрузка и отображение изображений NFT (est: 1 час; fact: 30 минут).
- Запрос на добавление/удаление лайка (est: 1 час; fact: 2 часа).
- Запрос на добавление NFT в корзину (est: 1 час; fact: 30 минут).
- Запрос на удаление NFT из корзины (est: 1 час; fact: 30 минут).
22 changes: 22 additions & 0 deletions FakeNFT/FakeNftApp.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
//
// FakeNftApp.swift
// FakeNFT
//
// Created by Max on 24.05.2025.
//

import SwiftUI

@main
struct FakeNftApp: App {

@StateObject var service = ServicesAssembly()

var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(service)
}
}
}

8 changes: 4 additions & 4 deletions FakeNFT/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIAppFonts</key>
<array>
<string>SFProText-Regular</string>
</array>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
Expand All @@ -13,10 +17,6 @@
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
Expand Down
11 changes: 8 additions & 3 deletions FakeNFT/Models/Network/Nft.swift
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
import Foundation
import SwiftUI

struct Nft: Decodable {
struct Nft: Identifiable, Hashable, Codable {
let id: String
let images: [URL]
let name: String
let images: [String]
let description: String
let rating: Int
let price: Double
let author: String
}
16 changes: 16 additions & 0 deletions FakeNFT/Models/Network/NftInfo.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
//
// NftInfo.swift
// FakeNFT
//
// Created by Anastasia on 07.06.2025.
//

import Foundation

struct NftInfo: Decodable, Hashable {
let id: String
let name: String
let images: [String]
let rating: Int
let price: Double
}
Loading