Skip to content

Commit f45c011

Browse files
committed
feat: Added use-document-title.
1 parent de8123d commit f45c011

File tree

6 files changed

+88
-3
lines changed

6 files changed

+88
-3
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,14 @@ Based on the [@mantine/hooks](https://github.com/mantinedev/mantine/tree/master/
5656
- [x] ~~use-callback-ref~~ (Not needed, only used internally by mantine for preventing re-renders on a function)
5757
- [x] use-click-outside
5858
- [x] use-clipboard
59-
- [ ] use-color-scheme
59+
- [x] use-color-scheme
6060
- [x] use-counter
6161
- [x] use-debounced-callback
6262
- [x] ~~use-debounced-state~~ use-debounced-signal
6363
- [x] use-debounced-value
6464
- [x] use-did-update
6565
- [ ] use-disclosure
66-
- [ ] use-document-title
66+
- [x] use-document-title
6767
- [x] use-document-visibility
6868
- [ ] use-event-listener
6969
- [x] use-eye-dropper (✨ improved, state management is inside the hook)
@@ -85,7 +85,7 @@ Based on the [@mantine/hooks](https://github.com/mantinedev/mantine/tree/master/
8585
- [x] use-intersection (Added, but note that there is [`createIntersectionObserver`](https://primitives.solidjs.community/package/intersection-observer/) in the official solid-primitives as well)
8686
- [ ] use-interval
8787
- [x] ~~use-is-first-render~~ (Every component function in SolidJS runs only once! Every component is first render only 🙂)
88-
- [x] use-isomorphic-effect (Solid's [`createEffect`](https://docs.solidjs.com/reference/basic-reactivity/create-effect) is actually isomorphic - it works in browser and server).
88+
- [x] ~~use-isomorphic-effect~~ (Solid's [`createEffect`](https://docs.solidjs.com/reference/basic-reactivity/create-effect) is technically already isomorphic because it doesn't error on SSR. Also, it also only runs on client-side.)
8989
- [ ] use-list-state
9090
- [x] use-local-storage
9191
- [ ] use-logger
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
```tsx
2+
// ----------
3+
// Mantine Implementation
4+
// ----------
5+
6+
const [title, setTitle] = createSignal('Home');
7+
useTitle(title); // Will always run at the start.
8+
9+
return (
10+
<button onClick={() => setTitle("Home")}>Set to Home</button>
11+
<button onClick={() => setTitle("About")}>set to About</button>
12+
)
13+
14+
// ----------
15+
// Improved Bagon Implementation
16+
// ----------
17+
const [title, setTitle] = useTitle(); // Don't pass an initial accessor, choose to run when you need to.
18+
19+
20+
return (
21+
<button onClick={() => setTitle("Home")}>Set to Home</button>
22+
<button onClick={() => setTitle("About")}>Set to About</button>
23+
);
24+
25+
```
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { useDocumentTitle, useToggle } from 'src';
2+
import { ExampleBase } from '../example-base';
3+
import Code from './use-document-title.code.mdx';
4+
5+
import { Kbd } from 'dev/components/kbd';
6+
import { useMDXComponents } from 'solid-jsx';
7+
8+
export function UseDocumentTitleExample() {
9+
const [title, setTitle] = useDocumentTitle();
10+
const [_, cycle] = useToggle(['Home', 'About', 'Awesome']);
11+
12+
// @ts-ignore
13+
const components: any = useMDXComponents();
14+
15+
function _cycle() {
16+
cycle();
17+
setTitle(_() as any);
18+
}
19+
return (
20+
<ExampleBase
21+
title="useDocumentTitle"
22+
description="Sets the `document.title`. Hook is not called during server-side rendering. Only use this for client-only applications."
23+
code={<Code components={components} />}
24+
>
25+
<div class="flex h-full w-full flex-col items-center justify-center gap-x-1 rounded-md border p-3 py-10 text-center text-sm">
26+
<div class="flex items-center gap-x-2">
27+
<Kbd activated={title() === 'Home'}>Home</Kbd>
28+
<Kbd activated={title() === 'About'}>About</Kbd>
29+
<Kbd activated={title() === 'Awesome'}>Awesome</Kbd>
30+
<button onClick={_cycle}>Toggle</button>
31+
</div>
32+
</div>
33+
</ExampleBase>
34+
);
35+
}

dev/pages/index/+Page.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { UseDebouncedCallbackExample } from 'dev/components/examples/use-debounc
99
import { UseDebouncedSignalExample } from 'dev/components/examples/use-debounced-signal/use-debounced-signal.example';
1010
import { UseDebouncedValueExample } from 'dev/components/examples/use-debounced-value/use-debounced-value.example';
1111
import { UseDidUpdateExample } from 'dev/components/examples/use-did-update/use-did-update.example';
12+
import { UseDocumentTitleExample } from 'dev/components/examples/use-document-title/use-document-title.example';
1213
import { UseDocumentVisibilityExample } from 'dev/components/examples/use-document-visibility/use-document-visibility.example';
1314
import { UseElementSizeExample } from 'dev/components/examples/use-element-size/use-element-size.example';
1415
import { UseEyeDropperExample } from 'dev/components/examples/use-eye-dropper/use-eye-dropper.example';
@@ -173,6 +174,10 @@ export default function HomePage() {
173174
title: 'useColorScheme',
174175
example: <UseColorSchemeExample />,
175176
},
177+
{
178+
title: 'useDocumentTitle',
179+
example: <UseDocumentTitleExample />,
180+
},
176181
];
177182

178183
const filteredList = createMemo(() => {

src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export * from './use-debounced-callback/use-debounced-callback';
66
export * from './use-debounced-signal/use-debounced-signal';
77
export * from './use-debounced-value/use-debounced-value';
88
export * from './use-did-update/use-did-update';
9+
export * from './use-document-title/use-document-title';
910
export * from './use-document-visibility/use-document-visibility';
1011
export * from './use-eye-dropper/use-eye-dropper';
1112
export * from './use-favicon/use-favicon';
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Accessor, createEffect, createSignal } from 'solid-js';
2+
3+
/** Improvement: document.title is an optional signal. Now returns a setter if you want to set it manually. */
4+
export function useDocumentTitle(title?: Accessor<string>) {
5+
const [_title, _setTitle] = createSignal(title?.());
6+
7+
function setTitle(newTitle: string) {
8+
if (typeof newTitle === 'string' && newTitle.trim().length > 0) {
9+
document.title = newTitle.trim();
10+
_setTitle(newTitle);
11+
}
12+
}
13+
14+
createEffect(() => {
15+
if (title) setTitle(title());
16+
});
17+
18+
return [_title, setTitle] as const;
19+
}

0 commit comments

Comments
 (0)