vite.config güncellemesi

This commit is contained in:
Sedat Öztürk 2025-09-13 14:46:34 +03:00
parent 70592958f1
commit e801f95496
47 changed files with 208 additions and 88 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

View file

@ -0,0 +1,57 @@
// src/components/UpdateNotifier.jsx
import { useState, useEffect } from 'react'
const UpdateNotifier = () => {
const [updateAvailable, setUpdateAvailable] = useState(false)
useEffect(() => {
if ('serviceWorker' in navigator) {
const checkUpdate = () => {
navigator.serviceWorker.getRegistration().then(registration => {
if (registration) {
registration.addEventListener('updatefound', () => {
setUpdateAvailable(true)
})
}
})
}
checkUpdate()
const interval = setInterval(checkUpdate, 30000) // 30 saniyede bir kontrol
return () => clearInterval(interval)
}
}, [])
const handleUpdate = () => {
window.location.reload()
}
if (!updateAvailable) return null
return (
<div style={{
position: 'fixed',
bottom: '20px',
right: '20px',
padding: '12px',
background: '#FF99C8',
color: 'white',
borderRadius: '8px',
zIndex: 1000
}}>
<p>Yeni güncelleme mevcut!</p>
<button onClick={handleUpdate} style={{
background: 'white',
color: '#FF99C8',
border: 'none',
padding: '8px 16px',
borderRadius: '4px',
cursor: 'pointer'
}}>
Yenile
</button>
</div>
)
}
export default UpdateNotifier

View file

@ -15,6 +15,7 @@ import useLocale from '@/utils/hooks/useLocale'
import { useDynamicRoutes } from '@/routes/dynamicRoutesContext'
import { useLocation } from 'react-router-dom'
import { hasSubdomain } from '@/utils/subdomain'
import UpdateNotifier from '../UpdateNotifier'
export type LayoutType =
| typeof LAYOUT_TYPE_CLASSIC
@ -91,6 +92,7 @@ const Layout = () => {
return (
<Suspense fallback={<div className="flex flex-auto flex-col h-[100vh]"><Loading loading /></div>}>
<AppLayout />
<UpdateNotifier />
</Suspense>
)
}

View file

@ -57,7 +57,7 @@ const FooterContent = () => {
}}
title="🎉 Yeni Güncelleme"
>
Platform Sistemi güncellendi.
Sözsoft Kurs Platform Sistemi güncellendi.
<p>Detayları, "Güncelleme Günlüğü" ekranında görebilirsiniz.</p>
</UiDialog>
)}

View file

@ -1,6 +1,6 @@
const { VITE_CDN_URL } = import.meta.env
export const APP_NAME = 'Platform'
export const APP_NAME = 'Sözsoft Kurs Platform'
export const PERSIST_STORE_NAME = 'admin'
export const REDIRECT_URL_KEY = 'redirectUrl'
export const DEFAULT_API_NAME = 'Default'

View file

