feat: in-app citizenship application with referral system

- Add CitizenshipBottomSheet with form (name, father, grandfather, mother, tribe, region)
- Submit apply_for_citizenship extrinsic with referrer parameter to People Chain
- Query KYC status from IdentityKyc pallet and show appropriate UI state
- Referrer approval: query Referral + Applications entries, approve pending referrals
- Sign (confirm_citizenship) for applicants after referrer approval
- Share referral link for citizens to invite others
- Dashboard buttons adapt to citizenship status (hide Apply/Sign when approved)
- Balance check (1.1 HEZ) only before new applications, not for sign/approve
- i18n strings for en, tr, ku
This commit is contained in:
2026-02-22 05:04:43 +03:00
parent f6dc35b80e
commit 771c9c8877
18 changed files with 1157 additions and 20 deletions
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke
android:width="1dp"
android:color="#80FFFFFF" />
<corners android:radius="4dp" />
<padding
android:left="12dp"
android:right="12dp"
android:top="4dp"
android:bottom="4dp" />
</shape>
@@ -0,0 +1,224 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:id="@+id/citizenshipTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/citizenship_title"
android:textColor="@android:color/white"
android:textSize="18sp"
android:textStyle="bold"
android:gravity="center"
android:layout_marginBottom="12dp" />
<TextView
android:id="@+id/citizenshipStatusText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:textSize="14sp"
android:gravity="center"
android:visibility="gone"
android:layout_marginBottom="12dp" />
<ScrollView
android:id="@+id/citizenshipFormScroll"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fillViewport="true">
<LinearLayout
android:id="@+id/citizenshipFormContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/citizenshipNameLayout"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:hint="@string/citizenship_name"
app:boxStrokeColor="@android:color/white"
app:hintTextColor="@android:color/white">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/citizenshipNameInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:inputType="textPersonName" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/citizenshipFatherNameLayout"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:hint="@string/citizenship_father_name"
app:boxStrokeColor="@android:color/white"
app:hintTextColor="@android:color/white">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/citizenshipFatherNameInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:inputType="textPersonName" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/citizenshipGrandfatherNameLayout"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:hint="@string/citizenship_grandfather_name"
app:boxStrokeColor="@android:color/white"
app:hintTextColor="@android:color/white">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/citizenshipGrandfatherNameInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:inputType="textPersonName" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/citizenshipMotherNameLayout"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:hint="@string/citizenship_mother_name"
app:boxStrokeColor="@android:color/white"
app:hintTextColor="@android:color/white">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/citizenshipMotherNameInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:inputType="textPersonName" />
</com.google.android.material.textfield.TextInputLayout>
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/citizenshipTribeLayout"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:hint="@string/citizenship_tribe"
app:boxStrokeColor="@android:color/white"
app:hintTextColor="@android:color/white">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/citizenshipTribeInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:inputType="text" />
</com.google.android.material.textfield.TextInputLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/citizenship_region"
android:textColor="#B0BEC5"
android:textSize="12sp"
android:layout_marginBottom="4dp" />
<Spinner
android:id="@+id/citizenshipRegionSpinner"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginBottom="12dp"
android:background="@drawable/bg_spinner_outlined"
android:paddingStart="12dp"
android:paddingEnd="12dp" />
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/citizenshipReferrerLayout"
style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:hint="@string/citizenship_referrer_hint"
app:boxStrokeColor="@android:color/white"
app:hintTextColor="@android:color/white">
<com.google.android.material.textfield.TextInputEditText
android:id="@+id/citizenshipReferrerInput"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/white"
android:inputType="text"
android:textSize="12sp" />
</com.google.android.material.textfield.TextInputLayout>
</LinearLayout>
</ScrollView>
<ProgressBar
android:id="@+id/citizenshipProgress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone" />
<com.google.android.material.button.MaterialButton
android:id="@+id/citizenshipActionButton"
style="@style/Widget.Nova.MaterialButton.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/citizenship_apply"
android:textAllCaps="false" />
<com.google.android.material.button.MaterialButton
android:id="@+id/citizenshipShareButton"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/citizenship_share_button"
android:textAllCaps="false"
android:textColor="@android:color/white"
app:strokeColor="@android:color/white"
android:visibility="gone" />
<!-- Invitations list (visible only for citizens) -->
<TextView
android:id="@+id/citizenshipInvitationsHeader"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:textColor="#B0BEC5"
android:textSize="13sp"
android:textStyle="bold"
android:visibility="gone" />
<ScrollView
android:id="@+id/citizenshipInvitationsScroll"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:layout_marginTop="8dp"
android:visibility="gone">
<LinearLayout
android:id="@+id/citizenshipInvitationsList"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" />
</ScrollView>
</LinearLayout>
@@ -96,25 +96,38 @@
</LinearLayout>
</LinearLayout>
<!-- Info text -->
<TextView
android:id="@+id/pezkuwiDashboardInfo"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/pezkuwi_dashboard_info"
android:textColor="#CFD8DC"
android:textSize="11sp"
android:lineSpacingExtra="2dp" />
<!-- Action button -->
<!-- Action buttons: Kesk (green), Sor (red), Zer (yellow) -->
<com.google.android.material.button.MaterialButton
android:id="@+id/pezkuwiDashboardBasvuruButton"
style="@style/Widget.Nova.MaterialButton.Primary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="@string/pezkuwi_dashboard_basvuru"
android:textAllCaps="false" />
android:textAllCaps="false"
android:textColor="@android:color/white"
app:backgroundTint="#4CAF50"
app:cornerRadius="8dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/pezkuwiDashboardSignButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/citizenship_sign"
android:textAllCaps="false"
android:textColor="@android:color/white"
app:backgroundTint="#E53935"
app:cornerRadius="8dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/pezkuwiDashboardShareButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="6dp"
android:text="@string/citizenship_share_button"
android:textAllCaps="false"
android:textColor="#212121"
app:backgroundTint="#FDD835"
app:cornerRadius="8dp" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>