"use client"; import { useState, useEffect, useCallback, useRef } from "react"; import { TvAdvancedChart } from "./TvChart"; // ── Constantes ──────────────────────────────────────────────────────────────── const INTERVALS: { v: string; l: string }[] = [ { v: "60", l: "1h" }, { v: "240", l: "4h" }, { v: "D", l: "1J" }, { v: "W", l: "1S" }, ]; const QUICK_SYMBOLS = [ { label: "EUR/USD", value: "FX:EURUSD" }, { label: "GBP/USD", value: "FX:GBPUSD" }, { label: "USD/JPY", value: "FX:USDJPY" }, { label: "AUD/USD", value: "FX:AUDUSD" }, { label: "NZD/USD", value: "FX:NZDUSD" }, { label: "USD/CAD", value: "FX:USDCAD" }, { label: "USD/CHF", value: "FX:USDCHF" }, { label: "EUR/GBP", value: "FX:EURGBP" }, { label: "EUR/JPY", value: "FX:EURJPY" }, { label: "GBP/JPY", value: "FX:GBPJPY" }, { label: "S&P 500", value: "FOREXCOM:SPXUSD" }, { label: "DXY", value: "CAPITALCOM:DXY" }, { label: "Or", value: "TVC:GOLD" }, { label: "VIX", value: "PEPPERSTONE:VIX" }, { label: "BTC/USD", value: "BINANCE:BTCUSDT" }, ]; // ── Types ───────────────────────────────────────────────────────────────────── interface NoteImage { id: string; dataUrl: string; } interface SlotState { symbol: string; interval: string; title: string; notes: string; images: NoteImage[]; } interface Archive { id: string; savedAt: string; slot: SlotState; } // ── LocalStorage helpers ────────────────────────────────────────────────────── const LS_SLOTS = "ideas_slots_v1"; const LS_ARCHIVES = "ideas_archives_v1"; function loadLS(key: string, fb: T): T { if (typeof window === "undefined") return fb; try { const r = localStorage.getItem(key); return r ? JSON.parse(r) as T : fb; } catch { return fb; } } function saveLS(key: string, val: unknown) { try { localStorage.setItem(key, JSON.stringify(val)); } catch {} } const DEFAULT_SLOT = (symbol = "FX:EURUSD"): SlotState => ({ symbol, interval: "240", title: "", notes: "", images: [], }); // ── NotePane ────────────────────────────────────────────────────────────────── function NotePane({ slot, onChange }: { slot: SlotState; onChange: (s: SlotState) => void }) { const [expanded, setExpanded] = useState(false); const handlePaste = useCallback((e: React.ClipboardEvent) => { const imgItem = Array.from(e.clipboardData.items).find(i => i.type.startsWith("image/")); if (!imgItem) return; e.preventDefault(); const file = imgItem.getAsFile(); if (!file) return; const reader = new FileReader(); reader.onload = ev => { const dataUrl = ev.target?.result as string; onChange({ ...slot, images: [...slot.images, { id: Date.now().toString(), dataUrl }] }); }; reader.readAsDataURL(file); }, [slot, onChange]); return ( <> {/* Overlay expanded */} {expanded && (
setExpanded(false)}>
e.stopPropagation()}>
{slot.title || slot.symbol}