Skip to content

Commit f3e857e

Browse files
adjust avatar images rendering in schedule & save timezone preference in localstorage (#129)
* adjust avatar images rendering in schedule * add language chip to the event in the schedule * saved timezone preference in localstorage to avoid losing on refresh * adapt naming for consistency * translate comment Co-authored-by: Cristián Maureira-Fredes <[email protected]> --------- Co-authored-by: Cristián Maureira-Fredes <[email protected]>
1 parent 4672ccc commit f3e857e

File tree

1 file changed

+43
-4
lines changed

1 file changed

+43
-4
lines changed

src/pages/[lang]/schedule.astro

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { getLangFromUrl, useTranslations } from '../../i18n/utils';
66
import { getLocaleStaticPaths } from "../../i18n/locales";
77
import { Icon } from "astro-icon/components";
88
import scheduleData from "../../data/schedule.json";
9+
import sessionsData from "../../data/sessions.json";
910
1011
export function getStaticPaths() {
1112
return getLocaleStaticPaths();
@@ -129,7 +130,7 @@ const t = useTranslations(lang);
129130
</div>
130131
</Layout>
131132

132-
<script define:vars={{ scheduleData }}>
133+
<script define:vars={{ scheduleData, sessionsData }}>
133134
// Global timezone state
134135
let useLocalTime = false;
135136
let localTimezoneName = '';
@@ -140,10 +141,14 @@ const t = useTranslations(lang);
140141
// Global array of event times for scrollbar
141142
let eventTimes = [];
142143

143-
// Collect all events from all days
144+
// Collect all events from all days and enrich with session data
144145
const daysData = Object.entries(scheduleData.days);
145146
daysData.forEach(([date, day]) => {
146147
day.events.forEach((event) => {
148+
// Enrich event with language from sessions data
149+
if (event.code && sessionsData[event.code]) {
150+
event.language = sessionsData[event.code].language;
151+
}
147152
allEvents.push(event);
148153
});
149154
});
@@ -185,6 +190,25 @@ const t = useTranslations(lang);
185190
return date.toLocaleDateString('en-US', options);
186191
}
187192

193+
// Get language name from code
194+
function getLanguageName(langCode) {
195+
const languages = {
196+
'en': 'English',
197+
'es': 'Español',
198+
'pt': 'Português',
199+
'fr': 'Français',
200+
'ja': '日本語',
201+
'ko': '한국어',
202+
'zh': '中文',
203+
'de': 'Deutsch',
204+
'it': 'Italiano',
205+
'ru': 'Русский',
206+
'ar': 'العربية',
207+
'hi': 'हिन्दी'
208+
};
209+
return languages[langCode] || langCode?.toUpperCase() || '';
210+
}
211+
188212
function toRelativeUrl(url) {
189213
if (!url) return '';
190214
try {
@@ -378,7 +402,7 @@ const t = useTranslations(lang);
378402
<svg class="w-5 h-5 text-purple-600 dark:text-purple-400" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.579 2 2 6.579 2 12s4.579 10 10 10 10-4.579 10-10S17.421 2 12 2zm0 5c1.727 0 3 1.272 3 3s-1.273 3-3 3c-1.726 0-3-1.272-3-3s1.274-3 3-3zm-5.106 9.772c.897-1.32 2.393-2.2 4.106-2.2h2c1.714 0 3.209.88 4.106 2.2C15.828 18.14 14.015 19 12 19s-3.828-.86-5.106-2.228z"></path></svg>
379403
${event.speakers.map((speaker) => `
380404
<a href="${toRelativeUrl(speaker.website_url)}" class="flex items-center gap-2 group/speaker">
381-
${speaker.avatar ? `<img src="${speaker.avatar}" alt="${speaker.name}" class="w-8 h-8 rounded-full border-2 border-purple-500" />` : ''}
405+
${speaker.avatar ? `<img src="${speaker.avatar}" alt="${speaker.name}" class="w-8 h-8 rounded-full border-2 border-purple-500 object-cover" />` : ''}
382406
<span class="font-medium text-gray-700 dark:text-gray-300 group-hover/speaker:text-purple-600 dark:group-hover/speaker:text-purple-400 transition-colors">${speaker.name}</span>
383407
</a>
384408
`).join('')}
@@ -412,6 +436,10 @@ const t = useTranslations(lang);
412436
${event.session_type}
413437
</span>
414438
${event.level ? `<span class="px-3 py-1 rounded-full text-xs font-semibold text-white ${levelColor}">${event.level}</span>` : ''}
439+
${event.language ? `<span class="px-3 py-1 rounded-full text-xs font-semibold bg-teal-100 dark:bg-teal-900 text-teal-800 dark:text-teal-200 flex items-center gap-1">
440+
<svg class="w-3 h-3" viewBox="0 0 24 24" fill="currentColor"><path d="M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"></path></svg>
441+
${getLanguageName(event.language)}
442+
</span>` : ''}
415443
<span class="md:hidden px-3 py-1 rounded-full text-xs font-semibold bg-gray-200 dark:bg-gray-700 text-gray-700 dark:text-gray-300">
416444
${event.duration} min
417445
</span>
@@ -489,6 +517,15 @@ const t = useTranslations(lang);
489517
}
490518

491519
function initializeSchedulePage() {
520+
// Load timezone preference from localStorage
521+
const savedTimezone = localStorage.getItem('preferredTimezone');
522+
523+
if (savedTimezone === 'local') {
524+
useLocalTime = true;
525+
} else if (savedTimezone === 'utc') {
526+
useLocalTime = false;
527+
}
528+
492529
// Get local timezone name
493530
try {
494531
localTimezoneName = Intl.DateTimeFormat().resolvedOptions().timeZone;
@@ -507,6 +544,7 @@ const t = useTranslations(lang);
507544
if (utcBtn) {
508545
utcBtn.addEventListener('click', () => {
509546
useLocalTime = false;
547+
localStorage.setItem('preferredTimezone', 'utc');
510548
updateTimezoneButtons();
511549
updateAllTimes();
512550
});
@@ -515,6 +553,7 @@ const t = useTranslations(lang);
515553
if (localBtn) {
516554
localBtn.addEventListener('click', () => {
517555
useLocalTime = true;
556+
localStorage.setItem('preferredTimezone', 'local');
518557
updateTimezoneButtons();
519558
updateAllTimes();
520559
});
@@ -703,7 +742,7 @@ const t = useTranslations(lang);
703742
// Initial update
704743
updateScrollIndicator();
705744
updateTimeTooltip();
706-
reorganizeSchedule();
745+
updateTimezoneButtons(); // This will apply the saved state
707746
}
708747

709748
// Call initialization onboth DOMContentLoaded and Astro page load

0 commit comments

Comments
 (0)