@orderly.network/hooks 1.5.0 → 1.5.1

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 (171) hide show
  1. package/esm/orderly/orderlyHooks.d.ts +1 -0
  2. package/esm/orderly/orderlyHooks.d.ts.map +1 -1
  3. package/esm/orderly/orderlyHooks.js +1 -0
  4. package/esm/orderly/orderlyHooks.js.map +1 -1
  5. package/esm/orderly/useCollateral.d.ts.map +1 -1
  6. package/esm/orderly/useCollateral.js +8 -9
  7. package/esm/orderly/useCollateral.js.map +1 -1
  8. package/esm/orderly/usePositionStream/usePositionStream.d.ts +4 -0
  9. package/esm/orderly/usePositionStream/usePositionStream.d.ts.map +1 -1
  10. package/esm/orderly/usePositionStream/usePositionStream.js +9 -1
  11. package/esm/orderly/usePositionStream/usePositionStream.js.map +1 -1
  12. package/esm/orderly/usePrivateDataObserver.d.ts.map +1 -1
  13. package/esm/orderly/usePrivateDataObserver.js +8 -2
  14. package/esm/orderly/usePrivateDataObserver.js.map +1 -1
  15. package/esm/orderly/useSymbolLeverage.d.ts +2 -0
  16. package/esm/orderly/useSymbolLeverage.d.ts.map +1 -0
  17. package/esm/orderly/useSymbolLeverage.js +31 -0
  18. package/esm/orderly/useSymbolLeverage.js.map +1 -0
  19. package/esm/orderly/useTakeProfitAndStopLoss/useTPSL.d.ts.map +1 -1
  20. package/esm/orderly/useTakeProfitAndStopLoss/useTPSL.js +2 -1
  21. package/esm/orderly/useTakeProfitAndStopLoss/useTPSL.js.map +1 -1
  22. package/esm/referral/index.d.ts +3 -0
  23. package/esm/referral/index.d.ts.map +1 -1
  24. package/esm/referral/index.js +3 -0
  25. package/esm/referral/index.js.map +1 -1
  26. package/esm/referral/useCheckReferralCode.d.ts +6 -0
  27. package/esm/referral/useCheckReferralCode.d.ts.map +1 -0
  28. package/esm/referral/useCheckReferralCode.js +18 -0
  29. package/esm/referral/useCheckReferralCode.js.map +1 -0
  30. package/esm/referral/useGetReferralCode.d.ts +6 -0
  31. package/esm/referral/useGetReferralCode.d.ts.map +1 -0
  32. package/esm/referral/useGetReferralCode.js +18 -0
  33. package/esm/referral/useGetReferralCode.js.map +1 -0
  34. package/esm/referral/useReferralInfo.d.ts +10 -0
  35. package/esm/referral/useReferralInfo.d.ts.map +1 -0
  36. package/esm/referral/useReferralInfo.js +56 -0
  37. package/esm/referral/useReferralInfo.js.map +1 -0
  38. package/esm/services/orderMerge/algoOrderMergeHandler.d.ts +1 -0
  39. package/esm/services/orderMerge/algoOrderMergeHandler.d.ts.map +1 -1
  40. package/esm/services/orderMerge/algoOrderMergeHandler.js +8 -0
  41. package/esm/services/orderMerge/algoOrderMergeHandler.js.map +1 -1
  42. package/esm/services/orderMerge/baseMergeHandler.d.ts +1 -0
  43. package/esm/services/orderMerge/baseMergeHandler.d.ts.map +1 -1
  44. package/esm/services/orderMerge/baseMergeHandler.js +1 -1
  45. package/esm/services/orderMerge/baseMergeHandler.js.map +1 -1
  46. package/esm/services/orderMerge/regularOrderMergeHandler.d.ts +1 -0
  47. package/esm/services/orderMerge/regularOrderMergeHandler.d.ts.map +1 -1
  48. package/esm/services/orderMerge/regularOrderMergeHandler.js +3 -0
  49. package/esm/services/orderMerge/regularOrderMergeHandler.js.map +1 -1
  50. package/esm/services/painter/basePaint.d.ts +5 -0
  51. package/esm/services/painter/basePaint.d.ts.map +1 -1
  52. package/esm/services/painter/basePaint.js.map +1 -1
  53. package/esm/services/painter/dataPaint.d.ts +3 -0
  54. package/esm/services/painter/dataPaint.d.ts.map +1 -1
  55. package/esm/services/painter/dataPaint.js +88 -16
  56. package/esm/services/painter/dataPaint.js.map +1 -1
  57. package/esm/services/painter/layout.config.js +1 -1
  58. package/esm/services/painter/layout.config.js.map +1 -1
  59. package/esm/services/painter/painter.d.ts.map +1 -1
  60. package/esm/services/painter/painter.js +7 -2
  61. package/esm/services/painter/painter.js.map +1 -1
  62. package/esm/services/painter/qrPaint.d.ts +8 -0
  63. package/esm/services/painter/qrPaint.d.ts.map +1 -0
  64. package/esm/services/painter/qrPaint.js +39 -0
  65. package/esm/services/painter/qrPaint.js.map +1 -0
  66. package/esm/useLocalStorage.js +2 -2
  67. package/esm/useLocalStorage.js.map +1 -1
  68. package/esm/useMediaQuery.js +7 -7
  69. package/esm/useMediaQuery.js.map +1 -1
  70. package/esm/usePoster.d.ts.map +1 -1
  71. package/esm/usePoster.js +18 -15
  72. package/esm/usePoster.js.map +1 -1
  73. package/esm/useSessionStorage.js +2 -2
  74. package/esm/useSessionStorage.js.map +1 -1
  75. package/esm/utils/index.d.ts +1 -0
  76. package/esm/utils/index.d.ts.map +1 -1
  77. package/esm/utils/index.js +1 -0
  78. package/esm/utils/index.js.map +1 -1
  79. package/esm/utils/orderEntryHelper.d.ts +1 -0
  80. package/esm/utils/orderEntryHelper.d.ts.map +1 -1
  81. package/esm/utils/orderEntryHelper.js +27 -2
  82. package/esm/utils/orderEntryHelper.js.map +1 -1
  83. package/esm/version.d.ts +1 -1
  84. package/esm/version.js +2 -2
  85. package/esm/version.js.map +1 -1
  86. package/lib/orderly/orderlyHooks.d.ts +1 -0
  87. package/lib/orderly/orderlyHooks.d.ts.map +1 -1
  88. package/lib/orderly/orderlyHooks.js +4 -0
  89. package/lib/orderly/orderlyHooks.js.map +1 -1
  90. package/lib/orderly/useCollateral.d.ts.map +1 -1
  91. package/lib/orderly/useCollateral.js +8 -9
  92. package/lib/orderly/useCollateral.js.map +1 -1
  93. package/lib/orderly/usePositionStream/usePositionStream.d.ts +4 -0
  94. package/lib/orderly/usePositionStream/usePositionStream.d.ts.map +1 -1
  95. package/lib/orderly/usePositionStream/usePositionStream.js +9 -1
  96. package/lib/orderly/usePositionStream/usePositionStream.js.map +1 -1
  97. package/lib/orderly/usePrivateDataObserver.d.ts.map +1 -1
  98. package/lib/orderly/usePrivateDataObserver.js +8 -2
  99. package/lib/orderly/usePrivateDataObserver.js.map +1 -1
  100. package/lib/orderly/useSymbolLeverage.d.ts +2 -0
  101. package/lib/orderly/useSymbolLeverage.d.ts.map +1 -0
  102. package/lib/orderly/useSymbolLeverage.js +41 -0
  103. package/lib/orderly/useSymbolLeverage.js.map +1 -0
  104. package/lib/orderly/useTakeProfitAndStopLoss/useTPSL.d.ts.map +1 -1
  105. package/lib/orderly/useTakeProfitAndStopLoss/useTPSL.js +2 -1
  106. package/lib/orderly/useTakeProfitAndStopLoss/useTPSL.js.map +1 -1
  107. package/lib/referral/index.d.ts +3 -0
  108. package/lib/referral/index.d.ts.map +1 -1
  109. package/lib/referral/index.js +12 -0
  110. package/lib/referral/index.js.map +1 -1
  111. package/lib/referral/useCheckReferralCode.d.ts +6 -0
  112. package/lib/referral/useCheckReferralCode.d.ts.map +1 -0
  113. package/lib/referral/useCheckReferralCode.js +28 -0
  114. package/lib/referral/useCheckReferralCode.js.map +1 -0
  115. package/lib/referral/useGetReferralCode.d.ts +6 -0
  116. package/lib/referral/useGetReferralCode.d.ts.map +1 -0
  117. package/lib/referral/useGetReferralCode.js +28 -0
  118. package/lib/referral/useGetReferralCode.js.map +1 -0
  119. package/lib/referral/useReferralInfo.d.ts +10 -0
  120. package/lib/referral/useReferralInfo.d.ts.map +1 -0
  121. package/lib/referral/useReferralInfo.js +66 -0
  122. package/lib/referral/useReferralInfo.js.map +1 -0
  123. package/lib/services/orderMerge/algoOrderMergeHandler.d.ts +1 -0
  124. package/lib/services/orderMerge/algoOrderMergeHandler.d.ts.map +1 -1
  125. package/lib/services/orderMerge/algoOrderMergeHandler.js +8 -0
  126. package/lib/services/orderMerge/algoOrderMergeHandler.js.map +1 -1
  127. package/lib/services/orderMerge/baseMergeHandler.d.ts +1 -0
  128. package/lib/services/orderMerge/baseMergeHandler.d.ts.map +1 -1
  129. package/lib/services/orderMerge/baseMergeHandler.js +1 -1
  130. package/lib/services/orderMerge/baseMergeHandler.js.map +1 -1
  131. package/lib/services/orderMerge/regularOrderMergeHandler.d.ts +1 -0
  132. package/lib/services/orderMerge/regularOrderMergeHandler.d.ts.map +1 -1
  133. package/lib/services/orderMerge/regularOrderMergeHandler.js +3 -0
  134. package/lib/services/orderMerge/regularOrderMergeHandler.js.map +1 -1
  135. package/lib/services/painter/basePaint.d.ts +5 -0
  136. package/lib/services/painter/basePaint.d.ts.map +1 -1
  137. package/lib/services/painter/basePaint.js.map +1 -1
  138. package/lib/services/painter/dataPaint.d.ts +3 -0
  139. package/lib/services/painter/dataPaint.d.ts.map +1 -1
  140. package/lib/services/painter/dataPaint.js +88 -16
  141. package/lib/services/painter/dataPaint.js.map +1 -1
  142. package/lib/services/painter/layout.config.js +1 -1
  143. package/lib/services/painter/layout.config.js.map +1 -1
  144. package/lib/services/painter/painter.d.ts.map +1 -1
  145. package/lib/services/painter/painter.js +7 -2
  146. package/lib/services/painter/painter.js.map +1 -1
  147. package/lib/services/painter/qrPaint.d.ts +8 -0
  148. package/lib/services/painter/qrPaint.d.ts.map +1 -0
  149. package/lib/services/painter/qrPaint.js +49 -0
  150. package/lib/services/painter/qrPaint.js.map +1 -0
  151. package/lib/useLocalStorage.js +2 -2
  152. package/lib/useLocalStorage.js.map +1 -1
  153. package/lib/useMediaQuery.js +7 -7
  154. package/lib/useMediaQuery.js.map +1 -1
  155. package/lib/usePoster.d.ts.map +1 -1
  156. package/lib/usePoster.js +18 -15
  157. package/lib/usePoster.js.map +1 -1
  158. package/lib/useSessionStorage.js +2 -2
  159. package/lib/useSessionStorage.js.map +1 -1
  160. package/lib/utils/index.d.ts +1 -0
  161. package/lib/utils/index.d.ts.map +1 -1
  162. package/lib/utils/index.js +3 -0
  163. package/lib/utils/index.js.map +1 -1
  164. package/lib/utils/orderEntryHelper.d.ts +1 -0
  165. package/lib/utils/orderEntryHelper.d.ts.map +1 -1
  166. package/lib/utils/orderEntryHelper.js +29 -2
  167. package/lib/utils/orderEntryHelper.js.map +1 -1
  168. package/lib/version.d.ts +1 -1
  169. package/lib/version.js +2 -2
  170. package/lib/version.js.map +1 -1
  171. package/package.json +10 -9
