@taskon/widget-react 0.0.1-beta.5 → 0.0.1-beta.6

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 (58) hide show
  1. package/README.md +13 -4
  2. package/dist/CommunityTaskList.css +9 -1
  3. package/dist/EligibilityInfo.css +46 -42
  4. package/dist/LeaderboardWidget.css +73 -71
  5. package/dist/PageBuilder.css +5 -0
  6. package/dist/Quest.css +18 -14
  7. package/dist/TaskOnProvider.css +2 -0
  8. package/dist/UserCenterWidget.css +6 -6
  9. package/dist/UserCenterWidget2.css +1626 -1601
  10. package/dist/{dynamic-import-helper.css → WidgetShell.css} +2 -2
  11. package/dist/chunks/{CommunityTaskList-CrMvOB8w.js → CommunityTaskList-Hde2OKHH.js} +360 -154
  12. package/dist/chunks/{EligibilityInfo-Beww12QX.js → EligibilityInfo-BV0Z2TgY.js} +533 -561
  13. package/dist/chunks/{LeaderboardWidget-DwuSpVl0.js → LeaderboardWidget-BNGRD5Bu.js} +270 -249
  14. package/dist/chunks/{PageBuilder-DsX6Tv0N.js → PageBuilder-C5DSHiW9.js} +5 -5
  15. package/dist/chunks/{Quest-CuD2LElS.js → Quest-DG9zfXJo.js} +72 -50
  16. package/dist/chunks/{TaskOnProvider-xUeP2Nro.js → TaskOnProvider-BhamHIyY.js} +34 -17
  17. package/dist/chunks/{ThemeProvider-Bt4UZ33y.js → ThemeProvider-mXLdLSkq.js} +81 -18
  18. package/dist/chunks/{UserCenterWidget-CvU6K4AC.js → UserCenterWidget-D5ttw4hO.js} +1328 -1337
  19. package/dist/chunks/{UserCenterWidget-CB0hnj-L.js → UserCenterWidget-jDO5zTN1.js} +298 -231
  20. package/dist/chunks/{dynamic-import-helper-WmIF58Sb.js → WidgetShell-D7yC894Y.js} +447 -457
  21. package/dist/chunks/communitytask-es-CBNnS4o2.js +521 -0
  22. package/dist/chunks/communitytask-ja-GRf9cbdx.js +521 -0
  23. package/dist/chunks/communitytask-ko-Bf24PQKI.js +521 -0
  24. package/dist/chunks/{communitytask-ru-DhySaZL8.js → communitytask-ru-CZm2CPoV.js} +211 -1
  25. package/dist/chunks/leaderboardwidget-es-vKjrjQaz.js +146 -0
  26. package/dist/chunks/leaderboardwidget-ja-Q6u0HxKG.js +146 -0
  27. package/dist/chunks/leaderboardwidget-ko-CG6SWgxf.js +146 -0
  28. package/dist/chunks/leaderboardwidget-ru-DCcHcJGz.js +146 -0
  29. package/dist/chunks/{quest-es-D-b5xcme.js → quest-es-Dyyy0zaw.js} +8 -93
  30. package/dist/chunks/{quest-ja-Dxd2vqBF.js → quest-ja-Depog33y.js} +8 -93
  31. package/dist/chunks/{quest-ko-CSmRWgK_.js → quest-ko-BMu3uRQJ.js} +8 -93
  32. package/dist/chunks/{quest-ru-CkEKv1_F.js → quest-ru-xne814Rw.js} +8 -93
  33. package/dist/chunks/usercenter-es-Dz3Wp2vV.js +512 -0
  34. package/dist/chunks/usercenter-ja-CKE4DJC6.js +512 -0
  35. package/dist/chunks/usercenter-ko-Dtpkn2qb.js +512 -0
  36. package/dist/chunks/usercenter-ru-DnBGee45.js +512 -0
  37. package/dist/community-task.d.ts +0 -390
  38. package/dist/community-task.js +2 -7
  39. package/dist/core.d.ts +29 -5
  40. package/dist/core.js +8 -9
  41. package/dist/index.d.ts +29 -701
  42. package/dist/index.js +18 -29
  43. package/dist/leaderboard.d.ts +0 -498
  44. package/dist/leaderboard.js +2 -16
  45. package/dist/page-builder.js +1 -1
  46. package/dist/quest.d.ts +0 -971
  47. package/dist/quest.js +2 -7
  48. package/dist/user-center.d.ts +0 -1610
  49. package/dist/user-center.js +2 -494
  50. package/package.json +2 -2
  51. package/dist/chunks/communitytask-es-1zawvXEX.js +0 -311
  52. package/dist/chunks/communitytask-ja-CmW6nP-L.js +0 -311
  53. package/dist/chunks/communitytask-ko-BD0hzQSi.js +0 -311
  54. package/dist/chunks/createLocaleLoader-BameiEhU.js +0 -65
  55. package/dist/chunks/leaderboardwidget-ja-Bj6gz6y1.js +0 -119
  56. package/dist/chunks/leaderboardwidget-ko-f1cLO9ic.js +0 -119
  57. package/dist/chunks/usercenter-ja-B2465c1O.js +0 -326
  58. package/dist/chunks/usercenter-ko-xAEYxqLg.js +0 -326
