style: clean up code formatting and remove trailing whitespace
refactor: reorganize imports and fix type imports
This commit is contained in:
1 parent
d3704602fd
commit
47c04de6fe
232 files changed
+7140
-4798
No files matched your search
@@ -1,12 +1,12 @@
|
||||
"use client";
|
||||
|
||||
import { useCallback, useMemo, useState } from "react";
|
||||
import type { SubscriptionTierSummary } from "@/lib/prisma/queries/subscription-tiers";
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
import { Input } from "@/components/ui/input";
|
||||
import { Textarea } from "@/components/ui/textarea";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import type { SubscriptionTierSummary } from "@/lib/prisma/queries/subscription-tiers";
|
||||
|
||||
type FeedbackState =
|
||||
| { type: "success"; message: string }
|
||||
@@ -38,7 +38,10 @@ function mapTierToFormState(tier: SubscriptionTierSummary): TierFormState {
|
||||
priceYearly: tier.price_yearly ? tier.price_yearly.toString() : "",
|
||||
isActive: tier.is_active,
|
||||
features: (tier.features ?? [])
|
||||
.map((feature) => `${feature.feature_key}|${feature.label}|${feature.description ?? ""}`)
|
||||
.map(
|
||||
(feature) =>
|
||||
`${feature.feature_key}|${feature.label}|${feature.description ?? ""}`,
|
||||
)
|
||||
.join("\n"),
|
||||
};
|
||||
}
|
||||
@@ -53,7 +56,9 @@ function parseFeatures(text: string) {
|
||||
.map((line) => line.trim())
|
||||
.filter(Boolean)
|
||||
.map((line, index) => {
|
||||
const [featureKey, label, description] = line.split("|").map((part) => part?.trim() ?? "");
|
||||
const [featureKey, label, description] = line
|
||||
.split("|")
|
||||
.map((part) => part?.trim() ?? "");
|
||||
return {
|
||||
feature_key: featureKey,
|
||||
label: label || featureKey,
|
||||
@@ -79,8 +84,14 @@ export function AdminSubscriptionDashboard({
|
||||
isActive: true,
|
||||
features: "",
|
||||
});
|
||||
const [editForms, setEditForms] = useState<Record<number, TierFormState>>(() =>
|
||||
Object.fromEntries(initialTiers.map((tier) => [tier.subscription_tier_id, mapTierToFormState(tier)]))
|
||||
const [editForms, setEditForms] = useState<Record<number, TierFormState>>(
|
||||
() =>
|
||||
Object.fromEntries(
|
||||
initialTiers.map((tier) => [
|
||||
tier.subscription_tier_id,
|
||||
mapTierToFormState(tier),
|
||||
]),
|
||||
),
|
||||
);
|
||||
const [assignUserId, setAssignUserId] = useState("");
|
||||
const [assignTierId, setAssignTierId] = useState<string>("free");
|
||||
@@ -105,8 +116,8 @@ export function AdminSubscriptionDashboard({
|
||||
data.tiers.map((tier: SubscriptionTierSummary) => [
|
||||
tier.subscription_tier_id,
|
||||
mapTierToFormState(tier),
|
||||
])
|
||||
)
|
||||
]),
|
||||
),
|
||||
);
|
||||
}, []);
|
||||
|
||||
@@ -119,8 +130,12 @@ export function AdminSubscriptionDashboard({
|
||||
slug: createForm.slug,
|
||||
description: createForm.description || null,
|
||||
level: Number.parseInt(createForm.level.toString(), 10),
|
||||
priceMonthly: createForm.priceMonthly ? Number.parseFloat(createForm.priceMonthly) : null,
|
||||
priceYearly: createForm.priceYearly ? Number.parseFloat(createForm.priceYearly) : null,
|
||||
priceMonthly: createForm.priceMonthly
|
||||
? Number.parseFloat(createForm.priceMonthly)
|
||||
: null,
|
||||
priceYearly: createForm.priceYearly
|
||||
? Number.parseFloat(createForm.priceYearly)
|
||||
: null,
|
||||
isActive: createForm.isActive,
|
||||
features: parseFeatures(createForm.features),
|
||||
};
|
||||
@@ -156,7 +171,9 @@ export function AdminSubscriptionDashboard({
|
||||
setFeedback({
|
||||
type: "error",
|
||||
message:
|
||||
error instanceof Error ? error.message : "Não foi possível criar o plano.",
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: "Não foi possível criar o plano.",
|
||||
});
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
@@ -173,8 +190,12 @@ export function AdminSubscriptionDashboard({
|
||||
slug: form.slug,
|
||||
description: form.description || null,
|
||||
level: Number.parseInt(form.level.toString(), 10),
|
||||
priceMonthly: form.priceMonthly ? Number.parseFloat(form.priceMonthly) : null,
|
||||
priceYearly: form.priceYearly ? Number.parseFloat(form.priceYearly) : null,
|
||||
priceMonthly: form.priceMonthly
|
||||
? Number.parseFloat(form.priceMonthly)
|
||||
: null,
|
||||
priceYearly: form.priceYearly
|
||||
? Number.parseFloat(form.priceYearly)
|
||||
: null,
|
||||
isActive: form.isActive,
|
||||
features: parseFeatures(form.features),
|
||||
};
|
||||
@@ -194,12 +215,17 @@ export function AdminSubscriptionDashboard({
|
||||
}
|
||||
|
||||
await refreshTiers();
|
||||
setFeedback({ type: "success", message: "Plano atualizado com sucesso." });
|
||||
setFeedback({
|
||||
type: "success",
|
||||
message: "Plano atualizado com sucesso.",
|
||||
});
|
||||
} catch (error) {
|
||||
setFeedback({
|
||||
type: "error",
|
||||
message:
|
||||
error instanceof Error ? error.message : "Não foi possível atualizar o plano.",
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: "Não foi possível atualizar o plano.",
|
||||
});
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
@@ -231,7 +257,9 @@ export function AdminSubscriptionDashboard({
|
||||
setFeedback({
|
||||
type: "error",
|
||||
message:
|
||||
error instanceof Error ? error.message : "Não foi possível remover o plano.",
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: "Não foi possível remover o plano.",
|
||||
});
|
||||
} finally {
|
||||
setIsLoading(false);
|
||||
@@ -242,7 +270,10 @@ export function AdminSubscriptionDashboard({
|
||||
resetFeedback();
|
||||
|
||||
if (!assignUserId.trim()) {
|
||||
setFeedback({ type: "error", message: "Informe um ID de usuário válido." });
|
||||
setFeedback({
|
||||
type: "error",
|
||||
message: "Informe um ID de usuário válido.",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -290,7 +321,7 @@ export function AdminSubscriptionDashboard({
|
||||
}
|
||||
return a.level - b.level;
|
||||
}),
|
||||
[tiers]
|
||||
[tiers],
|
||||
);
|
||||
|
||||
return (
|
||||
@@ -322,7 +353,10 @@ export function AdminSubscriptionDashboard({
|
||||
placeholder="Ex.: Ultra"
|
||||
value={createForm.name}
|
||||
onChange={(event) =>
|
||||
setCreateForm((prev) => ({ ...prev, name: event.target.value }))
|
||||
setCreateForm((prev) => ({
|
||||
...prev,
|
||||
name: event.target.value,
|
||||
}))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
@@ -335,7 +369,10 @@ export function AdminSubscriptionDashboard({
|
||||
placeholder="ex.: ultra"
|
||||
value={createForm.slug}
|
||||
onChange={(event) =>
|
||||
setCreateForm((prev) => ({ ...prev, slug: event.target.value }))
|
||||
setCreateForm((prev) => ({
|
||||
...prev,
|
||||
slug: event.target.value,
|
||||
}))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
@@ -365,7 +402,10 @@ export function AdminSubscriptionDashboard({
|
||||
variant={createForm.isActive ? "default" : "outline"}
|
||||
type="button"
|
||||
onClick={() =>
|
||||
setCreateForm((prev) => ({ ...prev, isActive: !prev.isActive }))
|
||||
setCreateForm((prev) => ({
|
||||
...prev,
|
||||
isActive: !prev.isActive,
|
||||
}))
|
||||
}
|
||||
>
|
||||
{createForm.isActive ? "Ativo" : "Inativo"}
|
||||
@@ -375,7 +415,10 @@ export function AdminSubscriptionDashboard({
|
||||
|
||||
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium" htmlFor="tier-price-monthly">
|
||||
<label
|
||||
className="text-sm font-medium"
|
||||
htmlFor="tier-price-monthly"
|
||||
>
|
||||
Preço mensal (opcional)
|
||||
</label>
|
||||
<Input
|
||||
@@ -385,12 +428,18 @@ export function AdminSubscriptionDashboard({
|
||||
step="0.01"
|
||||
value={createForm.priceMonthly}
|
||||
onChange={(event) =>
|
||||
setCreateForm((prev) => ({ ...prev, priceMonthly: event.target.value }))
|
||||
setCreateForm((prev) => ({
|
||||
...prev,
|
||||
priceMonthly: event.target.value,
|
||||
}))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium" htmlFor="tier-price-yearly">
|
||||
<label
|
||||
className="text-sm font-medium"
|
||||
htmlFor="tier-price-yearly"
|
||||
>
|
||||
Preço anual (opcional)
|
||||
</label>
|
||||
<Input
|
||||
@@ -400,7 +449,10 @@ export function AdminSubscriptionDashboard({
|
||||
step="0.01"
|
||||
value={createForm.priceYearly}
|
||||
onChange={(event) =>
|
||||
setCreateForm((prev) => ({ ...prev, priceYearly: event.target.value }))
|
||||
setCreateForm((prev) => ({
|
||||
...prev,
|
||||
priceYearly: event.target.value,
|
||||
}))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
@@ -415,7 +467,10 @@ export function AdminSubscriptionDashboard({
|
||||
rows={3}
|
||||
value={createForm.description}
|
||||
onChange={(event) =>
|
||||
setCreateForm((prev) => ({ ...prev, description: event.target.value }))
|
||||
setCreateForm((prev) => ({
|
||||
...prev,
|
||||
description: event.target.value,
|
||||
}))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
@@ -429,7 +484,10 @@ export function AdminSubscriptionDashboard({
|
||||
rows={4}
|
||||
value={createForm.features}
|
||||
onChange={(event) =>
|
||||
setCreateForm((prev) => ({ ...prev, features: event.target.value }))
|
||||
setCreateForm((prev) => ({
|
||||
...prev,
|
||||
features: event.target.value,
|
||||
}))
|
||||
}
|
||||
placeholder="premium.analytics|Analytics avançadas|Painéis detalhados"
|
||||
/>
|
||||
@@ -452,7 +510,8 @@ export function AdminSubscriptionDashboard({
|
||||
</CardHeader>
|
||||
<CardContent className="space-y-6">
|
||||
{orderedTiers.map((tier) => {
|
||||
const formState = editForms[tier.subscription_tier_id] ?? mapTierToFormState(tier);
|
||||
const formState =
|
||||
editForms[tier.subscription_tier_id] ?? mapTierToFormState(tier);
|
||||
|
||||
return (
|
||||
<Card key={tier.subscription_tier_id} className="border-muted">
|
||||
@@ -461,7 +520,10 @@ export function AdminSubscriptionDashboard({
|
||||
<CardTitle className="flex items-center gap-2 text-xl">
|
||||
{tier.name}
|
||||
<Badge variant="secondary">{tier.slug}</Badge>
|
||||
<Badge variant={tier.is_active ? "default" : "outline"} className="uppercase">
|
||||
<Badge
|
||||
variant={tier.is_active ? "default" : "outline"}
|
||||
className="uppercase"
|
||||
>
|
||||
{tier.is_active ? "Ativo" : "Inativo"}
|
||||
</Badge>
|
||||
</CardTitle>
|
||||
@@ -514,7 +576,10 @@ export function AdminSubscriptionDashboard({
|
||||
...prev,
|
||||
[tier.subscription_tier_id]: {
|
||||
...prev[tier.subscription_tier_id],
|
||||
level: Number.parseInt(event.target.value || "0", 10),
|
||||
level: Number.parseInt(
|
||||
event.target.value || "0",
|
||||
10,
|
||||
),
|
||||
},
|
||||
}))
|
||||
}
|
||||
@@ -530,7 +595,8 @@ export function AdminSubscriptionDashboard({
|
||||
...prev,
|
||||
[tier.subscription_tier_id]: {
|
||||
...prev[tier.subscription_tier_id],
|
||||
isActive: !prev[tier.subscription_tier_id].isActive,
|
||||
isActive:
|
||||
!prev[tier.subscription_tier_id].isActive,
|
||||
},
|
||||
}))
|
||||
}
|
||||
@@ -542,7 +608,9 @@ export function AdminSubscriptionDashboard({
|
||||
|
||||
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||
<div className="space-y-2">
|
||||
<label className="text-sm font-medium">Preço mensal</label>
|
||||
<label className="text-sm font-medium">
|
||||
Preço mensal
|
||||
</label>
|
||||
<Input
|
||||
type="number"
|
||||
min={0}
|
||||
@@ -618,7 +686,9 @@ export function AdminSubscriptionDashboard({
|
||||
<div className="flex flex-wrap items-center gap-3">
|
||||
<Button
|
||||
type="button"
|
||||
onClick={() => handleUpdateTier(tier.subscription_tier_id)}
|
||||
onClick={() =>
|
||||
handleUpdateTier(tier.subscription_tier_id)
|
||||
}
|
||||
disabled={isLoading}
|
||||
>
|
||||
Salvar alterações
|
||||
@@ -640,7 +710,9 @@ export function AdminSubscriptionDashboard({
|
||||
<Button
|
||||
type="button"
|
||||
variant="destructive"
|
||||
onClick={() => handleDeleteTier(tier.subscription_tier_id, tier.slug)}
|
||||
onClick={() =>
|
||||
handleDeleteTier(tier.subscription_tier_id, tier.slug)
|
||||
}
|
||||
disabled={isLoading}
|
||||
>
|
||||
Remover plano
|
||||
@@ -654,7 +726,7 @@ export function AdminSubscriptionDashboard({
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card>
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>Vincular plano a usuário</CardTitle>
|
||||
</CardHeader>
|
||||
@@ -698,4 +770,3 @@ export function AdminSubscriptionDashboard({
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user