eletrotupi / tcc / frontend/components/ui/DailySleepWidget.tsx master
2.0 KB Raw
import React from "react";
import { View, Text, StyleSheet, ActivityIndicator } from "react-native";
import { Card } from "./Cards";
import { Colors, Spacing, Typography } from "@/constants/theme";
import { Ionicons } from "@expo/vector-icons";
import { useInsight } from "@/hooks/useInsights.queries";

export const DailySleepWidget = () => {
  const { data: insight, isLoading } = useInsight("DAILY_SLEEP");

  const metadata = insight?.metadata as
    | {
        diffStr: string;
        diffMinutes: number;
      }
    | undefined;

  const diffColor = metadata?.diffMinutes
    ? metadata.diffMinutes < 0
      ? Colors.light.danger
      : Colors.light.tint
    : Colors.light.tint;

  return (
    <Card style={{ padding: Spacing.cardGap }}>
      <View
        style={{
          flex: 1,
          flexDirection: "row",
          flexGrow: 0,
          paddingVertical: 10,
        }}
      >
        <Ionicons name="moon" size={20} color="#64748B" />

        <Text style={{ ...Typography.headlineMd, marginBottom: 10 }}>Sono</Text>
      </View>

      <View style={{ flex: 1 }}>
        {isLoading ? (
          <View style={styles.empty}>
            <ActivityIndicator size="small" style={{ paddingBottom: 50 }} />
          </View>
        ) : insight ? (
          <>
            <Text style={{ ...Typography.headlineMd, marginBottom: 10 }}>
              {insight.body}
            </Text>
            <Text style={{ ...styles.indicatorGreen, color: diffColor }}>
              {metadata?.diffStr}
            </Text>
          </>
        ) : (
          <>
            <Text style={styles.empty}>
              Não há dados disponíveis para o dia de hoje
            </Text>
          </>
        )}
      </View>
    </Card>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    padding: Spacing.cardGap,
  },
  indicatorGreen: {
    fontSize: 11,
    fontWeight: 600,
    lineHeight: 16.5,
  },
  empty: {
    ...Typography.labelSm,
    opacity: 0.5,
  },
});