[FE] Add spinner to person search
This commit is contained in:
parent
943875bd0d
commit
2fb6ddc5f6
@ -1,5 +1,3 @@
|
|||||||
use std::fmt::format;
|
|
||||||
|
|
||||||
use reqwest::Client;
|
use reqwest::Client;
|
||||||
use rocket::http::Status;
|
use rocket::http::Status;
|
||||||
use rocket::serde::json::Json;
|
use rocket::serde::json::Json;
|
||||||
|
@ -6,8 +6,9 @@ import { XIcon } from "../../icons/XIcon";
|
|||||||
import { Person } from "../../types/Person";
|
import { Person } from "../../types/Person";
|
||||||
import { PersonDisplay } from "./PersonDisplay";
|
import { PersonDisplay } from "./PersonDisplay";
|
||||||
import { PersonRegister } from "./PersonRegister";
|
import { PersonRegister } from "./PersonRegister";
|
||||||
import { backend } from "../../utils/functions";
|
import { backend, wait } from "../../utils/functions";
|
||||||
import { JsonResult } from "../../types/JsonResult";
|
import { JsonResult } from "../../types/JsonResult";
|
||||||
|
import { LoadingIcon } from "../../icons/LoadingIcon";
|
||||||
|
|
||||||
type HTMLButtonEvent = JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent>;
|
type HTMLButtonEvent = JSX.EventHandlerUnion<HTMLButtonElement, MouseEvent>;
|
||||||
|
|
||||||
@ -46,10 +47,12 @@ export function Search(props: {setPerson: (p: Person | null) => void}) {
|
|||||||
/*
|
/*
|
||||||
Get the user data from the DB
|
Get the user data from the DB
|
||||||
*/
|
*/
|
||||||
const search = () => {
|
const search = async() => {
|
||||||
setLoading(true);
|
setLoading(true);
|
||||||
setError("");
|
setError("");
|
||||||
|
|
||||||
|
await wait(1500);
|
||||||
|
|
||||||
backend.get<JsonResult<Person>>(`/api/person/${dni()}`)
|
backend.get<JsonResult<Person>>(`/api/person/${dni()}`)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
if (response.status === 200) {
|
if (response.status === 200) {
|
||||||
@ -155,6 +158,13 @@ function InputBox(props: {
|
|||||||
|
|
||||||
|
|
||||||
<label for="search-dni" class="absolute -top-2 left-2 text-xs bg-c-surface px-1 select-none">DNI</label>
|
<label for="search-dni" class="absolute -top-2 left-2 text-xs bg-c-surface px-1 select-none">DNI</label>
|
||||||
|
|
||||||
|
<span
|
||||||
|
class="absolute top-[2px] right-14 rounded hover:bg-c-surface-variant"
|
||||||
|
style={{display: props.loading ? "inline-block" : "none"}}
|
||||||
|
>
|
||||||
|
<LoadingIcon class="animate-spin" fill="var(--c-on-surface)" />
|
||||||
|
</span>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
class="absolute top-1 right-8 rounded hover:bg-c-surface-variant"
|
class="absolute top-1 right-8 rounded hover:bg-c-surface-variant"
|
||||||
|
15
frontend/src/icons/LoadingIcon.tsx
Normal file
15
frontend/src/icons/LoadingIcon.tsx
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
|
||||||
|
export function LoadingIcon(props: {fill: string, size?: number, class?: string}) {
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
class={`inline-block w-6 ${props.class}`}
|
||||||
|
width={props.size ?? 32}
|
||||||
|
height={props.size ?? 32}
|
||||||
|
fill="none"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
>
|
||||||
|
<path class="opacity-75" fill={props.fill} d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" />
|
||||||
|
</svg>
|
||||||
|
);
|
||||||
|
}
|
@ -10,3 +10,7 @@ export function formatDate(date: string): string {
|
|||||||
export const backend = axios.create({
|
export const backend = axios.create({
|
||||||
baseURL: import.meta.env.VITE_BACKEND_URL,
|
baseURL: import.meta.env.VITE_BACKEND_URL,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export function wait(ms: number): Promise<void> {
|
||||||
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user