Merge pull request #1751 from selfxyz/staging

Release to Production v2.9.15 - 2026-02-15
This commit is contained in:
Justin Hernandez
2026-02-16 02:47:08 -08:00
committed by GitHub
779 changed files with 26800 additions and 2619 deletions

58
.github/workflows/kmp-ci.yml vendored Normal file
View File

@@ -0,0 +1,58 @@
name: KMP CI
permissions:
contents: read
on:
pull_request:
paths: ["packages/kmp-sdk/**", "packages/kmp-test-app/**"]
push:
branches: [dev, staging, main]
paths: ["packages/kmp-sdk/**", "packages/kmp-test-app/**"]
jobs:
kmp-sdk-tests:
runs-on: ubuntu-latest
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-sdk
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- run: ./gradlew :shared:jvmTest
- uses: actions/upload-artifact@v4
if: always()
with:
name: kmp-sdk-test-results
path: packages/kmp-sdk/shared/build/reports/tests/
kmp-test-app-tests:
runs-on: ubuntu-latest
timeout-minutes: 60
defaults:
run:
working-directory: packages/kmp-test-app
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: ./.github/actions/cache-gradle
- uses: gradle/actions/setup-gradle@v4
with:
cache-disabled: true
- run: ./gradlew :composeApp:testDebugUnitTest
- uses: actions/upload-artifact@v4
if: always()
with:
name: kmp-test-app-test-results
path: packages/kmp-test-app/composeApp/build/reports/tests/

View File

