feat: Moved Add URL button from sidebar footer to channels page header…
- "src/frontend/src/components/Sidebar.tsx" - "src/frontend/src/pages/Channels.tsx" GSD-Task: S02/T03
This commit is contained in:
parent
29e8654b01
commit
ed901c8240
2 changed files with 15 additions and 37 deletions
|
|
@ -8,12 +8,10 @@ import {
|
||||||
Server,
|
Server,
|
||||||
ChevronLeft,
|
ChevronLeft,
|
||||||
ChevronRight,
|
ChevronRight,
|
||||||
Link2,
|
|
||||||
} from 'lucide-react';
|
} from 'lucide-react';
|
||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import { TubearrLogo } from './TubearrLogo';
|
import { TubearrLogo } from './TubearrLogo';
|
||||||
import { useDownloadProgressConnection } from '../contexts/DownloadProgressContext';
|
import { useDownloadProgressConnection } from '../contexts/DownloadProgressContext';
|
||||||
import { AddUrlModal } from './AddUrlModal';
|
|
||||||
|
|
||||||
const NAV_ITEMS = [
|
const NAV_ITEMS = [
|
||||||
{ to: '/', icon: Radio, label: 'Channels' },
|
{ to: '/', icon: Radio, label: 'Channels' },
|
||||||
|
|
@ -26,7 +24,6 @@ const NAV_ITEMS = [
|
||||||
|
|
||||||
export function Sidebar() {
|
export function Sidebar() {
|
||||||
const wsConnected = useDownloadProgressConnection();
|
const wsConnected = useDownloadProgressConnection();
|
||||||
const [showAddUrl, setShowAddUrl] = useState(false);
|
|
||||||
const [collapsed, setCollapsed] = useState(() => {
|
const [collapsed, setCollapsed] = useState(() => {
|
||||||
try {
|
try {
|
||||||
return localStorage.getItem('tubearr-sidebar-collapsed') === 'true';
|
return localStorage.getItem('tubearr-sidebar-collapsed') === 'true';
|
||||||
|
|
@ -132,38 +129,6 @@ export function Sidebar() {
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Add URL button */}
|
|
||||||
<div
|
|
||||||
style={{
|
|
||||||
padding: collapsed ? 'var(--space-2) var(--space-2)' : 'var(--space-2) var(--space-3)',
|
|
||||||
borderTop: '1px solid var(--border)',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<button
|
|
||||||
onClick={() => setShowAddUrl(true)}
|
|
||||||
title={collapsed ? 'Download URL' : undefined}
|
|
||||||
style={{
|
|
||||||
display: 'flex',
|
|
||||||
alignItems: 'center',
|
|
||||||
gap: 'var(--space-2)',
|
|
||||||
width: '100%',
|
|
||||||
padding: `var(--space-2) ${collapsed ? 'var(--space-2)' : 'var(--space-3)'}`,
|
|
||||||
borderRadius: 'var(--radius-md)',
|
|
||||||
backgroundColor: 'var(--accent)',
|
|
||||||
color: 'var(--text-inverse)',
|
|
||||||
fontSize: 'var(--font-size-sm)',
|
|
||||||
fontWeight: 600,
|
|
||||||
border: 'none',
|
|
||||||
cursor: 'pointer',
|
|
||||||
justifyContent: collapsed ? 'center' : 'flex-start',
|
|
||||||
transition: 'opacity var(--transition-fast)',
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<Link2 size={16} style={{ flexShrink: 0 }} />
|
|
||||||
{!collapsed && <span>Add URL</span>}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* WebSocket connection status */}
|
{/* WebSocket connection status */}
|
||||||
<div
|
<div
|
||||||
style={{
|
style={{
|
||||||
|
|
@ -199,7 +164,6 @@ export function Sidebar() {
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<AddUrlModal open={showAddUrl} onClose={() => setShowAddUrl(false)} />
|
|
||||||
</nav>
|
</nav>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import { useState, useMemo, useCallback } from 'react';
|
import { useState, useMemo, useCallback } from 'react';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { Plus, Loader, RefreshCw, Download } from 'lucide-react';
|
import { Plus, Loader, RefreshCw, Download, Link2 } from 'lucide-react';
|
||||||
import { useChannels, useScanAllChannels } from '../api/hooks/useChannels';
|
import { useChannels, useScanAllChannels } from '../api/hooks/useChannels';
|
||||||
import { useCollectAllMonitored } from '../api/hooks/useContent';
|
import { useCollectAllMonitored } from '../api/hooks/useContent';
|
||||||
import { Table, type Column } from '../components/Table';
|
import { Table, type Column } from '../components/Table';
|
||||||
|
|
@ -8,6 +8,7 @@ import { PlatformBadge } from '../components/PlatformBadge';
|
||||||
import { StatusBadge } from '../components/StatusBadge';
|
import { StatusBadge } from '../components/StatusBadge';
|
||||||
import { ProgressBar } from '../components/ProgressBar';
|
import { ProgressBar } from '../components/ProgressBar';
|
||||||
import { AddChannelModal } from '../components/AddChannelModal';
|
import { AddChannelModal } from '../components/AddChannelModal';
|
||||||
|
import { AddUrlModal } from '../components/AddUrlModal';
|
||||||
import { SkeletonChannelsList } from '../components/Skeleton';
|
import { SkeletonChannelsList } from '../components/Skeleton';
|
||||||
import { useToast } from '../components/Toast';
|
import { useToast } from '../components/Toast';
|
||||||
import { formatRelativeTime } from '../utils/format';
|
import { formatRelativeTime } from '../utils/format';
|
||||||
|
|
@ -18,6 +19,7 @@ import type { ChannelWithCounts } from '@shared/types/api';
|
||||||
export function Channels() {
|
export function Channels() {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [showAddModal, setShowAddModal] = useState(false);
|
const [showAddModal, setShowAddModal] = useState(false);
|
||||||
|
const [showAddUrl, setShowAddUrl] = useState(false);
|
||||||
const { toast } = useToast();
|
const { toast } = useToast();
|
||||||
|
|
||||||
const { data: channels, isLoading, error, refetch } = useChannels();
|
const { data: channels, isLoading, error, refetch } = useChannels();
|
||||||
|
|
@ -244,6 +246,15 @@ export function Channels() {
|
||||||
)}
|
)}
|
||||||
{collectAll.isPending ? 'Collecting...' : 'Collect All Monitored'}
|
{collectAll.isPending ? 'Collecting...' : 'Collect All Monitored'}
|
||||||
</button>
|
</button>
|
||||||
|
{/* Add URL button */}
|
||||||
|
<button
|
||||||
|
onClick={() => setShowAddUrl(true)}
|
||||||
|
className="btn btn-ghost"
|
||||||
|
title="Download URL"
|
||||||
|
>
|
||||||
|
<Link2 size={16} />
|
||||||
|
Add URL
|
||||||
|
</button>
|
||||||
{/* Add Channel button */}
|
{/* Add Channel button */}
|
||||||
<button
|
<button
|
||||||
onClick={() => setShowAddModal(true)}
|
onClick={() => setShowAddModal(true)}
|
||||||
|
|
@ -277,6 +288,9 @@ export function Channels() {
|
||||||
|
|
||||||
{/* Add Channel modal */}
|
{/* Add Channel modal */}
|
||||||
<AddChannelModal open={showAddModal} onClose={() => setShowAddModal(false)} />
|
<AddChannelModal open={showAddModal} onClose={() => setShowAddModal(false)} />
|
||||||
|
|
||||||
|
{/* Add URL modal */}
|
||||||
|
<AddUrlModal open={showAddUrl} onClose={() => setShowAddUrl(false)} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue