@ncentiva/core 0.1.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/README.md +34 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/package.json +35 -0
package/README.md
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# @ncentiva/core
|
|
2
|
+
|
|
3
|
+
Shared hooks, classes, and utilities for Ncentiva applications.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @ncentiva/core
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Token client
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { TokenClient } from "@ncentiva/core";
|
|
15
|
+
|
|
16
|
+
const tokenClient = new TokenClient();
|
|
17
|
+
tokenClient.set("access-token");
|
|
18
|
+
tokenClient.get();
|
|
19
|
+
tokenClient.hasToken();
|
|
20
|
+
tokenClient.clear();
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
`tokenClient` stores the token in the browser's `localStorage` under `access_token`.
|
|
24
|
+
|
|
25
|
+
## Hooks
|
|
26
|
+
|
|
27
|
+
```tsx
|
|
28
|
+
import { useDebounce, useMobile } from "@ncentiva/core";
|
|
29
|
+
|
|
30
|
+
const debouncedSearch = useDebounce(search, 300);
|
|
31
|
+
const isMobile = useMobile();
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
`useMobile` uses a 768px breakpoint by default. Pass a different breakpoint when needed.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare class TokenClient {
|
|
2
|
+
private accessToken;
|
|
3
|
+
private readonly storageKey;
|
|
4
|
+
set(token: string): void;
|
|
5
|
+
get(): string | null;
|
|
6
|
+
clear(): void;
|
|
7
|
+
hasToken(): boolean;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
declare function useDebounce<T>(value: T, delay?: number): T;
|
|
11
|
+
|
|
12
|
+
declare const MOBILE_BREAKPOINT = 768;
|
|
13
|
+
declare function useMobile(breakpoint?: number): boolean;
|
|
14
|
+
|
|
15
|
+
export { MOBILE_BREAKPOINT, TokenClient, useDebounce, useMobile };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { useState, useEffect } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/classes/token-client.ts
|
|
4
|
+
var TokenClient = class {
|
|
5
|
+
accessToken = null;
|
|
6
|
+
storageKey = "access_token";
|
|
7
|
+
set(token) {
|
|
8
|
+
this.accessToken = token;
|
|
9
|
+
localStorage.setItem(this.storageKey, token);
|
|
10
|
+
}
|
|
11
|
+
get() {
|
|
12
|
+
if (!this.accessToken) {
|
|
13
|
+
this.accessToken = localStorage.getItem(this.storageKey);
|
|
14
|
+
}
|
|
15
|
+
return this.accessToken;
|
|
16
|
+
}
|
|
17
|
+
clear() {
|
|
18
|
+
this.accessToken = null;
|
|
19
|
+
localStorage.removeItem(this.storageKey);
|
|
20
|
+
}
|
|
21
|
+
hasToken() {
|
|
22
|
+
return Boolean(this.get());
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
function useDebounce(value, delay = 300) {
|
|
26
|
+
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
const timeout = window.setTimeout(() => {
|
|
29
|
+
setDebouncedValue(value);
|
|
30
|
+
}, Math.max(0, delay));
|
|
31
|
+
return () => window.clearTimeout(timeout);
|
|
32
|
+
}, [delay, value]);
|
|
33
|
+
return debouncedValue;
|
|
34
|
+
}
|
|
35
|
+
var MOBILE_BREAKPOINT = 768;
|
|
36
|
+
function useMobile(breakpoint = MOBILE_BREAKPOINT) {
|
|
37
|
+
const query = `(max-width: ${Math.max(0, breakpoint - 1)}px)`;
|
|
38
|
+
const [isMobile, setIsMobile] = useState(false);
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
const mediaQuery = window.matchMedia(query);
|
|
41
|
+
setIsMobile(mediaQuery.matches);
|
|
42
|
+
}, [query]);
|
|
43
|
+
return isMobile;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export { MOBILE_BREAKPOINT, TokenClient, useDebounce, useMobile };
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
48
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/classes/token-client.ts","../src/hooks/use-debounce.ts","../src/hooks/use-mobile.ts"],"names":["useState","useEffect"],"mappings":";;;AAAO,IAAM,cAAN,MAAkB;AAAA,EACf,WAAA,GAA6B,IAAA;AAAA,EACpB,UAAA,GAAa,cAAA;AAAA,EAE9B,IAAI,KAAA,EAAqB;AACvB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,UAAA,EAAY,KAAK,CAAA;AAAA,EAC7C;AAAA,EAEA,GAAA,GAAqB;AACnB,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,WAAA,GAAc,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,IACzD;AAEA,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,YAAA,CAAa,UAAA,CAAW,KAAK,UAAU,CAAA;AAAA,EACzC;AAAA,EAEA,QAAA,GAAoB;AAClB,IAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,GAAA,EAAK,CAAA;AAAA,EAC3B;AACF;ACvBO,SAAS,WAAA,CAAe,KAAA,EAAU,KAAA,GAAQ,GAAA,EAAQ;AACvD,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAI,SAAS,KAAK,CAAA;AAE1D,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACtC,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAK,CAAC,CAAA;AAErB,IAAA,OAAO,MAAM,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA;AAAA,EAC1C,CAAA,EAAG,CAAC,KAAA,EAAO,KAAK,CAAC,CAAA;AAEjB,EAAA,OAAO,cAAA;AACT;ACZO,IAAM,iBAAA,GAAoB;AAE1B,SAAS,SAAA,CAAU,aAAa,iBAAA,EAA4B;AACjE,EAAA,MAAM,QAAQ,CAAA,YAAA,EAAe,IAAA,CAAK,IAAI,CAAA,EAAG,UAAA,GAAa,CAAC,CAAC,CAAA,GAAA,CAAA;AAExD,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,SAAS,KAAK,CAAA;AAE9C,EAAAC,UAAU,MAAM;AACd,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AAC1C,IAAA,WAAA,CAAY,WAAW,OAAO,CAAA;AAAA,EAChC,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO,QAAA;AACT","file":"index.js","sourcesContent":["export class TokenClient {\n private accessToken: string | null = null;\n private readonly storageKey = \"access_token\";\n\n set(token: string): void {\n this.accessToken = token;\n localStorage.setItem(this.storageKey, token);\n }\n\n get(): string | null {\n if (!this.accessToken) {\n this.accessToken = localStorage.getItem(this.storageKey);\n }\n\n return this.accessToken;\n }\n\n clear(): void {\n this.accessToken = null;\n localStorage.removeItem(this.storageKey);\n }\n\n hasToken(): boolean {\n return Boolean(this.get());\n }\n}\n","import { useEffect, useState } from \"react\";\n\nexport function useDebounce<T>(value: T, delay = 300): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timeout = window.setTimeout(() => {\n setDebouncedValue(value);\n }, Math.max(0, delay));\n\n return () => window.clearTimeout(timeout);\n }, [delay, value]);\n\n return debouncedValue;\n}\n","import { useEffect, useState } from \"react\";\n\nexport const MOBILE_BREAKPOINT = 768;\n\nexport function useMobile(breakpoint = MOBILE_BREAKPOINT): boolean {\n const query = `(max-width: ${Math.max(0, breakpoint - 1)}px)`;\n\n const [isMobile, setIsMobile] = useState(false);\n\n useEffect(() => {\n const mediaQuery = window.matchMedia(query);\n setIsMobile(mediaQuery.matches);\n }, [query]);\n\n return isMobile;\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@ncentiva/core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Shared hooks, classes, and utilities for Ncentiva applications.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"README.md"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"import": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
},
|
|
21
|
+
"peerDependencies": {
|
|
22
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@types/react": "^19.1.13",
|
|
26
|
+
"react": "^19.1.1",
|
|
27
|
+
"tsup": "^8.5.1",
|
|
28
|
+
"typescript": "~5.8.3"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsup",
|
|
32
|
+
"prepublishOnly": "npm run build",
|
|
33
|
+
"typecheck": "tsc --noEmit"
|
|
34
|
+
}
|
|
35
|
+
}
|