mirror of
https://github.com/documenso/documenso.git
synced 2025-11-14 16:51:38 +10:00
chore: add transition and check for empty users array
This commit is contained in:
@ -1,11 +1,15 @@
|
|||||||
'use client';
|
'use client';
|
||||||
|
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState, useTransition } from 'react';
|
||||||
|
|
||||||
|
import { Loader } from 'lucide-react';
|
||||||
|
|
||||||
import { Document, Role, Subscription } from '@documenso/prisma/client';
|
import { Document, Role, Subscription } from '@documenso/prisma/client';
|
||||||
import { Button } from '@documenso/ui/primitives/button';
|
import { Button } from '@documenso/ui/primitives/button';
|
||||||
import { Input } from '@documenso/ui/primitives/input';
|
import { Input } from '@documenso/ui/primitives/input';
|
||||||
|
|
||||||
|
import { useDebouncedValue } from '~/hooks/use-debounced-value';
|
||||||
|
|
||||||
import { UsersDataTable } from './data-table-users';
|
import { UsersDataTable } from './data-table-users';
|
||||||
|
|
||||||
export type SubscriptionLite = Pick<
|
export type SubscriptionLite = Pick<
|
||||||
@ -24,7 +28,7 @@ export type User = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
export type UsersProps = {
|
export type UsersProps = {
|
||||||
search: (search: string) => Promise<{ users: User[]; totalPages: number }>;
|
search: (_search: string) => Promise<{ users: User[]; totalPages: number }>;
|
||||||
perPage: number;
|
perPage: number;
|
||||||
page: number;
|
page: number;
|
||||||
};
|
};
|
||||||
@ -32,13 +36,14 @@ export type UsersProps = {
|
|||||||
export const Users = ({ search, perPage, page }: UsersProps) => {
|
export const Users = ({ search, perPage, page }: UsersProps) => {
|
||||||
const [data, setData] = useState<User[]>([]);
|
const [data, setData] = useState<User[]>([]);
|
||||||
const [totalPages, setTotalPages] = useState<number>(0);
|
const [totalPages, setTotalPages] = useState<number>(0);
|
||||||
|
const [isPending, startTransition] = useTransition();
|
||||||
const [searchString, setSearchString] = useState('');
|
const [searchString, setSearchString] = useState('');
|
||||||
|
const debouncedSearchString = useDebouncedValue(searchString, 500);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const fetchData = async () => {
|
const fetchData = async () => {
|
||||||
try {
|
try {
|
||||||
const result = await search(searchString);
|
const result = await search(debouncedSearchString);
|
||||||
setData(result.users);
|
setData(result.users);
|
||||||
setTotalPages(result.totalPages);
|
setTotalPages(result.totalPages);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@ -47,12 +52,14 @@ export const Users = ({ search, perPage, page }: UsersProps) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
fetchData();
|
fetchData();
|
||||||
}, [searchString, search]);
|
}, [debouncedSearchString, search]);
|
||||||
|
|
||||||
const onSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
|
const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const result = await search(searchString);
|
startTransition(async () => {
|
||||||
setData(result.users);
|
const result = await search(debouncedSearchString);
|
||||||
|
setData(result.users);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
||||||
@ -71,7 +78,13 @@ export const Users = ({ search, perPage, page }: UsersProps) => {
|
|||||||
<Button type="submit">Search</Button>
|
<Button type="submit">Search</Button>
|
||||||
</form>
|
</form>
|
||||||
<div className="mt-8">
|
<div className="mt-8">
|
||||||
<UsersDataTable users={data} perPage={perPage} page={page} totalPages={totalPages} />
|
{data.length === 0 || isPending ? (
|
||||||
|
<div className="absolute inset-0 flex items-center justify-center bg-white/50">
|
||||||
|
<Loader className="h-8 w-8 animate-spin text-gray-500" />
|
||||||
|
</div>
|
||||||
|
) : (
|
||||||
|
<UsersDataTable users={data} perPage={perPage} page={page} totalPages={totalPages} />
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user