Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
121cae4
feat: add mock document generator demo
transphorm Aug 31, 2025
64b6d74
feat: add mock document generator
transphorm Aug 31, 2025
e8a92b6
fixes
transphorm Aug 31, 2025
fd65a2c
chore: refresh workflow cache
transphorm Aug 31, 2025
373330b
update lock
transphorm Aug 31, 2025
9458b00
build
transphorm Aug 31, 2025
838467f
updates
transphorm Aug 31, 2025
53c7983
more fixes
transphorm Aug 31, 2025
b60f4ca
code rabbit feedback
transphorm Aug 31, 2025
a9b3869
compiles
transphorm Aug 31, 2025
b1f42db
save wip
transphorm Sep 1, 2025
9a05151
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 3, 2025
3d50569
updates
transphorm Sep 3, 2025
13745d2
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 4, 2025
583092c
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 8, 2025
28cd19b
merge with dev and fixes
transphorm Sep 8, 2025
eb6c3c4
fix: align hoisting and demo Jest resolver (#1003)
transphorm Sep 8, 2025
f83f57b
fix pipeline issues
transphorm Sep 8, 2025
4ccd499
chore: decouple demo app build (#1013)
transphorm Sep 8, 2025
7d920b3
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 11, 2025
435d7b4
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 11, 2025
f1d727e
updates
transphorm Sep 11, 2025
ae9ccde
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 11, 2025
d5fbc11
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 11, 2025
2194aad
remove polyfills
transphorm Sep 11, 2025
05407e8
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 12, 2025
4a63f55
update merge
transphorm Sep 12, 2025
a56067f
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 18, 2025
bd14eb3
update resolutions
transphorm Sep 18, 2025
8a360d0
update resolutions
transphorm Sep 18, 2025
dd8be49
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 19, 2025
2e3f6e7
fix merge
transphorm Sep 19, 2025
ddb5a1d
fix paths
transphorm Sep 19, 2025
c956036
save wip
transphorm Sep 19, 2025
9759064
save wip fixes rd2
transphorm Sep 19, 2025
c4a74bb
working android
transphorm Sep 19, 2025
0845890
update lock
transphorm Sep 19, 2025
7b53e42
save wip ios building
transphorm Sep 19, 2025
3d681e0
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 19, 2025
2205c3f
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 20, 2025
7235716
fix merge
transphorm Sep 20, 2025
777fa3c
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 20, 2025
aeff621
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 20, 2025
8c6ec95
readd public key
transphorm Sep 20, 2025
e634ca6
fixes
transphorm Sep 20, 2025
84adb83
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 23, 2025
9fd0260
ci fixes
transphorm Sep 23, 2025
da2fa0a
fixes
transphorm Sep 23, 2025
7c48df6
fix web building
transphorm Sep 23, 2025
5b2e922
fix ci
transphorm Sep 23, 2025
7009db0
fix tests
transphorm Sep 23, 2025
19c541b
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 23, 2025
2d1994b
update lock
transphorm Sep 23, 2025
583d48f
fix ci rd2
transphorm Sep 24, 2025
a9b3869
formatting and fix ci
transphorm Sep 24, 2025
4083909
fix
transphorm Sep 24, 2025
91b57b7
finalize ci fixes
transphorm Sep 24, 2025
b73b64d
fix tests and metro config paths for building
transphorm Sep 25, 2025
09220ed
save wip
transphorm Sep 25, 2025
76ef3a1
install missing package for pipeline
transphorm Sep 25, 2025
0205d59
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 25, 2025
6d15c19
fix wip app building
transphorm Sep 25, 2025
51c657c
wip react config
transphorm Sep 25, 2025
a202cba
save working emulator compile
transphorm Sep 25, 2025
834e29c
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 25, 2025
45871f8
first round of pr fixes and feedback
transphorm Sep 26, 2025
a12f62f
clean up demo app artifacts from sdk
transphorm Sep 26, 2025
9032caf
Add Gradle wrapper files for mobile-sdk-demo Android build
transphorm Sep 26, 2025
a36113d
codex feedback and fixes
transphorm Sep 26, 2025
cfc1d06
fix tests
transphorm Sep 26, 2025
f541535
file renames
transphorm Sep 26, 2025
77c7a42
revert back to dev
transphorm Sep 26, 2025
7063a33
add types
transphorm Sep 26, 2025
c2476cf
coderabbit fixes
transphorm Sep 26, 2025
4e24a56
fix tests
transphorm Sep 26, 2025
60e276b
fix tests
transphorm Sep 26, 2025
b97ea22
fix test
transphorm Sep 26, 2025
13c7b31
fixes
transphorm Sep 26, 2025
b68833c
fix wip coderabbit issues
transphorm Sep 26, 2025
259b5ac
coderabbit suggestions rd 2
transphorm Sep 26, 2025
af9ae80
Merge branch 'dev' into codex/ideate-mock-document-screen-for-demo-app
transphorm Sep 27, 2025
3832304
fix ci pipelines and addresss warnings
transphorm Sep 27, 2025
3225217
cr fixes
transphorm Sep 27, 2025
1550f1a
convert kebab to camelCase
transphorm Sep 27, 2025
3e336a3
save wip fixes
transphorm Sep 27, 2025
506fc03
update reinstall and lock files
transphorm Sep 27, 2025
9662f35
fixes
transphorm Sep 27, 2025
dc7232d
remove file
transphorm Sep 27, 2025
ee0e0f9
fix lint
transphorm Sep 27, 2025
083f741
fix polyfill fallback issues
transphorm Sep 27, 2025
1a90a75
ensure that mock document is not on ofac list
transphorm Sep 27, 2025
6797d47
prettier
transphorm Sep 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 27 additions & 9 deletions packages/mobile-sdk-alpha/demo-app/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,38 @@
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import React, { useState } from 'react';
import { Button, StyleSheet, Text, View } from 'react-native';

type Screen = 'home' | 'register' | 'generate' | 'prove';

function App() {
const [screen, setScreen] = useState<Screen>('home');
const [mockDocument, setMockDocument] = useState<Record<string, unknown> | null>(null);

const navigate = (next: Screen) => setScreen(next);

if (screen === 'generate') {
const GenerateMock = require('./src/GenerateMock').default;
return <GenerateMock onGenerate={setMockDocument} onNavigate={navigate} onBack={() => navigate('home')} />;
}

if (screen === 'register') {
const RegisterDocument = require('./src/RegisterDocument').default;
return <RegisterDocument document={mockDocument} onBack={() => navigate('home')} />;
}

if (screen === 'prove') {
const ProveQRCode = require('./src/ProveQRCode').default;
return <ProveQRCode document={mockDocument} onBack={() => navigate('home')} />;
}

return (
<View style={styles.container}>
<Text style={styles.title}>Self Demo App</Text>
<Text style={styles.item}>Register Document</Text>
<Text style={styles.item}>Generate Mock</Text>
<Text style={styles.item}>Prove QR Code</Text>
<Button title="Register Document" onPress={() => navigate('register')} />
<Button title="Generate Mock" onPress={() => navigate('generate')} />
<Button title="Prove QR Code" onPress={() => navigate('prove')} />
</View>
);
}
Expand All @@ -28,10 +50,6 @@ const styles = StyleSheet.create({
marginBottom: 12,
fontWeight: 'bold',
},
item: {
fontSize: 16,
marginVertical: 4,
},
});

export default App;
13 changes: 7 additions & 6 deletions packages/mobile-sdk-alpha/demo-app/__tests__/App.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@

import React from 'react';
import renderer from 'react-test-renderer';
import { Text } from 'react-native';
import { Button, Text } from 'react-native';
import App from '../App';

test('renders menu items', () => {
test('renders menu buttons', () => {
const rendered = renderer.create(<App />);
const texts = rendered.root.findAllByType(Text).map(node => React.Children.toArray(node.props.children).join(''));
const expected = ['Self Demo App', 'Register Document', 'Generate Mock', 'Prove QR Code'];
expect(texts).toEqual(expect.arrayContaining(expected));
expect(texts).toHaveLength(expected.length);
const titleNode = rendered.root.findAllByType(Text).find(node => node.props.children === 'Self Demo App');
expect(titleNode).toBeTruthy();
const buttons = rendered.root.findAllByType(Button);
const titles = buttons.map(b => b.props.title);
expect(titles).toEqual(['Register Document', 'Generate Mock', 'Prove QR Code']);
rendered.unmount();
});
3 changes: 3 additions & 0 deletions packages/mobile-sdk-alpha/demo-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@
},
"dependencies": {
"@babel/runtime": "^7.28.3",
"@react-native-picker/picker": "^2.11.1",
"@react-native/gradle-plugin": "0.76.9",
"@selfxyz/common": "workspace:*",
"@selfxyz/mobile-sdk-alpha": "workspace:*",
"react": "^18.3.1",
"react-native": "0.76.9"
},
Expand Down
153 changes: 150 additions & 3 deletions packages/mobile-sdk-alpha/demo-app/src/GenerateMock.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,154 @@
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

export default function GenerateMock() {
// TODO: implement mock generation
return null;
import React, { useState } from 'react';
import { ActivityIndicator, Button, ScrollView, StyleSheet, Switch, Text, TextInput, View } from 'react-native';
import { Picker } from '@react-native-picker/picker';

import { generateMockDocument, signatureAlgorithmToStrictSignatureAlgorithm } from '@selfxyz/mobile-sdk-alpha';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const { countryCodes } = require('@selfxyz/common/dist/cjs/src/constants/constants.cjs');

const algorithmOptions = Object.keys(signatureAlgorithmToStrictSignatureAlgorithm);
const documentTypeOptions = ['mock_passport', 'mock_id_card'] as const;
const countryOptions = Object.keys(countryCodes);

const defaultAge = '21';
const defaultExpiryYears = '5';
const defaultAlgorithm = 'sha256 rsa 65537 2048';
const defaultCountry = 'USA';
const defaultDocumentType = 'mock_passport';
const defaultOfac = true;

type Props = {
onGenerate?: (doc: Record<string, unknown>) => void;
onNavigate: (screen: 'home' | 'register' | 'prove') => void;
onBack: () => void;
};

export default function GenerateMock({ onGenerate, onNavigate, onBack }: Props) {
const [age, setAge] = useState(defaultAge);
const [expiryYears, setExpiryYears] = useState(defaultExpiryYears);
const [isInOfacList, setIsInOfacList] = useState(defaultOfac);
const [algorithm, setAlgorithm] = useState(defaultAlgorithm);
const [country, setCountry] = useState(defaultCountry);
const [documentType, setDocumentType] = useState<(typeof documentTypeOptions)[number]>(defaultDocumentType);
const [loading, setLoading] = useState(false);
const [error, setError] = useState<string | null>(null);
const [result, setResult] = useState<Record<string, unknown> | null>(null);

const reset = () => {
setAge(defaultAge);
setExpiryYears(defaultExpiryYears);
setIsInOfacList(defaultOfac);
setAlgorithm(defaultAlgorithm);
setCountry(defaultCountry);
setDocumentType(defaultDocumentType as (typeof documentTypeOptions)[number]);
setResult(null);
setError(null);
};

const handleGenerate = async () => {
setLoading(true);
setError(null);
setResult(null);
try {
const doc = await generateMockDocument({
age: Number(age),
expiryYears: Number(expiryYears),
isInOfacList,
selectedAlgorithm: algorithm,
selectedCountry: country,
selectedDocumentType: documentType,
});
setResult(doc);
onGenerate?.(doc);
} catch (e) {
setError((e as Error).message);
} finally {
setLoading(false);
}
};

return (
<ScrollView contentContainerStyle={styles.container}>
<Button title="Back" onPress={onBack} />
<Text style={styles.label}>Age</Text>
<TextInput style={styles.input} keyboardType="numeric" value={age} onChangeText={setAge} />
<Text style={styles.label}>Expiry Years</Text>
<TextInput style={styles.input} keyboardType="numeric" value={expiryYears} onChangeText={setExpiryYears} />
<View style={styles.switchRow}>
<Text style={styles.label}>OFAC Listed</Text>
<Switch value={isInOfacList} onValueChange={setIsInOfacList} />
</View>
<Text style={styles.label}>Algorithm</Text>
<Picker selectedValue={algorithm} onValueChange={(itemValue: string) => setAlgorithm(itemValue)}>
{algorithmOptions.map(alg => (
<Picker.Item label={alg} value={alg} key={alg} />
))}
</Picker>
<Text style={styles.label}>Country</Text>
<Picker selectedValue={country} onValueChange={(itemValue: string) => setCountry(itemValue)}>
{countryOptions.map(code => (
<Picker.Item label={`${code} - ${countryCodes[code as keyof typeof countryCodes]}`} value={code} key={code} />
))}
</Picker>
<Text style={styles.label}>Document Type</Text>
<Picker
selectedValue={documentType}
onValueChange={(itemValue: string) => setDocumentType(itemValue as (typeof documentTypeOptions)[number])}
>
{documentTypeOptions.map(dt => (
<Picker.Item label={dt} value={dt} key={dt} />
))}
</Picker>
<View style={styles.buttonRow}>
<Button title="Reset" onPress={reset} />
<Button title="Generate" onPress={handleGenerate} disabled={loading} />
</View>
{loading && <ActivityIndicator style={styles.spinner} />}
{error && <Text style={styles.error}>{error}</Text>}
{result ? (
<>
<Text selectable style={styles.result}>
{JSON.stringify(result, null, 2)}
</Text>
<View style={styles.navRow}>
<Button title="Register Document" onPress={() => onNavigate('register')} />
<Button title="Prove QR Code" onPress={() => onNavigate('prove')} />
</View>
</>
) : null}
</ScrollView>
);
}

const styles = StyleSheet.create({
container: { padding: 16 },
label: { marginVertical: 8, fontWeight: 'bold' },
input: {
borderWidth: 1,
borderColor: '#ccc',
padding: 8,
borderRadius: 4,
},
switchRow: {
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
marginVertical: 8,
},
buttonRow: {
flexDirection: 'row',
justifyContent: 'space-between',
marginVertical: 8,
},
navRow: {
flexDirection: 'row',
justifyContent: 'space-between',
marginTop: 16,
},
spinner: { marginVertical: 16 },
error: { color: 'red', marginTop: 16 },
result: { marginTop: 16, fontFamily: 'monospace' },
});
19 changes: 16 additions & 3 deletions packages/mobile-sdk-alpha/demo-app/src/ProveQRCode.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,20 @@
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

export default function ProveQRCode() {
// TODO: implement QR code proof
return null;
import React from 'react';
import { Button, Text, View } from 'react-native';

type Props = {
document: Record<string, unknown> | null;
onBack: () => void;
};

export default function ProveQRCode({ document, onBack }: Props) {
return (
<View>
<Text>QR code proof flow not implemented</Text>
{document && <Text selectable>{JSON.stringify(document, null, 2)}</Text>}
<Button title="Back" onPress={onBack} />
</View>
);
}
19 changes: 16 additions & 3 deletions packages/mobile-sdk-alpha/demo-app/src/RegisterDocument.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,20 @@
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

export default function RegisterDocument() {
// TODO: implement register document flow
return null;
import React from 'react';
import { Button, Text, View } from 'react-native';

type Props = {
document: Record<string, unknown> | null;
onBack: () => void;
};

export default function RegisterDocument({ document, onBack }: Props) {
return (
<View>
<Text>Register document flow not implemented</Text>
{document && <Text selectable>{JSON.stringify(document, null, 2)}</Text>}
<Button title="Back" onPress={onBack} />
</View>
);
}
15 changes: 14 additions & 1 deletion yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -4104,6 +4104,16 @@ __metadata:
languageName: node
linkType: hard

"@react-native-picker/picker@npm:^2.11.1":
version: 2.11.1
resolution: "@react-native-picker/picker@npm:2.11.1"
peerDependencies:
react: "*"
react-native: "*"
checksum: 10c0/d2e9aeb32ae80f2ab56fa025f1afd6d8ff8051e7078bfd17c6794ff0cc1538d4a2f548098826eb652e6cb64d998070b0111777c78de4dcb468cb71e7e4d93097
languageName: node
linkType: hard

"@react-native/assets-registry@npm:0.76.9":
version: 0.76.9
resolution: "@react-native/assets-registry@npm:0.76.9"
Expand Down Expand Up @@ -5193,7 +5203,7 @@ __metadata:
languageName: unknown
linkType: soft

"@selfxyz/mobile-sdk-alpha@workspace:^, @selfxyz/mobile-sdk-alpha@workspace:packages/mobile-sdk-alpha":
"@selfxyz/mobile-sdk-alpha@workspace:*, @selfxyz/mobile-sdk-alpha@workspace:^, @selfxyz/mobile-sdk-alpha@workspace:packages/mobile-sdk-alpha":
version: 0.0.0-use.local
resolution: "@selfxyz/mobile-sdk-alpha@workspace:packages/mobile-sdk-alpha"
dependencies:
Expand Down Expand Up @@ -13909,7 +13919,10 @@ __metadata:
dependencies:
"@babel/core": "npm:^7.28.3"
"@babel/runtime": "npm:^7.28.3"
"@react-native-picker/picker": "npm:^2.11.1"
"@react-native/gradle-plugin": "npm:0.76.9"
"@selfxyz/common": "workspace:*"
"@selfxyz/mobile-sdk-alpha": "workspace:*"
"@tsconfig/react-native": "npm:^3.0.6"
"@types/jest": "npm:^29.5.14"
"@types/react": "npm:^18.3.4"
Expand Down
Loading