* 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
43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
'use client';
|
|
|
|
// Since QueryClientProvider relies on useContext under the hood, we have to put 'use client' on top
|
|
import { isServer, QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
|
|
function makeQueryClient() {
|
|
return new QueryClient({
|
|
defaultOptions: {
|
|
queries: {
|
|
// With SSR, we usually want to set some default staleTime
|
|
// above 0 to avoid refetching immediately on the client
|
|
staleTime: 60 * 1_000,
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
let browserQueryClient: QueryClient | undefined;
|
|
|
|
export function QueryProvider({ children }: { readonly children: React.ReactNode }) {
|
|
// NOTE: Avoid useState when initializing the query client if you don't
|
|
// have a suspense boundary between this and the code that may
|
|
// suspend because React will throw away the client on the initial
|
|
// render if it suspends and there is no boundary
|
|
const queryClient = getQueryClient();
|
|
|
|
return <QueryClientProvider client={queryClient}>{children}</QueryClientProvider>;
|
|
}
|
|
|
|
function getQueryClient() {
|
|
if (isServer) {
|
|
// Server: always make a new query client
|
|
return makeQueryClient();
|
|
} else {
|
|
// Browser: make a new query client if we don't already have one
|
|
// This is very important, so we don't re-make a new client if React
|
|
// suspends during the initial render. This may not be needed if we
|
|
// have a suspense boundary BELOW the creation of the query client
|
|
if (!browserQueryClient) browserQueryClient = makeQueryClient();
|
|
return browserQueryClient;
|
|
}
|
|
}
|