mirror of
https://github.com/inaturalist/iNaturalistReactNative.git
synced 2026-05-04 21:53:59 -04:00
110 lines
2.9 KiB
TypeScript
110 lines
2.9 KiB
TypeScript
import classNames from "classnames";
|
|
import checkCamelAndSnakeCase from "components/ObsDetails/helpers/checkCamelAndSnakeCase";
|
|
import {
|
|
CommentsCount,
|
|
IdentificationsCount,
|
|
QualityGradeStatus
|
|
} from "components/SharedComponents";
|
|
import { View } from "components/styledComponents";
|
|
import React, { useCallback } from "react";
|
|
import type { RealmObservation } from "realmModels/types";
|
|
import colors from "styles/tailwindColors";
|
|
|
|
interface Props {
|
|
observation: RealmObservation;
|
|
layout?: "horizontal" | "vertical";
|
|
white?: boolean;
|
|
classNameMargin?: string;
|
|
testID?: string;
|
|
isSimpleObsStatus?: boolean;
|
|
}
|
|
|
|
const ObsStatus = ( {
|
|
observation,
|
|
white,
|
|
layout = "vertical",
|
|
classNameMargin,
|
|
testID,
|
|
isSimpleObsStatus
|
|
}: Props ) => {
|
|
const margin = layout === "vertical"
|
|
? "mb-1 ml-1"
|
|
: "mr-2";
|
|
|
|
const identificationsFilled = observation?.identifications_viewed === false;
|
|
const showCurrentIdCount = useCallback( ( ) => {
|
|
let numCurrentIdents = observation?.identifications?.filter(
|
|
id => id.current === true
|
|
)?.length || 0;
|
|
if ( numCurrentIdents === 0 && observation?.taxon ) {
|
|
numCurrentIdents = 1;
|
|
}
|
|
|
|
return (
|
|
<IdentificationsCount
|
|
classNameMargin={margin}
|
|
count={numCurrentIdents}
|
|
white={white}
|
|
filled={identificationsFilled}
|
|
/>
|
|
);
|
|
}, [observation, margin, white, identificationsFilled] );
|
|
|
|
const commentsFilled = observation?.comments_viewed === false;
|
|
const showCommentCount = useCallback( ( ) => {
|
|
const numComments = observation?.comments?.length || 0;
|
|
|
|
return (
|
|
<CommentsCount
|
|
classNameMargin={margin}
|
|
count={numComments}
|
|
white={white}
|
|
filled={commentsFilled}
|
|
testID="ObsStatus.commentsCount"
|
|
/>
|
|
);
|
|
}, [observation, margin, white, commentsFilled] );
|
|
|
|
const showQualityGrade = useCallback( ( ) => {
|
|
const qualityGrade = checkCamelAndSnakeCase( observation, "qualityGrade" );
|
|
const iconColorResearchCheck = qualityGrade === "research"
|
|
? colors.inatGreen
|
|
: colors.darkGray;
|
|
const iconColor = white
|
|
? colors.white
|
|
: iconColorResearchCheck;
|
|
return <QualityGradeStatus qualityGrade={qualityGrade} color={iconColor} />;
|
|
}, [observation, white] );
|
|
|
|
if ( isSimpleObsStatus ) {
|
|
if ( identificationsFilled || commentsFilled ) {
|
|
return (
|
|
<View
|
|
className={classNames( "flex-1 justify-center items-end", classNameMargin )}
|
|
testID={testID}
|
|
>
|
|
<View
|
|
className="h-[10px] w-[10px] rounded-full bg-inatGreen"
|
|
/>
|
|
</View>
|
|
);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
return (
|
|
<View
|
|
className={classNames( {
|
|
"flex-row": layout === "horizontal"
|
|
}, classNameMargin )}
|
|
testID={testID}
|
|
>
|
|
{showCurrentIdCount( )}
|
|
{showCommentCount( )}
|
|
{showQualityGrade( )}
|
|
</View>
|
|
);
|
|
};
|
|
|
|
export default ObsStatus;
|