@@ -1,11 +1,11 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { useState, useEffect, useMemo, useRef } from "react";
3
3
  import { DEFAULT_PAGE_BUILDER_CONFIG, createPageBuilderApi, parsePageBuilderConfig, SectionLayoutType, WidgetTypeEnum, SECTION_LAYOUT_RATIOS } from "@taskon/core";
4
- import { Q as QuestWidget } from "./Quest-CuD2LElS.js";
5
- import { a as CommunityTaskList } from "./CommunityTaskList-CrMvOB8w.js";
6
- import { L as LeaderboardWidget } from "./LeaderboardWidget-DwuSpVl0.js";
7
- import { U as UserCenterWidget } from "./UserCenterWidget-CB0hnj-L.js";
8
- import { d as useTaskOnContext } from "./ThemeProvider-Bt4UZ33y.js";
4
+ import { Q as QuestWidget } from "./Quest-DG9zfXJo.js";
5
+ import { C as CommunityTaskList } from "./CommunityTaskList-Hde2OKHH.js";
6
+ import { L as LeaderboardWidget } from "./LeaderboardWidget-BNGRD5Bu.js";
7
+ import { U as UserCenterWidget } from "./UserCenterWidget-jDO5zTN1.js";
8
+ import { h as useTaskOnContext } from "./ThemeProvider-mXLdLSkq.js";
9
9
  import '../PageBuilder.css';function usePageBuilderConfig(pageId, localConfig) {
10
10
  const { client } = useTaskOnContext();
11
11
  const [config, setConfig] = useState(
@@ -1,11 +1,11 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import React__default, { useState, useMemo, useCallback, useEffect, useRef } from "react";
3
3
  import { RewardType, UserEligibleStatus, EligibilityTemplateId, SnsType, ChainType, QuestAutomaticallyWinnerDrawType, QuestWinnerDrawType, QuestWinnerRangeType, createQuestApi, QuestRewardsDistributeType, QuestRewardType, createLeaderboardApi, MediaType, RewardDistributedByType, ApiError, ErrorCode, CampaignType } from "@taskon/core";
4
- import { t as useTaskOnPortalContainer, d as useTaskOnContext } from "./ThemeProvider-Bt4UZ33y.js";
5
- import { f as useTaskWidgetLocale, d as TaskItem, u as useQuestLocale, I as I18nT, g as EligibilityList, h as getDefaultExportFromCjs, s as sanitizeHtml, R as RewardModuleDialog, C as ConfirmNoticeDialog, a as useBindWallet, c as useNftClaimFlow, E as EligibilityInfo, B as BlindBoxDialog } from "./EligibilityInfo-Beww12QX.js";
6
- import { D as Dialog, B as Button, T as Table, P as Pagination, a as useResolvedWidgetConfig, W as WidgetShell } from "./dynamic-import-helper-WmIF58Sb.js";
4
+ import { x as useTaskOnPortalContainer, h as useTaskOnContext } from "./ThemeProvider-mXLdLSkq.js";
5
+ import { d as useTaskWidgetLocale, b as TaskItem, e as useQuestLocale, I as I18nT, f as EligibilityList, g as getDefaultExportFromCjs, s as sanitizeHtml, R as RewardModuleDialog, h as ConfirmNoticeDialog, u as useBindWallet, a as useNftClaimFlow, E as EligibilityInfo, B as BlindBoxDialog } from "./EligibilityInfo-BV0Z2TgY.js";
6
+ import { D as Dialog, B as Button, T as Table, P as Pagination, u as useResolvedWidgetConfig, W as WidgetShell } from "./WidgetShell-D7yC894Y.js";
7
7
  import { d as useToast } from "./useToast-CaRkylKe.js";
8
- import { R as Root2, o as Trigger, p as Portal, q as Content2, v as InfoIcon, r as Arrow2, s as TipPopover, g as useBindSocialAccount } from "./UserCenterWidget-CvU6K4AC.js";
8
+ import { R as Root2, i as Trigger, j as Portal, C as Content2, r as InfoIcon, k as Arrow2, q as TipPopover, a as useBindSocialAccount } from "./UserCenterWidget-D5ttw4hO.js";
9
9
  import '../Quest.css';function ButtonTabs({
10
10
  items,
11
11
  activeKey,
@@ -143,6 +143,7 @@ function GreenCheckIcon() {
143
143
  function CompletedCount({
144
144
  current,
145
145
  total,
146
+ completedLabel = "Completed",
146
147
  className
147
148
  }) {
148
149
  const isAllCompleted = current >= total && total > 0;
@@ -153,7 +154,8 @@ function CompletedCount({
153
154
  /* @__PURE__ */ jsx("span", { className: current > 0 ? "taskon-completed-count-em" : "", children: current }),
154
155
  "/",
155
156
  total,
156
- ") Completed"
157
+ ") ",
158
+ completedLabel
157
159
  ] })
158
160
  ] });
159
161
  }
@@ -225,7 +227,8 @@ function TaskList({
225
227
  CompletedCount,
226
228
  {
227
229
  current: completionStatus.mandatoryCompleted,
228
- total: completionStatus.mandatoryTotal
230
+ total: completionStatus.mandatoryTotal,
231
+ completedLabel: t("completed")
229
232
  }
230
233
  )
231
234
  ] }),
