/
multimember.go
111 lines (92 loc) · 2.78 KB
/
multimember.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package gui
import (
"strings"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
qrcode "github.com/skip2/go-qrcode"
"go.uber.org/multierr"
mt "berty.tech/berty/v2/go/pkg/messengertypes"
)
// MULTIMEMBER INFO
func newMultiMemberInfo(mc *msgrContext, convPK string) wfr {
qrContainer := container.NewVBox()
qrContainer.Hide()
qrToggle := widget.NewButton("Show group QR", func() {})
qrToggle.OnTapped = func() {
if qrContainer.Hidden {
qrContainer.Show()
qrToggle.SetText("Hide group QR")
} else {
qrContainer.Hide()
qrToggle.SetText("Show group QR")
}
}
qrToggle.Refresh()
unsubConv := mc.store.conversationSubscribe(convPK, func(conv *mt.Conversation) error {
link := conv.GetLink()
if len(link) != 0 {
qr, err := qrcode.New(link, qrcode.Medium)
if err != nil {
return err
}
img := canvas.NewImageFromImage(qr.Image(256))
img.FillMode = canvas.ImageFillOriginal
img.Refresh()
qrContainer.Objects = []fyne.CanvasObject{img}
qrContainer.Refresh()
}
return nil
})
memberList := newDynamicStringKeyedList(container.NewVBox)
memberList.setSort(func(aKey, bKey string) int {
members, ok := mc.store.members[convPK]
if !ok {
return 0
}
a, aOk := members[aKey]
b, bOk := members[bKey]
if !(aOk && bOk) {
return 0
}
return strings.Compare(b.GetDisplayName(), a.GetDisplayName())
})
unsubMembers := mc.store.memberListSubscribe(convPK, func(member *mt.Member) error {
pk := member.GetPublicKey()
return memberList.add(pk, func() wfr { return newMemberThumbnail(mc, convPK, pk) })
})
memberListContainer := container.NewBorder(widget.NewLabel("Members:"), nil, nil, nil, container.NewVScroll(memberList.container))
linkDisplayWFR := newMultiMemberLinkDisplay(mc, convPK)
if linkDisplayWFR.err != nil {
err := mergeCleaners(unsubConv, unsubMembers)()
if err != nil {
err = multierr.Combine(linkDisplayWFR.err, err)
} else {
err = linkDisplayWFR.err
}
return wfr{nil, nil, err}
}
w := container.NewBorder(container.NewVBox(qrToggle, qrContainer, linkDisplayWFR.object), nil, nil, nil, memberListContainer)
return wfr{w, mergeCleaners(unsubConv, unsubMembers, linkDisplayWFR.clean), nil}
}
// MEMBER
func newMemberThumbnail(mc *msgrContext, convPK, memberPK string) wfr {
nameLabel := widget.NewLabel(safeShortPK(memberPK))
unsub := mc.store.memberSubscribe(convPK, memberPK, func(member *mt.Member) error {
name := member.GetDisplayName()
if len(name) != 0 && name != nameLabel.Text {
text := name + "\n" + safeShortPK(memberPK)
if member.GetIsCreator() {
text += "\n" + "Creator"
}
if member.GetIsMe() {
text += "\n" + "You"
}
nameLabel.SetText(text)
}
return nil
})
w := container.NewVBox(nameLabel)
return wfr{w, unsub, nil}
}