@taskon/widget-react 0.0.1 → 0.0.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.
Files changed (66) hide show
  1. package/README.md +118 -64
  2. package/dist/CommunityTaskList.css +2694 -2951
  3. package/dist/EligibilityInfo.css +2221 -1332
  4. package/dist/LeaderboardWidget.css +403 -198
  5. package/dist/PageBuilder.css +57 -0
  6. package/dist/Quest.css +1347 -1477
  7. package/dist/TaskOnProvider.css +337 -29
  8. package/dist/ThemeProvider.css +228 -0
  9. package/dist/UserCenterWidget.css +168 -0
  10. package/dist/UserCenterWidget2.css +4917 -0
  11. package/dist/WidgetShell.css +417 -130
  12. package/dist/chunks/{CommunityTaskList-CrH6r4Av.js → CommunityTaskList-2nFy6l6m.js} +2612 -2074
  13. package/dist/chunks/{EligibilityInfo-DesW9-k9.js → EligibilityInfo-CKTl_cdU.js} +2714 -4077
  14. package/dist/chunks/{LeaderboardWidget-BSGpHKTk.js → LeaderboardWidget-DyoiiNS6.js} +288 -349
  15. package/dist/chunks/PageBuilder-DHM3Il6f.js +150 -0
  16. package/dist/chunks/{Quest-uSIVq78I.js → Quest-Dqx4OCat.js} +1380 -726
  17. package/dist/chunks/TaskOnProvider-CxtFIs3n.js +2072 -0
  18. package/dist/chunks/{WidgetShell-NlOgn1x5.js → ThemeProvider-CulHkqqY.js} +1397 -103
  19. package/dist/chunks/UserCenterWidget-SE5hqpnZ.js +8335 -0
  20. package/dist/chunks/UserCenterWidget-XL6LZRZM.js +3259 -0
  21. package/dist/chunks/{Table-CWGf2FKV.js → WidgetShell-8xn-Jivw.js} +237 -27
  22. package/dist/chunks/communitytask-es-CBNnS4o2.js +521 -0
  23. package/dist/chunks/communitytask-ja-GRf9cbdx.js +521 -0
  24. package/dist/chunks/communitytask-ko-Bf24PQKI.js +521 -0
  25. package/dist/chunks/communitytask-ru-CZm2CPoV.js +521 -0
  26. package/dist/chunks/leaderboardwidget-es-vKjrjQaz.js +146 -0
  27. package/dist/chunks/leaderboardwidget-ja-Q6u0HxKG.js +146 -0
  28. package/dist/chunks/leaderboardwidget-ko-CG6SWgxf.js +146 -0
  29. package/dist/chunks/leaderboardwidget-ru-DCcHcJGz.js +146 -0
  30. package/dist/chunks/quest-es-Dyyy0zaw.js +863 -0
  31. package/dist/chunks/quest-ja-Depog33y.js +863 -0
  32. package/dist/chunks/quest-ko-BMu3uRQJ.js +863 -0
  33. package/dist/chunks/quest-ru-xne814Rw.js +863 -0
  34. package/dist/chunks/taskwidget-es-Do9b3Mqw.js +245 -0
  35. package/dist/chunks/taskwidget-ja-CqSu-yWA.js +245 -0
  36. package/dist/chunks/taskwidget-ko-EHgXFV4B.js +245 -0
  37. package/dist/chunks/taskwidget-ru-CMbLQDK4.js +245 -0
  38. package/dist/chunks/useIsMobile-D6Ybur-6.js +30 -0
  39. package/dist/chunks/usercenter-es-Dz3Wp2vV.js +512 -0
  40. package/dist/chunks/usercenter-ja-CKE4DJC6.js +512 -0
  41. package/dist/chunks/usercenter-ko-Dtpkn2qb.js +512 -0
  42. package/dist/chunks/usercenter-ru-DnBGee45.js +512 -0
  43. package/dist/community-task.d.ts +29 -388
  44. package/dist/community-task.js +2 -7
  45. package/dist/core.d.ts +95 -28
  46. package/dist/core.js +11 -12
  47. package/dist/index.d.ts +260 -602
  48. package/dist/index.js +28 -7361
  49. package/dist/leaderboard.d.ts +5 -496
  50. package/dist/leaderboard.js +2 -15
  51. package/dist/page-builder.d.ts +20 -0
  52. package/dist/page-builder.js +4 -0
  53. package/dist/quest.d.ts +20 -292
  54. package/dist/quest.js +2 -5
  55. package/dist/user-center.d.ts +56 -0
  56. package/dist/user-center.js +4 -0
  57. package/package.json +22 -3
  58. package/dist/Table.css +0 -389
  59. package/dist/chunks/TaskOnProvider-QMwxGL44.js +0 -1435
  60. package/dist/chunks/ThemeProvider-Cs8IUVQj.js +0 -1118
  61. package/dist/chunks/leaderboardwidget-ja-Bj6gz6y1.js +0 -119
  62. package/dist/chunks/leaderboardwidget-ko-f1cLO9ic.js +0 -119
  63. package/dist/chunks/useWidgetLocale-BVcopbZS.js +0 -74
  64. package/dist/chunks/usercenter-ja-DBj_dtuz.js +0 -329
  65. package/dist/chunks/usercenter-ko-DYTkHAld.js +0 -329
  66. package/dist/index.css +0 -3662
