Public sayfalardaki Loading

This commit is contained in:
Sedat ÖZTÜRK 2025-08-21 15:08:15 +03:00
parent 1240c8dfb4
commit aa1b17935d
6 changed files with 58 additions and 14 deletions

View file

@ -1,10 +1,10 @@
import React, { useState, useMemo, useEffect } from 'react' import React, { useState, useMemo, useEffect } from 'react'
import { FaFilter, FaSearch } from 'react-icons/fa'; import { FaFilter, FaSearch } from 'react-icons/fa'
import { ProductCard } from './ProductCard' import { ProductCard } from './ProductCard'
import { addItemToCart, CartState } from '@/utils/cartUtils' import { addItemToCart, CartState } from '@/utils/cartUtils'
import { BillingCycle, ProductDto } from '@/proxy/order/models' import { BillingCycle, ProductDto } from '@/proxy/order/models'
import { OrderService } from '@/services/order.service' import { OrderService } from '@/services/order.service'
import { useLocalization } from '@/utils/hooks/useLocalization'; import { useLocalization } from '@/utils/hooks/useLocalization'
interface ProductCatalogProps { interface ProductCatalogProps {
searchQuery: string searchQuery: string
@ -90,7 +90,9 @@ export const ProductCatalog: React.FC<ProductCatalogProps> = ({
<div className="bg-white rounded-lg shadow-sm border border-gray-200 p-6 sticky top-40"> <div className="bg-white rounded-lg shadow-sm border border-gray-200 p-6 sticky top-40">
<div className="flex items-center space-x-2 mb-4"> <div className="flex items-center space-x-2 mb-4">
<FaFilter className="w-5 h-5 text-gray-600" /> <FaFilter className="w-5 h-5 text-gray-600" />
<h3 className="font-semibold text-gray-900">{translate('::Public.products.categories')}</h3> <h3 className="font-semibold text-gray-900">
{translate('::Public.products.categories')}
</h3>
</div> </div>
<div className="space-y-2"> <div className="space-y-2">
{categories.map((category) => ( {categories.map((category) => (
@ -103,7 +105,11 @@ export const ProductCatalog: React.FC<ProductCatalogProps> = ({
: 'text-gray-600 hover:bg-gray-50 hover:text-gray-900' : 'text-gray-600 hover:bg-gray-50 hover:text-gray-900'
}`} }`}
> >
<span>{category === 'all' ? translate('::Public.products.categories.all') : translate('::' + category)}</span> <span>
{category === 'all'
? translate('::Public.products.categories.all')
: translate('::' + category)}
</span>
<span <span
className={`text-xs px-2 py-1 rounded-full ${ className={`text-xs px-2 py-1 rounded-full ${
selectedCategory === category selectedCategory === category
@ -121,7 +127,9 @@ export const ProductCatalog: React.FC<ProductCatalogProps> = ({
<div className="mt-6"> <div className="mt-6">
<div className="flex items-center space-x-2 mb-3"> <div className="flex items-center space-x-2 mb-3">
<FaSearch className="w-5 h-5 text-gray-600" /> <FaSearch className="w-5 h-5 text-gray-600" />
<h3 className="font-semibold text-gray-900">{translate('::Public.products.search.title')}</h3> <h3 className="font-semibold text-gray-900">
{translate('::Public.products.search.title')}
</h3>
</div> </div>
<div className="relative"> <div className="relative">
<FaSearch className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-4 h-4" /> <FaSearch className="absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400 w-4 h-4" />
@ -139,7 +147,11 @@ export const ProductCatalog: React.FC<ProductCatalogProps> = ({
<main className="flex-1"> <main className="flex-1">
{loading ? ( {loading ? (
<div className="text-center py-12 text-gray-500">{translate('::Public.products.loading')}</div> <div className="flex items-center justify-center min-h-screen bg-gray-50">
<div className="text-center">
<div className="w-12 h-12 border-4 border-blue-500 border-t-transparent rounded-full animate-spin mx-auto"></div>
</div>
</div>
) : ( ) : (
<> <>
<div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6"> <div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-6">
@ -159,7 +171,9 @@ export const ProductCatalog: React.FC<ProductCatalogProps> = ({
<div className="text-gray-400 mb-2"> <div className="text-gray-400 mb-2">
<FaFilter className="w-12 h-12 mx-auto" /> <FaFilter className="w-12 h-12 mx-auto" />
</div> </div>
<h3 className="text-lg font-medium text-gray-900 mb-2">{translate('::Public.products.empty.title')}</h3> <h3 className="text-lg font-medium text-gray-900 mb-2">
{translate('::Public.products.empty.title')}
</h3>
<p className="text-gray-600">{translate('::Public.products.empty.description')}</p> <p className="text-gray-600">{translate('::Public.products.empty.description')}</p>
</div> </div>
)} )}

View file

@ -1,9 +1,9 @@
import React, { useEffect, useState } from 'react' import React, { useEffect, useState } from 'react'
import { useLocalization } from '@/utils/hooks/useLocalization'
import { Helmet } from 'react-helmet' import { Helmet } from 'react-helmet'
import navigationIcon from '@/configs/navigation-icon.config' import navigationIcon from '@/configs/navigation-icon.config'
import { AboutDto } from '@/proxy/about/models' import { AboutDto } from '@/proxy/about/models'
import { getAbout } from '@/services/about' import { getAbout } from '@/services/about'
import { useLocalization } from '@/utils/hooks/useLocalization'
const About: React.FC = () => { const About: React.FC = () => {
const { translate } = useLocalization() const { translate } = useLocalization()
@ -25,7 +25,6 @@ const About: React.FC = () => {
useEffect(() => { useEffect(() => {
setLoading(true) setLoading(true)
const fetchServices = async () => { const fetchServices = async () => {
try { try {
const result = await getAbout() const result = await getAbout()
@ -36,10 +35,19 @@ const About: React.FC = () => {
setLoading(false) setLoading(false)
} }
} }
fetchServices() fetchServices()
}, []) }, [])
if (loading) {
return (
<div className="flex items-center justify-center min-h-screen bg-gray-50">
<div className="text-center">
<div className="w-12 h-12 border-4 border-blue-500 border-t-transparent rounded-full animate-spin mx-auto"></div>
</div>
</div>
)
}
return ( return (
<> <>
<Helmet <Helmet

View file

@ -67,9 +67,9 @@ const Blog = () => {
if (loading && posts.length === 0) { if (loading && posts.length === 0) {
return ( return (
<div className="min-h-screen bg-gray-50 flex items-center justify-center"> <div className="flex items-center justify-center min-h-screen bg-gray-50">
<div className="text-center"> <div className="text-center">
<p className="mt-4 text-gray-600">Blog yazıları yükleniyor...</p> <div className="w-12 h-12 border-4 border-blue-500 border-t-transparent rounded-full animate-spin mx-auto"></div>
</div> </div>
</div> </div>
) )

View file

@ -57,8 +57,10 @@ const BlogDetail: React.FC = () => {
if (loading) { if (loading) {
return ( return (
<div className="min-h-screen bg-gray-50 flex items-center justify-center"> <div className="flex items-center justify-center min-h-screen bg-gray-50">
<h1 className="text-2xl font-bold text-gray-900">Loading...</h1> <div className="text-center">
<div className="w-12 h-12 border-4 border-blue-500 border-t-transparent rounded-full animate-spin mx-auto"></div>
</div>
</div> </div>
) )
} }

View file

@ -37,6 +37,16 @@ const Contact: React.FC = () => {
fetchServices() fetchServices()
}, []) }, [])
if (loading) {
return (
<div className="flex items-center justify-center min-h-screen bg-gray-50">
<div className="text-center">
<div className="w-12 h-12 border-4 border-blue-500 border-t-transparent rounded-full animate-spin mx-auto"></div>
</div>
</div>
)
}
return ( return (
<div className="min-h-screen bg-gray-50"> <div className="min-h-screen bg-gray-50">
<Helmet <Helmet

View file

@ -59,6 +59,16 @@ const Services: React.FC = () => {
fetchServices() fetchServices()
}, []) }, [])
if (loading) {
return (
<div className="flex items-center justify-center min-h-screen bg-gray-50">
<div className="text-center">
<div className="w-12 h-12 border-4 border-blue-500 border-t-transparent rounded-full animate-spin mx-auto"></div>
</div>
</div>
)
}
return ( return (
<div className="min-h-screen bg-gray-50"> <div className="min-h-screen bg-gray-50">
<Helmet <Helmet