Massive/PlanItem.tsx

107 lines
2.7 KiB
TypeScript
Raw Permalink Normal View History

import {
NavigationProp,
useFocusEffect,
useNavigation,
} from "@react-navigation/native";
import { useCallback, useMemo, useState } from "react";
import { Text } from "react-native";
import { List, useTheme } from "react-native-paper";
2023-11-12 04:05:37 +00:00
import { StackParams } from "./AppStack";
import { DARK_RIPPLE, LIGHT_RIPPLE } from "./constants";
2023-11-12 04:05:37 +00:00
import { DAYS } from "./days";
import { setRepo } from "./db";
2023-11-13 05:13:23 +00:00
import GymSet, { defaultSet } from "./gym-set";
import { Plan } from "./plan";
2022-07-06 05:40:53 +00:00
export default function PlanItem({
item,
setIds,
ids,
2022-07-06 05:40:53 +00:00
}: {
item: Plan;
ids: number[];
setIds: (value: number[]) => void;
2022-07-06 05:40:53 +00:00
}) {
const [today, setToday] = useState<string>();
const { dark } = useTheme();
const days = useMemo(() => item.days.split(","), [item.days]);
const navigation = useNavigation<NavigationProp<StackParams>>();
useFocusEffect(
useCallback(() => {
const newToday = DAYS[new Date().getDay()];
setToday(newToday);
}, [])
);
2022-07-06 05:40:53 +00:00
const start = useCallback(async () => {
const exercise = item.exercises.split(",")[0];
2023-11-13 05:13:23 +00:00
let first: Partial<GymSet> = await setRepo.findOne({
where: { name: exercise },
order: { created: "desc" },
});
if (!first) first = { ...defaultSet, name: exercise };
delete first.id;
2023-06-27 03:16:59 +00:00
if (ids.length === 0) {
return navigation.navigate("StartPlan", { plan: item, first });
2023-06-27 03:16:59 +00:00
}
const removing = ids.find((id) => id === item.id);
if (removing) setIds(ids.filter((id) => id !== item.id));
else setIds([...ids, item.id]);
}, [ids, setIds, item, navigation]);
2022-07-08 02:59:19 +00:00
const longPress = useCallback(() => {
if (ids.length > 0) return;
setIds([item.id]);
}, [ids.length, item.id, setIds]);
2023-08-21 12:25:29 +00:00
const currentDays = days.map((day, index) => (
<Text key={day}>
{day === today ? (
<Text
style={{
fontWeight: "bold",
textDecorationLine: "underline",
}}
>
{day}
</Text>
) : (
day
)}
{index === days.length - 1 ? "" : ", "}
</Text>
));
const title = useMemo(
() =>
2023-08-21 12:25:29 +00:00
item.title ? (
<Text style={{ fontWeight: "bold" }}>{item.title}</Text>
) : (
currentDays
),
[item.title, currentDays]
);
const description = useMemo(
() => (item.title ? currentDays : item.exercises.replace(/,/g, ", ")),
[item.title, currentDays, item.exercises]
);
const backgroundColor = useMemo(() => {
if (!ids.includes(item.id)) return;
if (dark) return DARK_RIPPLE;
return LIGHT_RIPPLE;
}, [dark, ids, item.id]);
2022-07-06 05:40:53 +00:00
return (
<List.Item
onPress={start}
title={title}
description={description}
onLongPress={longPress}
2023-06-27 03:16:59 +00:00
style={{ backgroundColor }}
/>
);
2022-07-06 05:40:53 +00:00
}