From 973e661b96646c3a490848709058ada0cc9d251c Mon Sep 17 00:00:00 2001 From: Altay Date: Fri, 15 Dec 2023 17:59:27 +0300 Subject: [PATCH] refactor: clean-up `episode-ai-summary` --- .../episode-ai-summary-generator.tsx} | 36 +++++++++---------- .../episode-ai-summary-panel.tsx | 24 +++++++++++++ .../episode-ai-summary-placeholder.tsx} | 2 +- .../episode-ai-summary-streamer.tsx | 6 +--- .../episode-ai-summary.tsx} | 28 ++++++--------- components/episode-detail.tsx | 29 ++++++++------- components/ui/pre-wrap.tsx | 7 ++++ 7 files changed, 79 insertions(+), 53 deletions(-) rename components/{episode-ai-thingy/episode-ai-thingy-generator.tsx => episode-ai-summary/episode-ai-summary-generator.tsx} (72%) create mode 100644 components/episode-ai-summary/episode-ai-summary-panel.tsx rename components/{episode-ai-thingy/episode-ai-thingy-placeholder.tsx => episode-ai-summary/episode-ai-summary-placeholder.tsx} (90%) rename components/{episode-ai-thingy => episode-ai-summary}/episode-ai-summary-streamer.tsx (91%) rename components/{episode-ai-thingy/episode-ai-thingy.tsx => episode-ai-summary/episode-ai-summary.tsx} (70%) create mode 100644 components/ui/pre-wrap.tsx diff --git a/components/episode-ai-thingy/episode-ai-thingy-generator.tsx b/components/episode-ai-summary/episode-ai-summary-generator.tsx similarity index 72% rename from components/episode-ai-thingy/episode-ai-thingy-generator.tsx rename to components/episode-ai-summary/episode-ai-summary-generator.tsx index fb1f5f6..d37c6e6 100644 --- a/components/episode-ai-thingy/episode-ai-thingy-generator.tsx +++ b/components/episode-ai-summary/episode-ai-summary-generator.tsx @@ -3,14 +3,14 @@ import type { Tables } from '@/types/supabase/database'; import { transcribeEpisode } from '@/lib/services/ai/transcribe-episode'; -import { Box, Button, Callout, Flex, Text } from '@radix-ui/themes'; +import { Button, Callout, Flex, Text } from '@radix-ui/themes'; import { useCallback, useState } from 'react'; import { FaExclamationTriangle } from 'react-icons/fa'; import { PiRobotBold } from 'react-icons/pi'; -import { Panel } from '../ui/panel'; +import { EpisodeAISummaryPanel } from './episode-ai-summary-panel'; +import { EpisodeAISummaryPlaceholder } from './episode-ai-summary-placeholder'; import { EpisodeAISummaryStreamer } from './episode-ai-summary-streamer'; -import { EpisodeAIThingyPlaceholder } from './episode-ai-thingy-placeholder'; type State = | { @@ -28,7 +28,7 @@ type State = status: 'transcribing'; }; -export function EpisodeAIThingyGenerator({ +export function EpisodeAISummaryGenerator({ id, title, }: { @@ -50,7 +50,7 @@ export function EpisodeAIThingyGenerator({ switch (state.status) { case 'idle': return ( - + - + ); case 'transcribing': - return Transcribing episode...; + return ( + Transcribing episode... + ); case 'summarizing': return ( - - - - - + + + ); case 'error': return ( - + @@ -91,7 +91,7 @@ export function EpisodeAIThingyGenerator({ {state.message} - + ); } } diff --git a/components/episode-ai-summary/episode-ai-summary-panel.tsx b/components/episode-ai-summary/episode-ai-summary-panel.tsx new file mode 100644 index 0000000..202784e --- /dev/null +++ b/components/episode-ai-summary/episode-ai-summary-panel.tsx @@ -0,0 +1,24 @@ +import type { PropsWithChildren } from 'react'; + +import { CollapsiblePanel } from '../ui/collapsible-panel'; +import { Panel } from '../ui/panel'; +import { PreWrap } from '../ui/pre-wrap'; + +type Props = PropsWithChildren<{ + variant?: 'collapsible' | 'default'; +}>; + +export function EpisodeAISummaryPanel({ + children, + variant = 'default', +}: Props) { + return variant === 'collapsible' ? ( + + {children} + + ) : ( + + {children} + + ); +} diff --git a/components/episode-ai-thingy/episode-ai-thingy-placeholder.tsx b/components/episode-ai-summary/episode-ai-summary-placeholder.tsx similarity index 90% rename from components/episode-ai-thingy/episode-ai-thingy-placeholder.tsx rename to components/episode-ai-summary/episode-ai-summary-placeholder.tsx index 6a1c3a4..8dd8e64 100644 --- a/components/episode-ai-thingy/episode-ai-thingy-placeholder.tsx +++ b/components/episode-ai-summary/episode-ai-summary-placeholder.tsx @@ -5,7 +5,7 @@ import { Flex } from '@radix-ui/themes'; import { CollapsiblePanel } from '../ui/collapsible-panel'; -export function EpisodeAIThingyPlaceholder(props: PropsWithChildren) { +export function EpisodeAISummaryPlaceholder(props: PropsWithChildren) { return ( {FAKE_EPISODE_SUMMARY} diff --git a/components/episode-ai-thingy/episode-ai-summary-streamer.tsx b/components/episode-ai-summary/episode-ai-summary-streamer.tsx similarity index 91% rename from components/episode-ai-thingy/episode-ai-summary-streamer.tsx rename to components/episode-ai-summary/episode-ai-summary-streamer.tsx index 554174e..d70cbef 100644 --- a/components/episode-ai-thingy/episode-ai-summary-streamer.tsx +++ b/components/episode-ai-summary/episode-ai-summary-streamer.tsx @@ -49,9 +49,5 @@ export function EpisodeAISummaryStreamer({ id, title, transcription }: Props) { const summaryMessage = messages.find((message) => message.role !== 'system'); - return ( -
- {summaryMessage ? summaryMessage.content : 'Summarizing episode...'} -
- ); + return summaryMessage ? summaryMessage.content : 'Summarizing episode...'; } diff --git a/components/episode-ai-thingy/episode-ai-thingy.tsx b/components/episode-ai-summary/episode-ai-summary.tsx similarity index 70% rename from components/episode-ai-thingy/episode-ai-thingy.tsx rename to components/episode-ai-summary/episode-ai-summary.tsx index 2f5c7de..578cd0e 100644 --- a/components/episode-ai-thingy/episode-ai-thingy.tsx +++ b/components/episode-ai-summary/episode-ai-summary.tsx @@ -3,21 +3,21 @@ import type { Tables } from '@/types/supabase/database'; import { DatabaseError } from '@/lib/errors'; import { fetchAccountAICredits } from '@/lib/services/account'; import { createSupabaseServerClient } from '@/lib/services/supabase/server'; -import { Avatar, Box, Button, Flex, Text } from '@radix-ui/themes'; +import { Avatar, Button, Flex, Text } from '@radix-ui/themes'; import { cookies } from 'next/headers'; import Link from 'next/link'; import { CgDollar, CgProfile } from 'react-icons/cg'; -import { CollapsiblePanel } from '../ui/collapsible-panel'; -import { EpisodeAIThingyGenerator } from './episode-ai-thingy-generator'; -import { EpisodeAIThingyPlaceholder } from './episode-ai-thingy-placeholder'; +import { EpisodeAISummaryGenerator } from './episode-ai-summary-generator'; +import { EpisodeAISummaryPanel } from './episode-ai-summary-panel'; +import { EpisodeAISummaryPlaceholder } from './episode-ai-summary-placeholder'; type Props = { id: Tables<'episode'>['id']; title: Tables<'episode'>['title']; }; -export async function EpisodeAIThingy(props: Props) { +export async function EpisodeAISummary(props: Props) { const supabase = createSupabaseServerClient(cookies()); const credits = await fetchAccountAICredits(); const { data, error } = await supabase @@ -32,32 +32,26 @@ export async function EpisodeAIThingy(props: Props) { if (data.length === 0 || data[0].text_summary === null) { if (credits < 1) { return ( - + - + ); } - return ; + return ; } const [episodeContent] = data; return ( - - - {episodeContent.text_summary} - - + + {episodeContent.text_summary} + {episodeContent.user ? ( diff --git a/components/episode-detail.tsx b/components/episode-detail.tsx index 151a1a4..b82d1ea 100644 --- a/components/episode-detail.tsx +++ b/components/episode-detail.tsx @@ -1,25 +1,28 @@ import type { Tables } from '@/types/supabase/database'; +import type { PropsWithChildren } from 'react'; import { DatabaseError } from '@/lib/errors'; import { createSupabaseServerClient } from '@/lib/services/supabase/server'; import { Avatar, Box, Flex, Heading, Text } from '@radix-ui/themes'; import { cookies } from 'next/headers'; -import { EpisodeAIThingy } from './episode-ai-thingy/episode-ai-thingy'; +import { EpisodeAISummary } from './episode-ai-summary/episode-ai-summary'; import { EpisodeDescription } from './episode-description'; import { CollapsiblePanel } from './ui/collapsible-panel'; import { DecorativeBox } from './ui/decorative-box'; function EpisodeDetailContent( - props: Pick< - Tables<'episode'>, - 'description' | 'duration' | 'id' | 'image' | 'published_date' | 'title' - > & { - show: { - id: Tables<'show'>['id']; - title: Tables<'show'>['title']; - }; - }, + props: PropsWithChildren< + Pick< + Tables<'episode'>, + 'description' | 'duration' | 'id' | 'image' | 'published_date' | 'title' + > & { + show: { + id: Tables<'show'>['id']; + title: Tables<'show'>['title']; + }; + } + >, ) { return ( @@ -50,7 +53,7 @@ function EpisodeDetailContent(
) : null} - + {props.children} ); } @@ -77,7 +80,9 @@ async function EpisodeDetailPage(props: { id: Tables<'episode'>['id'] }) { published_date={data.published_date} show={data.show} title={data.title} - /> + > + + ); } diff --git a/components/ui/pre-wrap.tsx b/components/ui/pre-wrap.tsx new file mode 100644 index 0000000..d0b4490 --- /dev/null +++ b/components/ui/pre-wrap.tsx @@ -0,0 +1,7 @@ +import type { PropsWithChildren } from 'react'; + +import { Box } from '@radix-ui/themes'; + +export function PreWrap(props: PropsWithChildren) { + return {props.children}; +}