@@ -0,0 +1,150 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect, useMemo, useRef } from "react";
3
+ import { DEFAULT_PAGE_BUILDER_CONFIG, createPageBuilderApi, parsePageBuilderConfig, SectionLayoutType, WidgetTypeEnum, SECTION_LAYOUT_RATIOS } from "@taskon/core";
4
+ import { Q as QuestWidget } from "./Quest-Dqx4OCat.js";
5
+ import { C as CommunityTaskList } from "./CommunityTaskList-2nFy6l6m.js";
6
+ import { L as LeaderboardWidget } from "./LeaderboardWidget-DyoiiNS6.js";
7
+ import { U as UserCenterWidget } from "./UserCenterWidget-XL6LZRZM.js";
8
+ import { h as useTaskOnContext } from "./ThemeProvider-CulHkqqY.js";
9
+ import '../PageBuilder.css';function usePageBuilderConfig(pageId, localConfig) {
10
+ const { client } = useTaskOnContext();
11
+ const [config, setConfig] = useState(
12
+ localConfig ?? null
13
+ );
14
+ const [pageInfo, setPageInfo] = useState(null);
15
+ const [isLoading, setIsLoading] = useState(false);
16
+ const [error, setError] = useState(null);
17
+ useEffect(() => {
18
+ if (localConfig) {
19
+ setConfig(localConfig ?? { ...DEFAULT_PAGE_BUILDER_CONFIG });
20
+ setPageInfo(null);
21
+ setIsLoading(false);
22
+ setError(null);
23
+ return;
24
+ }
25
+ if (!pageId || !client) {
26
+ setConfig(null);
27
+ setPageInfo(null);
28
+ setIsLoading(false);
29
+ setError(null);
30
+ return;
31
+ }
32
+ let cancelled = false;
33
+ setIsLoading(true);
34
+ setError(null);
35
+ const api = createPageBuilderApi(client);
36
+ api.getPageBuilder(pageId).then((info) => {
37
+ if (!cancelled) {
38
+ setPageInfo(info);
39
+ setConfig(parsePageBuilderConfig(info.config_json));
40
+ }
41
+ }).catch((err) => {
42
+ if (!cancelled) {
43
+ console.warn("[TaskOn] Failed to load page builder config:", err);
44
+ setError(
45
+ err instanceof Error ? err.message : "Failed to load page builder config"
46
+ );
47
+ }
48
+ }).finally(() => {
49
+ if (!cancelled) {
50
+ setIsLoading(false);
51
+ }
52
+ });
53
+ return () => {
54
+ cancelled = true;
55
+ };
56
+ }, [pageId, client, localConfig]);
57
+ return { config, pageInfo, isLoading, error };
58
+ }
59
+ const ROOT_CLASS = "taskon-page-builder";
60
+ function normalizeConfig(config) {
61
+ if (!config || !Array.isArray(config.sections)) return null;
62
+ return {
63
+ version: typeof config.version === "number" ? config.version : 1,
64
+ sections: Array.isArray(config.sections) ? config.sections : []
65
+ };
66
+ }
67
+ function getSlotFlex(section, index) {
68
+ const ratios = SECTION_LAYOUT_RATIOS[section.layout] ?? [1];
69
+ return ratios[index] ?? 1;
70
+ }
71
+ function renderWidget(slot) {
72
+ if (!slot.widgetId || !slot.widgetType) return null;
73
+ switch (slot.widgetType) {
74
+ case WidgetTypeEnum.Quest:
75
+ return /* @__PURE__ */ jsx(QuestWidget, { widgetId: slot.widgetId });
76
+ case WidgetTypeEnum.Tasks:
77
+ return /* @__PURE__ */ jsx(CommunityTaskList, { widgetId: slot.widgetId });
78
+ case WidgetTypeEnum.Leaderboard:
79
+ return /* @__PURE__ */ jsx(LeaderboardWidget, { widgetId: slot.widgetId });
80
+ case WidgetTypeEnum.UserCenter:
81
+ return /* @__PURE__ */ jsx(UserCenterWidget, { widgetId: slot.widgetId });
82
+ default:
83
+ console.warn("[TaskOn] Unknown widgetType in PageBuilder:", slot.widgetType);
84
+ return null;
85
+ }
86
+ }
87
+ function PageBuilder(props) {
88
+ const { pageId, config: localConfig, className, style } = props;
89
+ const { config, isLoading, error } = usePageBuilderConfig(
90
+ pageId,
91
+ localConfig
92
+ );
93
+ const resolvedConfig = useMemo(
94
+ () => normalizeConfig(config ?? localConfig),
95
+ [config, localConfig]
96
+ );
97
+ const errorMessage = error ?? (!resolvedConfig && !pageId && !localConfig ? "Page ID or config is required." : null);
98
+ const hasTrackedRef = useRef(false);
99
+ useEffect(() => {
100
+ if (hasTrackedRef.current) return;
101
+ if (!resolvedConfig) return;
102
+ hasTrackedRef.current = true;
103
+ }, [resolvedConfig]);
104
+ if (errorMessage) {
105
+ return /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS} ${className ?? ""}`, style, children: /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS}-error`, children: errorMessage }) });
106
+ }
107
+ if (isLoading) {
108
+ return /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS} ${className ?? ""}`, style, children: /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS}-loading`, children: "Loading page..." }) });
109
+ }
110
+ if (!resolvedConfig) {
111
+ return /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS} ${className ?? ""}`, style });
112
+ }
113
+ return /* @__PURE__ */ jsx("div", { className: `${ROOT_CLASS} ${className ?? ""}`, style, children: resolvedConfig.sections.map((section) => {
114
+ const isTwoColumn = section.layout !== SectionLayoutType.SingleColumn;
115
+ const sectionClass = [
116
+ `${ROOT_CLASS}-section`,
117
+ section.mobileStackOrder === "right-first" && isTwoColumn ? `${ROOT_CLASS}-section--stack-right-first` : ""
118
+ ].filter(Boolean).join(" ");
119
+ return /* @__PURE__ */ jsx(
120
+ "div",
121
+ {
122
+ className: sectionClass,
123
+ "data-layout": section.layout,
124
+ children: section.slots.map((slot, index) => {
125
+ const widgetNode = renderWidget(slot);
126
+ const isEmpty = !widgetNode;
127
+ return /* @__PURE__ */ jsx(
128
+ "div",
129
+ {
130
+ className: `${ROOT_CLASS}-slot ${isEmpty ? `${ROOT_CLASS}-slot--empty` : ""}`,
131
+ style: { flex: getSlotFlex(section, index) },
132
+ children: widgetNode ?? /* @__PURE__ */ jsx(
133
+ "div",
134
+ {
135
+ className: `${ROOT_CLASS}-slot-placeholder`,
136
+ "aria-hidden": "true"
137
+ }
138
+ )
139
+ },
140
+ slot.id
141
+ );
142
+ })
143
+ },
144
+ section.id
145
+ );
146
+ }) });
147
+ }
148
+ export {
149
+ PageBuilder as P
150
+ };