Skip to content

Commit 527ff14

Browse files
authored
release: scene components, trend discovery, dashboard settings, sponsor bridge, distribution logging (#598)
release: scene components, trend discovery, dashboard settings, sponsor bridge, distribution logging
2 parents c587604 + 5bfa0e0 commit 527ff14

File tree

27 files changed

+5625
-412
lines changed

27 files changed

+5625
-412
lines changed

app/(dashboard)/dashboard/page.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export const dynamic = "force-dynamic";
22

33
import { SectionCardsLive } from "@/components/section-cards-live";
44
import { RecentActivity } from "@/components/recent-activity";
5+
import { PipelineStatus } from "@/components/pipeline-status";
56

67
export default function DashboardPage() {
78
return (
@@ -11,7 +12,7 @@ export default function DashboardPage() {
1112
Content Ops Dashboard
1213
</h1>
1314
<p className="text-muted-foreground">
14-
Overview of your automated content engine \u2014 videos, sponsors,
15+
Overview of your automated content engine videos, sponsors,
1516
and pipeline health.
1617
</p>
1718
</div>
@@ -25,7 +26,9 @@ export default function DashboardPage() {
2526
<p className="mt-2 text-sm text-muted-foreground">
2627
Real-time view of content moving through the pipeline.
2728
</p>
28-
{/* Pipeline status will be added here */}
29+
<div className="mt-4">
30+
<PipelineStatus />
31+
</div>
2932
</div>
3033
</div>
3134
</div>

app/(dashboard)/dashboard/settings/page.tsx

Lines changed: 34 additions & 180 deletions
Original file line numberDiff line numberDiff line change
@@ -5,46 +5,8 @@ import {
55
CardHeader,
66
CardTitle,
77
} from "@/components/ui/card";
8-
import { Input } from "@/components/ui/input";
9-
import { Label } from "@/components/ui/label";
108
import { Badge } from "@/components/ui/badge";
11-
import { Separator } from "@/components/ui/separator";
12-
13-
const PUBLISH_DAYS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
14-
const DEFAULT_PUBLISH_DAYS = ["Mon", "Wed", "Fri"];
15-
16-
const CONTENT_CATEGORIES = [
17-
"JavaScript",
18-
"TypeScript",
19-
"React",
20-
"Next.js",
21-
"Angular",
22-
"Svelte",
23-
"Node.js",
24-
"CSS",
25-
"DevOps",
26-
"AI / ML",
27-
"Web Performance",
28-
"Tooling",
29-
];
30-
31-
const RATE_CARD_TIERS = [
32-
{
33-
name: "Pre-roll Mention",
34-
description: "15-second sponsor mention at the start of the video",
35-
price: "$200",
36-
},
37-
{
38-
name: "Mid-roll Segment",
39-
description: "60-second dedicated sponsor segment mid-video",
40-
price: "$500",
41-
},
42-
{
43-
name: "Dedicated Video",
44-
description: "Full sponsored video with product deep-dive",
45-
price: "$1,500",
46-
},
47-
];
9+
import { SettingsForm } from "./settings-form";
4810

4911
const INTEGRATIONS = [
5012
{
@@ -112,150 +74,42 @@ export default function SettingsPage() {
11274
</p>
11375
</div>
11476

115-
<div className="rounded-lg border border-dashed bg-muted/50 p-4 text-sm text-muted-foreground">
116-
<strong>Note:</strong> Settings are currently read-only. Editing will be
117-
enabled in a future phase once a settings schema is added to Sanity.
118-
</div>
119-
120-
<div className="grid gap-6 md:grid-cols-2">
121-
{/* Publishing Cadence */}
122-
<Card>
123-
<CardHeader>
124-
<CardTitle>Publishing Cadence</CardTitle>
125-
<CardDescription>
126-
Control how often videos are published and on which days.
127-
</CardDescription>
128-
</CardHeader>
129-
<CardContent className="space-y-4">
130-
<div className="space-y-2">
131-
<Label htmlFor="videos-per-week">Videos per week</Label>
132-
<Input
133-
id="videos-per-week"
134-
type="number"
135-
defaultValue={3}
136-
min={1}
137-
max={7}
138-
disabled
139-
className="w-24"
140-
/>
141-
</div>
142-
<Separator />
143-
<div className="space-y-2">
144-
<Label>Preferred publish days</Label>
145-
<div className="flex flex-wrap gap-2">
146-
{PUBLISH_DAYS.map((day) => (
147-
<Badge
148-
key={day}
149-
variant={
150-
DEFAULT_PUBLISH_DAYS.includes(day)
151-
? "default"
152-
: "outline"
153-
}
154-
className="cursor-default"
155-
>
156-
{day}
157-
</Badge>
158-
))}
159-
</div>
160-
</div>
161-
<p className="text-xs text-muted-foreground">
162-
Settings will be stored in Sanity once a settings schema is
163-
created.
164-
</p>
165-
</CardContent>
166-
</Card>
77+
<SettingsForm />
16778

168-
{/* Content Categories */}
169-
<Card>
170-
<CardHeader>
171-
<CardTitle>Content Categories</CardTitle>
172-
<CardDescription>
173-
Categories used for content idea classification and YouTube
174-
metadata.
175-
</CardDescription>
176-
</CardHeader>
177-
<CardContent className="space-y-4">
178-
<div className="flex flex-wrap gap-2">
179-
{CONTENT_CATEGORIES.map((category) => (
180-
<Badge key={category} variant="secondary">
181-
{category}
182-
</Badge>
183-
))}
184-
</div>
185-
<p className="text-xs text-muted-foreground">
186-
Custom category management will be available in a future phase.
187-
</p>
188-
</CardContent>
189-
</Card>
190-
191-
{/* Sponsor Rate Card */}
192-
<Card>
193-
<CardHeader>
194-
<CardTitle>Sponsor Rate Card</CardTitle>
195-
<CardDescription>
196-
Sponsorship tiers and pricing used by the sponsor portal and
197-
pipeline.
198-
</CardDescription>
199-
</CardHeader>
200-
<CardContent>
201-
<div className="space-y-3">
202-
{RATE_CARD_TIERS.map((tier) => (
203-
<div
204-
key={tier.name}
205-
className="flex items-center justify-between rounded-lg border p-3"
206-
>
207-
<div>
208-
<p className="text-sm font-medium">{tier.name}</p>
209-
<p className="text-xs text-muted-foreground">
210-
{tier.description}
211-
</p>
212-
</div>
213-
<span className="text-sm font-semibold">{tier.price}</span>
79+
{/* Integrations Status — server-rendered */}
80+
<Card>
81+
<CardHeader>
82+
<CardTitle>Integrations Status</CardTitle>
83+
<CardDescription>
84+
Connection status for external services. Green indicates the
85+
environment variable is configured.
86+
</CardDescription>
87+
</CardHeader>
88+
<CardContent>
89+
<div className="space-y-3">
90+
{integrationStatus.map((integration) => (
91+
<div
92+
key={integration.name}
93+
className="flex items-center gap-3"
94+
>
95+
<IntegrationDot connected={integration.connected} />
96+
<div className="flex-1">
97+
<p className="text-sm font-medium">{integration.name}</p>
98+
<p className="text-xs text-muted-foreground">
99+
{integration.description}
100+
</p>
214101
</div>
215-
))}
216-
</div>
217-
<p className="mt-4 text-xs text-muted-foreground">
218-
Rate card editing will be available once the sponsor rate card
219-
schema is finalized.
220-
</p>
221-
</CardContent>
222-
</Card>
223-
224-
{/* Integrations Status */}
225-
<Card>
226-
<CardHeader>
227-
<CardTitle>Integrations Status</CardTitle>
228-
<CardDescription>
229-
Connection status for external services. Green indicates the
230-
environment variable is configured.
231-
</CardDescription>
232-
</CardHeader>
233-
<CardContent>
234-
<div className="space-y-3">
235-
{integrationStatus.map((integration) => (
236-
<div
237-
key={integration.name}
238-
className="flex items-center gap-3"
102+
<Badge
103+
variant={integration.connected ? "default" : "outline"}
104+
className="text-xs"
239105
>
240-
<IntegrationDot connected={integration.connected} />
241-
<div className="flex-1">
242-
<p className="text-sm font-medium">{integration.name}</p>
243-
<p className="text-xs text-muted-foreground">
244-
{integration.description}
245-
</p>
246-
</div>
247-
<Badge
248-
variant={integration.connected ? "default" : "outline"}
249-
className="text-xs"
250-
>
251-
{integration.connected ? "Connected" : "Not configured"}
252-
</Badge>
253-
</div>
254-
))}
255-
</div>
256-
</CardContent>
257-
</Card>
258-
</div>
106+
{integration.connected ? "Connected" : "Not configured"}
107+
</Badge>
108+
</div>
109+
))}
110+
</div>
111+
</CardContent>
112+
</Card>
259113
</div>
260114
);
261115
}

0 commit comments

Comments
 (0)