Skip to content

Feat/ts12 payments#492

Open
Wicpar wants to merge 16 commits intoanimo:feat/ts12-paymentsfrom
APTITUDE-Consortium:feat/ts12-payments
Open

Feat/ts12 payments#492
Wicpar wants to merge 16 commits intoanimo:feat/ts12-paymentsfrom
APTITUDE-Consortium:feat/ts12-payments

Conversation

@Wicpar
Copy link
Copy Markdown
Contributor

@Wicpar Wicpar commented Feb 27, 2026

1. DC API flow and selection handling

  • Added support for multiple presentation/VCI handling.
  • Fixed issuance flow behavior.
  • Improved request parsing/selection deduction via dcApi request payload handling.
  • Refreshed credential providers on app foreground for better runtime consistency.
  • Vendored DC API matcher packages and updated dependency/path handling.

2. Credential/agent correctness

  • Fixed SD-JWT PID ordering for QES/payment scenarios.
  • Updated agent image/base64 handling to use Expo File API.

3. TS12 UX improvements

  • Made transaction slides scrollable.
  • Improved table row density/fallback layout behavior for long claim data.
  • Removed dev-only hardcoded TS12 test rows from tables.
  • Auto-approved TS12 payment transaction entries and skipped explicit payment review step.

4. Minor polish

  • Fixed OID4VCI release icon issue.

Replace deprecated expo-file-system readAsStringAsync usage with new File(asset.localUri).base64() in DC API registration image handling.
Add an internal ScrollView to TS12 base slide so long content does not overflow, keep footer actions pinned, improve payment header wrapping, and add __DEV__ table test rows (short/one-line/multiline).
For horizontal table rows, keep dense key/value when it fits, switch to stacked layout when rendered content wraps, keep right-side value box intrinsic-width and right-aligned, and justify text in fallback mode.

useEffect(() => {
const handleAppStateChange = (nextAppState: AppStateStatus) => {
if (nextAppState === 'active') {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Why do we need this?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This was required as the DC API VCI flow did not update the store in the main activity on all androids, this ensures that does not happen

Comment on lines +269 to +271
} catch {
return await readAssetAsBase64(logger, asset)
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

This catch is kinda useless right as the outer catch does the same?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

i haven't had time to review all the trash code myself, i will spend time to clean up all these features in the near future

try {
const base64 = await new File(asset.localUri).base64()
if (!base64) return undefined
const mime = getImageMimeFromUri(asset.localUri)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Why do we load from uri instead of the file itself?

Not all images have extension

import { isParadymWallet } from '@easypid/hooks/useFeatureFlag'
import { commonMessages } from '@package/translations'
import { sanitizeString } from '@package/utils'
import { ImageFormat, Skia } from '@shopify/react-native-skia'
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I think we can remove the dependency as well then?

Comment on lines +236 to +249
onLayout={(event) => {
if (!scrollViewHeight) setScrollViewHeight(event.nativeEvent.layout.height)
}}
btw="$0.5"
borderColor={isScrolledByOffset ? '$grey-200' : '$background'}
>
<ScrollView
onScroll={handleScroll}
scrollEventThrottle={scrollEventThrottle}
contentContainerStyle={{ gap: '$4' }}
px="$4"
mx="$-4"
pt="$4"
maxHeight={scrollViewHeight}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Why do we need the onLayout and scrollViewHeight. Usually dynamic height for the component is better (so not setting max height but relying on flex)

variant === 'horizontal' && typeof horizontalAttribute === 'string' && typeof horizontalValue === 'string'

useEffect(() => {
if (variant === 'horizontal') {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Why do we need all this complexity? In main we have added a way to collapse long attribute rows, can we use that instead? Can we simplify this a bit (e.g. just normal and compact layout options)

step: `ts12-payment-${index}`,
progress,
screen: (
<Ts12PaymentSlide
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

We don't use this slide anymore then?

I think in general we should restructure the flow to just show everything on a single page, and you can click to see more detail for each (qes, payments, credentials).

That's a bigger refactor, and we should make in main first.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

this is temporary and depends on the Matcher, the matcher should be able to display the payment, and if it does this screen shouldn't be shown

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