TIFNGK_E41222719/src/utils/datas.ts

104 lines
3.1 KiB
TypeScript

import { Frown, Meh, Smile } from "lucide-react";
import { ScrapeResult, WordCloudConfig, WordItem } from "../types";
import { Brand } from "@prisma/client";
export const getSentimentDisplay = (sentiment: string) => {
switch (sentiment?.toLowerCase()) {
case "positive":
return {
label: "Positif",
icon: Smile,
bgClass:
"bg-green-50 border-green-200 dark:bg-green-900/20 dark:border-green-800",
textClass: "text-green-600 dark:text-green-400",
borderClass: "border-green-200",
};
case "negative":
return {
label: "Negatif",
icon: Frown,
bgClass:
"bg-red-50 border-red-200 dark:bg-red-900/20 dark:border-red-800",
textClass: "text-red-600 dark:text-red-400",
borderClass: "border-red-200",
};
default:
return {
label: "Netral",
icon: Meh,
bgClass:
"bg-gray-50 border-gray-200 dark:bg-gray-800 dark:border-gray-700",
textClass: "text-gray-600 dark:text-gray-400",
borderClass: "border-gray-200",
};
}
};
export const setWordCloud = ({ maxValue, minValue }: WordCloudConfig) => {
const getSize = (value: number) => {
if (maxValue === minValue) return 1.5;
const normalized = (value - minValue) / (maxValue - minValue);
return 0.75 + normalized * 1.5;
};
const getColor = (sentiment: WordItem["sentiment"]) => {
switch (sentiment) {
case "POSITIVE":
return "text-sentiment-positive hover:bg-sentiment-positive-light";
case "NEGATIVE":
return "text-sentiment-negative hover:bg-sentiment-negative-light";
default:
return "text-sentiment-neutral hover:bg-sentiment-neutral-light";
}
};
return { getSize, getColor };
};
export function getFallbackData(url: string): ScrapeResult {
return {
name: "Produk (Data Sampel)",
url: url,
reviews: [
"Laptop ini performanya sangat kencang untuk coding backend dan docker.",
"Layar OLED-nya juara banget, warnanya tajam cocok buat desain di Illustrator.",
"Keyboard travel distance-nya pas, enak buat ngetik skripsi berjam-jam.",
"Sayang port-nya agak sedikit, butuh dongle tambahan.",
"Baterai lumayan awet bisa tahan 6-7 jam pemakaian normal office.",
"Buat main game ringan seperti Valorant masih oke, fps stabil.",
"Build quality kokoh, terasa premium walau body plastik.",
"Pengiriman cepat dan packing kayu sangat aman.",
],
};
}
export const formatRupiah = (value: number | string) => {
if (!value) return "Rp 0";
return new Intl.NumberFormat("id-ID", {
style: "currency",
currency: "IDR",
maximumFractionDigits: 0,
}).format(Number(value));
};
export const brandFormat = ({
preferenceBrand,
}: {
preferenceBrand: Brand | string;
}) => {
const brands = Array.isArray(preferenceBrand)
? preferenceBrand
: preferenceBrand
? [preferenceBrand]
: [];
return { brands };
};
export function toTitleCase(str: string) {
return str
.toLowerCase()
.split(/[\s-_]+/)
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
.join(" ");
}