From 3a042473f027483a13a50bfe6dda3941546aaa17 Mon Sep 17 00:00:00 2001 From: c0mrade Date: Wed, 4 Feb 2026 15:40:30 +0300 Subject: [PATCH] =?UTF-8?q?refactor:=20unify=20ColorPicker=20=E2=80=94=20r?= =?UTF-8?q?emove=20native=20input,=20fix=20scroll=20closing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove native , eyedropper button, colorInputRef, isTelegram check and isInTelegramWebApp import from ColorPicker - Remove scroll event listener so picker only closes on click/tap outside - Replace native color input in AdminWheel InlinePrizeForm with ColorPicker --- src/components/ColorPicker.tsx | 56 +--------------------------------- src/pages/AdminWheel.tsx | 26 ++++------------ 2 files changed, 7 insertions(+), 75 deletions(-) diff --git a/src/components/ColorPicker.tsx b/src/components/ColorPicker.tsx index 080e96e..8a8fd17 100644 --- a/src/components/ColorPicker.tsx +++ b/src/components/ColorPicker.tsx @@ -1,6 +1,5 @@ -import { useState, useRef, useEffect, useMemo, useCallback } from 'react'; +import { useState, useRef, useEffect, useCallback } from 'react'; import { createPortal } from 'react-dom'; -import { isInTelegramWebApp } from '@/hooks/useTelegramSDK'; interface ColorPickerProps { value: string; @@ -111,9 +110,6 @@ export function ColorPicker({ value, onChange, label, description, disabled }: C const buttonRef = useRef(null); const pickerRef = useRef(null); - const colorInputRef = useRef(null); - - const isTelegram = useMemo(() => isInTelegramWebApp(), []); // Sync with external value useEffect(() => { @@ -177,18 +173,15 @@ export function ColorPicker({ value, onChange, label, description, disabled }: C } }; - const handleScroll = () => handleClose(); const handleResize = () => updatePosition(); document.addEventListener('mousedown', handleClickOutside); document.addEventListener('touchstart', handleClickOutside as EventListener); - window.addEventListener('scroll', handleScroll, true); window.addEventListener('resize', handleResize); return () => { document.removeEventListener('mousedown', handleClickOutside); document.removeEventListener('touchstart', handleClickOutside as EventListener); - window.removeEventListener('scroll', handleScroll, true); window.removeEventListener('resize', handleResize); }; }, [isOpen, handleClose, updatePosition]); @@ -229,18 +222,6 @@ export function ColorPicker({ value, onChange, label, description, disabled }: C [hsl, updateColorFromHsl], ); - // Handle native color input - const handleColorInputChange = useCallback( - (e: React.ChangeEvent) => { - const newColor = e.target.value; - setLocalValue(newColor); - const rgb = hexToRgb(newColor); - setHsl(rgbToHsl(rgb.r, rgb.g, rgb.b)); - onChange(newColor); - }, - [onChange], - ); - // Handle hex input const handleHexInputChange = useCallback( (e: React.ChangeEvent) => { @@ -409,41 +390,6 @@ export function ColorPicker({ value, onChange, label, description, disabled }: C placeholder="#000000" maxLength={7} /> - - {/* Native color picker button (hidden in Telegram) */} - {!isTelegram && ( - <> - - - - )} {/* Render picker in portal */} diff --git a/src/pages/AdminWheel.tsx b/src/pages/AdminWheel.tsx index 213e7a0..25bc23e 100644 --- a/src/pages/AdminWheel.tsx +++ b/src/pages/AdminWheel.tsx @@ -23,6 +23,7 @@ import { CSS } from '@dnd-kit/utilities'; import { adminWheelApi, type WheelPrizeAdmin, type CreateWheelPrizeData } from '../api/wheel'; import { useDestructiveConfirm } from '@/platform'; import FortuneWheel from '../components/wheel/FortuneWheel'; +import { ColorPicker } from '@/components/ColorPicker'; import { useBackButton } from '../platform/hooks/useBackButton'; import { usePlatform } from '../platform/hooks/usePlatform'; @@ -1146,26 +1147,11 @@ function InlinePrizeForm({ {/* Color */} -
- -
- setFormData({ ...formData, color: e.target.value })} - className="h-10 w-12 cursor-pointer rounded" - /> - setFormData({ ...formData, color: e.target.value })} - className="input flex-1" - pattern="^#[0-9A-Fa-f]{6}$" - /> -
-
+ setFormData({ ...formData, color })} + /> {/* Active toggle */}