main: fix build issue

Signed-off-by: nfel <nfilsaraee@gmail.com>
This commit is contained in:
nfel 2025-12-30 02:07:26 +03:30
parent c33570d3ec
commit 9fd79a2d4e
Signed by: nfel
GPG Key ID: DCC0BF3F92B0D45F
5 changed files with 124 additions and 3 deletions

View File

@ -1,5 +1,5 @@
import { NextRequest, NextResponse } from 'next/server';
import { ZarinPal } from 'zarinpal-node-sdk';
import ZarinPal from 'zarinpal-node-sdk';
import { getDatabase } from '@/lib/db';
const zarinpal = new ZarinPal({

View File

@ -1,5 +1,5 @@
import { NextRequest, NextResponse } from 'next/server';
import { ZarinPal } from 'zarinpal-node-sdk';
import ZarinPal from 'zarinpal-node-sdk';
import { getDatabase } from '@/lib/db';
const zarinpal = new ZarinPal({

View File

@ -22,6 +22,9 @@ export default function AddAlbumModal({ show, onClose, onAdd }: AddAlbumModalPro
const [isUploading, setIsUploading] = useState(false);
const [songs, setSongs] = useState<Song[]>([{ id: '', title: '', duration: '', previewUrl: '', fullUrl: '' }]);
const [error, setError] = useState('');
const [tag, setTag] = useState<'Album' | 'EP' | 'Demo' | 'Deluxe' | 'Single'>('Album');
const [format, setFormat] = useState<'mp3' | 'm4a' | 'flac' | 'wav'>('mp3');
const [bitrate, setBitrate] = useState('320kbps');
const handleAddSong = () => {
setSongs([...songs, { id: '', title: '', duration: '', previewUrl: '', fullUrl: '' }]);
@ -134,6 +137,9 @@ export default function AddAlbumModal({ show, onClose, onAdd }: AddAlbumModalPro
description,
price: priceNum,
songs: albumSongs,
tag,
format,
bitrate,
};
onAdd(newAlbum);
@ -150,6 +156,9 @@ export default function AddAlbumModal({ show, onClose, onAdd }: AddAlbumModalPro
setCoverImageFile(null);
setSongs([{ id: '', title: '', duration: '', previewUrl: '', fullUrl: '' }]);
setError('');
setTag('Album');
setFormat('mp3');
setBitrate('320kbps');
onClose();
};
@ -309,6 +318,56 @@ export default function AddAlbumModal({ show, onClose, onAdd }: AddAlbumModalPro
/>
</div>
{/* Tag, Format, and Bitrate */}
<div className="grid grid-cols-3 gap-4">
<div>
<label className="block text-sm font-medium text-gray-300 mb-2">
Tag *
</label>
<select
value={tag}
onChange={(e) => setTag(e.target.value as any)}
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-cyan focus:outline-none focus:ring-2 focus:ring-accent-cyan/50 text-white"
required
>
<option value="Album">Album</option>
<option value="EP">EP</option>
<option value="Demo">Demo</option>
<option value="Deluxe">Deluxe</option>
<option value="Single">Single</option>
</select>
</div>
<div>
<label className="block text-sm font-medium text-gray-300 mb-2">
Format *
</label>
<select
value={format}
onChange={(e) => setFormat(e.target.value as any)}
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-cyan focus:outline-none focus:ring-2 focus:ring-accent-cyan/50 text-white"
required
>
<option value="mp3">MP3</option>
<option value="m4a">M4A</option>
<option value="flac">FLAC</option>
<option value="wav">WAV</option>
</select>
</div>
<div>
<label className="block text-sm font-medium text-gray-300 mb-2">
Bitrate *
</label>
<input
type="text"
value={bitrate}
onChange={(e) => setBitrate(e.target.value)}
placeholder="320kbps"
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-cyan focus:outline-none focus:ring-2 focus:ring-accent-cyan/50 text-white placeholder-gray-500"
required
/>
</div>
</div>
{/* Songs */}
<div>
<div className="flex items-center justify-between mb-2">

View File

@ -23,6 +23,9 @@ export default function EditAlbumModal({ show, album, onClose, onUpdate }: EditA
const [isUploading, setIsUploading] = useState(false);
const [songs, setSongs] = useState<Song[]>([{ id: '', title: '', duration: '', previewUrl: '', fullUrl: '' }]);
const [error, setError] = useState('');
const [tag, setTag] = useState<'Album' | 'EP' | 'Demo' | 'Deluxe' | 'Single'>('Album');
const [format, setFormat] = useState<'mp3' | 'm4a' | 'flac' | 'wav'>('mp3');
const [bitrate, setBitrate] = useState('320kbps');
// Populate form when album changes
useEffect(() => {
@ -34,6 +37,9 @@ export default function EditAlbumModal({ show, album, onClose, onUpdate }: EditA
setPrice(album.price.toString());
setCoverImage(album.coverImage || '');
setSongs(album.songs.map((song) => ({ ...song })));
setTag(album.tag);
setFormat(album.format);
setBitrate(album.bitrate);
}
}, [album]);
@ -149,6 +155,9 @@ export default function EditAlbumModal({ show, album, onClose, onUpdate }: EditA
description,
price: priceNum,
songs: albumSongs,
tag,
format,
bitrate,
};
onUpdate(album.id, updatedAlbum);
@ -318,6 +327,56 @@ export default function EditAlbumModal({ show, album, onClose, onUpdate }: EditA
/>
</div>
{/* Tag, Format, and Bitrate */}
<div className="grid grid-cols-3 gap-4">
<div>
<label className="block text-sm font-medium text-gray-300 mb-2">
Tag *
</label>
<select
value={tag}
onChange={(e) => setTag(e.target.value as any)}
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-orange focus:outline-none focus:ring-2 focus:ring-accent-orange/50 text-white"
required
>
<option value="Album">Album</option>
<option value="EP">EP</option>
<option value="Demo">Demo</option>
<option value="Deluxe">Deluxe</option>
<option value="Single">Single</option>
</select>
</div>
<div>
<label className="block text-sm font-medium text-gray-300 mb-2">
Format *
</label>
<select
value={format}
onChange={(e) => setFormat(e.target.value as any)}
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-orange focus:outline-none focus:ring-2 focus:ring-accent-orange/50 text-white"
required
>
<option value="mp3">MP3</option>
<option value="m4a">M4A</option>
<option value="flac">FLAC</option>
<option value="wav">WAV</option>
</select>
</div>
<div>
<label className="block text-sm font-medium text-gray-300 mb-2">
Bitrate *
</label>
<input
type="text"
value={bitrate}
onChange={(e) => setBitrate(e.target.value)}
placeholder="320kbps"
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg focus:border-accent-orange focus:outline-none focus:ring-2 focus:ring-accent-orange/50 text-white placeholder-gray-500"
required
/>
</div>
</div>
{/* Songs */}
<div>
<div className="flex items-center justify-between mb-2">

View File

@ -163,7 +163,10 @@ export const albums: Album[] = [
coverImage: "/albums/showbiz.jpg",
year: 1999,
genre: "Alternative Rock / Progressive Rock",
price: 11.99,
price: 250000,
tag: "Album",
format: "mp3",
bitrate: "320kbps",
description: "A powerful debut album blending alternative rock with progressive elements. Features raw energy, soaring vocals, and guitar-driven anthems that established a unique sound in the late 90s rock scene.",
songs: [
{