Skip to content

Commit cc380bc

Browse files
refactor(link): colocate resolver context APIs
1 parent cd3cea7 commit cc380bc

5 files changed

Lines changed: 46 additions & 33 deletions

File tree

‎extensions/link/README.md‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ It mimics the `<Link />` component behavior provided by Gatsby or Next.js.
44

55
## Dependencies
66

7-
Provide a URL resolver with `LinkUrlResolverContext`. The resolver can come
7+
Provide a URL resolver with `LinkUrlResolverProvider`. The resolver can come
88
from `@stackflow/plugin-history-sync` or another routing plugin.
99

1010
## Usage
@@ -57,12 +57,12 @@ const { Stack } = stackflow({
5757
Wrap `Stack` with the resolver from the routing plugin.
5858

5959
```tsx
60-
import { LinkUrlResolverContext } from "@stackflow/link";
60+
import { LinkUrlResolverProvider } from "@stackflow/link";
6161

6262
const App = () => (
63-
<LinkUrlResolverContext.Provider value={historySync.urlResolver}>
63+
<LinkUrlResolverProvider resolver={historySync.urlResolver}>
6464
<Stack />
65-
</LinkUrlResolverContext.Provider>
65+
</LinkUrlResolverProvider>
6666
);
6767
```
6868

‎extensions/link/src/Link.tsx‎

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,10 @@ import type {
33
RegisteredActivityName,
44
} from "@stackflow/config";
55
import { useFlow } from "@stackflow/react";
6-
import { useContext, useMemo } from "react";
7-
import { LinkUrlResolverContext } from "./LinkUrlResolverContext";
6+
import { useMemo } from "react";
7+
import { useLinkUrlResolver } from "./LinkUrlResolverContext";
88
import { omit } from "./omit";
99

10-
function useRequiredLinkUrlResolver() {
11-
const urlResolver = useContext(LinkUrlResolverContext);
12-
13-
if (urlResolver === null) {
14-
throw new Error(
15-
"Link must be rendered inside a LinkUrlResolverContext.Provider.",
16-
);
17-
}
18-
19-
return urlResolver;
20-
}
21-
2210
type AnchorProps = Omit<
2311
React.DetailedHTMLProps<
2412
React.AnchorHTMLAttributes<HTMLAnchorElement>,
@@ -37,7 +25,7 @@ export interface LinkProps<K extends RegisteredActivityName>
3725
}
3826

3927
export function Link<K extends RegisteredActivityName>(props: LinkProps<K>) {
40-
const urlResolver = useRequiredLinkUrlResolver();
28+
const urlResolver = useLinkUrlResolver();
4129
const { push, replace } = useFlow();
4230

4331
const href = useMemo(

‎extensions/link/src/LinkUrlResolverContext.ts‎

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { createContext, type ReactNode, useContext } from "react";
2+
3+
export interface LinkUrlResolver {
4+
readonly makeActivityUrl: (
5+
activityName: string,
6+
activityParams: Record<string, any>,
7+
) => string;
8+
}
9+
10+
export const LinkUrlResolverContext = createContext<LinkUrlResolver | null>(
11+
null,
12+
);
13+
14+
export function LinkUrlResolverProvider({
15+
resolver,
16+
children,
17+
}: {
18+
resolver: LinkUrlResolver;
19+
children: ReactNode;
20+
}) {
21+
return (
22+
<LinkUrlResolverContext.Provider value={resolver}>
23+
{children}
24+
</LinkUrlResolverContext.Provider>
25+
);
26+
}
27+
28+
export function useLinkUrlResolver() {
29+
const urlResolver = useContext(LinkUrlResolverContext);
30+
31+
if (urlResolver === null) {
32+
throw new Error(
33+
"Link must be rendered inside a LinkUrlResolverContext.Provider.",
34+
);
35+
}
36+
37+
return urlResolver;
38+
}

‎extensions/link/src/index.ts‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11
export * from "./Link";
2-
export type { LinkUrlResolver } from "./LinkUrlResolverContext";
3-
export { LinkUrlResolverContext } from "./LinkUrlResolverContext";
2+
export * from "./LinkUrlResolverContext";

0 commit comments

Comments
 (0)