import ChunkedUploaderInput from '@/components/chunked-uploader-input'; import InputError from '@/components/input-error'; import LoadingButton from '@/components/loading-button'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader } from '@/components/ui/card'; import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; import { ScrollArea } from '@/components/ui/scroll-area'; import { router, useForm } from '@inertiajs/react'; import { AlertTriangle, CheckCircle, RefreshCw, Upload } from 'lucide-react'; import { useEffect, useState } from 'react'; interface Props { version: string; } const ApplicationUpdate = ({ version }: Props) => { const [open, setOpen] = useState(false); const [seeding, setSeeding] = useState(false); const [isSubmit, setIsSubmit] = useState(false); const [isFileSelected, setIsFileSelected] = useState(false); const [selectedFileName, setSelectedFileName] = useState(''); const { data, setData, post, errors, processing, reset } = useForm({ update_file_url: '', }); const refreshForm = useForm({}); const handleRefreshServer = () => { refreshForm.post(route('system.refresh')); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (isFileSelected) { setIsSubmit(true); return; } }; const onResetHandler = () => { setIsSubmit(false); setIsFileSelected(false); setSelectedFileName(''); reset('update_file_url'); }; // Auto-submit form when upload completes and file URL is set useEffect(() => { if (data.update_file_url && isSubmit) { post(route('system.update'), { onSuccess: () => { setOpen(false); onResetHandler(); }, onError: () => { onResetHandler(); }, }); } }, [data.update_file_url]); const handleOpenChange = (open: boolean) => { if (isSubmit) { setOpen(true); } else { setOpen(open); if (!open) { onResetHandler(); } } }; const seedHandler = () => { setSeeding(true); router.get(route('system.update.seeder'), {}, { onFinish: () => setSeeding(false) }); }; return ( <>

Application Update

Upload and install the latest version of your application

Important Update Guidelines

  • Refresh Server: Every time refresh server before updating
  • Backup First: Always create a backup before updating
  • File Format: Upload must be a valid ZIP file
  • Maintenance Mode: Site will be temporarily unavailable during update
  • Migrations: Database migrations will be automatically applied
  • Downtime: Update process may take several minutes
  • Browser: Do not refresh or close browser during update
  • Seeder: Run seeder only after updating the application version
Refresh Server
{/* */} {/* */} Run Version {version} Seeder

This will run the database seeder for version {version}.

Important Notes:

  • Run this seeder only once after updating to version {version}
  • Running this multiple times will overwrite existing data
  • Do not run this seeder after you have added your own content to the website
Run Seeder
{/* Confirmation Dialog */} {processing && (

Updating application...

Please do not close this window

)} Confirm Application Update

Are you sure you want to update the application with "{selectedFileName}"?

This update will:

  • Put the site in maintenance mode
  • Replace all application files
  • Run database migrations
  • Process may take several minutes

⚠️ Important:

Make sure you have created a backup first! This action cannot be undone.

{ setIsFileSelected(true); setSelectedFileName(file.name); }} onFileUploaded={(fileData) => { setData('update_file_url', fileData.file_url); }} onError={(errors) => { onResetHandler(); }} onCancelUpload={() => { onResetHandler(); }} />
{isFileSelected && selectedFileName && (

Selected file: {selectedFileName}

File selected successfully. Click "Update Application" to proceed.

)} {isSubmit ? 'Uploading...' : 'Update Application'}
); }; export default ApplicationUpdate;