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.
This commit is contained in:
parent
7e31a80290
commit
03dbafaf44
5 changed files with 132 additions and 2 deletions
|
|
@ -1 +1,2 @@
|
||||||
export * from './useFeedbackAction';
|
export * from './useFeedbackAction';
|
||||||
|
export * from './useFeedbacks';
|
||||||
|
|
|
||||||
87
storefront/app/composables/feedbacks/useFeedbacks.ts
Normal file
87
storefront/app/composables/feedbacks/useFeedbacks.ts
Normal file
|
|
@ -0,0 +1,87 @@
|
||||||
|
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,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
import {FEEDBACK_FRAGMENT} from "@graphql/fragments/feedback.fragment";
|
||||||
|
|
||||||
export const PRODUCT_FRAGMENT = gql`
|
export const PRODUCT_FRAGMENT = gql`
|
||||||
fragment Product on ProductType {
|
fragment Product on ProductType {
|
||||||
uuid
|
uuid
|
||||||
|
|
@ -43,8 +45,7 @@ export const PRODUCT_FRAGMENT = gql`
|
||||||
feedbacks {
|
feedbacks {
|
||||||
edges {
|
edges {
|
||||||
node {
|
node {
|
||||||
uuid
|
...Feedback
|
||||||
rating
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -57,4 +58,5 @@ export const PRODUCT_FRAGMENT = gql`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
${FEEDBACK_FRAGMENT}
|
||||||
`;
|
`;
|
||||||
|
|
|
||||||
32
storefront/app/graphql/queries/standalone/feedbacks.ts
Normal file
32
storefront/app/graphql/queries/standalone/feedbacks.ts
Normal file
|
|
@ -0,0 +1,32 @@
|
||||||
|
import {FEEDBACK_FRAGMENT} from "@graphql/fragments/feedback.fragment";
|
||||||
|
|
||||||
|
export const GET_FEEDBACKS = gql`
|
||||||
|
query getFeedbacks (
|
||||||
|
$feedbackAfter: String,
|
||||||
|
$feedbackFirst: Int,
|
||||||
|
$userUuid: UUID,
|
||||||
|
$productUuid: UUID,
|
||||||
|
$orderBy: String,
|
||||||
|
$uuid: UUID
|
||||||
|
) {
|
||||||
|
brands(
|
||||||
|
after: $feedbackAfter,
|
||||||
|
first: $feedbackFirst,
|
||||||
|
userUuid: $userUuid,
|
||||||
|
productUuid: $productUuid,
|
||||||
|
orderBy: $orderBy,
|
||||||
|
uuid: $uuid
|
||||||
|
) {
|
||||||
|
edges {
|
||||||
|
node {
|
||||||
|
...Feedback
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pageInfo {
|
||||||
|
hasNextPage
|
||||||
|
endCursor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
${FEEDBACK_FRAGMENT}
|
||||||
|
`;
|
||||||
|
|
@ -1,5 +1,13 @@
|
||||||
import type { IFeedback } from '@types';
|
import type { IFeedback } from '@types';
|
||||||
|
|
||||||
|
export interface IFeedbacksResponse {
|
||||||
|
feedbacks: {
|
||||||
|
edges: {
|
||||||
|
node: IFeedback;
|
||||||
|
}[];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export interface IFeedbackActionResponse {
|
export interface IFeedbackActionResponse {
|
||||||
feedback: IFeedback;
|
feedback: IFeedback;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue