import ArrowBackIcon from "@mui/icons-material/ArrowBack";
import RepeatIcon from "@mui/icons-material/Repeat";
import SquareRoundedIcon from "@mui/icons-material/SquareRounded";
import VideocamIcon from "@mui/icons-material/Videocam";
import { Box, Button, IconButton, Stack, Typography } from "@mui/material";
import CircularProgress from "@mui/material/CircularProgress";
import { useI18n } from "twake-i18n";
import { useState } from "react";
import { useAppDispatch, useAppSelector } from "../../app/hooks";
import { AppDispatch } from "../../app/store";
import logo from "../../static/noResult-logo.svg";
import { browserDefaultTimeZone } from "../../utils/timezone";
import { getEventAsync } from "../Calendars/CalendarSlice";
import EventPreviewModal from "../Events/EventDisplayPreview";
import { CalendarEvent } from "../Events/EventsTypes";
import { setView } from "../Settings/SettingsSlice";
import "./searchResult.styl";
const styles = {
M3BodyLarge: {
fontFamily: "Roboto",
fontWeight: 400,
fontStyle: "normal",
fontSize: "22px",
lineHeight: "28px",
letterSpacing: "0%",
color: "#243B55",
},
M3BodyMedium1: {
fontFamily: "Inter",
fontWeight: 400,
fontStyle: "normal",
fontSize: "16px",
lineHeight: "24px",
letterSpacing: "-0.15px",
color: "#243B55",
},
M3BodyMedium: {
fontFamily: "Roboto",
fontWeight: 400,
fontStyle: "normal",
fontSize: "14px",
lineHeight: "20px",
letterSpacing: "0.25px",
verticalAlign: "middle",
color: "#8C9CAF",
},
M3BodyMedium3: {
fontFamily: "Inter",
fontWeight: 400,
fontSize: "14px",
lineHeight: "20px",
letterSpacing: "0.25px",
verticalAlign: "middle",
color: "#8C9CAF",
},
M3TitleMedium: {
fontFamily: "Roboto",
fontWeight: 500,
fontStyle: "medium",
fontSize: "16px",
lineHeight: "24px",
letterSpacing: "0.15px",
textAlign: "center",
verticalAlign: "middle",
color: "#243B55",
},
};
export default function SearchResultsPage() {
const { t } = useI18n();
const dispatch = useAppDispatch();
const { error, loading, hits, results } = useAppSelector(
(state) => state.searchResult
);
let layout;
if (loading) {
layout = (
);
} else if (error) {
layout = (
{error}
);
} else if (!hits) {
layout = (
{t("search.noResults")}
{t("search.noResultsSubtitle")}
);
} else {
layout = (
{results?.map((r: any, idx: number) => (
))}
);
}
return (
dispatch(setView("calendar"))}
aria-label={t("settings.back")}
>
{t("search.resultsTitle")}
{layout}
);
}
function ResultItem({
eventData,
dispatch,
}: {
eventData: Record;
dispatch: AppDispatch;
}) {
const { t } = useI18n();
const startDate = new Date(eventData.data.start);
const endDate = eventData.data.end ? new Date(eventData.data.end) : startDate;
const timeZone =
useAppSelector((state) => state.settings.timeZone) ??
browserDefaultTimeZone;
const calendar = useAppSelector(
(state) =>
state.calendars.list[
`${eventData.data.userId}/${eventData.data.calendarId}`
]
);
const calendarColor = calendar?.color?.light;
const [openPreview, setOpenPreview] = useState(false);
const handleOpenResult = async (eventData: Record) => {
if (calendar) {
const event = {
URL: eventData._links.self.href,
calId: calendar.id,
uid: eventData.data.uid,
start: eventData.data.start,
end: eventData.data.end,
allday: eventData.data.allDay,
attendee: eventData.data.attendees,
class: eventData.data.class,
description: eventData.data.description,
stamp: eventData.data.dtstamp,
location: eventData.data.location,
organizer: eventData.data.organizer,
title: eventData.data.summary,
timezone: timeZone,
} as CalendarEvent;
await dispatch(getEventAsync(event));
setOpenPreview(true);
}
};
return (
<>
handleOpenResult(eventData)}
>
{startDate.toLocaleDateString(t("locale"), {
day: "2-digit",
month: "short",
timeZone,
})}
{startDate.toDateString() !== endDate.toDateString() && (
<>
{" - "}
{endDate.toLocaleDateString(t("locale"), {
day: "2-digit",
month: "short",
timeZone,
})}
>
)}
{!eventData.data.allDay && (
{startDate.toLocaleTimeString(t("locale"), {
hour: "2-digit",
minute: "2-digit",
timeZone,
})}
-
{endDate.toLocaleTimeString(t("locale"), {
hour: "2-digit",
minute: "2-digit",
timeZone,
})}
)}
{eventData.data.summary || t("event.untitled")}
{eventData.data.isRecurrentMaster && }
{(eventData.data.organizer?.cn || eventData.data.organizer?.email) && (
{eventData.data.organizer.cn || eventData.data.organizer.email}
)}
{eventData.data?.location && (
{eventData.data.location}
)}
{eventData.data?.description && (
{eventData.data.description.replace(/\n/g, " ")}
)}
{eventData.data["x-openpaas-videoconference"] && (
}
sx={{ flexShrink: 0, ml: "auto" }}
onClick={(e) => {
e.stopPropagation();
window.open(
eventData.data["x-openpaas-videoconference"],
"_blank",
"noopener,noreferrer"
);
}}
>
{t("eventPreview.joinVideoShort")}
)}
{calendar && calendar.events[eventData.data.uid] && (
setOpenPreview(false)}
/>
)}
>
);
}