@@ -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 {
6262struct 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