-
Notifications
You must be signed in to change notification settings - Fork 36
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
IOS-6610 IOS-7064 Add a mechanism for automatic indexation of wallets #3814
Conversation
…add-a-mechanism-for-automatic-indexation-of-wallets-3
…add-a-mechanism-for-automatic-indexation-of-wallets-3
…add-a-mechanism-for-automatic-indexation-of-wallets-3
…dexation-of-wallets-3
Потрогал логику хелпера, сделал его stateless, по мотивам коммента |
@@ -66,3 +66,9 @@ extension StoredUserWallet: Decodable { | |||
} | |||
} | |||
} | |||
|
|||
protocol NameableWallet { | |||
var name: String { get set } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Добавил этот протокол на случай если понадобится переименовывать не только StoredUserWallet
, но и другие сущности
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да у нас других сущностей и нет, этот код вообще временный, для миграции, я бы не усложнял
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В общем, тут есть еще проблема. Для такой реализации очень сложно написать тесты, потому что надо инициализировать StoredUserWallet чисто чтобы потом из него получить имя. Основная сложность в том что в Card нет публичного инита, а сам он лежит в TangemSDK, и ради тестов добавлять туда инит - вот это точно оверкилл
StoredUserWallet(
userWalletId: <#T##Data#>,
name: <#T##String#>,
card: CardDTO(
card: <#T##Card#>
),
associatedCardIds: <#T##Set<String>#>,
walletData: <#T##DefaultWalletData#>,
artwork: <#T##ArtworkInfo?#>
)
Я поломал вчера голову как это лучше сделать, но кажется что удовлетворимых варианта только два:
- Тот что сейчас в этом PR-е, с NameableWallet
- Либо переделать реализацию, чтобы хелпер принимал массив строк. Так сделал Андрей Чукавин в изначальном PR-е, но там был коммент от тебя чтобы принимать модельки кошельков сразу
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ок, оставляй так, не крит
Тест кейсы и все остальное оставил из предыдущего PR |
@@ -66,3 +66,9 @@ extension StoredUserWallet: Decodable { | |||
} | |||
} | |||
} | |||
|
|||
protocol NameableWallet { | |||
var name: String { get set } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Да у нас других сущностей и нет, этот код вообще временный, для миграции, я бы не усложнял
@@ -186,10 +188,21 @@ final class MainViewModel: ObservableObject { | |||
|
|||
guard let userWalletModel = userWalletRepository.selectedModel else { return } | |||
|
|||
let otherWalletNames = userWalletRepository.models.compactMap { model -> String? in |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Надо будет потом эту логику реюнуть постараться с экраном настроек
return | ||
} | ||
|
||
if let migratedWallets = UserWalletNameIndexationHelper.migratedWallets(wallets) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
если migratedWallets не используется, то и возвращать думаю не нужно
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ошибся немного, надо именно вернувшиеся сохранять, поправил
existingNamesTestCases: [ | ||
("Wallet 2", /* -> */ "Wallet 2"), | ||
("Wallet", /* -> */ "Wallet"), | ||
("Wallet 2", /* -> */ "Wallet 2"), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
а почему тут Wallet 2, хотя на первой строке тоже Wallet 2?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А вы это обсуждали уже в старом PRе, я тут просто оставил как есть
func nextIndex(for nameTemplate: String) -> Int { | ||
let indexes = self[nameTemplate, default: []] | ||
|
||
for i in 1 ... 100 { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
почему такой range?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ты прав, тут на самом деле надо сделать верхней границей indices.count
Логика следующая:
- Если массив индексов пустой, то значит можно использовать первый (index = 1)
- Если не пустой, то мы проходимся в цикле от 1 до размера массива и ищем дырку со свободным индексом. Если такая дырка есть, то значит она находится точно ниже верхней грани цикла, то есть меньше размера массива. Пример: для массива [1, 3, 4] дырка - это 2, а 2 < indices.count
- Если такой дырки нет, то значит у нас индексы идут сплошняком [1, 2, 3], и тогда следующий индекс = размер + 1
@@ -520,6 +526,18 @@ class CommonUserWalletRepository: UserWalletRepository { | |||
initializeServices(for: selectedModel) | |||
} | |||
|
|||
private func migrateNamesIfNeeded(_ wallets: inout [StoredUserWallet]) { | |||
if AppSettings.shared.didMigrateUserWalletNames { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
тут guard по смыслу больше подходит
Pull request was converted to draft
3a4ce34
} | ||
|
||
walletNameFieldValidator = AlertFieldValidator { input in | ||
!(otherWalletNames.contains(input) || input.isEmpty) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
IOS-6610
IOS-7064
Открыл PR из ветки соседнего, подмерджил сюда develop.
Старый PR пока оставлю для референса. Если что, то потом изменения перенесу туда
До/после