Components
A feature-rich, animated tweet composer with character limits, thread creation, auto-resizing textareas, and modern UI interactions
Loading preview...
"use client"
import React, { useState } from 'react'
import { TweetComposer, Tweet } from '@/components/ui/twitter-tweet-composer'
import { Card } from '@/components/ui/card'
import { Badge } from '@/components/ui/badge'
import { Separator } from '@/components/ui/separator'
export default function Demo() {
const [submittedTweets, setSubmittedTweets] = useState<Tweet[][]>([])
const handleTweet = (tweets: Tweet[]) => {
setSubmittedTweets(prev => [...prev, tweets])
console.log('Tweets submitted:', tweets)
}
const handleCancel = () => {
console.log('Tweet cancelled')
}
return (
<div className="min-h-screen bg-background p-8 w-full space-y-4">
<div className="flex justify-center">
<TweetComposer
placeholder="What's happening?"
maxCharacters={280}
userAvatar="https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=32&h=32&fit=crop&crop=face"
userName="John Doe"
userHandle="@johndoe"
onTweet={handleTweet}
onCancel={handleCancel}
className="shadow-lg"
/>
</div>
{/* Submitted Tweets Display */}
{submittedTweets.length > 0 && (
<Card className="p-6">
<h2 className="text-xl font-semibold mb-4">Submitted Tweets</h2>
<div className="space-y-4">
{submittedTweets.map((tweetGroup, groupIndex) => (
<div key={groupIndex} className="border-l-2 border-primary/20 pl-4">
<div className="flex items-center gap-2 mb-2">
<Badge variant="outline">
{tweetGroup.length === 1 ? 'Single Tweet' : `Thread (${tweetGroup.length} tweets)`}
</Badge>
<span className="text-xs text-muted-foreground">
Submitted {new Date().toLocaleTimeString()}
</span>
</div>
{tweetGroup.map((tweet, index) => (
<div key={tweet.id} className="mb-2">
{index > 0 && <Separator className="my-2" />}
<p className="text-sm bg-muted/30 p-3 rounded-lg">
{tweet.content}
</p>
<div className="text-xs text-muted-foreground mt-1">
{tweet.characterCount} characters
</div>
</div>
))}
</div>
))}
</div>
</Card>
)}
</div>
)
}