@@ -712,6 +712,7 @@ jobs:
SEGMENT_KEY: ${{ secrets.SEGMENT_KEY }}
SELFXYZ_APP_TOKEN: ${{ steps.github-token.outputs.token }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SUMSUB_TEE_URL: ${{ secrets.SUMSUB_TEE_URL }}
TURNKEY_AUTH_PROXY_CONFIG_ID: ${{ secrets.TURNKEY_AUTH_PROXY_CONFIG_ID }}
TURNKEY_GOOGLE_CLIENT_ID: ${{ secrets.TURNKEY_GOOGLE_CLIENT_ID }}
TURNKEY_ORGANIZATION_ID: ${{ secrets.TURNKEY_ORGANIZATION_ID }}
@@ -1170,6 +1171,7 @@ jobs:
NODE_OPTIONS: "--max-old-space-size=6144"
SEGMENT_KEY: ${{ secrets.SEGMENT_KEY }}
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
SUMSUB_TEE_URL: ${{ secrets.SUMSUB_TEE_URL }}
TURNKEY_AUTH_PROXY_CONFIG_ID: ${{ secrets.TURNKEY_AUTH_PROXY_CONFIG_ID }}
TURNKEY_GOOGLE_CLIENT_ID: ${{ secrets.TURNKEY_GOOGLE_CLIENT_ID }}
TURNKEY_ORGANIZATION_ID: ${{ secrets.TURNKEY_ORGANIZATION_ID }}

View File

@@ -13,8 +13,8 @@ on:
- "contracts/package.json"
workflow_dispatch:
inputs:
strict_mode:
description: "Fail workflow on publish errors (false = continue on error)"
dry_run:
description: "Run publish with --dry-run"
required: false
type: boolean
default: false
@@ -23,18 +23,9 @@ permissions:
id-token: write # Required for OIDC
contents: read
# Error Handling Strategy:
# - STRICT_PUBLISH_MODE controls whether publish failures stop the workflow
# - Current (false): continue-on-error=true, workflow always succeeds
# - Target (true): continue-on-error=false, fail on real errors (expired tokens, network issues)
# - Manual override: Use workflow_dispatch with strict_mode input to test
# TODO: Set STRICT_PUBLISH_MODE=true once NPM token is rotated and verified
env:
STRICT_PUBLISH_MODE: false
jobs:
detect-changes:
runs-on: ubuntu-latest
runs-on: ubuntu-slim
outputs:
core_changed: ${{ steps.check-version.outputs.core_changed }}
qrcode_changed: ${{ steps.check-version.outputs.qrcode_changed }}
@@ -101,37 +92,50 @@ jobs:
run: |
yarn workspace @selfxyz/core build:deps
- name: Check NPM Token
id: check-token
- name: Check version not already published
id: check_version
working-directory: sdk/core
run: |
if [ -z "${{ secrets.NPM_TOKEN }}" ]; then
echo "⚠️ Warning: NPM_TOKEN is not set. Skipping publish."
echo "token_available=false" >> $GITHUB_OUTPUT
else
echo "token_available=true" >> $GITHUB_OUTPUT
NAME=$(node -p "require('./package.json').name")
VERSION=$(node -p "require('./package.json').version")
if npm view "$NAME@$VERSION" version 2>/dev/null; then
echo "::error::Version $VERSION of $NAME is already published on npm. Bump the version in package.json to publish."
exit 1
fi
- name: Publish to npm
if: steps.check-token.outputs.token_available == 'true'
- name: "Pack with yarn (resolves workspace: protocol)"
working-directory: sdk/core
run: yarn pack --out package.tgz
- name: Publish to npm
working-directory: sdk/core
continue-on-error: ${{ github.event.inputs.strict_mode != 'true' && env.STRICT_PUBLISH_MODE != 'true' }}
id: publish
run: |
yarn config set npmPublishAccess public
yarn npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
DRY_RUN="${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }}"
VERSION=$(node -p "require('./package.json').version")
TAG=$([[ "$VERSION" == *-* ]] && echo "--tag beta" || echo "")
npx npm@latest publish package.tgz --access public $TAG $DRY_RUN
- name: Publish result
if: always()
run: |
if [ "${{ steps.check-token.outputs.token_available }}" != "true" ]; then
echo "::warning::NPM publish skipped - NPM_TOKEN not configured. Please rotate the token in repository secrets."
elif [ "${{ steps.publish.outcome }}" != "success" ]; then
echo "::warning::NPM publish failed - This may be due to an expired or invalid NPM_TOKEN. Please check and rotate the token."
OUTCOME="${{ steps.publish.outcome }}"
DRY_RUN="${{ github.event.inputs.dry_run }}"
CHECK_OUTCOME="${{ steps.check_version.outcome }}"
if [ "$OUTCOME" = "success" ]; then
if [ "$DRY_RUN" = "true" ]; then
echo "✅ Dry run completed (no package uploaded)"
else
echo "✅ Package published successfully"
fi
elif [ "$OUTCOME" = "skipped" ]; then
if [ "$CHECK_OUTCOME" = "failure" ]; then
echo "::warning::Publish skipped: this version is already published on npm. Bump the version in package.json to publish."
else
echo "::warning::Publish step was skipped (e.g. an earlier step failed)."
fi
else
echo "✅ Package published successfully"
echo "::warning::NPM publish failed. For @selfxyz/core we use Trusted Publishers (OIDC); check workflow and npm package settings."
fi
publish-qrcode:
@@ -153,37 +157,50 @@ jobs:
run: |
yarn workspace @selfxyz/qrcode build:deps
- name: Check NPM Token
id: check-token
- name: Check version not already published
id: check_version
working-directory: sdk/qrcode
run: |
if [ -z "${{ secrets.NPM_TOKEN }}" ]; then
echo "⚠️ Warning: NPM_TOKEN is not set. Skipping publish."
echo "token_available=false" >> $GITHUB_OUTPUT
else
echo "token_available=true" >> $GITHUB_OUTPUT
NAME=$(node -p "require('./package.json').name")
VERSION=$(node -p "require('./package.json').version")
if npm view "$NAME@$VERSION" version 2>/dev/null; then
echo "::error::Version $VERSION of $NAME is already published on npm. Bump the version in package.json to publish."
exit 1
fi
- name: Publish to npm
if: steps.check-token.outputs.token_available == 'true'
- name: "Pack with yarn (resolves workspace: protocol)"
working-directory: sdk/qrcode
run: yarn pack --out package.tgz
- name: Publish to npm
working-directory: sdk/qrcode
continue-on-error: ${{ github.event.inputs.strict_mode != 'true' && env.STRICT_PUBLISH_MODE != 'true' }}
id: publish
run: |
yarn config set npmPublishAccess public
yarn npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
DRY_RUN="${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }}"
VERSION=$(node -p "require('./package.json').version")
TAG=$([[ "$VERSION" == *-* ]] && echo "--tag beta" || echo "")
npx npm@latest publish package.tgz --access public $TAG $DRY_RUN
- name: Publish result
if: always()
run: |
if [ "${{ steps.check-token.outputs.token_available }}" != "true" ]; then
echo "::warning::NPM publish skipped - NPM_TOKEN not configured. Please rotate the token in repository secrets."
elif [ "${{ steps.publish.outcome }}" != "success" ]; then
echo "::warning::NPM publish failed - This may be due to an expired or invalid NPM_TOKEN. Please check and rotate the token."
OUTCOME="${{ steps.publish.outcome }}"
DRY_RUN="${{ github.event.inputs.dry_run }}"
CHECK_OUTCOME="${{ steps.check_version.outcome }}"
if [ "$OUTCOME" = "success" ]; then
if [ "$DRY_RUN" = "true" ]; then
echo "✅ Dry run completed (no package uploaded)"
else
echo "✅ Package published successfully"
fi
elif [ "$OUTCOME" = "skipped" ]; then
if [ "$CHECK_OUTCOME" = "failure" ]; then
echo "::warning::Publish skipped: this version is already published on npm. Bump the version in package.json to publish."
else
echo "::warning::Publish step was skipped (e.g. an earlier step failed)."
fi
else
echo "✅ Package published successfully"
echo "::warning::NPM publish failed. For @selfxyz/qrcode we use Trusted Publishers (OIDC); check workflow and npm package settings."
fi
publish-common:
@@ -204,37 +221,50 @@ jobs:
run: |
yarn workspace @selfxyz/common build
- name: Check NPM Token
id: check-token
- name: Check version not already published
id: check_version
working-directory: common
run: |
if [ -z "${{ secrets.NPM_TOKEN }}" ]; then
echo "⚠️ Warning: NPM_TOKEN is not set. Skipping publish."
echo "token_available=false" >> $GITHUB_OUTPUT
else
echo "token_available=true" >> $GITHUB_OUTPUT
NAME=$(node -p "require('./package.json').name")
VERSION=$(node -p "require('./package.json').version")
if npm view "$NAME@$VERSION" version 2>/dev/null; then
echo "::error::Version $VERSION of $NAME is already published on npm. Bump the version in package.json to publish."
exit 1
fi
- name: Publish to npm
if: steps.check-token.outputs.token_available == 'true'
- name: "Pack with yarn (resolves workspace: protocol)"
working-directory: common
run: yarn pack --out package.tgz
- name: Publish to npm
working-directory: common
continue-on-error: ${{ github.event.inputs.strict_mode != 'true' && env.STRICT_PUBLISH_MODE != 'true' }}
id: publish
run: |
yarn config set npmPublishAccess public
yarn npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
DRY_RUN="${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }}"
VERSION=$(node -p "require('./package.json').version")
TAG=$([[ "$VERSION" == *-* ]] && echo "--tag beta" || echo "")
npx npm@latest publish package.tgz --access public $TAG $DRY_RUN
- name: Publish result
if: always()
run: |
if [ "${{ steps.check-token.outputs.token_available }}" != "true" ]; then
echo "::warning::NPM publish skipped - NPM_TOKEN not configured. Please rotate the token in repository secrets."
elif [ "${{ steps.publish.outcome }}" != "success" ]; then
echo "::warning::NPM publish failed - This may be due to an expired or invalid NPM_TOKEN. Please check and rotate the token."
OUTCOME="${{ steps.publish.outcome }}"
DRY_RUN="${{ github.event.inputs.dry_run }}"
CHECK_OUTCOME="${{ steps.check_version.outcome }}"
if [ "$OUTCOME" = "success" ]; then
if [ "$DRY_RUN" = "true" ]; then
echo "✅ Dry run completed (no package uploaded)"
else
echo "✅ Package published successfully"
fi
elif [ "$OUTCOME" = "skipped" ]; then
if [ "$CHECK_OUTCOME" = "failure" ]; then
echo "::warning::Publish skipped: this version is already published on npm. Bump the version in package.json to publish."
else
echo "::warning::Publish step was skipped (e.g. an earlier step failed)."
fi
else
echo "✅ Package published successfully"
echo "::warning::NPM publish failed. For @selfxyz/common we use Trusted Publishers (OIDC); check workflow and npm package settings."
fi
publish-contracts:
needs: detect-changes
@@ -252,37 +282,51 @@ jobs:
- name: Build package
run: |
yarn workspace @selfxyz/contracts build
- name: Check NPM Token
id: check-token
- name: Check version not already published
id: check_version
working-directory: contracts
run: |
if [ -z "${{ secrets.NPM_TOKEN }}" ]; then
echo "⚠️ Warning: NPM_TOKEN is not set. Skipping publish."
echo "token_available=false" >> $GITHUB_OUTPUT
else
echo "token_available=true" >> $GITHUB_OUTPUT
NAME=$(node -p "require('./package.json').name")
VERSION=$(node -p "require('./package.json').version")
if npm view "$NAME@$VERSION" version 2>/dev/null; then
echo "::error::Version $VERSION of $NAME is already published on npm. Bump the version in package.json to publish."
exit 1
fi
- name: Publish to npm
if: steps.check-token.outputs.token_available == 'true'
- name: "Pack with yarn (resolves workspace: protocol)"
working-directory: contracts
run: yarn pack --out package.tgz
- name: Publish to npm
working-directory: contracts
continue-on-error: ${{ github.event.inputs.strict_mode != 'true' && env.STRICT_PUBLISH_MODE != 'true' }}
id: publish
run: |
yarn config set npmPublishAccess public
yarn npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
DRY_RUN="${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }}"
VERSION=$(node -p "require('./package.json').version")
TAG=$([[ "$VERSION" == *-* ]] && echo "--tag beta" || echo "")
npx npm@latest publish package.tgz --access public $TAG $DRY_RUN
- name: Publish result
if: always()
run: |
if [ "${{ steps.check-token.outputs.token_available }}" != "true" ]; then
echo "::warning::NPM publish skipped - NPM_TOKEN not configured. Please rotate the token in repository secrets."
elif [ "${{ steps.publish.outcome }}" != "success" ]; then
echo "::warning::NPM publish failed - This may be due to an expired or invalid NPM_TOKEN. Please check and rotate the token."
OUTCOME="${{ steps.publish.outcome }}"
DRY_RUN="${{ github.event.inputs.dry_run }}"
CHECK_OUTCOME="${{ steps.check_version.outcome }}"
if [ "$OUTCOME" = "success" ]; then
if [ "$DRY_RUN" = "true" ]; then
echo "✅ Dry run completed (no package uploaded)"
else
echo "✅ Package published successfully"
fi
elif [ "$OUTCOME" = "skipped" ]; then
if [ "$CHECK_OUTCOME" = "failure" ]; then
echo "::warning::Publish skipped: this version is already published on npm. Bump the version in package.json to publish."
else
echo "::warning::Publish step was skipped (e.g. an earlier step failed)."
fi
else
echo "✅ Package published successfully"
echo "::warning::NPM publish failed. For @selfxyz/contracts we use Trusted Publishers (OIDC); check workflow and npm package settings."
fi
publish-qrcode-angular:
needs: detect-changes
@@ -303,37 +347,50 @@ jobs:
run: |
yarn workspace @selfxyz/qrcode-angular build:deps
- name: Check NPM Token
id: check-token
- name: Check version not already published
id: check_version
working-directory: sdk/qrcode-angular
run: |
if [ -z "${{ secrets.NPM_TOKEN }}" ]; then
echo "⚠️ Warning: NPM_TOKEN is not set. Skipping publish."
echo "token_available=false" >> $GITHUB_OUTPUT
else
echo "token_available=true" >> $GITHUB_OUTPUT
NAME=$(node -p "require('./package.json').name")
VERSION=$(node -p "require('./package.json').version")
if npm view "$NAME@$VERSION" version 2>/dev/null; then
echo "::error::Version $VERSION of $NAME is already published on npm. Bump the version in package.json to publish."
exit 1
fi
- name: Publish to npm
if: steps.check-token.outputs.token_available == 'true'
- name: "Pack with yarn (resolves workspace: protocol)"
working-directory: sdk/qrcode-angular
run: yarn pack --out package.tgz
- name: Publish to npm
working-directory: sdk/qrcode-angular
continue-on-error: ${{ github.event.inputs.strict_mode != 'true' && env.STRICT_PUBLISH_MODE != 'true' }}
id: publish
run: |
yarn config set npmPublishAccess public
yarn npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
DRY_RUN="${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }}"
VERSION=$(node -p "require('./package.json').version")
TAG=$([[ "$VERSION" == *-* ]] && echo "--tag beta" || echo "")
npx npm@latest publish package.tgz --access public $TAG $DRY_RUN
- name: Publish result
if: always()
run: |
if [ "${{ steps.check-token.outputs.token_available }}" != "true" ]; then
echo "::warning::NPM publish skipped - NPM_TOKEN not configured. Please rotate the token in repository secrets."
elif [ "${{ steps.publish.outcome }}" != "success" ]; then
echo "::warning::NPM publish failed - This may be due to an expired or invalid NPM_TOKEN. Please check and rotate the token."
OUTCOME="${{ steps.publish.outcome }}"
DRY_RUN="${{ github.event.inputs.dry_run }}"
CHECK_OUTCOME="${{ steps.check_version.outcome }}"
if [ "$OUTCOME" = "success" ]; then
if [ "$DRY_RUN" = "true" ]; then
echo "✅ Dry run completed (no package uploaded)"
else
echo "✅ Package published successfully"
fi
elif [ "$OUTCOME" = "skipped" ]; then
if [ "$CHECK_OUTCOME" = "failure" ]; then
echo "::warning::Publish skipped: this version is already published on npm. Bump the version in package.json to publish."
else
echo "::warning::Publish step was skipped (e.g. an earlier step failed)."
fi
else
echo "✅ Package published successfully"
echo "::warning::NPM publish failed. For @selfxyz/qrcode-angular we use Trusted Publishers (OIDC); check workflow and npm package settings."
fi
publish-msdk:
@@ -356,35 +413,30 @@ jobs:
yarn workspace @selfxyz/common build
yarn workspace @selfxyz/mobile-sdk-alpha build
- name: Check NPM Token
id: check-token
run: |
if [ -z "${{ secrets.NPM_TOKEN }}" ]; then
echo "⚠️ Warning: NPM_TOKEN is not set. Skipping publish."
echo "token_available=false" >> $GITHUB_OUTPUT
else
echo "token_available=true" >> $GITHUB_OUTPUT
fi
- name: "Pack with yarn (resolves workspace: protocol)"
working-directory: packages/mobile-sdk-alpha
run: yarn pack --out package.tgz
- name: Publish to npm
if: steps.check-token.outputs.token_available == 'true'
working-directory: packages/mobile-sdk-alpha
continue-on-error: ${{ github.event.inputs.strict_mode != 'true' && env.STRICT_PUBLISH_MODE != 'true' }}
id: publish
run: |
yarn config set npmPublishAccess restricted
yarn npm publish --access restricted --tag alpha
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
NPM_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
DRY_RUN="${{ github.event.inputs.dry_run == 'true' && '--dry-run' || '' }}"
npx npm@latest publish package.tgz --access restricted --tag alpha $DRY_RUN
- name: Publish result
if: always()
run: |
if [ "${{ steps.check-token.outputs.token_available }}" != "true" ]; then
echo "::warning::NPM publish skipped - NPM_TOKEN not configured. Please rotate the token in repository secrets."
elif [ "${{ steps.publish.outcome }}" != "success" ]; then
echo "::warning::NPM publish failed - This may be due to an expired or invalid NPM_TOKEN. Please check and rotate the token."
OUTCOME="${{ steps.publish.outcome }}"
DRY_RUN="${{ github.event.inputs.dry_run }}"
if [ "$OUTCOME" = "success" ]; then
if [ "$DRY_RUN" = "true" ]; then
echo "✅ Dry run completed (no package uploaded)"
else
echo "✅ Package published successfully"
fi
elif [ "$OUTCOME" = "skipped" ]; then
echo "::warning::Publish step was skipped (e.g. an earlier step failed)."
else
echo "✅ Package published successfully"
echo "::warning::NPM publish failed. For @selfxyz/mobile-sdk-alpha we use Trusted Publishers (OIDC); check workflow and npm package settings."
fi

View File

@@ -91,6 +91,12 @@ jobs:
- name: Install Dependencies
uses: ./.github/actions/yarn-install
- name: Install SwiftLint
run: |
curl -sL "https://github.com/realm/SwiftLint/releases/download/0.57.1/swiftlint_linux.zip" -o /tmp/swiftlint.zip
unzip -o /tmp/swiftlint.zip -d /tmp/swiftlint
sudo install /tmp/swiftlint/swiftlint /usr/local/bin/swiftlint
- name: Build workspace dependencies
run: yarn build

2
.gitignore vendored
View File

@@ -12,8 +12,8 @@ showcase
output/*
*.tsbuildinfo
.yarnrc.yml
.giga/tasks/*
package-lock.json
.claude
# CI-generated tarballs (don't commit these!)
mobile-sdk-alpha-ci.tgz

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -8,11 +8,12 @@ gem "cocoapods", ">= 1.13", "!= 1.15.0", "!= 1.15.1"
gem "activesupport", ">= 6.1.7.5", "!= 7.1.0"
# Add fastlane for CI/CD
gem "fastlane", "~> 2.230.0"
gem "fastlane", "~> 2.232.0"
group :development do
gem "dotenv"
gem "nokogiri", "~> 1.18", platform: :ruby
gem "bundler-audit", "~> 0.9", require: false
end
plugins_path = File.join(File.dirname(__FILE__), "fastlane", "Pluginfile")

View File

@@ -45,6 +45,9 @@ GEM
base64 (0.2.0)
benchmark (0.5.0)
bigdecimal (4.0.1)
bundler-audit (0.9.3)
bundler (>= 1.2.0)
thor (~> 1.0)
claide (1.1.0)
cocoapods (1.16.2)
addressable (~> 2.8)
@@ -130,15 +133,16 @@ GEM
faraday_middleware (1.2.1)
faraday (~> 1.0)
fastimage (2.4.0)
fastlane (2.230.0)
fastlane (2.232.1)
CFPropertyList (>= 2.3, < 4.0.0)
abbrev (~> 0.1.2)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
aws-sdk-s3 (~> 1.0)
aws-sdk-s3 (~> 1.197)
babosa (>= 1.0.3, < 2.0.0)
base64 (~> 0.2.0)
bundler (>= 1.12.0, < 3.0.0)
benchmark (>= 0.1.0)
bundler (>= 1.17.3, < 5.0.0)
colored (~> 1.2)
commander (~> 4.6)
csv (~> 3.3)
@@ -153,7 +157,7 @@ GEM
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
google-cloud-env (>= 1.6.0, < 2.0.0)
google-cloud-env (>= 1.6.0, <= 2.1.1)
google-cloud-storage (~> 1.31)
highline (~> 2.0)
http-cookie (~> 1.0.5)
@@ -166,6 +170,7 @@ GEM
naturally (~> 2.2)
nkf (~> 0.2.0)
optparse (>= 0.1.1, < 1.0.0)
ostruct (>= 0.1.0)
plist (>= 3.1.0, < 4.0.0)
rubyzip (>= 2.0.0, < 3.0.0)
security (= 0.1.5)
@@ -186,38 +191,40 @@ GEM
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-core (0.11.3)
google-apis-androidpublisher_v3 (0.96.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-core (0.18.0)
addressable (~> 2.5, >= 2.5.1)
googleauth (>= 0.16.2, < 2.a)
httpclient (>= 2.8.1, < 3.a)
googleauth (~> 1.9)
httpclient (>= 2.8.3, < 3.a)
mini_mime (~> 1.0)
mutex_m
representable (~> 3.0)
retriable (>= 2.0, < 4.a)
rexml
google-apis-iamcredentials_v1 (0.17.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-playcustomapp_v1 (0.13.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-storage_v1 (0.31.0)
google-apis-core (>= 0.11.0, < 2.a)
google-apis-iamcredentials_v1 (0.26.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-playcustomapp_v1 (0.17.0)
google-apis-core (>= 0.15.0, < 2.a)
google-apis-storage_v1 (0.60.0)
google-apis-core (>= 0.15.0, < 2.a)
google-cloud-core (1.8.0)
google-cloud-env (>= 1.0, < 3.a)
google-cloud-errors (~> 1.0)
google-cloud-env (1.6.0)
faraday (>= 0.17.3, < 3.0)
google-cloud-env (2.1.1)
faraday (>= 1.0, < 3.a)
google-cloud-errors (1.5.0)
google-cloud-storage (1.47.0)
google-cloud-storage (1.58.0)
addressable (~> 2.8)
digest-crc (~> 0.4)
google-apis-iamcredentials_v1 (~> 0.1)
google-apis-storage_v1 (~> 0.31.0)
google-apis-core (>= 0.18, < 2)
google-apis-iamcredentials_v1 (~> 0.18)
google-apis-storage_v1 (>= 0.42)
google-cloud-core (~> 1.6)
googleauth (>= 0.16.2, < 2.a)
googleauth (~> 1.9)
mini_mime (~> 1.0)
googleauth (1.8.1)
faraday (>= 0.17.3, < 3.a)
googleauth (1.11.2)
faraday (>= 1.0, < 3.a)
google-cloud-env (~> 2.1)
jwt (>= 1.4, < 3.0)
multi_json (~> 1.11)
os (>= 0.9, < 2.0)
@@ -253,6 +260,7 @@ GEM
racc (~> 1.4)
optparse (0.8.1)
os (1.1.4)
ostruct (0.6.3)
plist (3.7.2)
prism (1.9.0)
public_suffix (4.0.7)
@@ -282,6 +290,7 @@ GEM
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
thor (1.5.0)
trailblazer-option (0.1.2)
tty-cursor (0.7.1)
tty-screen (0.8.2)
@@ -311,9 +320,10 @@ PLATFORMS
DEPENDENCIES
activesupport (>= 6.1.7.5, != 7.1.0)
bundler-audit (~> 0.9)
cocoapods (>= 1.13, != 1.15.1, != 1.15.0)
dotenv
fastlane (~> 2.230.0)
fastlane (~> 2.232.0)
fastlane-plugin-increment_version_code
fastlane-plugin-versioning_android
nokogiri (~> 1.18)

View File

@@ -134,8 +134,8 @@ android {
applicationId "com.proofofpassportapp"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 140
versionName "2.9.15"
versionCode 142
versionName "2.9.16"
manifestPlaceholders = [appAuthRedirectScheme: 'com.proofofpassportapp']
externalNativeBuild {
cmake {

View File

@@ -19,6 +19,8 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
<!-- Remove FOREGROUND_SERVICE_MICROPHONE merged in by Sumsub SDK (VideoIdent is disabled) -->
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" tools:node="remove" />
<application
android:name=".MainApplication"

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -21,7 +21,7 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2.9.15</string>
<string>2.9.16</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>

View File

@@ -547,7 +547,7 @@
"$(PROJECT_DIR)",
"$(PROJECT_DIR)/MoproKit/Libs",
);
MARKETING_VERSION = 2.9.15;
MARKETING_VERSION = 2.9.16;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",
@@ -688,7 +688,7 @@
"$(PROJECT_DIR)",
"$(PROJECT_DIR)/MoproKit/Libs",
);
MARKETING_VERSION = 2.9.15;
MARKETING_VERSION = 2.9.16;
OTHER_LDFLAGS = (
"$(inherited)",
"-ObjC",

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,6 +1,6 @@
{
"name": "@selfxyz/mobile-app",
"version": "2.9.15",
"version": "2.9.16",
"private": true,
"type": "module",
"scripts": {

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
@@ -17,8 +17,8 @@ if (!platform || !['android', 'ios'].includes(platform)) {
// Bundle size thresholds in MB - easy to update!
const BUNDLE_THRESHOLDS_MB = {
// TODO: fix temporary bundle bump
ios: 45,
android: 45,
ios: 46,
android: 46,
};
function formatBytes(bytes) {

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,5 +1,5 @@
#!/usr/bin/env node
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 222 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 220 KiB

View File

@@ -0,0 +1,14 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_0_4)">
<path d="M9.0025 6.9075H9C7.84434 6.9075 6.9075 7.84434 6.9075 9V9.0025C6.9075 10.1582 7.84434 11.095 9 11.095H9.0025C10.1582 11.095 11.095 10.1582 11.095 9.0025V9C11.095 7.84434 10.1582 6.9075 9.0025 6.9075Z" fill="white"/>
<g>
<path d="M4.895 7.0625C4.895 5.82 5.9025 4.8125 7.145 4.8125H11.49L16.3025 0H4.305L0 4.305V11.3875H4.895V7.06V7.0625Z" fill="white"/>
<path d="M13.105 6.595V10.7725C13.105 12.015 12.0975 13.0225 10.855 13.0225H6.6775L1.6975 18.0025H13.695L18 13.6975V6.5975H13.105V6.595Z" fill="white"/>
</g>
</g>
<defs>
<clipPath id="clip0_0_4">
<rect width="18" height="18" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 808 B

View File

@@ -0,0 +1,56 @@
<svg preserveAspectRatio="none" width="100%" height="100%" overflow="visible" style="display: block;" viewBox="0 0 491 264.194" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group">
<path id="Vector" d="M0.5 132.07C0.5 307.642 245.5 307.496 245.5 132.07C245.5 -43.3565 490.5 -43.3565 490.5 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_2" d="M4.90808 132.07C4.90808 304.484 245.506 304.343 245.506 132.07C245.506 -40.2042 486.103 -40.2042 486.103 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_3" d="M9.46289 132.07C9.46289 301.326 245.653 301.191 245.653 132.07C245.653 -37.0518 481.843 -37.0518 481.843 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_4" d="M13.5996 132.07C13.5996 298.174 245.387 298.039 245.387 132.07C245.387 -33.8995 477.175 -33.8995 477.175 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_5" d="M18.1142 132.07C18.1142 295.016 245.5 294.886 245.5 132.07C245.5 -30.7472 472.885 -30.7472 472.885 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_6" d="M22.5166 132.07C22.5166 291.863 245.5 291.734 245.5 132.07C245.5 -27.595 468.483 -27.595 468.483 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_7" d="M27.0439 132.069C27.0439 288.705 245.619 288.575 245.619 132.069C245.619 -24.4371 464.195 -24.4371 464.195 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_8" d="M31.1807 132.069C31.1807 285.552 245.354 285.423 245.354 132.069C245.354 -21.2848 459.527 -21.2848 459.527 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_9" d="M35.7315 132.069C35.7315 282.394 245.502 282.271 245.502 132.069C245.502 -18.1324 455.273 -18.1324 455.273 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_10" d="M40.1348 132.069C40.1348 279.236 245.503 279.119 245.503 132.069C245.503 -14.9801 450.872 -14.9801 450.872 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_11" d="M44.54 132.069C44.54 276.084 245.501 275.966 245.501 132.069C245.501 -11.8278 446.461 -11.8278 446.461 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_12" d="M49.1064 132.069C49.1064 272.926 245.665 272.814 245.665 132.069C245.665 -8.67544 442.223 -8.67544 442.223 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_13" d="M53.2432 132.069C53.2432 269.773 245.399 269.662 245.399 132.069C245.399 -5.52311 437.555 -5.52311 437.555 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_14" d="M57.7471 132.07C57.7471 266.616 245.501 266.504 245.501 132.07C245.501 -2.36442 433.255 -2.36442 433.255 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_15" d="M62.1533 132.07C62.1533 263.463 245.505 263.352 245.505 132.07C245.505 0.787918 428.856 0.787918 428.856 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_16" d="M66.6875 132.07C66.6875 260.305 245.631 260.199 245.631 132.07C245.631 3.94025 424.575 3.94025 424.575 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_17" d="M70.8242 132.07C70.8242 257.147 245.366 257.047 245.366 132.07C245.366 7.09259 419.907 7.09259 419.907 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_18" d="M75.3604 132.07C75.3604 253.995 245.5 253.895 245.5 132.07C245.5 10.2449 415.639 10.2449 415.639 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_19" d="M79.7666 132.07C79.7666 250.836 245.503 250.743 245.503 132.07C245.503 13.3973 411.24 13.3973 411.24 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_20" d="M84.2686 132.07C84.2686 247.684 245.598 247.59 245.598 132.07C245.598 16.5496 406.927 16.5496 406.927 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_21" d="M88.4053 132.07C88.4053 244.526 245.332 244.438 245.332 132.07C245.332 19.7019 402.259 19.7019 402.259 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_22" d="M92.8867 132.069C92.8867 241.373 245.411 241.279 245.411 132.069C245.411 22.8597 397.936 22.8597 397.936 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_23" d="M97.376 132.069C97.376 238.215 245.498 238.127 245.498 132.069C245.498 26.012 393.62 26.012 393.62 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_24" d="M101.786 132.07C101.786 235.057 245.501 234.975 245.501 132.07C245.501 29.1643 389.215 29.1643 389.215 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_25" d="M106.331 132.07C106.331 231.905 245.643 231.822 245.643 132.07C245.643 32.3167 384.956 32.3167 384.956 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_26" d="M110.468 132.07C110.468 228.746 245.378 228.67 245.378 132.07C245.378 35.469 380.288 35.469 380.288 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_27" d="M114.993 132.069C114.993 225.594 245.501 225.518 245.501 132.069C245.501 38.6212 376.008 38.6212 376.008 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_28" d="M119.399 132.069C119.399 222.436 245.499 222.365 245.499 132.069C245.499 41.7735 371.599 41.7735 371.599 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_29" d="M123.912 132.069C123.912 219.283 245.61 219.207 245.61 132.069C245.61 44.9314 367.307 44.9314 367.307 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_30" d="M128.049 132.069C128.049 216.125 245.344 216.055 245.344 132.069C245.344 48.0837 362.639 48.0837 362.639 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_31" d="M132.606 132.069C132.606 212.967 245.499 212.902 245.499 132.069C245.499 51.2361 358.392 51.2361 358.392 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_32" d="M137.013 132.069C137.013 209.815 245.503 209.75 245.503 132.069C245.503 54.3884 353.994 54.3884 353.994 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_33" d="M141.423 132.069C141.423 206.656 245.506 206.598 245.506 132.069C245.506 57.5407 349.589 57.5407 349.589 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_34" d="M145.975 132.069C145.975 203.504 245.655 203.445 245.655 132.069C245.655 60.6931 345.336 60.6931 345.336 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_35" d="M150.111 132.069C150.111 200.346 245.39 200.293 245.39 132.069C245.39 63.8454 340.668 63.8454 340.668 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_36" d="M154.626 132.07C154.626 197.194 245.502 197.135 245.502 132.07C245.502 67.0041 336.378 67.0041 336.378 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_37" d="M159.033 132.07C159.033 194.036 245.501 193.983 245.501 132.07C245.501 70.1564 331.97 70.1564 331.97 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_38" d="M163.556 132.07C163.556 190.878 245.622 190.831 245.622 132.07C245.622 73.3088 327.688 73.3088 327.688 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_39" d="M167.692 132.07C167.692 187.726 245.356 187.679 245.356 132.07C245.356 76.4611 323.02 76.4611 323.02 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_40" d="M172.243 132.07C172.243 184.567 245.505 184.526 245.505 132.07C245.505 79.6134 318.766 79.6134 318.766 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_41" d="M176.646 132.07C176.646 181.415 245.5 181.374 245.5 132.07C245.5 82.7658 314.354 82.7658 314.354 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_42" d="M181.052 132.07C181.052 178.257 245.503 178.222 245.503 132.07C245.503 85.9181 309.955 85.9181 309.955 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_43" d="M185.618 132.07C185.618 175.105 245.667 175.069 245.667 132.07C245.667 89.0704 305.716 89.0704 305.716 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_44" d="M189.755 132.069C189.755 171.946 245.402 171.911 245.402 132.069C245.402 92.2282 301.049 92.2282 301.049 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_45" d="M194.263 132.069C194.263 168.788 245.503 168.758 245.503 132.069C245.503 95.3805 296.742 95.3805 296.742 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_46" d="M198.661 132.07C198.661 165.636 245.498 165.606 245.498 132.07C245.498 98.5329 292.335 98.5329 292.335 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_47" d="M203.199 132.069C203.199 162.477 245.634 162.454 245.634 132.069C245.634 101.685 288.068 101.685 288.068 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_48" d="M207.336 132.07C207.336 159.325 245.368 159.302 245.368 132.07C245.368 104.838 283.4 104.838 283.4 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_49" d="M211.872 132.07C211.872 156.167 245.502 156.149 245.502 132.07C245.502 107.99 279.132 107.99 279.132 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_50" d="M216.282 132.07C216.282 153.015 245.504 152.997 245.504 132.07C245.504 111.142 274.727 111.142 274.727 132.07" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_51" d="M220.78 132.069C220.78 149.856 245.6 149.838 245.6 132.069C245.6 114.3 270.42 114.3 270.42 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
<path id="Vector_52" d="M224.917 132.069C224.917 146.698 245.335 146.686 245.335 132.069C245.335 117.452 265.752 117.452 265.752 132.069" stroke="#6366F1" stroke-miterlimit="10"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1,12 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_inactive)">
<path d="M16.0044 12.28H16C13.9455 12.28 12.28 13.9455 12.28 16V16.0044C12.28 18.0589 13.9455 19.7244 16 19.7244H16.0044C18.0589 19.7244 19.7244 18.0589 19.7244 16.0044V16C19.7244 13.9455 18.0589 12.28 16.0044 12.28Z" fill="#DC2626"/>
<path d="M8.70222 12.5556C8.70222 10.3467 10.4933 8.55556 12.7022 8.55556H20.4267L28.9822 0H7.65333L0 7.65333V20.2444H8.70222V12.5511V12.5556Z" fill="#DC2626"/>
<path d="M23.2978 11.7244V19.1511C23.2978 21.36 21.5067 23.1511 19.2978 23.1511H11.8711L3.01778 32.0044H24.3467L32 24.3511V11.7289H23.2978V11.7244Z" fill="#DC2626"/>
</g>
<defs>
<clipPath id="clip0_inactive">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 809 B

View File

@@ -0,0 +1,12 @@
<svg width="18" height="18" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_pending)">
<path d="M16.0044 12.28H16C13.9455 12.28 12.28 13.9455 12.28 16V16.0044C12.28 18.0589 13.9455 19.7244 16 19.7244H16.0044C18.0589 19.7244 19.7244 18.0589 19.7244 16.0044V16C19.7244 13.9455 18.0589 12.28 16.0044 12.28Z" fill="white"/>
<path d="M8.70222 12.5556C8.70222 10.3467 10.4933 8.55556 12.7022 8.55556H20.4267L28.9822 0H7.65333L0 7.65333V20.2444H8.70222V12.5511V12.5556Z" fill="white"/>
<path d="M23.2978 11.7244V19.1511C23.2978 21.36 21.5067 23.1511 19.2978 23.1511H11.8711L3.01778 32.0044H24.3467L32 24.3511V11.7289H23.2978V11.7244Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_pending">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 801 B

View File

@@ -0,0 +1,12 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_0_742)">
<path d="M16.0044 12.28H16C13.9455 12.28 12.28 13.9455 12.28 16V16.0044C12.28 18.0589 13.9455 19.7244 16 19.7244H16.0044C18.0589 19.7244 19.7244 18.0589 19.7244 16.0044V16C19.7244 13.9455 18.0589 12.28 16.0044 12.28Z" fill="#D1D5DB"/>
<path d="M8.70222 12.5556C8.70222 10.3467 10.4933 8.55556 12.7022 8.55556H20.4267L28.9822 0H7.65333L0 7.65333V20.2444H8.70222V12.5511V12.5556Z" fill="#D1D5DB"/>
<path d="M23.2978 11.7244V19.1511C23.2978 21.36 21.5067 23.1511 19.2978 23.1511H11.8711L3.01778 32.0044H24.3467L32 24.3511V11.7289H23.2978V11.7244Z" fill="#D1D5DB"/>
</g>
<defs>
<clipPath id="clip0_0_742">
<rect width="32" height="32" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 803 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -0,0 +1,154 @@
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
import type { FC } from 'react';
import React from 'react';
import { Image } from 'react-native';
import { Text, XStack, YStack } from 'tamagui';
import {
black,
gray400,
slate200,
slate300,
white,
} from '@selfxyz/mobile-sdk-alpha/constants/colors';
import { dinot } from '@selfxyz/mobile-sdk-alpha/constants/fonts';
import SelfLogoUnverified from '@/assets/images/self_logo_unverified.svg';
import WavePatternBody from '@/assets/images/wave_pattern_body.png';
import { cardStyles } from '@/components/homescreen/cardStyles';
import { useCardDimensions } from '@/hooks/useCardDimensions';
interface EmptyIdCardProps {
onRegisterPress: () => void;
}
/**
* Empty state card shown when user has no registered documents.
* Matches Figma design exactly:
* - White header with gray Self logo and "NO IDENTITY FOUND" text
* - Solid gray divider line
* - White body with gray wave pattern (from original unverified_human.png)
* - Pill-shaped white button with gray border
*/
const EmptyIdCard: FC<EmptyIdCardProps> = ({ onRegisterPress }) => {
const {
cardWidth,
borderRadius,
scale,
headerHeight,
figmaPadding,
logoSize,
headerGap,
expandedAspectRatio,
fontSize,
} = useCardDimensions();
return (
<YStack width="100%" alignItems="center" justifyContent="center">
<YStack
width={cardWidth}
aspectRatio={expandedAspectRatio}
borderRadius={borderRadius}
overflow="hidden"
borderWidth={1}
borderColor="#E5E7EB"
backgroundColor={white}
marginBottom={8}
>
{/* Header Section - White background with bottom border */}
<YStack
height={headerHeight}
padding={figmaPadding}
backgroundColor={white}
justifyContent="center"
borderBottomWidth={2}
borderBottomColor={slate300}
>
{/* Content row */}
<XStack flex={1} alignItems="center">
{/* Logo + Text */}
<XStack alignItems="center" gap={headerGap} flex={1}>
{/* Self logo (gray) - exact Figma asset */}
<YStack
width={logoSize}
height={logoSize}
alignItems="center"
justifyContent="center"
>
<SelfLogoUnverified width={logoSize} height={logoSize} />
</YStack>
{/* Text container */}
<YStack gap={2}>
<Text
fontFamily={dinot}
fontSize={fontSize.header}
fontWeight="500"
color={black}
textTransform="uppercase"
lineHeight={fontSize.header * 1.1}
>
NO IDENTITY FOUND
</Text>
<Text
fontFamily={dinot}
fontSize={fontSize.subtitle}
color={gray400}
letterSpacing={0.7}
textTransform="uppercase"
>
NO IDENTITY FOUND
</Text>
</YStack>
</XStack>
</XStack>
</YStack>
{/* Body Section - White background with wave pattern */}
<YStack style={[cardStyles.body, { backgroundColor: white }]}>
{/* Wave pattern background - exact same as unverified_human.png */}
<Image
source={WavePatternBody}
style={cardStyles.wavePattern}
resizeMode="cover"
/>
{/* Register button - pill-shaped with gray border */}
<YStack
position="absolute"
bottom={figmaPadding}
left={figmaPadding}
right={figmaPadding}
>
<YStack
backgroundColor={white}
borderWidth={1}
borderColor={slate200}
borderRadius={9999}
paddingVertical={8 * scale}
paddingHorizontal={20 * scale}
alignItems="center"
justifyContent="center"
onPress={onRegisterPress}
pressStyle={{ opacity: 0.7 }}
>
<Text
fontFamily={dinot}
fontSize={fontSize.button}
fontWeight="500"
color={black}
textAlign="center"
>
Register a new ID
</Text>
</YStack>
</YStack>
</YStack>
</YStack>
</YStack>
);
};
export default EmptyIdCard;

View File

@@ -0,0 +1,145 @@
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
import type { FC } from 'react';
import React from 'react';
import { Image } from 'react-native';
import { Text, XStack, YStack } from 'tamagui';
import {
black,
gray400,
red600,
white,
} from '@selfxyz/mobile-sdk-alpha/constants/colors';
import { dinot } from '@selfxyz/mobile-sdk-alpha/constants/fonts';
import SelfLogoInactive from '@/assets/images/self_logo_inactive.svg';
import WavePatternBody from '@/assets/images/wave_pattern_body.png';
import { cardStyles } from '@/components/homescreen/cardStyles';
import { useCardDimensions } from '@/hooks/useCardDimensions';
/**
* Expired state card shown when user's identity document has expired.
* Matches Figma design exactly:
* - White header with red Self logo and "EXPIRED ID" text
* - Red divider line
* - White body with gray wave pattern
* - Black "EXPIRED ID" badge in bottom right
*/
const ExpiredIdCard: FC = () => {
const {
cardWidth,
borderRadius,
scale,
headerHeight,
figmaPadding,
logoSize,
headerGap,
expandedAspectRatio,
fontSize,
} = useCardDimensions();
return (
<YStack width="100%" alignItems="center" justifyContent="center">
<YStack
width={cardWidth}
aspectRatio={expandedAspectRatio}
borderRadius={borderRadius}
overflow="hidden"
borderWidth={1}
borderColor="#E5E7EB"
backgroundColor={white}
marginBottom={8}
shadowColor="#000"
shadowOffset={{ width: 0, height: 44 }}
shadowOpacity={0.25}
shadowRadius={68}
elevation={12}
>
{/* Header Section - White background with red divider */}
<YStack
height={headerHeight}
padding={figmaPadding}
backgroundColor={white}
justifyContent="center"
borderBottomWidth={2}
borderBottomColor={red600}
>
{/* Content row */}
<XStack flex={1} alignItems="center">
{/* Logo + Text */}
<XStack alignItems="center" gap={headerGap} flex={1}>
{/* Red Self logo (reuses inactive logo) */}
<YStack
width={logoSize}
height={logoSize}
alignItems="center"
justifyContent="center"
>
<SelfLogoInactive width={logoSize} height={logoSize} />
</YStack>
{/* Text container */}
<YStack gap={2}>
<Text
fontFamily={dinot}
fontSize={fontSize.header}
fontWeight="500"
color={red600}
textTransform="uppercase"
lineHeight={fontSize.header * 1.1}
>
EXPIRED ID
</Text>
<Text
fontFamily={dinot}
fontSize={fontSize.subtitle}
color={gray400}
letterSpacing={0.7}
textTransform="uppercase"
>
TIME TO REGISTER A VALID COPY
</Text>
</YStack>
</XStack>
</XStack>
</YStack>
{/* Body Section - White background with wave pattern */}
<YStack style={cardStyles.body}>
{/* Wave pattern background */}
<Image
source={WavePatternBody}
style={cardStyles.wavePattern}
resizeMode="cover"
/>
{/* Expired badge - bottom right (black background) */}
<YStack
position="absolute"
bottom={figmaPadding}
right={figmaPadding}
backgroundColor={black}
borderRadius={30}
paddingHorizontal={8 * scale}
paddingVertical={4 * scale}
>
<Text
fontFamily={dinot}
fontSize={fontSize.badge}
fontWeight="500"
color={white}
letterSpacing={0.6}
textTransform="uppercase"
>
EXPIRED ID
</Text>
</YStack>
</YStack>
</YStack>
</YStack>
);
};
export default ExpiredIdCard;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,298 @@
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
import type { FC } from 'react';
import React from 'react';
import { Image, View } from 'react-native';
import LinearGradient from 'react-native-linear-gradient';
import { Text, XStack, YStack } from 'tamagui';
import { deserializeApplicantInfo } from '@selfxyz/common';
import { commonNames } from '@selfxyz/common/constants/countries';
import type { KycData } from '@selfxyz/common/utils/types';
import { RoundFlag } from '@selfxyz/mobile-sdk-alpha/components';
import { white } from '@selfxyz/mobile-sdk-alpha/constants/colors';
import { dinot, plexMono } from '@selfxyz/mobile-sdk-alpha/constants/fonts';
import CardBackgroundId1 from '@/assets/images/card_background_id1.png';
import SelfLogoPending from '@/assets/images/self_logo_pending.svg';
import { cardStyles } from '@/components/homescreen/cardStyles';
import { useCardDimensions } from '@/hooks/useCardDimensions';
interface KycIdCardProps {
idDocument: KycData;
selected: boolean;
hidden: boolean;
}
/**
* Maps KYC idType to display title.
* idType values from Sumsub: "drivers_licence", "passport", "NATIONAL ID", etc.
*/
function getKycDocTitle(idType: string): string {
const normalized = idType
.toLowerCase()
.replace(/[_\s]+/g, ' ')
.trim();
if (normalized.includes('driver')) return 'DRIVERS LICENSE';
if (normalized.includes('passport')) return 'PASSPORT';
if (normalized.includes('national')) return 'NATIONAL ID';
if (normalized.includes('residence')) return 'RESIDENCE PERMIT';
return 'ID CARD';
}
/**
* Derives a demonym-like adjective from the country code.
* Falls back to the country code if no mapping found.
*/
function getCountryAdjective(countryCode: string): string {
const name = commonNames[countryCode as keyof typeof commonNames];
if (!name) return countryCode;
const demonyms: Record<string, string> = {
USA: 'US',
GBR: 'UK',
CAN: 'CANADIAN',
AUS: 'AUSTRALIAN',
IND: 'INDIAN',
DEU: 'GERMAN',
FRA: 'FRENCH',
JPN: 'JAPANESE',
KOR: 'KOREAN',
BRA: 'BRAZILIAN',
MEX: 'MEXICAN',
ITA: 'ITALIAN',
ESP: 'SPANISH',
NLD: 'DUTCH',
PRT: 'PORTUGUESE',
CHN: 'CHINESE',
RUS: 'RUSSIAN',
KEN: 'KENYAN',
NGA: 'NIGERIAN',
ZAF: 'SOUTH AFRICAN',
SGP: 'SINGAPOREAN',
MYS: 'MALAYSIAN',
PHL: 'PHILIPPINE',
IDN: 'INDONESIAN',
THA: 'THAI',
VNM: 'VIETNAMESE',
ARE: 'UAE',
SAU: 'SAUDI',
EGY: 'EGYPTIAN',
TUR: 'TURKISH',
POL: 'POLISH',
SWE: 'SWEDISH',
NOR: 'NORWEGIAN',
DNK: 'DANISH',
FIN: 'FINNISH',
CHE: 'SWISS',
AUT: 'AUSTRIAN',
BEL: 'BELGIAN',
IRL: 'IRISH',
NZL: 'NEW ZEALAND',
ARG: 'ARGENTINE',
COL: 'COLOMBIAN',
PER: 'PERUVIAN',
CHL: 'CHILEAN',
};
return demonyms[countryCode] || name.toUpperCase();
}
/**
* KYC document card - matches IdCard design exactly but shows "STANDARD" badge.
* Used for documents verified through Sumsub KYC flow (drivers license, etc.).
*/
const KycIdCard: FC<KycIdCardProps> = ({
idDocument,
selected,
hidden: _hidden,
}) => {
// Extract KYC fields from serialized applicant info with error handling
let country = '';
let idType = '';
let idNumber = '';
try {
const applicantInfo = deserializeApplicantInfo(
idDocument.serializedApplicantInfo,
);
country = applicantInfo.country || '';
idType = applicantInfo.idType || '';
idNumber = applicantInfo.idNumber || '';
} catch (error) {
console.error(
'[KycIdCard] Failed to deserialize applicant info, using fallback values:',
error,
);
// Fallback to safe defaults - component will render generic "ID CARD" display
}
const docTitle = getKycDocTitle(idType);
const countryAdj = getCountryAdjective(country);
const {
cardWidth,
cardHeight,
borderRadius,
headerHeight,
figmaPadding,
logoSize,
headerGap,
fontSize,
} = useCardDimensions(selected);
const padding = cardWidth * 0.04;
// Get truncated ID for display (e.g., "0xD123..345")
const getTruncatedId = (): string => {
if (idNumber && idNumber.length > 10) {
return `0x${idNumber.slice(0, 4)}..${idNumber.slice(-3)}`;
}
return idNumber ? `0x${idNumber}` : '';
};
const truncatedId = getTruncatedId();
// Header title (e.g., "DRIVERS LICENSE")
const headerTitle = docTitle;
// Subtitle text (e.g., "VERIFIED US DRIVERS LICENSE")
const subtitleText = `VERIFIED ${countryAdj} ${docTitle}`;
// Bottom label (e.g., "US DRIVERS LICENSE")
const bottomLabel = `${countryAdj} ${docTitle}`;
return (
<YStack width="100%" alignItems="center" justifyContent="center">
<YStack
width={cardWidth}
height={cardHeight}
borderRadius={borderRadius}
overflow="hidden"
backgroundColor="#000000"
shadowColor="#000"
shadowOffset={{ width: 0, height: 4 }}
shadowOpacity={0.25}
shadowRadius={14}
elevation={8}
marginBottom={8}
alignItems="stretch"
>
{/* Header Section - Dark gradient (same as IdCard) */}
<View style={{ width: cardWidth * 1.05, height: headerHeight }}>
<LinearGradient
colors={['#000000', '#343434']}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 0 }}
style={{
flex: 1,
paddingHorizontal: figmaPadding,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
}}
>
{/* Logo + Text */}
<XStack alignItems="center" gap={headerGap}>
{/* Country flag */}
<RoundFlag countryCode={country} size={logoSize} />
{/* Text container */}
<YStack gap={2}>
<Text
fontFamily={dinot}
fontSize={fontSize.header}
fontWeight="500"
color={white}
textTransform="uppercase"
lineHeight={fontSize.header * 1.1}
>
{headerTitle}
</Text>
<Text
fontFamily={dinot}
fontSize={fontSize.subtitle}
color="#9193A2"
letterSpacing={0.7}
textTransform="uppercase"
>
{subtitleText}
</Text>
</YStack>
</XStack>
{/* Self logo on right */}
<SelfLogoPending width={logoSize * 0.56 * 5} height={logoSize} />
</LinearGradient>
</View>
{/* Body Section - Colorful wave pattern (same as IdCard real documents) */}
{selected && (
<YStack style={cardStyles.body}>
{/* Pre-composited background image (colorful gradient + chrome wave) */}
<Image
source={CardBackgroundId1}
style={cardStyles.backgroundImage}
resizeMode="cover"
/>
{/* Bottom content: Left text + Right badge */}
<XStack
position="absolute"
bottom={padding}
left={padding}
right={padding}
justifyContent="space-between"
alignItems="flex-end"
>
{/* Bottom Left: ID + Document Label */}
<YStack gap={4}>
{truncatedId ? (
<Text
fontFamily={plexMono}
fontSize={fontSize.bottomId}
color={white}
>
{truncatedId}
</Text>
) : null}
<Text
fontFamily={dinot}
fontSize={fontSize.bottomLabel}
fontWeight="500"
color={white}
textTransform="uppercase"
letterSpacing={0.6}
>
{bottomLabel}
</Text>
</YStack>
{/* STANDARD Badge - KYC documents always show STANDARD */}
<YStack
backgroundColor="rgba(0, 0, 0, 0.5)"
borderRadius={30}
paddingHorizontal={padding * 0.6}
paddingVertical={padding * 0.3}
>
<Text
fontFamily={dinot}
fontSize={fontSize.badge}
fontWeight="500"
color={white}
textTransform="uppercase"
letterSpacing={0.6}
>
STANDARD
</Text>
</YStack>
</XStack>
</YStack>
)}
</YStack>
</YStack>
);
};
export default KycIdCard;

