@greatapps/common 1.1.473 → 1.1.475
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/account/sections/MyProfileSection.mjs +1 -2
- package/dist/components/account/sections/MyProfileSection.mjs.map +1 -1
- package/dist/components/embeds/CrispEmbed.mjs +24 -60
- package/dist/components/embeds/CrispEmbed.mjs.map +1 -1
- package/dist/components/embeds/FrillEmbed.mjs +3 -10
- package/dist/components/embeds/FrillEmbed.mjs.map +1 -1
- package/dist/components/layouts/ProfilePopover.mjs +1 -2
- package/dist/components/layouts/ProfilePopover.mjs.map +1 -1
- package/dist/components/modals/cards/AddCardModal.mjs +6 -10
- package/dist/components/modals/cards/AddCardModal.mjs.map +1 -1
- package/dist/components/modals/cards/CardFormFields.mjs +15 -47
- package/dist/components/modals/cards/CardFormFields.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/BottomLinks.mjs +2 -2
- package/dist/components/navigation/subcomponents/BottomLinks.mjs.map +1 -1
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs +1 -1
- package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
- package/dist/components/pages/notifications/Notifications.mjs +17 -27
- package/dist/components/pages/notifications/Notifications.mjs.map +1 -1
- package/dist/components/ui/form/Select.mjs +1 -1
- package/dist/components/ui/form/Select.mjs.map +1 -1
- package/dist/components/ui/overlay/Dialog.mjs +1 -2
- package/dist/components/ui/overlay/Dialog.mjs.map +1 -1
- package/dist/components/ui/overlay/Popover.mjs +1 -1
- package/dist/components/ui/overlay/Popover.mjs.map +1 -1
- package/dist/components/ui/overlay/Sheet.mjs +6 -8
- package/dist/components/ui/overlay/Sheet.mjs.map +1 -1
- package/dist/components/ui/overlay/Tooltip.mjs +1 -1
- package/dist/components/ui/overlay/Tooltip.mjs.map +1 -1
- package/dist/index.mjs +2 -50
- package/dist/index.mjs.map +1 -1
- package/dist/infra/utils/date.mjs +0 -11
- package/dist/infra/utils/date.mjs.map +1 -1
- package/dist/modules/auth/services/auth.service.mjs +1 -2
- package/dist/modules/auth/services/auth.service.mjs.map +1 -1
- package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs +2 -21
- package/dist/modules/plans/hooks/use-plan-by-id.hook.mjs.map +1 -1
- package/dist/modules/plans/services/plans.service.mjs +10 -71
- package/dist/modules/plans/services/plans.service.mjs.map +1 -1
- package/dist/modules/plans/types/plan.type.mjs +0 -1
- package/dist/modules/plans/types/plan.type.mjs.map +1 -1
- package/dist/modules/subscriptions/types/subscription.type.mjs +1 -31
- package/dist/modules/subscriptions/types/subscription.type.mjs.map +1 -1
- package/dist/server.mjs +0 -6
- package/dist/server.mjs.map +1 -1
- package/package.json +1 -1
- package/src/components/navigation/ProjectSelectorPopover.tsx +1 -1
- package/src/components/ui/overlay/Sheet.tsx +9 -13
- package/dist/components/embeds/EmbedWidgets.mjs +0 -45
- package/dist/components/embeds/EmbedWidgets.mjs.map +0 -1
- package/dist/components/widgets/ImageUpload/ImageCropModal.mjs +0 -212
- package/dist/components/widgets/ImageUpload/ImageCropModal.mjs.map +0 -1
- package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs +0 -51
- package/dist/components/widgets/ImageUpload/ImageTooSmallModal.mjs.map +0 -1
- package/dist/components/widgets/ImageUpload/ImageUpload.mjs +0 -122
- package/dist/components/widgets/ImageUpload/ImageUpload.mjs.map +0 -1
- package/dist/components/widgets/ImageUpload/index.mjs +0 -9
- package/dist/components/widgets/ImageUpload/index.mjs.map +0 -1
- package/dist/modules/images/actions/process-image.action.mjs +0 -31
- package/dist/modules/images/actions/process-image.action.mjs.map +0 -1
- package/dist/modules/images/constants/image.constants.mjs +0 -14
- package/dist/modules/images/constants/image.constants.mjs.map +0 -1
- package/dist/modules/images/hooks/use-image-upload.hook.mjs +0 -132
- package/dist/modules/images/hooks/use-image-upload.hook.mjs.map +0 -1
- package/dist/modules/images/services/image-processing.service.mjs +0 -65
- package/dist/modules/images/services/image-processing.service.mjs.map +0 -1
- package/dist/modules/images/types/image.type.mjs +0 -1
- package/dist/modules/images/types/image.type.mjs.map +0 -1
- package/dist/modules/images/utils/base64.mjs +0 -24
- package/dist/modules/images/utils/base64.mjs.map +0 -1
- package/dist/modules/images/utils/compress-image.mjs +0 -17
- package/dist/modules/images/utils/compress-image.mjs.map +0 -1
- package/dist/modules/images/utils/crop-image.mjs +0 -31
- package/dist/modules/images/utils/crop-image.mjs.map +0 -1
- package/dist/modules/images/utils/validate-image.mjs +0 -58
- package/dist/modules/images/utils/validate-image.mjs.map +0 -1
- package/dist/modules/plans/actions/list-plans.action.mjs +0 -17
- package/dist/modules/plans/actions/list-plans.action.mjs.map +0 -1
- package/dist/modules/plans/hooks/list-plans.hook.mjs +0 -22
- package/dist/modules/plans/hooks/list-plans.hook.mjs.map +0 -1
- package/dist/modules/plans/utils/map-api-plan-to-ui.mjs +0 -58
- package/dist/modules/plans/utils/map-api-plan-to-ui.mjs.map +0 -1
- package/dist/utils/format/currency.mjs +0 -13
- package/dist/utils/format/currency.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/images/utils/validate-image.ts"],"sourcesContent":["import {\n ACCEPTED_IMAGE_FORMATS,\n MAX_FILE_SIZE_MB,\n} from '../constants/image.constants'\n\nexport interface ImageValidationResult {\n valid: boolean\n error?: string\n}\n\nexport function validateImageFormat(file: File): ImageValidationResult {\n // Bloqueia SVG explicitamente (segurança + não funciona com crop)\n if (file.type === 'image/svg+xml' || file.name.toLowerCase().endsWith('.svg')) {\n return {\n valid: false,\n error: 'Formato SVG não é suportado. Use PNG, JPEG, WebP ou GIF.',\n }\n }\n\n if (\n !ACCEPTED_IMAGE_FORMATS.includes(\n file.type as (typeof ACCEPTED_IMAGE_FORMATS)[number]\n )\n ) {\n return {\n valid: false,\n error: 'Formato não suportado. Use PNG, JPEG, WebP ou GIF.',\n }\n }\n return { valid: true }\n}\n\nexport function validateImageSize(\n file: File,\n maxSizeMB: number = MAX_FILE_SIZE_MB\n): ImageValidationResult {\n if (file.size > maxSizeMB * 1024 * 1024) {\n return {\n valid: false,\n error: `Arquivo muito grande. Máximo ${maxSizeMB}MB.`,\n }\n }\n return { valid: true }\n}\n\nexport function validateImage(file: File): ImageValidationResult {\n const formatValidation = validateImageFormat(file)\n if (!formatValidation.valid) return formatValidation\n\n const sizeValidation = validateImageSize(file)\n if (!sizeValidation.valid) return sizeValidation\n\n return { valid: true }\n}\n\nexport async function getImageDimensions(\n file: File\n): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image()\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight })\n URL.revokeObjectURL(img.src)\n }\n img.onerror = () => {\n reject(new Error('Falha ao carregar imagem'))\n URL.revokeObjectURL(img.src)\n }\n img.src = URL.createObjectURL(file)\n })\n}\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAOA,SAAS,oBAAoB,MAAmC;AAErE,MAAI,KAAK,SAAS,mBAAmB,KAAK,KAAK,YAAY,EAAE,SAAS,MAAM,GAAG;AAC7E,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,MACE,CAAC,uBAAuB;AAAA,IACtB,KAAK;AAAA,EACP,GACA;AACA,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEO,SAAS,kBACd,MACA,YAAoB,kBACG;AACvB,MAAI,KAAK,OAAO,YAAY,OAAO,MAAM;AACvC,WAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO,mCAAgC,SAAS;AAAA,IAClD;AAAA,EACF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAEO,SAAS,cAAc,MAAmC;AAC/D,QAAM,mBAAmB,oBAAoB,IAAI;AACjD,MAAI,CAAC,iBAAiB,MAAO,QAAO;AAEpC,QAAM,iBAAiB,kBAAkB,IAAI;AAC7C,MAAI,CAAC,eAAe,MAAO,QAAO;AAElC,SAAO,EAAE,OAAO,KAAK;AACvB;AAEA,eAAsB,mBACpB,MAC4C;AAC5C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,MAAM,IAAI,MAAM;AACtB,QAAI,SAAS,MAAM;AACjB,cAAQ,EAAE,OAAO,IAAI,cAAc,QAAQ,IAAI,cAAc,CAAC;AAC9D,UAAI,gBAAgB,IAAI,GAAG;AAAA,IAC7B;AACA,QAAI,UAAU,MAAM;AAClB,aAAO,IAAI,MAAM,0BAA0B,CAAC;AAC5C,UAAI,gBAAgB,IAAI,GAAG;AAAA,IAC7B;AACA,QAAI,MAAM,IAAI,gBAAgB,IAAI;AAAA,EACpC,CAAC;AACH;","names":[]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { plansService, safeServerAction } from "@greatapps/common/server";
|
|
3
|
-
async function listPlansAction() {
|
|
4
|
-
return safeServerAction(async () => {
|
|
5
|
-
const { data: apiPlans } = await plansService.listPlans({
|
|
6
|
-
active: true,
|
|
7
|
-
search: "client",
|
|
8
|
-
sort: "id:ASC"
|
|
9
|
-
});
|
|
10
|
-
if (!apiPlans?.length) return [];
|
|
11
|
-
return [...apiPlans].sort((a, b) => a.value - b.value);
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
export {
|
|
15
|
-
listPlansAction
|
|
16
|
-
};
|
|
17
|
-
//# sourceMappingURL=list-plans.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/plans/actions/list-plans.action.ts"],"sourcesContent":["'use server';\n\nimport { plansService, safeServerAction } from '@greatapps/common/server';\n\nexport async function listPlansAction() {\n return safeServerAction(async () => {\n const { data: apiPlans } = await plansService.listPlans({\n active: true,\n search: 'client',\n sort: 'id:ASC',\n });\n\n if (!apiPlans?.length) return [];\n\n return [...apiPlans].sort((a, b) => a.value - b.value);\n });\n}\n"],"mappings":";AAEA,SAAS,cAAc,wBAAwB;AAE/C,eAAsB,kBAAkB;AACtC,SAAO,iBAAiB,YAAY;AAClC,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,aAAa,UAAU;AAAA,MACtD,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAED,QAAI,CAAC,UAAU,OAAQ,QAAO,CAAC;AAE/B,WAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,EACvD,CAAC;AACH;","names":[]}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import { useQuery } from "@tanstack/react-query";
|
|
3
|
-
import { withAction } from "@greatapps/common";
|
|
4
|
-
import { listPlansAction } from "../actions/list-plans.action";
|
|
5
|
-
const PLANS_QUERY_KEY = ["plans"];
|
|
6
|
-
function usePlans() {
|
|
7
|
-
return useQuery({
|
|
8
|
-
queryKey: [...PLANS_QUERY_KEY],
|
|
9
|
-
queryFn: withAction(listPlansAction),
|
|
10
|
-
staleTime: Infinity,
|
|
11
|
-
gcTime: Infinity,
|
|
12
|
-
refetchOnWindowFocus: false,
|
|
13
|
-
refetchOnReconnect: false,
|
|
14
|
-
refetchOnMount: false,
|
|
15
|
-
retry: 1
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
export {
|
|
19
|
-
PLANS_QUERY_KEY,
|
|
20
|
-
usePlans
|
|
21
|
-
};
|
|
22
|
-
//# sourceMappingURL=list-plans.hook.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/plans/hooks/list-plans.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery } from '@tanstack/react-query';\nimport { withAction } from '@greatapps/common';\nimport { listPlansAction } from '../actions/list-plans.action';\nimport type { Plan } from '../types/plan.type';\n\nexport const PLANS_QUERY_KEY = ['plans'];\n\nexport function usePlans() {\n return useQuery<Plan[]>({\n queryKey: [...PLANS_QUERY_KEY],\n queryFn: withAction(listPlansAction),\n staleTime: Infinity,\n gcTime: Infinity,\n refetchOnWindowFocus: false,\n refetchOnReconnect: false,\n refetchOnMount: false,\n retry: 1,\n });\n}\n"],"mappings":";AAEA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAGzB,MAAM,kBAAkB,CAAC,OAAO;AAEhC,SAAS,WAAW;AACzB,SAAO,SAAiB;AAAA,IACtB,UAAU,CAAC,GAAG,eAAe;AAAA,IAC7B,SAAS,WAAW,eAAe;AAAA,IACnC,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,OAAO;AAAA,EACT,CAAC;AACH;","names":[]}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { ADDON_IDS } from "../../subscriptions/constants/addons.constants";
|
|
2
|
-
import { formatCurrencyNumber } from "../../../utils/format/currency";
|
|
3
|
-
const BASE_FEATURES = [
|
|
4
|
-
{ icon: "check", text: "Visitas ilimitadas" },
|
|
5
|
-
{ icon: "check", text: "Leads ilimitadas" },
|
|
6
|
-
{ icon: "check", text: "Compartilhar p\xE1ginas", tooltip: "sharePages" },
|
|
7
|
-
{ icon: "check", text: "Hospedagem inclusa" },
|
|
8
|
-
{ icon: "check", text: "SSL (HTTPS) + CDN" },
|
|
9
|
-
{ icon: "check", text: "Templates Free" }
|
|
10
|
-
];
|
|
11
|
-
function buildMainFeaturesFromItems(items) {
|
|
12
|
-
const pagesItem = items.find((i) => i.id_addon === ADDON_IDS.PAGES);
|
|
13
|
-
const domainsItem = items.find((i) => i.id_addon === ADDON_IDS.DOMAINS);
|
|
14
|
-
const pagesQty = pagesItem?.quantity ?? 0;
|
|
15
|
-
const domainsQty = domainsItem?.quantity ?? 1;
|
|
16
|
-
return {
|
|
17
|
-
pages: pagesQty === 0 ? "P\xE1ginas ilimitadas" : pagesQty === 1 ? "1 p\xE1gina" : `${pagesQty} p\xE1ginas`,
|
|
18
|
-
domains: domainsQty >= 999 ? "Dom\xEDnios ilimitados" : domainsQty === 1 ? "1 dom\xEDnio externo" : `${domainsQty} dom\xEDnios externos`,
|
|
19
|
-
users: "Usu\xE1rios ilimitados"
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function computePricingByPeriod(apiPlan) {
|
|
23
|
-
const monthly = apiPlan.value;
|
|
24
|
-
const round2 = (n) => Math.round(n * 100) / 100;
|
|
25
|
-
return {
|
|
26
|
-
monthly,
|
|
27
|
-
semiannual: round2(monthly * (1 - apiPlan.discount_semester / 100)),
|
|
28
|
-
annual: round2(monthly * (1 - apiPlan.discount_annual / 100))
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
function mapApiPlanToUiPlan(apiPlan, options) {
|
|
32
|
-
const { planId, isPopular, buttonVariant } = options;
|
|
33
|
-
const pricingByPeriod = computePricingByPeriod(apiPlan);
|
|
34
|
-
const monthlyFinal = pricingByPeriod.monthly;
|
|
35
|
-
const lowerName = apiPlan.name.toLowerCase();
|
|
36
|
-
const hasProjectAndOnboarding = lowerName.includes("ag\xEAncia") || lowerName.includes("agencia");
|
|
37
|
-
const features = [
|
|
38
|
-
...BASE_FEATURES,
|
|
39
|
-
hasProjectAndOnboarding ? { icon: "check", text: "Reuni\xE3o de Onboarding" } : { icon: "x", text: "Reuni\xE3o de Onboarding", disabled: true },
|
|
40
|
-
hasProjectAndOnboarding ? { icon: "check", text: "Gest\xE3o de projetos", tooltip: "projectManagement" } : { icon: "x", text: "Gest\xE3o de projetos", disabled: true, tooltip: "projectManagement" }
|
|
41
|
-
];
|
|
42
|
-
return {
|
|
43
|
-
idPlan: planId,
|
|
44
|
-
name: apiPlan.name,
|
|
45
|
-
isPopular,
|
|
46
|
-
buttonVariant,
|
|
47
|
-
mainFeatures: buildMainFeaturesFromItems(apiPlan.items),
|
|
48
|
-
features,
|
|
49
|
-
originalPrice: formatCurrencyNumber(monthlyFinal),
|
|
50
|
-
price: formatCurrencyNumber(monthlyFinal),
|
|
51
|
-
pricingByPeriod,
|
|
52
|
-
items: apiPlan.items
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
export {
|
|
56
|
-
mapApiPlanToUiPlan
|
|
57
|
-
};
|
|
58
|
-
//# sourceMappingURL=map-api-plan-to-ui.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/plans/utils/map-api-plan-to-ui.ts"],"sourcesContent":["import type { Plan, PlanFeature, PlanMainFeatures, PlanPricingByPeriod, UiPlan } from '../types/plan.type';\nimport { ADDON_IDS } from '../../subscriptions/constants/addons.constants';\nimport { formatCurrencyNumber } from '../../../utils/format/currency';\n\nexport type PlanBillingPeriod = 'monthly' | 'semiannual' | 'annual';\n\nconst BASE_FEATURES: PlanFeature[] = [\n { icon: 'check', text: 'Visitas ilimitadas' },\n { icon: 'check', text: 'Leads ilimitadas' },\n { icon: 'check', text: 'Compartilhar páginas', tooltip: 'sharePages' },\n { icon: 'check', text: 'Hospedagem inclusa' },\n { icon: 'check', text: 'SSL (HTTPS) + CDN' },\n { icon: 'check', text: 'Templates Free' },\n];\n\nfunction buildMainFeaturesFromItems(items: Plan['items']): PlanMainFeatures {\n const pagesItem = items.find((i) => i.id_addon === ADDON_IDS.PAGES);\n const domainsItem = items.find((i) => i.id_addon === ADDON_IDS.DOMAINS);\n\n const pagesQty = pagesItem?.quantity ?? 0;\n const domainsQty = domainsItem?.quantity ?? 1;\n\n return {\n pages:\n pagesQty === 0\n ? 'Páginas ilimitadas'\n : pagesQty === 1\n ? '1 página'\n : `${pagesQty} páginas`,\n domains:\n domainsQty >= 999\n ? 'Domínios ilimitados'\n : domainsQty === 1\n ? '1 domínio externo'\n : `${domainsQty} domínios externos`,\n users: 'Usuários ilimitados',\n };\n}\n\nfunction computePricingByPeriod(apiPlan: Plan): PlanPricingByPeriod {\n const monthly = apiPlan.value;\n const round2 = (n: number) => Math.round(n * 100) / 100;\n return {\n monthly,\n semiannual: round2(monthly * (1 - apiPlan.discount_semester / 100)),\n annual: round2(monthly * (1 - apiPlan.discount_annual / 100)),\n };\n}\n\nexport function mapApiPlanToUiPlan(\n apiPlan: Plan,\n options: {\n planId: number;\n isPopular?: boolean;\n buttonVariant?: 'brand' | 'default';\n }\n): UiPlan {\n const { planId, isPopular, buttonVariant } = options;\n\n const pricingByPeriod = computePricingByPeriod(apiPlan);\n const monthlyFinal = pricingByPeriod.monthly;\n\n const lowerName = apiPlan.name.toLowerCase();\n const hasProjectAndOnboarding =\n lowerName.includes('agência') || lowerName.includes('agencia');\n\n const features: PlanFeature[] = [\n ...BASE_FEATURES,\n hasProjectAndOnboarding\n ? { icon: 'check', text: 'Reunião de Onboarding' }\n : { icon: 'x', text: 'Reunião de Onboarding', disabled: true },\n hasProjectAndOnboarding\n ? { icon: 'check', text: 'Gestão de projetos', tooltip: 'projectManagement' }\n : { icon: 'x', text: 'Gestão de projetos', disabled: true, tooltip: 'projectManagement' },\n ];\n\n return {\n idPlan: planId,\n name: apiPlan.name,\n isPopular,\n buttonVariant,\n mainFeatures: buildMainFeaturesFromItems(apiPlan.items),\n features,\n originalPrice: formatCurrencyNumber(monthlyFinal),\n price: formatCurrencyNumber(monthlyFinal),\n pricingByPeriod,\n items: apiPlan.items,\n };\n}\n"],"mappings":"AACA,SAAS,iBAAiB;AAC1B,SAAS,4BAA4B;AAIrC,MAAM,gBAA+B;AAAA,EACnC,EAAE,MAAM,SAAS,MAAM,qBAAqB;AAAA,EAC5C,EAAE,MAAM,SAAS,MAAM,mBAAmB;AAAA,EAC1C,EAAE,MAAM,SAAS,MAAM,2BAAwB,SAAS,aAAa;AAAA,EACrE,EAAE,MAAM,SAAS,MAAM,qBAAqB;AAAA,EAC5C,EAAE,MAAM,SAAS,MAAM,oBAAoB;AAAA,EAC3C,EAAE,MAAM,SAAS,MAAM,iBAAiB;AAC1C;AAEA,SAAS,2BAA2B,OAAwC;AAC1E,QAAM,YAAY,MAAM,KAAK,CAAC,MAAM,EAAE,aAAa,UAAU,KAAK;AAClE,QAAM,cAAc,MAAM,KAAK,CAAC,MAAM,EAAE,aAAa,UAAU,OAAO;AAEtE,QAAM,WAAW,WAAW,YAAY;AACxC,QAAM,aAAa,aAAa,YAAY;AAE5C,SAAO;AAAA,IACL,OACE,aAAa,IACT,0BACA,aAAa,IACX,gBACA,GAAG,QAAQ;AAAA,IACnB,SACE,cAAc,MACV,2BACA,eAAe,IACb,yBACA,GAAG,UAAU;AAAA,IACrB,OAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,SAAoC;AAClE,QAAM,UAAU,QAAQ;AACxB,QAAM,SAAS,CAAC,MAAc,KAAK,MAAM,IAAI,GAAG,IAAI;AACpD,SAAO;AAAA,IACL;AAAA,IACA,YAAY,OAAO,WAAW,IAAI,QAAQ,oBAAoB,IAAI;AAAA,IAClE,QAAQ,OAAO,WAAW,IAAI,QAAQ,kBAAkB,IAAI;AAAA,EAC9D;AACF;AAEO,SAAS,mBACd,SACA,SAKQ;AACR,QAAM,EAAE,QAAQ,WAAW,cAAc,IAAI;AAE7C,QAAM,kBAAkB,uBAAuB,OAAO;AACtD,QAAM,eAAe,gBAAgB;AAErC,QAAM,YAAY,QAAQ,KAAK,YAAY;AAC3C,QAAM,0BACJ,UAAU,SAAS,YAAS,KAAK,UAAU,SAAS,SAAS;AAE/D,QAAM,WAA0B;AAAA,IAC9B,GAAG;AAAA,IACH,0BACI,EAAE,MAAM,SAAS,MAAM,2BAAwB,IAC/C,EAAE,MAAM,KAAK,MAAM,4BAAyB,UAAU,KAAK;AAAA,IAC/D,0BACI,EAAE,MAAM,SAAS,MAAM,yBAAsB,SAAS,oBAAoB,IAC1E,EAAE,MAAM,KAAK,MAAM,yBAAsB,UAAU,MAAM,SAAS,oBAAoB;AAAA,EAC5F;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR,MAAM,QAAQ;AAAA,IACd;AAAA,IACA;AAAA,IACA,cAAc,2BAA2B,QAAQ,KAAK;AAAA,IACtD;AAAA,IACA,eAAe,qBAAqB,YAAY;AAAA,IAChD,OAAO,qBAAqB,YAAY;AAAA,IACxC;AAAA,IACA,OAAO,QAAQ;AAAA,EACjB;AACF;","names":[]}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
const formatCurrencyNumber = (value, decimals = 2) => {
|
|
2
|
-
const safeValue = value ?? 0;
|
|
3
|
-
return safeValue.toLocaleString("pt-BR", {
|
|
4
|
-
style: "currency",
|
|
5
|
-
currency: "BRL",
|
|
6
|
-
minimumFractionDigits: decimals,
|
|
7
|
-
maximumFractionDigits: decimals
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
export {
|
|
11
|
-
formatCurrencyNumber
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=currency.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/utils/format/currency.ts"],"sourcesContent":["/**\n * Formata um número (opcional) para moeda BRL\n * @param value - Número a ser formatado (pode ser undefined ou null)\n * @param decimals - Casas decimais (padrão: 2)\n * @returns String formatada como \"R$ X.XXX,XX\"\n */\nexport const formatCurrencyNumber = (value?: number | null, decimals = 2): string => {\n const safeValue = value ?? 0;\n return safeValue.toLocaleString('pt-BR', {\n style: 'currency',\n currency: 'BRL',\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n};\n"],"mappings":"AAMO,MAAM,uBAAuB,CAAC,OAAuB,WAAW,MAAc;AACnF,QAAM,YAAY,SAAS;AAC3B,SAAO,UAAU,eAAe,SAAS;AAAA,IACvC,OAAO;AAAA,IACP,UAAU;AAAA,IACV,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,EACzB,CAAC;AACH;","names":[]}
|