* 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
62 lines
2.0 KiB
TypeScript
62 lines
2.0 KiB
TypeScript
'use client';
|
|
|
|
import { toast } from '@repo/ui/components/ui/sonner';
|
|
// Since QueryClientProvider relies on useContext under the hood, we have to put 'use client' on top
|
|
import {
|
|
isServer,
|
|
MutationCache,
|
|
QueryCache,
|
|
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,
|
|
},
|
|
},
|
|
mutationCache: new MutationCache({
|
|
onError: (error_: unknown) => {
|
|
const error = error_ as Error;
|
|
toast.error('Ошибка при отправке данных: ' + error.message);
|
|
},
|
|
}),
|
|
queryCache: new QueryCache({
|
|
onError: (error_: unknown) => {
|
|
const error = error_ as Error;
|
|
toast.error('Ошибка при загрузке данных: ' + error.message);
|
|
},
|
|
}),
|
|
});
|
|
}
|
|
|
|
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;
|
|
}
|
|
}
|