the contact details are fetched imperatively in these popups (not via
model updates), so we need to setup a signal to be able to react to those
changes
Major changes:
- Don't allow empty network selection. End up using the nim model
directly instead because of individual row changes issues
encountered with nim models
- Made the clone model a generic implementation to be used in other
places where we need to clone a model: ReceiveModal,
AddEditSavedAddressPopup
- Use cloned model as alternative to NetworksExtraStoreProxy in
ReceiveModal
- Added tristate support to our generic checkbox control
- UX improvements as per design
- Fix save address tests naming and zero address issue
- Various fixes
Notes:
- Failed to make NetworkSelectPopup follow ground-truth: show partially
checked as user intention until the network is selected in the
source model. Got stuck on nim models not being stable models and
report wrong entry change when reset. Tried sorting and only updating
changes without reset but it didn't work.
- Moved grouped property SingleSelectionInfo to its own file from
an inline component after finding out that it fails to load on Linux
with error "Cannot assign to property of unknown type: "*".".
It works on MacOS as expected
Closes: #10119
It enables navigation from mint token page to airdrop page selecting a specific collectible to be airdropped.
It is now used `symbol` property as the identifier for a collectible but will be needed to update it to `key` once this key property is build in backend by hash(chainId + contractAddress).
Closes#10047
Part of #3364
To make the drag and drop reorder work correctly on channels, we needed to change the model again so that it was sorted in the model itself.
That is because the drag and drop gives us the value of the position it is dropped to as a single list, so dragging the second item of the second category would mean from position 5 to position to position 4, but what the backend wants is moving the item 2 to position 1.
Sorting the model enables us to get the category that is the parent of that position and call the service with the right positions and id.
It also enables us to reorder the channel in and out of the category.
See the module code to see how the calculation is done with an explanatory comment.
The model needed some changes to support that. Some of the function where changed from dataChange calls to resetModel calls, since we need to re-sort the model.
I tried using beginMove, but it would crash. Maybe there is a bug in NimQML or I used it badly, I'm not sure.
Lazily load chat and community sections but do not unload them,
otherwise all temporary data such as scroll position, text input,
cursor position, etc., would vanish
iterates: #10286
- hide the market and other stuff that can't be used while offline
- recent stickers and already installed packs can still be used; they
will be sent when we return online
- when we return online, reload the views instead of closing the popup
- fix an evil NIM typo that prevented reloading the already installed
sticker packs
- remove the NIM parts that haven't been ported to the async nature; just
`loadStickers()` on the QMl side does the trick
the button to (un)install would be either greyed out or result in a crash:
- we were passing the popup a wrong store (w/o networkConnectionStore)
- the condition to `greyedOut` was inverted
fixes the currently selected sticker pack not being highlighted in the
popup footer
The strict equality operator would no longer yield true here:
```
property int selectedPackId
...
selected: stickerPackListView.selectedPackId === packId
```
the AC popup was being recreated on every click and never destroyed,
leading to:
- memory leaks
- slow operation on opening (it's not trivial to create)
Now we keep a reference the the created popup object, thus making it
faster to appear on every (second) click. It gets destroyed via its
parent at the application shutdown
the Popup has to be modal and the overlay should catch/eat all the mouse
events to prevent them from propagating to the contents behind the popup
Fixes#9838
Implementation of rounded corner line has been changed from Canvas to
plain Rectangle, fixing problem with Canvas not repainting when
dependent properties are changed.
Closes: #9668
Implement the UI part of Profile/Settings/Showcase:
- Communities/Accounts/Collectibles/Assets tabs
- drag and drop of items between "hidden" and "in showcase" sections
- ability to set individual items' visibility
- persistency (showcase saved across restarts), not exposed yet due to
missing backend API
Closes#9936
- it is displayed on the trailing edge, next to the main text, iff the
item/action is `checked`
- fix the text elide (must have a width set)
- fix for setting the icon name/source/color if we directly use a
(Status)MenuItem (as opposed to going via (Status)Action)
Fixes#10212
The problem was that we were detecting that the name was empty string and comparing to another empty string and inserting that, which is incorrect.
There was also a problem with the detection of the name being completely written. onKeyPressed didn't take into account the new letter added, onKeyReleased does.
Fix balance in loading state to use loading component instead of 0
Fix width of some components in loading state.
Remove property modelDataValid in favor of existing isModelDataValid.
Fix loading items not always properly removed before adding new
transactions.
Fixes#9617
... and support all emoji ASCII aliases
- previously we used to trigger the emoji replacement immediately which
led to various bugs like being unable to get the `🍻` emoji ;)
- we now trigger the emoji replacement after typing a certain sequence
followed by a space and then check that word for a possible emoji match
- as a result, we now fully support ASCII aliases, not only those having
a length of 2 (e.g. `:D`) but all the longer ones, like `O_O`, `:-#` or
even `-___-`
pressing the "down" key was working fine, the "up" key to move the
cursor to the previous line was broken
don't force the focus if it already has it and let the parent TextEdit
internals handle the event if we are not interested in it
Correctly clear the chat input
We enable/disable the chat input on various occasions (switching
channels, communities, checking for the person being a contact, etc.).
When we do so, we clear the text of the input which causes all sorts of
internal handlers to get fired, namely the `onTextChanged` part which
parses the text, emojis etc... which is very time consuming. More fixes
here in the followup commits; but by using `clear()` it's much faster,
resets correctly the internal state and also doesn't fire when the input
had been empty already before. Found with QML profiler
The non-standard derivation path was not allowed to be entered so paths
with custom indexes were not allowed.
Also implemented warning for non-ethereum coin
Added more tests for the new specifications
Other minor improvements and fixes
Closes#10135
- use spacing as designed in Figma
- re-use StatusColorSelectorGrid title label component (not leaving extra
space behind whern empty)
- always use white text for the color previews (our color palette/picker
are designed for this)
- give Channel color dialog a title (as designed)
- use BE spelling (as designed, and to be consistent with the rest of the app)
Fixes: #9841
Adjust according to Figma design
- the asset size should be 40x40
- fix the listview's horizontal alignment
- fix the confirmation dialog(s!) title
Fixes#9887
The enforcing of the derivation path editing rules is done in a structured
way by handling all the changes on the array of `Element` stored in
d.elements and then recomposing the HTML string to be displayed after
every change.
Main limitation is the workaround in `onTextChanged` that regenerates
the text in order to dismiss foreign characters introduced by pasting
which I couldn't find a way to disable without disabling also the ability
to copy content to clipboard.
Highlights:
- Implement DerivationPathInput control that intercepts the modifiable
keyboard events in order to edit the visible TextEdit.text while
respecting the requirements of the derivation path editing
- Implement a JS Controller that handles the logic of the
decomposing and recomposing the derivation path string
- Add anew StatusQ with the TextEdit basic look and feel to be used
in DerivationPathInput control without duplicating the style
- Allow passing modifiable events that are not generating characters in
order to allow copy to clipboard
- Disable add account when control is in error state
- Limit to maximum 5 elements in the derivation path
Testing:
- Integrate the control with StoryBook for a quick preview of the
control
- Add unit tests for the Controller basic functionality and regression
for the main control Item
- Removed forcing x64 architecture on apple arm64 hardware from the
storybook build configuration
Note: initially the implementation was suppose to be simple parse the
derivation path string edit elements and format it. However, I could not
find a quick way fix the circular dependency issue between editing the
text and reformatting it. The solution was to use a one way from the
structured data to the formatted string which complicates the
implementation logic.
Closes: #9890
Redirect the click event and let the CustomComboItem fill the whole
`contentItem` (otherwise a Button over another Button eats all the mouse
events)
Fixes: #9977
Fixes#9966
Uses the validate function to paste images so that it concatenates the previous images.
FIxes the validate function to also accept data images.
Moves the size validation function to Utils to reuse the data path prefix constant and fix the possible crash when we try to get the size of a data image.
- `AddAccountStore` moved to `AddAccountPopup`
- watch only address' placeholder text updated
- emoji popup button added to the right side of the account name input field
- `validateMnemonic` proc from accounts service updated
Added `StatusPageIndicator` component which displays buttons in a row,
representing pages from the set range.
Corresponding page in API Documentation added.
Fixing https://github.com/status-im/status-desktop/issues/9766
The main change is that the model will now provide the image type, on top of the image source. The image type can be either icon or image. Icons will be coloured with the same colour as the text.
Fixing: https://github.com/status-im/status-desktop/issues/9763
Changes:
1. Use int to pass around the supply amount from one component to another
2. Transform the supply amount to localised string when it is displayed to the user.
Fixes#9973
The buttons didn't work because we weren't using the right model + the section model didn't expose the PendingMemberRequestsModel.
I also fixed the service to update the community correctly and send the event. It should feel snappy-er to approve someone now.
There's a bug that all requests to join a community require the user to
authenticate themselves. This should only be needed for community that
are token permissioned.
This commit fixes it by only performing auth when requesting from the
tokengated community view.
Fixes#10010
the ProfileSectionStore is simply missing the required method to proceed
(note that this popup is used in 2 different contexts; the one in
Community Portal works fine due to the fact it's passed a different
store!)
- Added default no data information message for assets and collectibles.
- Added specific no data information message for airdrop functionality.
- Hidden searcher when there is no data available.
Part of #9938
Fixes#9949
Only calls `setTenorAPIKey` once we need it (when doing a search or getting trending).
Also caches the trending gifs so that they are only fetched once.
Makes the search and trending calls async by create an async tenor query async task.
Users that request access to community that are token permissioned
need to authenticate and enter their password, so they can reveal
their wallet addresses
This is necessary because with community token permissions, when owners
manually accept a request, we a) don't want to block the UI when the
users funds are check on chain and b) in case of insufficient funds,
we'll react with a modal that tells the owner that the user can't be
accepted.
All of that is done in this commit.
Closing #9967
When Holdings dropdown is open, activate focus to searcher in assets and collectibles. Changes focus to ENS input in case ENS tab is active.
In Holdings dropdown, when ENS tab is active and Add button is enabled, pressing enter key should behave same than clicking on the button itself.
In Holdings dropdown, when one asset or collectible has been selected, activate focus in the amount input, then when Add button is enabled, pressing enter key should behave same than clicking on the button itself.
Created new `StatusEmojiAndColorComboBox` component that behaves like a combobox but with specific content item and delegate look (emoji + color + text).
Also add handlers to JoinCommunityView for requesting and cancelling
requests. These will be extended in follow up commits to included
authentication modals
TLDR;
- all links visible in settings/popup
- persistent order of items
- drag'n'drop to reorder
- editing/deleting in a new popup
- several links of the same type
Needs changes in nimqml (to expose QAIM::begin/endMoveRows), in
DOtherSide (to expose those to NIM), in status-go (to preserve the links
order and fully save them to DB)
Fixes#9777
Introduce TokenItem struct.
TokenModel keeps TokenItems.
TokenItem keeps CommunityTokenDto and chain details.
Chain details are taken from networks service.
Fix#9867
- Added local pairing signals
- Remove slash ending from keystorePath
- Implemented localPairingState. Fixed sync new device workflow.
- Error message view design update
- Moved local pairing status to devices service
- ConnectionString automatic validation
- Async inputConnectionString
- Added all installation properties to model. Minor renaming.
- Removed emoji and color customization
- Show display name, colorhash and color in device being synced
- Add timeout to pairing server
- Add device type
Fix `DeviceSyncingView` sizing. Fix `inputConnectionString` async task slot.
- It has been added a `StackView` in main mint tokens panel to easily switch back / forward between views.
- It has been created a SQ component `StackViewStatesManager` that allows a managing together a stackview and states.
- Updated `HoldingsDropdown` to use new stack states component
- Refactored minting components store access, since some panels were accessing stores directly. Now `CommunitySettingsView` is the single place where stores are accessed.
- Renamed store `CommunitesStore` to `CommunityTokensStore` for handling minting / airdrop actions / request models.
- `NetworkFilter` refactored to prevent direct access to store inside the component.
Closes#9663
This does a few things:
- It integrates with the latest `CommunityTokensMetadata` to access
community specific ERC721 token
- It changes `ChatLayout` such that it conditionally loads either
`ChatView` or `JoinCommunityView`. `JoinCommunityView` has been
specifically designed for token-gated communities
Here's what works (in terms of token permissions):
1. If a community has token permissions and the the current users is not
a member of that community, we show `JoinCommunityView` instead of
`ChatView`
2. Any community token permissions of type "Become member" are listed in
the `JoinCommunityView`
3. There are different types of token critera a permission can have:
ERC20 token, ERC721 token, or ENS (which is also ERC721 but we have
a type for that nonetheless)
Only ERC20 token balances are checked for the known wallet accounts.
This happens every time the known token list has been updated (every
10 min atm).
We still need to add balance checks for any ERC721 tokens and ENS.
4. If token permissions are created, updated or deleted by the community
owner, the `JoinCommunityView` will update in real-time.
You'll also notice that the `Reveal my address and request access`
button will be enabled if any of the token permissions are fulfilled
(only ERC20 at the time being). Clicking that button will not yet send
a request.
This will be done in the next step as part of https://github.com/status-im/status-desktop/issues/9761
This is a continuation of the effort to improve out app's startup time.
With these changes, installed stickers are only loaded when the sticker
popup is opened.
They are also loaded asynchronously to not block the main thread.
Closes#9435
This postpones the loading of recently used stickers to the point
when a) the stickers popup is opened and the recent stickers tab was the
last visited one or b) when the sticker popup is open and one switches
to the recent stickers tab.
Partially closes#9435
- the goal of this PR is to get some bsais UI building blocks done for
the followup PRs
- the order of showcase tabs now is:
Communities/Accounts/Collectibles/Assets
- there will be further changes to accomodate for different types of
backend models as those get developed (for other users' profiles)
Fixes#9664
let the `generate-rcc.go` skip files under `vendor` and `tests` subdirs;
decreases the binary size and thus RAM usage by ~130 MB!
```
$ ls -al resources.*
-rw-r--r--. 1 ltinkl ltinkl 81950109 Mar 8 14:47 resources.rcc
-rw-r--r--. 1 ltinkl ltinkl 215385428 Mar 8 12:35 resources.rcc.bloat
```
So far CP components (views, panels) were accessing stores directly.
Now `CommunitySettingsView` is a single place where stores are accessed.
Other components no longer depend on stores.
Moreover:
- dedicated store `PermissionsStore` created for handling permissions
in a single, separated place
- storybook pages fixed
Closes: #9784
Prior to this change `ChatLayout` exposed `chatView` which let other
components access it, its properties and signals.
This is problematic as we need to be able to swap out the `ChatView`
with the `JoinCommunityView` for token gated communities, in which case
there won't be an instance of `chatView`.
This commit ensures that we rely purely on inputs and outputs of the
component, without exposing the component instance itself.
- missed space added in account already exists popup
- disable close button for shared keycard popup flows identified separately
- crash if built tokens from some other action (like enabling wallet) are received late while
keycard flow is setting up and keypair for processing is not prepared yet
- 3 words name was displayed on login for a keycard user
- Added navigation between pages.
- Added main layout and properties (some backend integration still pending).
- Added holders model with mocked data.
- Added mint tokens footer component.
Closes#8734 and #8737