From 3c5769e27543f14cd94c4924966261a91dc8f1c0 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Tue, 14 Nov 2023 12:08:18 +1100 Subject: [PATCH] separate backgroundselector file --- .../src/components/BackgroundSelector.tsx | 155 +++++++----------- .../backgroundSelector/BackgroundList.tsx | 30 ++++ .../backgroundSelector/BackgroundSwatch.tsx | 36 ++++ .../DownloadProgressCircle.tsx | 16 ++ .../backgroundSelector/FileUploader.tsx | 17 ++ .../backgroundSelector/RemoveButton.tsx | 14 ++ 6 files changed, 175 insertions(+), 93 deletions(-) create mode 100644 interface/src/components/backgroundSelector/BackgroundList.tsx create mode 100644 interface/src/components/backgroundSelector/BackgroundSwatch.tsx create mode 100644 interface/src/components/backgroundSelector/DownloadProgressCircle.tsx create mode 100644 interface/src/components/backgroundSelector/FileUploader.tsx create mode 100644 interface/src/components/backgroundSelector/RemoveButton.tsx 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)}> -
-
- )} - swatch -
- ))} - {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 ? '' : ''} - -
- swatch -
- ))} -
+ -

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' ? + swatch : +
+ ); +}; \ 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 ( + + ); +};