@@ -11,36 +11,42 @@ Object.defineProperty(exports, "DataPaint", {
11
11
  const _utils = require("@orderly.network/utils");
12
12
  const _basePaint = require("./basePaint");
13
13
  const _ramda = require("ramda");
14
+ const _qrPaint = require("./qrPaint");
14
15
  class DataPaint extends _basePaint.BasePaint {
15
16
  positionInfoCellWidth = 110;
16
17
  DEFAULT_PROFIT_COLOR = "rgb(0,181,159)";
17
18
  DEFAULT_LOSS_COLOR = "rgb(255,103,194)";
18
19
  transformTop = 0;
20
+ QRCODE_SIZE = 56;
19
21
  async draw(options) {
20
22
  const needDrawDetails = Array.isArray(options.data?.position?.informations) && (options.data?.position?.informations?.length ?? 0) > 0;
23
+ const hasReferral = this.hasReferral(options);
21
24
  // const hasMessage = !!options.data?.message;
22
25
  const hasMessage = true;
23
26
  this.transformTop = hasMessage ? 0 : needDrawDetails ? -40 : -150;
24
27
  // If position details are not displayed, the position PNL information will be margin
25
28
  // const offsetTop = hasMessage ? 50 : 100;
26
- const offsetTop = 100;
29
+ const offsetTop = 0; // 100;
27
30
  // const offsetMessage = hasMessage ? 0 : -50;
28
31
  if (!!options.data?.message) {
29
32
  this.drawMessage(options);
30
33
  }
31
34
  if (!!options.data?.position) {
32
- this.drawPosition(options, needDrawDetails ? 0 : offsetTop);
35
+ this.drawPosition(options, needDrawDetails || hasReferral ? 0 : offsetTop);
33
36
  }
34
37
  if (needDrawDetails) {
35
38
  this.drawInformations(options);
36
39
  }
37
- this.drawUnrealizedPnL(options, needDrawDetails ? 0 : offsetTop);
40
+ this.drawUnrealizedPnL(options, needDrawDetails || hasReferral ? 0 : offsetTop);
38
41
  if (!!options.data?.domain) {
39
42
  this.drawDomainUrl(options);
40
43
  }
41
44
  if (typeof options.data?.updateTime !== "undefined") {
42
45
  this.drawPositionTime(options);
43
46
  }
47
+ if (typeof options.data?.referral !== "undefined") {
48
+ this.drawReferralCode(options);
49
+ }
44
50
  }
45
51
  drawMessage(options) {
46
52
  // console.log("draw message", options);
@@ -193,22 +199,24 @@ class DataPaint extends _basePaint.BasePaint {
193
199
  });
194
200
  });
195
201
  }
