@truecodeio/sdk-react 0.2.2

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/CHANGELOG.md ADDED
@@ -0,0 +1,28 @@
1
+ # @boko/sdk-react
2
+
3
+ ## 0.2.2
4
+
5
+ ### Patch Changes
6
+
7
+ - change package name
8
+ - Updated dependencies
9
+ - @truecodeio/sdk-core@0.2.2
10
+
11
+ ## 0.2.1
12
+
13
+ ### Patch Changes
14
+
15
+ - Override access property
16
+ - Updated dependencies
17
+ - @boko/sdk-core@0.2.1
18
+
19
+ ## 0.2.0
20
+
21
+ ### Minor Changes
22
+
23
+ - Init packages
24
+
25
+ ### Patch Changes
26
+
27
+ - Updated dependencies
28
+ - @boko/sdk-core@0.2.0
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@truecodeio/sdk-react",
3
+ "version": "0.2.2",
4
+ "type": "module",
5
+ "main": "src/index.tsx",
6
+ "access": "public",
7
+ "devDependencies": {
8
+ "@types/react": "^19.1.2",
9
+ "react": "^19.1.0",
10
+ "@boko/tsconfig": "^1.0.0",
11
+ "@truecodeio/sdk-core": "0.2.2"
12
+ },
13
+ "dependencies": {
14
+ "@boko/client-shared": "^1.0.0",
15
+ "@boko/server": "^1.0.0",
16
+ "@boko/common": "^1.0.0"
17
+ },
18
+ "peerDependencies": {
19
+ "react": "^19.1.0",
20
+ "@truecodeio/sdk-core": "0.2.2"
21
+ },
22
+ "scripts": {
23
+ "format:prettier:fix:all": "prettier --cache --write ./src",
24
+ "lint:eslint:fix:all": "eslint --cache --fix ./src"
25
+ }
26
+ }
package/src/index.tsx ADDED
@@ -0,0 +1,135 @@
1
+ import { createContext, use, useEffect, useState } from "react";
2
+ import type { createBokoClient, EligibleCampaign } from "@truecodeio/sdk-core";
3
+ import type { NodeT } from "@boko/client-shared/schemas/tree-nodes";
4
+ import { assertedNonNull } from "@boko/common/typescript/utils/non-nullable";
5
+
6
+ type ClientContextValue = {
7
+ client: ReturnType<typeof createBokoClient>;
8
+ };
9
+
10
+ const ClientContext = createContext<ClientContextValue | null>(null);
11
+
12
+ export const ClientProvider = ({
13
+ children,
14
+ client,
15
+ }: React.PropsWithChildren<{
16
+ client: ReturnType<typeof createBokoClient>;
17
+ }>) => {
18
+ return <ClientContext value={{ client }}>{children}</ClientContext>;
19
+ };
20
+
21
+ export const useClient = () => {
22
+ return assertedNonNull(use(ClientContext)).client;
23
+ };
24
+
25
+ export const Renderer = () => {
26
+ const [campaign, setCampaign] = useState<EligibleCampaign | null>(null);
27
+
28
+ const client = useClient();
29
+
30
+ useEffect(() => {
31
+ // TODO: Replace with tanstack query
32
+ const fetchCampaign = async () => {
33
+ try {
34
+ const response = await client.getEligibleCampaign();
35
+
36
+ setCampaign(response);
37
+ } catch (error) {
38
+ console.error("Error fetching campaign:", error);
39
+ }
40
+ };
41
+
42
+ void fetchCampaign();
43
+ }, []);
44
+
45
+ const renderCampaign = () => {
46
+ if (!campaign) {
47
+ return null;
48
+ }
49
+
50
+ const renderNode = (node: NodeT) => {
51
+ switch (node.type) {
52
+ case "root": {
53
+ return (
54
+ <div style={{ color: node.props.color }}>
55
+ {node.children.map(renderNode)}
56
+ </div>
57
+ );
58
+ }
59
+ case "row": {
60
+ return (
61
+ <div
62
+ style={{
63
+ display: "flex",
64
+ backgroundColor: node.props.background.color,
65
+ paddingLeft: node.props.padding.left,
66
+ paddingRight: node.props.padding.right,
67
+ paddingTop: node.props.padding.top,
68
+ paddingBottom: node.props.padding.bottom,
69
+ }}
70
+ key={node.id}
71
+ >
72
+ {node.children.map(renderNode)}
73
+ </div>
74
+ );
75
+ }
76
+ case "column": {
77
+ return (
78
+ <div style={{ flex: 1 }} key={node.id}>
79
+ {node.children.map(renderNode)}
80
+ </div>
81
+ );
82
+ }
83
+ case "button": {
84
+ return (
85
+ <button type="button" key={node.id}>
86
+ {node.props.title}
87
+ </button>
88
+ );
89
+ }
90
+ case "text": {
91
+ switch (node.props.type) {
92
+ case "paragraph": {
93
+ return <p key={node.id}>{node.props.content}</p>;
94
+ }
95
+ case "heading-1": {
96
+ return <h1 key={node.id}>{node.props.content}</h1>;
97
+ }
98
+ case "heading-2": {
99
+ return <h2 key={node.id}>{node.props.content}</h2>;
100
+ }
101
+ case "heading-3": {
102
+ return <h3 key={node.id}>{node.props.content}</h3>;
103
+ }
104
+ case "heading-4": {
105
+ return <h4 key={node.id}>{node.props.content}</h4>;
106
+ }
107
+ case "heading-5": {
108
+ return <h5 key={node.id}>{node.props.content}</h5>;
109
+ }
110
+ case "heading-6": {
111
+ return <h6 key={node.id}>{node.props.content}</h6>;
112
+ }
113
+
114
+ default: {
115
+ return node.props.type satisfies never;
116
+ }
117
+ }
118
+ }
119
+ case "spacer": {
120
+ return <div style={{ height: node.props.size }} key={node.id}></div>;
121
+ }
122
+
123
+ default: {
124
+ return node satisfies never;
125
+ }
126
+ }
127
+ };
128
+
129
+ return renderNode(campaign.template.content);
130
+ };
131
+
132
+ return renderCampaign();
133
+ };
134
+
135
+ export { createBokoClient } from "@truecodeio/sdk-core";
package/tsconfig.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "extends": "@boko/tsconfig",
3
+ "compilerOptions": {
4
+ "allowImportingTsExtensions": true,
5
+ "moduleResolution": "bundler",
6
+ "module": "ES2022",
7
+ "jsx": "react-jsx",
8
+ "paths": {
9
+ "@truecodeio/sdk-react/*": ["./src/*"],
10
+ "@truecodeio/sdk-core": ["../sdk-core/src"],
11
+ "@truecodeio/sdk-core/*": ["../sdk-core/src/*"],
12
+ "@boko/client-shared/*": ["../client-shared/src/*"],
13
+ "@boko/common/*": ["../common/src/*"],
14
+ "@boko/server": ["../../apps/server/src"],
15
+ "@boko/server/*": ["../../apps/server/src/*"]
16
+ }
17
+ },
18
+ "include": ["src"]
19
+ }