Vlad Chikalkin 10b36978fe
Feature/10 contacts (#16)
* 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
2025-01-20 18:11:33 +03:00

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,
});
}