diff --git a/src/components/Calendar/CalendarSearch.tsx b/src/components/Calendar/CalendarSearch.tsx index d9a5bd3..d543e5e 100644 --- a/src/components/Calendar/CalendarSearch.tsx +++ b/src/components/Calendar/CalendarSearch.tsx @@ -2,6 +2,8 @@ import { useAppDispatch, useAppSelector } from "@/app/hooks"; import { getCalendars } from "@/features/Calendars/CalendarApi"; import { Calendar } from "@/features/Calendars/CalendarTypes"; import { addSharedCalendarAsync } from "@/features/Calendars/services"; +import { CalendarData } from "@/features/Calendars/types/CalendarData"; +import { renameDefault } from "@/utils/renameDefault"; import { Avatar, Box, @@ -21,7 +23,7 @@ import { ColorPicker } from "./CalendarColorPicker"; import { defaultColors, getAccessiblePair } from "./utils/calendarColorsUtils"; interface CalendarWithOwner { - cal: Record; + cal: CalendarData; owner: User; } @@ -35,7 +37,7 @@ function CalendarItem({ onColorChange: (color: Record) => void; }) { const theme = useTheme(); - + const { t } = useI18n(); return ( - {cal.cal["dav:name"] === "#default" - ? cal.owner.displayName + "'s calendar" - : cal.cal["dav:name"]} + {renameDefault( + cal.cal["dav:name"], + cal.owner.displayName, + t, + false + )} {cal.owner.email} @@ -120,7 +125,7 @@ function SelectedCalendarsList({ (existing: Calendar) => existing.id === cal.cal?._links?.self?.href - .replace("/calendars/", "") + ?.replace("/calendars/", "") .replace(".json", "") ); @@ -218,7 +223,7 @@ export default function CalendarSearch({ (existing: Calendar) => existing.id === cal.cal?._links?.self?.href - .replace("/calendars/", "") + ?.replace("/calendars/", "") .replace(".json", "") ); if (!exists && cal.cal) { @@ -237,15 +242,15 @@ export default function CalendarSearch({ }, }) ); - return cal.cal._links.self.href - .replace("/calendars/", "") + return cal.cal._links.self?.href + ?.replace("/calendars/", "") .replace(".json", ""); } return null; }) ); - onClose(idList.filter(Boolean)); + onClose(idList.filter(Boolean) as string[]); setSelectedCalendars([]); setSelectedUsers([]); } @@ -286,20 +291,23 @@ export default function CalendarSearch({ const cals = await Promise.all( value.map(async (user: User) => { if (user?.openpaasId) { - const cals = (await getCalendars( + const cals = await getCalendars( user.openpaasId, "sharedPublic=true&" - )) as Record; + ); return cals._embedded?.["dav:calendar"] - ? cals._embedded["dav:calendar"].map( - (cal: Record) => ({ cal, owner: user }) - ) + ? cals._embedded["dav:calendar"].map((cal) => ({ + cal, + owner: user, + })) : { cal: undefined, owner: user }; } return null; }) ); - setSelectedCalendars(cals.flat().filter(Boolean)); + setSelectedCalendars( + cals.flat().filter(Boolean) as CalendarWithOwner[] + ); }} /> @@ -310,14 +318,14 @@ export default function CalendarSearch({ if (!cal.cal?._links?.self?.href) return; setSelectedCalendars((prev) => prev.filter( - (c) => c.cal?._links?.self?.href !== cal.cal._links.self.href + (c) => c.cal?._links?.self?.href !== cal.cal._links.self?.href ) ); if ( !selectedCal.find( (c) => cal.owner.email === c.owner.email && - c.cal?._links?.self?.href !== cal.cal._links.self.href + c.cal?._links?.self?.href !== cal.cal._links.self?.href ) ) { setSelectedUsers((prev) => @@ -329,7 +337,7 @@ export default function CalendarSearch({ setSelectedCalendars((prev) => prev.map((prevcal) => prevcal.owner.email === cal.owner.email && - prevcal.cal._links.self.href === cal.cal._links.self.href + prevcal.cal._links.self?.href === cal.cal._links.self?.href ? { ...prevcal, cal: { diff --git a/src/components/Calendar/CalendarSelection.tsx b/src/components/Calendar/CalendarSelection.tsx index 7036c89..1eb6243 100644 --- a/src/components/Calendar/CalendarSelection.tsx +++ b/src/components/Calendar/CalendarSelection.tsx @@ -2,6 +2,7 @@ import { useAppDispatch, useAppSelector } from "@/app/hooks"; import { Calendar } from "@/features/Calendars/CalendarTypes"; import { removeCalendarAsync } from "@/features/Calendars/services"; import { extractEventBaseUuid } from "@/utils/extractEventBaseUuid"; +import { renameDefault } from "@/utils/renameDefault"; import { trimLongTextWithoutSpace } from "@/utils/textUtils"; import { Accordion, @@ -298,7 +299,7 @@ function CalendarSelector({ wordBreak: "break-word", }} > - {trimmedName} + {renameDefault(trimmedName, calendars[id].owner, t, isPersonal)} diff --git a/src/features/Calendars/services/addSharedCalendarAsync.ts b/src/features/Calendars/services/addSharedCalendarAsync.ts index fafbd75..7c9fb59 100644 --- a/src/features/Calendars/services/addSharedCalendarAsync.ts +++ b/src/features/Calendars/services/addSharedCalendarAsync.ts @@ -36,12 +36,7 @@ export const addSharedCalendarAsync = createAsyncThunk< color: cal.color, link: `/calendars/${userId}/${calId}.json`, desc: cal.cal["caldav:description"] ?? "", - name: - ownerData.id !== userId && cal.cal["dav:name"] === "#default" - ? `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${ - ownerData.lastname ?? "" - }` + "'s calendar" - : (cal.cal["dav:name"] ?? ""), + name: cal.cal["dav:name"] ?? "", owner: `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${ ownerData.lastname ?? "" }`, diff --git a/src/features/Calendars/services/getCalendarsListAsync.ts b/src/features/Calendars/services/getCalendarsListAsync.ts index 2ee9ed9..cb19be4 100644 --- a/src/features/Calendars/services/getCalendarsListAsync.ts +++ b/src/features/Calendars/services/getCalendarsListAsync.ts @@ -65,11 +65,6 @@ export const getCalendarsListAsync = createAsyncThunk< lastname: "Unknown User", emails: [], }; - const name = - ownerId !== user.id && cal["dav:name"] === "#default" - ? `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${ownerData.lastname}` + - "'s calendar" - : cal["dav:name"]; const color = { light: cal["apple:color"] ?? "#006BD8", @@ -77,7 +72,7 @@ export const getCalendarsListAsync = createAsyncThunk< }; fetchedCalendars[id] = { id, - name, + name: cal["dav:name"] ?? "", link, owner: `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${ownerData.lastname}`, ownerEmails: ownerData.emails, diff --git a/src/locales/en.json b/src/locales/en.json index 6ec2f1d..613847c 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -2,6 +2,8 @@ "locale": "en-gb", "calendar": { "personal": "My calendars", + "defaultPersonalCalendarName": "My calendar", + "defaultCalendarName": "%{name}'s calendar", "delegated": "Delegated calendars", "other": "Other calendars", "caldav_access": "CalDAV access", diff --git a/src/locales/fr.json b/src/locales/fr.json index 8ff8226..5a6e051 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -2,6 +2,8 @@ "locale": "fr-fr", "calendar": { "personal": "Mes calendriers", + "defaultPersonalCalendarName": "Mon calendrier", + "defaultCalendarName": "Calendrier de %{name}", "delegated": "Calendriers délégués", "other": "Autres calendriers", "caldav_access": "Accès CalDAV", diff --git a/src/locales/ru.json b/src/locales/ru.json index b062f7b..e0f31bd 100644 --- a/src/locales/ru.json +++ b/src/locales/ru.json @@ -2,6 +2,8 @@ "locale": "ru-ru", "calendar": { "personal": "Личные", + "defaultPersonalCalendarName": "Мой календарь", + "defaultCalendarName": "Календарь %{name}", "delegated": "Делегированные", "other": "Другие", "caldav_access": "Доступ CalDAV", diff --git a/src/locales/vi.json b/src/locales/vi.json index 21d6dc4..8a2a87f 100644 --- a/src/locales/vi.json +++ b/src/locales/vi.json @@ -2,6 +2,8 @@ "locale": "vi", "calendar": { "personal": "Lịch cá nhân", + "defaultPersonalCalendarName": "Lịch của tôi", + "defaultCalendarName": "Lịch của %{name}", "delegated": "Lịch được ủy quyền", "other": "Lịch khác", "caldav_access": "Truy cập CalDAV", diff --git a/src/utils/renameDefault.ts b/src/utils/renameDefault.ts new file mode 100644 index 0000000..84a7d99 --- /dev/null +++ b/src/utils/renameDefault.ts @@ -0,0 +1,17 @@ +export function renameDefault( + davName: string | undefined, + ownerName: string, + t: (key: string, params?: object) => string, + isOwnCalendar?: boolean +) { + if (!davName) { + return t("calendar.defaultCalendarName", { name: ownerName }); + } + if (davName !== "#default") { + return davName; + } + if (isOwnCalendar) { + return t("calendar.defaultPersonalCalendarName"); + } + return t("calendar.defaultCalendarName", { name: ownerName }); +}