diff --git a/apps/web/actions/api/services.ts b/apps/web/actions/api/services.ts new file mode 100644 index 0000000..577a04d --- /dev/null +++ b/apps/web/actions/api/services.ts @@ -0,0 +1,18 @@ +'use server'; + +import { useService } from './lib/service'; +import { ServicesService } from '@repo/graphql/api/services'; + +const getServicesService = useService(ServicesService); + +export async function getService(...variables: Parameters) { + const service = await getServicesService(); + + return service.getService(...variables); +} + +export async function getServices(...variables: Parameters) { + const service = await getServicesService(); + + return service.getServices(...variables); +} diff --git a/apps/web/actions/orders.ts b/apps/web/actions/orders.ts index ac7dc78..1ed6d25 100644 --- a/apps/web/actions/orders.ts +++ b/apps/web/actions/orders.ts @@ -4,6 +4,7 @@ import type * as ApolloTypes from '../../../packages/graphql/node_modules/@apollo/client/core'; import { getCustomer, getCustomerMasters } from './api/customers'; import { _temporaryGetCustomer } from './api/lib/service'; +import { getService } from './api/services'; import { getSlot } from './api/slots'; import * as api from '@repo/graphql/api'; import { Enum_Customer_Role, Enum_Slot_State } from '@repo/graphql/types'; @@ -61,9 +62,9 @@ export async function createOrder(input: OrderInput) { throw new Error('Invalid master'); } - const service = await api.getService({ documentId: input.serviceId }); + const { service } = await getService({ documentId: input.serviceId }); - const endTime = sumTime(input.time, service?.data?.service?.duration); + const endTime = sumTime(input.time, service?.duration); const payload = { client: input.clientId, date: formatDate(input.date).db(), diff --git a/apps/web/actions/services.ts b/apps/web/actions/services.ts deleted file mode 100644 index 6cec874..0000000 --- a/apps/web/actions/services.ts +++ /dev/null @@ -1,21 +0,0 @@ -'use server'; -import { getCustomer } from './api/customers'; -import { _temporaryGetCustomer } from './api/lib/service'; -import * as api from '@repo/graphql/api/service'; -// eslint-disable-next-line sonarjs/no-internal-api-use -import type * as ApolloTypes from '@repo/graphql/node_modules/@apollo/client/core'; -import { type GetServicesQueryVariables } from '@repo/graphql/types'; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -type FixTypescriptCringe = ApolloTypes.FetchResult; - -export async function getServices(input?: GetServicesQueryVariables) { - const variables = await _temporaryGetCustomer(); - const { customer } = await getCustomer(variables); - - const filters = input || { filters: { master: { documentId: { eq: customer?.documentId } } } }; - - return api.getServices(filters); -} - -export const getService = api.getService; diff --git a/apps/web/components/orders/components/service-select.tsx b/apps/web/components/orders/components/service-select.tsx index e341c01..73273e2 100644 --- a/apps/web/components/orders/components/service-select.tsx +++ b/apps/web/components/orders/components/service-select.tsx @@ -1,17 +1,27 @@ 'use client'; -import { useServicesQuery } from '@/hooks/services'; +import { useServicesQuery } from '@/hooks/api/services'; import { useOrderStore } from '@/stores/order'; import { type ServiceFieldsFragment } from '@repo/graphql/types'; import { cn } from '@repo/ui/lib/utils'; export function ServiceSelect() { - const { data } = useServicesQuery(); + const masterId = useOrderStore((store) => store.masterId); + + const { data: { services } = {} } = useServicesQuery({ + filters: { + master: { + documentId: { + eq: masterId, + }, + }, + }, + }); + + if (!services?.length) return null; return (
- {data?.data.services.map( - (service) => service && , - )} + {services.map((service) => service && )}
); } diff --git a/apps/web/hooks/api/services.ts b/apps/web/hooks/api/services.ts new file mode 100644 index 0000000..8af6c6d --- /dev/null +++ b/apps/web/hooks/api/services.ts @@ -0,0 +1,18 @@ +'use client'; +import { getService, getServices } from '@/actions/api/services'; +import { useQuery } from '@tanstack/react-query'; + +export const useServicesQuery = (input: Parameters[0]) => { + const masterId = input.filters?.master?.documentId?.eq; + + return useQuery({ + queryFn: () => getServices(input), + queryKey: ['services', 'master', masterId, 'list'], + }); +}; + +export const useServiceQuery = (input: Parameters[0]) => + useQuery({ + queryFn: () => getService(input), + queryKey: ['services', 'documentId', input.documentId], + }); diff --git a/apps/web/hooks/services/index.ts b/apps/web/hooks/services/index.ts deleted file mode 100644 index c8e8475..0000000 --- a/apps/web/hooks/services/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -'use client'; -import { getServices } from '@/actions/services'; -// eslint-disable-next-line sonarjs/no-internal-api-use -import type * as ApolloTypes from '@repo/graphql/node_modules/@apollo/client/core'; -import { type GetServicesQueryVariables } from '@repo/graphql/types'; -import { useQuery } from '@tanstack/react-query'; - -// eslint-disable-next-line @typescript-eslint/no-unused-vars -type FixTypescriptCringe = ApolloTypes.FetchResult; - -export const useServicesQuery = (input?: GetServicesQueryVariables) => - useQuery({ - queryFn: () => getServices(input), - queryKey: ['services', 'list'], - }); diff --git a/packages/graphql/api/index.ts b/packages/graphql/api/index.ts index c37fc52..00a4b07 100644 --- a/packages/graphql/api/index.ts +++ b/packages/graphql/api/index.ts @@ -1,5 +1,5 @@ export * from './auth'; export * from './customers'; export * from './order'; -export * from './service'; +export * from './services'; export * from './slots'; diff --git a/packages/graphql/api/service.ts b/packages/graphql/api/service.ts deleted file mode 100644 index fd4b00e..0000000 --- a/packages/graphql/api/service.ts +++ /dev/null @@ -1,21 +0,0 @@ -'use server'; -import { getClientWithToken } from '../apollo/client'; -import * as GQL from '../types'; - -export async function getServices(input: GQL.GetServicesQueryVariables) { - const { query } = await getClientWithToken(); - - return query({ - query: GQL.GetServicesDocument, - variables: input, - }); -} - -export async function getService(input: GQL.GetServiceQueryVariables) { - const { query } = await getClientWithToken(); - - return query({ - query: GQL.GetServiceDocument, - variables: input, - }); -} diff --git a/packages/graphql/api/services.ts b/packages/graphql/api/services.ts new file mode 100644 index 0000000..202d514 --- /dev/null +++ b/packages/graphql/api/services.ts @@ -0,0 +1,32 @@ +import { getClientWithToken } from '../apollo/client'; +import * as GQL from '../types'; +import { BaseService } from './base'; +import { type VariablesOf } from '@graphql-typed-document-node/core'; + +export class ServicesService extends BaseService { + async getService(variables: VariablesOf) { + const { query } = await getClientWithToken(); + + const result = await query({ + query: GQL.GetServiceDocument, + variables, + }); + + if (result.error) throw new Error(result.error.message); + + return result.data; + } + + async getServices(variables: VariablesOf) { + const { query } = await getClientWithToken(); + + const result = await query({ + query: GQL.GetServicesDocument, + variables, + }); + + if (result.error) throw new Error(result.error.message); + + return result.data; + } +}