@@ -281,7 +284,8 @@ function TaskList({
281
284
  CompletedCount,
282
285
  {
283
286
  current: completionStatus.optionalCompleted,
284
- total: completionStatus.optionalTotal
287
+ total: completionStatus.optionalTotal,
288
+ completedLabel: t("completed")
285
289
  }
286
290
  )
287
291
  ] }),
@@ -804,7 +808,14 @@ function useQuestDetail(options) {
804
808
  }
805
809
  function useQuestUserStatus(options) {
806
810
  const { t } = useQuestLocale();
807
- const { api, campaignId, channel, kolHandle, enabled = true } = options;
811
+ const {
812
+ api,
813
+ campaignId,
814
+ channel,
815
+ kolHandle,
816
+ enabled = true,
817
+ authToken
818
+ } = options;
808
819
  const [data, setData] = useState(null);
809
820
  const [isLoading, setIsLoading] = useState(false);
810
821
  const [error, setError] = useState(null);
@@ -830,7 +841,7 @@ function useQuestUserStatus(options) {
830
841
  } finally {
831
842
  setIsLoading(false);
832
843
  }
833
- }, [enabled, api, campaignId, channel, kolHandle, t]);
844
+ }, [enabled, api, campaignId, channel, kolHandle, authToken, t]);
834
845
  const updateTaskStatus = useCallback(
835
846
  (taskId, isAsync = false) => {
836
847
  setData((prev) => {
@@ -7507,7 +7518,7 @@ function CompleteButton({
7507
7518
  if (!client) return null;
7508
7519
  return createQuestApi(client);
7509
7520
  }, [client]);
7510
- const buttonText = hasPointProportionally2 ? t("complete_qualify_rewards") : t("complete_2");
7521
+ const buttonText = hasPointProportionally2 ? t("complete_qualify_rewards") : t("complete");
7511
7522
  const handleComplete = useCallback(async () => {
7512
7523
  if (!api || isLoading || disabled) {
7513
7524
  return;
@@ -7650,7 +7661,7 @@ function OperateFooter(props) {
7650
7661
  {
7651
7662
  className: "taskon-quest-footer-connect-btn",
7652
7663
  onClick: onConnectWallet,
7653
- children: t("connect_wallet_participate")
7664
+ children: t("start_to_earn")
7654
7665
  }
7655
7666
  ) });
7656
7667
  const handleCompleteError = useCallback(
@@ -8194,7 +8205,7 @@ function ArrowUpRightIcon() {
8194
8205
  }
8195
8206
  function formatDateShort(timestamp) {
8196
8207
  const date = new Date(timestamp);
8197
- return new Intl.DateTimeFormat(void 0, {
8208
+ return new Intl.DateTimeFormat("en-US", {
8198
8209
  month: "short",
8199
8210
  day: "2-digit"
8200
8211
  }).format(date);
@@ -8241,9 +8252,9 @@ function WinnersStatus({
8241
8252
  if (discordLink) return discordLink;
8242
8253
  return void 0;
8243
8254
  }, [discordLink]);
8244
- const handleWinnersVisibleChange = (visible) => {
8255
+ const handleWinnersVisibleChange = useCallback((visible) => {
8245
8256
  setHasWinners(visible);
8246
- };
8257
+ }, []);
8247
8258
  return /* @__PURE__ */ jsxs("div", { className: `taskon-winners ${className}`, children: [
8248
8259
  isWaitingReviewPow && (powReviewLink ? /* @__PURE__ */ jsxs(
8249
8260
  "a",
@@ -8501,7 +8512,15 @@ function QuestWidgetInner(props) {
8501
8512
  rewardDisplayMode,
8502
8513
  rewardRedirectUrl
8503
8514
  } = props;
8504
- const { client, chains, isLoggedIn, userInfo, requestLogin, communityInfo } = useTaskOnContext();
8515
+ const {
8516
+ client,
8517
+ chains,
8518
+ isLoggedIn,
8519
+ userInfo,
8520
+ userToken,
8521
+ requestLogin,
8522
+ communityInfo
8523
+ } = useTaskOnContext();
8505
8524
  const { toast } = useToast();
8506
8525
  const questNftClaimMessages = useMemo(
8507
8526
  () => createQuestNftClaimMessages(t),
@@ -8553,7 +8572,8 @@ function QuestWidgetInner(props) {
8553
8572
  campaignId,
8554
8573
  channel,
8555
8574
  kolHandle,
8556
- enabled: !isPreview
8575
+ enabled: !isPreview,
8576
+ authToken: userToken
8557
8577
  });
8558
8578
  const {
8559
8579
  data: questStatus,
@@ -8655,6 +8675,17 @@ function QuestWidgetInner(props) {
8655
8675
  const [blindBoxEmptyReward, setBlindBoxEmptyReward] = useState();
8656
8676
  const [blindBoxTokenPrice, setBlindBoxTokenPrice] = useState();
8657
8677
  const [isClaimingBlindBox, setIsClaimingBlindBox] = useState(false);
8678
+ const [hasCompletedBlindBoxClaim, setHasCompletedBlindBoxClaim] = useState(false);
8679
+ const closeBlindBoxModal = useCallback(() => {
8680
+ setBlindBoxDialogVisible(false);
8681
+ setBlindBoxRewardVisible(false);
8682
+ }, []);
8683
+ const handleBlindBoxDialogOpenChange = useCallback((open) => {
8684
+ setBlindBoxDialogVisible(open);
8685
+ if (!open) {
8686
+ setBlindBoxRewardVisible(false);
8687
+ }
8688
+ }, []);
8658
8689
  const buildBlindBoxRewardValue = useCallback(
8659
8690
  (amount) => {
8660
8691
  if (!blindBoxTokenReward) {
@@ -8689,8 +8720,8 @@ function QuestWidgetInner(props) {
8689
8720
  [blindBoxTokenReward]
8690
8721
  );
8691
8722
  const handleOpenBlindBox = useCallback(() => {
8692
- setBlindBoxRewardVisible(false);
8693
8723
  setBlindBoxDialogVisible(true);
8724
+ setBlindBoxRewardVisible(false);
8694
8725
  }, []);
8695
8726
  const handleBlindBoxOpened = useCallback(async () => {
8696
8727
  var _a2;
@@ -8713,7 +8744,7 @@ function QuestWidgetInner(props) {
8713
8744
  }
8714
8745
  refetchUserStatus();
8715
8746
  refetchStatus();
8716
- setBlindBoxDialogVisible(false);
8747
+ setHasCompletedBlindBoxClaim(true);
8717
8748
  setBlindBoxRewardVisible(true);
8718
8749
  } catch (error2) {
8719
8750
  console.error("Claim blind box error:", error2);
@@ -8734,15 +8765,19 @@ function QuestWidgetInner(props) {
8734
8765
  toast
8735
8766
  ]);
8736
8767
  useEffect(() => {
8737
- if (userBlindBoxStatus === "wait-claim" && !isBlindBoxDialogVisible && !isBlindBoxRewardVisible) {
8768
+ if (userBlindBoxStatus === "wait-claim" && !isBlindBoxDialogVisible && !isBlindBoxRewardVisible && !hasCompletedBlindBoxClaim) {
8738
8769
  handleOpenBlindBox();
8739
8770
  }
8740
8771
  }, [
8741
8772
  userBlindBoxStatus,
8742
8773
  isBlindBoxDialogVisible,
8743
8774
  isBlindBoxRewardVisible,
8775
+ hasCompletedBlindBoxClaim,
8744
8776
  handleOpenBlindBox
8745
8777
  ]);
8778
+ useEffect(() => {
8779
+ setHasCompletedBlindBoxClaim(false);
8780
+ }, [campaignId]);
8746
8781
  const isLoading = isDetailLoading || isUserStatusLoading || isStatusLoading;
8747
8782
  const error = detailError || userStatusError || statusError;
8748
8783
  useEffect(() => {
@@ -8965,7 +9000,8 @@ function QuestWidgetInner(props) {
8965
9000
  {
8966
9001
  className: "taskon-quest-tasks-progress",
8967
9002
  current: mandatoryCompleted + optionalCompleted,
8968
- total: mandatoryTotal + optionalTotal
9003
+ total: mandatoryTotal + optionalTotal,
9004
+ completedLabel: t("completed")
8969
9005
  }
8970
9006
  ),
8971
9007
  /* @__PURE__ */ jsx(
@@ -9086,38 +9122,27 @@ function QuestWidgetInner(props) {
9086
9122
  Dialog,
9087
9123
  {
9088
9124
  open: isBlindBoxDialogVisible,
9089
- onOpenChange: setBlindBoxDialogVisible,
9090
- title: t("open_blind_box"),
9091
- showCloseButton: false,
9092
- closeOnOverlayClick: false,
9093
- closeOnEscapeKey: false,
9094
- contentClassName: "taskon-quest-blindbox-dialog-wrapper",
9095
- children: /* @__PURE__ */ jsx(
9096
- BlindBoxDialog,
9097
- {
9098
- ref: blindBoxDialogRef,
9099
- onClose: () => setBlindBoxDialogVisible(false),
9100
- onOpened: handleBlindBoxOpened
9101
- }
9102
- )
9103
- }
9104
- ),
9105
- /* @__PURE__ */ jsx(
9106
- Dialog,
9107
- {
9108
- open: isBlindBoxRewardVisible,
9109
- onOpenChange: setBlindBoxRewardVisible,
9110
- title: t("blind_box_reward"),
9111
- showCloseButton: true,
9112
- contentClassName: "taskon-quest-blindbox-reward-wrapper",
9113
- children: /* @__PURE__ */ jsx(
9125
+ onOpenChange: handleBlindBoxDialogOpenChange,
9126
+ title: isBlindBoxRewardVisible ? t("blind_box_reward") : t("open_blind_box"),
9127
+ showCloseButton: isBlindBoxRewardVisible,
9128
+ closeOnOverlayClick: isBlindBoxRewardVisible,
9129
+ closeOnEscapeKey: isBlindBoxRewardVisible,
9130
+ contentClassName: `taskon-quest-blindbox-dialog-wrapper${isBlindBoxRewardVisible ? " taskon-quest-blindbox-dialog-wrapper--result" : ""}`,
9131
+ children: isBlindBoxRewardVisible ? /* @__PURE__ */ jsx(
9114
9132
  BlindBoxRewardDialog,
9115
9133
  {
9116
9134
  rewards: blindBoxWinnerRewards,
9117
9135
  emptyReward: blindBoxEmptyReward,
9118
9136
  tokenPrice: blindBoxTokenPrice,
9119
9137
  loading: isClaimingBlindBox,
9120
- onClose: () => setBlindBoxRewardVisible(false)
9138
+ onClose: closeBlindBoxModal
9139
+ }
9140
+ ) : /* @__PURE__ */ jsx(
9141
+ BlindBoxDialog,
9142
+ {
9143
+ ref: blindBoxDialogRef,
9144
+ onClose: closeBlindBoxModal,
9145
+ onOpened: handleBlindBoxOpened
9121
9146
  }
9122
9147
  )
9123
9148
  }
@@ -9211,8 +9236,5 @@ function QuestWidgetInner(props) {
9211
9236
  ] });
9212
9237
  }
9213
9238
  export {
9214
- QuestWidget as Q,
9215
- useQuestUserStatus as a,
9216
- useQuestStatus as b,
9217
- useQuestDetail as u
9239
+ QuestWidget as Q
9218
9240
  };
@@ -1,5 +1,4 @@
1
- import { p as preloadWidgetLocale, b as useWidgetLocale, e as createContextScope, f as useComposedRefs, g as createSlot, P as Primitive, B as Branch, h as useControllableState, j as Presence, k as composeEventHandlers, l as useCallbackRef, R as Root, m as Portal, n as dispatchDiscreteCustomEvent, o as useLayoutEffect2, q as TaskOnContext } from "./ThemeProvider-Bt4UZ33y.js";
2
- import { c as createLocaleLoader } from "./createLocaleLoader-BameiEhU.js";
1
+ import { p as preloadWidgetLocale, b as useWidgetLocale, e as createLocaleLoader, j as createContextScope, k as useComposedRefs, l as createSlot, P as Primitive, B as Branch, m as useControllableState, n as Presence, o as composeEventHandlers, q as useCallbackRef, R as Root, r as Portal, s as useLayoutEffect2, t as dispatchDiscreteCustomEvent, v as TaskOnContext } from "./ThemeProvider-mXLdLSkq.js";
3
2
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
4
3
  import * as React from "react";
5
4
  import React__default, { useState, useRef, useEffect, useMemo, useCallback } from "react";
@@ -47,6 +46,7 @@ function useClientInit({
47
46
  const [client, setClient] = useState(null);
48
47
  const userApiRef = useRef(null);
49
48
  const [isInitializing, setIsInitializing] = useState(true);
49
+ const [isSessionReady, setIsSessionReady] = useState(false);
50
50
  const isInitializedRef = useRef(false);
51
51
  const configRef = useRef({ apiKey, baseURL });
52
52
  configRef.current = { apiKey, baseURL };
@@ -77,14 +77,17 @@ function useClientInit({
77
77
  userApiRef.current = userApi;
78
78
  const storedToken = getStoredToken();
79
79
  if (storedToken) {
80
+ taskOnClient.setUserToken(storedToken);
81
+ setIsSessionReady(true);
80
82
  try {
81
- taskOnClient.setUserToken(storedToken);
82
83
  const info = await userApi.getInfo();
83
84
  setUserInfo2(info);
84
85
  setUserToken2(storedToken);
85
86
  } catch {
86
87
  taskOnClient.setUserToken(null);
87
88
  }
89
+ } else {
90
+ setIsSessionReady(true);
88
91
  }
89
92
  } finally {
90
93
  setIsInitializing(false);
@@ -95,36 +98,37 @@ function useClientInit({
95
98
  return {
96
99
  client,
97
100
  userApiRef,
101
+ isSessionReady,
98
102
  isInitializing
99
103
  };
100
104
  }
101
105
  const registry = /* @__PURE__ */ new Map();
102
106
  const builtInLocaleImports = {
103
107
  CommunityTask: {
104
- ko: () => import("./communitytask-ko-BD0hzQSi.js").then((module) => ({
108
+ ko: () => import("./communitytask-ko-Bf24PQKI.js").then((module) => ({
105
109
  default: module.default
106
110
  })),
107
- ja: () => import("./communitytask-ja-CmW6nP-L.js").then((module) => ({
111
+ ja: () => import("./communitytask-ja-GRf9cbdx.js").then((module) => ({
108
112
  default: module.default
109
113
  })),
110
- ru: () => import("./communitytask-ru-DhySaZL8.js").then((module) => ({
114
+ ru: () => import("./communitytask-ru-CZm2CPoV.js").then((module) => ({
111
115
  default: module.default
112
116
  })),
113
- es: () => import("./communitytask-es-1zawvXEX.js").then((module) => ({
117
+ es: () => import("./communitytask-es-CBNnS4o2.js").then((module) => ({
114
118
  default: module.default
115
119
  }))
116
120
  },
117
121
  Quest: {
118
- ko: () => import("./quest-ko-CSmRWgK_.js").then((module) => ({
122
+ ko: () => import("./quest-ko-BMu3uRQJ.js").then((module) => ({
119
123
  default: module.default
120
124
  })),
121
- ja: () => import("./quest-ja-Dxd2vqBF.js").then((module) => ({
125
+ ja: () => import("./quest-ja-Depog33y.js").then((module) => ({
122
126
  default: module.default
123
127
  })),
124
- ru: () => import("./quest-ru-CkEKv1_F.js").then((module) => ({
128
+ ru: () => import("./quest-ru-xne814Rw.js").then((module) => ({
125
129
  default: module.default
126
130
  })),
127
- es: () => import("./quest-es-D-b5xcme.js").then((module) => ({
131
+ es: () => import("./quest-es-Dyyy0zaw.js").then((module) => ({
128
132
  default: module.default
129
133
  }))
130
134
  },
@@ -143,18 +147,30 @@ const builtInLocaleImports = {
143
147
  }))
144
148
  },
145
149
  LeaderboardWidget: {
146
- ko: () => import("./leaderboardwidget-ko-f1cLO9ic.js").then((module) => ({
150
+ ko: () => import("./leaderboardwidget-ko-CG6SWgxf.js").then((module) => ({
151
+ default: module.default
152
+ })),
153
+ ja: () => import("./leaderboardwidget-ja-Q6u0HxKG.js").then((module) => ({
154
+ default: module.default
155
+ })),
156
+ ru: () => import("./leaderboardwidget-ru-DCcHcJGz.js").then((module) => ({
147
157
  default: module.default
148
158
  })),
149
- ja: () => import("./leaderboardwidget-ja-Bj6gz6y1.js").then((module) => ({
159
+ es: () => import("./leaderboardwidget-es-vKjrjQaz.js").then((module) => ({
150
160
  default: module.default
151
161
  }))
152
162
  },
153
163
  UserCenterWidget: {
154
- ko: () => import("./usercenter-ko-xAEYxqLg.js").then((module) => ({
164
+ ko: () => import("./usercenter-ko-Dtpkn2qb.js").then((module) => ({
165
+ default: module.default
166
+ })),
167
+ ja: () => import("./usercenter-ja-CKE4DJC6.js").then((module) => ({
168
+ default: module.default
169
+ })),
170
+ ru: () => import("./usercenter-ru-DnBGee45.js").then((module) => ({
155
171
  default: module.default
156
172
  })),
157
- ja: () => import("./usercenter-ja-B2465c1O.js").then((module) => ({
173
+ es: () => import("./usercenter-es-Dz3Wp2vV.js").then((module) => ({
158
174
  default: module.default
159
175
  }))
160
176
  }
@@ -1158,7 +1174,7 @@ function TaskOnProvider({
1158
1174
  configLocale: config.locale,
1159
1175
  preloadLocales
1160
1176
  });
1161
- const { client, userApiRef, isInitializing } = useClientInit({
1177
+ const { client, userApiRef, isInitializing, isSessionReady } = useClientInit({
1162
1178
  apiKey: config.apiKey,
1163
1179
  baseURL: config.baseURL,
1164
1180
  setUserInfo,
@@ -1212,6 +1228,7 @@ function TaskOnProvider({
1212
1228
  config,
1213
1229
  client,
1214
1230
  isInitializing,
1231
+ isSessionReady,
1215
1232
  locale,
1216
1233
  userId: (userInfo == null ? void 0 : userInfo.id) ?? null,
1217
1234
  userInfo,
@@ -1224,7 +1241,7 @@ function TaskOnProvider({
1224
1241
  chains,
1225
1242
  communityInfo
1226
1243
  }),
1227
- [config, client, isInitializing, locale, userInfo, userToken, login, logout, requestLogin, refreshUserInfo, chains, communityInfo]
1244
+ [config, client, isInitializing, isSessionReady, locale, userInfo, userToken, login, logout, requestLogin, refreshUserInfo, chains, communityInfo]
1228
1245
  );
1229
1246
  return /* @__PURE__ */ jsx(TaskOnContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx(ToastContext.Provider, { value: toastState, children: /* @__PURE__ */ jsxs(ToastProvider, { children: [
1230
1247
  /* @__PURE__ */ jsx(WalletProvider, { config: config.walletConfig, children }),
@@ -38,6 +38,7 @@ function useTaskOnAuth() {
38
38
  userId: context.userId,
39
39
  isLoggedIn: context.isLoggedIn,
40
40
  isInitializing: context.isInitializing,
41
+ isSessionReady: context.isSessionReady,
41
42
  // Unified login
42
43
  login: context.login,
43
44
  // Logout
@@ -49,6 +50,7 @@ function useTaskOnAuth() {
49
50
  context.userId,
50
51
  context.isLoggedIn,
51
52
  context.isInitializing,
53
+ context.isSessionReady,
52
54
  context.login,
53
55
  context.logout,
54
56
  context.requestLogin
@@ -136,6 +138,63 @@ async function preloadWidgetLocale(widgetId, locale, loadMessages) {
136
138
  );
137
139
  }
138
140
  }
141
+ function interpolate(template, params) {
142
+ if (!params) {
143
+ return template;
144
+ }
145
+ return template.replace(/\{(\w+)\}/g, (match, key) => {
146
+ const value = params[key];
147
+ if (value === void 0) {
148
+ return match;
149
+ }
150
+ return String(value);
151
+ });
152
+ }
153
+ function createT(messages) {
154
+ return (key, params) => {
155
+ const template = messages[key];
156
+ if (typeof template !== "string") {
157
+ if (process.env.NODE_ENV !== "production") {
158
+ console.warn(`[widget-react] Missing translation key: ${String(key)}`);
159
+ }
160
+ return String(key);
161
+ }
162
+ return interpolate(template, params);
163
+ };
164
+ }
165
+ function createTFunction(messages) {
166
+ return (key, params) => {
167
+ const template = messages[key];
168
+ if (typeof template !== "string") {
169
+ if (process.env.NODE_ENV !== "production") {
170
+ console.warn(`[widget-react] Missing translation key: ${String(key)}`);
171
+ }
172
+ return String(key);
173
+ }
174
+ return interpolate(template, params);
175
+ };
176
+ }
177
+ function useTranslation(options) {
178
+ const { messages, isLoading } = useWidgetLocale(options);
179
+ const t = useMemo(() => createTFunction(messages), [messages]);
180
+ return {
181
+ t,
182
+ messages,
183
+ isLoading
184
+ };
185
+ }
186
+ function createLocaleLoader(defaultMessages, imports) {
187
+ return (locale) => {
188
+ if (locale === "en") {
189
+ return Promise.resolve({ default: defaultMessages });
190
+ }
191
+ const importFn = imports[locale];
192
+ if (importFn) {
193
+ return importFn();
194
+ }
195
+ return Promise.resolve({ default: defaultMessages });
196
+ };
197
+ }
139
198
  function composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {
140
199
  return function handleEvent(event) {
141
200
  originalEventHandler == null ? void 0 : originalEventHandler(event);
@@ -1312,23 +1371,27 @@ export {
1312
1371
  ThemeProvider as T,
1313
1372
  useTaskOnTheme as a,
1314
1373
  useWidgetLocale as b,
1315
- clearLocaleCache as c,
1316
- useTaskOnContext as d,
1317
- createContextScope as e,
1318
- useComposedRefs as f,
1319
- createSlot as g,
1320
- useControllableState as h,
1321
- isSupportedLocale as i,
1322
- Presence as j,
1323
- composeEventHandlers as k,
1324
- useCallbackRef as l,
1325
- Portal as m,
1326
- dispatchDiscreteCustomEvent as n,
1327
- useLayoutEffect2 as o,
1374
+ useTranslation as c,
1375
+ clearLocaleCache as d,
1376
+ createLocaleLoader as e,
1377
+ createT as f,
1378
+ isSupportedLocale as g,
1379
+ useTaskOnContext as h,
1380
+ interpolate as i,
1381
+ createContextScope as j,
1382
+ useComposedRefs as k,
1383
+ createSlot as l,
1384
+ useControllableState as m,
1385
+ Presence as n,
1386
+ composeEventHandlers as o,
1328
1387
  preloadWidgetLocale as p,
1329
- TaskOnContext as q,
1330
- composeRefs as r,
1331
- createContext2 as s,
1332
- useTaskOnPortalContainer as t,
1333
- useTaskOnAuth as u
1388
+ useCallbackRef as q,
1389
+ Portal as r,
1390
+ useLayoutEffect2 as s,
1391
+ dispatchDiscreteCustomEvent as t,
1392
+ useTaskOnAuth as u,
1393
+ TaskOnContext as v,
1394
+ createContext2 as w,
1395
+ useTaskOnPortalContainer as x,
1396
+ composeRefs as y
1334
1397
  };