Skip to content
Snippets Groups Projects
Commit ccad23bf authored by 한동현's avatar 한동현
Browse files

feat: API 응답 대기중 버튼 로딩 아이콘 추가

parent 4e3a5f60
No related branches found
No related tags found
No related merge requests found
import React from 'react'; import React from 'react';
import { useNavigate } from 'react-router'; import { useNavigate } from 'react-router';
import { LoaderCircle } from 'lucide-react';
import { cn } from '@/lib/utils'; import { cn } from '@/lib/utils';
import { useAuthStore } from '@/stores/authStore'; import { useAuthStore } from '@/stores/authStore';
import { toast } from 'sonner'; import { toast } from 'sonner';
...@@ -11,9 +12,12 @@ import { Label } from '@/components/ui/label'; ...@@ -11,9 +12,12 @@ import { Label } from '@/components/ui/label';
export function LoginForm({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) { export function LoginForm({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {
const { login } = useAuthStore(); const { login } = useAuthStore();
const navigate = useNavigate(); const navigate = useNavigate();
const [isLoading, setIsLoading] = React.useState(false);
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => { const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
e.preventDefault(); e.preventDefault();
setIsLoading(true);
const formData = new FormData(e.currentTarget); const formData = new FormData(e.currentTarget);
const username = formData.get('username') as string; const username = formData.get('username') as string;
const password = formData.get('password') as string; const password = formData.get('password') as string;
...@@ -25,6 +29,8 @@ export function LoginForm({ className, ...props }: React.ComponentPropsWithoutRe ...@@ -25,6 +29,8 @@ export function LoginForm({ className, ...props }: React.ComponentPropsWithoutRe
console.error(err); console.error(err);
toast.error('로그인에 실패했습니다'); toast.error('로그인에 실패했습니다');
} }
setIsLoading(false);
}; };
return ( return (
...@@ -45,7 +51,8 @@ export function LoginForm({ className, ...props }: React.ComponentPropsWithoutRe ...@@ -45,7 +51,8 @@ export function LoginForm({ className, ...props }: React.ComponentPropsWithoutRe
<Label htmlFor="password">비밀번호</Label> <Label htmlFor="password">비밀번호</Label>
<Input id="password" name="password" type="password" placeholder="비밀번호" required /> <Input id="password" name="password" type="password" placeholder="비밀번호" required />
</div> </div>
<Button type="submit" className="w-full"> <Button type="submit" className="w-full" disabled={isLoading}>
{isLoading && <LoaderCircle className="animate-spin" />}
로그인 로그인
</Button> </Button>
</div> </div>
......
...@@ -2,6 +2,7 @@ import { z } from 'zod'; ...@@ -2,6 +2,7 @@ import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
import { Link, useNavigate } from 'react-router'; import { Link, useNavigate } from 'react-router';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import { LoaderCircle } from 'lucide-react';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Input } from '@/components/ui/input'; import { Input } from '@/components/ui/input';
...@@ -145,7 +146,10 @@ export default function ForwardingCreate() { ...@@ -145,7 +146,10 @@ export default function ForwardingCreate() {
<Button variant="outline" asChild> <Button variant="outline" asChild>
<Link to="..">취소</Link> <Link to="..">취소</Link>
</Button> </Button>
<Button type="submit">저장</Button> <Button type="submit" disabled={form.formState.isSubmitting}>
{form.formState.isSubmitting && <LoaderCircle className="animate-spin" />}
저장
</Button>
</div> </div>
</form> </form>
</Form> </Form>
......
...@@ -4,6 +4,7 @@ import { zodResolver } from '@hookform/resolvers/zod'; ...@@ -4,6 +4,7 @@ import { zodResolver } from '@hookform/resolvers/zod';
import { Link, useNavigate, useParams } from 'react-router'; import { Link, useNavigate, useParams } from 'react-router';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import { toast } from 'sonner'; import { toast } from 'sonner';
import { LoaderCircle } from 'lucide-react';
import { Skeleton } from '@/components/ui/skeleton'; import { Skeleton } from '@/components/ui/skeleton';
import { Button } from '@/components/ui/button'; import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
...@@ -169,7 +170,10 @@ export default function ForwardingEdit() { ...@@ -169,7 +170,10 @@ export default function ForwardingEdit() {
<Button variant="outline" asChild> <Button variant="outline" asChild>
<Link to="..">취소</Link> <Link to="..">취소</Link>
</Button> </Button>
<Button type="submit">저장</Button> <Button type="submit" disabled={form.formState.isSubmitting}>
{form.formState.isSubmitting && <LoaderCircle className="animate-spin" />}
저장
</Button>
</div> </div>
</form> </form>
</Form> </Form>
......
import { useEffect, useState } from 'react'; import { useEffect, useState } from 'react';
import { Link, useNavigate } from 'react-router'; import { Link, useNavigate } from 'react-router';
import { useForm, useWatch } from 'react-hook-form'; import { useForm, useWatch } from 'react-hook-form';
import { Check, X } from 'lucide-react'; import { Check, LoaderCircle, X } from 'lucide-react';
import { z } from 'zod'; import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
import { toast } from 'sonner'; import { toast } from 'sonner';
...@@ -286,7 +286,10 @@ export default function RoutingCreate() { ...@@ -286,7 +286,10 @@ export default function RoutingCreate() {
<Button variant="outline" asChild> <Button variant="outline" asChild>
<Link to="..">취소</Link> <Link to="..">취소</Link>
</Button> </Button>
<Button type="submit">저장</Button> <Button type="submit" disabled={form.formState.isSubmitting}>
{form.formState.isSubmitting && <LoaderCircle className="animate-spin" />}
저장
</Button>
</div> </div>
</form> </form>
</Form> </Form>
......
import { useEffect, useRef, useState } from 'react'; import { useEffect, useRef, useState } from 'react';
import { Link, useNavigate, useParams } from 'react-router'; import { Link, useNavigate, useParams } from 'react-router';
import { useForm, useWatch } from 'react-hook-form'; import { useForm, useWatch } from 'react-hook-form';
import { Check, X } from 'lucide-react'; import { Check, LoaderCircle, X } from 'lucide-react';
import { z } from 'zod'; import { z } from 'zod';
import { zodResolver } from '@hookform/resolvers/zod'; import { zodResolver } from '@hookform/resolvers/zod';
import { toast } from 'sonner'; import { toast } from 'sonner';
...@@ -107,7 +107,7 @@ export default function RoutingEdit() { ...@@ -107,7 +107,7 @@ export default function RoutingEdit() {
console.error(error); console.error(error);
toast.error('라우팅 설정 정보를 조회할 수 없습니다.'); toast.error('라우팅 설정 정보를 조회할 수 없습니다.');
}); });
}, []); }, [id]);
useEffect(() => { useEffect(() => {
if (enableSSL) { if (enableSSL) {
...@@ -346,7 +346,10 @@ export default function RoutingEdit() { ...@@ -346,7 +346,10 @@ export default function RoutingEdit() {
<Button variant="outline" asChild> <Button variant="outline" asChild>
<Link to="..">취소</Link> <Link to="..">취소</Link>
</Button> </Button>
<Button type="submit">저장</Button> <Button type="submit" disabled={form.formState.isSubmitting}>
{form.formState.isSubmitting && <LoaderCircle className="animate-spin" />}
저장
</Button>
</div> </div>
</form> </form>
</Form> </Form>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment