Skip to content

Design update v3#473

Merged
dewabisma merged 17 commits into
mainfrom
feat/v3
May 4, 2026
Merged

Design update v3#473
dewabisma merged 17 commits into
mainfrom
feat/v3

Conversation

@dewabisma

Copy link
Copy Markdown
Collaborator

Summary

Updating quantus wallet app into new design.

dewabisma and others added 10 commits April 21, 2026 12:43
* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: add myr to fiat currency
* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: add myr to fiat currency

* chore: formatting and extract magic number

* feat: fix naming issues, add new tx to send filter also
* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: send confirm
* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* fix: review issues
* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* feat: finish updating button icon styling

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* wip: setting screens style update

* feat: finish about screen

* feat: finish help and support screen

* feat: finish account type screen

* feat: finish preference settings

- fix pos button bug
- finish currency picker

* feat: finish wallet preference menu

- Done all flow
- Need to refactor DRY violation

* feat: handle DRY violation

* fix: fixing review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* Beast/redesign account management (#461)

* wormhole: bring over miner UI from #407 (no SDK/rust)

Ports all miner-app changes from PR #407 (illuzen/wormhole) onto a
fresh branch off main, including the wormhole rewards setup flow,
balance card, withdrawal screen, new wallet/state/transfer-tracking
services, macOS icons/entitlements, and pubspec updates.

Deliberately excludes every quantus_sdk change (Dart + Rust + cargokit),
the CI workflow carve-outs for cargokit, and the unrelated
mobile-app/pubspec.lock bump. The SDK will be rebuilt from scratch to
support a new UX for entering the wormhole inner hash, so miner-app
will not compile on this branch until that work lands.

* AI cleanup

* Fix migration bug (#459)

* fix migration bug

add migration debug code

* lint

* remove migration test button

* update comment

* remove stats polling - no longer used

* format

* melos format again

* feat: finish updating button icon styling

* Build 100, Version 1.3.5

- Podfile fix for firebase, setting iOS version to 15
- upload file fix - force apple version of rsync

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* ndk upgrade as per gradle

* change gitignore to track android required resources

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* Miner release (#462)

* clean up code, remove features we don't need yet

* remove unused code

* info popup on mining

* UX fixes

* format

* N13/pos v2 check pending (#420)

* added pos mode v1

* add pos service

* format

* fix yellow underline

* Payment mode says 'Pay'

* format

* add watch

* add changes back in

* new charge fix, printouts, wait button added

* copy button for debug

* update rust crates to new chain version (planck)

* minor fix for dev accounts

* check pending first version

* format

* fix linter errors

* removing duplicate code

add pending transaction polling service, using it in transaction submission and also on pos screen

* format

* clear mining rewards on logout

rename mining rewards testnet rewards

* search for pending by extrinsic hash

* xcode stuff

* xcode stuff

* fix miner build

* miner app 0.4.0

* fix miner MacOS build workflow

* explicit team id so CI can build app

* Update Release.entitlements

* use defaults for flutter secure storage

* format

* restore entitlements - fix miner CI build

* Redesign send screen (#458)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* fix: send confirm

* Improve scaffold base (#460)

* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* fix: review issues

* fix: DRY violation

---------

Co-authored-by: Nikolaus Heger <nheger@gmail.com>

* fix: DRY violation, wrong border color

---------

Co-authored-by: Nikolaus Heger <nheger@gmail.com>
* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* feat: finish updating button icon styling

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* wip: setting screens style update

* feat: finish about screen

* feat: finish help and support screen

* feat: finish account type screen

* feat: finish preference settings

- fix pos button bug
- finish currency picker

* feat: finish wallet preference menu

- Done all flow
- Need to refactor DRY violation

* feat: handle DRY violation

* fix: fixing review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: finish updating homepage balance view

* feat: finish activity tx item update

* fix: review issues
* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* feat: finish updating button icon styling

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* wip: setting screens style update

* feat: finish about screen

* feat: finish help and support screen

* feat: finish account type screen

* feat: finish preference settings

- fix pos button bug
- finish currency picker

* feat: finish wallet preference menu

- Done all flow
- Need to refactor DRY violation

* feat: handle DRY violation

* fix: fixing review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: finish updating homepage balance view

* feat: finish activity tx item update

* feat: update splash

* feat: update onboarding welcome

* feat: finish oboarding redesign

* fix: review issues

* fix: build

* fix: not passing colors

* feat: remove fixed timer loading, refactor create wallet logic, add proper image for receive qr

* feat: make reusable component for recovery phrase

* fix: PR review issues
@dewabisma dewabisma requested a review from n13 May 3, 2026 08:01
dewabisma and others added 2 commits May 3, 2026 16:02
* feat: add new font families

* feat: remove accentPink, add accentOrange, update checksum color

* feat: update background color

- remove gradient background
- create base background widget, this will be the main background widget where we update background implementation so we don't have to ever touch other file and all change can be centralized here. Kinda painful everytime need to change background have to go through different files.
- Removed backgroundAlt theme color

* feat: updated icon button

- Removed unused glass circle icon button
- Update and rename glass icon button to quantus icon button, we don't want to always create new widget for every style change. Hence generic naming is needed.
- Added new button border color

* feat: update standard button

- Rename button component to quantus button
- Update button styling
- Add success variant

* feat: update send and receive

* feat: finish updating activity section

- Updated styling for tx item
- Update color text

* chore: formatting

* chore: ignore linter for secondary font family yet used

* feat: revert number format to trailing

* feat: finish new receive screen

* feat: standardized circular loader

It's crazy how we keep adding loader on the fly

Some are still left as is because of specific usage requirements but I changed mostly to use single reusable loader

* feat: finish updating toaster and copy button

* feat: improve balance loading

* fix: migration dialog button

* feat: address reviews

* feat: add geist font license

* WIP: currency system

* feat: finish updating currency display

* chore: formatting

* feat: resolve review issues

- remove fragile postFrame
- Add color tokens to theme
- remove duplicate map index implementation

* feat: update styling receive screen, add filter buttons

* feat: finish integrating filtered history

* feat: better loading UX

* feat: optimize graphql query performance

* chore: revert print timing

* feat: make tx details respect currency flip and hidden state

* feat: extract text style to theme

* chore: formatting

* fix: not properly display quan symbol in tx item

* feat: resolved PR review issues

- remove unused glass button assets
- fix DRY violation
- fix precision loss in convert fiat
- remove silent fallback

* feat: remove asset declaration

* feat: resolve PR review issues

* feat: resolve PR review issues

* feat: finish initial send and qr scan screens

* feat: finalize initial send screen

* wip: new send flow

* feat: handle clear field on click edit recipient icon

* feat: finish review send screen

* feat: finish send screen flow redesign

* chore: formatting

* fix: bad QR pay handling

* fix: review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: update scaffold base to support bottom content, also update receive screen

* feat: finish refactor send flow screens

* feat: finish updating button icon styling

* feat: proper icon button API design

* feat: finish updating main button styling

* feat: finish select accounts button

* feat: finish account edit flow

* wip: account add flow

- finish import account flow
- wip create new account flow

* feat: finish account create flow

* feat: add recovery phrase menu in account details

* feat: glass back button

* wip: setting screens style update

* feat: finish about screen

* feat: finish help and support screen

* feat: finish account type screen

* feat: finish preference settings

- fix pos button bug
- finish currency picker

* feat: finish wallet preference menu

- Done all flow
- Need to refactor DRY violation

* feat: handle DRY violation

* fix: fixing review issues

* fix: review issues

* fix: review issues

* fix: review issues

* feat: finish updating homepage balance view

* feat: finish activity tx item update

* feat: update splash

* feat: update onboarding welcome

* feat: finish oboarding redesign

* fix: review issues

* fix: build

* fix: not passing colors

* feat: remove fixed timer loading, refactor create wallet logic, add proper image for receive qr

* feat: adding currency conversion in send flow

* feat: implement real currency conversion

* chore: formatting

* fix: formatting amount

* feat: make reusable component for recovery phrase

* fix: PR review issues

* fix: PR review issues

- App will hard‑error on first launch when there's no cached rates yet
- data.cast<String, double>() will TypeError when the API returns a whole number
- Silent catch (_) swallows parse failures (violates the project "fail early" rule)
- getRate throws but the docstring promises a fallback
- _setMax() non‑flipped path is asymmetric with the flipped path
- Hidden balance + flipped mode appends QUAN to the masked text
- Other small fixes

* feat: properly handle localization of number decimal

* chore: formatting

* fix: exchange rates consumption and cache handling, also fixed chain history service merge conflict

* feat: properly throw on broken convert fiat to quan

* fix round 4 issues

* more cases

---------

Co-authored-by: Nikolaus Heger <nheger@gmail.com>
@n13

n13 commented May 4, 2026

Copy link
Copy Markdown
Collaborator

Review of PR #473 — Design update v3

Overview: Massive but well-scoped redesign of the Quantus wallet — 176 files, +8562/-3669 across 12 commits, rolling up six previously-merged sub-PRs (home, activity, send, scaffold, settings, onboarding, currency). Builds cleanly, flutter analyze reports No issues found! for both mobile-app and quantus_sdk, and all 154 unit tests pass locally (incl. exchange rate, locale parsing, send-screen logic, wallet creation).


Critical (must-fix before merge)

1. Broken string interpolation in transaction detail fee row

The fee field on the transaction details sheet currently renders garbage. Line 121 of the new file:

    final feeStr = (fee != null && fee != BigInt.zero)
        ? '$formattingService).formatBalance(fee, maxDecimals: AppConstants.decimals) ${AppConstants.tokenSymbol}'
        : null;

This was a refactor that swapped NumberFormattingService() for the riverpod-provided formattingService but lost the closing brace of ${...}. So at runtime the NETWORK FEE row will display literal text along the lines of:

Instance of 'NumberFormattingService').formatBalance(fee, maxDecimals: 12) QUAN

Fix:

'${formattingService.formatBalance(fee, maxDecimals: AppConstants.decimals)} ${AppConstants.tokenSymbol}'

The compiler can't catch this because Object.toString() makes any object valid in interpolation — exactly the kind of bug a screenshot would reveal. Worth a quick visual smoke test of the tx detail sheet.


Important

2. Unawaited fire-and-forget violates "fail early"

      RecentAddressesService().addAddress(widget.recipientAddress.trim());

No await, no .catchError, no try/catch. If persistence fails, it's silently swallowed. Either await it (so failures surface) or wrap with unawaited(...) and an explicit catch that logs.

3. DRY violation: address shortening

String _shortenAddress(String addr) {
  if (addr.length <= 10) return addr;
  return '${addr.substring(0, 5)}...${addr.substring(addr.length - 3)}';
}

This re-implements AddressFormattingService.formatAddress (which already supports configurable prefix/postFix/ellipses and is already used elsewhere in the same PR, e.g. select_recipient_screen.dart, review_send_screen.dart). Replace with:

counterpartyAddr: AddressFormattingService.formatAddress(
  isSend ? tx.to : tx.from,
  prefix: 5, postFix: 3,
),

4. Architectural inconsistency: direct service instantiation in widgets

select_recipient_screen.dart (l. 56–59) and receive_screen.dart (l. 34–35) instantiate RecentAddressesService(), SettingsService(), HumanReadableChecksumService() directly, while the rest of the new code reaches for them via Riverpod providers (ref.read(settingsServiceProvider), etc.). Pick one pattern and apply it across the new screens — the inline instantiation makes these screens harder to test and breaks dependency-override at boot.

5. Null-bang on possibly-null active account

      final account = (await _settingsService.getActiveAccount())!;

And similarly:

      final account = (await settings.getActiveRegularAccount())!;

If a user reaches Receive or Review with no active account (state corruption, mid-logout), the ! throws an unhelpful null-check error. The catch in review_send_screen then leaks Transfer failed: Null check operator used on a null value to the user. Either guard explicitly with a clear error or assert the precondition earlier.


Minor / nice-to-have

6. _isUpdatingProgrammatically reentrancy guard is fragile

input_amount_screen.dart toggles this flag in 4 spots to break the listener feedback loop. Easy to forget on the next change. Consider replacing the listener with an onChanged callback on the TextField, which only fires for user input — and dropping the flag entirely.

7. Symmetric round-trip precision documented, but UX still drifts

The new exchange_rate_service_test.dart even has a test acknowledging this:

    test('round-trip is lossy for non-clean-divisor rates (documents expected drift)', () {

For 0-decimal currencies (IDR/JPY), typing 1 QUAN → flip → flip back can produce 1.00001 QUAN. ≤1 raw unit is fine numerically but visible at higher precisions. Worth a follow-up to anchor the canonical amount in QUAN regardless of which side the user is editing.

8. _processIntentIfAvailable() called from build()

    _processIntentIfAvailable();

build should be pure. The intent is cleared after first read so it's safe today, but if anything triggers a rebuild between read and the postFrame callback, the navigation could fire twice. Move into initState / a route observer.

9. Raw exception leaked to UI

    } catch (e) {
      if (mounted) {
        setState(() {
          _submitting = false;
          _errorMessage = 'Transfer failed: $e';
        });
      }
    }

Transfer failed: <stack-trace-ish thing> is debug-only quality. Map known exception types to user-friendly messages and log the rest.

10. Hardcoded quanToUsdRate = 1

exchange_rate_service.dart ships with 1 QUAN = 1 USD and a TODO. Acceptable for testnet, but worth filing a follow-up issue so this doesn't get forgotten when the wallet goes mainnet — flipped/fiat displays will be meaningless until a real feed lands.


Positive observations

  • flutter analyze clean for both mobile-app and quantus_sdk.
  • 154 tests pass, including a thorough new locale-handling suite (744 lines covering en_US, id_ID, de_DE, fr_FR, ja_JP, ms_MY) and a round-trip-drift test for exchange-rate math.
  • Theme system is well structuredAppColorsV2.dark() and AppTextTheme.defaultTheme()/iPad() use ThemeExtension, enabling future light-mode and per-form-factor scaling.
  • currency_display_provider is the right abstraction — widgets only render CurrencyDisplayState.primaryAmount/secondaryAmount, conversion math lives in one place.
  • Fail-early discipline is generally followed in new code (getRate throws on missing currency, getExchangeRates throws on missing data, send-screen flagged exceptions for invalid input).
  • chain_history_service moved transaction-direction filtering from client-side to GraphQL where clauses — a real perf improvement, with the +1 lookahead pagination pattern being clean.
  • Component consolidation: glass_buttonquantus_button, glass_icon_button + glass_circle_icon_button → single quantus_icon_button with IconButtonShape/IconButtonStyle/IconButtonSize enums. Removed five legacy glass PNG assets.
  • Migration paths preservedSettingsService keeps _oldAccountsKeyV1..V4 migrations, app_theme.dart registers v1 theme extensions alongside v2 so unmigrated screens keep working.
  • Many issues from prior review rounds are explicitly addressed in commit messages (silent fallback removal, cache handling, locale number formatting, precision loss in fiat conversion, etc.).

Recommendation

Request changes to fix the formatting bug in transaction_detail_sheet.dart:121 — that one is user-visible and definitely a regression. Items 2–5 should also be addressed before merge given the project's "fail early" and DRY rules. The minor items (6–10) are reasonable as follow-up tickets.

Per your rule, I haven't posted anything to GitHub. Want me to leave inline comments on the PR, or wait for your sign-off first?

@n13

n13 commented May 4, 2026

Copy link
Copy Markdown
Collaborator

5, and 10 do not need to be fixed

The rest should be fixed, they're all pretty small and simple

dewabisma and others added 3 commits May 4, 2026 14:24
The catch (_) silently swallowed parse failures, violating the project's
"fail early / no fallback code" rule. Round-trip is now stable after the
exchange-rate fiat rounding fix, so any genuine failure should surface.
@n13

n13 commented May 4, 2026

Copy link
Copy Markdown
Collaborator

Re-review of PR #473 — Design update v3 (after 8f1a5e09)

All originally-flagged blockers are now resolved

# Issue Status
1 Critical: broken '$formattingService).formatBalance(...)' interpolation Fixed in 11366cc
2 Unawaited RecentAddressesService().addAddress(...) Fixed — wrapped in unawaited(...catchError)
3 DRY: _shortenAddress duplicating AddressFormattingService Fixedtx_item.dart:131 uses the shared service
6 _isUpdatingProgrammatically reentrancy flag Fixed — replaced with onChanged: _onAmountChanged. Bonus: btnDisabled now respects _isFetchingFee too
7 Round-trip drift for non-clean-divisor rates Fixedconvert() rounds to fiat.decimals; test asserts second round-trip is identical
8 _processIntentIfAvailable() called from build() Fixed — replaced with the canonical ref.listen(...) pattern
9 Raw exception leaked to UI FixeddebugPrint for the engineer, "Failed submitting transaction" for the user
Silent catch (_) introduced in _toggleFlip Fixed in 8f1a5e09 — try/catch removed; round-trip is now provably stable, so any genuine failure surfaces

Issue 4 (architectural inconsistency) — partially addressed, low-priority follow-up

receive_screen.dart and select_recipient_screen.dart migrated to providers (and a new recentAddressesServiceProvider was added). Two files still keep direct new Service() instantiation:

  final _checksumService = HumanReadableChecksumService();
    try {
      final settings = SettingsService();
      final account = (await settings.getActiveRegularAccount())!;
      ...
      unawaited(
        RecentAddressesService()
            .addAddress(widget.recipientAddress.trim())
            .catchError((Object e) => debugPrint('Failed to save recent address: $e')),
      );

Both are already ConsumerStatefulWidget, so the swap is one-line each:

  • input_amount_screen.dartref.read(humanReadableChecksumServiceProvider) inside initState/where it's used
  • review_send_screen.dartref.read(settingsServiceProvider) and ref.read(recentAddressesServiceProvider)

Not a blocker — happy to leave as a follow-up since the rest of the new code is consistent and the functional behaviour is correct.

Items 5 and 10 — explicitly waived

Per your earlier comment ("5, and 10 do not need to be fixed"). Untouched:

  • (await ...getActiveAccount())! null-bang in receive/review flows
  • Hardcoded quanToUsdRate = 1 (testnet placeholder, has a TODO)

Recommendation

LGTM — approve. The redesign is large but the engineering hygiene is solid: clean ref.listen migration, provably-stable round-trip math with locked-in tests, fail-early discipline restored, and the user-visible critical bug is gone. Issue 4's two remaining direct-instantiation spots are minor consistency cleanup that can land in a follow-up PR.

Per your rule, no GitHub comments posted — say the word if you want me to drop this on the PR or just reply to dewabisma.

@n13 n13 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

GTG now

@dewabisma dewabisma merged commit aa2b725 into main May 4, 2026
1 check passed
@dewabisma dewabisma deleted the feat/v3 branch June 22, 2026 03:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants