Skip to content

Commit 9b5edf6

Browse files
committed
feat: add dropdown menu to user user sheet
1 parent dcb099a commit 9b5edf6

1 file changed

Lines changed: 100 additions & 69 deletions

File tree

Revolt/Components/Sheets/UserSheet.swift

Lines changed: 100 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ struct UserSheetHeader: View {
3838
}
3939

4040
HStack(alignment: .center, spacing: 16) {
41-
Avatar(user: user, width: 48, height: 48, withPresence: true)
41+
Avatar(user: user, width: 48, height: 48, withPresence: true, canFullscreen: true)
4242

4343
VStack(alignment: .leading) {
4444
if let display_name = user.display_name {
@@ -62,13 +62,14 @@ struct UserSheetHeader: View {
6262
struct UserSheet: View {
6363
@EnvironmentObject var viewState: ViewState
6464

65-
var user: User
66-
var member: Member?
65+
@State var user: User
66+
@State var member: Member?
6767

6868
@State var profile: Profile?
6969
@State var owner: User = .init(id: String(repeating: "0", count: 26), username: "Unknown", discriminator: "0000")
7070
@State var mutualServers: [String] = []
7171
@State var mutualFriends: [String] = []
72+
@State var showReportSheet = false
7273

7374
func getRoleColour(role: Role) -> AnyShapeStyle {
7475
if let colour = role.colour {
@@ -81,7 +82,6 @@ struct UserSheet: View {
8182
var body: some View {
8283
VStack(alignment: .leading, spacing: 8) {
8384
if let profile = profile {
84-
8585
Grid(tracks: 2, flow: .rows, spacing: 12) {
8686
UserSheetHeader(user: user, member: member, profile: profile)
8787
.gridSpan(column: 2)
@@ -215,78 +215,106 @@ struct UserSheet: View {
215215
.gridSpan(column: 2)
216216
}
217217

218-
Group {
219-
switch user.relationship ?? .None {
220-
case .User:
221-
Button {
222-
viewState.path.append(NavigationDestination.settings)
223-
} label: {
224-
HStack {
225-
Spacer()
226-
227-
Text("Edit profile")
228-
229-
Spacer()
230-
}
231-
}
232-
.padding(8)
233-
.background(viewState.theme.accent, in: RoundedRectangle(cornerRadius: 50))
234-
235-
case .Blocked:
236-
EmptyView() // TODO: unblock
237-
case .BlockedOther:
238-
EmptyView()
239-
case .Friend:
240-
Button {
241-
Task {
242-
await viewState.openDm(with: user.id)
243-
}
244-
} label: {
245-
HStack {
246-
Spacer()
247-
248-
Text("Send Message")
249-
250-
Spacer()
218+
HStack {
219+
Group {
220+
switch user.relationship ?? .None {
221+
case .User:
222+
Button {
223+
viewState.path.append(NavigationDestination.settings)
224+
} label: {
225+
HStack {
226+
Spacer()
227+
228+
Text("Edit profile")
229+
230+
Spacer()
231+
}
251232
}
252-
}
253-
.padding(8)
254-
.background(viewState.theme.accent, in: RoundedRectangle(cornerRadius: 50))
255-
256-
case .Incoming, .None:
257-
Button {
258-
Task {
259-
await viewState.http.sendFriendRequest(username: user.username)
233+
.padding(8)
234+
.background(viewState.theme.accent, in: RoundedRectangle(cornerRadius: 50))
235+
236+
case .Blocked:
237+
EmptyView() // TODO: unblock
238+
case .BlockedOther:
239+
EmptyView()
240+
case .Friend:
241+
Button {
242+
Task {
243+
await viewState.openDm(with: user.id)
244+
}
245+
} label: {
246+
HStack {
247+
Spacer()
248+
249+
Text("Send Message")
250+
251+
Spacer()
252+
}
260253
}
261-
} label: {
262-
HStack {
263-
Spacer()
264-
265-
Text("Add Friend")
266-
267-
Spacer()
254+
.padding(8)
255+
.background(viewState.theme.accent, in: RoundedRectangle(cornerRadius: 50))
256+
257+
case .Incoming, .None:
258+
Button {
259+
Task {
260+
await viewState.http.sendFriendRequest(username: user.username)
261+
}
262+
} label: {
263+
HStack {
264+
Spacer()
265+
266+
Text("Add Friend")
267+
268+
Spacer()
269+
}
268270
}
269-
}
270-
.padding(8)
271-
.background(viewState.theme.accent, in: RoundedRectangle(cornerRadius: 50))
272-
273-
case .Outgoing:
274-
Button {
275-
Task {
276-
await viewState.http.removeFriend(user: user.id)
271+
.padding(8)
272+
.background(viewState.theme.accent, in: RoundedRectangle(cornerRadius: 50))
273+
274+
case .Outgoing:
275+
Button {
276+
Task {
277+
await viewState.http.removeFriend(user: user.id)
278+
}
279+
} label: {
280+
HStack {
281+
Spacer()
282+
283+
Text("Cancel Friend Request")
284+
285+
Spacer()
286+
}
277287
}
278-
} label: {
279-
HStack {
280-
Spacer()
281-
282-
Text("Cancel Friend Request")
283-
284-
Spacer()
288+
.padding(8)
289+
.background(viewState.theme.accent, in: RoundedRectangle(cornerRadius: 50))
290+
}
291+
}
292+
293+
Menu {
294+
Button("Block") {
295+
Task {
296+
if case .success(let blockedUser) = await viewState.http.blockUser(user: user.id) {
297+
user = blockedUser
285298
}
286299
}
287-
.padding(8)
288-
.background(viewState.theme.accent, in: RoundedRectangle(cornerRadius: 50))
300+
}
301+
302+
Button("Copy ID") {
303+
copyText(text: user.id)
304+
}
305+
306+
Button("Report", role: .destructive) {
307+
showReportSheet = true
308+
}
309+
} label: {
310+
Image(systemName: "ellipsis.circle")
311+
.resizable()
312+
.scaledToFit()
313+
.frame(width: 24, height: 24)
314+
.fontWeight(.light)
289315
}
316+
.menuStyle(.borderlessButton)
317+
.padding(.horizontal, 12)
290318
}
291319
.gridSpan(column: 2)
292320
}
@@ -302,6 +330,9 @@ struct UserSheet: View {
302330
.padding(.top, 16)
303331
.background(viewState.theme.background.color)
304332
.presentationBackground(viewState.theme.background)
333+
.sheet(isPresented: $showReportSheet) {
334+
Text("TODO")
335+
}
305336
.task {
306337
if let profile = user.profile {
307338
self.profile = profile

0 commit comments

Comments
 (0)