Files
the_order/apps/portal-public/src/app/contact/page.tsx
defiQUG 8649ad4124 feat: implement naming convention, deployment automation, and infrastructure updates
- Add comprehensive naming convention (provider-region-resource-env-purpose)
- Implement Terraform locals for centralized naming
- Update all Terraform resources to use new naming convention
- Create deployment automation framework (18 phase scripts)
- Add Azure setup scripts (provider registration, quota checks)
- Update deployment scripts config with naming functions
- Create complete deployment documentation (guide, steps, quick reference)
- Add frontend portal implementations (public and internal)
- Add UI component library (18 components)
- Enhance Entra VerifiedID integration with file utilities
- Add API client package for all services
- Create comprehensive documentation (naming, deployment, next steps)

Infrastructure:
- Resource groups, storage accounts with new naming
- Terraform configuration updates
- Outputs with naming convention examples

Deployment:
- Automated deployment scripts for all 15 phases
- State management and logging
- Error handling and validation

Documentation:
- Naming convention guide and implementation summary
- Complete deployment guide (296 steps)
- Next steps and quick start guides
- Azure prerequisites and setup completion docs

Note: ESLint warnings present - will be addressed in follow-up commit
2025-11-12 08:22:51 -08:00

122 lines
3.9 KiB
TypeScript

'use client';
import { useState } from 'react';
import { Card, CardContent, CardDescription, CardHeader, CardTitle, Input, Label, Textarea, Button, useToast } from '@the-order/ui';
export default function ContactPage() {
const { success, error: showError } = useToast();
const [formData, setFormData] = useState({
name: '',
email: '',
subject: '',
message: '',
});
const [isSubmitting, setIsSubmitting] = useState(false);
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setIsSubmitting(true);
try {
// Simulate API call
await new Promise((resolve) => setTimeout(resolve, 1000));
success('Message sent successfully!', 'We will get back to you soon.');
setFormData({ name: '', email: '', subject: '', message: '' });
} catch (err) {
showError('Failed to send message', 'Please try again later.');
} finally {
setIsSubmitting(false);
}
};
return (
<div className="min-h-screen bg-gray-50 py-12">
<div className="container mx-auto px-4 max-w-2xl">
<div className="mb-8">
<h1 className="text-4xl font-bold text-gray-900 mb-4">Contact Us</h1>
<p className="text-xl text-gray-600">
Have questions? We'd love to hear from you.
</p>
</div>
<Card>
<CardHeader>
<CardTitle>Send us a message</CardTitle>
<CardDescription>Fill out the form below and we'll get back to you as soon as possible.</CardDescription>
</CardHeader>
<CardContent>
<form onSubmit={handleSubmit} className="space-y-6">
<div>
<Label htmlFor="name">Name</Label>
<Input
id="name"
required
value={formData.name}
onChange={(e) => setFormData({ ...formData, name: e.target.value })}
className="mt-2"
/>
</div>
<div>
<Label htmlFor="email">Email</Label>
<Input
id="email"
type="email"
required
value={formData.email}
onChange={(e) => setFormData({ ...formData, email: e.target.value })}
className="mt-2"
/>
</div>
<div>
<Label htmlFor="subject">Subject</Label>
<Input
id="subject"
required
value={formData.subject}
onChange={(e) => setFormData({ ...formData, subject: e.target.value })}
className="mt-2"
/>
</div>
<div>
<Label htmlFor="message">Message</Label>
<Textarea
id="message"
required
rows={6}
value={formData.message}
onChange={(e) => setFormData({ ...formData, message: e.target.value })}
className="mt-2"
/>
</div>
<Button type="submit" disabled={isSubmitting} className="w-full">
{isSubmitting ? 'Sending...' : 'Send Message'}
</Button>
</form>
</CardContent>
</Card>
<Card className="mt-6">
<CardHeader>
<CardTitle>Other ways to reach us</CardTitle>
</CardHeader>
<CardContent className="space-y-4 text-gray-700">
<div>
<h3 className="font-semibold mb-1">Email</h3>
<p>support@theorder.org</p>
</div>
<div>
<h3 className="font-semibold mb-1">Response Time</h3>
<p>We typically respond within 24-48 hours.</p>
</div>
</CardContent>
</Card>
</div>
</div>
);
}