diff --git a/frontend/src/pages/SetupPage.tsx b/frontend/src/pages/SetupPage.tsx
index 3a7e80e..47a66b3 100644
--- a/frontend/src/pages/SetupPage.tsx
+++ b/frontend/src/pages/SetupPage.tsx
@@ -116,7 +116,6 @@ const SetupPage: React.FC = () => {
const [instagramUrl, setInstagramUrl] = useState('');
const [youtubeUrl, setYoutubeUrl] = useState('');
const [galleryUrl, setGalleryUrl] = useState('');
- const [galleryLabel, setGalleryLabel] = useState('Fotogalerie');
const toast = useToast();
const navigate = useNavigate();
@@ -293,7 +292,6 @@ const SetupPage: React.FC = () => {
instagram_url: instagramUrl || undefined,
youtube_url: youtubeUrl || undefined,
gallery_url: galleryUrl || undefined,
- gallery_label: galleryLabel || undefined,
// GPS location (optional)
location_latitude: typeof gpsLat === 'number' ? gpsLat : undefined,
location_longitude: typeof gpsLng === 'number' ? gpsLng : undefined,
@@ -564,7 +562,7 @@ const SetupPage: React.FC = () => {
URL loga klubu
- setClubLogoUrl(e.target.value)} />
+ setClubLogoUrl(e.target.value)} />
}>
Nahrát logo
@@ -572,6 +570,7 @@ const SetupPage: React.FC = () => {
type="file"
display="none"
accept="image/*,image/svg+xml,application/pdf"
+ id="clubLogoFileInput"
onChange={(e) => {
const f = e.target.files?.[0] || null;
// Process selected file
@@ -695,10 +694,6 @@ const SetupPage: React.FC = () => {
setGalleryUrl(e.target.value)} />
Můžete použít libovolný web (SmugMug, Flickr, Google Photos, Zonerama...).
-
- Popisek odkazu fotogalerie
- setGalleryLabel(e.target.value)} />
-
diff --git a/internal/controllers/base_controller.go b/internal/controllers/base_controller.go
index da9b10a..dabc65b 100644
--- a/internal/controllers/base_controller.go
+++ b/internal/controllers/base_controller.go
@@ -4553,9 +4553,6 @@ func (bc *BaseController) UpdateSettings(c *gin.Context) {
if body.MapStyle != nil {
s.MapStyle = strings.TrimSpace(*body.MapStyle)
}
- if body.ShowMapOnHomepage != nil {
- s.ShowMapOnHomepage = *body.ShowMapOnHomepage
- }
if s.ID == 0 {
if err := bc.DB.Create(&s).Error; err != nil {
@@ -4569,6 +4566,11 @@ func (bc *BaseController) UpdateSettings(c *gin.Context) {
}
}
logger.Info("UpdateSettings saved: club_id=%s club_name=%s gallery_url=%s gallery_label=%s", s.ClubID, s.ClubName, s.GalleryURL, s.GalleryLabel)
+ // Best-effort: trigger prefetch so cached settings.json and dependent files update immediately
+ go func() {
+ base := getPrefetchBaseURL()
+ services.PrefetchOnce(base)
+ }()
// If gallery_url is a Zonerama link, refresh Zonerama cache immediately
if g := strings.TrimSpace(s.GalleryURL); g != "" && strings.Contains(strings.ToLower(g), "zonerama.com") {
go func(link string) { _ = services.RefreshZoneramaNow(link) }(g)
diff --git a/internal/services/prefetch_service.go b/internal/services/prefetch_service.go
index caa5c98..c7ab37d 100644
--- a/internal/services/prefetch_service.go
+++ b/internal/services/prefetch_service.go
@@ -521,12 +521,13 @@ func doPrefetchCycle(client *http.Client, baseURL string) {
// 1) Static public endpoints
endpoints := map[string]string{
"/settings": "settings.json",
+ "/seo": "seo.json",
"/articles?page=1&page_size=10&published=true": "articles.json",
"/sponsors": "sponsors.json",
"/events/upcoming": "events_upcoming.json",
"/public/team-logo-overrides": "team_logo_overrides.json",
"/competition-aliases": "competition_aliases.json",
- }
+ }
statuses = make([]epStatus, 0, len(endpoints))
for path, file := range endpoints {
url := baseURL + path
@@ -595,14 +596,25 @@ func doPrefetchCycle(client *http.Client, baseURL string) {
// in-flight guard to avoid overlapping cycles
var prefetchInFlight int32
+var prefetchPending int32
func doPrefetchCycleGuarded(client *http.Client, baseURL string) {
- if !atomic.CompareAndSwapInt32(&prefetchInFlight, 0, 1) {
- log.Printf("[prefetch] skip: previous cycle still running")
- return
- }
- defer atomic.StoreInt32(&prefetchInFlight, 0)
- doPrefetchCycle(client, baseURL)
+ if !atomic.CompareAndSwapInt32(&prefetchInFlight, 0, 1) {
+ // Mark a rerun so we don't lose triggers (e.g., from setup) while a cycle is running
+ atomic.StoreInt32(&prefetchPending, 1)
+ log.Printf("[prefetch] in-flight: marked pending rerun")
+ return
+ }
+ defer func() {
+ atomic.StoreInt32(&prefetchInFlight, 0)
+ // If a trigger arrived during this run, execute one more cycle immediately
+ if atomic.SwapInt32(&prefetchPending, 0) == 1 {
+ // Small delay to allow DB/cache writes to settle
+ time.Sleep(500 * time.Millisecond)
+ doPrefetchCycleGuarded(client, baseURL)
+ }
+ }()
+ doPrefetchCycle(client, baseURL)
}
func isDuringMatch(cacheDir string) bool {