Vlad Chikalkin 06be87f0ec
Feature/records (#22)
* components/profile: rename components files

* components/profile: organize files & folders

* split DataCard to 2 components

* [2] components/profile: organize files & folders

* data-card: fix phone field disabled

* fix card header color

* add schedule button for master

* fix navigation & profile background

* add basic schedule page

* fix bottom navbar overflows content

* header: remove bottom margin

* replace vanilla calendar with shadcn/ui one

* add slot functional

* fix forbidden error

* add slot operations

* show slots

* filter by selected day

* add hook useSlots
fix update slots list after add slot
fix initial fetch slots

* use slots hooks

* split edit-slot-form into files

* rename /time-slots -> /components

* refactor components & folders structure

* add feature: delete slot

* hooks/slot: update query keys

* add hooks/profile

* add hook useProfileMutation

* use useProfileMutation hook for update role

* rename useProfile -> useProfileQuery

* fix useProfileQuery queryKey

* add hook useContactsQuery

* remove unused ternary operator

* header: add backdrop blur

* create slot cards

* fix elements y center

* fix getSlots filters

* ui/ux improvements

* fix date time types & names

* move profile components from sub folder

* add basic slot page

* fix add slot form padding x

* add slot buttons

* extend slot card information

* fix import type

* use Container in pages

* change orange -> yellow for dark

* use Loading spinner in slots list

* refactor \components\schedule dir structure

* add orders list

* change query & mutation keys

* change url /profile/schedule/slot/ -> /slots/

* order: show services

* remove prefetchQuery

* bring the results of queries and hooks into a single form

* react query: globally show error toast

* add font inter

* fix header: center text

* orders: add sorting

* order card: add avatar

* rename records -> orders

* reduced text size

* fix slot buttons

* fix datetime card ui

* fix header: center text (finally)

* layout/container: last:mb-4

* fix type

* slot-datetime: use ReadonlyTimeRange

* rename files & components

* remove unnecessary context using

* feature: edit slot time

* fix: selected day reset after go back to /schedule

* rename AddTimeRange -> EditableTimeRangeForm & refactor

* fix some elements on page before data loaded

* fix text size

* slot-card: remove gap

* slot-date: remove margin

* fix slots & orders layout

* toast: show error text in ui
2025-02-20 18:11:28 +03:00

109 lines
2.8 KiB
TypeScript

'use server';
import { getClientWithToken } from '../apollo/client';
import * as GQL from '../types';
export async function createOrUpdateUser(input: GQL.CreateCustomerMutationVariables) {
if (!input.phone && !input.telegramId) throw new Error('Missing phone and telegramId');
const { query, mutate } = await getClientWithToken();
const response = await query({
query: GQL.GetCustomerDocument,
variables: input,
});
const customer = response?.data?.customers?.at(0);
if (customer && customer.phone === input.phone) {
return mutate({
mutation: GQL.UpdateCustomerProfileDocument,
variables: {
documentId: customer.documentId,
data: { ...input },
},
});
}
return mutate({
mutation: GQL.CreateCustomerDocument,
variables: input,
});
}
export async function getCustomer(input: GQL.GetCustomerQueryVariables) {
const { query } = await getClientWithToken();
return query({
query: GQL.GetCustomerDocument,
variables: input,
});
}
export async function getCustomerMasters(input: GQL.GetCustomerMastersQueryVariables) {
const { query } = await getClientWithToken();
return query({
query: GQL.GetCustomerMastersDocument,
variables: input,
});
}
export async function getCustomerClients(input: GQL.GetCustomerClientsQueryVariables) {
const { query } = await getClientWithToken();
return query({
query: GQL.GetCustomerClientsDocument,
variables: input,
});
}
type AddCustomerMasterInput = Pick<GQL.CreateCustomerMutationVariables, 'phone' | 'telegramId'> & {
masterId: GQL.Scalars['ID']['input'];
operation: 'add' | 'remove';
};
export async function updateCustomerMaster(input: AddCustomerMasterInput) {
if (!input.phone && !input.telegramId) throw new Error('Missing phone and telegramId');
const { query } = await getClientWithToken();
const response = await query({
query: GQL.GetCustomerMastersDocument,
variables: input,
});
const customer = response?.data?.customers?.at(0);
if (customer) {
let newMastersIds = customer.masters.map((x) => x?.documentId);
switch (input.operation) {
case 'add':
if (newMastersIds.includes(input.masterId)) return;
newMastersIds = [...newMastersIds, input.masterId];
break;
case 'remove':
newMastersIds = newMastersIds.filter((x) => x !== input.masterId);
break;
default:
break;
}
return updateCustomerProfile({
documentId: customer.documentId,
data: {
masters: newMastersIds,
},
});
}
}
export async function updateCustomerProfile(input: GQL.UpdateCustomerProfileMutationVariables) {
const { mutate } = await getClientWithToken();
return mutate({
mutation: GQL.UpdateCustomerProfileDocument,
variables: input,
});
}