Files
webapp/app/pages/clientarea/kyc/russia.vue
Ruslan Bakiev 2dbe600d8a
All checks were successful
Build Docker Image / build (push) Successful in 4m3s
refactor: remove all any types, add strict GraphQL scalar typing
- Add strictScalars: true to codegen.ts with proper scalar mappings
  (Date, Decimal, JSONString, JSON, UUID, BigInt → string/Record)
- Replace all ref<any[]> with proper GraphQL-derived types
- Add type guards for null filtering in arrays
- Fix bugs exposed by typing (locationLatitude vs latitude, etc.)
- Add interfaces for external components (MapboxSearchBox)

This enables end-to-end type safety from GraphQL schema to frontend.
2026-01-27 11:34:12 +07:00

110 lines
3.3 KiB
Vue

<template>
<Section variant="plain">
<Stack gap="6">
<Stack gap="2">
<Stack direction="row" gap="2" align="center">
<IconCircle tone="primary">🇷🇺</IconCircle>
<Heading :level="1">{{ t('kycRussia.header.title') }}</Heading>
</Stack>
<Text tone="muted" size="base">
{{ t('kycRussia.header.subtitle') }}
</Text>
</Stack>
<Card v-if="submitting" tone="muted" padding="lg">
<Stack align="center" justify="center" gap="3">
<Spinner />
<Text tone="muted">{{ t('kycRussia.states.submitting') }}</Text>
</Stack>
</Card>
<Alert v-else-if="submitError" variant="error">
<Stack gap="2">
<Heading :level="4" weight="semibold">{{ t('kycRussia.errors.title') }}</Heading>
<Text tone="muted">{{ submitError }}</Text>
</Stack>
</Alert>
<Card v-else-if="submitSuccess" tone="muted" padding="lg">
<Stack gap="2">
<Heading :level="3" weight="semibold">{{ t('kycRussia.success.title') }}</Heading>
<Text tone="muted">
{{ t('kycRussia.success.description') }}
</Text>
<Button :as="'NuxtLink'" to="/clientarea/kyc" variant="outline">
{{ t('kycRussia.success.cta') }}
</Button>
</Stack>
</Card>
<KYCFormRussia v-else @submit="handleSubmit" />
</Stack>
</Section>
</template>
<script setup lang="ts">
import { CreateKycApplicationRussiaDocument } from '~/composables/graphql/user/kyc-generated'
definePageMeta({
layout: 'topnav',
middleware: ['auth-oidc']
})
const { mutate } = useGraphQL()
const { t } = useI18n()
const submitting = ref(false)
const submitError = ref<string | null>(null)
const submitSuccess = ref(false)
interface KycFormData {
company_name?: string
company_full_name?: string
inn?: string
kpp?: string
ogrn?: string
address?: string
bank_name?: string
bik?: string
correspondent_account?: string
contact_person?: string
contact_email?: string
contact_phone?: string
}
const handleSubmit = async (formData: KycFormData) => {
try {
submitting.value = true
submitError.value = null
const submitData = {
companyName: formData.company_name || '',
companyFullName: formData.company_full_name || '',
inn: formData.inn || '',
kpp: formData.kpp || '',
ogrn: formData.ogrn || '',
address: formData.address || '',
bankName: formData.bank_name || '',
bik: formData.bik || '',
correspondentAccount: formData.correspondent_account || '',
contactPerson: formData.contact_person || '',
contactEmail: formData.contact_email || '',
contactPhone: formData.contact_phone || '',
}
const result = await mutate(CreateKycApplicationRussiaDocument, { input: submitData }, 'user', 'kyc')
if (result.createKycApplicationRussia?.success) {
submitSuccess.value = true
setTimeout(() => navigateTo('/clientarea/kyc'), 3000)
} else {
throw new Error(t('kycRussia.errors.create_failed'))
}
} catch (err: unknown) {
submitError.value = err instanceof Error ? err.message : t('kycRussia.errors.submit_failed')
} finally {
submitting.value = false
}
}
</script>