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

View file

@ -57,7 +57,7 @@ const FooterContent = () => {
}} }}
title="🎉 Yeni Güncelleme" 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> <p>Detayları, "Güncelleme Günlüğü" ekranında görebilirsiniz.</p>
</UiDialog> </UiDialog>
)} )}

View file

@ -1,6 +1,6 @@
const { VITE_CDN_URL } = import.meta.env 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 PERSIST_STORE_NAME = 'admin'
export const REDIRECT_URL_KEY = 'redirectUrl' export const REDIRECT_URL_KEY = 'redirectUrl'
export const DEFAULT_API_NAME = 'Default' export const DEFAULT_API_NAME = 'Default'

View file

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

View file

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

View file

@ -13,9 +13,9 @@ const NotFoundPage = () => {
return ( return (
<div className="p-28"> <div className="p-28">
<Helmet <Helmet
titleTemplate="%s | Kurs Platform" titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Not Found')} title={translate('::' + 'Not Found')}
defaultTitle="Kurs Platform" defaultTitle="Sözsoft Kurs Platform"
></Helmet> ></Helmet>
<div className="flex items-center justify-center font-inter"> <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"> <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 ( return (
<Container> <Container>
<Helmet <Helmet
titleTemplate="%s | Kurs Platform" titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Abp.Identity.ActivityLogs')} title={translate('::' + 'Abp.Identity.ActivityLogs')}
defaultTitle="Kurs Platform" defaultTitle="Sözsoft Kurs Platform"
></Helmet> ></Helmet>
<AdaptableCard> <AdaptableCard>

View file

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

View file

@ -131,9 +131,9 @@ const Wizard = () => {
return ( return (
<Container> <Container>
<Helmet <Helmet
titleTemplate="%s | Kurs Platform" titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Listforms.Wizard')} title={translate('::' + 'App.Listforms.Wizard')}
defaultTitle="Kurs Platform" defaultTitle="Sözsoft Kurs Platform"
></Helmet> ></Helmet>
<div className="grid lg:grid-cols-2 xl:grid-cols-3"> <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 ? ( return listFormCode && listFormValues && customizations && roleList && userList ? (
<Container> <Container>
<Helmet <Helmet
titleTemplate="%s | Kurs Platform" titleTemplate="%s | Sözsoft Kurs Platform"
title={`${listFormCode} - ${translate(`::${listFormValues.title}`)}`} title={`${listFormCode} - ${translate(`::${listFormValues.title}`)}`}
defaultTitle="Kurs Platform" defaultTitle="Sözsoft Kurs Platform"
></Helmet> ></Helmet>
<div className="lg:flex items-center justify-between mb-4 gap-3"> <div className="lg:flex items-center justify-between mb-4 gap-3">
<div className="mb-4 lg:mb-0"> <div className="mb-4 lg:mb-0">

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -88,9 +88,9 @@ export const MenuManager = () => {
return ( return (
<Container> <Container>
<Helmet <Helmet
titleTemplate="%s | Kurs Platform" titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Menus.Manager')} title={translate('::' + 'App.Menus.Manager')}
defaultTitle="Kurs Platform" defaultTitle="Sözsoft Kurs Platform"
></Helmet> ></Helmet>
<div className="bg-white rounded px-4 sm:px-4 lg:px-6 py-6"> <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 ( return (
<div className="min-h-screen bg-gray-50"> <div className="min-h-screen bg-gray-50">
<Helmet <Helmet
titleTemplate="%s | Kurs Platform" titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'Public.nav.checkout')} title={translate('::' + 'Public.nav.checkout')}
defaultTitle="Kurs Platform" defaultTitle="Sözsoft Kurs Platform"
></Helmet> ></Helmet>
{/* Hero Section */} {/* Hero Section */}

View file

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

View file

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

View file

@ -120,9 +120,9 @@ const Settings = () => {
return ( return (
<Container className="h-full"> <Container className="h-full">
<Helmet <Helmet
titleTemplate="%s | Kurs Platform" titleTemplate="%s | Sözsoft Kurs Platform"
title={translate('::' + 'App.Settings')} title={translate('::' + 'App.Settings')}
defaultTitle="Kurs Platform" defaultTitle="Sözsoft Kurs Platform"
></Helmet> ></Helmet>
<div className="flex flex-col md:flex-row gap-4"> <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) // Kayıt kodunu otomatik enjekte et (virtual:pwa-register yazmadan da çalışır)
injectRegister: 'auto', injectRegister: 'auto',
// Dev ortamında SW'yi aç, prod'da kapalı tut (build edilmiş SW prod'da zaten aktif olur) // 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: { workbox: {
// Büyük asset'leri de cache'leyebil // 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 // SPA fallback'i API çağrılarına uygulama
navigateFallbackDenylist: [/^\/api\//], 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: { manifest: {
name: 'Platform', name: 'Sözsoft Kurs Platform',
short_name: 'Sözsoft Kurs Platform',
theme_color: '#FF99C8', theme_color: '#FF99C8',
background_color: '#f0e7db', background_color: '#f0e7db',
display: 'standalone', display: 'standalone',
@ -52,9 +89,23 @@ export default defineConfig(async ({ mode }) => {
src: '/img/logo/logo-400.png', src: '/img/logo/logo-400.png',
sizes: '400x400', sizes: '400x400',
type: 'image/png', 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: { server: {
open: true, open: true,
port: 3000, port: 3000,
// ⭐ YENİ EKLENEN: Hot reload için polling
watch: {
usePolling: true,
interval: 1000
}
}, },
assetsInclude: ['**/*.md'], assetsInclude: ['**/*.md'],
@ -77,6 +133,7 @@ export default defineConfig(async ({ mode }) => {
build: { build: {
outDir: 'dist', outDir: 'dist',
sourcemap: false, sourcemap: false,
emptyOutDir: true, // ✅ Build öncesi otomatik temizlik
}, },
preview: { preview: {
@ -89,6 +146,10 @@ export default defineConfig(async ({ mode }) => {
define: { define: {
'process.env': {}, '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)
}, },
} }
}) })