Compose autocomplete tweaks
This commit is contained in:
parent
1135094c21
commit
319fae6fec
@ -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: {
|
||||||
|
@ -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
|
||||||
|
@ -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())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user