* apps/bot: add feature add contact * apps/bot: check role 'master' before add contact * apps/bot: rename createCustomer -> createUser * remove ';' * app/bot: add contact define name & phone * apps/bot: check user already exists w/o telegramId (invited) * Чтобы добавить контакт, сначала поделитесь своим номером телефона. * apps/bot: create or update functions * apps/bot: remove api.ts -> move getCustomer to packages/graphql/api * packages/graphql: add api/customer tests * tests for createOrUpdateClient * fix(apps/web): user is undefined * fix(apps/web): actions getCustomer * feat(apps/web): update user photo on app launch * rename page 'masters' -> 'contacts' * feat(apps/web): add basic /contacts page * fix app layout * refactor customer queries * add action getProfile * get customer contacts * use zustand for contacts * add loading spinner * rename filteredContacts -> contacts * replace zustand with @tanstack/react-query * profile: use react-query * refactor updateRole function * move updateRole closer to profile-card * beautify actions * add page 'profile/[telegramId]' * profile: add button "message to telegram" * profile: add call feature * app/bot: normalize phone before register * do not open keyboard on page load * contacts: loading spinner * telegram login: customer.active=true * update name on telegram first login
115 lines
2.9 KiB
TypeScript
115 lines
2.9 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();
|
|
|
|
const response = await query({
|
|
query: GQL.GetCustomerDocument,
|
|
variables: input,
|
|
});
|
|
|
|
return response?.data?.customers?.at(0);
|
|
}
|
|
|
|
export async function getCustomerMasters(input: GQL.GetCustomerMastersQueryVariables) {
|
|
const { query } = await getClientWithToken();
|
|
|
|
const response = await query({
|
|
query: GQL.GetCustomerMastersDocument,
|
|
variables: input,
|
|
});
|
|
|
|
return response?.data?.customers?.at(0);
|
|
}
|
|
|
|
export async function getCustomerClients(input: GQL.GetCustomerClientsQueryVariables) {
|
|
const { query } = await getClientWithToken();
|
|
|
|
const response = await query({
|
|
query: GQL.GetCustomerClientsDocument,
|
|
variables: input,
|
|
});
|
|
|
|
return response?.data?.customers?.at(0);
|
|
}
|
|
|
|
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,
|
|
});
|
|
}
|