Compare commits

..
Author SHA1 Message Date
Vitaliy Vlasov cdbfc1ed1f overlay fix 2023-02-10 13:00:12 +02:00
Vitaliy Vlasov 63ead3d588 gomobile_src_override 2023-02-09 10:56:39 +02:00
Vitaliy Vlasov 5d2b0c026e use static lib 2023-01-23 16:21:29 +02:00
Vitaliy Vlasov 1083547561 Add tag to status-go builds
https://github.com/status-im/status-go/compare/7662cd61...5aad6fa0
2023-01-20 11:56:15 +02:00
Vitaliy Vlasov bf7d71d716 liblcproxy->libverifproxy 2023-01-09 17:58:35 +02:00
Vitaliy Vlasov 922c4d6128 Integrate status-go with nimbus-light-client
https://github.com/status-im/status-go/compare/7662cd61...756511d9
2022-12-23 20:20:46 +02:00
Vitaliy Vlasov 9ff1e054c9 Remove commented lines 2022-12-16 21:00:43 +02:00
Vitaliy Vlasov 6c79f158b3 Fix ios builds for x86 2022-12-16 20:41:47 +02:00
Vitaliy Vlasov ff0d042e60 Fix ios build for arm64 2022-12-16 16:42:09 +02:00
Vitaliy Vlasov 178d65795b Remove unneeded include flags, add --debuginfo:off to nim compiler
invocation
2022-12-14 20:13:40 +02:00
Vitaliy Vlasov 8e1e0a77c9 Use compiler flags directly instead of config.nims changes 2022-12-09 13:37:57 +02:00
Vitaliy Vlasov 7659c43372 Simplify build, fix clang fork issue 2022-12-08 21:47:32 +02:00
Vitaliy Vlasov 92b2f50630 Compilation fixes 2022-11-30 21:29:54 +02:00
Vitaliy Vlasov f84f0312af Fix libbacktrace build with seds, make -e 2022-11-28 12:49:19 +02:00
Vitaliy Vlasov 6a8035967f Separate Nim compiler derivation, miniupnpc fixes for Android 2022-11-22 13:17:00 +02:00
Vitaliy Vlasov 56a5570c20 Nix changes (initial) 2022-11-18 17:45:39 +02:00
Parvesh Monu f408035f5e Improve shell animations (#14341) 2022-11-15 16:45:43 +05:30
Parvesh Monu 1228f4aa26 Add accessibility to components (#14359)
- chat name text component
- quoted message text component
2022-11-15 16:41:56 +05:30
Christoph Pader 2f4d8accae feat: implement selectors with blurred background 2022-11-15 10:44:17 +01:00
andrey b8bfb2df80 new structure fixes 2022-11-15 10:33:32 +01:00
andrey 4654402feb new structure fixes 2022-11-15 06:56:33 +01:00
Parvesh Monu e8c44632ab fix community channel back button (#14358) 2022-11-15 03:29:03 +05:30
flexsurfer c7d5e90882 introduce new project structure (first step) (#14356)
* introduce new project structure
2022-11-14 19:16:55 +01:00
Roman Volosovskyi 4353c4a40c [#14245] Fix read/unread notifications filter 2022-11-14 13:40:20 +01:00
Icaro Motta a77f662948 Document new guidelines (#14309) 2022-11-14 07:15:49 -03:00
Omar Basem 57526a45ad Bottom sheet missing actions (#14332)
* feat: bottom sheets
2022-11-11 17:02:39 +04:00
Omar Basem 8fc853373b Rename :main-icons2 to :i (#14335)
* chore: rename icons
2022-11-11 15:45:54 +04:00
Andrea Maria Piana 5e814b7a03 Add display name 2022-11-10 20:00:49 +00:00
Omar Basem 61fd5fd791 Chat user dp (#14314)
* feat: chat-user-dp
2022-11-10 18:26:57 +04:00
Andrea Maria Piana 466dfe56d7 Fix emoji reactions 2022-11-10 13:48:12 +00:00
Andrea Maria Piana 8aee25509e Restore bottom sheet for chats 2022-11-10 13:46:27 +00:00
213 changed files with 5621 additions and 3249 deletions
+20 -12
View File
@@ -10,11 +10,11 @@ Join us in creating a browser, messenger, and gateway to a decentralized world.
## Why?
We believe in a medium of pure free trade, economies with fair, permission-less access and a world without intermediaries. We want to create policies that can exist between friends or scale globally, we want to communicate securely and be uninhibited by legacy systems.
We believe in a medium of pure free trade, economies with fair, permission-less access and a world without intermediaries. We want to create policies that can exist between friends or scale globally, we want to communicate securely and be uninhibited by legacy systems.
We want to take responsibility for our data, the way we conduct ourselves privately and promote this way of life to a mass audience.
We want deep insights into our own economies so we can make informed, data-driven decisions on how to make our lives better. The Ethereum blockchain, Smart Contracts, Swarm and Whisper provides us a path forward.
We want deep insights into our own economies so we can make informed, data-driven decisions on how to make our lives better. The Ethereum blockchain, Smart Contracts, Swarm and Whisper provides us a path forward.
If this interests you, **help us make Status a reality** - anyone can contribute and we need everyone at any skill level to participate.
@@ -22,29 +22,37 @@ If this interests you, **help us make Status a reality** - anyone can contribute
Go straight to the [docs](https://status.im/docs) or [join our chat](https://join.status.im/chat/public/status) and choose what interests you:
- **Developer**
Developers are the heart of software and to keep Status beating we need all the help we can get! If you're looking to code in ClojureScript or Golang then Status is the project for you! We use React Native and there is even some Java/Objective-C too!
Want to learn more about it? Start by reading our [Developer Introduction](https://status.im/developer_tools/) which guides you through the technology stack and start browsing [beginner issues](https://github.com/status-im/status-mobile/issues?utf8=%E2%9C%93&q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20). Then you can read how to [Build Status](https://status.im/technical/build_status/), which talks about managing project dependencies, coding guidelines and testing procedures.
- **Developer** Developers are the heart of software and to keep Status beating
we need all the help we can get! If you're looking to code in ClojureScript or
Golang then Status is the project for you! We use React Native and there is even
some Java/Objective-C too! Want to learn more about it? Start by reading our
[Developer Introduction](https://status.im/developer_tools/) which guides you
through the technology stack and start browsing [beginner
issues](https://github.com/status-im/status-mobile/issues?utf8=%E2%9C%93&q=is%3Aopen%20is%3Aissue%20label%3A%22good%20first%20issue%22%20).
Then you can read how to [Build
Status](https://status.im/technical/build_status/), which talks about managing
project dependencies, coding guidelines and testing procedures. The [doc/](doc/)
directory also has valuable information for contributors.
- **Community Management**
- **Community Management**
Metcalfe's law states that the value of a network is proportional to the square of the number of connected users of the system - without community Status is meaningless. We're looking to create a positive, fun environment to explore new ideas, experiment and grow the Status community. Building a community takes a lot of work but the people you'll meet and long lasting relationships you form will be well worth it, check out our [Mission and Community Principles](https://status.im/about)
- **Specification / Documentation**
- **Specification / Documentation**
John Dewey once said "Education is not preparation for life; education is life *itself* ". Developers & Designers need guidance and it all starts from documentation and specifications. Our software is only as good as its documentation, head over to our [docs](https://status.im/docs) and see how you can improve what we have.
- **Blog Writing**
- **Blog Writing**
Content is King, keeping our blog up to date and informing the community of news helps keep everyone on the same page. [Jump into our chat](https://join.status.im/chat/public/status) and discuss with the team how you can contribute!
- **Testers**
- **Testers**
It's bug hunting season! Status is currently under active development and there is sure to be a bunch of learning, [build status from scratch](https://status.im/technical/build_status/) or if an android user check out our [nightly builds](https://status.im/nightly). You can shake your phone to submit bug reports, or start browsing our [Github Issues](https://github.com/status-im/status-mobile/issues). Every bug you find brings Status closer to stable, usable software for everyone to enjoy!
- **Security**
- **Security**
Status is a visual interface to make permanent changes on the Blockchain, it handles crypto-tokens that have real value and allows 3rd party code execution. Security is paramount to its success. You are given permission to break Status as hard as you can, as long as you share your findings with the community!
- **Evangelism**
- **Evangelism**
Help us spread the word! Tell a friend *right now*, in fact tell **everyone** - yell from a mountain if you have to, every person counts! If you've got a great story to tell or have some interesting way you've spread the word about Status let us know about it in our [chat](https://join.status.im/chat/public/status)
## Status API
## Status API
View our [API Docs](https://status.im/developer_tools/status_web_api.html) and learn how to integrate your DApp into Status. You can read more about how to add your DApp to Status [here](https://status.im/developer_tools/add_your_dapp.html).
## Give me Binaries!
+5 -1
View File
@@ -1,5 +1,9 @@
# Codebase Structure and Guidelines
As of Nov/2022, we're starting to document and migrate the codebase to [new
guidelines](new-guidelines.md), which will supersede some of the guidelines in
this document.
## Starting the app
The app is bundled and run in a Nix environment. Information regarding how to run it locally can be found [here](https://status.im/technical/build_status/).
@@ -85,7 +89,7 @@ These guidelines make db.cljs namespaces the place to go when making changes to
- If issues - label 'TESTED-ISSUES' and comment from QA with bugs.
- After fix and/or discussion the process is repeated.
- If manual QA is not needed but all tests don't pass, you can ping @churik or @Serhy to confirm that failed E2E tests are not unrelated.
- If manual QA is not needed but all tests don't pass, you can ping @churik or @Serhy to confirm that failed E2E tests are not unrelated.
## Enabling debug logs
Calls to `log/debug` will not be printed to the console by default. It can be enabled under "Advanced settings" in the app:
+440
View File
@@ -0,0 +1,440 @@
# Guidelines
>The goal of this document is to help all contributors (core and external) to
>write code in _unison_ and help establish good practices that serve the Status
>Mobile contributors well.
We don't want to turn this document into an exhaustive list of rules to be
followed that nobody will read. As much as possible, we'll try to document only
what we consider important for Status Mobile. In other words, we don't want to
maintain a general Clojure convention/style guide, nor do we want to turn this
document into a long tutorial.
This is a **work in progress**, and not all conventions are properly implemented
in the codebase yet. The project structure is also going over major changes (as
of Nov/2022), and it'll take a considerable amount of time until we migrate the
existing code to the new structure.
If you find out anything is outdated or missing, please, share with us or even
better, create a pull-request! 🤸
## Style guide
We mostly follow the [Clojure Style
Guide](https://github.com/bbatsov/clojure-style-guide), so it's recommended to
get familiar with it.
As of Nov/2022, running `make lint` should fix the most basic formatting issues,
and we are in the process of integrating a tool to format non-trivial code
according to the Clojure Style Guide. This should greatly reduce noise in
pull-request reviews and it'll simplify the life of all contributors.
Pay special attention to:
- Align let bindings https://github.com/bbatsov/clojure-style-guide#bindings-alignment
- Align map keys https://github.com/bbatsov/clojure-style-guide#map-keys-alignment
## Dos and don'ts
### Component styles
Prefer to define styles in separate files named `style.cljs`, usually colocated
with the source file using it. For a real example, see
[src/status_im/ui2/screens/chat/messages/style.cljs](../src/status_im/ui2/screens/chat/messages/style.cljs).
```clojure
;; bad
(defn animated-checkbox-view [{:keys [size]}]
[animated/view
{:style {:width size
:height size
:border-radius 4
:justify-content :center
:align-items :center}}
[animated/view
(do-something)]])
;; good
(defn animated-checkbox-view [{:keys [size]}]
[animated/view
{:style (style/animated-checkbox-style size)}
[animated/view
(do-something)]])
```
### Using TODOs comments
_TODO_ comments are used extensively in the codebase, but prefer to use them
only when strictly necessary and when an issue is not enough to track the work
left to be done.
These are all good examples:
```clojure
;; TODO(@username): <message>
;; TODO(@username): <message>, <issue URL>
;; TODO(YYYY-MM-DD): <message>
;; TODO(@username,YYYY-MM-DD): <message>
```
### Subscription names and event names
Always register events and subscriptions using a meaningful namespace, but don't
namespace them with `::`. We understand it's a controversial decision because
there are both pros and cons to such practice.
Whenever appropriate, it's also recommended to use _fake_ namespaces to convey
more knowledge in the keyword about which bounded context (domain) it refers to.
You may also use dots to convey hierarchical structures.
```clojure
;; bad
;; Don't use real namespaced keywords.
(re-frame/reg-sub
::profile-pictures-visibility
:<- [:multiaccount]
(fn [multiaccount]
(:profile-pictures-visibility multiaccount)))
;; good
;; Uses a fake namespaced keyword.
(re-frame/reg-sub
:profile/pictures-visibility
:<- [:multiaccount]
(fn [multiaccount]
(:profile-pictures-visibility multiaccount)))
;; better
;; Uses a fake namespaced keyword with a parent namespace (multiaccount).
(re-frame/reg-sub
:multiaccount.profile/pictures-visibility
:<- [:multiaccount]
(fn [multiaccount]
(:profile-pictures-visibility multiaccount)))
```
### Declaring view components
Use the simple `defn` to declare components. Don't use `utils.views/defview` and
`utils.views/letsubs`.
```clojure
;; bad
(utils.views/defview browser []
(utils.views/letsubs [window-width [:dimensions/window-width]]
(do-something window-width)))
;; good
(defn browser []
(let [window-width (rf/sub [:dimensions/window-width])]
(do-something window-width)))
```
### Using re-frame subscriptions and dispatching events
Use the `utils.re-frame` namespace instead of `re-frame.core` to subscribe and
dispatch.
```clojure
;; bad
(ns my-namespace
(:require [re-frame.core :as rf]))
(let [username @(rf/subscribe [:username])]
[pressable/pressable {:on-press #(rf/dispatch [:do-something])}
[rn/view
(str "Hello " username)]])
;; good
(ns my-namespace
(:require [utils.re-frame :as rf]))
(let [username (rf/sub [:username])]
[pressable/pressable {:on-press #(rf/dispatch [:do-something])}
[rn/view
(str "Hello " username)]])
```
### Registering event handlers
Events must always be declared with the `utils.fx/defn` macro. Also, don't use
`re-frame.core/reg-event-db`.
```clojure
;; bad
(re-frame/reg-event-fx
:wakuv2.ui/save-all-confirmed
(fn [{:keys [db] :as cofx}]
...))
;; good
(fx/defn save-all
{:events [:wakuv2.ui/save-all-confirmed]}
[{:keys [db] :as cofx}]
...)
```
### Registering top-level re-frame subscriptions
Use `subs.root/reg-root-key-sub` to register top-level (root) subscriptions.
Additionally, register root subscriptions in the `subs.root` namespace.
```clojure
;; bad
(re-frame/reg-sub
:view-id
(fn [db]
(:view-id db)))
;; good
(reg-root-key-sub :view-id :view-id)
```
### Registering layer-3 subscriptions
The majority of the subscriptions should be defined as [layer-3
subscriptions](https://day8.github.io/re-frame/subscriptions/#the-four-layer)
due to performance constraints.
```clojure
;; bad
(re-frame/reg-sub
:ens/preferred-name
(fn [db]
(get-in db [:multiaccount :preferred-name])))
;; good
(re-frame/reg-sub
:ens/preferred-name
:<- [:multiaccount]
(fn [multiaccount]
(:preferred-name multiaccount)))
```
### Requiring quo2 components
Consume `quo2` components from `quo2.core`, unless the namespace is also inside
the `quo2/` directory.
```clojure
;; bad
(ns my-namespace
(:require [quo2.components.icon :as icon]))
(icon/icon :i/verified)
;; good
(ns my-namespace
(:require [quo2.core :as quo2]))
(quo2/icon :i/verified)
;; also good because both namespaces are inside quo2/
(ns quo2.components.tabs.account-selector
(:require [quo2.components.markdown.text :as text]))
```
### Require/import
Prefer `:as` instead of `:refer`. There are exceptions to this rule, e.g. the
test macros `deftest` and `is`, which are ubiquitous in the Clojure community.
```clojure
;; bad
(ns status-im.utils.datetime
(:require [cljs-time.coerce :refer [from-long]]))
;; good
(ns status-im.utils.datetime
(:require [cljs-time.coerce :as time.coerce]))
```
### Accessibility labels
Use keywords instead of strings. As a bonus, remember keywords are cached in
memory.
```clojure
;; bad
[text/text {:accessibility-label "profile-nickname"}
"Markov"]
;; good
[text/text {:accessibility-label :profile-nickname}
"Markov"]
```
### Icons
Use the appropriate keyword qualification/namespace and don't directly require
namespaces inside `quo2/components/`.
```clojure
;; bad
(require '[quo2.components.icon :as icons])
(icons/icon :main-icons2/verified)
;; good
(require '[quo2.core :as quo2])
(quo2/icon :i/verified)
```
### Translations
Prefer to use translation placeholders instead of creating multiple translation
keywords and concatenating them into a single string.
```clojure
;; bad
;; Assume the translation key is:
;; "biometric-auth-error": "Unable perform biometric authentication"
(str (i18n/label :t/biometric-auth-error) "(" error-code ")")
;; good
;; Assume the translation key is:
;; "biometric-auth-error": "Unable perform biometric authentication ({{code}})"
(i18n/label :t/biometric-auth-error {:code error-code})
```
## Project Structure
First, the bird's-eye view with some example ClojureScript files:
```
src
├── js/
├── mocks/
├── quo2
│ ├── components/
│ ├── foundations/
│ └── theme.cljs
├── react_native
│ ├── gesture.cljs
│ └── platform.cljs
├── status_im
│ ├── common
│ │ └── components
│ │ └── bottom_sheet.cljs
│ ├── contexts/
│ ├── setup/
│ └── subs/
└── utils.cljs
```
- `src/js`: Raw Javascript files, e.g. React Native Reanimated worklets.
- `src/mocks`: Plumbing configuration to be able to run tests.
- `src/quo2/`: The component library for Status Mobile.
- `src/react_native/`: Contains only low-level constructs to help React Native
work in tandem with Clojure(Script).
- `src/status_im/common/`: Directories named `common` can appear at any level of
the directory tree. Just like directories named `utils`, their directory
nesting level communicates their applicable limits.
- `src/status_im/common/components/`: Contains reusable components that are not
part of the design system (quo2).
- `src/status_im/contexts/`: Contains [bounded contexts](#glossary), like
`browser/`, `messaging/`, etc. As much as possible, _bounded contexts_ should
not directly require each other's namespaces.
- `src/status_im/setup/`: Contains namespaces that are mostly used to initialize
the application, configure test runners, etc. In general, such namespaces
should not be required from the outside.
- `src/status_im/subs/`: All subscriptions should live inside it.
Directories named `utils/` can appear at any level of the directory tree. The
directory nesting level precisely indicates its boundaries. For example, a
`contexts/user_settings/utils/datetime.cljs` file communicates that it should
only be used in the `user_settings` context.
### src/quo2
The `src/quo2/` directory holds all components for the new design system. As
much as possible, its sub-directories and component names should reflect the
same language used by designers.
Even though the directory lives alongside the rest of the codebase, we should
think of it as an external entity that abstracts away particular Status domain
knowledge.
Components inside `src/quo2/` should not rely on re-frame, i.e. they should not
dispatch events or use subscriptions.
Example structure:
```
src
└── quo2
├── components
│ └── dropdown
│ ├── style.cljs
│ ├── test.cljs
│ └── view.cljs
└── screens
└── dropdown
└── view.cljs
```
### Re-frame events
Event handlers should be defined in files named `events.cljs`, and they should
be _close_ to other _things_, like view files, components, etc.
For example:
```
src
└── contexts
└── browser
├── bookmarks/
├── options/
├── permissions/
├── events.cljs
├── events_test.cljs
├── style.cljs
└── view.cljs
```
### Test structure
[Unit tests](#glossary) should be created alongside their respective source
implementation. We prefer them colocated with the source and not like most
Clojure (JVM) codebases which mirror the sources in a top-level test directory.
Component tests should be created in a separate directory `__tests__`. Example:
```
├── models
│ ├── message.cljs
│ └── message_test.cljs
├── __tests__
│ └── input_bla_test.cljs
├── models.cljs
└── models_test.cljs
```
There's no hard rule on how integration test namespaces should be split, but
we're at least striving to define them under appropriate bounded contexts that
mirror the source code.
```
test
├── appium/
└── integration
├── browser/
├── communities/
├── messaging/
├── user_settings/
└── wallet
└── payment_test.cljs
```
## Glossary
**Unit test**: The smallest atomic unit that's meaningful to test. For example,
tests for utility functions and event handlers are considered unit tests in the
mobile codebase. They should be completely deterministic, _fast_, and they
should work flawlessly in the REPL.
**Bounded context**: A logical separation between different domains. It's an
important concept in the [Domain-Driven
Design](https://en.wikipedia.org/wiki/Domain-driven_design) literature. See
[Bounded Context, by Martin
Fowler](https://martinfowler.com/bliki/BoundedContext.html) for an introduction
to the topic.
+178 -178
View File
@@ -4,14 +4,14 @@ PODS:
- React
- CryptoSwift (1.5.1)
- DoubleConversion (1.1.6)
- FBLazyVector (0.63.4)
- FBReactNativeSpec (0.63.4):
- FBLazyVector (0.63.5)
- FBReactNativeSpec (0.63.5):
- Folly (= 2020.01.13.00)
- RCTRequired (= 0.63.4)
- RCTTypeSafety (= 0.63.4)
- React-Core (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- RCTRequired (= 0.63.5)
- RCTTypeSafety (= 0.63.5)
- React-Core (= 0.63.5)
- React-jsi (= 0.63.5)
- ReactCommon/turbomodule/core (= 0.63.5)
- Folly (2020.01.13.00):
- boost-for-react-native
- DoubleConversion
@@ -40,172 +40,172 @@ PODS:
- RNPermissions
- Permission-Microphone (2.1.5):
- RNPermissions
- RCTRequired (0.63.4)
- RCTTypeSafety (0.63.4):
- FBLazyVector (= 0.63.4)
- RCTRequired (0.63.5)
- RCTTypeSafety (0.63.5):
- FBLazyVector (= 0.63.5)
- Folly (= 2020.01.13.00)
- RCTRequired (= 0.63.4)
- React-Core (= 0.63.4)
- React (0.63.4):
- React-Core (= 0.63.4)
- React-Core/DevSupport (= 0.63.4)
- React-Core/RCTWebSocket (= 0.63.4)
- React-RCTActionSheet (= 0.63.4)
- React-RCTAnimation (= 0.63.4)
- React-RCTBlob (= 0.63.4)
- React-RCTImage (= 0.63.4)
- React-RCTLinking (= 0.63.4)
- React-RCTNetwork (= 0.63.4)
- React-RCTSettings (= 0.63.4)
- React-RCTText (= 0.63.4)
- React-RCTVibration (= 0.63.4)
- React-callinvoker (0.63.4)
- React-Core (0.63.4):
- RCTRequired (= 0.63.5)
- React-Core (= 0.63.5)
- React (0.63.5):
- React-Core (= 0.63.5)
- React-Core/DevSupport (= 0.63.5)
- React-Core/RCTWebSocket (= 0.63.5)
- React-RCTActionSheet (= 0.63.5)
- React-RCTAnimation (= 0.63.5)
- React-RCTBlob (= 0.63.5)
- React-RCTImage (= 0.63.5)
- React-RCTLinking (= 0.63.5)
- React-RCTNetwork (= 0.63.5)
- React-RCTSettings (= 0.63.5)
- React-RCTText (= 0.63.5)
- React-RCTVibration (= 0.63.5)
- React-callinvoker (0.63.5)
- React-Core (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default (= 0.63.4)
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-Core/Default (= 0.63.5)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/CoreModulesHeaders (0.63.4):
- React-Core/CoreModulesHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/Default (0.63.4):
- React-Core/Default (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/DevSupport (0.63.4):
- React-Core/DevSupport (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default (= 0.63.4)
- React-Core/RCTWebSocket (= 0.63.4)
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-jsinspector (= 0.63.4)
- React-Core/Default (= 0.63.5)
- React-Core/RCTWebSocket (= 0.63.5)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- React-jsinspector (= 0.63.5)
- Yoga
- React-Core/RCTActionSheetHeaders (0.63.4):
- React-Core/RCTActionSheetHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/RCTAnimationHeaders (0.63.4):
- React-Core/RCTAnimationHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/RCTBlobHeaders (0.63.4):
- React-Core/RCTBlobHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/RCTImageHeaders (0.63.4):
- React-Core/RCTImageHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/RCTLinkingHeaders (0.63.4):
- React-Core/RCTLinkingHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/RCTNetworkHeaders (0.63.4):
- React-Core/RCTNetworkHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/RCTSettingsHeaders (0.63.4):
- React-Core/RCTSettingsHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/RCTTextHeaders (0.63.4):
- React-Core/RCTTextHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/RCTVibrationHeaders (0.63.4):
- React-Core/RCTVibrationHeaders (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-Core/RCTWebSocket (0.63.4):
- React-Core/RCTWebSocket (0.63.5):
- Folly (= 2020.01.13.00)
- glog
- React-Core/Default (= 0.63.4)
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsiexecutor (= 0.63.4)
- React-Core/Default (= 0.63.5)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsiexecutor (= 0.63.5)
- Yoga
- React-CoreModules (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- React-CoreModules (0.63.5):
- FBReactNativeSpec (= 0.63.5)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/CoreModulesHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- React-RCTImage (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-cxxreact (0.63.4):
- RCTTypeSafety (= 0.63.5)
- React-Core/CoreModulesHeaders (= 0.63.5)
- React-jsi (= 0.63.5)
- React-RCTImage (= 0.63.5)
- ReactCommon/turbomodule/core (= 0.63.5)
- React-cxxreact (0.63.5):
- boost-for-react-native (= 1.63.0)
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-callinvoker (= 0.63.4)
- React-jsinspector (= 0.63.4)
- React-jsi (0.63.4):
- React-callinvoker (= 0.63.5)
- React-jsinspector (= 0.63.5)
- React-jsi (0.63.5):
- boost-for-react-native (= 1.63.0)
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-jsi/Default (= 0.63.4)
- React-jsi/Default (0.63.4):
- React-jsi/Default (= 0.63.5)
- React-jsi/Default (0.63.5):
- boost-for-react-native (= 1.63.0)
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-jsiexecutor (0.63.4):
- React-jsiexecutor (0.63.5):
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-jsinspector (0.63.4)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- React-jsinspector (0.63.5)
- react-native-background-timer (2.2.0):
- React
- react-native-blob-util (0.13.18):
@@ -243,66 +243,66 @@ PODS:
- React
- react-native-webview (11.16.0):
- React-Core
- React-RCTActionSheet (0.63.4):
- React-Core/RCTActionSheetHeaders (= 0.63.4)
- React-RCTAnimation (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- React-RCTActionSheet (0.63.5):
- React-Core/RCTActionSheetHeaders (= 0.63.5)
- React-RCTAnimation (0.63.5):
- FBReactNativeSpec (= 0.63.5)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/RCTAnimationHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTBlob (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- RCTTypeSafety (= 0.63.5)
- React-Core/RCTAnimationHeaders (= 0.63.5)
- React-jsi (= 0.63.5)
- ReactCommon/turbomodule/core (= 0.63.5)
- React-RCTBlob (0.63.5):
- FBReactNativeSpec (= 0.63.5)
- Folly (= 2020.01.13.00)
- React-Core/RCTBlobHeaders (= 0.63.4)
- React-Core/RCTWebSocket (= 0.63.4)
- React-jsi (= 0.63.4)
- React-RCTNetwork (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTImage (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- React-Core/RCTBlobHeaders (= 0.63.5)
- React-Core/RCTWebSocket (= 0.63.5)
- React-jsi (= 0.63.5)
- React-RCTNetwork (= 0.63.5)
- ReactCommon/turbomodule/core (= 0.63.5)
- React-RCTImage (0.63.5):
- FBReactNativeSpec (= 0.63.5)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/RCTImageHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- React-RCTNetwork (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTLinking (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- React-Core/RCTLinkingHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTNetwork (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- RCTTypeSafety (= 0.63.5)
- React-Core/RCTImageHeaders (= 0.63.5)
- React-jsi (= 0.63.5)
- React-RCTNetwork (= 0.63.5)
- ReactCommon/turbomodule/core (= 0.63.5)
- React-RCTLinking (0.63.5):
- FBReactNativeSpec (= 0.63.5)
- React-Core/RCTLinkingHeaders (= 0.63.5)
- React-jsi (= 0.63.5)
- ReactCommon/turbomodule/core (= 0.63.5)
- React-RCTNetwork (0.63.5):
- FBReactNativeSpec (= 0.63.5)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/RCTNetworkHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTSettings (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- RCTTypeSafety (= 0.63.5)
- React-Core/RCTNetworkHeaders (= 0.63.5)
- React-jsi (= 0.63.5)
- ReactCommon/turbomodule/core (= 0.63.5)
- React-RCTSettings (0.63.5):
- FBReactNativeSpec (= 0.63.5)
- Folly (= 2020.01.13.00)
- RCTTypeSafety (= 0.63.4)
- React-Core/RCTSettingsHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- React-RCTText (0.63.4):
- React-Core/RCTTextHeaders (= 0.63.4)
- React-RCTVibration (0.63.4):
- FBReactNativeSpec (= 0.63.4)
- RCTTypeSafety (= 0.63.5)
- React-Core/RCTSettingsHeaders (= 0.63.5)
- React-jsi (= 0.63.5)
- ReactCommon/turbomodule/core (= 0.63.5)
- React-RCTText (0.63.5):
- React-Core/RCTTextHeaders (= 0.63.5)
- React-RCTVibration (0.63.5):
- FBReactNativeSpec (= 0.63.5)
- Folly (= 2020.01.13.00)
- React-Core/RCTVibrationHeaders (= 0.63.4)
- React-jsi (= 0.63.4)
- ReactCommon/turbomodule/core (= 0.63.4)
- ReactCommon/turbomodule/core (0.63.4):
- React-Core/RCTVibrationHeaders (= 0.63.5)
- React-jsi (= 0.63.5)
- ReactCommon/turbomodule/core (= 0.63.5)
- ReactCommon/turbomodule/core (0.63.5):
- DoubleConversion
- Folly (= 2020.01.13.00)
- glog
- React-callinvoker (= 0.63.4)
- React-Core (= 0.63.4)
- React-cxxreact (= 0.63.4)
- React-jsi (= 0.63.4)
- React-callinvoker (= 0.63.5)
- React-Core (= 0.63.5)
- React-cxxreact (= 0.63.5)
- React-jsi (= 0.63.5)
- ReactNativeAudioToolkit (2.0.3):
- React
- ReactNativeNavigation (7.27.1):
@@ -637,8 +637,8 @@ SPEC CHECKSUMS:
BVLinearGradient: e3aad03778a456d77928f594a649e96995f1c872
CryptoSwift: c4f2debceb38bf44c80659afe009f71e23e4a082
DoubleConversion: cde416483dac037923206447da6e1454df403714
FBLazyVector: 3bb422f41b18121b71783a905c10e58606f7dc3e
FBReactNativeSpec: f2c97f2529dd79c083355182cc158c9f98f4bd6e
FBLazyVector: 352a8ca9bbc8e2f097d680747a8c97ecef12d469
FBReactNativeSpec: 7dfb84f624136a45727c813ed21d130cd3e61beb
Folly: b73c3869541e86821df3c387eb0af5f65addfab4
glog: 997518ea2aa2d8cd5df9797b641b758d52ecf2bc
HMSegmentedControl: 34c1f54d822d8308e7b24f5d901ec674dfa31352
@@ -646,16 +646,16 @@ SPEC CHECKSUMS:
libwebp: 60305b2e989864154bd9be3d772730f08fc6a59c
Permission-Camera: afad27bf90337684d4a86f3825112d648c8c4d3b
Permission-Microphone: 0ffabc3fe1c75cfb260525ee3f529383c9f4368c
RCTRequired: 082f10cd3f905d6c124597fd1c14f6f2655ff65e
RCTTypeSafety: 8c9c544ecbf20337d069e4ae7fd9a377aadf504b
React: b0a957a2c44da4113b0c4c9853d8387f8e64e615
React-callinvoker: c3f44dd3cb195b6aa46621fff95ded79d59043fe
React-Core: d3b2a1ac9a2c13c3bcde712d9281fc1c8a5b315b
React-CoreModules: 0581ff36cb797da0943d424f69e7098e43e9be60
React-cxxreact: c1480d4fda5720086c90df537ee7d285d4c57ac3
React-jsi: a0418934cf48f25b485631deb27c64dc40fb4c31
React-jsiexecutor: 93bd528844ad21dc07aab1c67cb10abae6df6949
React-jsinspector: 58aef7155bc9a9683f5b60b35eccea8722a4f53a
RCTRequired: 5520387431beaa5f32aa8726bf746cd5353119fe
RCTTypeSafety: bc90d6e287fa427c50ed770922bac30faf0bbfa3
React: 83a7f231f462b09260a53c5c51005e7659c66890
React-callinvoker: 1c3fdb5562c792212e149637b8a167516bb4b58e
React-Core: 8baca8644a516e772c77e3923697cfe2b58c1606
React-CoreModules: 200c931e17b332024c2e9d878f67b87c00c2c83b
React-cxxreact: 9096ebaeebf6a1475a14448fa8bfc380c13d7882
React-jsi: 7d908b17758178b076a05a254523f1a4227b53d2
React-jsiexecutor: e06a32e42affb2bd89e4c8369349b5fcf787710c
React-jsinspector: fdbc08866b34ae8e1b788ea1cbd9f9d1ca2aa3d6
react-native-background-timer: 1f7d560647b40e6a60b01c452ba29c54bf581fc4
react-native-blob-util: 600972b1782380a5a7d5db61a3817ea32349dae9
react-native-blur: 4568dd93d1d82748c180df8beb2d929c97b13b47
@@ -673,16 +673,16 @@ SPEC CHECKSUMS:
react-native-status: 21f75d492fd311dc111303da38a7a2b23a8a8466
react-native-status-keycard: f60ca57d789aad6875c64ece81ab06ef0609e0d3
react-native-webview: 28a8636d97ee641f2ee8f20492d7a6c269c1d703
React-RCTActionSheet: 89a0ca9f4a06c1f93c26067af074ccdce0f40336
React-RCTAnimation: 1bde3ecc0c104c55df246eda516e0deb03c4e49b
React-RCTBlob: a97d378b527740cc667e03ebfa183a75231ab0f0
React-RCTImage: c1b1f2d3f43a4a528c8946d6092384b5c880d2f0
React-RCTLinking: 35ae4ab9dc0410d1fcbdce4d7623194a27214fb2
React-RCTNetwork: 29ec2696f8d8cfff7331fac83d3e893c95ef43ae
React-RCTSettings: 60f0691bba2074ef394f95d4c2265ec284e0a46a
React-RCTText: 5c51df3f08cb9dedc6e790161195d12bac06101c
React-RCTVibration: ae4f914cfe8de7d4de95ae1ea6cc8f6315d73d9d
ReactCommon: 73d79c7039f473b76db6ff7c6b159c478acbbb3b
React-RCTActionSheet: e911b99f0d6fa7711ffc2f62d236b12a32771835
React-RCTAnimation: ad8b853170a059faf31d6add34f67d22391bbe01
React-RCTBlob: 134c7270b6672c9c05383b2e0f7f044ba39d7dda
React-RCTImage: c5c74ba8850a193d73aef8efb8fcbb4f9cad7653
React-RCTLinking: 12468e952704555c8cb4e3de94c7b5a266811326
React-RCTNetwork: e9cfaeb9f3657ae91f895e798734141db6e1af5b
React-RCTSettings: 9a09419bd5e8494f6e146e2c9f5c8e2c6e90ed58
React-RCTText: 393f059d7ec02c733da57240694201e734f0dc84
React-RCTVibration: 3e83f53610d63d3c1fc4db303305e934e73047cc
ReactCommon: b9ff54b6dd22ba4a776eda22d7f83ec27544ca35
ReactNativeAudioToolkit: de9610f323e855ac6574be8c99621f3d57c5df06
ReactNativeNavigation: 94979dd1572a3f093fc85d4599360530a1bed8c8
RNCAsyncStorage: b2489b49e38c85e10ed45a888d13a2a4c7b32ea1
@@ -708,7 +708,7 @@ SPEC CHECKSUMS:
SSZipArchive: fe6a26b2a54d5a0890f2567b5cc6de5caa600aef
TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863
TouchID: ba4c656d849cceabc2e4eef722dea5e55959ecf4
Yoga: 4bd86afe9883422a7c4028c00e34790f560923d6
Yoga: 0276e9f20976c8568e107cfc1163a8629051adc0
PODFILE CHECKSUM: a1de9468266e7f0b5273acea713782ab759690f1
+1
View File
@@ -14,6 +14,7 @@
status-go = {
src-override = null;
gomobile-src-override = null;
ipfs-gateway-url = "https://ipfs.status.im/";
};
};
+47 -11
View File
@@ -9,17 +9,47 @@ self: super:
let
inherit (super) stdenv stdenvNoCC callPackage;
in {
# Fix for MacOS
mkShell = super.mkShell.override { stdenv = stdenvNoCC; };
# Various utilities
utils = callPackage ./tools/utils.nix { };
lib = (super.lib or { }) // (import ./lib {
inherit (super) lib;
inherit (self) config;
});
gomobileSrcOverride = "/Users/vvlasov/c/mobile";
# Warning message about using local sources
localSrcWarn = (path: "Using local gomobile sources from ${path}");
localGomobileSrc = rec {
owner = "status-im";
repo = "mobile";
rev = "unknown";
shortRev = rev;
rawVersion = "develop";
cleanVersion = rawVersion;
goPackagePath = "github.com/${owner}/${repo}";
# We use builtins.path so that we can name the resulting derivation,
# Normally the name would not be deterministic, taken from the checkout directory.
src = builtins.path rec {
path = lib.traceValFn localSrcWarn gomobileSrcOverride;
name = "${repo}-source-${shortRev}";
# Keep this filter as restrictive as possible in order
# to avoid unnecessary rebuilds and limit closure size
filter = lib.mkFilter {
root = path;
include = [ ".*" ];
exclude = [
".*/[.]git.*" ".*[.]md" ".*[.]yml" ".*/.*_test.go$"
"VERSION" "_assets/.*" "build/.*"
".*/.*LICENSE.*" ".*/CONTRIB.*" ".*/AUTHOR.*"
];
};
};
};
in {
inherit lib;
# Fix for MacOS
mkShell = super.mkShell.override { stdenv = stdenvNoCC; };
# Various utilities
utils = callPackage ./tools/utils.nix { };
# Project dependencies
deps = {
clojure = callPackage ./deps/clojure { };
@@ -45,11 +75,17 @@ in {
buildGoPackage = super.buildGo118Package;
buildGoModule = super.buildGo118Module;
gomobile = (super.gomobile.overrideAttrs (old: {
patches = self.fetchurl { # https://github.com/golang/mobile/pull/84
url = "https://github.com/golang/mobile/commit/f20e966e05b8f7e06bed500fa0da81cf6ebca307.patch";
sha256 = "sha256-TZ/Yhe8gMRQUZFAs9G5/cf2b9QGtTHRSObBFD5Pbh7Y=";
};
})).override {
src = "/Users/vvlasov/c/mobile";
vendorSha256 = "sha256-TZ/Yhe8gMRQUZFAs9G5/cf2b9QGtTHRSObBFD5Pbh7Y=";
# patches = self.fetchurl { # https://github.com/golang/mobile/pull/84
# url = "https://github.com/golang/mobile/commit/f20e966e05b8f7e06bed500fa0da81cf6ebca307.patch";
# sha256 = "sha256-TZ/Yhe8gMRQUZFAs9G5/cf2b9QGtTHRSObBFD5Pbh7Y=";
# };
})).override rec {
buildGoModule = args: super.buildGoModule ( args // {
src = "/Users/vvlasov/c/mobile";
vendorSha256 = "sha256-C6GD3NMolRIve1siG8wpcQav7ZWTugjce8K22EQDD7M=";
});
# FIXME: No Android SDK packages for aarch64-darwin.
withAndroidPkgs = stdenv.system != "aarch64-darwin";
androidPkgs = self.androidEnvCustom.compose;
+3
View File
@@ -46,6 +46,9 @@ config=''
if [[ -n "${STATUS_GO_SRC_OVERRIDE}" ]]; then
config+="status-im.status-go.src-override=\"${STATUS_GO_SRC_OVERRIDE}\";"
fi
if [[ -n "${GOMOBILE_SRC_OVERRIDE}" ]]; then
config+="status-im.status-go.gomobile-src-override=\"${GOMOBILE_SRC_OVERRIDE}\";"
fi
config+="status-im.build-type=\"${BUILD_TYPE}\";"
if [[ -n "$config" ]]; then
+43 -1
View File
@@ -12,6 +12,7 @@ let
# Source can be changed with a local override from config
source = callPackage ./source.nix { };
nimbusSource = callPackage ./nimbus_source.nix { };
# Params to be set at build time, important for About section and metrics
goBuildParams = {
@@ -31,14 +32,55 @@ let
"-w" # -w disables DWARF debugging information
];
in rec {
inherit nimbusSource;
mobile = callPackage ./mobile {
inherit meta source goBuildLdFlags;
inherit meta source nimbusSource nimCompiler goBuildLdFlags;
};
library = callPackage ./library {
inherit meta source;
};
nimCompiler = callPackage ./mobile/buildNim.nix {
srcRaw = nimbusSource;
};
liblcproxy-android-arm = callPackage ./mobile/buildNimbus.nix {
srcRaw = nimbusSource;
nimCompiler = nimCompiler;
platform = "android";
arch = "arm";
};
liblcproxy-android-arm64 = callPackage ./mobile/buildNimbus.nix {
srcRaw = nimbusSource;
nimCompiler = nimCompiler;
platform = "android";
arch = "arm64";
};
liblcproxy-android-x86 = callPackage ./mobile/buildNimbus.nix {
srcRaw = nimbusSource;
nimCompiler = nimCompiler;
platform = "android";
arch = "x86";
};
liblcproxy-ios-x86 = callPackage ./mobile/buildNimbus.nix {
srcRaw = nimbusSource;
nimCompiler = nimCompiler;
platform = "ios";
arch = "x86";
};
liblcproxy-ios-arm64 = callPackage ./mobile/buildNimbus.nix {
srcRaw = nimbusSource;
nimCompiler = nimCompiler;
platform = "ios";
arch = "arm64";
};
shell = mkShell {
inputsFrom = [ mobile.android mobile.ios ];
};
+12 -4
View File
@@ -2,6 +2,7 @@
, androidPkgs, openjdk, gomobile, xcodeWrapper, removeReferencesTo
, meta
, source
, buildNimbusLc
, platform ? "android"
, platformVersion ? "23"
, targets ? [ "android/arm64" "android/arm" ]
@@ -13,7 +14,14 @@ let
inherit (lib) concatStringsSep optionalString optional;
isIOS = platform == "ios";
isAndroid = platform == "android";
lc = buildNimbusLc {inherit platform targets;};
cgoCflags = "-I" + (builtins.elemAt lc 0);
lcDirs = (builtins.concatStringsSep " " (builtins.map (s: "-L" + s) lc));
goBuildLdFlagsModified =
goBuildLdFlags ++ [("-extldflags \"-lverifproxy " + lcDirs + "\"")];
ldflags = concatStringsSep " " goBuildLdFlagsModified;
in buildGoPackage {
pname = source.repo;
version = "${source.cleanVersion}-${source.shortRev}-${platform}";
@@ -30,8 +38,6 @@ in buildGoPackage {
++ optional isAndroid openjdk
++ optional isIOS xcodeWrapper;
ldflags = concatStringsSep " " goBuildLdFlags;
ANDROID_HOME = optionalString isAndroid androidPkgs.sdk;
# Ensure XCode is present for iOS, instead of failing at the end of the build.
@@ -40,11 +46,13 @@ in buildGoPackage {
buildPhase = ''
runHook preBuild
echo -e "\nBuilding $pname for: ${concatStringsSep "," targets}"
echo -e "\n LC dirs: ${lcDirs}"
echo -e "\n ldflags: ${ldflags}"
set -x
export CGO_CFLAGS=\"${cgoCflags}\"
gomobile bind \
${concatStringsSep " " goBuildFlags} \
-ldflags="$ldflags" \
-ldflags ''\'${ldflags}''\' \
-target=${concatStringsSep "," targets} \
${optionalString isAndroid "-androidapi=${platformVersion}" } \
${optionalString isIOS "-iosversion=${platformVersion}" } \
+67
View File
@@ -0,0 +1,67 @@
{ pkgs, stdenv, lib, fetchFromGitHub
# Dependencies
, xcodeWrapper
, srcRaw
, writeScript
, writeTextFile
, androidPkgs
, git
, platform ? "android"
, arch ? "386"
, api ? "29" }:
let
osId = builtins.elemAt (builtins.split "\-" stdenv.hostPlatform.system) 2;
osArch = builtins.elemAt (builtins.split "\-" stdenv.hostPlatform.system) 0;
nimHostOs = if osId == "darwin" then "Darwin"
else if osId == "linux" then "Linux"
else "Windows_NT";
createNimbleLink = writeTextFile {
name = "createNimbleLink.sh";
text = ''
mkdir -p vendor/.nimble/pkgs
curdir=`pwd`
for dir in vendor/*/;
do
baseDirName=`basename ''${dir}`
dirName=vendor/.nimble/pkgs/$baseDirName-\#head
echo $dirName
mkdir -p $dirName
packageDir="''${curdir}/vendor/''${baseDirName}"
if [ -d "''${packageDir}/src" ]; then
packageDir="''${packageDir}/src"
fi
echo "''${packageDir}" > ''${dirName}/''${baseDirName}.nimble-link
echo "''${packageDir}" >> ''${dirName}/''${baseDirName}.nimble-link
done
'';
executable = true;
};
in stdenv.mkDerivation rec {
pname = "nimCompiler";
name = "nimCompiler";
src = srcRaw.src;
#version = lib.strings.substring 0 7 src.rev;
buildInputs = with pkgs; [ wget git clang which tcl curl];
phases = [ "unpackPhase" "buildPhase" "installPhase" ];
buildPhase = ''
${createNimbleLink}
export HOME=$PWD
unset SSL_CERT_FILE
make V=3 CC=clang build-nim
'';
installPhase = ''
mkdir -p $out
cp -r vendor/nimbus-build-system/vendor/Nim/* $out/
'';
}
+231
View File
@@ -0,0 +1,231 @@
{ pkgs, stdenv, lib, fetchFromGitHub
# Dependencies
, xcodeWrapper
, srcRaw
, writeScript
, writeTextFile
, androidPkgs
, git
, nimCompiler
, platform ? "android"
, arch ? "386"
, api ? "29" }:
let
osId = builtins.elemAt (builtins.split "\-" stdenv.hostPlatform.system) 2;
osArch = builtins.elemAt (builtins.split "\-" stdenv.hostPlatform.system) 0;
# Arg arch -> Nim arch
nimCpuMap = {
"x86" = "i386";
"x86-64" = "amd64";
"arm" = "arm";
"arm64" = "arm64";
};
iosArchMap = {
"x86" = "x86_64";
"x86-64" = "x86_64";
"arm" = "armv7";
"arm64" = "arm64";
};
nimCpu = if platform == "ios" && arch == "x86"
then "amd64" else "${lib.getAttr arch nimCpuMap}";
nimPlatform = "${(if platform == "ios" then "ios" else "android")}";
iosSdk = if arch == "x86" then "iphonesimulator" else "iphoneos";
iosArch = lib.getAttr arch iosArchMap;
isAndroid = lib.hasPrefix "android" platform;
isIOS = platform == "ios";
buildType = lib.getConfig "build-type" "";
routeHeader = builtins.readFile ./route.h;
PROJECT_ROOT = srcRaw.src;
iosIncludes = stdenv.mkDerivation {
name = "nim-status-ios-includes";
buildInputs = [ pkgs.coreutils ];
builder = writeScript "nim-ios-includes.sh"
''
export PATH=${pkgs.coreutils}/bin
mkdir $out
cd $out
mkdir net
echo "${routeHeader}" > net/route.h
'';
};
ANDROID_NDK_HOME = "${androidPkgs.sdk}/ndk-bundle";
androidToolchain = "${ANDROID_NDK_HOME}/toolchains/llvm/prebuilt/${osId}-${osArch}";
androidTargetArchMap = {
"x86" = "i686-linux-android";
"x86-64" = "x86_64-linux-android";
"arm" = "armv7a-linux-androideabi";
"arm64" = "aarch64-linux-android";
};
androidTargetArch = lib.getAttr arch androidTargetArchMap;
iosVersion = "9.0";
sysroot = if isAndroid then "${androidToolchain}/sysroot" else "$(xcrun --sdk ${iosSdk} --show-sdk-path)";
compilerFlags = if isAndroid then
"--sysroot ${sysroot} -fPIC -target ${androidTargetArch}${api}"
else if isIOS then
# TODO The conditional for -miphoneos-version-min=8.0 is required,
# otherwise Nim will complain that thread-local storage is not supported for the current target
# when expanding 'NIM_THREADVAR' macro
"-isysroot ${sysroot} -fembed-bitcode -target ${iosArch}-apple-ios${iosVersion} ${if arch == "arm" then "" else "-miphoneos-version-min=${iosVersion}"} -I${iosIncludes}"
else throw "Unsupported platform!";
linkerFlags = if isAndroid then
"--sysroot ${sysroot} -target ${androidTargetArch}${api}"
else if isIOS then
"--sysroot ${sysroot} -fembed-bitcode -target ${iosArch}-apple-ios${iosVersion} ${if arch == "arm" then "" else "-miphoneos-version-min=${iosVersion}"} -v"
else throw "Unsupported platform!";
ldDirMap = {
"x86" = "i686";
"x86-64" = "x86_64";
"arm" = "armeabi-v7a";
"arm64" = "arm64-v8a";
};
cmakeArgs = if isAndroid then
"-DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=${api} -DCMAKE_ANDROID_ARCH_ABI=${lib.getAttr arch ldDirMap} -DCMAKE_ANDROID_NDK=${ANDROID_NDK_HOME}"
else if isIOS then "-DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_SYSROOT=\"$(CMAKE_SYSROOT)\" -DCMAKE_OSX_ARCHITECTURES=${iosArch} -DCMAKE_OSX_DEPLOYMENT_TARGET=9.3 -DCMAKE_XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH=NO -DCMAKE_IOS_INSTALL_COMBINED=YES"
else throw "Unsupported platform!";
#clangPath = if isAndroid then "${androidToolchain}/bin" else "";
#clangName = if isAndroid then "${androidTargetArch}${api}-clang" else "";
compilerVars = if isAndroid then
''
export PATH=${androidToolchain}/bin:$PATH
export CC=clang
export CXX=clang++
export AR=${androidToolchain}/bin/llvm-ar
export NM=${androidToolchain}/bin/llvm-nm
export RANLIB=${androidToolchain}/bin/llvm-ranlib
export LD=${androidToolchain}/bin/ld
export AS=$CC
export CFLAGS="${compilerFlags}"
export LDFLAGS="${linkerFlags}"
mkdir bin
touch bin/git
chmod +x bin/git
export PATH=./bin:$PATH
''
else if isIOS then
''
export PATH=${xcodeWrapper}/bin:$PATH
export CC=clang #$(xcrun --sdk ${iosSdk} --find clang)
export CXX=clang++ #$(xcrun --sdk ${iosSdk} --find clang++)
export LD=clang
export CFLAGS="${compilerFlags}"
export LDFLAGS="${linkerFlags}"
mkdir bin
touch bin/git
chmod +x bin/git
export PATH=./bin:$PATH
export CMAKE_SYSROOT=${sysroot}
''
else throw "Unsupported platform!";
src = srcRaw;
nimHostOs = if osId == "darwin" then "Darwin"
else if osId == "linux" then "Linux"
else "Windows_NT";
createNimbleLink = writeTextFile {
name = "createNimbleLink.sh";
text = ''
mkdir -p vendor/.nimble/pkgs
curdir=`pwd`
for dir in vendor/*/;
do
baseDirName=`basename ''${dir}`
dirName=vendor/.nimble/pkgs/$baseDirName-\#head
echo $dirName
mkdir -p $dirName
packageDir="''${curdir}/vendor/''${baseDirName}"
if [ -d "''${packageDir}/src" ]; then
packageDir="''${packageDir}/src"
fi
echo "''${packageDir}" > ''${dirName}/''${baseDirName}.nimble-link
echo "''${packageDir}" >> ''${dirName}/''${baseDirName}.nimble-link
done
'';
executable = true;
};
in stdenv.mkDerivation rec {
pname = "libverifproxy";
name = "libverifproxy";
src = srcRaw.src;
#version = lib.strings.substring 0 7 src.rev;
buildInputs = with pkgs; [ wget git which tcl cmake libtool binutils];
phases = [ "unpackPhase" "preBuildPhase" "buildPhase" "installPhase" ];
preBuildPhase = ''
sed -E -i 's|^(LIBBACKTRACE_SED := true.*)|\1\nCMAKE_ARGS := ${cmakeArgs}|g' vendor/nim-libbacktrace/Makefile
sed -E -i 's|^(.*)(useNews\* = )(.*)|\1\2 false|g' vendor/nim-json-rpc/json_rpc/clients/config.nim
sed -E -i 's|(.*XOPEN_SOURCE.*)|#\1|g' vendor/nim-nat-traversal/vendor/miniupnp/miniupnpc/Makefile
export HOME=$PWD
${createNimbleLink}
${compilerVars}
export PATH=${nimCompiler}/bin:$PATH
#export PATH=${pkgs.binutils}/bin:$PATH
ln -sf ${pkgs.binutils}/bin/ar bin/ar
'';
buildPhase = ''
which ar
make V=3 OS=${nimHostOs} \
CC=clang CXX=clang USE_SYSTEM_NIM=1 \
NIMFLAGS="\
--passC:\"${compilerFlags}\" \
--passL:\"${linkerFlags}\" \
--debuginfo:off \
--cc:clang \
--listcmd \
--cpu:${nimCpu} \
--os:${nimPlatform} \
-d:disableMarchNative" \
libverifproxy
echo "### ls build/libverifproxy"
ls -l build/libverifproxy/*
'';
installPhase = ''
set -x
mkdir -p $out
cp libverifproxy* $out/
cp build/libverifproxy/verifproxy.h $out/
cp build/libverifproxy/nimbase.h $out/
'';
}
+31 -6
View File
@@ -1,19 +1,44 @@
{ callPackage, meta, source, goBuildLdFlags }:
{ stdenv, callPackage, meta, source, nimbusSource, nimCompiler, goBuildLdFlags }:
let
buildNimbusLc = { platform, targets }: builtins.map
(target:
let
arch =
if platform == "ios" then
(if target == "iossimulator" && stdenv.hostPlatform.isx86
then "x86" else "arm64")
else builtins.elemAt (builtins.split "\/" target) 2 ;
in
callPackage ./buildNimbus.nix {
inherit nimCompiler platform arch;
srcRaw = nimbusSource;
}
)
targets;
in {
#ios-x86 = buildNimbusLc {platform = "ios"; targets = ["ios" "iossimulator"];};
ios-x86 = buildNimbusLc {platform = "ios"; targets = ["iossimulator"];};
ios-arm = buildNimbusLc {platform = "ios"; targets = ["ios"];};
android-arm64 = buildNimbusLc {platform = "android"; targets = ["android/arm64"];};
android-arm = buildNimbusLc {platform = "android"; targets = ["android/arm"];};
{
android = callPackage ./build.nix {
platform = "android";
platformVersion = "23";
targets = [ "android/arm" "android/arm64" "android/386" ];
#targets = [ "android/arm" "android/arm64" "android/386" ];
targets = [ "android/arm64" ];
outputFileName = "status-go-${source.shortRev}.aar";
inherit meta source goBuildLdFlags;
inherit meta source buildNimbusLc goBuildLdFlags;
};
ios = callPackage ./build.nix {
platform = "ios";
platformVersion = "8.0";
targets = [ "ios" "iossimulator" ];
targets = [ "iossimulator" ];
outputFileName = "Statusgo.xcframework";
inherit meta source goBuildLdFlags;
inherit meta source buildNimbusLc goBuildLdFlags;
};
}
+259
View File
@@ -0,0 +1,259 @@
/*
* Copyright (c) 2000-2017 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. The rights granted to you under the License
* may not be used to create, or enable the creation or redistribution of,
* unlawful or unlicensed copies of an Apple operating system, or to
* circumvent, violate, or enable the circumvention or violation of, any
* terms of an Apple operating system software license agreement.
*
* Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
/*
* Copyright (c) 1980, 1986, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)route.h 8.3 (Berkeley) 4/19/94
* $FreeBSD: src/sys/net/route.h,v 1.36.2.1 2000/08/16 06:14:23 jayanth Exp $
*/
#ifndef _NET_ROUTE_H_
#define _NET_ROUTE_H_
#include <sys/appleapiopts.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/socket.h>
/*
* These numbers are used by reliable protocols for determining
* retransmission behavior and are included in the routing structure.
*/
struct rt_metrics {
u_int32_t rmx_locks; /* Kernel leaves these values alone */
u_int32_t rmx_mtu; /* MTU for this path */
u_int32_t rmx_hopcount; /* max hops expected */
int32_t rmx_expire; /* lifetime for route, e.g. redirect */
u_int32_t rmx_recvpipe; /* inbound delay-bandwidth product */
u_int32_t rmx_sendpipe; /* outbound delay-bandwidth product */
u_int32_t rmx_ssthresh; /* outbound gateway buffer limit */
u_int32_t rmx_rtt; /* estimated round trip time */
u_int32_t rmx_rttvar; /* estimated rtt variance */
u_int32_t rmx_pksent; /* packets sent using this route */
u_int32_t rmx_state; /* route state */
u_int32_t rmx_filler[3]; /* will be used for T/TCP later */
};
/*
* rmx_rtt and rmx_rttvar are stored as microseconds;
*/
#define RTM_RTTUNIT 1000000 /* units for rtt, rttvar, as units per sec */
#define RTF_UP 0x1 /* route usable */
#define RTF_GATEWAY 0x2 /* destination is a gateway */
#define RTF_HOST 0x4 /* host entry (net otherwise) */
#define RTF_REJECT 0x8 /* host or net unreachable */
#define RTF_DYNAMIC 0x10 /* created dynamically (by redirect) */
#define RTF_MODIFIED 0x20 /* modified dynamically (by redirect) */
#define RTF_DONE 0x40 /* message confirmed */
#define RTF_DELCLONE 0x80 /* delete cloned route */
#define RTF_CLONING 0x100 /* generate new routes on use */
#define RTF_XRESOLVE 0x200 /* external daemon resolves name */
#define RTF_LLINFO 0x400 /* DEPRECATED - exists ONLY for backward
* compatibility */
#define RTF_LLDATA 0x400 /* used by apps to add/del L2 entries */
#define RTF_STATIC 0x800 /* manually added */
#define RTF_BLACKHOLE 0x1000 /* just discard pkts (during updates) */
#define RTF_NOIFREF 0x2000 /* not eligible for RTF_IFREF */
#define RTF_PROTO2 0x4000 /* protocol specific routing flag */
#define RTF_PROTO1 0x8000 /* protocol specific routing flag */
#define RTF_PRCLONING 0x10000 /* protocol requires cloning */
#define RTF_WASCLONED 0x20000 /* route generated through cloning */
#define RTF_PROTO3 0x40000 /* protocol specific routing flag */
/* 0x80000 unused */
#define RTF_PINNED 0x100000 /* future use */
#define RTF_LOCAL 0x200000 /* route represents a local address */
#define RTF_BROADCAST 0x400000 /* route represents a bcast address */
#define RTF_MULTICAST 0x800000 /* route represents a mcast address */
#define RTF_IFSCOPE 0x1000000 /* has valid interface scope */
#define RTF_CONDEMNED 0x2000000 /* defunct; no longer modifiable */
#define RTF_IFREF 0x4000000 /* route holds a ref to interface */
#define RTF_PROXY 0x8000000 /* proxying, no interface scope */
#define RTF_ROUTER 0x10000000 /* host is a router */
#define RTF_DEAD 0x20000000 /* Route entry is being freed */
/* 0x40000000 and up unassigned */
#define RTPRF_OURS RTF_PROTO3 /* set on routes we manage */
#define RTF_BITS \
"\020\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE" \
"\10DELCLONE\11CLONING\12XRESOLVE\13LLINFO\14STATIC\15BLACKHOLE" \
"\16NOIFREF\17PROTO2\20PROTO1\21PRCLONING\22WASCLONED\23PROTO3" \
"\25PINNED\26LOCAL\27BROADCAST\30MULTICAST\31IFSCOPE\32CONDEMNED" \
"\33IFREF\34PROXY\35ROUTER"
#define IS_DIRECT_HOSTROUTE(rt) \
(((rt)->rt_flags & (RTF_HOST | RTF_GATEWAY)) == RTF_HOST)
/*
* Routing statistics.
*/
struct rtstat {
short rts_badredirect; /* bogus redirect calls */
short rts_dynamic; /* routes created by redirects */
short rts_newgateway; /* routes modified by redirects */
short rts_unreach; /* lookups which failed */
short rts_wildcard; /* lookups satisfied by a wildcard */
short rts_badrtgwroute; /* route to gateway is not direct */
};
/*
* Structures for routing messages.
*/
struct rt_msghdr {
u_short rtm_msglen; /* to skip over non-understood messages */
u_char rtm_version; /* future binary compatibility */
u_char rtm_type; /* message type */
u_short rtm_index; /* index for associated ifp */
int rtm_flags; /* flags, incl. kern & message, e.g. DONE */
int rtm_addrs; /* bitmask identifying sockaddrs in msg */
pid_t rtm_pid; /* identify sender */
int rtm_seq; /* for sender to identify action */
int rtm_errno; /* why failed */
int rtm_use; /* from rtentry */
u_int32_t rtm_inits; /* which metrics we are initializing */
struct rt_metrics rtm_rmx; /* metrics themselves */
};
struct rt_msghdr2 {
u_short rtm_msglen; /* to skip over non-understood messages */
u_char rtm_version; /* future binary compatibility */
u_char rtm_type; /* message type */
u_short rtm_index; /* index for associated ifp */
int rtm_flags; /* flags, incl. kern & message, e.g. DONE */
int rtm_addrs; /* bitmask identifying sockaddrs in msg */
int32_t rtm_refcnt; /* reference count */
int rtm_parentflags; /* flags of the parent route */
int rtm_reserved; /* reserved field set to 0 */
int rtm_use; /* from rtentry */
u_int32_t rtm_inits; /* which metrics we are initializing */
struct rt_metrics rtm_rmx; /* metrics themselves */
};
#define RTM_VERSION 5 /* Up the ante and ignore older versions */
/*
* Message types.
*/
#define RTM_ADD 0x1 /* Add Route */
#define RTM_DELETE 0x2 /* Delete Route */
#define RTM_CHANGE 0x3 /* Change Metrics or flags */
#define RTM_GET 0x4 /* Report Metrics */
#define RTM_LOSING 0x5 /* RTM_LOSING is no longer generated by xnu
* and is deprecated */
#define RTM_REDIRECT 0x6 /* Told to use different route */
#define RTM_MISS 0x7 /* Lookup failed on this address */
#define RTM_LOCK 0x8 /* fix specified metrics */
#define RTM_OLDADD 0x9 /* caused by SIOCADDRT */
#define RTM_OLDDEL 0xa /* caused by SIOCDELRT */
#define RTM_RESOLVE 0xb /* req to resolve dst to LL addr */
#define RTM_NEWADDR 0xc /* address being added to iface */
#define RTM_DELADDR 0xd /* address being removed from iface */
#define RTM_IFINFO 0xe /* iface going up/down etc. */
#define RTM_NEWMADDR 0xf /* mcast group membership being added to if */
#define RTM_DELMADDR 0x10 /* mcast group membership being deleted */
#define RTM_IFINFO2 0x12 /* */
#define RTM_NEWMADDR2 0x13 /* */
#define RTM_GET2 0x14 /* */
/*
* Bitmask values for rtm_inits and rmx_locks.
*/
#define RTV_MTU 0x1 /* init or lock _mtu */
#define RTV_HOPCOUNT 0x2 /* init or lock _hopcount */
#define RTV_EXPIRE 0x4 /* init or lock _expire */
#define RTV_RPIPE 0x8 /* init or lock _recvpipe */
#define RTV_SPIPE 0x10 /* init or lock _sendpipe */
#define RTV_SSTHRESH 0x20 /* init or lock _ssthresh */
#define RTV_RTT 0x40 /* init or lock _rtt */
#define RTV_RTTVAR 0x80 /* init or lock _rttvar */
/*
* Bitmask values for rtm_addrs.
*/
#define RTA_DST 0x1 /* destination sockaddr present */
#define RTA_GATEWAY 0x2 /* gateway sockaddr present */
#define RTA_NETMASK 0x4 /* netmask sockaddr present */
#define RTA_GENMASK 0x8 /* cloning mask sockaddr present */
#define RTA_IFP 0x10 /* interface name sockaddr present */
#define RTA_IFA 0x20 /* interface addr sockaddr present */
#define RTA_AUTHOR 0x40 /* sockaddr for author of redirect */
#define RTA_BRD 0x80 /* for NEWADDR, broadcast or p-p dest addr */
/*
* Index offsets for sockaddr array for alternate internal encoding.
*/
#define RTAX_DST 0 /* destination sockaddr present */
#define RTAX_GATEWAY 1 /* gateway sockaddr present */
#define RTAX_NETMASK 2 /* netmask sockaddr present */
#define RTAX_GENMASK 3 /* cloning mask sockaddr present */
#define RTAX_IFP 4 /* interface name sockaddr present */
#define RTAX_IFA 5 /* interface addr sockaddr present */
#define RTAX_AUTHOR 6 /* sockaddr for author of redirect */
#define RTAX_BRD 7 /* for NEWADDR, broadcast or p-p dest addr */
#define RTAX_MAX 8 /* size of array to allocate */
struct rt_addrinfo {
int rti_addrs;
struct sockaddr *rti_info[RTAX_MAX];
};
#endif /* _NET_ROUTE_H_ */
+64
View File
@@ -0,0 +1,64 @@
{ utils, lib, fetchFromGitHub }:
let
inherit (lib) strings traceValFn importJSON getConfig;
srcOverride = getConfig "nimbus-eth1.src-override" null;
# Warning message about using local sources
localSrcWarn = (path: "Using local nimbus-eth1 sources from ${path}");
localSrc = rec {
owner = "status-im";
repo = "nimbus-eth1";
rev = "unknown";
shortRev = rev;
rawVersion = "develop";
cleanVersion = rawVersion;
goPackagePath = "github.com/${owner}/${repo}";
# We use builtins.path so that we can name the resulting derivation,
# Normally the name would not be deterministic, taken from the checkout directory.
src = builtins.path rec {
path = traceValFn localSrcWarn srcOverride;
name = "${repo}-source-${shortRev}";
# Keep this filter as restrictive as possible in order
# to avoid unnecessary rebuilds and limit closure size
filter = lib.mkFilter {
root = path;
include = [ ".*" ];
exclude = [
".*/[.]git.*" ".*[.]md" ".*[.]yml" ".*/.*_test.go$"
"VERSION" "_assets/.*" "build/.*"
".*/.*LICENSE.*" ".*/CONTRIB.*" ".*/AUTHOR.*"
];
};
};
};
githubSrc = let
owner = "status-im";
repo = "nimbus-eth1";
# Static lib
# rev = "211a0ed1e89bc836a79759e35db4a45f23a79b14";
# sha256 = "sha256-Z+PoQMoYJK9ort2ZiXE1oLeoNu2H44HHNnL4pbp+uI8=";
# Dynamic lib
rev = "1199e476397e271b889e54680dc632e47bc01dd6";
sha256 = "sha256-egx+I4h/V/56QRBtlaZffc3hrq7IaZCqL2Lm5XNqH1c=";
version = "0.1";
in rec {
inherit owner repo rev sha256 version;
shortRev = strings.substring 0 7 rev;
rawVersion = version;
cleanVersion = utils.sanitizeVersion version;
src = fetchFromGitHub {
inherit rev owner repo sha256;
name = "${repo}-${shortRev}-source-with-submodules";
fetchSubmodules = true;
};
};
in
if srcOverride != null
# If config.status-im.status-go.src-override is defined,
# instruct Nix to use that path to build status-go
then localSrc
# Otherwise grab it from the location defined by status-go-version.json
else githubSrc
+3 -3
View File
@@ -38,13 +38,13 @@
:builds {:mobile
{:target :react-native
:output-dir "app"
:init-fn status-im.core/init
:init-fn status-im2.setup.core/init
;; When false, the Shadow-CLJS watcher won't automatically refresh
;; the target files (a.k.a hot reload). When false, you can manually
;; reload by calling `shadow.cljs.devtools.api/watch-compile-all!`.
:devtools {:autobuild #shadow/env ["SHADOW_AUTOBUILD_ENABLED" :default true :as :bool]}
:dev {:devtools {:after-load status-im.reloader/reload
:build-notify status-im.reloader/build-notify
:dev {:devtools {:after-load status-im2.setup.hot-reload/reload
:build-notify status-im2.setup.hot-reload/build-notify
:preloads [re-frisk-remote.preload]}
:closure-defines
{status-im.utils.config/POKT_TOKEN #shadow/env "POKT_TOKEN"
+66
View File
@@ -0,0 +1,66 @@
(ns i18n.i18n
(:require
["i18n-js" :as i18n]
[clojure.string :as string]
[status-im.goog.i18n :as goog.i18n]))
(defn init [default-device-language translations-by-locale]
(set! (.-fallbacks i18n) true)
(set! (.-defaultSeparator i18n) "/")
(set! (.-locale i18n) default-device-language)
(set! (.-translations i18n) translations-by-locale))
(defn get-translations []
(.-translations i18n))
(defn set-language [lang]
(set! (.-locale i18n) lang))
;;:zh, :zh-hans-xx, :zh-hant-xx have been added until this bug will be fixed https://github.com/fnando/i18n-js/issues/460
(def delimeters
"This function is a hack: mobile Safari doesn't support toLocaleString(), so we need to pass
this map to WKWebView to make number formatting work."
(let [n (.toLocaleString ^js (js/Number 1000.1))
delimiter? (= (count n) 7)]
(if delimiter?
{:delimiter (subs n 1 2)
:separator (subs n 5 6)}
{:delimiter ""
:separator (subs n 4 5)})))
(defn label-number [number]
(when number
(let [{:keys [delimiter separator]} delimeters]
(.toNumber i18n
(string/replace number #"," ".")
(clj->js {:precision 10
:strip_insignificant_zeros true
:delimiter delimiter
:separator separator})))))
(def default-option-value "<no value>")
(defn label-options [options]
;; i18n ignores nil value, leading to misleading messages
(into {} (for [[k v] options] [k (or v default-option-value)])))
(defn label-fn
([path] (label-fn path {}))
([path options]
(if (exists? (.t i18n))
(let [options (update options :amount label-number)]
(.t i18n (name path) (clj->js (label-options options))))
(name path))))
(def label (memoize label-fn))
(defn label-pluralize [count path & options]
(if (exists? (.t i18n))
(.p i18n count (name path) (clj->js options))
(name path)))
(def locale
(.-locale i18n))
(def format-currency goog.i18n/format-currency)
+7 -3
View File
@@ -50,11 +50,13 @@ export function stackPointer (stackId, selectedStackId) {
);
}
export function bottomTabIconColor (stackId, selectedStackId, passThrough, selectedTabColor, defaultColor, passThroughColor) {
export function bottomTabIconColor (stackId, selectedStackId, homeStackOpen,
passThrough, selectedTabColor, defaultColor,
passThroughColor) {
return useDerivedValue(
function () {
'worklet'
if (selectedStackId.value == stackId){
if (selectedStackId.value == stackId && homeStackOpen.value){
return selectedTabColor;
}
else if (passThrough.value){
@@ -70,8 +72,10 @@ export function bottomTabIconColor (stackId, selectedStackId, passThrough, selec
// Home Stack
const shellAnimationTime = 200;
const defaultDurationAndEasing = {
duration: 300,
duration: shellAnimationTime,
easing: Easing.bezier(0, 0, 1, 1),
}
@@ -22,13 +22,13 @@
(defn- icon-view [type]
[icon/icon
(case type
:jump-to :main-icons2/jump-to
:mention :main-icons2/mention
:notification-down :main-icons2/arrow-down
:notification-up :main-icons2/arrow-up
:search-with-label :main-icons2/search
:search :main-icons2/search
:bottom :main-icons2/arrow-down)
:jump-to :i/jump-to
:mention :i/mention
:notification-down :i/arrow-down
:notification-up :i/arrow-up
:search-with-label :i/search
:search :i/search
:bottom :i/arrow-down)
{:size 12
:color (get-icon-and-text-color type)
:container-style {:margin-top 6
@@ -60,10 +60,12 @@
[_]
(let [pressed? (reagent/atom false)]
(fn [{:keys [type label on-press count customization-color style]}]
[rn/touchable-without-feedback
[rn/touchable-opacity
{:on-press-in #(reset! pressed? true)
:on-press-out #(reset! pressed? false)
:on-press on-press
:active-opacity 1
:style {:padding 5}
:accessibility-label type}
[rn/view {:style (merge
{:flex-direction :row
@@ -55,13 +55,13 @@
[counter/counter {:type :default} 5]
(= notifications :muted)
[icons/icon :main-icons2/muted {:container-style {:align-items :center
:justify-content :center}
:resize-mode :center
:size 20
:color (colors/theme-colors
colors/neutral-40
colors/neutral-50)}]))]]]])
[icons/icon :i/muted {:container-style {:align-items :center
:justify-content :center}
:resize-mode :center
:size 20
:color (colors/theme-colors
colors/neutral-40
colors/neutral-50)}]))]]]])
(defn communities-membership-list-item [props {:keys [name status tokens locked?]}]
[rn/view {:margin-bottom 20}
@@ -88,4 +88,4 @@
[rn/view {:justify-content :center
:margin-right 12}
[community-view/permission-tag-container {:locked? locked?
:tokens tokens}]])]]]])
:tokens tokens}]])]]]])
@@ -25,14 +25,14 @@
[rn/view (if (= type :card-view)
(style/card-stats-container)
(style/list-stats-container))
[community-stats {:icon :main-icons2/group
[community-stats {:icon :i/group
:members-count "629.2K" ;;TODO here should be formatted value, use money/format-members from outside this component
:icon-color icon-color}]
[community-stats {:icon :main-icons2/lightning
[community-stats {:icon :i/lightning
:members-count "112.1K"
:icon-color icon-color}]
(when (= type :card-view)
[community-stats {:icon :main-icons2/placeholder
[community-stats {:icon :i/placeholder
:count 4
:icon-color icon-color}])]))
@@ -75,4 +75,4 @@
colors/neutral-80)
:locked? locked?
:tokens tokens
:size 24}])
:size 24}])
+41 -40
View File
@@ -1,8 +1,8 @@
(ns quo2.components.drawers.action-drawers
(:require [react-native.core :as rn]
[quo2.components.markdown.text :as text]
[quo2.components.icon :as icon]
[quo2.foundations.colors :as colors]))
(:require [react-native.core :as rn]
[quo2.components.markdown.text :as text]
[quo2.components.icon :as icon]
[quo2.foundations.colors :as colors]))
(defn- get-icon-color [danger?]
(if danger?
@@ -14,47 +14,48 @@
sub-label
right-icon
danger?
on-press]}]
[rn/touchable-opacity {:on-press on-press}
[rn/view {:style
{:height (if sub-label 56 47)
:margin-horizontal 20
:flex-direction :row}}
[rn/view {:style
{:height 20
:margin-top :auto
:margin-bottom :auto
:margin-right 12
:width 20}}
[icon/icon icon
{:color (get-icon-color danger?)
:size 20}]]
[rn/view
{:style
{:flex 1
:justify-content :center}}
[text/text
{:size :paragraph-1
:weight :medium
:style {:color
(when danger?
(colors/theme-colors colors/danger-50 colors/danger-60))}}
label]
(when sub-label
[text/text
{:size :paragraph-2
:style {:color
(colors/theme-colors colors/neutral-50 colors/neutral-40)}}
sub-label])]
(when right-icon
on-press] :as action-props}]
(when action-props
[rn/touchable-opacity {:on-press on-press}
[rn/view {:style
{:height (if sub-label 56 47)
:margin-horizontal 20
:flex-direction :row}}
[rn/view {:style
{:height 20
:margin-top :auto
:margin-bottom :auto
:width 20}}
[icon/icon right-icon
:margin-right 12
:width 20}}
[icon/icon icon
{:color (get-icon-color danger?)
:size 20}]])]])
:size 20}]]
[rn/view
{:style
{:flex 1
:justify-content :center}}
[text/text
{:size :paragraph-1
:weight :medium
:style {:color
(when danger?
(colors/theme-colors colors/danger-50 colors/danger-60))}}
label]
(when sub-label
[text/text
{:size :paragraph-2
:style {:color
(colors/theme-colors colors/neutral-50 colors/neutral-40)}}
sub-label])]
(when right-icon
[rn/view {:style
{:height 20
:margin-top :auto
:margin-bottom :auto
:width 20}}
[icon/icon right-icon
{:color (get-icon-color danger?)
:size 20}]])]]))
(defn divider []
[rn/view {:style {:border-top-width 1
@@ -78,10 +78,10 @@
[rn/touchable-opacity
{:on-press on-close
:accessibility-label (str (or id "information-box") "-close-button")}
[quo2.icons/icon :main-icons2/close {:size 12
:color (get-color :close-button)
:container-style {:margin-top 4
:margin-left 8}}]])]
[quo2.icons/icon :i/close {:size 12
:color (get-color :close-button)
:container-style {:margin-top 4
:margin-left 8}}]])]
(when include-button?
[quo2.button/button {:type :primary
:size 24
+3 -3
View File
@@ -38,7 +38,7 @@
[rn/view {:style {:height 20}}
(when (and (not locked?)
muted?)
[quo2.icons/icon :main-icons2/muted
[quo2.icons/icon :i/muted
{:size 20
:no-color true}])
(when (and (not locked?)
@@ -51,6 +51,6 @@
(not muted?)
(not (pos? (int mentions-count)))
unread-messages?)
[quo2.icons/icon :main-icons2/channel-notification
[quo2.icons/icon :i/channel-notification
{:size 20
:no-color true}])]])
:no-color true}])]])
+26 -38
View File
@@ -6,50 +6,38 @@
(defn themes [type]
(case type
:main {:icon-color (theme-colors colors/neutral-50 colors/neutral-10)
:background (theme-colors colors/white colors/neutral-90)
:text-color (theme-colors colors/neutral-100 colors/white)}
:danger {:icon-color (theme-colors colors/danger-50 colors/danger-60)
:background (theme-colors colors/white colors/neutral-90)
:text-color (theme-colors colors/danger-50 colors/danger-60)}))
:main {:icon-color (theme-colors colors/neutral-50 colors/neutral-10)
:background (theme-colors colors/white colors/neutral-90)
:text-color (theme-colors colors/neutral-100 colors/white)}
:danger {:icon-color (theme-colors colors/danger-50 colors/danger-60)
:background (theme-colors colors/white colors/neutral-90)
:text-color (theme-colors colors/danger-50 colors/danger-60)}))
(defn menu-item
[{:keys [type title description accessibility-label icon on-press arrow?]
[{:keys [type title accessibility-label icon on-press]
:or {type :main}}]
(let [{:keys [icon-color text-color background]} (themes type)]
[rn/touchable-opacity
(merge {:accessibility-label accessibility-label
:style {:background-color background
:height 48
:flex-direction :row
:align-items :center}}
:style {:background-color background
:height 48
:flex-direction :row
:align-items :center}}
(when on-press
{:on-press on-press}))
[rn/view {:style {:flex-direction :row
:flex-grow 0
:flex-shrink 1
:padding-horizontal 20
:align-items :center}}
[rn/view {:style {:width 20
:height 20
:align-items :center
:justify-content :center
:margin-right 12}}
[rn/view {:style {:flex-direction :row
:flex-grow 0
:flex-shrink 1
:padding-horizontal 20}}
[rn/view {:style {:width 20
:height 20
:align-items :center
:justify-content :center
:margin-right 12}}
[icons/icon icon {:color icon-color}]]
[rn/view
[text/text {:weight :medium
:style {:color text-color}
:ellipsize-mode :tail
:number-of-lines 1
:size :paragraph-1}
title]
(when description
[text/text {:style {:color (colors/theme-colors colors/neutral-50 colors/neutral-40)}
:ellipsize-mode :tail
:number-of-lines 1
:size :label}
description])]]
(when arrow?
[rn/view {:style {:position :absolute
:right 8}}
[icons/icon :main-icons2/chevron-right {:color (colors/theme-colors colors/neutral-50 colors/neutral-40)}]])]))
[text/text {:weight :medium
:style {:color text-color}
:ellipsize-mode :tail
:number-of-lines 1
:size :paragraph-1}
title]]]))
@@ -70,13 +70,13 @@
colors/neutral-70
override-theme)}}
(if (= size 16)
[quo2.icons/icon :main-icons2/more {:size 12
:color (get-overflow-color
transparent?
colors/white-opa-70
colors/neutral-50
colors/neutral-40
override-theme)}]
[quo2.icons/icon :i/more {:size 12
:color (get-overflow-color
transparent?
colors/white-opa-70
colors/neutral-50
colors/neutral-40
override-theme)}]
[quo2.text/text {:size (if (= size 32) :paragraph-2 :label)
:weight :medium
:style {:color (get-overflow-color
@@ -17,7 +17,7 @@
(defn bottom-nav-tab
"[bottom-nav-tab opts]
opts
{:icon :main-icons2/communities
{:icon :i/communities
:new-notifications? true/false
:notification-indicator :unread-dot/:counter
:counter-label number
@@ -1,5 +1,6 @@
(ns quo2.components.navigation.floating-shell-button
(:require [react-native.core :as rn]
[react-native.reanimated :as reanimated]
[quo2.components.buttons.dynamic-button :as dynamic-button]))
(defn dynamic-button-view [type dynamic-buttons style]
@@ -16,21 +17,28 @@
"[floating-shell-button dynamic-buttons style]
dynamic-buttons
{:button-type {:on-press on-press :count count}}"
[dynamic-buttons style]
[rn/view {:style (merge {:flex-direction :row
:margin-horizontal 12} style)}
;; Left Section
[rn/view {:style {:flex 1}}
[dynamic-button-view :search dynamic-buttons {:position :absolute
:right 8}]]
;; Mid Section (jump-to)
[dynamic-button-view :jump-to dynamic-buttons nil]
;; Right Section
[rn/view {:style {:flex 1}}
[rn/view {:style {:position :absolute
:flex-direction :row
:right 0}}
[dynamic-button-view :mention dynamic-buttons {:margin-left 8}]
[dynamic-button-view :notification-down dynamic-buttons {:margin-left 8}]
[dynamic-button-view :notification-up dynamic-buttons {:margin-left 8}]
[dynamic-button-view :bottom dynamic-buttons {:margin-left 8}]]]])
[dynamic-buttons style opacity-anim pointer-anim]
[:f>
(fn []
(let [original-style (merge {:flex-direction :row
:margin-horizontal 12} style)
animated-style (reanimated/apply-animations-to-style
{:opacity opacity-anim
:pointer-events pointer-anim}
original-style)]
[reanimated/view {:style animated-style}
;; Left Section
[rn/view {:style {:flex 1}}
[dynamic-button-view :search dynamic-buttons {:position :absolute
:right 8}]]
;; Mid Section (jump-to)
[dynamic-button-view :jump-to dynamic-buttons nil]
;; Right Section
[rn/view {:style {:flex 1}}
[rn/view {:style {:position :absolute
:flex-direction :row
:right 0}}
[dynamic-button-view :mention dynamic-buttons {:margin-left 8}]
[dynamic-button-view :notification-down dynamic-buttons {:margin-left 8}]
[dynamic-button-view :notification-up dynamic-buttons {:margin-left 8}]
[dynamic-button-view :bottom dynamic-buttons {:margin-left 8}]]]]))])
+4 -4
View File
@@ -63,9 +63,9 @@
:right 20
:top 12
:flex-direction :row}}
[base-button :main-icons2/search open-search :open-search-button button-common-props]
[base-button :main-icons2/scan open-scanner :open-scanner-button button-common-props]
[base-button :main-icons2/qr-code show-qr :show-qr-button button-common-props]
[base-button :i/search open-search :open-search-button button-common-props]
[base-button :i/scan open-scanner :open-scanner-button button-common-props]
[base-button :i/qr-code show-qr :show-qr-button button-common-props]
[rn/view ;; Keep view instead of "[:<>" to make sure relative
;; position is calculated from this view instead of its parent
[hole-view/hole-view {:key new-notifications? ;; Key is required to force removal of holes
@@ -78,7 +78,7 @@
:else
[{:x 33 :y -7 :width 18 :height 18 :borderRadius 7}])}
[base-button :main-icons2/activity-center open-activity-center
[base-button :i/activity-center open-activity-center
:open-activity-center-button button-common-props]]
(when new-notifications?
(if (= notification-indicator :counter)
+1 -1
View File
@@ -26,7 +26,7 @@
:border-color (if dark?
colors/neutral-70
colors/neutral-30)})}
[icons/icon :main-icons2/add
[icons/icon :i/add
{:size 20
:color (if dark?
colors/white
+43 -24
View File
@@ -1,14 +1,19 @@
(ns quo2.components.selectors.selectors
(:require [react-native.core :as rn]
[quo2.foundations.colors :as colors]
[quo2.theme :as theme]
[reagent.core :as reagent]
[quo2.components.icon :as icons]))
(defn- get-color [checked? disabled?]
(if checked?
(defn- get-color [checked? disabled? blurred-background?]
(cond
checked?
(colors/custom-color-by-theme
:primary 50 60 (when disabled? 30) (when disabled? 30))
blurred-background?
(colors/theme-colors
(colors/alpha colors/neutral-80 (if disabled? 0.05 0.1))
(colors/alpha colors/white (if disabled? 0.05 0.1)))
:else
(colors/theme-colors
(colors/alpha colors/neutral-20 (if disabled? 0.4 1))
(colors/alpha colors/neutral-70 (if disabled? 0.3 1)))))
@@ -21,7 +26,7 @@
(defn checkbox-prefill [{:keys [default-checked?]}]
(let [checked? (reagent/atom (or default-checked? false))]
(fn [{:keys [on-change disabled? container-style]}]
(fn [{:keys [on-change disabled? blurred-background? container-style]}]
[rn/touchable-without-feedback
{:on-press (handle-press disabled? on-change checked?)}
[rn/view
@@ -30,16 +35,20 @@
{:height 21
:width 21
:border-radius 6
:background-color (colors/theme-colors
(colors/alpha colors/neutral-20 (if disabled? 0.3 1))
(colors/alpha colors/neutral-70 (if disabled? 0.3 1)))})
:background-color (if blurred-background?
(colors/theme-colors
(colors/alpha colors/neutral-80 (if disabled? 0.05 0.1))
(colors/alpha colors/white (if disabled? 0.05 0.1)))
(colors/theme-colors
(colors/alpha colors/neutral-20 (if disabled? 0.3 1))
(colors/alpha colors/neutral-70 (if disabled? 0.3 1))))})
:accessibility-label (str "checkbox-" (if @checked? "on" "off"))
:accessibility-role :checkbox}
(when @checked?
[rn/view {:style
{:height 20
:width 20}}
[icons/icon :main-icons2/check-small
[icons/icon :i/check-small
{:size 20
:color (colors/theme-colors
(colors/alpha colors/neutral-100 (if disabled? 0.3 1))
@@ -47,7 +56,7 @@
(defn checkbox [{:keys [default-checked?]}]
(let [checked? (reagent/atom (or default-checked? false))]
(fn [{:keys [on-change disabled? container-style]}]
(fn [{:keys [on-change disabled? blurred-background? container-style]}]
[rn/touchable-without-feedback
{:on-press (handle-press disabled? on-change checked?)}
[rn/view
@@ -59,26 +68,32 @@
{:style {:flex 1
:border-radius 6
:border-width (if @checked? 0 1)
:background-color (if @checked?
(get-color @checked? disabled?)
:background-color (cond
@checked?
(get-color @checked? disabled? blurred-background?)
blurred-background?
(colors/theme-colors
colors/white-opa-5
colors/white-opa-10)
:else
(colors/theme-colors
colors/white
colors/neutral-80-opa-40))
:border-color (if @checked? :none
(get-color @checked? disabled?))}
(get-color @checked? disabled? blurred-background?))}
:accessibility-label (str "checkbox-" (if @checked? "on" "off"))
:accessibility-role :checkbox}
(when @checked?
[rn/view {:style
{:height 20
:width 20}}
[icons/icon :main-icons2/check-small
[icons/icon :i/check-small
{:size 20
:color colors/white}]])]]])))
(defn radio [{:keys [default-checked?]}]
(let [checked? (reagent/atom (or default-checked? false))]
(fn [{:keys [on-change disabled? container-style]}]
(fn [{:keys [on-change disabled? blurred-background? container-style]}]
[rn/touchable-without-feedback
{:on-press (handle-press disabled? on-change checked?)}
[rn/view
@@ -88,9 +103,10 @@
:width 20
:border-radius 20
:border-width 1
:border-color (get-color @checked? disabled?)
:background-color (colors/theme-colors colors/white
(colors/alpha colors/neutral-80 0.4))})
:border-color (get-color @checked? disabled? blurred-background?)
:background-color (when-not blurred-background?
(colors/theme-colors colors/white
(colors/alpha colors/neutral-80 0.4)))})
:accessibility-label (str "radio-" (if @checked? "on" "off"))
:accessibility-role :checkbox}
@@ -98,7 +114,7 @@
{:margin-left :auto
:height 14
:width 14
:background-color (when @checked? (get-color @checked? disabled?))
:background-color (when @checked? (get-color @checked? disabled? blurred-background?))
:border-radius 20
:margin-right :auto
:margin-top :auto
@@ -106,7 +122,7 @@
(defn toggle [{:keys [default-checked?]}]
(let [checked? (reagent/atom (or default-checked? false))]
(fn [{:keys [on-change disabled? container-style]}]
(fn [{:keys [on-change disabled? blurred-background? container-style]}]
[rn/touchable-without-feedback
{:on-press (handle-press disabled? on-change checked?)}
[rn/view
@@ -115,17 +131,20 @@
{:height 20
:width 30
:border-radius 20
:background-color (get-color @checked? disabled?)})
:background-color (get-color @checked? disabled? blurred-background?)})
:accessibility-label (str "toggle-" (if @checked? "on" "off"))
:accessibility-role :checkbox}
[rn/view {:style
{:margin-left (if @checked? 12 2)
:height 16
:width 16
:background-color (colors/alpha colors/white
(if (theme/dark?)
(if disabled? 0.3 1)
1))
:background-color (if blurred-background?
(colors/theme-colors
(colors/alpha colors/white (if disabled? 0.4 1))
(colors/alpha colors/white (if disabled? 0.3 1)))
(colors/theme-colors
(colors/alpha colors/white 1)
(colors/alpha colors/white (if disabled? 0.4 1))))
:border-radius 20
:margin-right :auto
:margin-top :auto
+9 -9
View File
@@ -36,12 +36,12 @@
colors/neutral-50
colors/neutral-40)}}
(str "+" extra-group-count)]
[icons/icon :main-icons2/pending-default {:container-style {:align-items :center
:justify-content :center}
:color (colors/theme-colors
colors/neutral-50
colors/neutral-40)
:size 12}])]])))
[icons/icon :i/pending-default {:container-style {:align-items :center
:justify-content :center}
:color (colors/theme-colors
colors/neutral-50
colors/neutral-40)
:size 12}])]])))
(defn selected-token-count [group]
(cond
@@ -114,8 +114,8 @@
:justify-content :flex-end}
[rn/view {:padding-left (case 32 8 24 6)
:padding-right (case size 32 16 24 12)}
[icons/icon (if locked :main-icons2/locked
:main-icons2/unlocked)
[icons/icon (if locked :i/locked
:i/unlocked)
{:resize-mode :center
:size (case size 32 20 24 16)
:color (colors/theme-colors
@@ -123,4 +123,4 @@
colors/neutral-40)}]]
[tag-tokens {:tokens tokens
:size size
:background-color background-color}]]]))
:background-color background-color}]]]))
+2 -2
View File
@@ -22,7 +22,7 @@
:icon-color icon-color
:labelled (if (= type :label) true labelled)
:resource (if (= type :icon)
:main-icons2/placeholder
:i/placeholder
resource)
:on-press #(do (reset! active-tab-id %)
(when on-change (on-change %)))})]])]))))
(when on-change (on-change %)))})]])]))))
+1 -1
View File
@@ -88,7 +88,7 @@
:border-width 1
:right (get-value-from-size size -3.75 -5.75)
:bottom (get-value-from-size size (- 32 7.75 4) (- 24 7.75 2))})}
[icons/icon (if is-required :main-icons2/hold :main-icons2/add)
[icons/icon (if is-required :i/hold :i/add)
{:no-color true
:size 12}]])}
(str value " " token)]))
@@ -9,7 +9,7 @@
opts
{:style style ;; extra styles for the container (takes precedence)
:network-name \"Mainnet\" ;; shown network name
:icon :main-icons2/ethereum ;; key of icon belonging to the network
:icon :i/ethereum ;; key of icon belonging to the network
:eth-value 1.2345678 ;; shown ETH value}"
[{:keys [show-right-border? style network-name icon eth-value labels] :as _opts}]
[rn/view (merge {:accessibility-label :network-amount
@@ -51,7 +51,7 @@
:size :heading-2} (str currency price)]
[rn/view {:style {:display :flex :flex-direction :row :margin-top 6 :align-items :center}}
(when (not (zero? direction)) [icons/icon (if (>= direction 0) :main-icons2/price-increase12 :main-icons2/price-decrease12)
(when (not (zero? direction)) [icons/icon (if (>= direction 0) :i/price-increase12 :i/price-decrease12)
{:no-color true
:width 14
:height 14
@@ -88,7 +88,7 @@
:style {:height 32
:width 32}}]]
[rn/view {:style {:display :flex :flex-direction :row :margin-top 6 :align-items :center}}
(when (not (zero? direction)) [icons/icon (if (pos? direction) :main-icons2/price-increase :main-icons2/price-decrease)
(when (not (zero? direction)) [icons/icon (if (pos? direction) :i/price-increase :i/price-decrease)
{:no-color true
:size 12
:container-style {:margin-right 4}}])
+14
View File
@@ -0,0 +1,14 @@
(ns react-native.background-timer
(:require ["react-native-background-timer" :default background-timer]))
(defn set-timeout [cb ms]
(.setTimeout background-timer cb ms))
(defn clear-timeout [id]
(.clearTimeout background-timer id))
(defn set-interval [cb ms]
(.setInterval background-timer cb ms))
(defn clear-interval [id]
(.clearInterval background-timer id))
+8
View File
@@ -0,0 +1,8 @@
(ns react-native.config
(:require ["react-native-config" :default react-native-config]))
(def config (js->clj react-native-config :keywordize-keys true))
(defn get-config
([k] (get config k))
([k not-found] (get config k not-found)))
+20 -1
View File
@@ -3,6 +3,8 @@
["react-native" :as react-native]
[react-native.flat-list :as flat-list]))
(def app-state ^js (.-AppState ^js react-native))
(def view (reagent/adapt-react-class (.-View ^js react-native)))
(def scroll-view (reagent/adapt-react-class (.-ScrollView ^js react-native)))
(def image (reagent/adapt-react-class (.-Image ^js react-native)))
@@ -28,4 +30,21 @@
{:font-scale (.-fontScale window)
:height (.-height window)
:scale (.-scale window)
:width (.-width window)}))
:width (.-width window)}))
(defn hide-splash-screen []
(.hide ^js (-> react-native .-NativeModules .-SplashScreen)))
(defn alert [title message buttons options]
(.alert (.-Alert ^js react-native) title message (clj->js buttons) (clj->js options)))
(def appearance ^js (.-Appearance ^js react-native))
(defn get-color-scheme []
(.getColorScheme appearance))
(defn appearance-add-change-listener [handler]
(.addChangeListener appearance handler))
(defn get-window []
(js->clj (.get (.-Dimensions ^js react-native) "window") :keywordize-keys true))
+1 -1
View File
@@ -32,4 +32,4 @@
(dissoc props :data :header :footer :empty-component :separator :render-fn :key-fn :on-drag-end-fn)))
(defn flat-list [props]
[react-native-flat-list (base-list-props props)])
[react-native-flat-list (base-list-props props)])
+3 -2
View File
@@ -1,8 +1,9 @@
(ns react-native.gesture
(:require ["react-native-gesture-handler" :refer (GestureDetector Gesture)]
(:require ["react-native-gesture-handler" :refer (GestureDetector Gesture gestureHandlerRootHOC)]
[reagent.core :as reagent]))
(def gesture-detector (reagent/adapt-react-class GestureDetector))
(def gesture-handler-root-hoc gestureHandlerRootHOC)
(defn gesture-pan [] (.Pan ^js Gesture))
@@ -10,4 +11,4 @@
(defn on-start [^js pan handler] (.onStart pan handler))
(defn on-end [^js pan handler] (.onEnd pan handler))
(defn on-end [^js pan handler] (.onEnd pan handler))
+1 -1
View File
@@ -2,4 +2,4 @@
(:require [reagent.core :as reagent]
["react-native-hole-view" :refer (RNHoleView)]))
(def hole-view (reagent/adapt-react-class RNHoleView))
(def hole-view (reagent/adapt-react-class RNHoleView))
+8
View File
@@ -0,0 +1,8 @@
(ns react-native.languages
(:require ["react-native-languages" :default react-native-languages]))
(defn add-change-listener [handler]
(.addEventListener ^js react-native-languages "change" (fn [^js event] (handler (.-language event)))))
(defn get-lang-keyword []
(keyword (.-language ^js react-native-languages)))
+1 -1
View File
@@ -2,4 +2,4 @@
(:require ["react-native-linear-gradient" :default LinearGradient]
[reagent.core :as reagent]))
(def linear-gradient (reagent/adapt-react-class LinearGradient))
(def linear-gradient (reagent/adapt-react-class LinearGradient))
+5
View File
@@ -0,0 +1,5 @@
(ns react-native.mail
(:require ["react-native-mail" :default react-native-mail]))
(defn mail [opts callback]
(.mail react-native-mail (clj->js opts) callback))
+1 -1
View File
@@ -2,4 +2,4 @@
(:require ["@react-native-community/masked-view" :default MaskedView]
[reagent.core :as reagent]))
(def masked-view (reagent/adapt-react-class MaskedView))
(def masked-view (reagent/adapt-react-class MaskedView))
+58
View File
@@ -0,0 +1,58 @@
(ns react-native.navigation
(:refer-clojure :exclude [pop])
(:require ["react-native-navigation" :refer (Navigation)]))
(defn set-default-options [opts]
(.setDefaultOptions ^js Navigation (clj->js opts)))
(defn register-component [arg1 arg2 arg3] (.registerComponent ^js Navigation arg1 arg2 arg3))
(defn set-lazy-component-registrator [handler] (.setLazyComponentRegistrator ^js Navigation handler))
(defn set-root [root]
(.setRoot ^js Navigation (clj->js root)))
(defn set-stack-root [stack comp]
(.setStackRoot ^js Navigation stack (clj->js comp)))
(defn push [arg1 arg2]
(.push ^js Navigation arg1 (clj->js arg2)))
(defn pop [comp] (.pop ^js Navigation comp))
(defn show-modal [arg]
(.showModal ^js Navigation (clj->js arg)))
(defn dismiss-modal [comp] (.dismissModal ^js Navigation comp))
(defn show-overlay [comp]
(.showOverlay Navigation (clj->js comp)))
(defn dissmiss-overlay [comp]
(.catch (.dismissOverlay Navigation comp) #()))
(defn reg-app-launched-listener [handler]
(.registerAppLaunchedListener ^js (.events ^js Navigation) handler))
(defn reg-button-pressed-listener [handler]
(.registerNavigationButtonPressedListener
(.events Navigation)
(fn [^js evn]
(handler (.-buttonId evn)))))
(defn reg-modal-dismissed-listener [handler]
(.registerModalDismissedListener ^js (.events ^js Navigation) handler))
(defn reg-component-did-appear-listener [handler]
(.registerComponentDidAppearListener
^js (.events ^js Navigation)
(fn [^js evn]
(handler (keyword (.-componentName evn))))))
(defn reg-component-did-disappear-listener [handler]
(.registerComponentDidDisappearListener
^js (.events ^js Navigation)
(fn [^js evn]
(handler (.-componentName evn)))))
(defn merge-options [id opts]
(.mergeOptions Navigation id (clj->js opts)))
+1 -1
View File
@@ -6,4 +6,4 @@
(def os (when platform (.-OS ^js platform)))
(def android? (= os "android"))
(def ios? (= os "ios"))
(def ios? (= os "ios"))
+4 -1
View File
@@ -1,6 +1,6 @@
(ns react-native.safe-area
(:require ["react-native-safe-area-context" :as safe-area-context
:refer (SafeAreaInsetsContext)]
:refer (SafeAreaProvider SafeAreaInsetsContext)]
[reagent.core :as reagent]))
(def ^:private consumer-raw (reagent/adapt-react-class (.-Consumer ^js SafeAreaInsetsContext)))
@@ -10,3 +10,6 @@
(fn [insets]
(reagent/as-element
[component (js->clj insets :keywordize-keys true)]))])
(def safe-area-provider (reagent/adapt-react-class SafeAreaProvider))
(def safe-area-consumer consumer-raw)
+5
View File
@@ -0,0 +1,5 @@
(ns react-native.shake
(:require ["react-native-shake" :as react-native-shake]))
(defn add-shake-listener [handler]
(.addEventListener react-native-shake "ShakeEvent" handler))
+1 -1
View File
@@ -2,4 +2,4 @@
(:require ["react-syntax-highlighter" :default Highlighter]
[reagent.core :as reagent]))
(def highlighter (reagent/adapt-react-class Highlighter))
(def highlighter (reagent/adapt-react-class Highlighter))
+12 -7
View File
@@ -86,18 +86,23 @@
(and (some? cursor)
(not= cursor start-or-end-cursor)))
(defn- filter-status->rpc-method
[filter-status]
(if (= filter-status :read)
"wakuext_readActivityCenterNotifications"
"wakuext_unreadActivityCenterNotifications"))
(def ^:const status-read 1)
(def ^:const status-unread 2)
(def ^:const status-all 3)
(defn status [filter-status]
(case filter-status
:read status-read
:unread status-unread
:all status-all
99))
(fx/defn notifications-fetch
[{:keys [db]} {:keys [cursor filter-type filter-status reset-data?]}]
(when-not (get-in db [:activity-center :notifications filter-type filter-status :loading?])
{:db (assoc-in db [:activity-center :notifications filter-type filter-status :loading?] true)
::json-rpc/call [{:method (filter-status->rpc-method filter-status)
:params [cursor (defaults :notifications-per-page) filter-type]
::json-rpc/call [{:method "wakuext_activityCenterNotificationsBy"
:params [cursor (defaults :notifications-per-page) filter-type (status filter-status)]
:on-success #(rf/dispatch [:activity-center.notifications/fetch-success filter-type filter-status reset-data? %])
:on-error #(rf/dispatch [:activity-center.notifications/fetch-error filter-type filter-status %])}]}))
+2 -2
View File
@@ -10,7 +10,7 @@
(defn setup []
(h/register-helper-events)
(rf/dispatch [:init/app-started]))
(rf/dispatch [:setup/app-started]))
;;;; Contact verification
@@ -434,7 +434,7 @@
(rf/dispatch [:activity-center.notifications/fetch-next-page])
(is (= "wakuext_unreadActivityCenterNotifications" (get-in @spy-queue [0 :args 0 :method])))
(is (= "wakuext_activityCenterNotificationsBy" (get-in @spy-queue [0 :args 0 :method])))
(is (= "10" (get-in @spy-queue [0 :args 0 :params 0]))
"Should be called with current cursor")
(is (= {types/mention
+1 -1
View File
@@ -11,7 +11,7 @@
[status-im.i18n.i18n :as i18n]
[status-im.contact.core :as contact]
[status-im.router.core :as router]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.ethereum.stateofus :as stateofus]
[status-im.utils.db :as utils.db]))
+7 -5
View File
@@ -1,6 +1,7 @@
(ns status-im.add-new.db
(:require [status-im.ethereum.ens :as ens]
[cljs.spec.alpha :as spec]))
[cljs.spec.alpha :as spec]
[status-im.utils.db :as utils.db]))
(defn own-public-key?
[{:keys [multiaccount]} public-key]
@@ -8,18 +9,19 @@
(defn validate-pub-key [db public-key]
(cond
(or (not (spec/valid? :global/public-key public-key))
(or (not (utils.db/valid-public-key? public-key))
(= public-key ens/default-key))
:invalid
(own-public-key? db public-key)
:yourself))
(spec/def ::name :global/not-empty-string)
(spec/def ::name (spec/and string? not-empty))
(spec/def ::topic (spec/and :global/not-empty-string
(spec/def ::topic (spec/and string?
not-empty
(partial re-matches #"[a-z0-9\-]+")))
(defn valid-topic? [topic]
(and topic
(spec/valid? ::topic topic)
(not (spec/valid? :global/public-key topic))))
(not (utils.db/valid-public-key? topic))))
+1 -1
View File
@@ -3,7 +3,7 @@
[re-frame.core :as re-frame]
[status-im.i18n.i18n :as i18n]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]))
(def address-regex #"enode://[a-zA-Z0-9]+:?(.*)\@\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b:(\d{1,5})")
+1 -1
View File
@@ -9,7 +9,7 @@
[status-im.i18n.i18n :as i18n]
[status-im.native-module.core :as status]
[status-im.ui.components.list-selection :as list-selection]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[status-im.utils.http :as http]
[status-im.utils.platform :as platform]
+1 -1
View File
@@ -2,7 +2,7 @@
(:require [status-im.constants :as constants]
[status-im.ethereum.json-rpc :as json-rpc]
[status-im.i18n.i18n :as i18n]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.qr-scanner.core :as qr-scanner]
[status-im.utils.fx :as fx]))
+5 -5
View File
@@ -10,8 +10,6 @@
[status-im.i18n.i18n :as i18n]
[quo.design-system.colors :as colors]
[status-im.constants :as constants]
[status-im.navigation :as navigation]
[status-im.navigation2 :as navigation2]
[status-im.utils.clocks :as utils.clocks]
[status-im.utils.fx :as fx]
[status-im.utils.utils :as utils]
@@ -19,7 +17,8 @@
[status-im.add-new.db :as new-public-chat.db]
[status-im.chat.models.loading :as loading]
[status-im.ui.screens.chat.state :as chat.state]
[clojure.set :as set]))
[clojure.set :as set]
[status-im2.navigation.events :as navigation]))
(defn chats []
(:chats (types/json->clj (js/require "./chats.js"))))
@@ -253,7 +252,8 @@
(fx/merge cofx
{:dispatch [:navigate-to :chat]}
(navigation/change-tab :chat)
(navigation/pop-to-root-tab :chat-stack)
(when-not (= (:view-id db) :community)
(navigation/pop-to-root-tab :chat-stack))
(close-chat)
(force-close-chat chat-id)
(fn [{:keys [db]}]
@@ -270,7 +270,7 @@
{:db (assoc db :current-chat-id chat-id)}
(offload-messages chat-id)
(preload-chat-data chat-id)
(navigation2/navigate-to-nav2 :chat chat-id nil from-switcher?)))
(navigation/navigate-to-nav2 :chat chat-id nil from-switcher?)))
(fx/defn handle-clear-history-response
{:events [::history-cleared]}
+1 -1
View File
@@ -12,7 +12,7 @@
[status-im.utils.universal-links.core :as universal-links]
[status-im.ethereum.json-rpc :as json-rpc]
[quo.design-system.colors :as colors]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.handlers :refer [>evt]]
[status-im.ui.components.emoji-thumbnail.styles :as emoji-thumbnail-styles]
[status-im.notifications-center.core :as notification-center]))
+8 -6
View File
@@ -56,12 +56,12 @@
emoji-reaction-sad (:sad resources/reactions-old)
emoji-reaction-angry (:angry resources/reactions-old)})
(def reactions {emoji-reaction-love :main-icons2/love
emoji-reaction-thumbs-up :main-icons2/angry
emoji-reaction-thumbs-down :main-icons2/sad
emoji-reaction-laugh :main-icons2/laugh
emoji-reaction-sad :main-icons2/thumbs-up
emoji-reaction-angry :main-icons2/thumbs-down})
(def reactions {emoji-reaction-love :i/love
emoji-reaction-thumbs-up :i/thumbs-up
emoji-reaction-thumbs-down :i/thumbs-down
emoji-reaction-laugh :i/laugh
emoji-reaction-sad :i/sad
emoji-reaction-angry :i/angry})
(def ^:const invitation-state-unknown 0)
(def ^:const invitation-state-requested 1)
@@ -195,3 +195,5 @@
(def ^:const sticker-pack-status-installed 1)
(def ^:const sticker-pack-status-pending 2)
(def ^:const sticker-pack-status-owned 3)
(def ^:const delete-message-for-me-undo-time-limit-ms 4000)
+1 -1
View File
@@ -4,7 +4,7 @@
[status-im.contact.db :as contact.db]
[status-im.data-store.chats :as chats-store]
[status-im.data-store.contacts :as contacts-store]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.types :as types]
[status-im.notifications-center.core :as notification-center]
[status-im.utils.fx :as fx]))
+1 -1
View File
@@ -1,6 +1,6 @@
(ns status-im.contact.chat
(:require [re-frame.core :as re-frame]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[status-im.chat.models :as chat]
[status-im.contact.core :as contact]
+1 -1
View File
@@ -3,7 +3,7 @@
[status-im.contact.db :as contact.db]
[status-im.data-store.contacts :as contacts-store]
[status-im.ethereum.json-rpc :as json-rpc]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.utils.fx :as fx]
[taoensso.timbre :as log]
-54
View File
@@ -1,54 +0,0 @@
(ns status-im.core
(:require ["react-native" :refer (DevSettings LogBox)]
["react-native-languages" :default react-native-languages]
["react-native-shake" :as react-native-shake]
[re-frame.core :as re-frame]
[re-frame.interop :as interop]
[reagent.impl.batching :as batching]
status-im.events
[status-im.i18n.i18n :as i18n]
[status-im.native-module.core :as status]
status-im.navigation.core
[status-im.notifications.local :as notifications]
status-im.subs.root
[status-im.ui.components.react :as react]
[status-im.utils.config :as config]
status-im.utils.db
[status-im.utils.error-handler :as error-handler]
[status-im.utils.logging.core :as utils.logs]
[status-im.utils.platform :as platform]
[status-im.utils.snoopy :as snoopy]
[status-im.switcher.animation :as animation]
[status-im.async-storage.core :as async-storage]
[status-im.utils.universal-links.core :as utils.universal-links]))
(set! interop/next-tick js/setTimeout)
(set! batching/fake-raf #(js/setTimeout % 0))
(.ignoreAllLogs LogBox)
(defn init []
(utils.logs/init-logs config/log-level)
(error-handler/register-exception-handler!)
(when platform/android?
(status/set-soft-input-mode status/adjust-resize))
(notifications/listen-notifications)
(.addEventListener ^js react/app-state "change" #(re-frame/dispatch [:app-state-change %]))
(.addEventListener react-native-languages "change" (fn [^js event]
(i18n/set-language (.-language event))))
(.addEventListener react-native-shake "ShakeEvent" #(re-frame/dispatch [:shake-event]))
(re-frame/dispatch-sync [:init/app-started])
(utils.universal-links/initialize)
;; TODO(parvesh) - Remove while moving functionality to status-go
(async-storage/get-item :selected-stack-id #(animation/selected-stack-id-loaded %))
;;DEV
(snoopy/subscribe!)
(when (and js/goog.DEBUG platform/ios? DevSettings)
;;on Android this method doesn't work
(when-let [nm (.-_nativeModule DevSettings)]
;;there is a bug in RN, so we have to enable it first and then disable
(.setHotLoadingEnabled ^js nm true)
(js/setTimeout #(.setHotLoadingEnabled ^js nm false) 1000))))
+11 -9
View File
@@ -6,15 +6,17 @@
(defn <-rpc [contact]
(-> contact
(clojure.set/rename-keys {:id :public-key
:ensVerifiedAt :ens-verified-at
:ensVerified :ens-verified
:ensVerificationRetries :ens-verification-retries
:hasAddedUs :has-added-us
:contactRequestState :contact-request-state
:lastENSClockValue :last-ens-clock-value
:lastUpdated :last-updated
:localNickname :nickname})
(clojure.set/rename-keys
{:id :public-key
:ensVerifiedAt :ens-verified-at
:displayName :display-name
:ensVerified :ens-verified
:ensVerificationRetries :ens-verification-retries
:hasAddedUs :has-added-us
:contactRequestState :contact-request-state
:lastENSClockValue :last-ens-clock-value
:lastUpdated :last-updated
:localNickname :nickname})
(assoc :mutual? (and (:added contact)
(:hasAddedUs contact)))))
+11 -9
View File
@@ -3,16 +3,18 @@
[status-im.data-store.contacts :as c]))
(deftest contact<-rpc
(let [contact {:id "pk"
:address "address"
:name "name"
:identicon "identicon"
(let [contact {:id "pk"
:address "address"
:name "name"
:displayName "display-name"
:identicon "identicon"
:lastUpdated 1}
expected-contact {:public-key "pk"
:address "address"
:mutual? nil
:name "name"
:identicon "identicon"
expected-contact {:public-key "pk"
:address "address"
:display-name "display-name"
:mutual? nil
:name "name"
:identicon "identicon"
:last-updated 1}]
(testing "<-rpc"
(is (= expected-contact (c/<-rpc contact))))))
+1 -1
View File
@@ -7,7 +7,7 @@
[status-im.ethereum.ens :as ens]
[status-im.ethereum.stateofus :as stateofus]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.datetime :as datetime]
[status-im.utils.fx :as fx]
[status-im.utils.random :as random]
+8 -68
View File
@@ -5,7 +5,6 @@
[status-im.async-storage.core :as async-storage]
status-im.backup.core
status-im.bootnodes.core
[status-im.bottom-sheet.core :as bottom-sheet]
status-im.browser.core
status-im.browser.permissions
[status-im.chat.models :as chat]
@@ -23,7 +22,6 @@
status-im.fleet.core
status-im.http.core
[status-im.i18n.i18n :as i18n]
status-im.init.core
[status-im.keycard.core :as keycard]
status-im.log-level.core
status-im.mailserver.constants
@@ -34,11 +32,10 @@
status-im.multiaccounts.logout.core
status-im.multiaccounts.update.core
[status-im.native-module.core :as status]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
status-im.notifications-center.core
status-im.activity-center.core
status-im.pairing.core
[status-im.popover.core :as popover]
status-im.profile.core
status-im.search.core
status-im.signals.core
@@ -49,23 +46,17 @@
status-im.ui.screens.privacy-and-security-settings.events
[status-im.utils.dimensions :as dimensions]
[status-im.utils.fx :as fx]
status-im.utils.logging.core
[status-im.utils.universal-links.core :as universal-links]
[status-im.utils.utils :as utils]
[status-im.visibility-status-popover.core :as visibility-status-popover]
status-im.visibility-status-updates.core
status-im.waku.core
status-im.wallet.accounts.core
status-im.wallet.choose-recipient.core
[status-im.wallet.core :as wallet]
status-im.wallet.custom-tokens.core
[status-im.navigation.core :as navigation.core]
[status-im.navigation.state :as navigation.state]
[status-im.signing.core :as signing]
status-im.wallet-connect.core
status-im.wallet-connect-legacy.core
status-im.navigation2
status-im.navigation2.core))
status-im.network.net-info))
(re-frame/reg-fx
:dismiss-keyboard
@@ -119,56 +110,9 @@
(fx/defn system-theme-mode-changed
{:events [:system-theme-mode-changed]}
[{:keys [db] :as cofx} theme]
(let [cur-theme (get-in db [:multiaccount :appearance])
current-tab (get db :current-tab :chat)
view-id (:view-id db)
screen-params (get-in db [:navigation/screen-params view-id])
root-id @navigation.state/root-id
key-uid (get-in db [:multiaccounts/login :key-uid])
keycard-account? (boolean (get-in db [:multiaccounts/multiaccounts
key-uid
:keycard-pairing]))
dispatch-later (cond-> []
(= view-id :chat)
(conj {:ms 1000
:dispatch [:chat.ui/navigate-to-chat (:current-chat-id db)]})
(and
(= root-id :chat-stack)
(not-any? #(= view-id %) '(:home :empty-tab :wallet :status :my-profile :chat)))
(conj {:ms 1000
:dispatch [:navigate-to view-id screen-params]})
(some #(= view-id %) navigation.core/community-screens)
(conj {:ms 800 :dispatch
[:navigate-to :community
(get-in db [:navigation/screen-params :community])]})
(= view-id :community-emoji-thumbnail-picker)
(conj {:ms 900 :dispatch
[:navigate-to :create-community-channel
(get-in db [:navigation/screen-params :create-community-channel])]}))]
(when (and (some? root-id) (or (nil? cur-theme) (zero? cur-theme)))
(navigation.core/dismiss-all-modals)
(fx/merge cofx
(merge
{::multiaccounts/switch-theme (if (= :dark theme) 2 1)}
(when (seq dispatch-later)
{:utils/dispatch-later dispatch-later}))
(when (get-in db [:bottom-sheet/show?])
(bottom-sheet/hide-bottom-sheet))
(when (get-in db [:popover/popover])
(popover/hide-popover))
(when (get-in db [:visibility-status-popover/popover])
(visibility-status-popover/hide-visibility-status-popover))
(when (get-in db [:signing/tx])
(signing/discard))
(if (and (= root-id :multiaccounts) keycard-account?)
(navigation/init-root-with-component :multiaccounts-keycard :multiaccounts)
(navigation/init-root root-id))
(when (= root-id :chat-stack)
(navigation/change-tab current-tab))))))
[_ theme]
{::multiaccounts/switch-theme (if (= :dark theme) 2 1)
:dispatch [:reload-new-ui]})
(def authentication-options
{:reason (i18n/label :t/biometric-auth-reason-login)})
@@ -195,9 +139,7 @@
(>= (- now app-in-background-since)
constants/ms-in-bg-for-require-bioauth))]
(fx/merge cofx
{:db (-> db
(dissoc :app-in-background-since)
(assoc :app-active-since now))}
{:db (dissoc db :app-in-background-since)}
(mailserver/process-next-messages-request)
(wallet/restart-wallet-service-after-background app-in-background-since)
(universal-links/process-stored-event)
@@ -207,10 +149,8 @@
(biometric/authenticate % on-biometric-auth-result authentication-options)))))
(fx/defn on-going-in-background
[{:keys [db now] :as cofx}]
{:db (-> db
(dissoc :app-active-since)
(assoc :app-in-background-since now))
[{:keys [db now]}]
{:db (assoc db :app-in-background-since now)
:dispatch-n [[:audio-recorder/on-background] [:audio-message/on-background]]})
(fx/defn app-state-change
+1 -1
View File
@@ -5,7 +5,7 @@
[re-frame.core :as re-frame]
[status-im.chat.models :as models.chat]
[status-im.ethereum.json-rpc :as json-rpc]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[status-im.constants :as constants]
[status-im.i18n.i18n :as i18n]
+2
View File
@@ -4,6 +4,8 @@
["i18n-js" :as i18n]
[status-im.i18n.i18n-resources :as i18n-resources]
[status-im.goog.i18n :as goog.i18n]))
;;TODO (14/11/22 flexsurfer) this namespace has been moved to the root level, we keep this only for old (status 1.0) code,
;; can be removed with old code later
(set! (.-locale i18n) (name i18n-resources/default-device-language))
(set! (.-fallbacks i18n) true)
+2
View File
@@ -2,6 +2,8 @@
(:require [clojure.string :as string]
["i18n-js" :as i18n-js]
["react-native-languages" :default react-native-languages]))
;;TODO (14/11/22 flexsurfer) this namespace has been moved to the status-im2 namespace, we keep this only for old (status 1.0) code,
;; can be removed with old code later
(def default-device-language
(keyword (.-language react-native-languages)))
+2
View File
@@ -5,6 +5,8 @@
[clojure.set :as set]
[cljs.spec.alpha :as spec]
[clojure.string :as string]))
;;TODO (14/11/22 flexsurfer) this namespace has been moved to the status-im2 namespace, we keep this only for old (status 1.0) code,
;; can be removed with old code later
;; english as source of truth
(def labels (set (keys (js->clj (:en i18n-resources/translations-by-locale)
+13 -12
View File
@@ -4,11 +4,12 @@
[clojure.string :as string]
[re-frame.core :as rf]
status-im.events
status-im2.navigation.core
[status-im.chat.models :as chat.models]
[status-im.utils.security :as security]
[status-im.multiaccounts.logout.core :as logout]
[status-im.transport.core :as transport]
status-im.subs.root ;;so integration tests can run independently
status-im2.subs.root ;;so integration tests can run independently
[status-im.ethereum.core :as ethereum]
[status-im.utils.test :as utils.test]
[taoensso.timbre :as log]))
@@ -22,7 +23,7 @@
(utils.test/init!)
(defn initialize-app! []
(rf/dispatch [:init/app-started]))
(rf/dispatch [:setup/app-started]))
(defn generate-and-derive-addresses! []
(rf/dispatch [:generate-and-derive-addresses]))
@@ -71,11 +72,11 @@
(deftest initialize-app-test
(log/info "========= initialize-app-test ==================")
(rf-test/run-test-async
(rf/dispatch [:init/app-started])
(rf/dispatch [:setup/app-started])
(rf-test/wait-for
;; use initialize-view because it has the longest avg. time and
;; is dispatched by initialize-multiaccounts (last non-view event)
[:status-im.init.core/initialize-view]
[:setup/initialize-view]
(assert-app-initialized))))
(deftest create-account-test
@@ -83,7 +84,7 @@
(rf-test/run-test-async
(initialize-app!) ; initialize app
(rf-test/wait-for
[:status-im.init.core/initialize-view]
[:setup/initialize-view]
(generate-and-derive-addresses!) ; generate 5 new keys
(rf-test/wait-for
[:multiaccount-generate-and-derive-addresses-success] ; wait for the keys
@@ -101,7 +102,7 @@
(rf-test/run-test-async
(initialize-app!) ; initialize app
(rf-test/wait-for
[:status-im.init.core/initialize-view]
[:setup/initialize-view]
(generate-and-derive-addresses!) ; generate 5 new keys
(rf-test/wait-for
[:multiaccount-generate-and-derive-addresses-success]
@@ -126,7 +127,7 @@
(rf-test/run-test-async
(initialize-app!)
(rf-test/wait-for
[:status-im.init.core/initialize-view]
[:setup/initialize-view]
(generate-and-derive-addresses!) ; generate 5 new keys
(rf-test/wait-for
[:multiaccount-generate-and-derive-addresses-success]
@@ -148,7 +149,7 @@
(rf-test/run-test-async
(initialize-app!)
(rf-test/wait-for
[:status-im.init.core/initialize-view]
[:setup/initialize-view]
(generate-and-derive-addresses!)
(rf-test/wait-for
[:multiaccount-generate-and-derive-addresses-success]
@@ -185,7 +186,7 @@
(rf-test/run-test-async
(initialize-app!)
(rf-test/wait-for
[:status-im.init.core/initialize-view]
[:setup/initialize-view]
(rf/dispatch-sync [:init-root :onboarding])
(rf/dispatch-sync [:multiaccounts.recover.ui/recover-multiaccount-button-pressed])
(rf/dispatch-sync [:status-im.multiaccounts.recover.core/enter-phrase-pressed])
@@ -215,7 +216,7 @@
(rf-test/run-test-async
(initialize-app!)
(rf-test/wait-for
[:status-im.init.core/initialize-view]
[:setup/initialize-view]
(generate-and-derive-addresses!)
(rf-test/wait-for
[:multiaccount-generate-and-derive-addresses-success] ; wait for the keys
@@ -237,7 +238,7 @@
(rf-test/run-test-async
(initialize-app!)
(rf-test/wait-for
[:status-im.init.core/initialize-view]
[:setup/initialize-view]
(generate-and-derive-addresses!)
(rf-test/wait-for
[:multiaccount-generate-and-derive-addresses-success] ; wait for the keys
@@ -265,7 +266,7 @@
(rf-test/run-test-async
(initialize-app!)
(rf-test/wait-for
[:status-im.init.core/initialize-view]
[:setup/initialize-view]
(generate-and-derive-addresses!)
(rf-test/wait-for
[:multiaccount-generate-and-derive-addresses-success] ; wait for the keys
+1 -1
View File
@@ -6,7 +6,7 @@
[status-im.ethereum.mnemonic :as mnemonic]
[status-im.keycard.common :as common]
[status-im.multiaccounts.recover.core :as multiaccounts.recover]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.signing.core :as signing.core]
[taoensso.timbre :as log]))
+1 -1
View File
@@ -1,6 +1,6 @@
(ns status-im.keycard.change-pin
(:require [status-im.i18n.i18n :as i18n]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.keycard.onboarding :as onboarding]
[status-im.utils.fx :as fx]
[taoensso.timbre :as log]
+1 -1
View File
@@ -4,7 +4,7 @@
[status-im.ethereum.core :as ethereum]
[status-im.keycard.nfc :as nfc]
[status-im.i18n.i18n :as i18n]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.ui.screens.keycard.keycard-interaction :as keycard-sheet]
[status-im.utils.fx :as fx]
[status-im.utils.keychain.core :as keychain]
+1 -1
View File
@@ -16,7 +16,7 @@
[status-im.i18n.i18n :as i18n]
[status-im.multiaccounts.recover.core :as multiaccounts.recover]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.datetime :as utils.datetime]
[status-im.utils.fx :as fx]
[taoensso.timbre :as log]))
+1 -1
View File
@@ -1,5 +1,5 @@
(ns status-im.keycard.delete-key
(:require [status-im.navigation :as navigation]
(:require [status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[status-im.keycard.common :as common]))
+1 -1
View File
@@ -1,6 +1,6 @@
(ns status-im.keycard.login
(:require [status-im.ethereum.core :as ethereum]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[status-im.utils.types :as types]
[taoensso.timbre :as log]
+1 -1
View File
@@ -1,5 +1,5 @@
(ns status-im.keycard.mnemonic
(:require [status-im.navigation :as navigation]
(:require [status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[taoensso.timbre :as log]
[status-im.keycard.common :as common]
+1 -1
View File
@@ -2,7 +2,7 @@
(:require [clojure.string :as string]
[re-frame.core :as re-frame]
[status-im.i18n.i18n :as i18n]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[status-im.utils.utils :as utils]
[status-im.keycard.common :as common]
+1 -1
View File
@@ -1,5 +1,5 @@
(ns status-im.keycard.recovery
(:require [status-im.navigation :as navigation]
(:require [status-im2.navigation.events :as navigation]
[status-im.utils.datetime :as utils.datetime]
[status-im.multiaccounts.create.core :as multiaccounts.create]
[status-im.multiaccounts.model :as multiaccounts.model]
+1 -1
View File
@@ -2,7 +2,7 @@
(:require [re-frame.core :as re-frame]
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.i18n.i18n :as i18n]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[taoensso.timbre :as log]
[status-im.keycard.common :as common]
+1 -1
View File
@@ -7,7 +7,7 @@
[status-im.multiaccounts.update.core :as multiaccounts.update]
[status-im.node.core :as node]
[status-im.utils.mobile-sync :as mobile-network-utils]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[taoensso.timbre :as log]))
+1 -1
View File
@@ -5,7 +5,7 @@
[status-im.wallet.core :as wallet]
[status-im.bottom-sheet.core :as bottom-sheet]
[status-im.multiaccounts.model :as multiaccounts.model]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.mailserver.core :as mailserver]
[status-im.utils.mobile-sync :as utils]
[taoensso.timbre :as log]))
+22 -15
View File
@@ -8,12 +8,12 @@
[status-im.utils.fx :as fx]
[status-im.utils.gfycat.core :as gfycat]
[status-im.utils.identicon :as identicon]
[status-im.utils.theme :as utils.theme]
[status-im.theme.core :as theme]
[status-im.utils.utils :as utils]
[quo.platform :as platform]
[taoensso.timbre :as log]
[clojure.string :as string]))
[clojure.string :as string]
[status-im2.common.theme.core :as utils.theme]))
;; validate that the given mnemonic was generated from Status Dictionary
(re-frame/reg-fx
@@ -23,29 +23,36 @@
(defn contact-names
"Returns map of all existing names for contact"
[{:keys [name preferred-name alias public-key ens-verified nickname]}]
[{:keys [name
display-name
preferred-name
alias
public-key
ens-verified
nickname]}]
(let [ens-name (or preferred-name
name)]
(cond-> {:nickname nickname
:display-name display-name
:three-words-name (or alias (gfycat/generate-gfy public-key))}
;; Preferred name is our own otherwise we make sure it's verified
(or preferred-name (and ens-verified name))
(assoc :ens-name (str "@" (or (stateofus/username ens-name) ens-name))))))
;; NOTE: this does a bit of unnecessary work, we could short-circuit the work
;; once the first two are found, i.e don't calculate short key if 2 are already
;; available
(defn contact-two-names
"Returns vector of two names in next order nickname, ens name, three word name, public key"
"Returns vector of two names in next order nickname, ens name, display-name, three word name, public key"
[{:keys [names public-key] :as contact} public-key?]
(let [{:keys [nickname ens-name three-words-name]} (or names (contact-names contact))
(let [{:keys [nickname
ens-name
display-name
three-words-name]} (or names (contact-names contact))
short-public-key (when public-key? (utils/get-shortened-address public-key))]
(cond (not (string/blank? nickname))
[nickname (or ens-name three-words-name short-public-key)]
(not (string/blank? ens-name))
[ens-name (or three-words-name short-public-key)]
(not (string/blank? three-words-name))
[three-words-name short-public-key]
:else
(when public-key?
[short-public-key short-public-key]))))
(->> [nickname ens-name display-name three-words-name short-public-key]
(remove string/blank?)
(take 2))))
(defn contact-with-names
"Returns contact with :names map "
@@ -157,7 +164,7 @@
(re-frame/reg-fx
::switch-theme
(fn [theme-id]
(let [theme (if (or (= 2 theme-id) (and (= 0 theme-id) (utils.theme/is-dark-mode)))
(let [theme (if (or (= 2 theme-id) (and (= 0 theme-id) (utils.theme/dark-mode?)))
:dark
:light)]
(theme/change-theme theme))))
@@ -0,0 +1,85 @@
(ns status-im.multiaccounts.core-test
(:require [cljs.test :refer-macros [deftest is testing]]
[status-im.multiaccounts.core :as ma]))
(def public-key "0x0461f576da67dc0bca9888cdb4cb28c80285b756b324109da94a081585ed6f007cf00afede6b3ee5638593674fee100b590318fc7bdb0054b8dd9445acea216ad2")
(def short-public-key "0x0461…ad2")
(def random-name "Studious Gold Mustang")
(def override-random-name (str "override" random-name))
(def nickname "nickname")
(def override-nickname (str nickname "override"))
(def display-name "display-name")
(def override-display-name (str display-name "override"))
(def ens-name "jakubgs.eth")
(def formatted-ens (str "@" ens-name))
(def override-ens-name (str "override" ens-name))
(def contact
{:nickname nickname
:name ens-name
:ens-verified true
:public-key public-key
:display-name display-name})
(deftest contact-two-names-test
(testing "names is nil"
(testing "nickname has precedence"
(is
(= [nickname formatted-ens]
(ma/contact-two-names contact public-key))))
(testing "ens name is second option"
(is
(= [formatted-ens display-name]
(ma/contact-two-names
(dissoc contact :nickname)
public-key))))
(testing "ens name is second option but not verified"
(is
(= [display-name random-name]
(ma/contact-two-names
(dissoc contact :nickname :ens-verified)
public-key))))
(testing "display name is third option"
(is
(= [display-name random-name]
(ma/contact-two-names
(dissoc contact :nickname :name)
public-key))))
(testing "3 random words is fallback"
(is
(= [random-name short-public-key]
(ma/contact-two-names
(dissoc contact
:nickname
:name
:display-name)
public-key)))))
(testing "names is provided"
(let [names {:nickname override-nickname
:display-name override-display-name
:three-words-name override-random-name
:ens-name override-ens-name}
contact-with-names (assoc contact :names names)]
(testing "nickname has precedence"
(is
(= [override-nickname override-ens-name]
(ma/contact-two-names contact-with-names public-key))))
(testing "ens name is second option"
(is
(= [override-ens-name override-display-name]
(ma/contact-two-names
(update contact-with-names :names dissoc :nickname)
public-key))))
(testing "display name is third option"
(is
(= [override-display-name override-random-name]
(ma/contact-two-names
(update contact-with-names :names dissoc :nickname :ens-name)
public-key))))
(testing "3 random words is fallback"
(is
(= [override-random-name short-public-key]
(ma/contact-two-names
(update contact-with-names :names dissoc :nickname :ens-name :display-name)
public-key)))))))
+1 -1
View File
@@ -5,4 +5,4 @@
(defn valid-length? [password]
(>= (count password) const/min-password-length))
(spec/def ::password (spec/and :global/not-empty-string valid-length?))
(spec/def ::password (spec/and string? not-empty valid-length?))
@@ -8,7 +8,7 @@
[status-im.multiaccounts.model :as multiaccounts.model]
[status-im.multiaccounts.logout.core :as multiaccounts.logout]
[status-im.native-module.core :as native-module]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.popover.core :as popover]
[status-im.utils.fx :as fx]
[status-im.utils.security :as security]
+2 -2
View File
@@ -20,7 +20,7 @@
[status-im.mobile-sync-settings.core :as mobile-network]
[status-im.utils.fx :as fx]
[status-im.utils.keychain.core :as keychain]
[status-im.utils.logging.core :as logging]
[status-im2.setup.log :as logging]
[status-im.utils.security :as security]
[status-im.utils.types :as types]
[status-im.utils.utils :as utils]
@@ -33,7 +33,7 @@
[status-im.utils.mobile-sync :as utils.mobile-sync]
[status-im.async-storage.core :as async-storage]
[status-im.notifications-center.core :as notifications-center]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.signing.eip1559 :as eip1559]
[status-im.data-store.chats :as data-store.chats]
[status-im.data-store.visibility-status-updates :as visibility-status-updates-store]
+2 -2
View File
@@ -1,13 +1,13 @@
(ns status-im.multiaccounts.logout.core
(:require [re-frame.core :as re-frame]
[status-im.i18n.i18n :as i18n]
[status-im.init.core :as init]
[status-im.native-module.core :as status]
[status-im.utils.fx :as fx]
[status-im.multiaccounts.core :as multiaccounts]
[status-im.utils.keychain.core :as keychain]
[status-im.notifications.core :as notifications]
[status-im.wallet.core :as wallet]))
[status-im.wallet.core :as wallet]
[status-im2.setup.events :as init]))
(fx/defn logout-method
{:events [::logout-method]}
@@ -10,7 +10,7 @@
[status-im.multiaccounts.create.core :as multiaccounts.create]
[status-im.native-module.core :as status]
[status-im.popover.core :as popover]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[status-im.utils.security :as security]
[status-im.utils.types :as types]
-444
View File
@@ -1,444 +0,0 @@
(ns status-im.navigation.core
(:require
["react-native" :as rn]
["react-native-gesture-handler" :refer (gestureHandlerRootHOC)]
["react-native-navigation" :refer (Navigation)]
[clojure.set :as clojure.set]
[quo.components.text-input :as quo.text-input]
[quo.design-system.colors :as quo.colors]
[re-frame.core :as re-frame]
[status-im.multiaccounts.login.core :as login-core]
[status-im.navigation.roots :as roots]
[status-im.navigation.state :as state]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.components.react :as react]
[status-im.ui.screens.views :as views]
[status-im.utils.fx :as fx]
[status-im.utils.platform :as platform]
[taoensso.encore :as enc]
[taoensso.timbre :as log]))
(def debug? ^boolean js/goog.DEBUG)
(def splash-screen (-> rn .-NativeModules .-SplashScreen))
(defonce set-navigation-default-options
(.setDefaultOptions Navigation (clj->js {:layout {:orientation "portrait"}})))
;; REGISTER COMPONENT (LAZY)
(defn reg-comp [key]
(log/debug "reg-comp" key)
(if-let [comp (get views/components (keyword key))]
(.registerComponent Navigation key (fn [] (views/component comp)))
(let [screen (views/screen key)]
(.registerComponent Navigation key (fn [] (gestureHandlerRootHOC screen)) (fn [] screen)))))
(defonce rset-lazy-reg
(.setLazyComponentRegistrator Navigation reg-comp))
(defn dismiss-all-modals []
(log/debug "dissmiss-all-modals")
(when @state/curr-modal
(reset! state/curr-modal false)
(reset! state/dissmissing true)
(doseq [modal @state/modals]
(.dismissModal Navigation (name modal)))
(reset! state/modals [])))
;; PUSH SCREEN
(defn navigate [comp]
(log/debug "NAVIGATE" comp)
(let [{:keys [options]} (get views/screens comp)]
(.push Navigation
(name @state/root-comp-id)
(clj->js {:component {:id comp
:name comp
:options (merge options
(roots/status-bar-options)
(roots/merge-top-bar (roots/topbar-options) options))}}))
;;if we push the screen from modal, we want to dismiss all modals
(dismiss-all-modals)))
;; OPEN MODAL
(defn update-modal-topbar-options [options]
(log/debug "update-modal-topbar-options" options)
(merge options
(roots/merge-top-bar {:elevation 0
:noBorder true
:title {:color quo.colors/black}
:background {:color quo.colors/white}
:leftButtonColor quo.colors/black
:leftButtons {:id "dismiss-modal"
:icon (icons/icon-source :main-icons/close)}}
options)))
(defn open-modal [comp]
(log/debug "open-modal" comp)
(let [{:keys [options]} (get views/screens comp)]
(if @state/dissmissing
(reset! state/dissmissing comp)
(do
(reset! state/curr-modal true)
(swap! state/modals conj comp)
(.showModal Navigation
(clj->js {:stack {:children
[{:component
{:name comp
:id comp
:options (update-modal-topbar-options
(merge (roots/status-bar-options)
(roots/default-root)
options))}}]}}))))))
(re-frame/reg-fx :open-modal-fx open-modal)
;; DISSMISS MODAL
(defn dissmissModal []
(log/debug "dissmissModal")
(reset! state/dissmissing true)
(.dismissModal Navigation (name (last @state/modals))))
(defonce register-nav-button-reg
(.registerNavigationButtonPressedListener
(.events Navigation)
(fn [^js evn]
(let [id (.-buttonId evn)]
(if (= "dismiss-modal" id)
(do
(when-let [event (get-in views/screens [(last @state/modals) :on-dissmiss])]
(re-frame/dispatch event))
(dissmissModal))
(when-let [handler (get-in views/screens [(keyword id) :right-handler])]
(handler)))))))
(defn set-view-id [view-id]
(log/debug "set-view-id" view-id)
(when-let [{:keys [on-focus]} (get views/screens view-id)]
(re-frame/dispatch [:set-view-id view-id])
(re-frame/dispatch [:screens/on-will-focus view-id])
(when on-focus
(re-frame/dispatch on-focus))))
(defonce register-modal-reg
(.registerModalDismissedListener
(.events Navigation)
(fn [_]
(if (> (count @state/modals) 1)
(let [new-modals (butlast @state/modals)]
(reset! state/modals (vec new-modals))
(set-view-id (last new-modals)))
(do
(reset! state/modals [])
(reset! state/curr-modal false)
(set-view-id @state/pushed-screen-id)))
(let [comp @state/dissmissing]
(reset! state/dissmissing false)
(when (keyword? comp)
(open-modal comp))))))
;; SCREEN DID APPEAR
(defonce screen-appear-reg
(.registerComponentDidAppearListener
(.events Navigation)
(fn [^js evn]
(let [view-id (keyword (.-componentName evn))]
(log/debug "screen-appear-reg" view-id)
(when (get views/screens view-id)
(when (and (not= view-id :bottom-sheet)
(not= view-id :popover)
(not= view-id :visibility-status-popover))
(set-view-id view-id)
(when-not @state/curr-modal
(reset! state/pushed-screen-id view-id))))))))
;; SCREEN DID DISAPPEAR
(defonce screen-disappear-reg
(.registerComponentDidDisappearListener
(.events Navigation)
(fn [^js evn]
(let [view-id (keyword (.-componentName evn))]
(when-not (#{"popover" "bottom-sheet" "signing-sheet" "visibility-status-popover" "wallet-connect-sheet" "wallet-connect-success-sheet" "wallet-connect-app-management-sheet"}
(.-componentName evn))
(re-frame/dispatch [::view-disappeared view-id])
(doseq [[_ {:keys [ref value]}] @quo.text-input/text-input-refs]
(.setNativeProps ^js ref (clj->js {:text value})))
(doseq [[^js text-input default-value] @react/text-input-refs]
(.setNativeProps text-input (clj->js {:text default-value}))))))))
;; SET ROOT
(re-frame/reg-fx
:init-root-fx
(fn [new-root-id]
(log/debug :init-root-fx new-root-id)
(reset! state/root-comp-id new-root-id)
(reset! state/root-id @state/root-comp-id)
(.setRoot Navigation (clj->js (get (roots/roots) new-root-id)))))
(re-frame/reg-fx
:init-root-with-component-fx
(fn [[new-root-id new-root-comp-id]]
(log/debug :init-root-with-component-fx new-root-id new-root-comp-id)
(reset! state/root-comp-id new-root-comp-id)
(reset! state/root-id @state/root-comp-id)
(.setRoot Navigation (clj->js (get (roots/roots) new-root-id)))))
(fx/defn set-multiaccount-root
{:events [::set-multiaccount-root]}
[{:keys [db]}]
(log/debug :set-multiaccounts-root)
(let [key-uid (get-in db [:multiaccounts/login :key-uid])
keycard-account? (boolean (get-in db [:multiaccounts/multiaccounts
key-uid
:keycard-pairing]))]
{:init-root-fx (if keycard-account? :multiaccounts-keycard :multiaccounts)}))
(defonce rset-app-launched
(.registerAppLaunchedListener (.events Navigation)
(fn []
(reset! state/curr-modal false)
(reset! state/dissmissing false)
(if (or (= @state/root-id :multiaccounts)
(= @state/root-id :multiaccounts-keycard))
(re-frame/dispatch-sync [::set-multiaccount-root])
(when @state/root-id
(reset! state/root-comp-id @state/root-id)
(.setRoot Navigation (clj->js (get (roots/roots) @state/root-id)))
(re-frame/dispatch [::login-core/check-last-chat])))
(.hide ^js splash-screen))))
(defn get-screen-component [comp]
(log/debug :get-screen-component comp)
(let [{:keys [options]} (get views/screens comp)]
{:component {:id comp
:name comp
:options (merge options
(roots/status-bar-options)
(roots/merge-top-bar (roots/topbar-options) options))}}))
;; SET STACK ROOT
(re-frame/reg-fx
:set-stack-root-fx
(fn [[stack comp]]
(log/debug :set-stack-root-fx stack comp)
(.setStackRoot Navigation
(name stack)
(clj->js (if (vector? comp)
(mapv get-screen-component comp)
(get-screen-component comp))))))
;; BOTTOM TABS
(def tab-root-ids {0 :chat-stack
1 :browser-stack
2 :wallet-stack
3 :status-stack
4 :profile-stack})
(def tab-key-idx {:chat 0
:browser 1
:wallet 2
:status 3
:profile 4})
(re-frame/reg-fx
:change-tab-fx
(fn [tab]
(log/debug :change-tab-fx)
(reset! state/root-comp-id (get tab-root-ids (get tab-key-idx tab)))
(.mergeOptions Navigation "tabs-stack" (clj->js {:bottomTabs {:currentTabIndex (get tab-key-idx tab)}}))
;;when we change tab we want to dismiss all modals
(dismiss-all-modals)))
;issue on ios https://github.com/wix/react-native-navigation/issues/7146
(re-frame/reg-fx
:change-tab-count-fx
(fn [[tab cnt]]
(log/debug :change-tab-count-fx tab cnt)
(.mergeOptions Navigation
(name (get tab-root-ids (get tab-key-idx tab)))
(clj->js {:bottomTab (cond
(or (pos? cnt) (pos? (:other cnt)))
(if (and (= :chat tab) platform/ios?)
{:dotIndicator {:visible true}}
{:badge (str (or (:other cnt) cnt)) :dotIndicator {:visible false}})
(pos? (:public cnt))
(if platform/ios?
{:dotIndicator {:visible true}}
{:badge nil :dotIndicator {:visible true}})
:else
(if (and (= :chat tab) platform/ios?)
{:dotIndicator {:visible false}}
{:dotIndicator {:visible false} :badge ""}))}))))
(re-frame/reg-fx
:pop-to-root-tab-fx
(fn [comp]
(log/debug :pop-to-root-tab-fx comp)
(dismiss-all-modals)
(.popToRoot Navigation (name comp))))
(defonce register-bottom-tab-reg
(.registerBottomTabSelectedListener
(.events Navigation)
(fn [^js evn]
(let [selected-tab-index (.-selectedTabIndex evn)
comp (get tab-root-ids selected-tab-index)
tab-key (get (clojure.set/map-invert tab-key-idx) selected-tab-index)]
(re-frame/dispatch [:set :current-tab tab-key])
(when (= @state/root-comp-id comp)
(when (= :chat tab-key)
(re-frame/dispatch [:close-chat]))
(when platform/android?
(.popToRoot Navigation (name comp))))
(reset! state/root-comp-id comp)))))
;; OVERLAY (Popover and bottom sheets)
(defn dissmiss-overlay [comp]
(.catch (.dismissOverlay Navigation comp) #()))
(defn show-overlay [comp]
(dissmiss-overlay comp)
(.showOverlay Navigation
(clj->js
{:component {:name comp
:id comp
:options (merge (cond-> (roots/status-bar-options)
(and platform/android? (not (quo.colors/dark?)))
(assoc-in [:statusBar :backgroundColor] "#99999A"))
{:layout {:componentBackgroundColor (if platform/android?
(:backdrop @quo.colors/theme)
"transparent")}
:overlay {:interceptTouchOutside true}})}})))
;; POPOVER
(defonce popover-reg
(.registerComponent Navigation
"popover"
(fn [] (gestureHandlerRootHOC views/popover-comp))
(fn [] views/popover-comp)))
(re-frame/reg-fx :show-popover (fn [] (show-overlay "popover")))
(re-frame/reg-fx :hide-popover (fn [] (dissmiss-overlay "popover")))
;; VISIBILITY STATUS POPOVER
(defonce visibility-status-popover-reg
(.registerComponent Navigation
"visibility-status-popover"
(fn [] (gestureHandlerRootHOC views/visibility-status-popover-comp))
(fn [] views/visibility-status-popover-comp)))
(re-frame/reg-fx :show-visibility-status-popover
(fn [] (show-overlay "visibility-status-popover")))
(re-frame/reg-fx :hide-visibility-status-popover
(fn [] (dissmiss-overlay "visibility-status-popover")))
;; BOTTOM SHEETS
(defonce bottom-sheet-reg
(.registerComponent Navigation
"bottom-sheet"
(fn [] (gestureHandlerRootHOC views/sheet-comp))
(fn [] views/sheet-comp)))
(re-frame/reg-fx :show-bottom-sheet (fn [] (show-overlay "bottom-sheet")))
(re-frame/reg-fx :hide-bottom-sheet (fn [] (dissmiss-overlay "bottom-sheet")))
;; WALLET CONNECT
(defonce wallet-connect-sheet-reg
(.registerComponent Navigation
"wallet-connect-sheet"
(fn [] (gestureHandlerRootHOC views/wallet-connect-comp))
(fn [] views/wallet-connect-comp)))
(defonce wallet-connect-success-sheet-reg
(.registerComponent Navigation
"wallet-connect-success-sheet"
(fn [] (gestureHandlerRootHOC views/wallet-connect-success-comp))
(fn [] views/wallet-connect-success-comp)))
(defonce wallet-connect-app-management-sheet-reg
(.registerComponent Navigation
"wallet-connect-app-management-sheet"
(fn [] (gestureHandlerRootHOC views/wallet-connect-app-management-comp))
(fn [] views/wallet-connect-app-management-comp)))
(re-frame/reg-fx :show-wallet-connect-sheet (fn [] (show-overlay "wallet-connect-sheet")))
(re-frame/reg-fx :hide-wallet-connect-sheet (fn [] (dissmiss-overlay "wallet-connect-sheet")))
(re-frame/reg-fx :show-wallet-connect-success-sheet (fn [] (show-overlay "wallet-connect-success-sheet")))
(re-frame/reg-fx :hide-wallet-connect-success-sheet (fn [] (dissmiss-overlay "wallet-connect-success-sheet")))
(re-frame/reg-fx :show-wallet-connect-app-management-sheet (fn [] (show-overlay "wallet-connect-app-management-sheet")))
(re-frame/reg-fx :hide-wallet-connect-app-management-sheet (fn [] (dissmiss-overlay "wallet-connect-app-management-sheet")))
;; SIGNING
(defonce signing-sheet-reg
(.registerComponent Navigation
"signing-sheet"
(fn [] (gestureHandlerRootHOC views/signing-comp))
(fn [] views/signing-comp)))
(re-frame/reg-fx :show-signing-sheet (fn [] (show-overlay "signing-sheet")))
(re-frame/reg-fx :hide-signing-sheet (fn [] (dissmiss-overlay "signing-sheet")))
;; Select account
;; TODO why is this not a regular bottom sheet ?
(defonce select-acc-sheet-reg
(.registerComponent Navigation
"select-acc-sheet"
(fn [] (gestureHandlerRootHOC views/select-acc-comp))
(fn [] views/select-acc-comp)))
(re-frame/reg-fx :show-select-acc-sheet (fn [] (show-overlay "select-acc-sheet")))
(re-frame/reg-fx :hide-select-acc-sheet (fn [] (dissmiss-overlay "select-acc-sheet")))
;; NAVIGATION
(re-frame/reg-fx
:navigate-to-fx
(fn [key]
(log/debug :navigate-to-fx key)
(navigate key)))
(re-frame/reg-fx
:navigate-back-fx
(fn []
(log/debug :navigate-back-fx)
(if @state/curr-modal
(dissmissModal)
(.pop Navigation (name @state/root-comp-id)))))
(re-frame/reg-fx
:navigate-replace-fx
(fn [view-id]
(log/debug :navigate-replace-fx view-id)
(.pop Navigation (name @state/root-comp-id))
(navigate view-id)))
(def community-screens '(:community-management
:community-members
:community-requests-to-join
:create-community-channel
:community-emoji-thumbnail-picker
:create-community-category
:community-edit-chats
:community-edit
:community-reorder-categories))
;; change view-id if it is still same after component is disappeared
;; https://github.com/wix/react-native-navigation/issues/5744#issuecomment-563226820
(fx/defn view-disappeared
{:events [::view-disappeared]}
[{:keys [db]} view-id]
(when (= view-id (:view-id db))
{:db (assoc db :view-id (cond
(= view-id :community-emoji-thumbnail-picker)
:create-community-channel
(some #(= view-id %) community-screens)
:community
:else
:home))
:dispatch-n (enc/conj-when []
(and (= view-id :chat) [:chat.ui/sync-all-deleted-for-me-messages]))}))
-193
View File
@@ -1,193 +0,0 @@
(ns status-im.navigation.roots
(:require [quo.design-system.colors :as colors]
[status-im.utils.platform :as platform]
[status-im.ui.components.icons.icons :as icons]
[status-im.ui.screens.views :as views]
[status-im.navigation2.roots :as nav2-roots]))
(defn status-bar-options []
(if platform/android?
{:navigationBar {:backgroundColor colors/white}
:statusBar {:backgroundColor colors/white
:style (if (colors/dark?) :light :dark)}}
{:statusBar {:style (if (colors/dark?) :light :dark)}}))
(defn topbar-options []
{:noBorder true
:scrollEdgeAppearance {:active false
:noBorder true}
:elevation 0
:title {:color colors/black}
:rightButtonColor colors/black
:background {:color colors/white}
:backButton {:icon (icons/icon-source :main-icons/arrow-left)
:color colors/black}})
(defn bottom-tab-general [icon accessibility]
(merge
{:testID accessibility
:accessibilityLabel accessibility
:fontSize 11
:icon (icons/icon-source icon)
:badgeColor colors/blue
:dotIndicator {:color colors/blue :visible false :size 10}
:iconColor colors/gray :selectedIconColor colors/blue
:textColor colors/gray :selectedTextColor colors/blue}
(when platform/android?
{:badge ""})))
(defn default-root []
{:layout {:componentBackgroundColor colors/white
:orientation "portrait"
:backgroundColor colors/white}})
(defn merge-top-bar [root-options options]
(let [options (:topBar options)]
{:topBar
(merge root-options
options
(when (or (:title root-options) (:title options))
{:title (merge (:title root-options) (:title options))})
(when (or (:background root-options) (:background options))
{:background (merge (:background root-options) (:background options))})
(when (or (:backButton root-options) (:backButton options))
{:backButton (merge (:backButton root-options) (:backButton options))})
(when (or (:leftButtons root-options) (:leftButtons options))
{:leftButtons (merge (:leftButtons root-options) (:leftButtons options))})
(when (or (:rightButtons root-options) (:rightButtons options))
{:rightButtons (merge (:rightButtons root-options) (:rightButtons options))}))}))
(defn get-screen-options [screen]
(merge (get-in views/screens [screen :options])
(status-bar-options)
(merge-top-bar (topbar-options)
(get-in views/screens [screen :options]))))
;;TODO problem here is that we have two places for screens, here and in screens ns, and we have handler in navigate
(defn roots []
;;TABS
(merge
{:chat-stack
{:root
{:bottomTabs
{:id :tabs-stack
:options (merge (default-root)
{:bottomTabs {:titleDisplayMode :alwaysHide
:tabsAttachMode :onSwitchToTab
:backgroundColor colors/white}})
:children [;CHAT STACK
{:stack {:id :chat-stack
:children [{:component {:name :home
:id :home
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/message :home-tab-button)}}}
;BROWSER STACK
{:stack {:id :browser-stack
:children [{:component {:name :empty-tab
:id :empty-tab
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/browser :dapp-tab-button)}}}
;WALLET STACK
{:stack {:id :wallet-stack
:children [{:component {:name :wallet
:id :wallet
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/wallet :wallet-tab-button)}}}
;STATUS STACK
{:stack {:id :status-stack
:children [{:component {:name :status
:id :status
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/status :status-tab-button)}}}
;PROFILE STACK
{:stack {:id :profile-stack
:children [{:component {:name :my-profile
:id :my-profile
:options (merge (status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}]
:options {:bottomTab (bottom-tab-general :main-icons/user-profile :profile-tab-button)}}}]}}}
;;INTRO (onboarding carousel)
:intro
{:root {:stack {:children [{:component {:name :intro
:id :intro
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}
;; ONBOARDING
:onboarding
{:root {:stack {:id :onboarding
:children [{:component {:name :get-your-keys
:id :get-your-keys
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :elevation 0 :noBorder true :animate false)})}}}
;;PROGRESS
:progress
{:root {:stack {:children [{:component {:name :progress
:id :progress
:options (status-bar-options)}}]
:options (merge (default-root)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;LOGIN
:multiaccounts
{:root {:stack {:id :multiaccounts-stack
:children [{:component {:name :multiaccounts
:id :multiaccounts
:options (get-screen-options :multiaccounts)}}
{:component {:name :login
:id :login
:options (get-screen-options :login)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (topbar-options)})}}}
:multiaccounts-keycard
{:root {:stack {:id :multiaccounts-stack
:children [{:component {:name :multiaccounts
:id :multiaccounts
:options (get-screen-options :multiaccounts)}}
{:component {:name :keycard-login-pin
:id :keycard-login-pin
:options (get-screen-options :keycard-login-pin)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (topbar-options)})}}}
;;WELCOME
:welcome
{:root {:stack {:children [{:component {:name :welcome
:id :welcome
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}
;;NOTIFICATIONS
:onboarding-notification
{:root {:stack {:children [{:component {:name :onboarding-notification
:id :onboarding-notification
:options (status-bar-options)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}
;; TERMS OF SERVICE
:tos
{:root {:stack {:children [{:component {:name :force-accept-tos
:id :force-accept-tos
:options (get-screen-options :force-accept-tos)}}]
:options (merge (default-root)
(status-bar-options)
{:topBar (assoc (topbar-options) :visible false)})}}}}
(nav2-roots/roots)))
-60
View File
@@ -1,60 +0,0 @@
(ns status-im.navigation2
(:require [status-im.utils.fx :as fx]
[status-im.reloader :as reloader]
[status-im.utils.datetime :as datetime]))
(def parent-stack (atom :shell-stack))
(fx/defn reload-new-ui
{:events [:reload-new-ui]}
[_]
(reloader/reload)
{:new-ui/reset-bottom-tabs nil
:dispatch [:init-root :shell-stack]})
(fx/defn init-root-nav2
{:events [:init-root-nav2]}
[_ root-id]
{:init-root-fx-nav2 root-id})
(fx/defn open-modal-nav2
{:events [:open-modal-nav2]}
[_ modal]
{:open-modal-fx-nav2 modal})
(fx/defn close-modal-nav2
{:events [:close-modal-nav2]}
[_ modal]
{:close-modal-fx-nav2 modal})
(defn navigate-from-shell-stack [go-to-view-id id db]
(reset! parent-stack go-to-view-id)
{:navigate-to-fx-nav2 [go-to-view-id id]
:db (assoc-in db [:navigation2/navigation2-stacks id] {:type go-to-view-id
:id id
:clock (datetime/timestamp)})})
(defn navigate-from-switcher [go-to-view-id id db from-home?]
(reset! parent-stack go-to-view-id)
{:navigate-from-switcher-fx [go-to-view-id id from-home?]
:db (assoc-in db [:navigation2/navigation2-stacks id] {:type go-to-view-id
:id id
:clock (datetime/timestamp)})})
(fx/defn navigate-to-nav2
{:events [:navigate-to-nav2]}
[{:keys [db]} go-to-view-id id _ from-switcher?]
(let [view-id (:view-id db)
from-home? (= view-id :chat-stack)]
(if from-switcher?
(navigate-from-switcher go-to-view-id id db from-home?)
(if from-home?
(navigate-from-shell-stack go-to-view-id id db)
;; TODO(parvesh) - new stacks created from other screens should be stacked on current stack, instead of creating new entry
(navigate-from-shell-stack go-to-view-id id db)))))
(fx/defn change-root-status-bar-style
{:events [:change-root-status-bar-style]}
[_ style]
{:change-root-status-bar-style-fx style})
-85
View File
@@ -1,85 +0,0 @@
(ns status-im.navigation2.core
(:require [re-frame.core :as re-frame]
[quo2.foundations.colors :as colors]
[status-im.ui.screens.views :as views]
[status-im.navigation2.roots :as roots]
[status-im.utils.platform :as platform]
[status-im.navigation.roots :as nav-roots]
[status-im.navigation2.utils :as nav2-utils]
["react-native-navigation" :refer (Navigation)]))
(def tab-key-idx {:home 0
:communities 1
:wallet 2
:browser 3})
(defn change-root-status-bar-style [style]
(.mergeOptions Navigation
"shell-stack"
(clj->js {:statusBar {:style style}})))
;; TODO (parvesh) - improve open-modal and close-modal
(defn open-modal [comp]
(.showModal Navigation
(clj->js {:stack {:children
[{:component
{:name comp
:id comp
:options {:topBar {:visible false}}}}]}})))
(defn close-modal [_])
(defn close-all-modals []
(.dismissAllModals Navigation))
(defn get-id [comp id]
(str comp "-" id))
(defn get-options [show-topbar? options]
(merge options
(roots/status-bar-options)
(when platform/android?
{:navigationBar {:backgroundColor (colors/theme-colors colors/white colors/neutral-90)}})
(if show-topbar?
(nav-roots/merge-top-bar (nav-roots/topbar-options) options)
{:topBar {:visible false}})))
(defn change-stack-root [[comp _]]
(let [{:keys [options]} (get views/screens comp)]
(.setStackRoot Navigation
(name comp)
(clj->js {:stack {:id comp
:children [{:component {:id comp
:name comp
:options (get-options false options)}}]}}))))
(defn navigate [[comp _]]
(let [{:keys [options]} (get views/screens comp)]
(reset! nav2-utils/container-stack-view-id comp)
(.push Navigation
"shell-stack"
(clj->js {:stack {:id comp
:children [{:component {:id comp
:name comp
:options (get-options false options)}}]}}))))
(defn navigate-from-switcher [[comp id from-home?]]
(if from-home?
(navigate [comp id])
(change-stack-root [comp id])))
(re-frame/reg-fx
:init-root-fx-nav2
(fn [new-root-id]
(reset! nav2-utils/container-stack-view-id new-root-id)
(.setRoot Navigation (clj->js (get (roots/roots) new-root-id)))))
(re-frame/reg-fx :open-modal-fx-nav2 open-modal)
(re-frame/reg-fx :close-modal-fx-nav2 close-modal)
(re-frame/reg-fx :navigate-to-fx-nav2 navigate)
(re-frame/reg-fx :navigate-from-switcher-fx navigate-from-switcher)
(re-frame/reg-fx :change-root-status-bar-style-fx change-root-status-bar-style)
-20
View File
@@ -1,20 +0,0 @@
(ns status-im.navigation2.roots
(:require [quo2.foundations.colors :as colors]
[status-im.utils.platform :as platform]))
(defn status-bar-options []
(if platform/android?
{:navigationBar {:backgroundColor colors/neutral-100}
:statusBar {:backgroundColor :transparent
:style :light
:drawBehind true}}
{:statusBar {:style :light}}))
(defn roots []
{:shell-stack
{:root
{:stack {:id :shell-stack
:children [{:component {:name :chat-stack
:id :chat-stack
:options (merge (status-bar-options)
{:topBar {:visible false}})}}]}}}})
-22
View File
@@ -1,22 +0,0 @@
(ns status-im.navigation2.screens
(:require [status-im.ui2.screens.chat.view :as chat]
[status-im.switcher.shell-stack :as shell-stack]
[status-im.ui2.screens.communities.discover-communities :as discover-communities]))
;; We have to use the home screen name :chat-stack for now, for compatibility with navigation.cljs
(def screens [{:name :chat-stack ;; TODO(parvesh) - rename to shell-stack
:insets {:top false}
:component shell-stack/shell-stack}
{:name :discover-communities
;;TODO animated-header scroll behaviours
:options {:topBar {:visible false}}
:component discover-communities/communities}])
;; These screens will overwrite navigation/screens.cljs screens on enabling new UI toggle
(def screen-overwrites
[{:name :chat
:options {:topBar {:visible false}}
:component chat/chat}])
-3
View File
@@ -1,3 +0,0 @@
(ns status-im.navigation2.utils)
(defonce container-stack-view-id (atom nil))
+1 -1
View File
@@ -5,7 +5,7 @@
[status-im.ethereum.json-rpc :as json-rpc]
[status-im.i18n.i18n :as i18n]
[status-im.node.core :as node]
[status-im.navigation :as navigation]
[status-im2.navigation.events :as navigation]
[status-im.utils.fx :as fx]
[status-im.utils.http :as http]
[status-im.utils.types :as types]))

Some files were not shown because too many files have changed in this diff Show More