Skip to content

Commit be7ed2a

Browse files
committed
Created useCookie hook
1 parent 31932ee commit be7ed2a

File tree

8 files changed

+100
-19
lines changed

8 files changed

+100
-19
lines changed

demo/src/pages/hooks/useCookie.tsx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import type { Component } from 'solid-js';
2+
import { createSignal } from 'solid-js';
3+
import { useCookie } from 'solidjs-hooks';
4+
5+
const HookPage: Component = () => {
6+
const [cookie, setCookie, removeCookie] = useCookie('my-cookie');
7+
const [count, setCount] = createSignal(0);
8+
9+
const setCookieHandler = () => {
10+
setCount((prevCount) => prevCount + 1);
11+
setCookie(`my-awesome-cookie-${count()}`);
12+
};
13+
14+
return (
15+
<div>
16+
<p>Cookie value: {cookie()}</p>
17+
<button onClick={() => setCookieHandler()}>Update Cookie</button>
18+
<button onClick={() => removeCookie()}>Delete Cookie</button>
19+
</div>
20+
);
21+
};
22+
23+
export default HookPage;

demo/src/pages/hooks/useCounter.tsx

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,18 @@
11
import type { Component } from 'solid-js';
2-
import { createSignal } from 'solid-js';
3-
import { useInterval } from 'solidjs-hooks';
2+
import { useCounter } from 'solidjs-hooks';
43

54
const HookPage: Component = () => {
6-
const DEFAULT_DELAY = 1000;
7-
const [count, setCount] = createSignal(0);
8-
const [delay, setDelay] = createSignal(DEFAULT_DELAY);
9-
10-
useInterval(() => {
11-
setCount((prevCount) => prevCount + 1);
12-
}, delay);
13-
14-
const toggleInterval = () => {
15-
// @ts-ignore
16-
setDelay((prevDelay) => (prevDelay ? null : DEFAULT_DELAY));
17-
};
5+
const { count, increment, decrement, set, reset } = useCounter();
186

197
return (
208
<div>
21-
<p>Count: {count()}</p>
22-
<div>
23-
<button onClick={() => toggleInterval()}>Toggle Interval</button>
24-
</div>
9+
<p>Current count: {count()}</p>
10+
<button onClick={() => increment()}>Increment</button>
11+
<button onClick={() => increment(5)}>Increment (+5)</button>
12+
<button onClick={() => decrement()}>Decrement</button>
13+
<button onClick={() => decrement(5)}>Decrement (-5)</button>
14+
<button onClick={() => set(100)}>Set to 100</button>
15+
<button onClick={() => reset()}>Reset</button>
2516
</div>
2617
);
2718
};

demo/src/routes.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ const routes: RouteDefinition[] = [
1414
path: '/use-boolean',
1515
component: lazy(() => import('./pages/hooks/useToggle')),
1616
},
17+
{
18+
path: '/use-cookie',
19+
component: lazy(() => import('./pages/hooks/useCookie')),
20+
},
1721
{
1822
path: '/use-counter',
1923
component: lazy(() => import('./pages/hooks/useCounter')),

packages/solidjs-hooks/README.md

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,37 @@ This is an alias of [`useToggle`](#usetoggle).
2121

2222

2323

24+
### `useCookie`
25+
26+
SolidJS hook that returns the current value of a cookie, a callback to set the cookie's value, and a callback to remove the cookie.
27+
28+
#### Usage
29+
30+
```jsx
31+
import { createSignal } from 'solid-js';
32+
import { useCookie } from 'solidjs-hooks';
33+
34+
const Demo = () => {
35+
const [cookie, setCookie, removeCookie] = useCookie('my-cookie');
36+
const [count, setCount] = createSignal(0);
37+
38+
const setCookieHandler = () => {
39+
setCount((prevCount) => prevCount + 1);
40+
setCookie(`my-awesome-cookie-${cookie()}`);
41+
}
42+
43+
return (
44+
<div>
45+
<p>Cookie value: {cookie()}</p>
46+
<button onClick={() => setCookieHandler()}>Update Cookie</button>
47+
<button onClick={() => removeCookie()}>Delete Cookie</button>
48+
</div>
49+
)
50+
}
51+
```
52+
53+
54+
2455
### `useCounter`
2556

2657
SolidJS state hook that tracks a numeric value.
@@ -44,7 +75,6 @@ const Demo = () => {
4475
<button onClick={() => decrement(5)}>Decrement (-5)</button>
4576
<button onClick={() => set(100)}>Set to 100</button>
4677
<button onClick={() => reset()}>Reset</button>
47-
<button onClick={() => reset(25)}>Reset to 25</button>
4878
</div>
4979
)
5080
}

packages/solidjs-hooks/package.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,13 @@
5252
"dist"
5353
],
5454
"devDependencies": {
55+
"@types/js-cookie": "^3.0.1",
5556
"@types/node": "^17.0.14",
5657
"pridepack": "1.0.3",
5758
"solid-js": "^1.3.5",
5859
"typescript": "^4.5.5"
60+
},
61+
"dependencies": {
62+
"js-cookie": "^3.0.1"
5963
}
6064
}

packages/solidjs-hooks/src/hooks/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export { default as useBoolean } from './useBoolean';
22
export { default as useCounter } from './useCounter';
3+
export { default as useCookie } from './useCookie';
34
export { default as useEffect } from './useEffect';
45
export { default as useInterval } from './useInterval';
56
export { default as useNumber } from './useNumber';
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import type { Accessor } from 'solid-js';
2+
import { createSignal } from 'solid-js';
3+
import Cookies from 'js-cookie';
4+
5+
function useCookie(
6+
key: string
7+
): [
8+
Accessor<string | null>,
9+
(newValue: string, options?: Cookies.CookieAttributes) => void,
10+
() => void
11+
] {
12+
const [cookie, setCookie] = createSignal(Cookies.get(key) || null);
13+
14+
const set = (newValue: string, options?: Cookies.CookieAttributes) => {
15+
Cookies.set(key, newValue, options);
16+
setCookie(newValue);
17+
};
18+
19+
const remove = () => {
20+
Cookies.remove(key);
21+
setCookie(null);
22+
};
23+
24+
return [cookie, set, remove];
25+
}
26+
27+
export default useCookie;

packages/solidjs-hooks/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"compilerOptions": {
44
"lib": ["DOM"],
55
"declaration": true,
6+
"esModuleInterop": true,
67
"jsx": "react"
78
}
89
}

0 commit comments

Comments
 (0)