View File

@@ -0,0 +1,161 @@
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
import type { FC } from 'react';
import React from 'react';
import { Image } from 'react-native';
import { Text, XStack, YStack } from 'tamagui';
import {
amber50,
amber200,
amber500,
amber700,
black,
gray400,
yellow50,
} from '@selfxyz/mobile-sdk-alpha/constants/colors';
import { dinot } from '@selfxyz/mobile-sdk-alpha/constants/fonts';
import SelfLogoPending from '@/assets/images/self_logo_pending.svg';
import WavePatternPending from '@/assets/images/wave_pattern_pending.png';
import { cardStyles } from '@/components/homescreen/cardStyles';
import { useCardDimensions } from '@/hooks/useCardDimensions';
interface PendingIdCardProps {
onClick?: () => void;
}
/**
* Pending state card shown when user has submitted identity for KYC verification.
* Matches Figma design exactly:
* - Amber-50 tinted header and body
* - Orange divider line
* - Orange logo circle with white Self logo
* - "IDENTITY UNDER REVIEW" title
* - Yellow "Pending" badge in bottom right
*/
const PendingIdCard: FC<PendingIdCardProps> = ({ onClick }) => {
const {
cardWidth,
borderRadius,
scale,
headerHeight,
figmaPadding,
logoSize,
headerGap,
expandedAspectRatio,
fontSize,
} = useCardDimensions();
return (
<YStack width="100%" alignItems="center" justifyContent="center">
<YStack
width={cardWidth}
aspectRatio={expandedAspectRatio}
borderRadius={borderRadius}
overflow="hidden"
borderWidth={1}
borderColor="#E5E7EB"
backgroundColor={yellow50}
marginBottom={8}
shadowColor={amber500}
shadowOffset={{ width: 0, height: 14 }}
shadowOpacity={0.25}
shadowRadius={28}
elevation={12}
onPress={onClick}
pressStyle={onClick ? { opacity: 0.7 } : undefined}
>
{/* Header Section */}
<YStack
height={headerHeight}
padding={figmaPadding}
backgroundColor={amber50}
justifyContent="center"
borderBottomWidth={2}
borderBottomColor={amber500}
>
{/* Content row */}
<XStack flex={1} alignItems="center">
{/* Logo + Text */}
<XStack alignItems="center" gap={headerGap} flex={1}>
{/* Orange circle with white Self logo */}
<YStack
width={logoSize}
height={logoSize}
borderRadius={logoSize / 2}
backgroundColor={amber500}
alignItems="center"
justifyContent="center"
overflow="hidden"
>
<SelfLogoPending
width={logoSize * 0.56}
height={logoSize * 0.56}
/>
</YStack>
{/* Text container */}
<YStack gap={2}>
<Text
fontFamily={dinot}
fontSize={fontSize.header}
fontWeight="500"
color={black}
textTransform="uppercase"
lineHeight={fontSize.header * 1.1}
>
IDENTITY UNDER REVIEW
</Text>
<Text
fontFamily={dinot}
fontSize={fontSize.subtitle}
color={gray400}
letterSpacing={0.7}
textTransform="uppercase"
>
NO IDENTITY FOUND
</Text>
</YStack>
</XStack>
</XStack>
</YStack>
{/* Body Section */}
<YStack style={cardStyles.body}>
{/* Wave pattern background */}
<Image
source={WavePatternPending}
style={cardStyles.wavePattern}
resizeMode="cover"
/>
{/* Pending badge - bottom right */}
<YStack
position="absolute"
bottom={figmaPadding}
right={figmaPadding}
backgroundColor={amber200}
borderRadius={30}
paddingHorizontal={8 * scale}
paddingVertical={4 * scale}
>
<Text
fontFamily={dinot}
fontSize={fontSize.badge}
fontWeight="500"
color={amber700}
letterSpacing={0.6}
textTransform="uppercase"
>
Pending
</Text>
</YStack>
</YStack>
</YStack>
</YStack>
);
};
export default PendingIdCard;

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -0,0 +1,160 @@
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
import type { FC } from 'react';
import React from 'react';
import { Image } from 'react-native';
import { Text, XStack, YStack } from 'tamagui';
import {
gray400,
red600,
white,
} from '@selfxyz/mobile-sdk-alpha/constants/colors';
import { dinot } from '@selfxyz/mobile-sdk-alpha/constants/fonts';
import SelfLogoInactive from '@/assets/images/self_logo_inactive.svg';
import WavePatternBody from '@/assets/images/wave_pattern_body.png';
import { cardStyles } from '@/components/homescreen/cardStyles';
import { useCardDimensions } from '@/hooks/useCardDimensions';
interface UnregisteredIdCardProps {
onRegisterPress: () => void;
}
/**
* Unregistered state card shown when user has a scanned document that
* hasn't been registered on-chain yet.
* Matches design pattern:
* - White header with red Self logo and "UNREGISTERED ID" text
* - Red divider line
* - White body with gray wave pattern
* - Full-width red pill button "Complete Registration"
*/
const UnregisteredIdCard: FC<UnregisteredIdCardProps> = ({
onRegisterPress,
}) => {
const {
cardWidth,
borderRadius,
scale,
headerHeight,
figmaPadding,
logoSize,
headerGap,
expandedAspectRatio,
fontSize,
} = useCardDimensions();
return (
<YStack width="100%" alignItems="center" justifyContent="center">
<YStack
width={cardWidth}
aspectRatio={expandedAspectRatio}
borderRadius={borderRadius}
overflow="hidden"
borderWidth={1}
borderColor="#E5E7EB"
backgroundColor={white}
marginBottom={8}
shadowColor="#000"
shadowOffset={{ width: 0, height: 44 }}
shadowOpacity={0.25}
shadowRadius={68}
elevation={12}
>
{/* Header Section - White background with red divider */}
<YStack
height={headerHeight}
padding={figmaPadding}
backgroundColor={white}
justifyContent="center"
borderBottomWidth={2}
borderBottomColor={red600}
>
{/* Content row */}
<XStack flex={1} alignItems="center">
{/* Logo + Text */}
<XStack alignItems="center" gap={headerGap} flex={1}>
{/* Red Self logo */}
<YStack
width={logoSize}
height={logoSize}
alignItems="center"
justifyContent="center"
>
<SelfLogoInactive width={logoSize} height={logoSize} />
</YStack>
{/* Text container */}
<YStack gap={2}>
<Text
fontFamily={dinot}
fontSize={fontSize.header}
fontWeight="500"
color={red600}
textTransform="uppercase"
lineHeight={fontSize.header * 1.1}
>
UNREGISTERED ID
</Text>
<Text
fontFamily={dinot}
fontSize={fontSize.subtitle}
color={gray400}
letterSpacing={0.7}
textTransform="uppercase"
>
DOCUMENT NEEDS TO FINISH REGISTRATION
</Text>
</YStack>
</XStack>
</XStack>
</YStack>
{/* Body Section - White background with wave pattern */}
<YStack style={[cardStyles.body, { backgroundColor: white }]}>
{/* Wave pattern background */}
<Image
source={WavePatternBody}
style={cardStyles.wavePattern}
resizeMode="cover"
/>
{/* Register button - full-width red pill */}
<YStack
position="absolute"
bottom={figmaPadding}
left={figmaPadding}
right={figmaPadding}
>
<YStack
backgroundColor={red600}
borderRadius={9999}
paddingVertical={8 * scale}
paddingHorizontal={20 * scale}
alignItems="center"
justifyContent="center"
onPress={onRegisterPress}
pressStyle={{ opacity: 0.7 }}
accessibilityRole="button"
accessibilityLabel="Complete Registration"
>
<Text
fontFamily={dinot}
fontSize={fontSize.button}
fontWeight="500"
color={white}
textAlign="center"
>
Complete Registration
</Text>
</YStack>
</YStack>
</YStack>
</YStack>
</YStack>
);
};
export default UnregisteredIdCard;

