Skip to content

Commit fa2a825

Browse files
committed
Merge branch 'develop'
2 parents aa0c2e3 + 5ab58ac commit fa2a825

File tree

354 files changed

+863
-999
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

354 files changed

+863
-999
lines changed

Adamant/Modules/Chat/View/ChatViewController.swift

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ final class ChatViewController: MessagesViewController {
4343
private var isScrollPositionNearlyTheBottom = true
4444
private var viewAppeared = false
4545
private var scrollToUnreadBottomConstraint: Constraint?
46+
private var isScrollDownButtonHidden = true
47+
private var previousUnreadCount: Int = 0
4648

4749
private lazy var inputBar = ChatInputBar()
4850
private lazy var loadingView = LoadingView()
@@ -142,7 +144,6 @@ final class ChatViewController: MessagesViewController {
142144
override func viewWillLayoutSubviews() {
143145
super.viewWillLayoutSubviews()
144146
updateIsScrollPositionNearlyTheBottom()
145-
updateScrollDownButtonVisibility()
146147
}
147148

148149
override func viewDidLayoutSubviews() {
@@ -157,8 +158,8 @@ final class ChatViewController: MessagesViewController {
157158
if navigationController?.delegate !== self {
158159
navigationController?.delegate = self
159160
}
160-
161161
viewModel.updatePartnerName()
162+
updateScrollDownButtonVisibility()
162163
}
163164

164165
override func viewDidAppear(_ animated: Bool) {
@@ -546,12 +547,9 @@ private extension ChatViewController {
546547
}
547548

548549
func updateScrollToUnreadButtonPosition() {
549-
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) {
550-
if self.scrollDownButton.alpha == 0 {
551-
self.scrollToUnreadBottomConstraint?.update(offset: 0)
552-
} else {
553-
self.scrollToUnreadBottomConstraint?.update(offset: -(scrollToUnreadInset + scrollButtonHeight))
554-
}
550+
let offset = (scrollDownButton.alpha == 0) ? 0 : -(scrollToUnreadInset + scrollButtonHeight)
551+
scrollToUnreadBottomConstraint?.update(offset: offset)
552+
if messagesLoaded {
555553
self.view.layoutIfNeeded()
556554
}
557555
}
@@ -743,14 +741,11 @@ private extension ChatViewController {
743741

744742
private extension ChatViewController {
745743
func updateIsScrollPositionNearlyTheBottom() {
746-
let oldValue = isScrollPositionNearlyTheBottom
747744
isScrollPositionNearlyTheBottom = chatMessagesCollectionView.bottomOffset < 150
748-
749-
guard oldValue != isScrollPositionNearlyTheBottom else { return }
750745
}
751746

752747
func updateMessages() {
753-
chatMessagesCollectionView.reloadData(newIds: viewModel.messages.map { $0.id })
748+
chatMessagesCollectionView.reloadData(newIds: viewModel.messages.map { $0.id }, isOnBottom: isScrollPositionNearlyTheBottom)
754749
scrollDownOnNewMessageIfNeeded(previousBottomMessageId: bottomMessageId)
755750
bottomMessageId = viewModel.messages.last?.messageId
756751
}
@@ -777,21 +772,37 @@ private extension ChatViewController {
777772

778773
func updateScrollDownButtonVisibility() {
779774
let topCount = viewModel.unreadMessagesIds?.count ?? 0
780-
781-
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) {
782-
self.scrollDownButton.alpha = self.isScrollPositionNearlyTheBottom ? 0 : 1
783-
self.updateScrollToUnreadButtonPosition()
784-
self.scrollDownButton.updateCounter(topCount)
785-
}
775+
self.scrollDownButton.updateCounter(topCount)
776+
guard isScrollDownButtonHidden != isScrollPositionNearlyTheBottom else { return }
777+
isScrollDownButtonHidden = isScrollPositionNearlyTheBottom
778+
let buttonUpdate = {
779+
self.scrollDownButton.alpha = self.isScrollPositionNearlyTheBottom ? 0 : 1
780+
self.updateScrollToUnreadButtonPosition()
781+
}
782+
if messagesLoaded {
783+
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) {
784+
buttonUpdate()
785+
}
786+
} else {
787+
buttonUpdate()
788+
}
786789
}
787790

788791
func updateScrollToUnreadButtonVisibility() {
789792
let count = viewModel.messagesWithUnredReactionsIds?.count ?? 0
790-
791-
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut) {
792-
self.scrollToUnreadReactButton.alpha = (count == 0) ? 0 : 1
793-
}
794793
scrollToUnreadReactButton.updateCounter(count)
794+
795+
guard (previousUnreadCount == 0 && count > 0) || (previousUnreadCount > 0 && count == 0) else {
796+
previousUnreadCount = count
797+
return
798+
}
799+
previousUnreadCount = count
800+
let updateAlpha = { self.scrollToUnreadReactButton.alpha = (count == 0) ? 0 : 1 }
801+
if messagesLoaded {
802+
UIView.animate(withDuration: 0.3, delay: 0, options: .curveEaseInOut, animations: updateAlpha)
803+
} else {
804+
updateAlpha()
805+
}
795806
}
796807

797808
func updateDateHeaderIfNeeded() {
@@ -841,7 +852,7 @@ private extension ChatViewController {
841852

842853
viewModel.scroll(to: unreadId)
843854
}
844-
855+
button.alpha = 0
845856
return button
846857
}
847858

Adamant/Modules/Chat/View/Subviews/ChatMessagesCollection.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,20 @@ final class ChatMessagesCollectionView: MessagesCollectionView {
4343
}
4444
}
4545

46-
func reloadData(newIds: [String]) {
47-
guard newIds.last == currentIds.last || newIds.first != currentIds.first else {
46+
func reloadData(newIds: [String], isOnBottom: Bool) {
47+
let hasNewMessagesAtTop = newIds.first != currentIds.first
48+
let hasNewMessagesAtBottom = newIds.last != currentIds.last
49+
50+
guard hasNewMessagesAtTop || hasNewMessagesAtBottom else {
4851
return applyNewIds(newIds)
4952
}
50-
53+
5154
let bottomOffset = self.bottomOffset
5255
applyNewIds(newIds)
53-
setBottomOffset(bottomOffset, safely: !isDragging && !isDecelerating)
56+
57+
if hasNewMessagesAtTop || (hasNewMessagesAtBottom && isOnBottom) {
58+
setBottomOffset(bottomOffset, safely: !isDragging && !isDecelerating)
59+
}
5460
}
5561

5662
func setFullBottomInset(_ inset: CGFloat) {

AdamantWalletsKit/Scripts/GenerateAssetsScript.sh

Lines changed: 65 additions & 109 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,11 @@ echo "TEMP_ASSETS_PATH: $TEMP_ASSETS_PATH"
1313
echo "WALLETS_ASSETS_PATH: $WALLETS_ASSETS_PATH"
1414
echo "NOTIFICATION_IMAGES_PATH: $NOTIFICATION_IMAGES_PATH"
1515

16-
# Remove old WalletImages folder
17-
if [ -d "$NOTIFICATION_IMAGES_PATH" ]; then
18-
echo "Removing old WalletImages folder..."
19-
rm -rf "$NOTIFICATION_IMAGES_PATH"
20-
fi
21-
mkdir -p "$NOTIFICATION_IMAGES_PATH"
22-
echo "Created new WalletImages folder."
23-
24-
# Remove old Wallets.xcassets folder
25-
if [ -d "$WALLETS_ASSETS_PATH" ]; then
26-
echo "Removing old Wallets.xcassets..."
27-
rm -rf "$WALLETS_ASSETS_PATH"
28-
fi
29-
mkdir -p "$WALLETS_ASSETS_PATH"
30-
echo "Created new Wallets.xcassets folder."
16+
# Remove old asset folders
17+
rm -rf "$NOTIFICATION_IMAGES_PATH" "$WALLETS_ASSETS_PATH"
18+
mkdir -p "$NOTIFICATION_IMAGES_PATH" "$WALLETS_ASSETS_PATH"
19+
20+
echo "Created new WalletImages and Wallets.xcassets folders."
3121

3222
# Function to create Contents.json
3323
function create_contents {
@@ -38,93 +28,53 @@ function create_contents {
3828
echo "Generating Contents.json for $TARGET..."
3929

4030
if [ "$WITH_DARK" = true ]; then
41-
cat > ${TARGET}/Contents.json << __EOF__
31+
cat > "${TARGET}/Contents.json" << __EOF__
4232
{
4333
"images" : [
44-
{
45-
"filename" : "${IMAGE_NAME}.png",
46-
"idiom" : "universal",
47-
"scale" : "1x"
48-
},
49-
{
50-
"appearances" : [
51-
{
52-
"appearance" : "luminosity",
53-
"value" : "dark"
54-
}
55-
],
56-
"filename" : "${IMAGE_NAME}_dark.png",
57-
"idiom" : "universal",
58-
"scale" : "1x"
59-
},
60-
{
61-
"filename" : "${IMAGE_NAME}@2x.png",
62-
"idiom" : "universal",
63-
"scale" : "2x"
64-
},
65-
{
66-
"appearances" : [
67-
{
68-
"appearance" : "luminosity",
69-
"value" : "dark"
70-
}
71-
],
72-
"filename" : "${IMAGE_NAME}_dark@2x.png",
73-
"idiom" : "universal",
74-
"scale" : "2x"
75-
},
76-
{
77-
"filename" : "${IMAGE_NAME}@3x.png",
78-
"idiom" : "universal",
79-
"scale" : "3x"
80-
},
81-
{
82-
"appearances" : [
83-
{
84-
"appearance" : "luminosity",
85-
"value" : "dark"
86-
}
87-
],
88-
"filename" : "${IMAGE_NAME}_dark@3x.png",
89-
"idiom" : "universal",
90-
"scale" : "3x"
91-
}
34+
{ "filename" : "${IMAGE_NAME}.png", "idiom" : "universal", "scale" : "1x" },
35+
{ "filename" : "${IMAGE_NAME}@2x.png", "idiom" : "universal", "scale" : "2x" },
36+
{ "filename" : "${IMAGE_NAME}@3x.png", "idiom" : "universal", "scale" : "3x" },
37+
{ "appearances": [{ "appearance": "luminosity", "value": "dark" }], "filename": "${IMAGE_NAME}_dark.png", "idiom": "universal", "scale": "1x" },
38+
{ "appearances": [{ "appearance": "luminosity", "value": "dark" }], "filename": "${IMAGE_NAME}_dark@2x.png", "idiom": "universal", "scale": "2x" },
39+
{ "appearances": [{ "appearance": "luminosity", "value": "dark" }], "filename": "${IMAGE_NAME}_dark@3x.png", "idiom": "universal", "scale": "3x" }
9240
],
93-
"info" : {
94-
"author" : "xcode",
95-
"version" : 1
96-
}
41+
"info": { "author": "xcode", "version": 1 }
9742
}
9843
__EOF__
9944
else
100-
cat > ${TARGET}/Contents.json << __EOF__
45+
cat > "${TARGET}/Contents.json" << __EOF__
10146
{
10247
"images" : [
103-
{
104-
"idiom" : "universal",
105-
"scale" : "1x",
106-
"filename" : "${IMAGE_NAME}.png"
107-
},
108-
{
109-
"idiom" : "universal",
110-
"scale" : "2x",
111-
"filename" : "${IMAGE_NAME}@2x.png"
112-
},
113-
{
114-
"idiom" : "universal",
115-
"scale" : "3x",
116-
"filename" : "${IMAGE_NAME}@3x.png"
117-
}
48+
{ "filename" : "${IMAGE_NAME}.png", "idiom" : "universal", "scale" : "1x" },
49+
{ "filename" : "${IMAGE_NAME}@2x.png", "idiom" : "universal", "scale" : "2x" },
50+
{ "filename" : "${IMAGE_NAME}@3x.png", "idiom" : "universal", "scale" : "3x" }
11851
],
119-
"info" : {
120-
"version" : 1,
121-
"author" : "xcode"
122-
}
52+
"info": { "author": "xcode", "version": 1 }
12353
}
12454
__EOF__
12555
fi
12656
}
12757

58+
# Function to copy images with fallback to wallet icons
59+
function copy_images_with_fallback {
60+
SOURCE_DIR=$1
61+
IMAGE_NAME=$2
62+
DEST_DIR=$3
63+
FALLBACK_IMAGE_NAME=$4
64+
65+
mkdir -p "$DEST_DIR"
66+
67+
# Copy regular images with fallback
68+
cp "$SOURCE_DIR/${IMAGE_NAME}.png" "$DEST_DIR/${IMAGE_NAME}.png" 2>/dev/null || cp "$SOURCE_DIR/${FALLBACK_IMAGE_NAME}.png" "$DEST_DIR/${IMAGE_NAME}.png" 2>/dev/null
69+
cp "$SOURCE_DIR/${IMAGE_NAME}@2x.png" "$DEST_DIR/${IMAGE_NAME}@2x.png" 2>/dev/null || cp "$SOURCE_DIR/${FALLBACK_IMAGE_NAME}@2x.png" "$DEST_DIR/${IMAGE_NAME}@2x.png" 2>/dev/null
70+
cp "$SOURCE_DIR/${IMAGE_NAME}@3x.png" "$DEST_DIR/${IMAGE_NAME}@3x.png" 2>/dev/null || cp "$SOURCE_DIR/${FALLBACK_IMAGE_NAME}@3x.png" "$DEST_DIR/${IMAGE_NAME}@3x.png" 2>/dev/null
71+
72+
# Copy dark mode images with fallback
73+
cp "$SOURCE_DIR/${IMAGE_NAME}_dark.png" "$DEST_DIR/${IMAGE_NAME}_dark.png" 2>/dev/null || cp "$SOURCE_DIR/${FALLBACK_IMAGE_NAME}_dark.png" "$DEST_DIR/${IMAGE_NAME}_dark.png" 2>/dev/null
74+
cp "$SOURCE_DIR/${IMAGE_NAME}_dark@2x.png" "$DEST_DIR/${IMAGE_NAME}_dark@2x.png" 2>/dev/null || cp "$SOURCE_DIR/${FALLBACK_IMAGE_NAME}_dark@2x.png" "$DEST_DIR/${IMAGE_NAME}_dark@2x.png" 2>/dev/null
75+
cp "$SOURCE_DIR/${IMAGE_NAME}_dark@3x.png" "$DEST_DIR/${IMAGE_NAME}_dark@3x.png" 2>/dev/null || cp "$SOURCE_DIR/${FALLBACK_IMAGE_NAME}_dark@3x.png" "$DEST_DIR/${IMAGE_NAME}_dark@3x.png" 2>/dev/null
76+
}
77+
12878
# Process each token in TemporaryAssets/General
12979
function process_tokens {
13080
echo "Processing tokens in $TEMP_ASSETS_PATH..."
@@ -143,29 +93,35 @@ function process_tokens {
14393
continue
14494
fi
14595

146-
# Wallet images
147-
TARGET_WALLET_IMAGESET="$WALLETS_ASSETS_PATH/${TOKEN_NAME}_wallet.imageset"
148-
mkdir -p "$TARGET_WALLET_IMAGESET"
149-
echo "Creating wallet imageset: $TARGET_WALLET_IMAGESET"
150-
151-
cp "$IMAGES_DIR/${TOKEN_NAME}_wallet.png" "$TARGET_WALLET_IMAGESET/${TOKEN_NAME}_wallet.png" 2>/dev/null
152-
cp "$IMAGES_DIR/${TOKEN_NAME}_wallet@2x.png" "$TARGET_WALLET_IMAGESET/${TOKEN_NAME}_wallet@2x.png" 2>/dev/null
153-
cp "$IMAGES_DIR/${TOKEN_NAME}_wallet@3x.png" "$TARGET_WALLET_IMAGESET/${TOKEN_NAME}_wallet@3x.png" 2>/dev/null
154-
155-
# Check for dark mode images
156-
WITH_DARK=false
157-
if [ -e "$IMAGES_DIR/${TOKEN_NAME}_wallet_dark.png" ]; then
158-
echo "Dark mode images found for $TOKEN_NAME"
159-
cp "$IMAGES_DIR/${TOKEN_NAME}_wallet_dark.png" "$TARGET_WALLET_IMAGESET/${TOKEN_NAME}_wallet_dark.png"
160-
cp "$IMAGES_DIR/${TOKEN_NAME}_wallet_dark@2x.png" "$TARGET_WALLET_IMAGESET/${TOKEN_NAME}_wallet_dark@2x.png" 2>/dev/null
161-
cp "$IMAGES_DIR/${TOKEN_NAME}_wallet_dark@3x.png" "$TARGET_WALLET_IMAGESET/${TOKEN_NAME}_wallet_dark@3x.png" 2>/dev/null
162-
WITH_DARK=true
163-
fi
96+
# Function to process an image set
97+
function process_image_set {
98+
TYPE=$1
99+
FALLBACK_TYPE=$2
100+
TARGET_PATH="$WALLETS_ASSETS_PATH/${TOKEN_NAME}_${TYPE}.imageset"
101+
IMAGE_BASE_NAME="${TOKEN_NAME}_${TYPE}"
102+
103+
mkdir -p "$TARGET_PATH"
104+
echo "Creating $TYPE imageset: $TARGET_PATH"
105+
106+
# Copy images, using wallet images as fallback
107+
copy_images_with_fallback "$IMAGES_DIR" "$IMAGE_BASE_NAME" "$TARGET_PATH" "${TOKEN_NAME}_${FALLBACK_TYPE}"
108+
109+
# Check for dark mode images
110+
WITH_DARK=false
111+
if [ -e "$TARGET_PATH/${IMAGE_BASE_NAME}_dark.png" ]; then
112+
WITH_DARK=true
113+
fi
114+
115+
# Generate Contents.json
116+
create_contents "$TARGET_PATH" "$IMAGE_BASE_NAME" "$WITH_DARK"
117+
}
164118

165-
# Generate Contents.json for wallet
166-
create_contents "$TARGET_WALLET_IMAGESET" "${TOKEN_NAME}_wallet" "$WITH_DARK"
119+
# Process wallet, wallet_row (fallback to wallet), and notification (fallback to wallet)
120+
process_image_set "wallet" "wallet"
121+
process_image_set "wallet_row" "wallet"
122+
process_image_set "notification" "wallet"
167123

168-
# Copy notification content images
124+
# Copy notification content image (only @3x)
169125
if [ -e "$IMAGES_DIR/${TOKEN_NAME}_wallet@3x.png" ]; then
170126
echo "Copying notification content image for $TOKEN_NAME"
171127
cp "$IMAGES_DIR/${TOKEN_NAME}_wallet@3x.png" "$NOTIFICATION_IMAGES_PATH/${TOKEN_NAME}_notificationContent.png"
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"images" : [
3+
{ "filename" : "adamant_notification.png", "idiom" : "universal", "scale" : "1x" },
4+
{ "filename" : "adamant_notification@2x.png", "idiom" : "universal", "scale" : "2x" },
5+
{ "filename" : "adamant_notification@3x.png", "idiom" : "universal", "scale" : "3x" }
6+
],
7+
"info": { "author": "xcode", "version": 1 }
8+
}
4.26 KB
Loading
9.5 KB
Loading
15.7 KB
Loading
Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,8 @@
11
{
22
"images" : [
3-
{
4-
"idiom" : "universal",
5-
"scale" : "1x",
6-
"filename" : "adamant_wallet.png"
7-
},
8-
{
9-
"idiom" : "universal",
10-
"scale" : "2x",
11-
"filename" : "adamant_wallet@2x.png"
12-
},
13-
{
14-
"idiom" : "universal",
15-
"scale" : "3x",
16-
"filename" : "adamant_wallet@3x.png"
17-
}
3+
{ "filename" : "adamant_wallet.png", "idiom" : "universal", "scale" : "1x" },
4+
{ "filename" : "adamant_wallet@2x.png", "idiom" : "universal", "scale" : "2x" },
5+
{ "filename" : "adamant_wallet@3x.png", "idiom" : "universal", "scale" : "3x" }
186
],
19-
"info" : {
20-
"version" : 1,
21-
"author" : "xcode"
22-
}
7+
"info": { "author": "xcode", "version": 1 }
238
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"images" : [
3+
{ "filename" : "adamant_wallet_row.png", "idiom" : "universal", "scale" : "1x" },
4+
{ "filename" : "adamant_wallet_row@2x.png", "idiom" : "universal", "scale" : "2x" },
5+
{ "filename" : "adamant_wallet_row@3x.png", "idiom" : "universal", "scale" : "3x" }
6+
],
7+
"info": { "author": "xcode", "version": 1 }
8+
}
2.97 KB
Loading

0 commit comments

Comments
 (0)