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
|
@@ -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
|
+
}
|