View File

@@ -0,0 +1,39 @@
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
import type { AadhaarData } from '@selfxyz/common';
import type { PassportData } from '@selfxyz/common/types/passport';
import { isAadhaarDocument, isMRZDocument } from '@selfxyz/common/utils/types';
export type SecurityLevel = 'HI-SECURITY' | 'LOW-SECURITY' | 'STANDARD';
/**
* Determines security badge based on document type and NFC presence.
* - KYC documents -> STANDARD (always)
* - Aadhaar -> LOW-SECURITY (always, no NFC)
* - MRZ documents (passport, ID card) -> HI-SECURITY if NFC, LOW-SECURITY otherwise
*
* NFC presence is determined by checking if dg2Hash exists and is not empty.
* dg2Hash contains the facial image data which is only available via NFC read.
*/
export function getSecurityLevel(
document: PassportData | AadhaarData,
): SecurityLevel {
if (isAadhaarDocument(document)) {
return 'LOW-SECURITY'; // Aadhaar never has NFC
}
if (isMRZDocument(document)) {
// Check if document has NFC data (dg2Hash presence indicates NFC read)
// dg2Hash contains facial image data which requires NFC to extract
const hasNfc = Boolean(
document.dg2Hash &&
Array.isArray(document.dg2Hash) &&
document.dg2Hash.length > 0,
);
return hasNfc ? 'HI-SECURITY' : 'LOW-SECURITY';
}
return 'LOW-SECURITY'; // Fallback
}

View File

@@ -0,0 +1,31 @@
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.
import { StyleSheet } from 'react-native';
export const cardStyles = StyleSheet.create({
backgroundImage: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
width: '100%',
height: '100%',
},
wavePattern: {
position: 'absolute',
top: 0,
left: 0,
right: 0,
bottom: 0,
width: '100%',
height: '100%',
},
body: {
flex: 1,
position: 'relative',
overflow: 'hidden',
},
});

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

View File

@@ -1,4 +1,4 @@
// SPDX-FileCopyrightText: 2025 Social Connect Labs, Inc.
// SPDX-FileCopyrightText: 2025-2026 Social Connect Labs, Inc.
// SPDX-License-Identifier: BUSL-1.1
// NOTE: Converts to Apache-2.0 on 2029-06-11 per LICENSE.

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