import { FeatureFlag, FeatureFlagFilter, Role, Tenant } from "@toolctrl/db/prisma-browser"; import { useNavigation, useNavigate, Form } from "react-router"; import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import ButtonSecondary from "~/components/ui/buttons/ButtonSecondary"; import LoadingButton from "~/components/ui/buttons/LoadingButton"; import InputText from "~/components/ui/input/InputText"; import SlideOverWideEmpty from "~/components/ui/slideOvers/SlideOverWideEmpty"; import SessionFilterModal from "~/modules/shared/components/SessionFilterModal"; import { FeatureFlagsFilterType, FeatureFlagsFilterTypes } from "../dtos/FeatureFlagsFilterTypes"; import { SubscriptionProductDto } from "~/application/dtos/subscriptions/SubscriptionProductDto"; import { UserSimple } from "~/utils/db/users.db.server"; import { adminPath } from "~/utils/app/CanonicalUrlUtils"; import { useLocaleFormatters } from "~/locale/format"; export default function FeatureFlagForm({ item, metadata, onDelete, }: { item?: FeatureFlag & { filters: FeatureFlagFilter[] }; metadata: { users: UserSimple[]; tenants: Tenant[]; subscriptionProducts: SubscriptionProductDto[]; roles: Role[]; analytics: { via: { name: string; count: number }[]; httpReferrer: { name: string; count: number }[]; browser: { name: string; count: number }[]; os: { name: string; count: number }[]; source: { name: string; count: number }[]; medium: { name: string; count: number }[]; campaign: { name: string; count: number }[]; }; }; onDelete?: () => void; }) { const { t } = useTranslation(); const formatters = useLocaleFormatters(); const navigation = useNavigation(); const navigate = useNavigate(); const [showFilterModal, setShowFilterModal] = useState<{ item?: { type: FeatureFlagsFilterType; value: string | null; action: string | null }; idx?: number; }>(); const [name, setName] = useState(item?.name || ""); const [description, setDescription] = useState(item?.description || ""); const [filters, setFilters] = useState<{ type: FeatureFlagsFilterType; value: string | null; action: string | null }[]>( item?.filters.map((f) => { return { type: f.type as FeatureFlagsFilterType, value: f.value, action: f.action, }; }) || [] ); useEffect(() => { if (!item) { // setName(StringUtils.toCamelCase(description.toLowerCase())); if (name === "currency") { setDescription(t("featureFlags.form.defaults.currencyDescription")); } } }, [item, name, t]); function onSaveFilter(item: { type: FeatureFlagsFilterType; value: string | null; action: string | null }) { const idx = showFilterModal?.idx; if (idx !== undefined) { filters[idx] = item; } else { filters.push(item); } setFilters([...filters]); setShowFilterModal(undefined); } function getActionName() { return item ? "edit" : "new"; } // const hasDefaultFlag = ["currency"].includes(name); return (