← Back
import { useState } from 'react';
import { useLocation, useNavigate, Navigate } from 'react-router-dom';
import WhaleProfile from '../components/signals/WhaleProfile';
import CopyConfigModal from '../components/copy/CopyConfigModal';
import { useCopySubscriptions, DEFAULT_CONFIG } from '../hooks/useCopySubscriptions';
import { whaleCodename } from '../utils/whales';
import { useT } from '../i18n/LanguageContext';
import '../redesign/editorial.css';

// Точка расширения под режим лидера: 'public' = смотрит фолловер (видит CTA
// «Копировать»); 'owner' = смотрит сам лидер (увидит дашборд «Меня копируют»).
// Сейчас всегда 'public'; когда включим режим лидера — определять по владению.
type ViewMode = 'public' | 'owner';

export default function WhaleProfilePage() {
  // Address is passed via router state (never in the URL) so whale identity is
  // not exposed/shareable. Direct hits / refresh have no state → back to Leaders.
  const location = useLocation();
  const navState = location.state as { address?: string; mode?: 'copy' | 'fade' } | null;
  const address = navState?.address;
  const boardMode = navState?.mode;
  const navigate = useNavigate();
  const viewMode: ViewMode = 'public';
  const { subs, upsert } = useCopySubscriptions();
  const [showModal, setShowModal] = useState(false);
  const { t, lang } = useT();

  if (!address) {
    return <Navigate to="/" replace />;
  }

  const existing = subs.find(s => s.address.toLowerCase() === address.toLowerCase());
  const label = whaleCodename(address, lang);
  // Подписан на фейд → аватарка с черепом (визуально отличает фейд от копи).
  const isFade = existing?.config?.direction === 'fade';

  return (
    <div className={`wpp-page pk-profile${isFade ? ' pk-fade' : ''}`}>
      <div className="wpp-back" onClick={() => navigate(-1)}>
        {t('mkt.back')}
      </div>
      <WhaleProfile address={address} />

      {/* Sticky action bar */}
      <div className="wpp-cta-bar">
        {viewMode === 'public' ? (
          <button className="wpp-cta" onClick={() => setShowModal(true)}>
            {existing ? t('wpp.editCopy') : t('wpp.copyLeader')}
          </button>
        ) : (
          // owner-режим (заглушка под будущий дашборд лидера)
          <button className="wpp-cta wpp-cta-owner" disabled>
            {t('wpp.copiedSoon')}
          </button>
        )}
      </div>

      {showModal && (
        <CopyConfigModal
          leaderLabel={label}
          initial={existing?.config ?? (boardMode === 'fade' ? { ...DEFAULT_CONFIG, direction: 'fade' } : undefined)}
          editing={!!existing}
          onSave={(config) => {
            upsert(address, label, config);
            setShowModal(false);
            navigate('/copy');
          }}
          onClose={() => setShowModal(false)}
        />
      )}
    </div>
  );
}

📜 Git History

6780e2ffeat(poli): fade-subscribed profile shows skull avatar (distinguish fade from copy)10 days ago
b398e2efeat(poli): activate Leaders COPY⇄FADE toggle (Winners/Losers board)10 days ago
a268290feat(poli): editorial Whale Profile + clean chrome shark/skull avatars (chunk 4)11 days ago
6c47fa4chore: local Polikopi project home + Phase 1 redesign artifacts12 days ago
Show last diff
Loading...