Skip to content

Commit

Permalink
feat: channel search
Browse files Browse the repository at this point in the history
  • Loading branch information
Zomatree committed Aug 29, 2024
1 parent 7b50432 commit ac1abec
Show file tree
Hide file tree
Showing 9 changed files with 122 additions and 7 deletions.
4 changes: 4 additions & 0 deletions Revolt.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
172F2D052C22ED8500948C00 /* CheckboxStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 172F2D042C22ED8100948C00 /* CheckboxStyle.swift */; };
1739DB962B08E53B00D23DAD /* MessageBadge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1739DB952B08E53B00D23DAD /* MessageBadge.swift */; };
173A336A2C422EF800B8A58E /* DeveloperSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 173A33692C422EF800B8A58E /* DeveloperSettings.swift */; };
173D698E2C7FF7FC00030E62 /* ChannelSearch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 173D698D2C7FF7FC00030E62 /* ChannelSearch.swift */; };
173F16272C3C22580009FDF9 /* ServerInfoSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 173F16262C3C22540009FDF9 /* ServerInfoSheet.swift */; };
17429D972B4C91170036105A /* ChannelSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17429D962B4C91170036105A /* ChannelSettings.swift */; };
17429D992B4C931D0036105A /* ChannelOverviewSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 17429D982B4C931D0036105A /* ChannelOverviewSettings.swift */; };
Expand Down Expand Up @@ -196,6 +197,7 @@
17378BD72C76CF51004E4235 /* ci_post_clone.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_post_clone.sh; sourceTree = "<group>"; };
1739DB952B08E53B00D23DAD /* MessageBadge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBadge.swift; sourceTree = "<group>"; };
173A33692C422EF800B8A58E /* DeveloperSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeveloperSettings.swift; sourceTree = "<group>"; };
173D698D2C7FF7FC00030E62 /* ChannelSearch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelSearch.swift; sourceTree = "<group>"; };
173F16262C3C22540009FDF9 /* ServerInfoSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServerInfoSheet.swift; sourceTree = "<group>"; };
17429D962B4C91170036105A /* ChannelSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelSettings.swift; sourceTree = "<group>"; };
17429D982B4C931D0036105A /* ChannelOverviewSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChannelOverviewSettings.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -378,6 +380,7 @@
children = (
1773C03C2C07DD1F007B8867 /* MessageableChannel.swift */,
17D8BACE2B211DEE005F5447 /* ChannelInfo.swift */,
173D698D2C7FF7FC00030E62 /* ChannelSearch.swift */,
);
path = Messagable;
sourceTree = "<group>";
Expand Down Expand Up @@ -889,6 +892,7 @@
170C23D52C224B6D0057E399 /* SettingsCommon.swift in Sources */,
170C23D62C224B6D0057E399 /* UserSettings.swift in Sources */,
178BB11B2B02FCDD001143A4 /* Responses.swift in Sources */,
173D698E2C7FF7FC00030E62 /* ChannelSearch.swift in Sources */,
17A589FA2C44781F00B9D85A /* AnyTransition.swift in Sources */,
17BF54CD2B1785E200178866 /* HomeWelcome.swift in Sources */,
17DF7CB02C4ACDA1003E8FDC /* UIImage.swift in Sources */,
Expand Down
4 changes: 4 additions & 0 deletions Revolt/Api/Http.swift
Original file line number Diff line number Diff line change
Expand Up @@ -355,4 +355,8 @@ struct HTTPClient {
func revokeNotificationToken() async -> Result<EmptyResponse, RevoltError> {
await req(method: .post, route: "/push/unsubscribe")
}

func searchChannel(channel: String, query: String) async -> Result<SearchResponse, RevoltError> {
await req(method: .post, route: "/channels/\(channel)/search", parameters: ChannelSearchPayload(query: query, sort: .latest, include_users: true))
}
}
15 changes: 15 additions & 0 deletions Revolt/Api/Payloads.swift
Original file line number Diff line number Diff line change
Expand Up @@ -135,3 +135,18 @@ struct ServerEdit: Encodable {
struct MessageEdit: Encodable {
var content: String?
}

struct ChannelSearchPayload: Encodable {
enum MessageSort: String, Encodable {
case relevance = "Relevance"
case latest = "Latest"
case oldest = "Oldest"
}

var query: String
var limit: Int?
var before: String?
var after: String?
var sort: MessageSort?
var include_users: Bool?
}
6 changes: 6 additions & 0 deletions Revolt/Api/Responses.swift
Original file line number Diff line number Diff line change
Expand Up @@ -73,3 +73,9 @@ struct MFATicketResponse: Decodable {
var authorised: Bool
var last_totp_code: String?
}

struct SearchResponse: Decodable {
var messages: [Message]
var users: [User]
var members: [Member]
}
4 changes: 1 addition & 3 deletions Revolt/Pages/Channel/Messagable/ChannelInfo.swift
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,7 @@ struct ChannelInfo: View {
}

HStack {
Button {

} label: {
NavigationLink(value: NavigationDestination.channel_search(channel.id)) {
VStack(alignment: .center) {
Image(systemName: "magnifyingglass.circle.fill")
.resizable()
Expand Down
80 changes: 80 additions & 0 deletions Revolt/Pages/Channel/Messagable/ChannelSearch.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
//
// ChannelSearch.swift
// Revolt
//
// Created by Angelo on 29/08/2024.
//

import Foundation
import SwiftUI
import Types

struct ChannelSearch: View {
@EnvironmentObject var viewState: ViewState

@Binding var channel: Channel

@State var searchQuery: String = ""
@State var results: [Types.Message] = []

var body: some View {
let server = channel.server.map { $viewState.servers[$0] } ?? .constant(nil)

List {
ForEach(results) { result in
MessageView(
viewModel: .init(
viewState: viewState,
message: .constant(result),
author: .constant(viewState.users[result.author]!),
member: .constant(channel.server.flatMap({ viewState.members[$0]?[result.author] })),
server: server,
channel: $channel,
replies: .constant([]),
channelScrollPosition: .empty,
editing: .constant(nil)
),
isStatic: true
)
}
.listRowBackground(viewState.theme.background2)
}
.listStyle(.plain)
.scrollContentBackground(.hidden)
.background(viewState.theme.background)
.searchable(text: $searchQuery)
.toolbar {
ToolbarItem(placement: .principal) {
HStack {
Image(systemName: "magnifyingglass")
.resizable()
.frame(width: 24, height: 24)

Text("Search")
}
}
}
.toolbarBackground(viewState.theme.topBar, for: .automatic)
.onChange(of: searchQuery, { _, query in
if query.count >= 1, query.count <= 64 {
Task {
let response = try! await viewState.http.searchChannel(channel: channel.id, query: query).get()

for user in response.users {
if !viewState.users.keys.contains(user.id) {
viewState.users[user.id] = user
}
}

for member in response.members {
if !(viewState.members[member.id.server]?.keys.contains(member.id.user) ?? false) {
viewState.members[member.id.server]![member.id.user] = member
}
}

results = response.messages
}
}
})
}
}
8 changes: 6 additions & 2 deletions Revolt/Pages/Channel/Messagable/MessageableChannel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ import SwiftUI
import Types

struct ChannelScrollController {
var proxy: ScrollViewProxy
var proxy: ScrollViewProxy?
@Binding var highlighted: String?

func scrollTo(message id: String) {
withAnimation(.easeInOut) {
proxy.scrollTo(id)
proxy?.scrollTo(id)
highlighted = id
}

Expand All @@ -27,6 +27,10 @@ struct ChannelScrollController {
}
}
}

static var empty: ChannelScrollController {
.init(proxy: nil, highlighted: .constant(nil))
}
}

@MainActor
Expand Down
7 changes: 5 additions & 2 deletions Revolt/RevoltApp.swift
Original file line number Diff line number Diff line change
Expand Up @@ -152,10 +152,10 @@ struct InnerApp: View {
.navigationDestination(for: NavigationDestination.self) { dest in
switch dest {
case .channel_info(let id):
let channel = Binding($viewState.channels[id])!
let channel = Binding($viewState.channels[id])!
ChannelInfo(channel: channel)
case .channel_settings(let id):
let channel = Binding($viewState.channels[id])!
let channel = Binding($viewState.channels[id])!
ChannelSettings(channel: channel)
case .discover:
Discovery()
Expand All @@ -170,6 +170,9 @@ struct InnerApp: View {
CreateGroup(selectedUsers: Set(initial_users.compactMap { viewState.users[$0] }))
case .create_server:
CreateServer()
case .channel_search(let id):
let channel = Binding($viewState.channels[id])!
ChannelSearch(channel: channel)
}
}
.sheet(item: $viewState.currentUserSheet) { (v) in
Expand Down
1 change: 1 addition & 0 deletions Revolt/ViewState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ enum NavigationDestination: Hashable, Codable {
case add_friend
case create_group([String])
case create_server
case channel_search(String)
}

struct UserMaybeMember: Identifiable {
Expand Down

0 comments on commit ac1abec

Please sign in to comment.