Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
E
Elixxir dApps SDK Swift
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
mobile
iOS
Elixxir dApps SDK Swift
Merge requests
!68
Messenger example - send auth request
Code
Review changes
Check out branch
Download
Patches
Plain diff
Merged
Messenger example - send auth request
feature/messenger-example-contact-request
into
development
Overview
0
Commits
32
Pipelines
0
Changes
3
Merged
Dariusz Rybicki
requested to merge
feature/messenger-example-contact-request
into
development
2 years ago
Overview
0
Commits
32
Pipelines
0
Changes
3
Expand
Refactor user search
Add contact feature
Save found contacts
Add send request feature
Send auth request
Fix saving my contact during registration
Edited
2 years ago
by
Dariusz Rybicki
0
0
Merge request reports
Viewing commit
4fbe3b68
Prev
Next
Show latest version
3 files
+
157
−
97
Inline
Compare changes
Side-by-side
Inline
Show whitespace changes
Show one file at a time
Files
3
Search (e.g. *.vue) (Ctrl+P)
4fbe3b68
Update ContactFeature
· 4fbe3b68
Dariusz Rybicki
authored
2 years ago
Examples/xx-messenger/Sources/ContactFeature/ContactFeature.swift
0 → 100644
+
152
−
0
Options
import
AppCore
import
ComposableArchitecture
import
ComposablePresentation
import
Foundation
import
SendRequestFeature
import
XCTestDynamicOverlay
import
XXClient
import
XXMessengerClient
import
XXModels
public
struct
ContactState
:
Equatable
{
public
init
(
id
:
Data
,
dbContact
:
XXModels
.
Contact
?
=
nil
,
xxContact
:
XXClient
.
Contact
?
=
nil
,
importUsername
:
Bool
=
true
,
importEmail
:
Bool
=
true
,
importPhone
:
Bool
=
true
,
sendRequest
:
SendRequestState
?
=
nil
)
{
self
.
id
=
id
self
.
dbContact
=
dbContact
self
.
xxContact
=
xxContact
self
.
importUsername
=
importUsername
self
.
importEmail
=
importEmail
self
.
importPhone
=
importPhone
self
.
sendRequest
=
sendRequest
}
public
var
id
:
Data
public
var
dbContact
:
XXModels
.
Contact
?
public
var
xxContact
:
XXClient
.
Contact
?
@BindableState
public
var
importUsername
:
Bool
@BindableState
public
var
importEmail
:
Bool
@BindableState
public
var
importPhone
:
Bool
public
var
sendRequest
:
SendRequestState
?
}
public
enum
ContactAction
:
Equatable
,
BindableAction
{
case
start
case
dbContactFetched
(
XXModels
.
Contact
?)
case
importFactsTapped
case
sendRequestTapped
case
sendRequestDismissed
case
sendRequest
(
SendRequestAction
)
case
binding
(
BindingAction
<
ContactState
>
)
}
public
struct
ContactEnvironment
{
public
init
(
messenger
:
Messenger
,
db
:
DBManagerGetDB
,
mainQueue
:
AnySchedulerOf
<
DispatchQueue
>
,
bgQueue
:
AnySchedulerOf
<
DispatchQueue
>
,
sendRequest
:
@escaping
()
->
SendRequestEnvironment
)
{
self
.
messenger
=
messenger
self
.
db
=
db
self
.
mainQueue
=
mainQueue
self
.
bgQueue
=
bgQueue
self
.
sendRequest
=
sendRequest
}
public
var
messenger
:
Messenger
public
var
db
:
DBManagerGetDB
public
var
mainQueue
:
AnySchedulerOf
<
DispatchQueue
>
public
var
bgQueue
:
AnySchedulerOf
<
DispatchQueue
>
public
var
sendRequest
:
()
->
SendRequestEnvironment
}
#if DEBUG
extension
ContactEnvironment
{
public
static
let
unimplemented
=
ContactEnvironment
(
messenger
:
.
unimplemented
,
db
:
.
unimplemented
,
mainQueue
:
.
unimplemented
,
bgQueue
:
.
unimplemented
,
sendRequest
:
{
.
unimplemented
}
)
}
#endif
public
let
contactReducer
=
Reducer
<
ContactState
,
ContactAction
,
ContactEnvironment
>
{
state
,
action
,
env
in
enum
DBFetchEffectID
{}
switch
action
{
case
.
start
:
return
try!
env
.
db
()
.
fetchContactsPublisher
(
.
init
(
id
:
[
state
.
id
]))
.
assertNoFailure
()
.
map
(\
.
first
)
.
map
(
ContactAction
.
dbContactFetched
)
.
subscribe
(
on
:
env
.
bgQueue
)
.
receive
(
on
:
env
.
mainQueue
)
.
eraseToEffect
()
.
cancellable
(
id
:
DBFetchEffectID
.
self
,
cancelInFlight
:
true
)
case
.
dbContactFetched
(
let
contact
):
state
.
dbContact
=
contact
return
.
none
case
.
importFactsTapped
:
guard
let
xxContact
=
state
.
xxContact
else
{
return
.
none
}
return
.
fireAndForget
{
[
state
]
in
var
dbContact
=
state
.
dbContact
??
XXModels
.
Contact
(
id
:
state
.
id
)
dbContact
.
marshaled
=
xxContact
.
data
if
state
.
importUsername
{
dbContact
.
username
=
try
?
xxContact
.
getFact
(
.
username
)?
.
fact
}
if
state
.
importEmail
{
dbContact
.
email
=
try
?
xxContact
.
getFact
(
.
email
)?
.
fact
}
if
state
.
importPhone
{
dbContact
.
phone
=
try
?
xxContact
.
getFact
(
.
phone
)?
.
fact
}
_
=
try!
env
.
db
()
.
saveContact
(
dbContact
)
}
.
subscribe
(
on
:
env
.
bgQueue
)
.
receive
(
on
:
env
.
mainQueue
)
.
eraseToEffect
()
case
.
sendRequestTapped
:
if
let
xxContact
=
state
.
xxContact
{
state
.
sendRequest
=
SendRequestState
(
contact
:
xxContact
)
}
else
if
let
marshaled
=
state
.
dbContact
?
.
marshaled
{
state
.
sendRequest
=
SendRequestState
(
contact
:
.
live
(
marshaled
))
}
return
.
none
case
.
sendRequestDismissed
:
state
.
sendRequest
=
nil
return
.
none
case
.
sendRequest
(
.
sendSucceeded
):
state
.
sendRequest
=
nil
return
.
none
case
.
sendRequest
(
_
):
return
.
none
case
.
binding
(
_
):
return
.
none
}
}
.
binding
()
.
presenting
(
sendRequestReducer
,
state
:
.
keyPath
(\
.
sendRequest
),
id
:
.
notNil
(),
action
:
/
ContactAction
.
sendRequest
,
environment
:
{
$0
.
sendRequest
()
}
)
Loading