refactor: remove all any types, add strict GraphQL scalar typing
All checks were successful
Build Docker Image / build (push) Successful in 4m3s
All checks were successful
Build Docker Image / build (push) Successful in 4m3s
- 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.
This commit is contained in:
@@ -26,8 +26,8 @@
|
||||
<template v-else>
|
||||
<Grid v-if="products.length" :cols="1" :md="2" :lg="3" :gap="4">
|
||||
<Card
|
||||
v-for="product in products"
|
||||
:key="product.uuid"
|
||||
v-for="(product, index) in products"
|
||||
:key="product.uuid ?? index"
|
||||
padding="lg"
|
||||
class="cursor-pointer hover:shadow-md transition-shadow"
|
||||
@click="selectProduct(product)"
|
||||
@@ -51,7 +51,9 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { GetProductsDocument } from '~/composables/graphql/public/exchange-generated'
|
||||
import { GetProductsDocument, type GetProductsQueryResult } from '~/composables/graphql/public/exchange-generated'
|
||||
|
||||
type Product = NonNullable<NonNullable<GetProductsQueryResult['getProducts']>[number]>
|
||||
|
||||
definePageMeta({
|
||||
layout: 'topnav',
|
||||
@@ -62,7 +64,7 @@ const localePath = useLocalePath()
|
||||
const { t } = useI18n()
|
||||
const { execute } = useGraphQL()
|
||||
|
||||
const products = ref<any[]>([])
|
||||
const products = ref<Product[]>([])
|
||||
const isLoading = ref(true)
|
||||
const hasError = ref(false)
|
||||
const error = ref('')
|
||||
@@ -73,19 +75,19 @@ const loadProducts = async () => {
|
||||
hasError.value = false
|
||||
const { data, error: productsError } = await useServerQuery('offers-new-products', GetProductsDocument, {}, 'public', 'exchange')
|
||||
if (productsError.value) throw productsError.value
|
||||
products.value = data.value?.getProducts || []
|
||||
} catch (err: any) {
|
||||
products.value = (data.value?.getProducts || []).filter((p): p is Product => p !== null)
|
||||
} catch (err: unknown) {
|
||||
hasError.value = true
|
||||
error.value = err.message || t('offersNew.errors.load_failed')
|
||||
error.value = err instanceof Error ? err.message : t('offersNew.errors.load_failed')
|
||||
products.value = []
|
||||
} finally {
|
||||
isLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
const selectProduct = (product: any) => {
|
||||
const selectProduct = (product: { uuid?: string | null }) => {
|
||||
// Navigate to product details page
|
||||
navigateTo(localePath(`/clientarea/offers/${product.uuid}`))
|
||||
if (product.uuid) navigateTo(localePath(`/clientarea/offers/${product.uuid}`))
|
||||
}
|
||||
|
||||
await loadProducts()
|
||||
|
||||
Reference in New Issue
Block a user