@ -17,9 +17,9 @@ const AccessDenied = () => {
return (
<Container className="h-full">
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Access Denied')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="h-full flex flex-col items-center justify-center p-28">
<DoubleSidedImage

View file

@ -6,9 +6,9 @@ const Dashboard = () => {
return (
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Dashboard')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
)
}

View file

@ -13,9 +13,9 @@ const NotFoundPage = () => {
return (
<div className="p-28">
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Not Found')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="flex items-center justify-center font-inter">
<div className="text-[8rem] sm:text-[10rem] md:text-[12rem] font-bold bg-gradient-to-br from-primary to-secondary bg-clip-text animate-pulse">

View file

@ -82,9 +82,9 @@ const ActivityLog = () => {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Abp.Identity.ActivityLogs')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<AdaptableCard>

View file

@ -263,9 +263,9 @@ function ChartEdit() {
return chartValues && roleList && userList && permissionOptions ? (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={chartCode}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<Formik

View file

@ -131,9 +131,9 @@ const Wizard = () => {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Listforms.Wizard')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="grid lg:grid-cols-2 xl:grid-cols-3">

View file

@ -150,9 +150,9 @@ const FormEdit = () => {
return listFormCode && listFormValues && customizations && roleList && userList ? (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={`${listFormCode} - ${translate(`::${listFormValues.title}`)}`}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="lg:flex items-center justify-between mb-4 gap-3">
<div className="mb-4 lg:mb-0">

View file

@ -456,9 +456,9 @@ const OrganizationUnits = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::Abp.Identity.OrganizationUnits')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<Loading type="cover" loading={loading}>
<Container>

View file

@ -68,9 +68,9 @@ const Profile = () => {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Abp.Identity.Profile')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<AdaptableCard>
<Tabs value={currentTab} onChange={(val) => onTabChange(val)}>

View file

@ -37,9 +37,9 @@ const Roles = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::AbpIdentity.Roles')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<Button
onClick={() => {

View file

@ -43,9 +43,9 @@ const Tenants = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::AbpTenantManagement.Tenants')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<Loading type="cover" loading={loading}>
<Container>

View file

@ -104,9 +104,9 @@ function UserDetails() {
return userDetails ? (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={userDetails.email}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<Container>
<Tabs defaultValue="user">

View file

@ -218,9 +218,9 @@ const Users = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::AbpIdentity.Users')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<Container>
<AdaptableCard>

View file

@ -266,9 +266,9 @@ const Assistant = () => {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Abp.Identity.Ai')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<LoadAiPostsFromLocalStorage />

View file

@ -55,9 +55,9 @@ const ExtendLogin = () => {
return emailSent ? (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('AbpAccount::' + 'Abp.Account.ExtendLogin')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div>
<h3 className="mb-1">{translate('::Abp.Account.ExtendLogin.Title')}</h3>
@ -71,9 +71,9 @@ const ExtendLogin = () => {
) : (
<div>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Abp.Account.ExtendLogin')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="mb-6">
<h3 className="mb-1">{translate('::Abp.Account.ExtendLogin')}</h3>

View file

@ -59,9 +59,9 @@ const ForgotPassword = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Abp.Account.ForgotPassword')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<motion.div
initial={{ opacity: 0, x: 100 }}

View file

@ -198,9 +198,9 @@ const Login = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('AbpAccount::' + 'Login')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<motion.div
initial={{ opacity: 0, x: 100 }}

View file

@ -62,9 +62,9 @@ const Register = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('AbpAccount::' + 'Register')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="mb-4">

View file

@ -79,9 +79,9 @@ const ResetPassword = () => {
return (
<div>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('AbpAccount::' + 'ResetPassword')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="mb-6">
{resetComplete ? (

View file

@ -36,9 +36,9 @@ const SendConfirmationCode = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Abp.Account.SendConfirmationCode')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="mb-8">

View file

@ -22,9 +22,9 @@ const VerifyConfirmationCode = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Abp.Account.VerifyConfirmationCode')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div>

View file

@ -44,9 +44,9 @@ const Chart = (props: ChartProps) => {
<Container className={DX_CLASSNAMES}>
{!isSubForm && chartOptions && (
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + chartOptions.title.text)}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
)}
{_chartCode && chartOptions && (

View file

@ -257,9 +257,9 @@ const ClassList: React.FC = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Classroom.List')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<Container>
{/* Main Content */}

View file

@ -26,9 +26,9 @@ const Dashboard: React.FC = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Classroom.Dashboard')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="flex items-center justify-center p-4">
<motion.div

View file

@ -163,9 +163,9 @@ const ClassroomPlannerPage: React.FC = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Classroom.Planning')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
/>
<Container>
{/* Header */}

View file

@ -854,9 +854,9 @@ const RoomDetail: React.FC = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Classroom.RoomDetail')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
{teacherDisconnected && (

View file

@ -11,9 +11,9 @@ const DashboardPage: React.FC = () => {
return (
<>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.DeveloperKit')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<DeveloperLayout>
<EntityProvider>

View file

@ -56,9 +56,9 @@ const Changelog = () => {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.ChangeLog')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<AdaptableCard>
<h4>Platform Güncelleme Günlüğü</h4>

View file

@ -61,9 +61,9 @@ const FormEdit = (
<Container>
{!isSubForm && (
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + gridDto?.gridOptions.title)}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
)}
<div className="flex items-center justify-between mb-4">

View file

@ -147,9 +147,9 @@ const FormNew = (
<Container>
{!isSubForm && (
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + gridDto?.gridOptions.title)}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
)}
<div className="flex items-center justify-between mb-4">

View file

@ -56,9 +56,9 @@ const FormView = (
<Container>
{!isSubForm && (
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + gridDto?.gridOptions.title)}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
)}
<div className="flex items-center justify-between mb-4">

View file

@ -52,9 +52,9 @@ export function Forum() {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Forum')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
{error && (

View file

@ -58,9 +58,9 @@ export function Management() {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.ForumManagement')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
{error && (

View file

@ -514,9 +514,9 @@ const Grid = (props: GridProps) => {
<Container className={DX_CLASSNAMES}>
{!isSubForm && (
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + gridDto?.gridOptions.title)}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
)}
{gridDto && columnData && (

View file

@ -248,9 +248,9 @@ const Pivot = (props: GridProps) => {
<Container className={DX_CLASSNAMES}>
{!isSubForm && (
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + gridDto?.gridOptions.title)}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
)}
{gridDto && columnData && (

View file

@ -88,9 +88,9 @@ export const MenuManager = () => {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Menus.Manager')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="bg-white rounded px-4 sm:px-4 lg:px-6 py-6">

View file

@ -57,9 +57,9 @@ const Checkout: React.FC = () => {
return (
<div className="min-h-screen bg-gray-50">
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Public.nav.checkout')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
{/* Hero Section */}

View file

@ -10,9 +10,9 @@ const DashboardPage: React.FC = () => {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Reports')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<Dashboard />
</Container>

View file

@ -10,9 +10,9 @@ const ReportViewerPage: React.FC = () => {
return (
<Container>
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Reports')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<ReportViewer />
</Container>

View file

@ -120,9 +120,9 @@ const Settings = () => {
return (
<Container className="h-full">
<Helmet
titleTemplate="%s | Kurs Platform"
titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Settings')}
defaultTitle="Kurs Platform"
defaultTitle="Sözsoft Kurs Platform"
></Helmet>
<div className="flex flex-col md:flex-row gap-4">

View file

@ -25,7 +25,10 @@ export default defineConfig(async ({ mode }) => {
// Kayıt kodunu otomatik enjekte et (virtual:pwa-register yazmadan da çalışır)
injectRegister: 'auto',
// Dev ortamında SW'yi aç, prod'da kapalı tut (build edilmiş SW prod'da zaten aktif olur)
devOptions: { enabled: mode !== 'production' },
devOptions: {
enabled: mode !== 'production',
type: 'module' // Modern module worker kullan
},
workbox: {
// Büyük asset'leri de cache'leyebil
@ -40,10 +43,44 @@ export default defineConfig(async ({ mode }) => {
// SPA fallback'i API çağrılarına uygulama
navigateFallbackDenylist: [/^\/api\//],
// ⭐⭐ BU KISMI EKLEYİN: Cache sorununu çözecek runtime caching
runtimeCaching: [
{
urlPattern: /\.(?:js|css|html|json)$/,
handler: 'NetworkFirst',
options: {
cacheName: 'static-resources',
expiration: {
maxEntries: 50,
maxAgeSeconds: 24 * 60 * 60 // 24 saat
},
cacheableResponse: {
statuses: [0, 200]
}
}
},
{
urlPattern: /\.(?:png|jpg|jpeg|svg|gif|webp|ico)$/,
handler: 'CacheFirst',
options: {
cacheName: 'images',
expiration: {
maxEntries: 100,
maxAgeSeconds: 30 * 24 * 60 * 60 // 30 gün
}
}
}
],
// ⭐ YENİ EKLENEN: Additional navigation route for SPA
navigateFallback: '/index.html',
navigateFallbackAllowlist: [/^(?!\/__).*/]
},
manifest: {
name: 'Platform',
name: 'Sözsoft Kurs Platform',
short_name: 'Sözsoft Kurs Platform',
theme_color: '#FF99C8',
background_color: '#f0e7db',
display: 'standalone',
@ -52,9 +89,23 @@ export default defineConfig(async ({ mode }) => {
src: '/img/logo/logo-400.png',
sizes: '400x400',
type: 'image/png',
purpose: 'any',
purpose: 'any maskable'
},
{
src: '/img/logo/logo-192.png',
sizes: '192x192',
type: 'image/png',
purpose: 'any maskable'
},
{
src: '/img/logo/logo-512.png',
sizes: '512x512',
type: 'image/png',
purpose: 'any maskable'
}
],
categories: ['business', 'productivity'],
description: 'Sözsoft Kurs Platform Application'
},
}),
],
@ -62,6 +113,11 @@ export default defineConfig(async ({ mode }) => {
server: {
open: true,
port: 3000,
// ⭐ YENİ EKLENEN: Hot reload için polling
watch: {
usePolling: true,
interval: 1000
}
},
assetsInclude: ['**/*.md'],
@ -77,6 +133,7 @@ export default defineConfig(async ({ mode }) => {
build: {
outDir: 'dist',
sourcemap: false,
emptyOutDir: true, // ✅ Build öncesi otomatik temizlik
},
preview: {
@ -89,6 +146,10 @@ export default defineConfig(async ({ mode }) => {
define: {
'process.env': {},
// ⭐ YENİ EKLENEN: Version tracking için global değişkenler
__APP_VERSION__: JSON.stringify(process.env.npm_package_version || '1.0.0'),
__BUILD_DATE__: JSON.stringify(new Date().toISOString()),
__APP_MODE__: JSON.stringify(mode)
},
}
})