← back to Dear Bubbe Nextjs

app/upload-bubbe/page.tsx

125 lines

'use client'

import { useState } from 'react'

export default function UploadBubbePage() {
  const [uploading, setUploading] = useState(false)
  const [message, setMessage] = useState('')
  const [preview, setPreview] = useState<string | null>(null)

  const handleFileChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    const file = e.target.files?.[0]
    if (file) {
      // Show preview
      const reader = new FileReader()
      reader.onload = (e) => {
        setPreview(e.target?.result as string)
      }
      reader.readAsDataURL(file)
    }
  }

  const handleUpload = async (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault()

    const formData = new FormData(e.currentTarget)
    const file = formData.get('image') as File

    if (!file) {
      setMessage('Please select an image first')
      return
    }

    setUploading(true)
    setMessage('')

    try {
      const response = await fetch('/api/upload-bubbe', {
        method: 'POST',
        body: formData
      })

      const data = await response.json()

      if (response.ok) {
        setMessage('✅ Bubbe image uploaded successfully! Refresh the main page to see it.')
      } else {
        setMessage(`❌ Upload failed: ${data.error}`)
      }
    } catch (error) {
      setMessage('❌ Upload failed: ' + (error as Error).message)
    } finally {
      setUploading(false)
    }
  }

  return (
    <div className="min-h-screen bg-gradient-to-br from-purple-100 via-pink-100 to-amber-100 p-8">
      <div className="max-w-2xl mx-auto">
        <div className="bg-white rounded-2xl shadow-2xl p-8">
          <h1 className="text-4xl font-black text-gray-800 mb-2">Upload Bubbe Image</h1>
          <p className="text-gray-600 mb-8">Replace Bubbe's profile picture</p>

          <form onSubmit={handleUpload} className="space-y-6">
            <div className="border-4 border-dashed border-purple-300 rounded-xl p-8 text-center hover:border-purple-500 transition-colors">
              <input
                type="file"
                name="image"
                accept="image/*"
                onChange={handleFileChange}
                className="hidden"
                id="imageUpload"
              />
              <label
                htmlFor="imageUpload"
                className="cursor-pointer block"
              >
                {preview ? (
                  <div className="space-y-4">
                    <img
                      src={preview}
                      alt="Preview"
                      className="w-48 h-48 rounded-full mx-auto object-cover border-4 border-purple-500 shadow-xl"
                    />
                    <p className="text-purple-600 font-bold">Click to change image</p>
                  </div>
                ) : (
                  <div className="space-y-4">
                    <div className="text-6xl">📷</div>
                    <p className="text-xl font-bold text-gray-700">Click to select Bubbe image</p>
                    <p className="text-sm text-gray-500">PNG, JPG, or WEBP</p>
                  </div>
                )}
              </label>
            </div>

            <button
              type="submit"
              disabled={uploading || !preview}
              className="w-full bg-gradient-to-r from-purple-600 to-pink-600 text-white py-4 px-8 rounded-xl font-black text-xl uppercase hover:from-purple-700 hover:to-pink-700 disabled:opacity-50 disabled:cursor-not-allowed transition-all shadow-xl hover:shadow-2xl"
            >
              {uploading ? '⏳ Uploading...' : '🚀 Upload Bubbe Image'}
            </button>
          </form>

          {message && (
            <div className={`mt-6 p-4 rounded-xl font-bold text-center ${
              message.startsWith('✅')
                ? 'bg-green-100 text-green-800 border-2 border-green-500'
                : 'bg-red-100 text-red-800 border-2 border-red-500'
            }`}>
              {message}
            </div>
          )}

          <div className="mt-8 p-4 bg-blue-50 rounded-xl border-2 border-blue-200">
            <p className="text-sm text-blue-800">
              <strong>📍 After uploading:</strong> Go back to <a href="/" className="underline font-bold">Dear Bubbe</a> and hard refresh (Ctrl+Shift+R) to see the new image.
            </p>
          </div>
        </div>
      </div>
    </div>
  )
}