diff --git a/apps/react/src/app/components/page-loader/index.ts b/apps/react/src/app/components/page-loader/index.ts new file mode 100644 index 000000000..145a1a61f --- /dev/null +++ b/apps/react/src/app/components/page-loader/index.ts @@ -0,0 +1,2 @@ +export { PageLoader } from './page-loader' +export type { PageLoaderProps } from './page-loader' diff --git a/apps/react/src/app/components/page-loader/page-loader.scss b/apps/react/src/app/components/page-loader/page-loader.scss new file mode 100644 index 000000000..4ab921835 --- /dev/null +++ b/apps/react/src/app/components/page-loader/page-loader.scss @@ -0,0 +1,33 @@ +.page-loader { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + display: flex; + align-items: center; + justify-content: center; + background: rgba(255, 255, 255, 0.8); + z-index: 1000; +} + +.page-loader__content { + display: flex; + flex-direction: column; + align-items: center; + gap: 20px; + padding: 40px; + background: white; + border-radius: 8px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); +} + +.page-loader__message { + font-size: 16px; + color: #666; + margin: 0; +} + +.page-loader__cancel { + margin-top: 10px; +} diff --git a/apps/react/src/app/components/page-loader/page-loader.tsx b/apps/react/src/app/components/page-loader/page-loader.tsx new file mode 100644 index 000000000..681d1fdc0 --- /dev/null +++ b/apps/react/src/app/components/page-loader/page-loader.tsx @@ -0,0 +1,42 @@ +import React from 'react' +import { ProgressSpinner } from 'primereact/progressspinner' +import { Button } from 'primereact/button' +import { useTranslation } from 'react-i18next' +import './page-loader.scss' + +export interface PageLoaderProps { + isLoading: boolean + onCancel?: () => void + message?: string +} + +export const PageLoader: React.FC = ({ isLoading, onCancel, message }) => { + const { t } = useTranslation() + + if (!isLoading) { + return null + } + + return ( +
+
+ + {message &&

{message}

} + {onCancel && ( +
+
+ ) +}