kanban / src /components /shared /PhotoSelector.tsx
Leon4gr45's picture
Deploy magic-resume as Docker Space (port 3000)
c30ea2a verified
Raw
History Blame Contribute Delete
2.8 kB
import React, { useState } from "react";
import { Settings2, Image, EyeOff, Eye } from "lucide-react";
import { Button } from "@/components/ui/button";
import { cn } from "@/lib/utils";
import PhotoConfigDrawer from "./PhotoConfigDrawer";
import { useResumeStore } from "@/store/useResumeStore";
import { BasicInfo, PhotoConfig } from "@/types/resume";
import { useTranslations } from "@/i18n/compat/client";
interface Props {
className?: string;
}
const PhotoSelector: React.FC<Props> = ({ className }) => {
const t = useTranslations("workbench");
const [showConfig, setShowConfig] = useState(false);
const { updateBasicInfo, activeResume } = useResumeStore();
const { basic = {} as BasicInfo } = activeResume || {};
const handlePhotoChange = (
photo: string | undefined,
config?: PhotoConfig
) => {
updateBasicInfo({
...basic,
photo,
photoConfig: config,
});
};
const handleConfigChange = (config: PhotoConfig) => {
updateBasicInfo({
...basic,
photoConfig: config,
});
};
return (
<div className={cn("relative", className)}>
<div className="flex items-center justify-between">
<div className="flex items-center gap-2">
<Image className="w-4 h-4" />
<span className="text-sm font-medium">{t("basicPanel.avatar")}</span>
</div>
<div className="flex gap-4">
<Button
variant="ghost"
size="sm"
className="h-6 px-2"
onClick={() => setShowConfig(true)}
>
<Settings2 className="w-3 h-3" />
</Button>
<Button
variant="ghost"
size="sm"
className="h-6 px-2"
onClick={() => {
updateBasicInfo({
...basic,
photoConfig: {
...basic.photoConfig,
visible: !(basic.photoConfig?.visible ?? true),
},
});
}}
>
{basic.photoConfig?.visible !== false ? (
<Eye className="w-4 h-4 text-primary" />
) : (
<EyeOff className="w-4 h-4" />
)}
</Button>
</div>
</div>
<div className="mt-2 relative overflow-hidden">
{basic.photo && (
<img
src={basic.photo}
alt="Selected"
className="w-[48px] h-[48px] object-cover rounded"
/>
)}
</div>
<PhotoConfigDrawer
isOpen={showConfig}
onClose={() => setShowConfig(false)}
photo={basic.photo}
config={basic.photoConfig}
onPhotoChange={handlePhotoChange}
onConfigChange={handleConfigChange}
/>
</div>
);
};
export default PhotoSelector;