Compose autocomplete tweaks

This commit is contained in:
Shadowfacts 2025-03-03 19:15:13 -05:00
parent 1135094c21
commit 319fae6fec
5 changed files with 45 additions and 14 deletions

View File

@ -17,13 +17,15 @@ struct AutocompleteEmojiView: View {
@State private var emojis: [Emoji] = [] @State private var emojis: [Emoji] = []
var body: some View { var body: some View {
HStack(alignment: expanded ? .top : .center, spacing: 0) { HStack(alignment: expanded ? .top : .center, spacing: 8) {
scrollView scrollView
.transition(.opacity)
.animation(.snappy, value: expanded)
ToggleExpandedButton(expanded: $expanded) ToggleExpandedButton(expanded: $expanded)
.padding(.trailing, 8)
.padding(.top, expanded ? 8 : 0) .padding(.top, expanded ? 8 : 0)
} }
.padding(.horizontal, 8)
.task(id: query) { .task(id: query) {
await queryChanged() await queryChanged()
} }
@ -81,7 +83,6 @@ private struct InlineEmojiView: View {
AutocompleteEmojiButton(emoji: emoji) AutocompleteEmojiButton(emoji: emoji)
} }
} }
.padding(.horizontal, 8)
.frame(height: ComposeToolbarView.autocompleteHeight) .frame(height: ComposeToolbarView.autocompleteHeight)
} }
} }
@ -97,7 +98,7 @@ private struct ExpandedEmojiView: View {
ExpandedEmojiSection(section: section, emojis: emojisBySection[section]!) ExpandedEmojiSection(section: section, emojis: emojisBySection[section]!)
} }
} }
.padding(.all, 8) .padding(.vertical, 8)
.task(id: emojis) { .task(id: emojis) {
groupEmojisBySection() groupEmojisBySection()
} }
@ -170,7 +171,7 @@ private struct ToggleExpandedButton: View {
var body: some View { var body: some View {
Button { Button {
withAnimation(nil) { withAnimation(.snappy) {
expanded.toggle() expanded.toggle()
} }
} label: { } label: {

View File

@ -19,9 +19,14 @@ struct AutocompleteHashtagView: View {
var body: some View { var body: some View {
ScrollView(.horizontal) { ScrollView(.horizontal) {
HStack(spacing: 8) { HStack(spacing: 8) {
if hashtags.isEmpty && loading { if hashtags.isEmpty {
ProgressView() if loading {
.progressViewStyle(.circular) ProgressView()
.progressViewStyle(.circular)
} else if query.isEmpty {
Text("Type to search")
.font(.callout.italic())
}
} }
ForEach(hashtags, id: \.name) { hashtag in ForEach(hashtags, id: \.name) { hashtag in

View File

@ -24,9 +24,12 @@ struct AutocompleteMentionView: View {
if loading { if loading {
ProgressView() ProgressView()
.progressViewStyle(.circular) .progressViewStyle(.circular)
} else if query.isEmpty {
Text("Type to search")
.font(.callout.italic())
} else { } else {
Text("No accounts found") Text("No accounts found")
.font(.caption.italic()) .font(.callout.italic())
} }
} }

View File

@ -12,18 +12,40 @@ struct AutocompleteView: View {
@FocusedInputAutocompleteState private var state @FocusedInputAutocompleteState private var state
var body: some View { var body: some View {
contentView
.composeToolbarBackground()
.transition(.move(edge: .bottom))
.animation(.snappy, value: AutocompleteMode(state: state))
}
@ViewBuilder
var contentView: some View {
switch state { switch state {
case nil: case nil:
Color.clear EmptyView()
case .hashtag(let s): case .hashtag(let s):
AutocompleteHashtagView(query: s, mastodonController: mastodonController) AutocompleteHashtagView(query: s, mastodonController: mastodonController)
.composeToolbarBackground()
case .mention(let s): case .mention(let s):
AutocompleteMentionView(query: s, mastodonController: mastodonController) AutocompleteMentionView(query: s, mastodonController: mastodonController)
.composeToolbarBackground()
case .emoji(let s): case .emoji(let s):
AutocompleteEmojiView(query: s, mastodonController: mastodonController) AutocompleteEmojiView(query: s, mastodonController: mastodonController)
.composeToolbarBackground() }
}
}
private enum AutocompleteMode {
case none, hashtag, mention, emoji
init(state: AutocompleteState?) {
switch state {
case .mention(_):
self = .mention
case .emoji(_):
self = .emoji
case .hashtag(_):
self = .hashtag
case nil:
self = .none
} }
} }
} }

View File

@ -39,7 +39,7 @@ private struct ToolbarContentView: View {
#else #else
ToolbarScrollView { ToolbarScrollView {
buttons buttons
.padding(.horizontal, 16) .padding(.horizontal, 8)
} }
.frame(height: ComposeToolbarView.toolbarHeight) .frame(height: ComposeToolbarView.toolbarHeight)
.composeToolbarBackground() .composeToolbarBackground()