Demo Talep Formu
This commit is contained in:
parent
4cba98e7a8
commit
d5e3c93520
8 changed files with 141 additions and 10 deletions
60
api/src/Kurs.Platform.Application/Demo/DemoAppService.cs
Normal file
60
api/src/Kurs.Platform.Application/Demo/DemoAppService.cs
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Kurs.Platform.Data.Seeds;
|
||||||
|
using Kurs.Sender.Mail;
|
||||||
|
using Volo.Abp.Settings;
|
||||||
|
using Volo.Abp.UI.Navigation.Urls;
|
||||||
|
|
||||||
|
namespace Kurs.Platform.Dashboard;
|
||||||
|
|
||||||
|
public class ContactFormDto
|
||||||
|
{
|
||||||
|
public string Company { get; set; }
|
||||||
|
public string FullName { get; set; }
|
||||||
|
public string Email { get; set; }
|
||||||
|
public string Phone { get; set; }
|
||||||
|
public string Address { get; set; }
|
||||||
|
public string BranchCount { get; set; }
|
||||||
|
public string UserCount { get; set; }
|
||||||
|
public string Message { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class DemoAppService : PlatformAppService
|
||||||
|
{
|
||||||
|
private readonly ISettingProvider settingProvider;
|
||||||
|
private readonly IKursEmailSender emailSender;
|
||||||
|
|
||||||
|
public DemoAppService(
|
||||||
|
ISettingProvider settingProvider,
|
||||||
|
IKursEmailSender emailSender
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this.settingProvider = settingProvider;
|
||||||
|
this.emailSender = emailSender;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DemoFormAsync(ContactFormDto input)
|
||||||
|
{
|
||||||
|
var bodyBuilder = new StringBuilder();
|
||||||
|
bodyBuilder.AppendLine($"Şirket: {input.Company}");
|
||||||
|
bodyBuilder.AppendLine($"Ad Soyad: {input.FullName}");
|
||||||
|
bodyBuilder.AppendLine($"E-Posta: {input.Email}");
|
||||||
|
bodyBuilder.AppendLine($"Telefon: {input.Phone}");
|
||||||
|
bodyBuilder.AppendLine($"Adres: {input.Address}");
|
||||||
|
bodyBuilder.AppendLine($"Şube Sayısı: {input.BranchCount}");
|
||||||
|
bodyBuilder.AppendLine($"Kullanıcı Sayısı: {input.UserCount}");
|
||||||
|
bodyBuilder.AppendLine($"Mesaj: {input.Message}");
|
||||||
|
|
||||||
|
var SenderName = await settingProvider.GetOrNullAsync(SeedConsts.AbpSettings.Mailing.Default.DefaultFromDisplayName);
|
||||||
|
var SenderEmailAddress = await settingProvider.GetOrNullAsync(SeedConsts.AbpSettings.Mailing.Default.DefaultFromAddress);
|
||||||
|
|
||||||
|
await emailSender.QueueEmailAsync(
|
||||||
|
SenderEmailAddress,
|
||||||
|
new KeyValuePair<string, string>(SenderName, SenderEmailAddress),
|
||||||
|
null,
|
||||||
|
bodyBuilder.ToString(),
|
||||||
|
subject: PlatformConsts.AppName + " : Demo Talebi");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"App": {
|
"App": {
|
||||||
"SelfUrl": "https://localhost:44344",
|
"SelfUrl": "https://localhost:44344",
|
||||||
"ClientUrl": "http://localhost:3000",
|
"ClientUrl": "http://localhost:3000",
|
||||||
"CorsOrigins": "http://localhost,http://localhost:3000,http://localhost:4200,http://localhost:5173",
|
"CorsOrigins": "http://localhost,http://localhost:3000,http://localhost:3003,http://localhost:4200,http://localhost:5173",
|
||||||
"RedirectAllowedUrls": "http://localhost:4200,http://localhost:4200/authentication/callback",
|
"RedirectAllowedUrls": "http://localhost:4200,http://localhost:4200/authentication/callback",
|
||||||
"AttachmentsPath": "C:\\Private\\Projects\\kurs-platform\\configs\\mail-queue\\attachments",
|
"AttachmentsPath": "C:\\Private\\Projects\\kurs-platform\\configs\\mail-queue\\attachments",
|
||||||
"CdnPath": "C:\\Private\\Projects\\kurs-platform\\configs\\docker\\data\\cdn",
|
"CdnPath": "C:\\Private\\Projects\\kurs-platform\\configs\\docker\\data\\cdn",
|
||||||
|
|
|
||||||
1
company/.env
Normal file
1
company/.env
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
VITE_API_BASE_URL='https://localhost:44344'
|
||||||
1
company/.env.dev
Normal file
1
company/.env.dev
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
VITE_API_BASE_URL='https://kurs-dev-api.sozsoft.com'
|
||||||
1
company/.env.production
Normal file
1
company/.env.production
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
VITE_API_BASE_URL='https://kurs-api.sozsoft.com'
|
||||||
1
company/.gitignore
vendored
1
company/.gitignore
vendored
|
|
@ -22,4 +22,3 @@ dist-ssr
|
||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
.env
|
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import {
|
import {
|
||||||
Mail,
|
Mail,
|
||||||
Phone,
|
Phone,
|
||||||
MapPin,
|
MapPin,
|
||||||
Clock,
|
|
||||||
Globe,
|
|
||||||
FileText,
|
FileText,
|
||||||
Building,
|
Building,
|
||||||
CalendarDays,
|
CalendarDays,
|
||||||
|
|
@ -16,6 +14,62 @@ import { useLanguage } from "../context/LanguageContext";
|
||||||
const Contact: React.FC = () => {
|
const Contact: React.FC = () => {
|
||||||
const { t } = useLanguage();
|
const { t } = useLanguage();
|
||||||
|
|
||||||
|
const [formData, setFormData] = useState({
|
||||||
|
company: "",
|
||||||
|
fullName: "",
|
||||||
|
email: "",
|
||||||
|
phone: "",
|
||||||
|
address: "",
|
||||||
|
branchCount: "",
|
||||||
|
userCount: "",
|
||||||
|
message: "",
|
||||||
|
});
|
||||||
|
|
||||||
|
const handleChange = (
|
||||||
|
e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>
|
||||||
|
) => {
|
||||||
|
const { name, value } = e.target;
|
||||||
|
setFormData((prev: any) => ({
|
||||||
|
...prev,
|
||||||
|
[name]: value,
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
const apiUrl = `${import.meta.env.VITE_API_BASE_URL}/api/app/demo/demo-form`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(apiUrl, {
|
||||||
|
method: "POST",
|
||||||
|
headers: {
|
||||||
|
"Content-Type": "application/json",
|
||||||
|
},
|
||||||
|
body: JSON.stringify(formData),
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
alert("Form başarıyla gönderildi.");
|
||||||
|
setFormData({
|
||||||
|
company: "",
|
||||||
|
fullName: "",
|
||||||
|
email: "",
|
||||||
|
phone: "",
|
||||||
|
address: "",
|
||||||
|
branchCount: "",
|
||||||
|
userCount: "",
|
||||||
|
message: "",
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
alert("Bir hata oluştu. Lütfen tekrar deneyin.");
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Gönderim hatası:", error);
|
||||||
|
alert("Sunucuya ulaşılamıyor.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-gray-50">
|
<div className="min-h-screen bg-gray-50">
|
||||||
{/* Hero Section */}
|
{/* Hero Section */}
|
||||||
|
|
@ -149,7 +203,7 @@ const Contact: React.FC = () => {
|
||||||
<h2 className="text-2xl font-bold text-gray-900 mb-6">
|
<h2 className="text-2xl font-bold text-gray-900 mb-6">
|
||||||
{t("demo.form.title")}
|
{t("demo.form.title")}
|
||||||
</h2>
|
</h2>
|
||||||
<form className="space-y-6">
|
<form className="space-y-6" onSubmit={handleSubmit}>
|
||||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||||
<div>
|
<div>
|
||||||
<label
|
<label
|
||||||
|
|
@ -162,6 +216,8 @@ const Contact: React.FC = () => {
|
||||||
type="text"
|
type="text"
|
||||||
id="company"
|
id="company"
|
||||||
name="company"
|
name="company"
|
||||||
|
value={formData.company}
|
||||||
|
onChange={handleChange}
|
||||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -176,6 +232,8 @@ const Contact: React.FC = () => {
|
||||||
type="text"
|
type="text"
|
||||||
id="fullName"
|
id="fullName"
|
||||||
name="fullName"
|
name="fullName"
|
||||||
|
value={formData.fullName}
|
||||||
|
onChange={handleChange}
|
||||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -193,6 +251,8 @@ const Contact: React.FC = () => {
|
||||||
type="email"
|
type="email"
|
||||||
id="email"
|
id="email"
|
||||||
name="email"
|
name="email"
|
||||||
|
value={formData.email}
|
||||||
|
onChange={handleChange}
|
||||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -207,6 +267,8 @@ const Contact: React.FC = () => {
|
||||||
type="tel"
|
type="tel"
|
||||||
id="phone"
|
id="phone"
|
||||||
name="phone"
|
name="phone"
|
||||||
|
value={formData.phone}
|
||||||
|
onChange={handleChange}
|
||||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -223,6 +285,8 @@ const Contact: React.FC = () => {
|
||||||
type="text"
|
type="text"
|
||||||
id="address"
|
id="address"
|
||||||
name="address"
|
name="address"
|
||||||
|
value={formData.address}
|
||||||
|
onChange={handleChange}
|
||||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -239,6 +303,8 @@ const Contact: React.FC = () => {
|
||||||
type="number"
|
type="number"
|
||||||
id="branchCount"
|
id="branchCount"
|
||||||
name="branchCount"
|
name="branchCount"
|
||||||
|
value={formData.branchCount}
|
||||||
|
onChange={handleChange}
|
||||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -253,6 +319,8 @@ const Contact: React.FC = () => {
|
||||||
type="number"
|
type="number"
|
||||||
id="userCount"
|
id="userCount"
|
||||||
name="userCount"
|
name="userCount"
|
||||||
|
value={formData.userCount}
|
||||||
|
onChange={handleChange}
|
||||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -268,7 +336,9 @@ const Contact: React.FC = () => {
|
||||||
<textarea
|
<textarea
|
||||||
id="message"
|
id="message"
|
||||||
name="message"
|
name="message"
|
||||||
rows="10"
|
rows={10}
|
||||||
|
value={formData.message}
|
||||||
|
onChange={handleChange}
|
||||||
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,8 @@ import React from "react";
|
||||||
import Hero from "../components/home/Hero";
|
import Hero from "../components/home/Hero";
|
||||||
import Features from "../components/home/Features";
|
import Features from "../components/home/Features";
|
||||||
import Solutions from "../components/home/Solutions";
|
import Solutions from "../components/home/Solutions";
|
||||||
import Testimonials from "../components/home/Testimonials";
|
// import Testimonials from "../components/home/Testimonials";
|
||||||
import CallToAction from "../components/home/CallToAction";
|
import CallToAction from "../components/home/CallToAction";
|
||||||
import { Code, Cpu, Globe2 } from "lucide-react";
|
|
||||||
|
|
||||||
const Home: React.FC = () => {
|
const Home: React.FC = () => {
|
||||||
return (
|
return (
|
||||||
|
|
@ -12,7 +11,7 @@ const Home: React.FC = () => {
|
||||||
<Hero />
|
<Hero />
|
||||||
<Features />
|
<Features />
|
||||||
<Solutions />
|
<Solutions />
|
||||||
<Testimonials />
|
{/* <Testimonials /> */}
|
||||||
<CallToAction />
|
<CallToAction />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue