diff --git a/interface/src/components/BackgroundSelector.tsx b/interface/src/components/BackgroundSelector.tsx
index a11a5629..11620733 100644
--- a/interface/src/components/BackgroundSelector.tsx
+++ b/interface/src/components/BackgroundSelector.tsx
@@ -3,6 +3,11 @@ import { downloadPresetBackground, openDB, readAllData, writeData } from "../hoo
import presetBackgrounds from "../assets/presetBackgrounds";
import "./BackgroundSelector.css";
import { disableTheme } from "../hooks/ThemeManagment";
+import { DownloadProgressCircle } from "./backgroundSelector/DownloadProgressCircle";
+import { BackgroundSwatch } from "./backgroundSelector/BackgroundSwatch";
+import { BackgroundList } from "./backgroundSelector/BackgroundList";
+import { FileUploader } from "./backgroundSelector/FileUploader";
+import { RemoveButton } from "./backgroundSelector/RemoveButton";
// Custom Types and Interfaces
export interface Background {
@@ -99,8 +104,6 @@ export default function BackgroundSelector({ selectedType, setSelectedType, isEd
setSelectedBackground(null);
localStorage.removeItem('selectedBackground');
};
-
- const calcCircumference = (radius: number) => 2 * Math.PI * radius;
useEffect(() => {
loadBackgrounds();
@@ -108,101 +111,67 @@ export default function BackgroundSelector({ selectedType, setSelectedType, isEd
return (
<>
-
-
-
Images
-
- {/* Image uploader swatch */}
-
-
- {/* Plus icon */}
-
-
-
-
- {backgrounds.filter(bg => bg.type === 'image').map(bg => (
-
selectBackground(bg.id)}
- className={`relative w-16 h-16 cursor-pointer rounded-xl transition ring dark:ring-white ring-zinc-300 ${isEditMode ? 'animate-shake' : ''} ${selectedBackground === bg.id && selectedType === "background" ? 'dark:ring-2 ring-4' : 'ring-0'}`}>
- {isEditMode && (
-
deleteBackground(bg.id)}>
-
-
- )}
-

-
- ))}
- {backgrounds.concat(presetBackgrounds as Background[]).filter(bg => bg.type === 'image' && bg.isPreset && !bg.isDownloaded && !downloadedPresetIds.includes(bg.id)).map(bg => (
-
handlePresetClick(bg)}
- className={`relative w-16 h-16 transition cursor-pointer rounded-xl duration-300 ${ isEditMode ? 'opacity-0 pointer-events-none hidden' : 'opacity-100'}`}>
- {bg.isPreset && downloadProgress[bg.id] !== undefined && (
-
-
-
- )}
-
-
- {downloadProgress[bg.id] === undefined ? '' : ''}
-
-
-

-
- ))}
-
+
-
Videos
-
- {/* Video uploader swatch */}
-
-
- {/* Plus icon */}
-
-
-
+
+
Images
+
+
+
bg.type === 'image')}
+ selectBackground={selectBackground}
+ isEditMode={isEditMode}
+ deleteBackground={deleteBackground}
+ selectedBackground={selectedBackground}
+ selectedType={selectedType}
+ />
+ {/* Preset backgrounds handling (images) */}
+ {presetBackgrounds
+ .filter(bg => bg.type === 'image' && bg.isPreset && !downloadedPresetIds.includes(bg.id))
+ .map(bg => (
+ handlePresetClick(bg)} className="relative w-16 h-16">
+ {downloadProgress[bg.id] !== undefined && }
+
+
+ ))}
- {backgrounds.filter(bg => bg.type === 'video').map(bg => (
-
selectBackground(bg.id)} className={`relative w-16 h-16 cursor-pointer rounded-xl transition ring dark:ring-white ring-zinc-300 ${isEditMode ? 'animate-shake' : ''} ${selectedBackground === bg.id && selectedType === "background" ? 'dark:ring-2 ring-4' : 'ring-0'}`}>
- {isEditMode && (
-
deleteBackground(bg.id)}>
-
+
+
Videos
+
+
+
bg.type === 'video')}
+ selectBackground={selectBackground}
+ isEditMode={isEditMode}
+ deleteBackground={deleteBackground}
+ selectedBackground={selectedBackground}
+ selectedType={selectedType}
+ />
+ {/* Preset backgrounds handling (videos) */}
+ {presetBackgrounds
+ .filter(bg => bg.type === 'video' && bg.isPreset && !downloadedPresetIds.includes(bg.id))
+ .map(bg => (
+ handlePresetClick(bg)} className="relative w-16 h-16">
+ {downloadProgress[bg.id] !== undefined && }
+
- )}
-
-
- ))}
- {backgrounds.concat(presetBackgrounds as Background[]).filter(bg => bg.type === 'video' && bg.isPreset && !bg.isDownloaded && !downloadedPresetIds.includes(bg.id)).map(bg => (
-
handlePresetClick(bg)}
- className={`relative w-16 h-16 transition cursor-pointer rounded-xl duration-300 ${ isEditMode ? 'opacity-0 pointer-events-none hidden' : 'opacity-100'}`}>
- {bg.isPreset && downloadProgress[bg.id] !== undefined && (
-
-
-
- )}
-
-
- {downloadProgress[bg.id] === undefined ? '' : ''}
-
-
-
-
- ))}
+ ))}
+
-
>
);
}
\ No newline at end of file
diff --git a/interface/src/components/backgroundSelector/BackgroundList.tsx b/interface/src/components/backgroundSelector/BackgroundList.tsx
new file mode 100644
index 00000000..aa93711e
--- /dev/null
+++ b/interface/src/components/backgroundSelector/BackgroundList.tsx
@@ -0,0 +1,30 @@
+import React from 'react';
+import { BackgroundSwatch } from './BackgroundSwatch';
+import { Background } from '../BackgroundSelector'; // Import the Background interface
+
+interface BackgroundListProps {
+ backgrounds: Background[];
+ selectBackground: (fileId: string) => void;
+ isEditMode: boolean;
+ deleteBackground: (fileId: string) => Promise
;
+ selectedBackground: string | null;
+ selectedType: 'background' | 'theme';
+}
+
+export const BackgroundList: React.FC = ({ backgrounds, selectBackground, isEditMode, deleteBackground, selectedBackground, selectedType }) => {
+ return (
+ <>
+ {backgrounds.map(bg => (
+
+ ))}
+ >
+ );
+};
diff --git a/interface/src/components/backgroundSelector/BackgroundSwatch.tsx b/interface/src/components/backgroundSelector/BackgroundSwatch.tsx
new file mode 100644
index 00000000..ab55bbb6
--- /dev/null
+++ b/interface/src/components/backgroundSelector/BackgroundSwatch.tsx
@@ -0,0 +1,36 @@
+import React from 'react';
+
+interface BackgroundSwatchProps {
+ background: {
+ id: string;
+ type: string;
+ url: string;
+ previewUrl: string;
+ isPreset: boolean;
+ };
+ selectBackground: (fileId: string) => void;
+ isEditMode: boolean;
+ deleteBackground: (fileId: string) => Promise;
+ selectedBackground: string | null;
+ selectedType: 'background' | 'theme';
+}
+
+export const BackgroundSwatch: React.FC = ({ background, selectBackground, isEditMode, deleteBackground, selectedBackground, selectedType }) => {
+ const { id, url, type } = background;
+ const isSelected = selectedBackground === id && selectedType === "background";
+
+ return (
+ selectBackground(id)} className={`relative w-16 h-16 cursor-pointer rounded-xl transition ring dark:ring-white ring-zinc-300 ${isEditMode ? 'animate-shake' : ''} ${isSelected ? 'dark:ring-2 ring-4' : 'ring-0'}`}>
+ {isEditMode && (
+
deleteBackground(id)}>
+
+
+ )}
+ {type === 'image' ?
+

:
+
+ }
+
+ );
+};
\ No newline at end of file
diff --git a/interface/src/components/backgroundSelector/DownloadProgressCircle.tsx b/interface/src/components/backgroundSelector/DownloadProgressCircle.tsx
new file mode 100644
index 00000000..220585df
--- /dev/null
+++ b/interface/src/components/backgroundSelector/DownloadProgressCircle.tsx
@@ -0,0 +1,16 @@
+import React from 'react';
+
+interface DownloadProgressCircleProps {
+ progress: number;
+}
+
+export const DownloadProgressCircle: React.FC = ({ progress }) => {
+ const calcCircumference = (radius: number) => 2 * Math.PI * radius;
+
+ return (
+
+ );
+};
diff --git a/interface/src/components/backgroundSelector/FileUploader.tsx b/interface/src/components/backgroundSelector/FileUploader.tsx
new file mode 100644
index 00000000..cf8c93a2
--- /dev/null
+++ b/interface/src/components/backgroundSelector/FileUploader.tsx
@@ -0,0 +1,17 @@
+import React, { ChangeEvent } from 'react';
+
+interface FileUploaderProps {
+ handleFileChange: (e: ChangeEvent) => Promise;
+}
+
+export const FileUploader: React.FC = ({ handleFileChange }) => {
+ return (
+
+
+ {/* Plus icon */}
+
+
+
+
+ );
+};
\ No newline at end of file
diff --git a/interface/src/components/backgroundSelector/RemoveButton.tsx b/interface/src/components/backgroundSelector/RemoveButton.tsx
new file mode 100644
index 00000000..63b9dfac
--- /dev/null
+++ b/interface/src/components/backgroundSelector/RemoveButton.tsx
@@ -0,0 +1,14 @@
+import React from 'react';
+
+interface RemoveButtonProps {
+ selectedBackground: string | null;
+ selectNoBackground: () => void;
+}
+
+export const RemoveButton: React.FC = ({ selectedBackground, selectNoBackground }) => {
+ return (
+
+ );
+};