Skip to content

Commit 7c74553

Browse files
feat: add SpinningIcon component and use it globally
1 parent 8ff81f1 commit 7c74553

File tree

7 files changed

+30
-33
lines changed

7 files changed

+30
-33
lines changed

src/features/form/components/AdminFormDetailPage.module.css

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,6 @@
3030
color: var(--comment);
3131
font-size: 0.9rem;
3232
}
33-
34-
.spinningIcon {
35-
animation: spin 1s linear infinite;
36-
}
37-
38-
@keyframes spin {
39-
from {
40-
transform: rotate(0deg);
41-
}
42-
43-
to {
44-
transform: rotate(360deg);
45-
}
46-
}
47-
4833
.tabs {
4934
display: flex;
5035
gap: 1rem;

src/features/form/components/AdminFormDetailPage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useFormById, usePublishForm } from "@/features/form/hooks/useOrgForms";
33
import { AdminLayout } from "@/layouts";
44
import { SEO_CONFIG } from "@/seo/seo.config";
55
import { useSeo } from "@/seo/useSeo";
6-
import { Button, ErrorMessage, LoadingSpinner, useToast } from "@/shared/components";
6+
import { Button, ErrorMessage, LoadingSpinner, SpinningIcon, useToast } from "@/shared/components";
77
import { useIsMutating } from "@tanstack/react-query";
88
import { Check, Link, LoaderCircle } from "lucide-react";
99
import { useState } from "react";
@@ -99,7 +99,7 @@ export const AdminFormDetailPage = () => {
9999
<h1 className={styles.title}>{formQuery.data.title}</h1>
100100
<div className={styles.headerActions}>
101101
<div className={styles.saveStatus} aria-live="polite">
102-
{isSaving ? <LoaderCircle size={16} className={styles.spinningIcon} /> : <Check size={16} />}
102+
{isSaving ? <SpinningIcon icon={LoaderCircle} size={16} /> : <Check size={16} />}
103103
<span>{isSaving ? "儲存中" : "已儲存"}</span>
104104
</div>
105105
<Button onClick={handlePublish} disabled={publishFormMutation.isPending || formQuery.data.status !== "DRAFT"}>

src/features/form/components/FormDetail/components/FormHeader/FormHeader.module.css

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,6 @@
1818
color: var(--comment);
1919
font-size: 0.9rem;
2020
}
21-
22-
.spinningIcon {
23-
animation: spin 1s linear infinite;
24-
}
25-
26-
@keyframes spin {
27-
from {
28-
transform: rotate(0deg);
29-
}
30-
to {
31-
transform: rotate(360deg);
32-
}
33-
}
34-
3521
.title {
3622
margin-bottom: 1.5rem;
3723
text-align: center;

src/features/form/components/FormDetail/components/FormHeader/FormHeader.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Button } from "@/shared/components";
1+
import { Button, SpinningIcon } from "@/shared/components";
22
import { AlertCircle, Check, ChevronLeft, LoaderCircle } from "lucide-react";
33
import styles from "./FormHeader.module.css";
44

@@ -26,7 +26,7 @@ export const FormHeader = ({ title, formDescription, currentStep, currentSection
2626
<div className={styles.saveStatus} aria-live="polite">
2727
{saveStatus === "saving" ? (
2828
<>
29-
<LoaderCircle size={16} className={styles.spinningIcon} />
29+
<SpinningIcon icon={LoaderCircle} size={16} />
3030
<span>儲存中</span>
3131
</>
3232
) : saveStatus === "error" ? (
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
.spinningIcon {
2+
animation: spin 1s linear infinite;
3+
}
4+
5+
@keyframes spin {
6+
from {
7+
transform: rotate(0deg);
8+
}
9+
10+
to {
11+
transform: rotate(360deg);
12+
}
13+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { type LucideProps } from "lucide-react";
2+
import styles from "./SpinningIcon.module.css";
3+
4+
interface SpinningIconProps {
5+
icon: React.ComponentType<LucideProps>;
6+
size?: number;
7+
}
8+
9+
export const SpinningIcon = ({ icon: Icon, size = 16 }: SpinningIconProps) => {
10+
return <Icon size={size} className={styles.spinningIcon} />;
11+
};

src/shared/components/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ export { ErrorMessage } from "./ErrorMessage/ErrorMessage";
7575

7676
export { LoadingSpinner } from "./LoadingSpinner/LoadingSpinner";
7777

78+
export { SpinningIcon } from "./SpinningIcon/SpinningIcon";
79+
7880
export { ErrorBoundary } from "./ErrorBoundary/ErrorBoundary";
7981

8082
export { Markdown } from "./Markdown/Markdown";

0 commit comments

Comments
 (0)