@carlonicora/nextjs-jsonapi 1.141.3 → 1.142.0

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 (63) hide show
  1. package/dist/{AssistantMessageInterface-DH1QwtC_.d.mts → AssistantMessageInterface-Ce8FcllX.d.mts} +1 -1
  2. package/dist/{AssistantMessageInterface-giWvsOrX.d.ts → AssistantMessageInterface-Dh0BpbP2.d.ts} +1 -1
  3. package/dist/{BlockNoteEditor-JTKEBS2W.mjs → BlockNoteEditor-35DDJH3M.mjs} +4 -4
  4. package/dist/{BlockNoteEditor-4OXY6BKF.js → BlockNoteEditor-XXTBZ7DD.js} +19 -19
  5. package/dist/{BlockNoteEditor-4OXY6BKF.js.map → BlockNoteEditor-XXTBZ7DD.js.map} +1 -1
  6. package/dist/{auth.interface-yivTb46w.d.ts → auth.interface-COmBjh89.d.ts} +1 -1
  7. package/dist/{auth.interface-r3XKYOrQ.d.mts → auth.interface-CkmZqat3.d.mts} +1 -1
  8. package/dist/billing/index.js +357 -357
  9. package/dist/billing/index.mjs +3 -3
  10. package/dist/{chunk-AGKZCRG2.js → chunk-5SFFHIEE.js} +18 -18
  11. package/dist/{chunk-AGKZCRG2.js.map → chunk-5SFFHIEE.js.map} +1 -1
  12. package/dist/{chunk-4TGGHNWL.js → chunk-7CR4YB7Y.js} +752 -752
  13. package/dist/chunk-7CR4YB7Y.js.map +1 -0
  14. package/dist/{chunk-SE2YSAER.js → chunk-C6UXEPNY.js} +7 -7
  15. package/dist/{chunk-SE2YSAER.js.map → chunk-C6UXEPNY.js.map} +1 -1
  16. package/dist/{chunk-K76QSQTC.mjs → chunk-FZ5SPJEU.mjs} +28 -28
  17. package/dist/chunk-FZ5SPJEU.mjs.map +1 -0
  18. package/dist/{chunk-5GVY2M5X.mjs → chunk-KZHHKPQZ.mjs} +18 -18
  19. package/dist/chunk-KZHHKPQZ.mjs.map +1 -0
  20. package/dist/{chunk-KXTTYXJ6.mjs → chunk-ZV2GZKFR.mjs} +2 -2
  21. package/dist/client/index.d.mts +2 -2
  22. package/dist/client/index.d.ts +2 -2
  23. package/dist/client/index.js +4 -4
  24. package/dist/client/index.mjs +3 -3
  25. package/dist/components/index.d.mts +3 -3
  26. package/dist/components/index.d.ts +3 -3
  27. package/dist/components/index.js +4 -4
  28. package/dist/components/index.mjs +3 -3
  29. package/dist/contexts/index.d.mts +3 -3
  30. package/dist/contexts/index.d.ts +3 -3
  31. package/dist/contexts/index.js +4 -4
  32. package/dist/contexts/index.mjs +3 -3
  33. package/dist/core/index.d.mts +13 -13
  34. package/dist/core/index.d.ts +13 -13
  35. package/dist/core/index.js +2 -2
  36. package/dist/core/index.mjs +1 -1
  37. package/dist/features/help/index.js +37 -37
  38. package/dist/features/help/index.mjs +3 -3
  39. package/dist/index.d.mts +5 -5
  40. package/dist/index.d.ts +5 -5
  41. package/dist/index.js +3 -3
  42. package/dist/index.mjs +2 -2
  43. package/dist/{notification.interface-LKFmZndR.d.ts → notification.interface--27exGde.d.ts} +6 -6
  44. package/dist/{notification.interface-B3kNUTZs.d.mts → notification.interface-CG1vqoxg.d.mts} +6 -6
  45. package/dist/{s3.service-CXKV_OT-.d.mts → s3.service-DYflLXCt.d.mts} +2 -2
  46. package/dist/{s3.service-BrmeMjtk.d.ts → s3.service-Dmfxpn-k.d.ts} +2 -2
  47. package/dist/server/index.d.mts +3 -3
  48. package/dist/server/index.d.ts +3 -3
  49. package/dist/server/index.js +3 -3
  50. package/dist/server/index.mjs +1 -1
  51. package/dist/{useSocket-BsbaGPqE.d.ts → useSocket-DgGAQW6h.d.ts} +1 -1
  52. package/dist/{useSocket-BSjn1Rlb.d.mts → useSocket-M3YY0aTS.d.mts} +1 -1
  53. package/package.json +1 -1
  54. package/src/features/company/components/details/TokenStatusIndicator.tsx +9 -9
  55. package/src/features/company/data/company.interface.ts +6 -6
  56. package/src/features/company/data/company.ts +17 -17
  57. package/src/features/user/contexts/CurrentUserContext.tsx +18 -18
  58. package/src/features/user/contexts/__tests__/CurrentUserContext.spec.tsx +21 -21
  59. package/dist/chunk-4TGGHNWL.js.map +0 -1
  60. package/dist/chunk-5GVY2M5X.mjs.map +0 -1
  61. package/dist/chunk-K76QSQTC.mjs.map +0 -1
  62. /package/dist/{BlockNoteEditor-JTKEBS2W.mjs.map → BlockNoteEditor-35DDJH3M.mjs.map} +0 -0
  63. /package/dist/{chunk-KXTTYXJ6.mjs.map → chunk-ZV2GZKFR.mjs.map} +0 -0