196
- drawDomainUrl(options) {
202
+ drawDomainUrl(options, onlyMeasure = false) {
197
203
  const layout = (0, _ramda.path)([
198
204
  "layout",
199
205
  "domain"
200
206
  ], options);
207
+ const hasReferral = this.hasReferral(options);
201
208
  const { position } = layout;
202
209
  const top = this.painter.height - position.bottom;
203
- this._drawText(options.data?.domain, {
204
- left: this._ratio(position.left),
205
- top: this._ratio(top),
210
+ return this._drawText(options.data?.domain, {
211
+ left: !hasReferral ? this._ratio(position.left) : this._ratio(this.painter.width - 20),
212
+ top: !hasReferral ? this._ratio(top) : this._ratio(this.painter.height - 16),
206
213
  fontSize: this._ratio(layout.fontSize),
207
214
  color: options.brandColor ?? this.DEFAULT_PROFIT_COLOR,
208
215
  fontFamily: options.fontFamily,
209
216
  textBaseline: layout.textBaseline,
217
+ textAlign: !hasReferral ? layout.textAlign : "end",
210
218
  fontWeight: 600
211
- });
219
+ }, onlyMeasure);
212
220
  }
213
221
  drawPositionTime(options) {
214
222
  const layout = (0, _ramda.path)([
@@ -216,20 +224,79 @@ class DataPaint extends _basePaint.BasePaint {
216
224
  "updateTime"
217
225
  ], options);
218
226
  const { position } = layout;
219
- const top = this.painter.height - position.bottom;
220
- const left = position.left;
221
- ;
222
- this._drawText(options.data?.updateTime, {
223
- left: this._ratio(left),
227
+ const hasReferral = this.hasReferral(options);
228
+ let top = this.painter.height - position.bottom;
229
+ let left = this._ratio(position.left);
230
+ if (hasReferral) {
231
+ const metrics = this.drawDomainUrl(options, true);
232
+ // console.log("metrics", metrics);
233
+ left = this._ratio(this.painter.width) - metrics.width - this._ratio(8 + position.left);
234
+ top = this.painter.height - position.bottom;
235
+ // console.log("left", left, top, metrics.width, this._ratio(top));
236
+ }
237
+ this._drawText(!hasReferral ? options.data?.updateTime : `Share on ${options.data?.updateTime} |`, {
238
+ left,
224
239
  top: this._ratio(top),
240
+ // top: 536,
225
241
  fontSize: this._ratio(layout.fontSize),
226
242
  color: layout.color,
227
- textAlign: layout.textAlign,
243
+ // color: "red",
244
+ textAlign: !hasReferral ? layout.textAlign : "end",
228
245
  fontFamily: options.fontFamily,
229
246
  textBaseline: layout.textBaseline
230
247
  });
231
248
  }
232
- _drawText(str, options) {
249
+ drawReferralCode(options) {
250
+ if (!options.data?.referral) {
251
+ return;
252
+ }
253
+ const layout = (0, _ramda.path)([
254
+ "layout",
255
+ "updateTime"
256
+ ], options);
257
+ const { position } = layout;
258
+ const top = this.painter.height - (position.bottom ?? 0);
259
+ const messageLayout = (0, _ramda.path)([
260
+ "layout",
261
+ "message"
262
+ ], options);
263
+ const url = new URL(options.data.referral.link);
264
+ const searchParams = url.searchParams;
265
+ searchParams.append("ref", options.data.referral.code);
266
+ url.search = searchParams.toString();
267
+ (0, _qrPaint.qrPaint)(this.ctx, {
268
+ size: this._ratio(this.QRCODE_SIZE),
269
+ padding: this._ratio(2),
270
+ left: this._ratio(position.left),
271
+ top: this._ratio(top - this.QRCODE_SIZE),
272
+ data: `${url.toString()}`
273
+ });
274
+ this._drawText(options.data.referral.slogan, {
275
+ left: this._ratio(position.left + 66),
276
+ top: this._ratio(top - this.QRCODE_SIZE),
277
+ fontSize: this._ratio(14),
278
+ color: options.brandColor ?? this.DEFAULT_PROFIT_COLOR,
279
+ fontFamily: options.fontFamily,
280
+ textBaseline: "top"
281
+ });
282
+ this._drawText("Referral Code", {
283
+ left: this._ratio(position.left + 66),
284
+ top: this._ratio(top - 29),
285
+ fontSize: this._ratio(12),
286
+ color: layout.color,
287
+ fontFamily: options.fontFamily,
288
+ textBaseline: "middle"
289
+ });
290
+ this._drawText(options.data.referral.code, {
291
+ left: this._ratio(position.left + 66),
292
+ top: this._ratio(top),
293
+ fontSize: this._ratio(16),
294
+ color: messageLayout.color,
295
+ fontFamily: options.fontFamily,
296
+ textBaseline: "bottom"
297
+ });
298
+ }
299
+ _drawText(str, options, onlyMeasure = false) {
233
300
  let boundingBox;
234
301
  const { left = 30, top = 30, fontSize = 13, fontWeight = 500, color = "black", textBaseline = "middle", textAlign = "start" } = options ?? {};
235
302
  this.ctx.save();
@@ -239,10 +306,15 @@ class DataPaint extends _basePaint.BasePaint {
239
306
  this.ctx.textBaseline = textBaseline;
240
307
  this.ctx.textAlign = textAlign;
241
308
  boundingBox = this.ctx.measureText(str);
242
- this.ctx.fillText(str, left, top);
309
+ if (!onlyMeasure) {
310
+ this.ctx.fillText(str, left, top);
311
+ }
243
312
  this.ctx.restore();
244
313
  return boundingBox;
245
314
  }
315
+ hasReferral(options) {
316
+ return typeof options.data?.referral !== "undefined";
317
+ }
246
318
  _ratio(num) {
247
319
  return num * this.painter.ratio;
248
320
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/services/painter/dataPaint.ts"],"sourcesContent":["import { commify } from \"@orderly.network/utils\";\nimport { BasePaint, DrawOptions, layoutInfo } from \"./basePaint\";\nimport { path } from \"ramda\";\n\nexport class DataPaint extends BasePaint {\n private positionInfoCellWidth = 110;\n\n private DEFAULT_PROFIT_COLOR = \"rgb(0,181,159)\";\n private DEFAULT_LOSS_COLOR = \"rgb(255,103,194)\";\n\n private transformTop = 0;\n\n async draw(options: DrawOptions) {\n const needDrawDetails =\n Array.isArray(options.data?.position?.informations) &&\n (options.data?.position?.informations?.length ?? 0) > 0;\n\n // const hasMessage = !!options.data?.message;\n const hasMessage = true;\n\n this.transformTop = hasMessage ? 0 : needDrawDetails ? -40 : -150;\n\n // If position details are not displayed, the position PNL information will be margin\n // const offsetTop = hasMessage ? 50 : 100;\n const offsetTop = 100;\n // const offsetMessage = hasMessage ? 0 : -50;\n\n if (!!options.data?.message) {\n this.drawMessage(options);\n }\n\n if (!!options.data?.position) {\n this.drawPosition(options, needDrawDetails ? 0 : offsetTop);\n }\n\n if (needDrawDetails) {\n this.drawInformations(options);\n }\n\n this.drawUnrealizedPnL(options, needDrawDetails ? 0 : offsetTop);\n\n if (!!options.data?.domain) {\n this.drawDomainUrl(options);\n }\n\n if (typeof options.data?.updateTime !== \"undefined\") {\n this.drawPositionTime(options);\n }\n }\n\n private drawMessage(options: DrawOptions) {\n // console.log(\"draw message\", options);\n\n const layout = path<layoutInfo>(\n [\"layout\", \"message\"],\n options\n ) as layoutInfo;\n const { position } = layout;\n\n this._drawText(`\"${options.data?.message!}\"`, {\n color: layout.color,\n fontSize: this._ratio(layout.fontSize as number),\n top: this._ratio(position.top!),\n left: this._ratio(position.left!),\n textBaseline: \"top\",\n fontFamily: options.fontFamily,\n });\n }\n private drawPosition(options: DrawOptions, offsetTop: number = 0) {\n const layout = path<layoutInfo>(\n [\"layout\", \"position\"],\n options\n ) as layoutInfo;\n const { position, fontSize = 14 } = layout;\n let left = this._ratio(position.left!);\n\n let top = layout.position.top! + offsetTop + this.transformTop;\n let prevElementBoundingBox: TextMetrics = {} as TextMetrics;\n\n // draw position side;\n\n if (typeof options.data?.position.side !== \"undefined\") {\n prevElementBoundingBox = this._drawText(options.data.position.side, {\n color:\n options.data?.position.side.toUpperCase() === \"LONG\"\n ? this.DEFAULT_PROFIT_COLOR\n : this.DEFAULT_LOSS_COLOR,\n left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n });\n }\n\n if (typeof options.data?.position.symbol !== \"undefined\") {\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(7);\n\n if (prevElementBoundingBox.width) {\n prevElementBoundingBox = this._drawText(\"|\", {\n color: \"rgba(255,255,255,0.2)\",\n left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n });\n }\n\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(7);\n prevElementBoundingBox = this._drawText(options.data?.position.symbol!, {\n color: layout.color,\n left: left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n });\n }\n\n if (typeof options.data?.position.leverage !== \"undefined\") {\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(7);\n\n if (prevElementBoundingBox.width) {\n prevElementBoundingBox = this._drawText(\"|\", {\n color: \"rgba(255,255,255,0.2)\",\n left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n });\n }\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(7);\n prevElementBoundingBox = this._drawText(\n `${options.data?.position.leverage}X`,\n {\n color: layout.color,\n left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n }\n );\n }\n }\n\n private drawUnrealizedPnL(options: DrawOptions, offsetTop: number = 0) {\n // reset left value;\n const layout = path<layoutInfo>(\n [\"layout\", \"unrealizedPnl\"],\n options\n ) as layoutInfo & {\n secondaryColor: string;\n secondaryFontSize: number;\n };\n const { position } = layout;\n let left = this._ratio(position.left!);\n let prevElementBoundingBox: TextMetrics = {} as TextMetrics;\n\n const top = (position.top ?? 0) + offsetTop + this.transformTop;\n\n // ROI\n if (typeof options.data?.position.ROI !== \"undefined\") {\n const prefix = options.data?.position.ROI! > 0 ? \"+\" : \"\";\n prevElementBoundingBox = this._drawText(\n `${prefix}${commify(options.data?.position.ROI)}%`,\n {\n color:\n prefix === \"+\"\n ? options.profitColor || this.DEFAULT_PROFIT_COLOR\n : options.lossColor || this.DEFAULT_LOSS_COLOR,\n left,\n top: this._ratio(top),\n\n fontSize: this._ratio(layout.fontSize as number),\n fontWeight: 700,\n fontFamily: options.fontFamily,\n }\n );\n }\n // unrelPnL\n if (typeof options.data?.position.pnl !== \"undefined\") {\n const prefix = options.data?.position.pnl! > 0 ? \"+\" : \"\";\n let text = `${prefix}${commify(options.data?.position.pnl)} ${\n options.data?.position.currency\n }`;\n let fontWeight = 600;\n\n if (prevElementBoundingBox.width) {\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(8);\n text = `(${text})`;\n } else {\n left = this._ratio(position.left!);\n fontWeight = 700;\n }\n\n const color =\n typeof options.data.position.ROI === \"undefined\"\n ? prefix === \"+\"\n ? options.profitColor || this.DEFAULT_PROFIT_COLOR\n : options.lossColor || this.DEFAULT_LOSS_COLOR\n : layout.secondaryColor;\n\n const fontSize =\n typeof options.data.position.ROI === \"undefined\"\n ? this._ratio(layout.fontSize as number)\n : this._ratio(layout.secondaryFontSize as number);\n\n prevElementBoundingBox = this._drawText(text, {\n color,\n left,\n top: this._ratio(top),\n fontSize,\n fontWeight,\n fontFamily: options.fontFamily,\n });\n }\n }\n\n private drawInformations(options: DrawOptions) {\n const layout = path<layoutInfo>(\n [\"layout\", \"informations\"],\n options\n ) as layoutInfo & {\n labelColor?: string;\n };\n const { position } = layout;\n\n const isVertical = (options.data?.position.informations.length ?? 0) === 2;\n\n options.data?.position.informations.forEach((info, index) => {\n // let cellWidth = this.positionInfoCellWidth;\n let left = position.left! + (index % 2) * this.positionInfoCellWidth;\n // let top = (position.top as number) + (index / 2) * 38 + this.transformTop;\n let top =\n (position.top as number) +\n Math.floor(index / 2) * 38 +\n this.transformTop;\n\n this._drawText(info.title, {\n left: this._ratio(left),\n top: this._ratio(top),\n fontSize: this._ratio(10),\n color: layout.labelColor,\n fontFamily: options.fontFamily,\n });\n\n this._drawText(info.value, {\n left: this._ratio(left),\n top: this._ratio(top + 17),\n fontSize: this._ratio(layout.fontSize as number),\n fontWeight: 500,\n color: layout.color as string,\n fontFamily: options.fontFamily,\n });\n });\n }\n\n private drawDomainUrl(options: DrawOptions) {\n const layout = path<layoutInfo>(\n [\"layout\", \"domain\"],\n options\n ) as layoutInfo;\n const { position } = layout;\n const top = this.painter.height - position.bottom!;\n\n this._drawText(options.data?.domain!, {\n left: this._ratio(position.left!),\n top: this._ratio(top),\n fontSize: this._ratio(layout.fontSize as number),\n color: options.brandColor ?? this.DEFAULT_PROFIT_COLOR,\n fontFamily: options.fontFamily,\n textBaseline: layout.textBaseline,\n fontWeight: 600,\n });\n }\n\n private drawPositionTime(options: DrawOptions) {\n const layout = path<layoutInfo>(\n [\"layout\", \"updateTime\"],\n options\n ) as layoutInfo;\n const { position } = layout;\n const top = this.painter.height - position.bottom!;\n const left = position.left!;\n\n console.log(\"*******\", left, top, options.data?.updateTime);\n\n this._drawText(options.data?.updateTime!, {\n left: this._ratio(left),\n top: this._ratio(top),\n fontSize: this._ratio(layout.fontSize as number),\n color: layout.color as string,\n textAlign: layout.textAlign,\n fontFamily: options.fontFamily,\n textBaseline: layout.textBaseline,\n });\n }\n\n private _drawText(\n str: string,\n options?: {\n left?: number;\n top?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number;\n color?: string;\n textBaseline?: CanvasTextBaseline;\n textAlign?: CanvasTextAlign;\n }\n ): TextMetrics {\n let boundingBox: TextMetrics;\n const {\n left = 30,\n top = 30,\n fontSize = 13,\n fontWeight = 500,\n color = \"black\",\n textBaseline = \"middle\",\n textAlign = \"start\",\n } = options ?? {};\n\n this.ctx.save();\n // \"Nunito Sans\",-apple-system,\"San Francisco\",BlinkMacSystemFont,\"Segoe UI\",\"Helvetica Neue\",Helvetica,Arial,sans-serif\n this.ctx.font = `${fontWeight} ${fontSize}px ${options?.fontFamily}`;\n\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = textBaseline;\n this.ctx.textAlign = textAlign;\n boundingBox = this.ctx.measureText(str);\n\n this.ctx.fillText(str, left, top);\n this.ctx.restore();\n\n return boundingBox;\n }\n\n private _ratio(num: number) {\n return num * this.painter.ratio;\n }\n}\n"],"names":["DataPaint","BasePaint","positionInfoCellWidth","DEFAULT_PROFIT_COLOR","DEFAULT_LOSS_COLOR","transformTop","draw","options","needDrawDetails","Array","isArray","data","position","informations","length","hasMessage","offsetTop","message","drawMessage","drawPosition","drawInformations","drawUnrealizedPnL","domain","drawDomainUrl","updateTime","drawPositionTime","layout","path","_drawText","color","fontSize","_ratio","top","left","textBaseline","fontFamily","prevElementBoundingBox","side","toUpperCase","symbol","width","leverage","ROI","prefix","commify","profitColor","lossColor","fontWeight","pnl","text","currency","secondaryColor","secondaryFontSize","isVertical","forEach","info","index","Math","floor","title","labelColor","value","painter","height","bottom","brandColor","textAlign","str","boundingBox","ctx","save","font","fillStyle","measureText","fillText","restore","num","ratio"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/services/painter/dataPaint.ts"],"sourcesContent":["import { commify } from \"@orderly.network/utils\";\nimport { BasePaint, DrawOptions, layoutInfo } from \"./basePaint\";\nimport { path } from \"ramda\";\nimport { qrPaint } from \"./qrPaint\";\n\nexport class DataPaint extends BasePaint {\n private positionInfoCellWidth = 110;\n\n private DEFAULT_PROFIT_COLOR = \"rgb(0,181,159)\";\n private DEFAULT_LOSS_COLOR = \"rgb(255,103,194)\";\n\n private transformTop = 0;\n\n private QRCODE_SIZE = 56;\n\n async draw(options: DrawOptions) {\n const needDrawDetails =\n Array.isArray(options.data?.position?.informations) &&\n (options.data?.position?.informations?.length ?? 0) > 0;\n\n const hasReferral = this.hasReferral(options);\n\n // const hasMessage = !!options.data?.message;\n const hasMessage = true;\n\n this.transformTop = hasMessage ? 0 : needDrawDetails ? -40 : -150;\n\n // If position details are not displayed, the position PNL information will be margin\n // const offsetTop = hasMessage ? 50 : 100;\n const offsetTop = 0; // 100;\n // const offsetMessage = hasMessage ? 0 : -50;\n\n if (!!options.data?.message) {\n this.drawMessage(options);\n }\n\n if (!!options.data?.position) {\n this.drawPosition(\n options,\n needDrawDetails || hasReferral ? 0 : offsetTop\n );\n }\n\n if (needDrawDetails) {\n this.drawInformations(options);\n }\n\n this.drawUnrealizedPnL(\n options,\n needDrawDetails || hasReferral ? 0 : offsetTop\n );\n\n if (!!options.data?.domain) {\n this.drawDomainUrl(options);\n }\n\n if (typeof options.data?.updateTime !== \"undefined\") {\n this.drawPositionTime(options);\n }\n\n if (typeof options.data?.referral !== \"undefined\") {\n this.drawReferralCode(options);\n }\n }\n\n private drawMessage(options: DrawOptions) {\n // console.log(\"draw message\", options);\n\n const layout = path<layoutInfo>(\n [\"layout\", \"message\"],\n options\n ) as layoutInfo;\n const { position } = layout;\n\n this._drawText(`\"${options.data?.message!}\"`, {\n color: layout.color,\n fontSize: this._ratio(layout.fontSize as number),\n top: this._ratio(position.top!),\n left: this._ratio(position.left!),\n textBaseline: \"top\",\n fontFamily: options.fontFamily,\n });\n }\n private drawPosition(options: DrawOptions, offsetTop: number = 0) {\n const layout = path<layoutInfo>(\n [\"layout\", \"position\"],\n options\n ) as layoutInfo;\n const { position, fontSize = 14 } = layout;\n let left = this._ratio(position.left!);\n\n let top = layout.position.top! + offsetTop + this.transformTop;\n let prevElementBoundingBox: TextMetrics = {} as TextMetrics;\n\n // draw position side;\n\n if (typeof options.data?.position.side !== \"undefined\") {\n prevElementBoundingBox = this._drawText(options.data.position.side, {\n color:\n options.data?.position.side.toUpperCase() === \"LONG\"\n ? this.DEFAULT_PROFIT_COLOR\n : this.DEFAULT_LOSS_COLOR,\n left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n });\n }\n\n if (typeof options.data?.position.symbol !== \"undefined\") {\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(7);\n\n if (prevElementBoundingBox.width) {\n prevElementBoundingBox = this._drawText(\"|\", {\n color: \"rgba(255,255,255,0.2)\",\n left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n });\n }\n\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(7);\n prevElementBoundingBox = this._drawText(options.data?.position.symbol!, {\n color: layout.color,\n left: left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n });\n }\n\n if (typeof options.data?.position.leverage !== \"undefined\") {\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(7);\n\n if (prevElementBoundingBox.width) {\n prevElementBoundingBox = this._drawText(\"|\", {\n color: \"rgba(255,255,255,0.2)\",\n left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n });\n }\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(7);\n prevElementBoundingBox = this._drawText(\n `${options.data?.position.leverage}X`,\n {\n color: layout.color,\n left,\n top: this._ratio(top),\n fontSize: this._ratio(fontSize),\n fontFamily: options.fontFamily,\n }\n );\n }\n }\n\n private drawUnrealizedPnL(options: DrawOptions, offsetTop: number = 0) {\n // reset left value;\n const layout = path<layoutInfo>(\n [\"layout\", \"unrealizedPnl\"],\n options\n ) as layoutInfo & {\n secondaryColor: string;\n secondaryFontSize: number;\n };\n const { position } = layout;\n let left = this._ratio(position.left!);\n let prevElementBoundingBox: TextMetrics = {} as TextMetrics;\n\n const top = (position.top ?? 0) + offsetTop + this.transformTop;\n\n // ROI\n if (typeof options.data?.position.ROI !== \"undefined\") {\n const prefix = options.data?.position.ROI! > 0 ? \"+\" : \"\";\n prevElementBoundingBox = this._drawText(\n `${prefix}${commify(options.data?.position.ROI)}%`,\n {\n color:\n prefix === \"+\"\n ? options.profitColor || this.DEFAULT_PROFIT_COLOR\n : options.lossColor || this.DEFAULT_LOSS_COLOR,\n left,\n top: this._ratio(top),\n\n fontSize: this._ratio(layout.fontSize as number),\n fontWeight: 700,\n fontFamily: options.fontFamily,\n }\n );\n }\n // unrelPnL\n if (typeof options.data?.position.pnl !== \"undefined\") {\n const prefix = options.data?.position.pnl! > 0 ? \"+\" : \"\";\n let text = `${prefix}${commify(options.data?.position.pnl)} ${\n options.data?.position.currency\n }`;\n let fontWeight = 600;\n\n if (prevElementBoundingBox.width) {\n left += (prevElementBoundingBox.width ?? 0) + this._ratio(8);\n text = `(${text})`;\n } else {\n left = this._ratio(position.left!);\n fontWeight = 700;\n }\n\n const color =\n typeof options.data.position.ROI === \"undefined\"\n ? prefix === \"+\"\n ? options.profitColor || this.DEFAULT_PROFIT_COLOR\n : options.lossColor || this.DEFAULT_LOSS_COLOR\n : layout.secondaryColor;\n\n const fontSize =\n typeof options.data.position.ROI === \"undefined\"\n ? this._ratio(layout.fontSize as number)\n : this._ratio(layout.secondaryFontSize as number);\n\n prevElementBoundingBox = this._drawText(text, {\n color,\n left,\n top: this._ratio(top),\n fontSize,\n fontWeight,\n fontFamily: options.fontFamily,\n });\n }\n }\n\n private drawInformations(options: DrawOptions) {\n const layout = path<layoutInfo>(\n [\"layout\", \"informations\"],\n options\n ) as layoutInfo & {\n labelColor?: string;\n };\n const { position } = layout;\n\n const isVertical = (options.data?.position.informations.length ?? 0) === 2;\n\n options.data?.position.informations.forEach((info, index) => {\n // let cellWidth = this.positionInfoCellWidth;\n let left = position.left! + (index % 2) * this.positionInfoCellWidth;\n // let top = (position.top as number) + (index / 2) * 38 + this.transformTop;\n let top =\n (position.top as number) +\n Math.floor(index / 2) * 38 +\n this.transformTop;\n\n this._drawText(info.title, {\n left: this._ratio(left),\n top: this._ratio(top),\n fontSize: this._ratio(10),\n color: layout.labelColor,\n fontFamily: options.fontFamily,\n });\n\n this._drawText(info.value, {\n left: this._ratio(left),\n top: this._ratio(top + 17),\n fontSize: this._ratio(layout.fontSize as number),\n fontWeight: 500,\n color: layout.color as string,\n fontFamily: options.fontFamily,\n });\n });\n }\n\n private drawDomainUrl(options: DrawOptions, onlyMeasure: boolean = false) {\n const layout = path<layoutInfo>(\n [\"layout\", \"domain\"],\n options\n ) as layoutInfo;\n\n const hasReferral = this.hasReferral(options);\n\n const { position } = layout;\n const top = this.painter.height - position.bottom!;\n\n return this._drawText(\n options.data?.domain!,\n {\n left: !hasReferral\n ? this._ratio(position.left!)\n : this._ratio(this.painter.width - 20),\n top: !hasReferral\n ? this._ratio(top)\n : this._ratio(this.painter.height - 16),\n fontSize: this._ratio(layout.fontSize as number),\n color: options.brandColor ?? this.DEFAULT_PROFIT_COLOR,\n fontFamily: options.fontFamily,\n textBaseline: layout.textBaseline,\n textAlign: !hasReferral ? layout.textAlign : \"end\",\n fontWeight: 600,\n },\n onlyMeasure\n );\n }\n\n private drawPositionTime(options: DrawOptions) {\n const layout = path<layoutInfo>(\n [\"layout\", \"updateTime\"],\n options\n ) as layoutInfo;\n const { position } = layout;\n const hasReferral = this.hasReferral(options);\n\n let top = this.painter.height - position.bottom!;\n let left = this._ratio(position.left!);\n\n if (hasReferral) {\n const metrics = this.drawDomainUrl(options, true);\n // console.log(\"metrics\", metrics);\n left =\n this._ratio(this.painter.width) -\n metrics.width -\n this._ratio(8 + position.left!);\n top = this.painter.height - position.bottom!;\n // console.log(\"left\", left, top, metrics.width, this._ratio(top));\n }\n\n this._drawText(\n !hasReferral\n ? options.data?.updateTime!\n : `Share on ${options.data?.updateTime} |`,\n {\n left,\n top: this._ratio(top),\n // top: 536,\n fontSize: this._ratio(layout.fontSize as number),\n color: layout.color as string,\n // color: \"red\",\n textAlign: !hasReferral ? layout.textAlign : \"end\",\n fontFamily: options.fontFamily,\n textBaseline: layout.textBaseline,\n }\n );\n }\n\n private drawReferralCode(options: DrawOptions) {\n if (!options.data?.referral) {\n return;\n }\n\n const layout = path<layoutInfo>(\n [\"layout\", \"updateTime\"],\n options\n ) as layoutInfo;\n const { position } = layout;\n const top = this.painter.height - (position.bottom ?? 0);\n\n const messageLayout = path<layoutInfo>(\n [\"layout\", \"message\"],\n options\n ) as layoutInfo;\n\n const url = new URL(options.data.referral.link);\n\n const searchParams = url.searchParams;\n searchParams.append(\"ref\", options.data.referral.code);\n\n url.search = searchParams.toString();\n\n qrPaint(this.ctx, {\n size: this._ratio(this.QRCODE_SIZE),\n padding: this._ratio(2),\n left: this._ratio(position.left!),\n top: this._ratio(top - this.QRCODE_SIZE),\n data: `${url.toString()}`,\n });\n\n this._drawText(options.data.referral.slogan, {\n left: this._ratio(position.left! + 66),\n top: this._ratio(top - this.QRCODE_SIZE),\n fontSize: this._ratio(14),\n color: options.brandColor ?? this.DEFAULT_PROFIT_COLOR,\n fontFamily: options.fontFamily,\n textBaseline: \"top\",\n });\n\n this._drawText(\"Referral Code\", {\n left: this._ratio(position.left! + 66),\n top: this._ratio(top - 29),\n fontSize: this._ratio(12),\n color: layout.color as string,\n fontFamily: options.fontFamily,\n textBaseline: \"middle\",\n });\n\n this._drawText(options.data.referral.code, {\n left: this._ratio(position.left! + 66),\n top: this._ratio(top),\n fontSize: this._ratio(16),\n color: messageLayout.color as string,\n fontFamily: options.fontFamily,\n textBaseline: \"bottom\",\n });\n }\n\n private _drawText(\n str: string,\n options?: {\n left?: number;\n top?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: number;\n color?: string;\n textBaseline?: CanvasTextBaseline;\n textAlign?: CanvasTextAlign;\n },\n onlyMeasure: boolean = false\n ): TextMetrics {\n let boundingBox: TextMetrics;\n const {\n left = 30,\n top = 30,\n fontSize = 13,\n fontWeight = 500,\n color = \"black\",\n textBaseline = \"middle\",\n textAlign = \"start\",\n } = options ?? {};\n\n this.ctx.save();\n // \"Nunito Sans\",-apple-system,\"San Francisco\",BlinkMacSystemFont,\"Segoe UI\",\"Helvetica Neue\",Helvetica,Arial,sans-serif\n this.ctx.font = `${fontWeight} ${fontSize}px ${options?.fontFamily}`;\n\n this.ctx.fillStyle = color;\n this.ctx.textBaseline = textBaseline;\n this.ctx.textAlign = textAlign;\n boundingBox = this.ctx.measureText(str);\n\n if (!onlyMeasure) {\n this.ctx.fillText(str, left, top);\n }\n this.ctx.restore();\n\n return boundingBox;\n }\n\n private hasReferral(options: DrawOptions): boolean {\n return typeof options.data?.referral !== \"undefined\";\n }\n\n private _ratio(num: number) {\n return num * this.painter.ratio;\n }\n}\n"],"names":["DataPaint","BasePaint","positionInfoCellWidth","DEFAULT_PROFIT_COLOR","DEFAULT_LOSS_COLOR","transformTop","QRCODE_SIZE","draw","options","needDrawDetails","Array","isArray","data","position","informations","length","hasReferral","hasMessage","offsetTop","message","drawMessage","drawPosition","drawInformations","drawUnrealizedPnL","domain","drawDomainUrl","updateTime","drawPositionTime","referral","drawReferralCode","layout","path","_drawText","color","fontSize","_ratio","top","left","textBaseline","fontFamily","prevElementBoundingBox","side","toUpperCase","symbol","width","leverage","ROI","prefix","commify","profitColor","lossColor","fontWeight","pnl","text","currency","secondaryColor","secondaryFontSize","isVertical","forEach","info","index","Math","floor","title","labelColor","value","onlyMeasure","painter","height","bottom","brandColor","textAlign","metrics","messageLayout","url","URL","link","searchParams","append","code","search","toString","qrPaint","ctx","size","padding","slogan","str","boundingBox","save","font","fillStyle","measureText","fillText","restore","num","ratio"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -57,7 +57,7 @@ const DefaultLayoutConfig = {
57
57
  updateTime: {
58
58
  fontSize: 10,
59
59
  color: "rgba(255,255,255,0.3)",
60
- // textAlign: "end",
60
+ textAlign: "start",
61
61
  textBaseline: "bottom",
62
62
  position: {
63
63
  left: 20,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/services/painter/layout.config.ts"],"sourcesContent":["import { type PosterLayoutConfig } from \"./basePaint\";\n\nexport const DefaultLayoutConfig: PosterLayoutConfig = {\n domain: {\n fontSize: 13,\n // color: undefined,\n textBaseline: \"bottom\",\n position: {\n left: 20,\n bottom: 32,\n },\n },\n message: {\n fontSize: 20,\n color: \"rgba(255, 255, 255, 0.98)\",\n textBaseline: \"top\",\n position: {\n left: 20,\n top: 16,\n },\n },\n position: {\n fontSize: 14,\n color: \"rgba(255,255,255,0.98)\",\n position: {\n left: 20,\n top: 70,\n },\n },\n unrealizedPnl: {\n fontSize: 36,\n color: \"rgba(255,255,255,0.5)\",\n secondaryColor: \"rgba(255,255,255,0.54)\",\n secondaryFontSize: 20,\n position: {\n left: 20,\n top: 110,\n },\n },\n informations: {\n fontSize: 12,\n color: \"rgba(255, 255, 255, 0.8)\",\n labelColor: \"rgba(255,255,255,0.36)\",\n position: {\n left: 20,\n top: 150,\n },\n },\n\n updateTime: {\n fontSize: 10,\n color: \"rgba(255,255,255,0.3)\",\n // textAlign: \"end\",\n textBaseline: \"bottom\",\n position: {\n left: 20,\n bottom: 17,\n },\n },\n};\n"],"names":["DefaultLayoutConfig","domain","fontSize","textBaseline","position","left","bottom","message","color","top","unrealizedPnl","secondaryColor","secondaryFontSize","informations","labelColor","updateTime"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAEaA;;;eAAAA;;;AAAN,MAAMA,sBAA0C;IACrDC,QAAQ;QACNC,UAAU;QACV,oBAAoB;QACpBC,cAAc;QACdC,UAAU;YACRC,MAAM;YACNC,QAAQ;QACV;IACF;IACAC,SAAS;QACPL,UAAU;QACVM,OAAO;QACPL,cAAc;QACdC,UAAU;YACRC,MAAM;YACNI,KAAK;QACP;IACF;IACAL,UAAU;QACRF,UAAU;QACVM,OAAO;QACPJ,UAAU;YACRC,MAAM;YACNI,KAAK;QACP;IACF;IACAC,eAAe;QACbR,UAAU;QACVM,OAAO;QACPG,gBAAgB;QAChBC,mBAAmB;QACnBR,UAAU;YACRC,MAAM;YACNI,KAAK;QACP;IACF;IACAI,cAAc;QACZX,UAAU;QACVM,OAAO;QACPM,YAAY;QACZV,UAAU;YACRC,MAAM;YACNI,KAAK;QACP;IACF;IAEAM,YAAY;QACVb,UAAU;QACVM,OAAO;QACP,oBAAoB;QACpBL,cAAc;QACdC,UAAU;YACRC,MAAM;YACNC,QAAQ;QACV;IACF;AACF"}
1
+ {"version":3,"sources":["../../../src/services/painter/layout.config.ts"],"sourcesContent":["import { type PosterLayoutConfig } from \"./basePaint\";\n\nexport const DefaultLayoutConfig: PosterLayoutConfig = {\n domain: {\n fontSize: 13,\n // color: undefined,\n textBaseline: \"bottom\",\n position: {\n left: 20,\n bottom: 32,\n },\n },\n message: {\n fontSize: 20,\n color: \"rgba(255, 255, 255, 0.98)\",\n textBaseline: \"top\",\n position: {\n left: 20,\n top: 16,\n },\n },\n position: {\n fontSize: 14,\n color: \"rgba(255,255,255,0.98)\",\n position: {\n left: 20,\n top: 70,\n },\n },\n unrealizedPnl: {\n fontSize: 36,\n color: \"rgba(255,255,255,0.5)\",\n secondaryColor: \"rgba(255,255,255,0.54)\",\n secondaryFontSize: 20,\n position: {\n left: 20,\n top: 110,\n },\n },\n informations: {\n fontSize: 12,\n color: \"rgba(255, 255, 255, 0.8)\",\n labelColor: \"rgba(255,255,255,0.36)\",\n position: {\n left: 20,\n top: 150,\n },\n },\n\n updateTime: {\n fontSize: 10,\n color: \"rgba(255,255,255,0.3)\",\n textAlign: \"start\",\n textBaseline: \"bottom\",\n position: {\n left: 20,\n bottom: 17,\n },\n },\n};\n"],"names":["DefaultLayoutConfig","domain","fontSize","textBaseline","position","left","bottom","message","color","top","unrealizedPnl","secondaryColor","secondaryFontSize","informations","labelColor","updateTime","textAlign"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAEaA;;;eAAAA;;;AAAN,MAAMA,sBAA0C;IACrDC,QAAQ;QACNC,UAAU;QACV,oBAAoB;QACpBC,cAAc;QACdC,UAAU;YACRC,MAAM;YACNC,QAAQ;QACV;IACF;IACAC,SAAS;QACPL,UAAU;QACVM,OAAO;QACPL,cAAc;QACdC,UAAU;YACRC,MAAM;YACNI,KAAK;QACP;IACF;IACAL,UAAU;QACRF,UAAU;QACVM,OAAO;QACPJ,UAAU;YACRC,MAAM;YACNI,KAAK;QACP;IACF;IACAC,eAAe;QACbR,UAAU;QACVM,OAAO;QACPG,gBAAgB;QAChBC,mBAAmB;QACnBR,UAAU;YACRC,MAAM;YACNI,KAAK;QACP;IACF;IACAI,cAAc;QACZX,UAAU;QACVM,OAAO;QACPM,YAAY;QACZV,UAAU;YACRC,MAAM;YACNI,KAAK;QACP;IACF;IAEAM,YAAY;QACVb,UAAU;QACVM,OAAO;QACPQ,WAAW;QACXb,cAAc;QACdC,UAAU;YACRC,MAAM;YACNC,QAAQ;QACV;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"painter.d.ts","sourceRoot":"","sources":["../../../src/services/painter/painter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,qBAAa,aAAa;IAOtB,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,GAAG,CAA2B;IACtC,KAAK,EAAE,MAAM,CAAK;IAClB,MAAM,EAAE,MAAM,CAAK;IACnB,KAAK,EAAE,MAAM,CAAC;gBAGJ,MAAM,EAAE,iBAAiB,EACjC,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;KACf;IA2BH,IAAI,CAAC,OAAO,EAAE,WAAW;IAInB,KAAK,CAAC,OAAO,EAAE,WAAW;CAWjC"}
1
+ {"version":3,"file":"painter.d.ts","sourceRoot":"","sources":["../../../src/services/painter/painter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,qBAAa,aAAa;IAOtB,OAAO,CAAC,MAAM;IANhB,OAAO,CAAC,GAAG,CAA2B;IACtC,KAAK,EAAE,MAAM,CAAK;IAClB,MAAM,EAAE,MAAM,CAAK;IACnB,KAAK,EAAE,MAAM,CAAC;gBAGJ,MAAM,EAAE,iBAAiB,EACjC,OAAO,CAAC,EAAE;QACR,KAAK,EAAE,MAAM,CAAC;KACf;IA8BH,IAAI,CAAC,OAAO,EAAE,WAAW;IAInB,KAAK,CAAC,OAAO,EAAE,WAAW;CAWjC"}
@@ -25,8 +25,13 @@ class PosterPainter {
25
25
  this.ctx = this.canvas.getContext("2d");
26
26
  this.width = this.canvas.width;
27
27
  this.height = this.canvas.height;
28
- this.ratio = options?.ratio || (typeof window !== "undefined" ? Math.floor(window.devicePixelRatio) : 1) || 1;
29
- ;
28
+ // this.ratio =
29
+ // options?.ratio ||
30
+ // (typeof window !== "undefined"
31
+ // ? Math.ceil(window.devicePixelRatio)
32
+ // : 1) ||
33
+ // 1;
34
+ this.ratio = Math.max(options?.ratio || 1, typeof window !== "undefined" ? Math.ceil(window.devicePixelRatio) : 1);
30
35
  // render to high resolution
31
36
  this.canvas.width = this.width * this.ratio;
32
37
  this.canvas.height = this.height * this.ratio;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/services/painter/painter.ts"],"sourcesContent":["import { BackgroundPaint } from \"./backgroundPaint\";\nimport { DrawOptions } from \"./basePaint\";\nimport { DataPaint } from \"./dataPaint\";\nexport class PosterPainter {\n private ctx: CanvasRenderingContext2D;\n width: number = 0;\n height: number = 0;\n ratio: number;\n // resourceManager: Resource;\n constructor(\n private canvas: HTMLCanvasElement,\n options?: {\n ratio: number;\n }\n ) {\n // console.log(\"PosterPainter constructor\");\n\n this.ctx = this.canvas.getContext(\"2d\")!;\n\n this.width = this.canvas.width;\n this.height = this.canvas.height;\n\n this.ratio =\n options?.ratio ||\n (typeof window !== \"undefined\"\n ? Math.floor(window.devicePixelRatio)\n : 1) ||\n 1;\n\n console.log(\"this ratio\", this.ratio);\n\n // render to high resolution\n this.canvas.width = this.width * this.ratio;\n this.canvas.height = this.height * this.ratio;\n this.canvas.style.width = this.width + \"px\";\n this.canvas.style.height = this.height + \"px\";\n\n //\n }\n\n draw(options: DrawOptions) {\n requestAnimationFrame(() => this._draw.bind(this)(options));\n }\n\n async _draw(options: DrawOptions) {\n if (this.ctx === null) return;\n // console.log(\"============ DRAW ============\");\n // this.ctx.font = options.fontFamily!;\n // this.ctx.clearRect(0, 0, this.width * this.ratio, this.height * this.ratio);\n // start draw\n // background\n await new BackgroundPaint(this.ctx, this).draw(options);\n // data paint\n await new DataPaint(this.ctx, this).draw(options);\n }\n}\n"],"names":["PosterPainter","ctx","width","height","ratio","constructor","canvas","options","getContext","window","Math","floor","devicePixelRatio","style","draw","requestAnimationFrame","_draw","bind","BackgroundPaint","DataPaint"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAGaA;;;eAAAA;;;iCAHmB;2BAEN;AACnB,MAAMA;;IACHC,IAA8B;IACtCC,MAAkB;IAClBC,OAAmB;IACnBC,MAAc;IACd,6BAA6B;IAC7BC,YACE,AAAQC,MAAyB,EACjCC,OAEC,CACD;aAJQD,SAAAA;aALVJ,QAAgB;aAChBC,SAAiB;QASf,4CAA4C;QAE5C,IAAI,CAACF,GAAG,GAAG,IAAI,CAACK,MAAM,CAACE,UAAU,CAAC;QAElC,IAAI,CAACN,KAAK,GAAG,IAAI,CAACI,MAAM,CAACJ,KAAK;QAC9B,IAAI,CAACC,MAAM,GAAG,IAAI,CAACG,MAAM,CAACH,MAAM;QAEhC,IAAI,CAACC,KAAK,GACRG,SAASH,SACR,CAAA,OAAOK,WAAW,cACfC,KAAKC,KAAK,CAACF,OAAOG,gBAAgB,IAClC,CAAA,KACJ;;QAIF,4BAA4B;QAC5B,IAAI,CAACN,MAAM,CAACJ,KAAK,GAAG,IAAI,CAACA,KAAK,GAAG,IAAI,CAACE,KAAK;QAC3C,IAAI,CAACE,MAAM,CAACH,MAAM,GAAG,IAAI,CAACA,MAAM,GAAG,IAAI,CAACC,KAAK;QAC7C,IAAI,CAACE,MAAM,CAACO,KAAK,CAACX,KAAK,GAAG,IAAI,CAACA,KAAK,GAAG;QACvC,IAAI,CAACI,MAAM,CAACO,KAAK,CAACV,MAAM,GAAG,IAAI,CAACA,MAAM,GAAG;IAEzC,EAAE;IACJ;IAEAW,KAAKP,OAAoB,EAAE;QACzBQ,sBAAsB,IAAM,IAAI,CAACC,KAAK,CAACC,IAAI,CAAC,IAAI,EAAEV;IACpD;IAEA,MAAMS,MAAMT,OAAoB,EAAE;QAChC,IAAI,IAAI,CAACN,GAAG,KAAK,MAAM;QACvB,iDAAiD;QACjD,uCAAuC;QACvC,+EAA+E;QAC/E,aAAa;QACb,aAAa;QACb,MAAM,IAAIiB,gCAAe,CAAC,IAAI,CAACjB,GAAG,EAAE,IAAI,EAAEa,IAAI,CAACP;QAC/C,aAAa;QACb,MAAM,IAAIY,oBAAS,CAAC,IAAI,CAAClB,GAAG,EAAE,IAAI,EAAEa,IAAI,CAACP;IAC3C;AACF"}
1
+ {"version":3,"sources":["../../../src/services/painter/painter.ts"],"sourcesContent":["import { BackgroundPaint } from \"./backgroundPaint\";\nimport { DrawOptions } from \"./basePaint\";\nimport { DataPaint } from \"./dataPaint\";\nexport class PosterPainter {\n private ctx: CanvasRenderingContext2D;\n width: number = 0;\n height: number = 0;\n ratio: number;\n // resourceManager: Resource;\n constructor(\n private canvas: HTMLCanvasElement,\n options?: {\n ratio: number;\n }\n ) {\n // console.log(\"PosterPainter constructor\");\n\n this.ctx = this.canvas.getContext(\"2d\")!;\n\n this.width = this.canvas.width;\n this.height = this.canvas.height;\n\n // this.ratio =\n // options?.ratio ||\n // (typeof window !== \"undefined\"\n // ? Math.ceil(window.devicePixelRatio)\n // : 1) ||\n // 1;\n\n this.ratio = Math.max(\n options?.ratio || 1,\n typeof window !== \"undefined\" ? Math.ceil(window.devicePixelRatio) : 1\n );\n\n // render to high resolution\n this.canvas.width = this.width * this.ratio;\n this.canvas.height = this.height * this.ratio;\n this.canvas.style.width = this.width + \"px\";\n this.canvas.style.height = this.height + \"px\";\n\n //\n }\n\n draw(options: DrawOptions) {\n requestAnimationFrame(() => this._draw.bind(this)(options));\n }\n\n async _draw(options: DrawOptions) {\n if (this.ctx === null) return;\n // console.log(\"============ DRAW ============\");\n // this.ctx.font = options.fontFamily!;\n // this.ctx.clearRect(0, 0, this.width * this.ratio, this.height * this.ratio);\n // start draw\n // background\n await new BackgroundPaint(this.ctx, this).draw(options);\n // data paint\n await new DataPaint(this.ctx, this).draw(options);\n }\n}\n"],"names":["PosterPainter","ctx","width","height","ratio","constructor","canvas","options","getContext","Math","max","window","ceil","devicePixelRatio","style","draw","requestAnimationFrame","_draw","bind","BackgroundPaint","DataPaint"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAGaA;;;eAAAA;;;iCAHmB;2BAEN;AACnB,MAAMA;;IACHC,IAA8B;IACtCC,MAAkB;IAClBC,OAAmB;IACnBC,MAAc;IACd,6BAA6B;IAC7BC,YACE,AAAQC,MAAyB,EACjCC,OAEC,CACD;aAJQD,SAAAA;aALVJ,QAAgB;aAChBC,SAAiB;QASf,4CAA4C;QAE5C,IAAI,CAACF,GAAG,GAAG,IAAI,CAACK,MAAM,CAACE,UAAU,CAAC;QAElC,IAAI,CAACN,KAAK,GAAG,IAAI,CAACI,MAAM,CAACJ,KAAK;QAC9B,IAAI,CAACC,MAAM,GAAG,IAAI,CAACG,MAAM,CAACH,MAAM;QAEhC,eAAe;QACf,sBAAsB;QACtB,mCAAmC;QACnC,2CAA2C;QAC3C,cAAc;QACd,OAAO;QAEP,IAAI,CAACC,KAAK,GAAGK,KAAKC,GAAG,CACnBH,SAASH,SAAS,GAClB,OAAOO,WAAW,cAAcF,KAAKG,IAAI,CAACD,OAAOE,gBAAgB,IAAI;QAGvE,4BAA4B;QAC5B,IAAI,CAACP,MAAM,CAACJ,KAAK,GAAG,IAAI,CAACA,KAAK,GAAG,IAAI,CAACE,KAAK;QAC3C,IAAI,CAACE,MAAM,CAACH,MAAM,GAAG,IAAI,CAACA,MAAM,GAAG,IAAI,CAACC,KAAK;QAC7C,IAAI,CAACE,MAAM,CAACQ,KAAK,CAACZ,KAAK,GAAG,IAAI,CAACA,KAAK,GAAG;QACvC,IAAI,CAACI,MAAM,CAACQ,KAAK,CAACX,MAAM,GAAG,IAAI,CAACA,MAAM,GAAG;IAEzC,EAAE;IACJ;IAEAY,KAAKR,OAAoB,EAAE;QACzBS,sBAAsB,IAAM,IAAI,CAACC,KAAK,CAACC,IAAI,CAAC,IAAI,EAAEX;IACpD;IAEA,MAAMU,MAAMV,OAAoB,EAAE;QAChC,IAAI,IAAI,CAACN,GAAG,KAAK,MAAM;QACvB,iDAAiD;QACjD,uCAAuC;QACvC,+EAA+E;QAC/E,aAAa;QACb,aAAa;QACb,MAAM,IAAIkB,gCAAe,CAAC,IAAI,CAAClB,GAAG,EAAE,IAAI,EAAEc,IAAI,CAACR;QAC/C,aAAa;QACb,MAAM,IAAIa,oBAAS,CAAC,IAAI,CAACnB,GAAG,EAAE,IAAI,EAAEc,IAAI,CAACR;IAC3C;AACF"}
@@ -0,0 +1,8 @@
1
+ export declare const qrPaint: (ctx: CanvasRenderingContext2D, options: {
2
+ size: number;
3
+ padding: number;
4
+ left: number;
5
+ top: number;
6
+ data: string;
7
+ }) => void;
8
+ //# sourceMappingURL=qrPaint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qrPaint.d.ts","sourceRoot":"","sources":["../../../src/services/painter/qrPaint.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,OAAO,QACb,wBAAwB,WACpB;IACP,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,SAgDF,CAAC"}
@@ -0,0 +1,49 @@
1
+ //@ts-ignore
2
+ // import QRious from "./qrious";
3
+ "use strict";
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ Object.defineProperty(exports, "qrPaint", {
8
+ enumerable: true,
9
+ get: function() {
10
+ return qrPaint;
11
+ }
12
+ });
13
+ const _qr = require("@akamfoad/qr");
14
+ const qrPaint = (ctx, options)=>{
15
+ const { size, left, top, data, padding } = options;
16
+ const qr = (0, _qr.qrcode)(data);
17
+ const canvas = document.createElement("canvas");
18
+ canvas.width = size;
19
+ canvas.height = size;
20
+ const ctx2 = canvas.getContext("2d");
21
+ // const qr = new QRious({
22
+ // value: data,
23
+ // size: 200,
24
+ // padding: 5,
25
+ // level: "L",
26
+ // });
27
+ const cells = qr.modules;
28
+ if (!cells) {
29
+ return;
30
+ }
31
+ const tileW = size / cells.length;
32
+ const tileH = size / cells.length;
33
+ for(let r = 0; r < cells.length; ++r){
34
+ const row = cells[r];
35
+ for(let c = 0; c < row.length; ++c){
36
+ ctx2.fillStyle = row[c] ? "#000" : "#fff";
37
+ const w = Math.ceil((c + 1) * tileW) - Math.floor(c * tileW);
38
+ const h = Math.ceil((r + 1) * tileH) - Math.floor(r * tileH);
39
+ ctx2.fillRect(Math.round(c * tileW), Math.round(r * tileH), w, h);
40
+ }
41
+ }
42
+ ctx.save();
43
+ ctx.fillStyle = "#fff";
44
+ ctx.fillRect(left - padding, top - padding, size + padding * 2, size + padding * 2);
45
+ ctx.restore();
46
+ ctx.drawImage(canvas, left, top, size, size);
47
+ };
48
+
49
+ //# sourceMappingURL=qrPaint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/services/painter/qrPaint.ts"],"sourcesContent":["//@ts-ignore\n// import QRious from \"./qrious\";\nimport { qrcode } from \"@akamfoad/qr\";\n\nexport const qrPaint = (\n ctx: CanvasRenderingContext2D,\n options: {\n size: number;\n padding: number;\n left: number;\n top: number;\n data: string;\n }\n) => {\n const { size, left, top, data, padding } = options;\n\n const qr = qrcode(data);\n const canvas = document.createElement(\"canvas\");\n canvas.width = size;\n canvas.height = size;\n const ctx2 = canvas.getContext(\"2d\");\n\n // const qr = new QRious({\n // value: data,\n // size: 200,\n // padding: 5,\n // level: \"L\",\n // });\n\n const cells = qr.modules;\n\n if (!cells) {\n return;\n }\n\n const tileW = size / cells.length;\n const tileH = size / cells.length;\n\n for (let r = 0; r < cells.length; ++r) {\n const row = cells[r];\n for (let c = 0; c < row.length; ++c) {\n ctx2!.fillStyle = row[c] ? \"#000\" : \"#fff\";\n const w = Math.ceil((c + 1) * tileW) - Math.floor(c * tileW);\n const h = Math.ceil((r + 1) * tileH) - Math.floor(r * tileH);\n ctx2!.fillRect(Math.round(c * tileW), Math.round(r * tileH), w, h);\n }\n }\n\n ctx.save();\n ctx.fillStyle = \"#fff\";\n\n ctx.fillRect(\n left - padding,\n top - padding,\n size + padding * 2,\n size + padding * 2\n );\n ctx.restore();\n\n ctx.drawImage(canvas, left, top, size, size);\n};\n"],"names":["qrPaint","ctx","options","size","left","top","data","padding","qr","qrcode","canvas","document","createElement","width","height","ctx2","getContext","cells","modules","tileW","length","tileH","r","row","c","fillStyle","w","Math","ceil","floor","h","fillRect","round","save","restore","drawImage"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,YAAY;AACZ,iCAAiC;;;;;+BAGpBA;;;eAAAA;;;oBAFU;AAEhB,MAAMA,UAAU,CACrBC,KACAC;IAQA,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,GAAG,EAAEC,IAAI,EAAEC,OAAO,EAAE,GAAGL;IAE3C,MAAMM,KAAKC,IAAAA,UAAM,EAACH;IAClB,MAAMI,SAASC,SAASC,aAAa,CAAC;IACtCF,OAAOG,KAAK,GAAGV;IACfO,OAAOI,MAAM,GAAGX;IAChB,MAAMY,OAAOL,OAAOM,UAAU,CAAC;IAE/B,0BAA0B;IAC1B,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,gBAAgB;IAChB,MAAM;IAEN,MAAMC,QAAQT,GAAGU,OAAO;IAExB,IAAI,CAACD,OAAO;QACV;IACF;IAEA,MAAME,QAAQhB,OAAOc,MAAMG,MAAM;IACjC,MAAMC,QAAQlB,OAAOc,MAAMG,MAAM;IAEjC,IAAK,IAAIE,IAAI,GAAGA,IAAIL,MAAMG,MAAM,EAAE,EAAEE,EAAG;QACrC,MAAMC,MAAMN,KAAK,CAACK,EAAE;QACpB,IAAK,IAAIE,IAAI,GAAGA,IAAID,IAAIH,MAAM,EAAE,EAAEI,EAAG;YACnCT,KAAMU,SAAS,GAAGF,GAAG,CAACC,EAAE,GAAG,SAAS;YACpC,MAAME,IAAIC,KAAKC,IAAI,CAAC,AAACJ,CAAAA,IAAI,CAAA,IAAKL,SAASQ,KAAKE,KAAK,CAACL,IAAIL;YACtD,MAAMW,IAAIH,KAAKC,IAAI,CAAC,AAACN,CAAAA,IAAI,CAAA,IAAKD,SAASM,KAAKE,KAAK,CAACP,IAAID;YACtDN,KAAMgB,QAAQ,CAACJ,KAAKK,KAAK,CAACR,IAAIL,QAAQQ,KAAKK,KAAK,CAACV,IAAID,QAAQK,GAAGI;QAClE;IACF;IAEA7B,IAAIgC,IAAI;IACRhC,IAAIwB,SAAS,GAAG;IAEhBxB,IAAI8B,QAAQ,CACV3B,OAAOG,SACPF,MAAME,SACNJ,OAAOI,UAAU,GACjBJ,OAAOI,UAAU;IAEnBN,IAAIiC,OAAO;IAEXjC,IAAIkC,SAAS,CAACzB,QAAQN,MAAMC,KAAKF,MAAMA;AACzC"}
@@ -76,9 +76,9 @@ function useLocalStorage(key, initialValue) {
76
76
  }
77
77
  setStoredValue(readValue());
78
78
  };
79
- window.addEventListener("storage", handleStorageChange);
79
+ window?.addEventListener?.("storage", handleStorageChange);
80
80
  return ()=>{
81
- window.removeEventListener("storage", handleStorageChange);
81
+ window?.removeEventListener?.("storage", handleStorageChange);
82
82
  };
83
83
  }, [
84
84
  key
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useLocalStorage.ts"],"sourcesContent":["// https://usehooks-ts.com/react-hook/use-local-storage\nimport { useCallback, useEffect, useState } from \"react\";\nimport { parseJSON } from \"./utils/json\";\n\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T\n): [any, (value: T) => void] {\n // Get from local storage then\n // parse stored json or return initialValue\n const readValue = useCallback((): T => {\n // Prevent build error \"window is undefined\" but keeps working\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n\n try {\n const item = window.localStorage.getItem(key);\n return item ? (parseJSON(item) as T) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key “${key}”:`, error);\n return initialValue;\n }\n }, [initialValue, key]);\n\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState<T>(readValue);\n\n // Return a wrapped version of useState's setter function that ...\n // ... persists the new value to localStorage.\n const setValue: React.Dispatch<T> = useCallback(\n (value: T) => {\n // Prevent build error \"window is undefined\" but keeps working\n if (typeof window === \"undefined\") {\n console.warn(\n `Tried setting localStorage key “${key}” even though environment is not a client`\n );\n }\n\n try {\n // Allow value to be a function so we have the same API as useState\n const newValue = value instanceof Function ? value(storedValue) : value;\n\n // Save to local storage\n window.localStorage.setItem(key, JSON.stringify(newValue));\n // dispath event\n window.dispatchEvent(new Event(\"storage\"));\n\n // Save state\n setStoredValue(() => newValue);\n\n // We dispatch a custom event so every useLocalStorage hook are notified\n // window.dispatchEvent(new Event('local-storage'))\n } catch (error) {\n console.warn(`Error setting localStorage key “${key}”:`, error);\n }\n },\n [storedValue]\n );\n\n useEffect(() => {\n setStoredValue(readValue());\n }, []);\n\n // const handleStorageChange = useCallback(\n // (event: StorageEvent | CustomEvent) => {\n // if ((event as StorageEvent)?.key && (event as StorageEvent).key !== key) {\n // return\n // }\n // setStoredValue(readValue())\n // },\n // [key, readValue],\n // )\n\n useEffect(() => {\n const handleStorageChange = (event: StorageEvent | CustomEvent) => {\n if ((event as StorageEvent)?.key && (event as StorageEvent).key !== key) {\n return;\n }\n setStoredValue(readValue());\n };\n\n window.addEventListener(\"storage\", handleStorageChange);\n\n return () => {\n window.removeEventListener(\"storage\", handleStorageChange);\n };\n }, [key]);\n\n return [storedValue, setValue];\n}\n"],"names":["useLocalStorage","key","initialValue","readValue","useCallback","window","item","localStorage","getItem","parseJSON","error","storedValue","setStoredValue","useState","setValue","value","newValue","Function","setItem","JSON","stringify","dispatchEvent","Event","useEffect","handleStorageChange","event","addEventListener","removeEventListener"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,uDAAuD;;;;;+BAIvCA;;;eAAAA;;;uBAHiC;sBACvB;AAEnB,SAASA,gBACdC,GAAW,EACXC,YAAe;IAEf,8BAA8B;IAC9B,2CAA2C;IAC3C,MAAMC,YAAYC,IAAAA,kBAAW,EAAC;QAC5B,8DAA8D;QAC9D,IAAI,OAAOC,WAAW,aAAa;YACjC,OAAOH;QACT;QAEA,IAAI;YACF,MAAMI,OAAOD,OAAOE,YAAY,CAACC,OAAO,CAACP;YACzC,OAAOK,OAAQG,IAAAA,eAAS,EAACH,QAAcJ;QACzC,EAAE,OAAOQ,OAAO;;YAEd,OAAOR;QACT;IACF,GAAG;QAACA;QAAcD;KAAI;IAEtB,2BAA2B;IAC3B,yEAAyE;IACzE,MAAM,CAACU,aAAaC,eAAe,GAAGC,IAAAA,eAAQ,EAAIV;IAElD,kEAAkE;IAClE,8CAA8C;IAC9C,MAAMW,WAA8BV,IAAAA,kBAAW,EAC7C,CAACW;QACC,8DAA8D;QAC9D,IAAI,OAAOV,WAAW,aAAa;;QAInC;QAEA,IAAI;YACF,mEAAmE;YACnE,MAAMW,WAAWD,iBAAiBE,WAAWF,MAAMJ,eAAeI;YAElE,wBAAwB;YACxBV,OAAOE,YAAY,CAACW,OAAO,CAACjB,KAAKkB,KAAKC,SAAS,CAACJ;YAChD,gBAAgB;YAChBX,OAAOgB,aAAa,CAAC,IAAIC,MAAM;YAE/B,aAAa;YACbV,eAAe,IAAMI;QAErB,wEAAwE;QACxE,mDAAmD;QACrD,EAAE,OAAON,OAAO;;QAEhB;IACF,GACA;QAACC;KAAY;IAGfY,IAAAA,gBAAS,EAAC;QACRX,eAAeT;IACjB,GAAG,EAAE;IAEL,2CAA2C;IAC3C,6CAA6C;IAC7C,iFAAiF;IACjF,eAAe;IACf,QAAQ;IACR,kCAAkC;IAClC,OAAO;IACP,sBAAsB;IACtB,IAAI;IAEJoB,IAAAA,gBAAS,EAAC;QACR,MAAMC,sBAAsB,CAACC;YAC3B,IAAI,AAACA,OAAwBxB,OAAO,AAACwB,MAAuBxB,GAAG,KAAKA,KAAK;gBACvE;YACF;YACAW,eAAeT;QACjB;QAEAE,OAAOqB,gBAAgB,CAAC,WAAWF;QAEnC,OAAO;YACLnB,OAAOsB,mBAAmB,CAAC,WAAWH;QACxC;IACF,GAAG;QAACvB;KAAI;IAER,OAAO;QAACU;QAAaG;KAAS;AAChC"}
1
+ {"version":3,"sources":["../src/useLocalStorage.ts"],"sourcesContent":["// https://usehooks-ts.com/react-hook/use-local-storage\nimport { useCallback, useEffect, useState } from \"react\";\nimport { parseJSON } from \"./utils/json\";\n\nexport function useLocalStorage<T>(\n key: string,\n initialValue: T\n): [any, (value: T) => void] {\n // Get from local storage then\n // parse stored json or return initialValue\n const readValue = useCallback((): T => {\n // Prevent build error \"window is undefined\" but keeps working\n if (typeof window === \"undefined\") {\n return initialValue;\n }\n\n try {\n const item = window.localStorage.getItem(key);\n return item ? (parseJSON(item) as T) : initialValue;\n } catch (error) {\n console.warn(`Error reading localStorage key “${key}”:`, error);\n return initialValue;\n }\n }, [initialValue, key]);\n\n // State to store our value\n // Pass initial state function to useState so logic is only executed once\n const [storedValue, setStoredValue] = useState<T>(readValue);\n\n // Return a wrapped version of useState's setter function that ...\n // ... persists the new value to localStorage.\n const setValue: React.Dispatch<T> = useCallback(\n (value: T) => {\n // Prevent build error \"window is undefined\" but keeps working\n if (typeof window === \"undefined\") {\n console.warn(\n `Tried setting localStorage key “${key}” even though environment is not a client`\n );\n }\n\n try {\n // Allow value to be a function so we have the same API as useState\n const newValue = value instanceof Function ? value(storedValue) : value;\n\n // Save to local storage\n window.localStorage.setItem(key, JSON.stringify(newValue));\n // dispath event\n window.dispatchEvent(new Event(\"storage\"));\n\n // Save state\n setStoredValue(() => newValue);\n\n // We dispatch a custom event so every useLocalStorage hook are notified\n // window.dispatchEvent(new Event('local-storage'))\n } catch (error) {\n console.warn(`Error setting localStorage key “${key}”:`, error);\n }\n },\n [storedValue]\n );\n\n useEffect(() => {\n setStoredValue(readValue());\n }, []);\n\n // const handleStorageChange = useCallback(\n // (event: StorageEvent | CustomEvent) => {\n // if ((event as StorageEvent)?.key && (event as StorageEvent).key !== key) {\n // return\n // }\n // setStoredValue(readValue())\n // },\n // [key, readValue],\n // )\n\n useEffect(() => {\n const handleStorageChange = (event: StorageEvent | CustomEvent) => {\n if ((event as StorageEvent)?.key && (event as StorageEvent).key !== key) {\n return;\n }\n setStoredValue(readValue());\n };\n\n window?.addEventListener?.(\"storage\", handleStorageChange);\n\n return () => {\n window?.removeEventListener?.(\"storage\", handleStorageChange);\n };\n }, [key]);\n\n return [storedValue, setValue];\n}\n"],"names":["useLocalStorage","key","initialValue","readValue","useCallback","window","item","localStorage","getItem","parseJSON","error","storedValue","setStoredValue","useState","setValue","value","newValue","Function","setItem","JSON","stringify","dispatchEvent","Event","useEffect","handleStorageChange","event","addEventListener","removeEventListener"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,uDAAuD;;;;;+BAIvCA;;;eAAAA;;;uBAHiC;sBACvB;AAEnB,SAASA,gBACdC,GAAW,EACXC,YAAe;IAEf,8BAA8B;IAC9B,2CAA2C;IAC3C,MAAMC,YAAYC,IAAAA,kBAAW,EAAC;QAC5B,8DAA8D;QAC9D,IAAI,OAAOC,WAAW,aAAa;YACjC,OAAOH;QACT;QAEA,IAAI;YACF,MAAMI,OAAOD,OAAOE,YAAY,CAACC,OAAO,CAACP;YACzC,OAAOK,OAAQG,IAAAA,eAAS,EAACH,QAAcJ;QACzC,EAAE,OAAOQ,OAAO;;YAEd,OAAOR;QACT;IACF,GAAG;QAACA;QAAcD;KAAI;IAEtB,2BAA2B;IAC3B,yEAAyE;IACzE,MAAM,CAACU,aAAaC,eAAe,GAAGC,IAAAA,eAAQ,EAAIV;IAElD,kEAAkE;IAClE,8CAA8C;IAC9C,MAAMW,WAA8BV,IAAAA,kBAAW,EAC7C,CAACW;QACC,8DAA8D;QAC9D,IAAI,OAAOV,WAAW,aAAa;;QAInC;QAEA,IAAI;YACF,mEAAmE;YACnE,MAAMW,WAAWD,iBAAiBE,WAAWF,MAAMJ,eAAeI;YAElE,wBAAwB;YACxBV,OAAOE,YAAY,CAACW,OAAO,CAACjB,KAAKkB,KAAKC,SAAS,CAACJ;YAChD,gBAAgB;YAChBX,OAAOgB,aAAa,CAAC,IAAIC,MAAM;YAE/B,aAAa;YACbV,eAAe,IAAMI;QAErB,wEAAwE;QACxE,mDAAmD;QACrD,EAAE,OAAON,OAAO;;QAEhB;IACF,GACA;QAACC;KAAY;IAGfY,IAAAA,gBAAS,EAAC;QACRX,eAAeT;IACjB,GAAG,EAAE;IAEL,2CAA2C;IAC3C,6CAA6C;IAC7C,iFAAiF;IACjF,eAAe;IACf,QAAQ;IACR,kCAAkC;IAClC,OAAO;IACP,sBAAsB;IACtB,IAAI;IAEJoB,IAAAA,gBAAS,EAAC;QACR,MAAMC,sBAAsB,CAACC;YAC3B,IAAI,AAACA,OAAwBxB,OAAO,AAACwB,MAAuBxB,GAAG,KAAKA,KAAK;gBACvE;YACF;YACAW,eAAeT;QACjB;QAEAE,QAAQqB,mBAAmB,WAAWF;QAEtC,OAAO;YACLnB,QAAQsB,sBAAsB,WAAWH;QAC3C;IACF,GAAG;QAACvB;KAAI;IAER,OAAO;QAACU;QAAaG;KAAS;AAChC"}
@@ -22,20 +22,20 @@ function useMediaQuery(query) {
22
22
  setMatches(getMatches(query));
23
23
  }
24
24
  (0, _react.useEffect)(()=>{
25
- const matchMedia = window.matchMedia(query);
25
+ const matchMedia = window?.matchMedia(query);
26
26
  // Triggered at the first client-side load and if query changes
27
27
  handleChange();
28
28
  // Listen matchMedia
29
- if (matchMedia.addListener) {
30
- matchMedia.addListener(handleChange);
29
+ if (matchMedia?.addListener) {
30
+ matchMedia?.addListener(handleChange);
31
31
  } else {
32
- matchMedia.addEventListener("change", handleChange);
32
+ matchMedia?.addEventListener?.("change", handleChange);
33
33
  }
34
34
  return ()=>{
35
- if (matchMedia.removeListener) {
36
- matchMedia.removeListener(handleChange);
35
+ if (matchMedia?.removeListener) {
36
+ matchMedia?.removeListener(handleChange);
37
37
  } else {
38
- matchMedia.removeEventListener("change", handleChange);
38
+ matchMedia?.removeEventListener?.("change", handleChange);
39
39
  }
40
40
  };
41
41
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/useMediaQuery.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\nexport function useMediaQuery(query: string): boolean {\n const getMatches = (query: string): boolean => {\n // Prevents SSR issues\n if (typeof window !== \"undefined\") {\n return window.matchMedia(query).matches;\n }\n return false;\n };\n\n const [matches, setMatches] = useState<boolean>(getMatches(query));\n\n function handleChange() {\n setMatches(getMatches(query));\n }\n\n useEffect(() => {\n const matchMedia = window.matchMedia(query);\n\n // Triggered at the first client-side load and if query changes\n handleChange();\n\n // Listen matchMedia\n if (matchMedia.addListener) {\n matchMedia.addListener(handleChange);\n } else {\n matchMedia.addEventListener(\"change\", handleChange);\n }\n\n return () => {\n if (matchMedia.removeListener) {\n matchMedia.removeListener(handleChange);\n } else {\n matchMedia.removeEventListener(\"change\", handleChange);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n return matches;\n}\n"],"names":["useMediaQuery","query","getMatches","window","matchMedia","matches","setMatches","useState","handleChange","useEffect","addListener","addEventListener","removeListener","removeEventListener"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAEgBA;;;eAAAA;;;uBAFoB;AAE7B,SAASA,cAAcC,KAAa;IACzC,MAAMC,aAAa,CAACD;QAClB,sBAAsB;QACtB,IAAI,OAAOE,WAAW,aAAa;YACjC,OAAOA,OAAOC,UAAU,CAACH,OAAOI,OAAO;QACzC;QACA,OAAO;IACT;IAEA,MAAM,CAACA,SAASC,WAAW,GAAGC,IAAAA,eAAQ,EAAUL,WAAWD;IAE3D,SAASO;QACPF,WAAWJ,WAAWD;IACxB;IAEAQ,IAAAA,gBAAS,EAAC;QACR,MAAML,aAAaD,OAAOC,UAAU,CAACH;QAErC,+DAA+D;QAC/DO;QAEA,oBAAoB;QACpB,IAAIJ,WAAWM,WAAW,EAAE;YAC1BN,WAAWM,WAAW,CAACF;QACzB,OAAO;YACLJ,WAAWO,gBAAgB,CAAC,UAAUH;QACxC;QAEA,OAAO;YACL,IAAIJ,WAAWQ,cAAc,EAAE;gBAC7BR,WAAWQ,cAAc,CAACJ;YAC5B,OAAO;gBACLJ,WAAWS,mBAAmB,CAAC,UAAUL;YAC3C;QACF;IACA,uDAAuD;IACzD,GAAG;QAACP;KAAM;IAEV,OAAOI;AACT"}
1
+ {"version":3,"sources":["../src/useMediaQuery.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\nexport function useMediaQuery(query: string): boolean {\n const getMatches = (query: string): boolean => {\n // Prevents SSR issues\n if (typeof window !== \"undefined\") {\n return window.matchMedia(query).matches;\n }\n return false;\n };\n\n const [matches, setMatches] = useState<boolean>(getMatches(query));\n\n function handleChange() {\n setMatches(getMatches(query));\n }\n\n useEffect(() => {\n const matchMedia = window?.matchMedia(query);\n\n // Triggered at the first client-side load and if query changes\n handleChange();\n\n // Listen matchMedia\n if (matchMedia?.addListener) {\n matchMedia?.addListener(handleChange);\n } else {\n matchMedia?.addEventListener?.(\"change\", handleChange);\n }\n\n return () => {\n if (matchMedia?.removeListener) {\n matchMedia?.removeListener(handleChange);\n } else {\n matchMedia?.removeEventListener?.(\"change\", handleChange);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n return matches;\n}\n"],"names":["useMediaQuery","query","getMatches","window","matchMedia","matches","setMatches","useState","handleChange","useEffect","addListener","addEventListener","removeListener","removeEventListener"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAEgBA;;;eAAAA;;;uBAFoB;AAE7B,SAASA,cAAcC,KAAa;IACzC,MAAMC,aAAa,CAACD;QAClB,sBAAsB;QACtB,IAAI,OAAOE,WAAW,aAAa;YACjC,OAAOA,OAAOC,UAAU,CAACH,OAAOI,OAAO;QACzC;QACA,OAAO;IACT;IAEA,MAAM,CAACA,SAASC,WAAW,GAAGC,IAAAA,eAAQ,EAAUL,WAAWD;IAE3D,SAASO;QACPF,WAAWJ,WAAWD;IACxB;IAEAQ,IAAAA,gBAAS,EAAC;QACR,MAAML,aAAaD,QAAQC,WAAWH;QAEtC,+DAA+D;QAC/DO;QAEA,oBAAoB;QACpB,IAAIJ,YAAYM,aAAa;YAC3BN,YAAYM,YAAYF;QAC1B,OAAO;YACLJ,YAAYO,mBAAmB,UAAUH;QAC3C;QAEA,OAAO;YACL,IAAIJ,YAAYQ,gBAAgB;gBAC9BR,YAAYQ,eAAeJ;YAC7B,OAAO;gBACLJ,YAAYS,sBAAsB,UAAUL;YAC9C;QACF;IACA,uDAAuD;IACzD,GAAG;QAACP;KAAM;IAEV,OAAOI;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"usePoster.d.ts","sourceRoot":"","sources":["../src/usePoster.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS,SAId,WAAW,YACP;IACR;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;IA8GC;;OAEG;wBAnDa,iBAAiB,GAAG,IAAI;IAqDxC;;OAEG;gCA9EqB,MAAM,mBAAmB,MAAM;IAgFvD;;OAEG;6BAvEK,MAAM,mBAAmB,MAAM,KAAG,QAAQ,IAAI,GAAG,IAAI,CAAC;IAyE9D;;OAEG;kCApDQ,MAAM,SAAQ,MAAM,mBAAiC,MAAM;IAsDtE;;OAEG;;;CAIN,CAAC"}
1
+ {"version":3,"file":"usePoster.d.ts","sourceRoot":"","sources":["../src/usePoster.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAIhE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,SAAS,SAId,WAAW,YACP;IACR;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;IAiHC;;OAEG;wBAnDa,iBAAiB,GAAG,IAAI;IAqDxC;;OAEG;gCA9EqB,MAAM,mBAAmB,MAAM;IAgFvD;;OAEG;6BAvEK,MAAM,mBAAmB,MAAM,KAAG,QAAQ,IAAI,GAAG,IAAI,CAAC;IAyE9D;;OAEG;kCApDQ,MAAM,SAAQ,MAAM,mBAAiC,MAAM;IAsDtE;;OAEG;;;CAIN,CAAC"}
package/lib/usePoster.js CHANGED
@@ -22,29 +22,32 @@ const usePoster = (/**
22
22
  const [target, setTarget] = (0, _react.useState)(null);
23
23
  (0, _react.useEffect)(()=>{
24
24
  // Create the painter instance
25
- if (target && !painterRef.current) {
26
- painterRef.current = new _painter.PosterPainter(target, {
27
- ratio: 1,
28
- ...options
29
- });
30
- painterRef.current.draw((0, _ramda.mergeDeepRight)({
31
- layout: _layoutconfig.DefaultLayoutConfig,
32
- fontFamily: "Manrope"
33
- }, data));
34
- }
35
- }, [
36
- target
37
- ]);
38
- (0, _react.useEffect)(()=>{
39
- if (painterRef.current) {
25
+ if (target) {
26
+ if (!painterRef.current) {
27
+ painterRef.current = new _painter.PosterPainter(target, {
28
+ ratio: options?.ratio || 1,
29
+ ...options
30
+ });
31
+ }
40
32
  painterRef.current.draw((0, _ramda.mergeDeepRight)({
41
33
  layout: _layoutconfig.DefaultLayoutConfig,
42
34
  fontFamily: "Manrope"
43
35
  }, data));
44
36
  }
45
37
  }, [
38
+ target,
46
39
  data
47
40
  ]);
41
+ // useEffect(() => {
42
+ // if (painterRef.current) {
43
+ // painterRef.current.draw(
44
+ // mergeDeepRight<Partial<DrawOptions>, DrawOptions>(
45
+ // { layout: DefaultLayoutConfig, fontFamily: "Manrope" },
46
+ // data
47
+ // )
48
+ // );
49
+ // }
50
+ // }, [data]);
48
51
  const toDataURL = (type, encoderOptions)=>{
49
52
  if (!target) {
50
53
  throw new _types.SDKError("The ref must be a canvas element");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/usePoster.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { mergeDeepRight } from \"ramda\";\nimport { PosterPainter } from \"./services/painter/painter\";\nimport { type DrawOptions } from \"./services/painter/basePaint\";\nimport { DefaultLayoutConfig } from \"./services/painter/layout.config\";\nimport { SDKError } from \"@orderly.network/types\";\n\n/**\n * Generates a poster image based on position information. You can set the size, background color, font color, font size, and content position of the poster.\n * @example\n * ```tsx\n * const { ref, toDataURL, toBlob, download, copy } = usePoster({\n * backgroundColor: \"#0b8c70\",\n * backgroundImg: \"/images/poster_bg.png\",\n * color: \"rgba(255, 255, 255, 0.98)\",\n * profitColor: \"rgb(0,181,159)\",\n * ...\n * });\n */\nexport const usePoster = (\n /**\n * The options to draw the poster\n */\n data: DrawOptions,\n options?: {\n /**\n * The ratio of the poster\n */\n ratio?: number;\n }\n) => {\n const [error, setError] = useState<Error | null>(null);\n const [canCopy, setCanCopy] = useState<boolean>(\n () => typeof navigator.clipboard !== \"undefined\"\n );\n\n const painterRef = useRef<PosterPainter | null>(null);\n\n const [target, setTarget] = useState<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n // Create the painter instance\n if (target && !painterRef.current) {\n painterRef.current = new PosterPainter(target, {\n ratio: 1,\n ...options,\n });\n painterRef.current.draw(\n mergeDeepRight<Partial<DrawOptions>, DrawOptions>(\n { layout: DefaultLayoutConfig, fontFamily: \"Manrope\" },\n data\n )\n );\n }\n }, [target]);\n\n useEffect(() => {\n if (painterRef.current) {\n painterRef.current.draw(\n mergeDeepRight<Partial<DrawOptions>, DrawOptions>(\n { layout: DefaultLayoutConfig, fontFamily: \"Manrope\" },\n data\n )\n );\n }\n }, [data]);\n\n const toDataURL = (type?: string, encoderOptions?: number) => {\n if (!target) {\n throw new SDKError(\"The ref must be a canvas element\");\n }\n return target.toDataURL(type, encoderOptions);\n };\n\n /**\n * Converts the poster to a blob\n */\n const toBlob = useCallback(\n (type?: string, encoderOptions?: number): Promise<Blob | null> => {\n return new Promise<Blob | null>((resolve) => {\n if (!target) {\n resolve(null);\n return;\n }\n target.toBlob(resolve, type, encoderOptions);\n });\n },\n [target]\n );\n\n const ref = (ref: HTMLCanvasElement | null) => {\n if (!ref) return;\n if (ref.tagName.toUpperCase() !== \"CANVAS\") {\n // throw new Error(\"The ref must be a canvas element\");\n setError(new SDKError(\"The ref must be a canvas element\"));\n return;\n }\n setTarget(ref);\n };\n\n const download = useCallback(\n (filename: string, type: string = \"image/png\", encoderOptions?: number) => {\n if (!target) {\n throw new SDKError(\"The ref must be a canvas element\");\n }\n const img = new Image();\n img.src = target.toDataURL(type, encoderOptions);\n const link = document.createElement(\"a\");\n link.href = img.src;\n link.download = filename;\n link.click();\n },\n [target]\n );\n\n const copy = useCallback(() => {\n if (!target) {\n throw new SDKError(\"The ref must be a canvas element\");\n }\n // copy image to clipboard\n return new Promise<void>((resolve, reject) => {\n if (!navigator.clipboard) {\n reject(new SDKError(\"Clipboard API is not supported\"));\n return;\n }\n target.toBlob((blob) => {\n if (!blob) {\n reject(new SDKError(\"Failed to create blob\"));\n return;\n }\n return navigator.clipboard\n .write([new ClipboardItem({ [blob.type]: blob })])\n .then(resolve, reject);\n });\n });\n }, [target]);\n\n return {\n error,\n /**\n * The ref to the canvas element, you should pass this ref to the canvas element\n */\n ref,\n /**\n * Converts the poster to a data URL\n */\n toDataURL,\n /**\n * Converts the poster to a blob\n */\n toBlob,\n /**\n * Downloads the poster as an image\n */\n download,\n /**\n * Browser if supports copy image to clipboard\n */\n canCopy,\n copy,\n } as const;\n};\n"],"names":["usePoster","data","options","error","setError","useState","canCopy","setCanCopy","navigator","clipboard","painterRef","useRef","target","setTarget","useEffect","current","PosterPainter","ratio","draw","mergeDeepRight","layout","DefaultLayoutConfig","fontFamily","toDataURL","type","encoderOptions","SDKError","toBlob","useCallback","Promise","resolve","ref","tagName","toUpperCase","download","filename","img","Image","src","link","document","createElement","href","click","copy","reject","blob","write","ClipboardItem","then"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../src/usePoster.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { mergeDeepRight } from \"ramda\";\nimport { PosterPainter } from \"./services/painter/painter\";\nimport { type DrawOptions } from \"./services/painter/basePaint\";\nimport { DefaultLayoutConfig } from \"./services/painter/layout.config\";\nimport { SDKError } from \"@orderly.network/types\";\n\n/**\n * Generates a poster image based on position information. You can set the size, background color, font color, font size, and content position of the poster.\n * @example\n * ```tsx\n * const { ref, toDataURL, toBlob, download, copy } = usePoster({\n * backgroundColor: \"#0b8c70\",\n * backgroundImg: \"/images/poster_bg.png\",\n * color: \"rgba(255, 255, 255, 0.98)\",\n * profitColor: \"rgb(0,181,159)\",\n * ...\n * });\n */\nexport const usePoster = (\n /**\n * The options to draw the poster\n */\n data: DrawOptions,\n options?: {\n /**\n * The ratio of the poster\n */\n ratio?: number;\n }\n) => {\n const [error, setError] = useState<Error | null>(null);\n const [canCopy, setCanCopy] = useState<boolean>(\n () => typeof navigator.clipboard !== \"undefined\"\n );\n\n const painterRef = useRef<PosterPainter | null>(null);\n\n const [target, setTarget] = useState<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n // Create the painter instance\n if (target) {\n if (!painterRef.current) {\n painterRef.current = new PosterPainter(target, {\n ratio: options?.ratio || 1,\n ...options,\n });\n }\n\n painterRef.current.draw(\n mergeDeepRight<Partial<DrawOptions>, DrawOptions>(\n { layout: DefaultLayoutConfig, fontFamily: \"Manrope\" },\n data\n )\n );\n }\n }, [target, data]);\n\n // useEffect(() => {\n // if (painterRef.current) {\n // painterRef.current.draw(\n // mergeDeepRight<Partial<DrawOptions>, DrawOptions>(\n // { layout: DefaultLayoutConfig, fontFamily: \"Manrope\" },\n // data\n // )\n // );\n // }\n // }, [data]);\n\n const toDataURL = (type?: string, encoderOptions?: number) => {\n if (!target) {\n throw new SDKError(\"The ref must be a canvas element\");\n }\n return target.toDataURL(type, encoderOptions);\n };\n\n /**\n * Converts the poster to a blob\n */\n const toBlob = useCallback(\n (type?: string, encoderOptions?: number): Promise<Blob | null> => {\n return new Promise<Blob | null>((resolve) => {\n if (!target) {\n resolve(null);\n return;\n }\n target.toBlob(resolve, type, encoderOptions);\n });\n },\n [target]\n );\n\n const ref = (ref: HTMLCanvasElement | null) => {\n if (!ref) return;\n if (ref.tagName.toUpperCase() !== \"CANVAS\") {\n // throw new Error(\"The ref must be a canvas element\");\n setError(new SDKError(\"The ref must be a canvas element\"));\n return;\n }\n setTarget(ref);\n };\n\n const download = useCallback(\n (filename: string, type: string = \"image/png\", encoderOptions?: number) => {\n if (!target) {\n throw new SDKError(\"The ref must be a canvas element\");\n }\n const img = new Image();\n img.src = target.toDataURL(type, encoderOptions);\n const link = document.createElement(\"a\");\n link.href = img.src;\n link.download = filename;\n link.click();\n },\n [target]\n );\n\n const copy = useCallback(() => {\n if (!target) {\n throw new SDKError(\"The ref must be a canvas element\");\n }\n // copy image to clipboard\n return new Promise<void>((resolve, reject) => {\n if (!navigator.clipboard) {\n reject(new SDKError(\"Clipboard API is not supported\"));\n return;\n }\n target.toBlob((blob) => {\n if (!blob) {\n reject(new SDKError(\"Failed to create blob\"));\n return;\n }\n return navigator.clipboard\n .write([new ClipboardItem({ [blob.type]: blob })])\n .then(resolve, reject);\n });\n });\n }, [target]);\n\n return {\n error,\n /**\n * The ref to the canvas element, you should pass this ref to the canvas element\n */\n ref,\n /**\n * Converts the poster to a data URL\n */\n toDataURL,\n /**\n * Converts the poster to a blob\n */\n toBlob,\n /**\n * Downloads the poster as an image\n */\n download,\n /**\n * Browser if supports copy image to clipboard\n */\n canCopy,\n copy,\n } as const;\n};\n"],"names":["usePoster","data","options","error","setError","useState","canCopy","setCanCopy","navigator","clipboard","painterRef","useRef","target","setTarget","useEffect","current","PosterPainter","ratio","draw","mergeDeepRight","layout","DefaultLayoutConfig","fontFamily","toDataURL","type","encoderOptions","SDKError","toBlob","useCallback","Promise","resolve","ref","tagName","toUpperCase","download","filename","img","Image","src","link","document","createElement","href","click","copy","reject","blob","write","ClipboardItem","then"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}