Fix custom emojis loading

This commit is contained in:
Thomas Ricouard 2024-01-21 10:49:40 +01:00
parent 17387626b8
commit 1be9a7b941
3 changed files with 72 additions and 51 deletions

View file

@ -181,9 +181,9 @@ extension StatusEditor {
.accessibilityLabel("accessibility.editor.button.custom-emojis")
.popover(isPresented: $isCustomEmojisSheetDisplay) {
if UIDevice.current.userInterfaceIdiom == .phone {
customEmojisSheet
CustomEmojisView(viewModel: focusedSEVM)
} else {
customEmojisSheet
CustomEmojisView(viewModel: focusedSEVM)
.frame(width: 400, height: 500)
}
}
@ -270,52 +270,6 @@ extension StatusEditor {
}
}
private var customEmojisSheet: some View {
NavigationStack {
ScrollView {
ForEach(focusedSEVM.customEmojiContainer) { container in
VStack(alignment: .leading) {
Text(container.categoryName)
.font(.scaledFootnote)
LazyVGrid(columns: [GridItem(.adaptive(minimum: 40))], spacing: 9) {
ForEach(container.emojis) { emoji in
LazyImage(url: emoji.url) { state in
if let image = state.image {
image
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 40, height: 40)
.accessibilityLabel(emoji.shortcode.replacingOccurrences(of: "_", with: " "))
.accessibilityAddTraits(.isButton)
} else if state.isLoading {
Rectangle()
.fill(Color.gray)
.frame(width: 40, height: 40)
.accessibility(hidden: true)
}
}
.onTapGesture {
focusedSEVM.insertStatusText(text: " :\(emoji.shortcode): ")
}
}
}
}
.padding(.horizontal)
.padding(.bottom)
}
}
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("action.cancel", action: { isCustomEmojisSheetDisplay = false })
}
}
.scrollContentBackground(.hidden)
.background(theme.primaryBackgroundColor)
.navigationTitle("status.editor.emojis.navigation-title")
.navigationBarTitleDisplayMode(.inline)
}
.presentationDetents([.medium])
}
}
}

View file

@ -0,0 +1,67 @@
import DesignSystem
import Env
import SwiftUI
import Models
import NukeUI
extension StatusEditor {
@MainActor
struct CustomEmojisView: View {
@Environment(\.dismiss) private var dismiss
@Environment(Theme.self) private var theme
var viewModel: ViewModel
var body: some View {
NavigationStack {
ScrollView {
ForEach(viewModel.customEmojiContainer) { container in
LazyVGrid(columns: [GridItem(.adaptive(minimum: 40, maximum: 40))], spacing: 9) {
Section {
ForEach(container.emojis) { emoji in
LazyImage(url: emoji.url) { state in
if let image = state.image {
image
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 40, height: 40)
.accessibilityLabel(emoji.shortcode.replacingOccurrences(of: "_", with: " "))
.accessibilityAddTraits(.isButton)
} else if state.isLoading {
Rectangle()
.fill(Color.gray)
.frame(width: 40, height: 40)
.accessibility(hidden: true)
}
}
.onTapGesture {
viewModel.insertStatusText(text: " :\(emoji.shortcode): ")
}
}
} header: {
HStack {
Text(container.categoryName)
.font(.scaledFootnote)
Spacer()
}
}
}
.padding(.horizontal, 8)
}
}
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button("action.cancel", action: { dismiss() })
}
}
.scrollContentBackground(.hidden)
.background(theme.primaryBackgroundColor)
.navigationTitle("status.editor.emojis.navigation-title")
.navigationBarTitleDisplayMode(.inline)
}
.presentationDetents([.medium, .large])
}
}
}

View file

@ -872,7 +872,7 @@ extension StatusEditor {
customEmojis.reduce([String: [Emoji]]()) { currentDict, emoji in
var dict = currentDict
let category = emoji.category ?? "Uncategorized"
let category = emoji.category ?? "Custom"
if let emojis = dict[category] {
dict[category] = emojis + [emoji]
@ -882,8 +882,8 @@ extension StatusEditor {
return dict
}.sorted(by: { lhs, rhs in
if rhs.key == "Uncategorized" { false }
else if lhs.key == "Uncategorized" { true }
if rhs.key == "Custom" { false }
else if lhs.key == "Custom" { true }
else { lhs.key < rhs.key }
}).forEach { key, value in
emojiContainers.append(.init(categoryName: key, emojis: value))