@@ -15,7 +15,7 @@ var _chunkIOLU4ASDjs = require('../chunk-IOLU4ASD.js');
15
15
 
16
16
 
17
17
 
18
- var _chunkAGKZCRG2js = require('../chunk-AGKZCRG2.js');
18
+ var _chunk5SFFHIEEjs = require('../chunk-5SFFHIEE.js');
19
19
  require('../chunk-LXKSUWAV.js');
20
20
  require('../chunk-IBS6NI7D.js');
21
21
 
@@ -86,7 +86,7 @@ var ServerSession = class {
86
86
  if (!rawModules) return false;
87
87
  const modules = JSON.parse(_pako.ungzip.call(void 0, Buffer.from(rawModules, "base64"), { toText: true }));
88
88
  const selectedModule = modules.find((module) => module.id === params.module.moduleId);
89
- return _chunkAGKZCRG2js.checkPermissionsFromServer.call(void 0, {
89
+ return _chunk5SFFHIEEjs.checkPermissionsFromServer.call(void 0, {
90
90
  module: params.module,
91
91
  action: params.action,
92
92
  data: params.data,
@@ -296,5 +296,5 @@ _chunk7QVYU63Ejs.__name.call(void 0, ServerJsonApiDelete, "ServerJsonApiDelete")
296
296
 
297
297
 
298
298
 
299
- exports.ServerAuthService = _chunkAGKZCRG2js.AuthService; exports.ServerCompanyService = _chunkAGKZCRG2js.CompanyService; exports.ServerContentService = _chunkAGKZCRG2js.ContentService; exports.ServerFeatureService = _chunkAGKZCRG2js.FeatureService; exports.ServerJsonApiDelete = ServerJsonApiDelete; exports.ServerJsonApiGet = ServerJsonApiGet; exports.ServerJsonApiPatch = ServerJsonApiPatch; exports.ServerJsonApiPost = ServerJsonApiPost; exports.ServerJsonApiPut = ServerJsonApiPut; exports.ServerNotificationService = _chunkAGKZCRG2js.NotificationService; exports.ServerPushService = _chunkAGKZCRG2js.PushService; exports.ServerRoleService = _chunkAGKZCRG2js.RoleService; exports.ServerS3Service = _chunkAGKZCRG2js.S3Service; exports.ServerSession = ServerSession; exports.ServerUserService = _chunkAGKZCRG2js.UserService; exports.configureServerJsonApi = configureServerJsonApi; exports.getServerApiUrl = getServerApiUrl; exports.getServerAppUrl = getServerAppUrl; exports.getServerToken = _chunkYUO55Q5Ajs.getServerToken; exports.getServerTrackablePages = getServerTrackablePages; exports.invalidateCacheTag = invalidateCacheTag; exports.invalidateCacheTags = invalidateCacheTags; exports.serverRequest = _chunkIOLU4ASDjs.serverRequest;
299
+ exports.ServerAuthService = _chunk5SFFHIEEjs.AuthService; exports.ServerCompanyService = _chunk5SFFHIEEjs.CompanyService; exports.ServerContentService = _chunk5SFFHIEEjs.ContentService; exports.ServerFeatureService = _chunk5SFFHIEEjs.FeatureService; exports.ServerJsonApiDelete = ServerJsonApiDelete; exports.ServerJsonApiGet = ServerJsonApiGet; exports.ServerJsonApiPatch = ServerJsonApiPatch; exports.ServerJsonApiPost = ServerJsonApiPost; exports.ServerJsonApiPut = ServerJsonApiPut; exports.ServerNotificationService = _chunk5SFFHIEEjs.NotificationService; exports.ServerPushService = _chunk5SFFHIEEjs.PushService; exports.ServerRoleService = _chunk5SFFHIEEjs.RoleService; exports.ServerS3Service = _chunk5SFFHIEEjs.S3Service; exports.ServerSession = ServerSession; exports.ServerUserService = _chunk5SFFHIEEjs.UserService; exports.configureServerJsonApi = configureServerJsonApi; exports.getServerApiUrl = getServerApiUrl; exports.getServerAppUrl = getServerAppUrl; exports.getServerToken = _chunkYUO55Q5Ajs.getServerToken; exports.getServerTrackablePages = getServerTrackablePages; exports.invalidateCacheTag = invalidateCacheTag; exports.invalidateCacheTags = invalidateCacheTags; exports.serverRequest = _chunkIOLU4ASDjs.serverRequest;
300
300
  //# sourceMappingURL=index.js.map
@@ -15,7 +15,7 @@ import {
15
15
  S3Service,
16
16
  UserService,
17
17
  checkPermissionsFromServer
18
- } from "../chunk-5GVY2M5X.mjs";
18
+ } from "../chunk-KZHHKPQZ.mjs";
19
19
  import "../chunk-AUXK7QSA.mjs";
20
20
  import "../chunk-C7C7VY4F.mjs";
21
21
  import {
@@ -1,4 +1,4 @@
1
- import { N as NotificationInterface } from './notification.interface-LKFmZndR.js';
1
+ import { N as NotificationInterface } from './notification.interface--27exGde.js';
2
2
 
3
3
  interface UseSocketOptions {
4
4
  token: string;
@@ -1,4 +1,4 @@
1
- import { N as NotificationInterface } from './notification.interface-B3kNUTZs.mjs';
1
+ import { N as NotificationInterface } from './notification.interface-CG1vqoxg.mjs';
2
2
 
3
3
  interface UseSocketOptions {
4
4
  token: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@carlonicora/nextjs-jsonapi",
3
- "version": "1.141.3",
3
+ "version": "1.142.0",
4
4
  "description": "Next.js JSON:API client with server/client support and caching",
5
5
  "author": "Carlo Nicora",
6
6
  "license": "GPL-3.0-or-later",
@@ -31,12 +31,12 @@ export function TokenStatusIndicator({ className, size = "md", showExtraPages =
31
31
  // Don't render if no company data
32
32
  if (!company) return null;
33
33
 
34
- const monthlyTokens = company.monthlyTokens;
35
- const availableMonthlyTokens = company.availableMonthlyTokens;
36
- const availableExtraTokens = company.availableExtraTokens;
34
+ const monthlyCredits = company.monthlyCredits;
35
+ const availableMonthlyCredits = company.availableMonthlyCredits;
36
+ const availableExtraCredits = company.availableExtraCredits;
37
37
 
38
38
  // Calculate percentage of available monthly pages
39
- const percentage = monthlyTokens > 0 ? (availableMonthlyTokens / monthlyTokens) * 100 : 0;
39
+ const percentage = monthlyCredits > 0 ? (availableMonthlyCredits / monthlyCredits) * 100 : 0;
40
40
 
41
41
  const sizeClasses = {
42
42
  sm: "h-4 w-4",
@@ -91,7 +91,7 @@ export function TokenStatusIndicator({ className, size = "md", showExtraPages =
91
91
  {t("billing.tokens.monthly", { defaultValue: "Monthly Pages" })}:
92
92
  </span>
93
93
  <span className={cn("font-medium", getStatusColor())}>
94
- {availableMonthlyTokens} / {monthlyTokens}
94
+ {availableMonthlyCredits} / {monthlyCredits}
95
95
  </span>
96
96
  </div>
97
97
  <div className="flex items-center justify-between gap-4">
@@ -108,7 +108,7 @@ export function TokenStatusIndicator({ className, size = "md", showExtraPages =
108
108
  <span className="text-muted-foreground">
109
109
  {t("billing.tokens.available_extra", { defaultValue: "Extra Pages" })}:
110
110
  </span>
111
- <span className="font-medium text-blue-500">{availableExtraTokens}</span>
111
+ <span className="font-medium text-blue-500">{availableExtraCredits}</span>
112
112
  </div>
113
113
  <Link href="/settings/billing?action=subscribe" className="w-full flex justify-end my-4">
114
114
  <Button variant="outline" size="sm">
@@ -127,11 +127,11 @@ export function TokenStatusIndicator({ className, size = "md", showExtraPages =
127
127
  aria-label={t("billing.tokens.status", { defaultValue: "Page Status" })}
128
128
  >
129
129
  {getBatteryIcon()}
130
- <span className={cn(textSize, "text-muted-foreground font-medium")}>{availableMonthlyTokens}</span>
131
- {showExtraPages && availableExtraTokens > 0 && (
130
+ <span className={cn(textSize, "text-muted-foreground font-medium")}>{availableMonthlyCredits}</span>
131
+ {showExtraPages && availableExtraCredits > 0 && (
132
132
  <div className="inline-flex items-center gap-0.5">
133
133
  <PlusCircle className={cn(smallIconSize, "text-blue-500")} />
134
- <span className={cn(textSize, "text-blue-500 font-medium")}>{availableExtraTokens}</span>
134
+ <span className={cn(textSize, "text-blue-500 font-medium")}>{availableExtraCredits}</span>
135
135
  </div>
136
136
  )}
137
137
  </div>
@@ -8,9 +8,9 @@ export type CompanyInput = {
8
8
  logo?: string;
9
9
  configurations?: any;
10
10
 
11
- monthlyTokens?: number;
12
- availableMonthlyTokens?: number;
13
- availableExtraTokens?: number;
11
+ monthlyCredits?: number;
12
+ availableMonthlyCredits?: number;
13
+ availableExtraCredits?: number;
14
14
 
15
15
  featureIds?: string[];
16
16
  moduleIds?: string[];
@@ -34,9 +34,9 @@ export interface CompanyInterface extends ApiDataInterface {
34
34
 
35
35
  get isActiveSubscription(): boolean;
36
36
 
37
- get monthlyTokens(): number;
38
- get availableMonthlyTokens(): number;
39
- get availableExtraTokens(): number;
37
+ get monthlyCredits(): number;
38
+ get availableMonthlyCredits(): number;
39
+ get availableExtraCredits(): number;
40
40
 
41
41
  get features(): FeatureInterface[];
42
42
  get modules(): ModuleInterface[];
@@ -11,9 +11,9 @@ export class Company extends AbstractApiData implements CompanyInterface {
11
11
 
12
12
  private _isActiveSubscription: boolean = false;
13
13
 
14
- private _monthlyTokens: number = 0;
15
- private _availableMonthlyTokens: number = 0;
16
- private _availableExtraTokens: number = 0;
14
+ private _monthlyCredits: number = 0;
15
+ private _availableMonthlyCredits: number = 0;
16
+ private _availableExtraCredits: number = 0;
17
17
 
18
18
  private _features?: FeatureInterface[];
19
19
  private _modules?: ModuleInterface[];
@@ -46,16 +46,16 @@ export class Company extends AbstractApiData implements CompanyInterface {
46
46
  return this._isActiveSubscription ?? false;
47
47
  }
48
48
 
49
- get monthlyTokens(): number {
50
- return this._monthlyTokens ?? 0;
49
+ get monthlyCredits(): number {
50
+ return this._monthlyCredits ?? 0;
51
51
  }
52
52
 
53
- get availableMonthlyTokens(): number {
54
- return this._availableMonthlyTokens ?? 0;
53
+ get availableMonthlyCredits(): number {
54
+ return this._availableMonthlyCredits ?? 0;
55
55
  }
56
56
 
57
- get availableExtraTokens(): number {
58
- return this._availableExtraTokens ?? 0;
57
+ get availableExtraCredits(): number {
58
+ return this._availableExtraCredits ?? 0;
59
59
  }
60
60
 
61
61
  get features(): FeatureInterface[] {
@@ -120,9 +120,9 @@ export class Company extends AbstractApiData implements CompanyInterface {
120
120
  this._logo = data.jsonApi.attributes.logo;
121
121
  this._logoUrl = data.jsonApi.attributes.logoUrl;
122
122
  this._isActiveSubscription = data.jsonApi.attributes.isActiveSubscription ?? false;
123
- this._monthlyTokens = data.jsonApi.attributes.monthlyTokens ?? 0;
124
- this._availableMonthlyTokens = data.jsonApi.attributes.availableMonthlyTokens ?? 0;
125
- this._availableExtraTokens = data.jsonApi.attributes.availableExtraTokens ?? 0;
123
+ this._monthlyCredits = data.jsonApi.attributes.monthlyCredits ?? 0;
124
+ this._availableMonthlyCredits = data.jsonApi.attributes.availableMonthlyCredits ?? 0;
125
+ this._availableExtraCredits = data.jsonApi.attributes.availableExtraCredits ?? 0;
126
126
 
127
127
  this._legal_address = data.jsonApi.attributes.legal_address;
128
128
  this._street_number = data.jsonApi.attributes.street_number;
@@ -156,11 +156,11 @@ export class Company extends AbstractApiData implements CompanyInterface {
156
156
  if (data.name) response.data.attributes.name = data.name;
157
157
  if (data.configurations) response.data.attributes.configurations = JSON.stringify(data.configurations);
158
158
  if (data.logo) response.data.attributes.logo = data.logo;
159
- if (data.monthlyTokens !== undefined) response.data.attributes.monthlyTokens = data.monthlyTokens;
160
- if (data.availableMonthlyTokens !== undefined)
161
- response.data.attributes.availableMonthlyTokens = data.availableMonthlyTokens;
162
- if (data.availableExtraTokens !== undefined)
163
- response.data.attributes.availableExtraTokens = data.availableExtraTokens;
159
+ if (data.monthlyCredits !== undefined) response.data.attributes.monthlyCredits = data.monthlyCredits;
160
+ if (data.availableMonthlyCredits !== undefined)
161
+ response.data.attributes.availableMonthlyCredits = data.availableMonthlyCredits;
162
+ if (data.availableExtraCredits !== undefined)
163
+ response.data.attributes.availableExtraCredits = data.availableExtraCredits;
164
164
 
165
165
  if (data.legal_address !== undefined) response.data.attributes.legal_address = data.legal_address;
166
166
  if (data.street_number !== undefined) response.data.attributes.street_number = data.street_number;
@@ -71,26 +71,26 @@ export const CurrentUserProvider = ({ children }: { children: React.ReactNode })
71
71
  [dehydratedUser],
72
72
  );
73
73
 
74
- // Balances pushed by company:tokens_updated. Transient: a real user refresh is
74
+ // Balances pushed by company:credits_updated. Transient: a real user refresh is
75
75
  // authoritative and clears this.
76
- const [tokenOverride, setTokenOverride] = useState<{
77
- availableMonthlyTokens: number;
78
- availableExtraTokens: number;
76
+ const [creditOverride, setCreditOverride] = useState<{
77
+ availableMonthlyCredits: number;
78
+ availableExtraCredits: number;
79
79
  } | null>(null);
80
80
 
81
81
  const company = useMemo<CompanyInterface | null>(() => {
82
82
  const c = currentUser?.company ?? null;
83
- if (!c || !tokenOverride) return c;
83
+ if (!c || !creditOverride) return c;
84
84
  return Object.assign(Object.create(Object.getPrototypeOf(c)), c, {
85
- _availableMonthlyTokens: tokenOverride.availableMonthlyTokens,
86
- _availableExtraTokens: tokenOverride.availableExtraTokens,
85
+ _availableMonthlyCredits: creditOverride.availableMonthlyCredits,
86
+ _availableExtraCredits: creditOverride.availableExtraCredits,
87
87
  });
88
- }, [currentUser, tokenOverride]);
88
+ }, [currentUser, creditOverride]);
89
89
 
90
90
  const setUser = (user?: UserInterface): void => {
91
91
  if (user) setDehydratedUser(user.dehydrate() as any);
92
92
  else setDehydratedUser(null);
93
- setTokenOverride(null);
93
+ setCreditOverride(null);
94
94
  };
95
95
 
96
96
  const hasRole = (roleId: string): boolean => {
@@ -177,7 +177,7 @@ export const CurrentUserProvider = ({ children }: { children: React.ReactNode })
177
177
  }
178
178
 
179
179
  setDehydratedUser(fullUser.dehydrate() as any);
180
- setTokenOverride(null);
180
+ setCreditOverride(null);
181
181
  }
182
182
  } catch (error) {
183
183
  console.error("Failed to refresh user data:", error);
@@ -206,15 +206,15 @@ export const CurrentUserProvider = ({ children }: { children: React.ReactNode })
206
206
 
207
207
  // Hot path: fires once per LLM call. Fully described by its payload — must
208
208
  // never trigger an HTTP request.
209
- const handleTokensUpdated = (data: {
209
+ const handleCreditsUpdated = (data: {
210
210
  companyId: string;
211
- availableMonthlyTokens: number;
212
- availableExtraTokens: number;
211
+ availableMonthlyCredits: number;
212
+ availableExtraCredits: number;
213
213
  }) => {
214
214
  if (data.companyId !== currentUser.company?.id) return;
215
- setTokenOverride({
216
- availableMonthlyTokens: data.availableMonthlyTokens,
217
- availableExtraTokens: data.availableExtraTokens,
215
+ setCreditOverride({
216
+ availableMonthlyCredits: data.availableMonthlyCredits,
217
+ availableExtraCredits: data.availableExtraCredits,
218
218
  });
219
219
  };
220
220
 
@@ -230,11 +230,11 @@ export const CurrentUserProvider = ({ children }: { children: React.ReactNode })
230
230
  }
231
231
  };
232
232
 
233
- socket.on("company:tokens_updated", handleTokensUpdated);
233
+ socket.on("company:credits_updated", handleCreditsUpdated);
234
234
  socket.on("company:subscription_updated", handleSubscriptionUpdated);
235
235
 
236
236
  return () => {
237
- socket.off("company:tokens_updated", handleTokensUpdated);
237
+ socket.off("company:credits_updated", handleCreditsUpdated);
238
238
  socket.off("company:subscription_updated", handleSubscriptionUpdated);
239
239
  };
240
240
  }, [socket, isConnected, currentUser?.company?.id]);
@@ -39,14 +39,14 @@ vi.mock("../../../../core", () => {
39
39
  // exercise it.
40
40
  class FakeCompany {
41
41
  id = "";
42
- monthlyTokens = 0;
43
- _availableMonthlyTokens = 0;
44
- _availableExtraTokens = 0;
45
- get availableMonthlyTokens() {
46
- return this._availableMonthlyTokens ?? 0;
42
+ monthlyCredits = 0;
43
+ _availableMonthlyCredits = 0;
44
+ _availableExtraCredits = 0;
45
+ get availableMonthlyCredits() {
46
+ return this._availableMonthlyCredits ?? 0;
47
47
  }
48
- get availableExtraTokens() {
49
- return this._availableExtraTokens ?? 0;
48
+ get availableExtraCredits() {
49
+ return this._availableExtraCredits ?? 0;
50
50
  }
51
51
  }
52
52
  return {
@@ -187,9 +187,9 @@ describe("CurrentUserProvider token updates", () => {
187
187
  modules: [],
188
188
  company: {
189
189
  id: "company-1",
190
- monthlyTokens: 1000,
191
- _availableMonthlyTokens: 900,
192
- _availableExtraTokens: 50,
190
+ monthlyCredits: 1000,
191
+ _availableMonthlyCredits: 900,
192
+ _availableExtraCredits: 50,
193
193
  },
194
194
  };
195
195
 
@@ -197,7 +197,7 @@ describe("CurrentUserProvider token updates", () => {
197
197
  const { company } = useCurrentUserContext();
198
198
  return (
199
199
  <div data-testid="balances">
200
- {company ? `${(company as any).availableMonthlyTokens}/${(company as any).availableExtraTokens}` : "null"}
200
+ {company ? `${(company as any).availableMonthlyCredits}/${(company as any).availableExtraCredits}` : "null"}
201
201
  </div>
202
202
  );
203
203
  }
@@ -208,7 +208,7 @@ describe("CurrentUserProvider token updates", () => {
208
208
  vi.clearAllMocks();
209
209
  });
210
210
 
211
- it("patches balances from company:tokens_updated without refetching the user", async () => {
211
+ it("patches balances from company:credits_updated without refetching the user", async () => {
212
212
  localStorage.setItem("user", JSON.stringify(STORED_USER));
213
213
 
214
214
  const { getByTestId } = render(
@@ -221,11 +221,11 @@ describe("CurrentUserProvider token updates", () => {
221
221
  expect(getByTestId("balances").textContent).toBe("900/50");
222
222
 
223
223
  await act(async () => {
224
- socketMock.emit("company:tokens_updated", {
225
- type: "company:tokens_updated",
224
+ socketMock.emit("company:credits_updated", {
225
+ type: "company:credits_updated",
226
226
  companyId: "company-1",
227
- availableMonthlyTokens: 750,
228
- availableExtraTokens: 40,
227
+ availableMonthlyCredits: 750,
228
+ availableExtraCredits: 40,
229
229
  });
230
230
  });
231
231
 
@@ -233,7 +233,7 @@ describe("CurrentUserProvider token updates", () => {
233
233
  expect(UserService.findFullUser).not.toHaveBeenCalled();
234
234
  });
235
235
 
236
- it("ignores company:tokens_updated for a different company", async () => {
236
+ it("ignores company:credits_updated for a different company", async () => {
237
237
  localStorage.setItem("user", JSON.stringify(STORED_USER));
238
238
 
239
239
  const { getByTestId } = render(
@@ -245,11 +245,11 @@ describe("CurrentUserProvider token updates", () => {
245
245
  await new Promise((resolve) => setTimeout(resolve, 50));
246
246
 
247
247
  await act(async () => {
248
- socketMock.emit("company:tokens_updated", {
249
- type: "company:tokens_updated",
248
+ socketMock.emit("company:credits_updated", {
249
+ type: "company:credits_updated",
250
250
  companyId: "someone-else",
251
- availableMonthlyTokens: 1,
252
- availableExtraTokens: 1,
251
+ availableMonthlyCredits: 1,
252
+ availableExtraCredits: 1,
253
253
  });
254
254
  });
255
255