Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 7 additions & 18 deletions components/TradingViewWidget.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use client';

import React, { memo, useState, useEffect } from 'react';
import React, { memo, useState } from 'react';
import useTradingViewWidget from "@/hooks/useTradingViewWidget";
import { cn } from "@/lib/utils";
import { Maximize2, Minimize2 } from 'lucide-react';
Expand All @@ -17,27 +17,14 @@ interface TradingViewWidgetProps {

const TradingViewWidget = ({ title, scriptUrl, config, height = 600, className, allowExpand = false }: TradingViewWidgetProps) => {
const [isExpanded, setIsExpanded] = useState(false);
const [windowHeight, setWindowHeight] = useState(0);

useEffect(() => {
if (typeof window !== 'undefined') {
setWindowHeight(window.innerHeight);
const handleResize = () => setWindowHeight(window.innerHeight);
window.addEventListener('resize', handleResize);
return () => window.removeEventListener('resize', handleResize);
}
}, []);

const currentHeight = isExpanded ? windowHeight : height;

const widgetConfig = {
...config,
height: currentHeight,
width: "100%",
autosize: true,
};

const containerRef = useTradingViewWidget(scriptUrl, widgetConfig, currentHeight);
const containerRef = useTradingViewWidget(scriptUrl, widgetConfig);

const toggleExpand = () => {
setIsExpanded(!isExpanded);
Expand All @@ -63,9 +50,11 @@ const TradingViewWidget = ({ title, scriptUrl, config, height = 600, className,
</Button>
)}

<div className={cn('tradingview-widget-container', className, isExpanded && "h-full")} ref={containerRef}>
<div className="tradingview-widget-container__widget" style={{ height: currentHeight, width: "100%" }} />
</div>
<div
className={cn('tradingview-widget-container', className, isExpanded && "h-full")}
ref={containerRef}
style={{ height: isExpanded ? '100vh' : height, width: "100%" }}
/>
</div>
</div>
);
Expand Down
27 changes: 11 additions & 16 deletions hooks/useTradingViewWidget.tsx
Original file line number Diff line number Diff line change
@@ -1,36 +1,31 @@
'use client';
import { useEffect, useRef } from "react";

const useTradingViewWidget = (scriptUrl: string, config: Record<string, unknown>, height: number | string = 600) => {
const useTradingViewWidget = (scriptUrl: string, config: Record<string, unknown>) => {
const containerRef = useRef<HTMLDivElement | null>(null);
const serializedConfig = JSON.stringify(config);

useEffect(() => {
if (!containerRef.current) return;
const container = containerRef.current;
if (!container) return;

// Clean up previous instance
containerRef.current.innerHTML = '';
container.innerHTML = '';

// Create wrapper with dynamic height support
// If autosize is true in config, we want 100% height/width
const isAutosize = config.autosize === true;
const styleHeight = isAutosize ? '100%' : `${height}px`;

containerRef.current.innerHTML = `<div class="tradingview-widget-container__widget" style="width: 100%; height: ${styleHeight};"></div>`;
container.innerHTML = '<div class="tradingview-widget-container__widget" style="width: 100%; height: 100%;"></div>';

const script = document.createElement("script");
script.src = scriptUrl;
script.async = true;
script.innerHTML = JSON.stringify(config);
script.innerHTML = serializedConfig;

containerRef.current.appendChild(script);
container.appendChild(script);

return () => {
if (containerRef.current) {
containerRef.current.innerHTML = '';
}
container.innerHTML = '';
}
}, [scriptUrl, JSON.stringify(config), height]) // Use stringified config to avoid ref issues
}, [scriptUrl, serializedConfig])

return containerRef;
}
export default useTradingViewWidget
export default useTradingViewWidget