rl-core-front 0.17.0 → 0.18.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rl-core-front",
3
- "version": "0.17.0",
3
+ "version": "0.18.0",
4
4
  "description": "Telas e componentes Next.js do core: login com 2FA, usuários, RBAC, auditoria, logs e listagens com filtro dinâmico",
5
5
  "author": "Rodrigo Liberti",
6
6
  "license": "MIT",
@@ -0,0 +1,36 @@
1
+ "use client";
2
+
3
+ import type { JSX, ReactNode } from "react";
4
+
5
+ import { useAuth } from "#core/contexts/auth-context";
6
+
7
+ export interface CanProps {
8
+ /** Uma chave, ou todas as da lista. */
9
+ permission?: string | string[];
10
+ /** Pelo menos uma destas. Combinado com `permission`, as duas condições valem. */
11
+ any?: string[];
12
+ /** O que aparece no lugar quando não pode. Ausente, nada. */
13
+ fallback?: ReactNode;
14
+ children: ReactNode;
15
+ }
16
+
17
+ /**
18
+ * Mostra os filhos só para quem tem a permissão.
19
+ *
20
+ * É o `hasPermission` do `useAuth` em forma de bloco: um interruptor que
21
+ * lança noutro módulo, um botão que só entrega 403 para quem não tem a chave.
22
+ * Esconder é cortesia — quem proíbe de verdade é o backend, e a chave aqui
23
+ * precisa ser a mesma que a rota exige, senão o bloco some para quem podia ou
24
+ * aparece para quem não pode.
25
+ *
26
+ * Sem chave nenhuma, mostra: é como a rota sem decorator.
27
+ */
28
+ export function Can({ permission, any, fallback = null, children }: CanProps): JSX.Element {
29
+ const { hasAllPermissions, hasAnyPermission } = useAuth();
30
+ const all = permission === undefined ? [] : [permission].flat();
31
+ const allowed =
32
+ (all.length === 0 || hasAllPermissions(...all)) &&
33
+ (!any || any.length === 0 || hasAnyPermission(...any));
34
+
35
+ return <>{allowed ? children : fallback}</>;
36
+ }
@@ -3,6 +3,7 @@ export * from "./alert";
3
3
  export * from "./avatar";
4
4
  export * from "./badge";
5
5
  export * from "./button";
6
+ export * from "./can";
6
7
  export * from "./card";
7
8
  export * from "./checkbox";
8
9
  export * from "./column-visibility-modal";