-
Notifications
You must be signed in to change notification settings - Fork 376
/
contacts.go
134 lines (104 loc) · 3.1 KB
/
contacts.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package gui
import (
"context"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/widget"
"go.uber.org/zap"
"berty.tech/berty/v2/go/pkg/messengertypes"
)
// OUTGOING REQUEST LIST
func newOutgoingContactRequestListDisplay(mc *msgrContext) wfr {
list := newDynamicStringKeyedList(container.NewHBox)
list.setSort(func(aKey, bKey string) int {
a, aOk := mc.store.contacts[aKey]
b, bOk := mc.store.contacts[bKey]
if !aOk || !bOk {
return 0
}
return int(b.GetSentDate() - a.GetSentDate())
})
root := container.NewVBox(widget.NewLabel("Outgoing contact requests"), list.container)
root.Hide()
unsub := mc.store.contactListSubscribe(func(contact *messengertypes.Contact) error {
defer func() {
if list.empty() {
root.Hide()
} else {
root.Show()
}
}()
contactPK := contact.GetPublicKey()
state := contact.GetState()
if state != messengertypes.Contact_OutgoingRequestEnqueued &&
state != messengertypes.Contact_OutgoingRequestSent {
return list.remove(contactPK)
}
if err := list.add(contactPK, func() wfr { return newOutgoingContactRequestView(mc, contactPK) }); err != nil {
return err
}
return nil
})
return wfr{root, mergeCleaners(unsub, list.clean), nil}
}
// OUTGOING CONTACT REQUEST CARD
func newOutgoingContactRequestView(_ *msgrContext, contactPK string) wfr {
// FIXME: not state aware
nameLabel := widget.NewLabel(safeShortPK(contactPK))
w := container.NewVBox(
nameLabel,
)
return wfr{w, nil, nil}
}
// INCOMING REQUEST LIST
func newIncomingContactRequestListDisplay(mc *msgrContext) wfr {
list := newDynamicStringKeyedList(container.NewHBox)
list.setSort(func(aKey, bKey string) int {
a, aOk := mc.store.contacts[aKey]
b, bOk := mc.store.contacts[bKey]
if !aOk || !bOk {
return 0
}
return int(b.GetSentDate() - a.GetSentDate())
})
root := container.NewVBox(widget.NewLabel("Incoming contact requests"), list.container)
root.Hide()
unsub := mc.store.contactListSubscribe(func(contact *messengertypes.Contact) error {
defer func() {
if list.empty() {
root.Hide()
} else {
root.Show()
}
}()
contactPK := contact.GetPublicKey()
state := contact.GetState()
if state != messengertypes.Contact_IncomingRequest {
return list.remove(contactPK)
}
if err := list.add(contactPK, func() wfr { return newIncomingContactRequestView(mc, contactPK) }); err != nil {
return err
}
return nil
})
return wfr{root, mergeCleaners(unsub, list.clean), nil}
}
// INCOMING CONTACT REQUEST CARD
func newIncomingContactRequestView(mc *msgrContext, contactPK string) wfr {
// FIXME: not state aware
nameLabel := widget.NewLabel(safeShortPK(contactPK))
acceptButton := widget.NewButton("Accept", func() {
ctx, cancel := context.WithCancel(mc.ctx)
defer cancel()
resp, err := mc.client.ContactAccept(ctx, &messengertypes.ContactAccept_Request{PublicKey: contactPK})
if err != nil {
mc.logger.Error("accepting contact request", zap.Error(err))
} else {
mc.logger.Info("success accepting contact request", zap.Any("reply", resp))
}
})
w := container.NewVBox(
nameLabel,
acceptButton,
)
return wfr{w, nil, nil}
}