| [700e2f9] | 1 | import { type Component, Show } from "solid-js";
|
|---|
| 2 |
|
|---|
| 3 | interface CalendarDayProps {
|
|---|
| 4 | day: number | null;
|
|---|
| 5 | isCurrentMonth: boolean;
|
|---|
| 6 | hasEntry: boolean;
|
|---|
| 7 | isFuture?: boolean;
|
|---|
| 8 | isToday?: boolean;
|
|---|
| 9 | isTherapistView?: boolean;
|
|---|
| 10 | entry?: {
|
|---|
| 11 | dailyRating: number;
|
|---|
| 12 | content: string;
|
|---|
| 13 | };
|
|---|
| 14 | onClick?: () => void;
|
|---|
| 15 | }
|
|---|
| 16 |
|
|---|
| 17 | const getRatingColor = (rating: number) => {
|
|---|
| 18 | if (rating <= 2) return "bg-red-100 border-red-300 text-red-800";
|
|---|
| 19 | if (rating <= 4) return "bg-orange-100 border-orange-300 text-orange-800";
|
|---|
| 20 | if (rating <= 6) return "bg-yellow-100 border-yellow-300 text-yellow-800";
|
|---|
| 21 | if (rating <= 8) return "bg-green-100 border-green-300 text-green-800";
|
|---|
| 22 | return "bg-blue-100 border-blue-300 text-blue-800";
|
|---|
| 23 | };
|
|---|
| 24 |
|
|---|
| 25 | const CalendarDay: Component<CalendarDayProps> = (props) => (
|
|---|
| 26 | <Show
|
|---|
| 27 | when={props.day !== null && props.isCurrentMonth}
|
|---|
| 28 | fallback={
|
|---|
| 29 | <div
|
|---|
| 30 | class={`bg-gray-50 border border-gray-200 rounded-lg p-2 ${props.isTherapistView ? "h-16" : "h-24"}`}
|
|---|
| 31 | />
|
|---|
| 32 | }
|
|---|
| 33 | >
|
|---|
| 34 | <div
|
|---|
| 35 | class={`rounded-lg p-2 transition-all ${props.isTherapistView ? "h-16" : "h-24"} ${
|
|---|
| 36 | props.isToday ? "border-4 border-blue-600 shadow-lg" : "border-2"
|
|---|
| 37 | } ${props.isFuture || props.isTherapistView ? "" : "cursor-pointer"} ${
|
|---|
| 38 | props.hasEntry
|
|---|
| 39 | ? `${getRatingColor(props.entry!.dailyRating)} hover:shadow-md`
|
|---|
| 40 | : props.isFuture
|
|---|
| 41 | ? "bg-white border-gray-200 text-gray-400 relative overflow-hidden"
|
|---|
| 42 | : "bg-white border-gray-200 text-gray-300 hover:border-gray-300"
|
|---|
| 43 | }`}
|
|---|
| 44 | onClick={props.isFuture ? undefined : props.onClick}
|
|---|
| 45 | style={
|
|---|
| 46 | props.isFuture && !props.hasEntry
|
|---|
| 47 | ? {
|
|---|
| 48 | "background-image":
|
|---|
| 49 | "repeating-linear-gradient(45deg, transparent, transparent 10px, rgba(0,0,0,0.03) 10px, rgba(0,0,0,0.03) 20px)",
|
|---|
| 50 | }
|
|---|
| 51 | : {}
|
|---|
| 52 | }
|
|---|
| 53 | >
|
|---|
| 54 | <div class="flex justify-between items-start mb-1">
|
|---|
| 55 | <span
|
|---|
| 56 | class={`text-sm font-semibold ${
|
|---|
| 57 | props.hasEntry ? "" : "text-gray-400"
|
|---|
| 58 | }`}
|
|---|
| 59 | >
|
|---|
| 60 | {props.day}
|
|---|
| 61 | </span>
|
|---|
| 62 | <Show when={props.hasEntry}>
|
|---|
| 63 | <span
|
|---|
| 64 | class={`font-bold ${props.isTherapistView ? "text-base" : "text-xs"}`}
|
|---|
| 65 | >
|
|---|
| 66 | ★ {props.entry!.dailyRating}/10
|
|---|
| 67 | </span>
|
|---|
| 68 | </Show>
|
|---|
| 69 | </div>
|
|---|
| 70 | <Show when={props.hasEntry && !props.isTherapistView}>
|
|---|
| 71 | <p class="text-xs line-clamp-2 overflow-hidden">
|
|---|
| 72 | {props.entry!.content}
|
|---|
| 73 | </p>
|
|---|
| 74 | </Show>
|
|---|
| 75 | </div>
|
|---|
| 76 | </Show>
|
|---|
| 77 | );
|
|---|
| 78 |
|
|---|
| 79 | export default CalendarDay;
|
|---|