schon/storefront/app/composables/feedbacks/useFeedbacks.ts
Alexandr SaVBaD Waltz 03dbafaf44 feat(storefront): add feedbacks query and composable for improved data handling
Introduced `GET_FEEDBACKS` GraphQL query and `useFeedbacks` composable to enable retrieval and management of feedback data. Enhanced type safety with new TypeScript interfaces for feedback responses. Updated `Product` fragment to reuse `Feedback` fragment for better modularity.

- Added `feedbacks.ts` query file with `GET_FEEDBACKS`.
- Created `useFeedbacks.ts` composable for reactive feedback fetching and state management.
- Updated GraphQL fragments and `products.fragment.ts` to include `Feedback` reusability.
- Enhanced API type definitions with `IFeedbacksResponse` for response handling.

This improves modularity, type safety, and provides a reusable approach for feedback data integration. No breaking changes.
2026-03-02 13:56:51 +03:00

87 lines
2.1 KiB
TypeScript

import { GET_FEEDBACKS } from '@graphql/queries/standalone/feedbacks';
import type {IFeedback, IFeedbacksResponse} from '@types';
interface IFeedbackArgs {
feedbackAfter?: string;
feedbackOrderBy?: string;
feedbackUuid?: string;
productUuid?: string;
userUuid?: string;
}
interface IFeedbackVars {
feedbackFirst: number;
feedbackAfter?: string;
feedbackOrderBy?: string;
feedbackUuid?: string;
productUuid?: string;
userUuid?: string;
}
export function useBrands(args: IFeedbackArgs = {}) {
const variables = reactive<IFeedbackVars>({
feedbackFirst: 3,
feedbackAfter: args.feedbackAfter,
feedbackOrderBy: args.feedbackOrderBy,
feedbackUuid: args.feedbackUuid,
productUuid: args.productUuid,
userUuid: args.userUuid,
});
const pending = ref(false);
const feedbacks = ref<IFeedback[]>([]);
const pageInfo = ref<{
hasNextPage: boolean;
endCursor: string;
}>({
hasNextPage: false,
endCursor: '',
});
const error = ref<string | null>(null);
const getFeedbacks = async (): Promise<void> => {
pending.value = true;
const queryVariables = {
feedbackFirst: variables.first,
feedbackAfter: variables.feedbackAfter || undefined,
feedbackOrderBy: variables.feedbackOrderBy || undefined,
feedbackUuid: variables.feedbackUuid || undefined,
productUuid: variables.productUuid || undefined,
userUuid: variables.userUuid || undefined,
};
const { data, error: mistake } = await useAsyncQuery<IFeedbacksResponse>(GET_FEEDBACKS, queryVariables);
if (data.value?.feedbacks?.edges) {
pageInfo.value = data.value?.brands.pageInfo;
if (variables.feedbackAfter) {
feedbacks.value = [
...feedbacks.value,
...data.value.feedbacks.edges,
];
} else {
feedbacks.value = data.value?.feedbacks.edges;
}
}
if (mistake.value) {
error.value = mistake.value;
}
pending.value = false;
};
watch(error, (e) => {
if (e) console.error('useFeedbacks error:', e);
});
return {
pending,
feedbacks,
pageInfo,
variables,
getFeedbacks,
};
}