- Renamed `ServiceSelect` to `ServicesSelect` for clarity. - Updated state management to handle multiple service IDs instead of a single service ID. - Adjusted related components (`DateSelect`, `TimeSelect`, `SubmitButton`, and `NextButton`) to accommodate the new services structure. - Removed the deprecated `service-select.tsx` file and refactored related logic in the order store and API to support multiple services. - Enhanced error handling in the slots service to validate multiple services correctly.
79 lines
2.5 KiB
TypeScript
79 lines
2.5 KiB
TypeScript
/* eslint-disable sonarjs/cognitive-complexity */
|
|
'use client';
|
|
import { useOrderStore } from './context';
|
|
import { type Steps } from './types';
|
|
import { useCustomerQuery, useIsMaster } from '@/hooks/api/customers';
|
|
import { type OrderFieldsFragment } from '@repo/graphql/types';
|
|
import { sift } from 'radashi';
|
|
import { useEffect, useRef } from 'react';
|
|
|
|
const STEPS: Steps[] = [
|
|
'master-select',
|
|
'client-select',
|
|
'service-select',
|
|
'datetime-select',
|
|
'success',
|
|
];
|
|
export const MASTER_STEPS: Steps[] = STEPS.filter((step) => step !== 'master-select');
|
|
export const CLIENT_STEPS: Steps[] = STEPS.filter((step) => step !== 'client-select');
|
|
|
|
export function useInitOrderStore(initData: null | OrderFieldsFragment) {
|
|
const initialized = useRef(false);
|
|
const { data: { customer } = {} } = useCustomerQuery();
|
|
const isMaster = useIsMaster();
|
|
|
|
const setMasterId = useOrderStore((store) => store.setMasterId);
|
|
const setClientId = useOrderStore((store) => store.setClientId);
|
|
const setServiceIds = useOrderStore((store) => store.setServiceIds);
|
|
const setStep = useOrderStore((store) => store.setStep);
|
|
const setStepsSequence = useOrderStore((store) => store._setStepSequence);
|
|
const step = useOrderStore((store) => store.step);
|
|
|
|
useEffect(() => {
|
|
if (initialized.current || !customer || step !== 'loading') return;
|
|
|
|
const steps = isMaster ? MASTER_STEPS : CLIENT_STEPS;
|
|
setStepsSequence(steps);
|
|
|
|
// Инициализация из initData (например, для повторного заказа)
|
|
if (initData) {
|
|
const masterId = initData.slot?.master?.documentId;
|
|
const clientId = initData.client?.documentId;
|
|
const serviceIds = sift(initData.services).map(({ documentId }) => documentId);
|
|
|
|
if (masterId) setMasterId(masterId);
|
|
if (clientId) setClientId(clientId);
|
|
if (serviceIds) setServiceIds(serviceIds);
|
|
|
|
if (masterId && clientId && serviceIds.length) {
|
|
setStep('datetime-select');
|
|
} else if (masterId && clientId) {
|
|
setStep('service-select');
|
|
} else {
|
|
setStep(steps[0] ?? 'loading');
|
|
}
|
|
} else {
|
|
// Обычная инициализация (новый заказ)
|
|
if (isMaster) {
|
|
setMasterId(customer.documentId);
|
|
} else {
|
|
setClientId(customer.documentId);
|
|
}
|
|
|
|
setStep(steps[0] ?? 'loading');
|
|
}
|
|
|
|
initialized.current = true;
|
|
}, [
|
|
customer,
|
|
initData,
|
|
isMaster,
|
|
setClientId,
|
|
setMasterId,
|
|
setServiceIds,
|
|
setStep,
|
|
setStepsSequence,
|
|
step,
|
|
]);
|
|
}
|