@ynput/ayon-frontend-shared 0.2.40 → 0.2.42

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 (431) hide show
  1. package/dist/DetailsPanel.cjs.js +1 -1
  2. package/dist/DetailsPanel.es.js +24 -22
  3. package/dist/DetailsPanel.es.js.map +1 -1
  4. package/dist/api.cjs.js +1 -1
  5. package/dist/api.es.js +256 -248
  6. package/dist/api.es.js.map +1 -1
  7. package/dist/index.cjs.js +1 -1
  8. package/dist/index.es.js +11 -9
  9. package/dist/index.es.js.map +1 -1
  10. package/dist/shared/src/api/queries/activities/util/activityRealtimeHandler.cjs.js +1 -1
  11. package/dist/shared/src/api/queries/activities/util/activityRealtimeHandler.cjs.js.map +1 -1
  12. package/dist/shared/src/api/queries/activities/util/activityRealtimeHandler.es.js +16 -16
  13. package/dist/shared/src/api/queries/activities/util/activityRealtimeHandler.es.js.map +1 -1
  14. package/dist/shared/src/api/queries/config/getConfig.cjs.js +2 -0
  15. package/dist/shared/src/api/queries/config/getConfig.cjs.js.map +1 -0
  16. package/dist/shared/src/api/queries/config/getConfig.es.js +65 -0
  17. package/dist/shared/src/api/queries/config/getConfig.es.js.map +1 -0
  18. package/dist/shared/src/api/queries/config/updateConfig.cjs.js +2 -0
  19. package/dist/shared/src/api/queries/config/updateConfig.cjs.js.map +1 -0
  20. package/dist/shared/src/api/queries/config/updateConfig.es.js +13 -0
  21. package/dist/shared/src/api/queries/config/updateConfig.es.js.map +1 -0
  22. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js +1 -1
  23. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.cjs.js.map +1 -1
  24. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js +5 -3
  25. package/dist/shared/src/api/queries/entities/transformDetailsPanelData.es.js.map +1 -1
  26. package/dist/shared/src/api/queries/entities/updateEntity.cjs.js +1 -1
  27. package/dist/shared/src/api/queries/entities/updateEntity.cjs.js.map +1 -1
  28. package/dist/shared/src/api/queries/entities/updateEntity.es.js +5 -3
  29. package/dist/shared/src/api/queries/entities/updateEntity.es.js.map +1 -1
  30. package/dist/shared/src/api/queries/links/getEntityLinks.cjs.js +1 -1
  31. package/dist/shared/src/api/queries/links/getEntityLinks.cjs.js.map +1 -1
  32. package/dist/shared/src/api/queries/links/getEntityLinks.es.js +106 -86
  33. package/dist/shared/src/api/queries/links/getEntityLinks.es.js.map +1 -1
  34. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js +1 -1
  35. package/dist/shared/src/api/queries/overview/updateOverview.cjs.js.map +1 -1
  36. package/dist/shared/src/api/queries/overview/updateOverview.es.js +68 -66
  37. package/dist/shared/src/api/queries/overview/updateOverview.es.js.map +1 -1
  38. package/dist/shared/src/api/queries/users/getUsers.cjs.js +2 -2
  39. package/dist/shared/src/api/queries/users/getUsers.cjs.js.map +1 -1
  40. package/dist/shared/src/api/queries/users/getUsers.es.js +34 -32
  41. package/dist/shared/src/api/queries/users/getUsers.es.js.map +1 -1
  42. package/dist/shared/src/components/Chips/Chips.cjs.js +10 -6
  43. package/dist/shared/src/components/Chips/Chips.cjs.js.map +1 -1
  44. package/dist/shared/src/components/Chips/Chips.es.js +44 -38
  45. package/dist/shared/src/components/Chips/Chips.es.js.map +1 -1
  46. package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js +1 -1
  47. package/dist/shared/src/components/DetailsDialog/DetailsDialog.cjs.js.map +1 -1
  48. package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js +4 -2
  49. package/dist/shared/src/components/DetailsDialog/DetailsDialog.es.js.map +1 -1
  50. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js +1 -1
  51. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.cjs.js.map +1 -1
  52. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js +4 -2
  53. package/dist/shared/src/components/DetailsPanelAttributes/components/RenderFieldWidget.es.js.map +1 -1
  54. package/dist/shared/src/components/DetailsPanelDetails/DescriptionSection.cjs.js +1 -1
  55. package/dist/shared/src/components/DetailsPanelDetails/DescriptionSection.cjs.js.map +1 -1
  56. package/dist/shared/src/components/DetailsPanelDetails/DescriptionSection.es.js +4 -2
  57. package/dist/shared/src/components/DetailsPanelDetails/DescriptionSection.es.js.map +1 -1
  58. package/dist/shared/src/components/DetailsPanelDetails/DetailsPanelDetails.cjs.js +1 -1
  59. package/dist/shared/src/components/DetailsPanelDetails/DetailsPanelDetails.cjs.js.map +1 -1
  60. package/dist/shared/src/components/DetailsPanelDetails/DetailsPanelDetails.es.js +4 -2
  61. package/dist/shared/src/components/DetailsPanelDetails/DetailsPanelDetails.es.js.map +1 -1
  62. package/dist/shared/src/components/DetailsPanelDetails/hooks/useEntityEditing.cjs.js +1 -1
  63. package/dist/shared/src/components/DetailsPanelDetails/hooks/useEntityEditing.cjs.js.map +1 -1
  64. package/dist/shared/src/components/DetailsPanelDetails/hooks/useEntityEditing.es.js +4 -2
  65. package/dist/shared/src/components/DetailsPanelDetails/hooks/useEntityEditing.es.js.map +1 -1
  66. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js +1 -1
  67. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.cjs.js.map +1 -1
  68. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js +4 -2
  69. package/dist/shared/src/components/EntityPanelUploader/EntityPanelUploader.es.js.map +1 -1
  70. package/dist/shared/src/components/Feedback/FeedbackContext.cjs.js +1 -1
  71. package/dist/shared/src/components/Feedback/FeedbackContext.cjs.js.map +1 -1
  72. package/dist/shared/src/components/Feedback/FeedbackContext.es.js +6 -4
  73. package/dist/shared/src/components/Feedback/FeedbackContext.es.js.map +1 -1
  74. package/dist/shared/src/components/LinksManager/AddNewLinks.cjs.js +1 -1
  75. package/dist/shared/src/components/LinksManager/AddNewLinks.cjs.js.map +1 -1
  76. package/dist/shared/src/components/LinksManager/AddNewLinks.es.js +4 -2
  77. package/dist/shared/src/components/LinksManager/AddNewLinks.es.js.map +1 -1
  78. package/dist/shared/src/components/LinksManager/LinkManagerItem.cjs.js +1 -1
  79. package/dist/shared/src/components/LinksManager/LinkManagerItem.cjs.js.map +1 -1
  80. package/dist/shared/src/components/LinksManager/LinkManagerItem.es.js +28 -25
  81. package/dist/shared/src/components/LinksManager/LinkManagerItem.es.js.map +1 -1
  82. package/dist/shared/src/components/LinksManager/LinksManager.cjs.js.map +1 -1
  83. package/dist/shared/src/components/LinksManager/LinksManager.es.js.map +1 -1
  84. package/dist/shared/src/components/LinksManager/LinksManager.styled.cjs.js +5 -0
  85. package/dist/shared/src/components/LinksManager/LinksManager.styled.cjs.js.map +1 -1
  86. package/dist/shared/src/components/LinksManager/LinksManager.styled.es.js +5 -0
  87. package/dist/shared/src/components/LinksManager/LinksManager.styled.es.js.map +1 -1
  88. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.cjs.js +1 -1
  89. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.cjs.js.map +1 -1
  90. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.es.js +4 -2
  91. package/dist/shared/src/components/LinksManager/hooks/useUpdateLinks.es.js.map +1 -1
  92. package/dist/shared/src/components/ListAttributeForm/ListAttributeForm.cjs.js +1 -1
  93. package/dist/shared/src/components/ListAttributeForm/ListAttributeForm.cjs.js.map +1 -1
  94. package/dist/shared/src/components/ListAttributeForm/ListAttributeForm.es.js +4 -2
  95. package/dist/shared/src/components/ListAttributeForm/ListAttributeForm.es.js.map +1 -1
  96. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js +1 -1
  97. package/dist/shared/src/components/Powerpack/PowerpackDialog.cjs.js.map +1 -1
  98. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js +4 -2
  99. package/dist/shared/src/components/Powerpack/PowerpackDialog.es.js.map +1 -1
  100. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js +1 -1
  101. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.cjs.js.map +1 -1
  102. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js +6 -4
  103. package/dist/shared/src/components/ProjectTableSettings/ProjectTableSettings.es.js.map +1 -1
  104. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js +1 -1
  105. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.cjs.js.map +1 -1
  106. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js +4 -2
  107. package/dist/shared/src/components/ProjectTableSettings/TableSettingsFallback.es.js.map +1 -1
  108. package/dist/shared/src/components/RenameForm/RenameForm.cjs.js +1 -1
  109. package/dist/shared/src/components/RenameForm/RenameForm.cjs.js.map +1 -1
  110. package/dist/shared/src/components/RenameForm/RenameForm.es.js +4 -2
  111. package/dist/shared/src/components/RenameForm/RenameForm.es.js.map +1 -1
  112. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.cjs.js +1 -1
  113. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.cjs.js.map +1 -1
  114. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.es.js +4 -2
  115. package/dist/shared/src/components/ReviewablesList/EditReviewableDialog.es.js.map +1 -1
  116. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js +1 -1
  117. package/dist/shared/src/components/ReviewablesList/ReviewablesList.cjs.js.map +1 -1
  118. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js +4 -2
  119. package/dist/shared/src/components/ReviewablesList/ReviewablesList.es.js.map +1 -1
  120. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js +1 -1
  121. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.cjs.js.map +1 -1
  122. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js +5 -3
  123. package/dist/shared/src/components/ReviewablesList/ReviewablesUpload.es.js.map +1 -1
  124. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js +1 -1
  125. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.cjs.js.map +1 -1
  126. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js +4 -2
  127. package/dist/shared/src/components/ReviewablesList/SortableReviewableCard.es.js.map +1 -1
  128. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.cjs.js +1 -1
  129. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.cjs.js.map +1 -1
  130. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.es.js +4 -2
  131. package/dist/shared/src/components/ReviewablesList/useReviewablesUpload.es.js.map +1 -1
  132. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js +1 -1
  133. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.cjs.js.map +1 -1
  134. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js +8 -6
  135. package/dist/shared/src/components/SearchFilter/useBuildFilterOptions.es.js.map +1 -1
  136. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js +1 -1
  137. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.cjs.js.map +1 -1
  138. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js +4 -2
  139. package/dist/shared/src/components/SimpleFormDialog/SimpleFormDialog.es.js.map +1 -1
  140. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js +1 -1
  141. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.cjs.js.map +1 -1
  142. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js +4 -2
  143. package/dist/shared/src/components/VersionUploader/components/UploadVersionForm.es.js.map +1 -1
  144. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.cjs.js +1 -1
  145. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.cjs.js.map +1 -1
  146. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.es.js +6 -4
  147. package/dist/shared/src/components/VersionUploader/context/VersionUploadContext.es.js.map +1 -1
  148. package/dist/shared/src/components/Watchers/Watchers.cjs.js +1 -1
  149. package/dist/shared/src/components/Watchers/Watchers.cjs.js.map +1 -1
  150. package/dist/shared/src/components/Watchers/Watchers.es.js +4 -2
  151. package/dist/shared/src/components/Watchers/Watchers.es.js.map +1 -1
  152. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js +1 -1
  153. package/dist/shared/src/containers/Actions/ActionConfigDialog.cjs.js.map +1 -1
  154. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js +4 -2
  155. package/dist/shared/src/containers/Actions/ActionConfigDialog.es.js.map +1 -1
  156. package/dist/shared/src/containers/Actions/Actions.cjs.js +1 -1
  157. package/dist/shared/src/containers/Actions/Actions.cjs.js.map +1 -1
  158. package/dist/shared/src/containers/Actions/Actions.es.js +4 -2
  159. package/dist/shared/src/containers/Actions/Actions.es.js.map +1 -1
  160. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js +1 -1
  161. package/dist/shared/src/containers/Actions/InteractiveActionDialog.cjs.js.map +1 -1
  162. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js +4 -2
  163. package/dist/shared/src/containers/Actions/InteractiveActionDialog.es.js.map +1 -1
  164. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js +1 -1
  165. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.cjs.js.map +1 -1
  166. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js +4 -2
  167. package/dist/shared/src/containers/DetailsPanel/DetailsPanel.es.js.map +1 -1
  168. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js +1 -1
  169. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.cjs.js.map +1 -1
  170. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js +4 -2
  171. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFiles/DetailsPanelFiles.es.js.map +1 -1
  172. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js +1 -1
  173. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.cjs.js.map +1 -1
  174. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js +5 -3
  175. package/dist/shared/src/containers/DetailsPanel/DetailsPanelFloating/DetailsPanelFloating.es.js.map +1 -1
  176. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js +1 -1
  177. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.cjs.js.map +1 -1
  178. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js +4 -2
  179. package/dist/shared/src/containers/DetailsPanel/DetailsPanelHeader/DetailsPanelHeader.es.js.map +1 -1
  180. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js +1 -1
  181. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.cjs.js.map +1 -1
  182. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js +4 -2
  183. package/dist/shared/src/containers/DetailsPanel/DetailsPanelSlideOut/DetailsPanelSlideOut.es.js.map +1 -1
  184. package/dist/shared/src/containers/DetailsPanel/FeedContextWrapper.cjs.js +1 -1
  185. package/dist/shared/src/containers/DetailsPanel/FeedContextWrapper.cjs.js.map +1 -1
  186. package/dist/shared/src/containers/DetailsPanel/FeedContextWrapper.es.js +4 -2
  187. package/dist/shared/src/containers/DetailsPanel/FeedContextWrapper.es.js.map +1 -1
  188. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.cjs.js +1 -1
  189. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.cjs.js.map +1 -1
  190. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.es.js +4 -2
  191. package/dist/shared/src/containers/DetailsPanel/hooks/useGetEntityPath.es.js.map +1 -1
  192. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.cjs.js +1 -1
  193. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.cjs.js.map +1 -1
  194. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.es.js +4 -2
  195. package/dist/shared/src/containers/EntityPickerDialog/EntityPickerDialog.es.js.map +1 -1
  196. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.cjs.js +1 -1
  197. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.cjs.js.map +1 -1
  198. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.es.js +4 -2
  199. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTable.es.js.map +1 -1
  200. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.cjs.js +1 -1
  201. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.cjs.js.map +1 -1
  202. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.es.js +4 -2
  203. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableHeader.es.js.map +1 -1
  204. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.cjs.js +1 -1
  205. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.cjs.js.map +1 -1
  206. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.es.js +4 -2
  207. package/dist/shared/src/containers/EntityPickerDialog/components/EntityTypeTableSearch.es.js.map +1 -1
  208. package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.cjs.js +1 -1
  209. package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.cjs.js.map +1 -1
  210. package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.es.js +4 -2
  211. package/dist/shared/src/containers/EntityPickerDialog/hooks/useGetEntityPickerData.es.js.map +1 -1
  212. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js +1 -1
  213. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.cjs.js.map +1 -1
  214. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js +4 -2
  215. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityComment.es.js.map +1 -1
  216. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.cjs.js +1 -1
  217. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.cjs.js.map +1 -1
  218. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.es.js +4 -2
  219. package/dist/shared/src/containers/Feed/components/ActivityComment/ActivityCommentMenu.es.js.map +1 -1
  220. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js +1 -1
  221. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.cjs.js.map +1 -1
  222. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js +4 -2
  223. package/dist/shared/src/containers/Feed/components/CommentInput/CommentInput.es.js.map +1 -1
  224. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js +1 -1
  225. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.cjs.js.map +1 -1
  226. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js +4 -2
  227. package/dist/shared/src/containers/Feed/components/Tooltips/EntityTooltip/EntityTooltip.es.js.map +1 -1
  228. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js +1 -1
  229. package/dist/shared/src/containers/Feed/context/FeedContext.cjs.js.map +1 -1
  230. package/dist/shared/src/containers/Feed/context/FeedContext.es.js +7 -5
  231. package/dist/shared/src/containers/Feed/context/FeedContext.es.js.map +1 -1
  232. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.cjs.js +1 -1
  233. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.cjs.js.map +1 -1
  234. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.es.js +4 -2
  235. package/dist/shared/src/containers/Feed/hooks/useGetFeedActivitiesData.es.js.map +1 -1
  236. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js +1 -1
  237. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.cjs.js.map +1 -1
  238. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js +4 -2
  239. package/dist/shared/src/containers/ProjectTreeTable/ProjectTreeTable.es.js.map +1 -1
  240. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js +1 -1
  241. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.cjs.js.map +1 -1
  242. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js +4 -2
  243. package/dist/shared/src/containers/ProjectTreeTable/buildTreeTableColumns.es.js.map +1 -1
  244. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.cjs.js +1 -1
  245. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.cjs.js.map +1 -1
  246. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.es.js +4 -2
  247. package/dist/shared/src/containers/ProjectTreeTable/components/ColumnHeaderMenu.es.js.map +1 -1
  248. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js +1 -1
  249. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.cjs.js.map +1 -1
  250. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js +4 -2
  251. package/dist/shared/src/containers/ProjectTreeTable/components/GroupSettingsFallback.es.js.map +1 -1
  252. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js +1 -1
  253. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.cjs.js.map +1 -1
  254. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js +4 -2
  255. package/dist/shared/src/containers/ProjectTreeTable/context/CellEditingProvider.es.js.map +1 -1
  256. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.cjs.js +1 -1
  257. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.cjs.js.map +1 -1
  258. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.es.js +6 -4
  259. package/dist/shared/src/containers/ProjectTreeTable/context/ProjectDataContext.es.js.map +1 -1
  260. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js +1 -1
  261. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.cjs.js.map +1 -1
  262. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js +4 -2
  263. package/dist/shared/src/containers/ProjectTreeTable/context/SelectionCellsProvider.es.js.map +1 -1
  264. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js +1 -1
  265. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.cjs.js.map +1 -1
  266. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js +7 -5
  267. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildGroupByTableData.es.js.map +1 -1
  268. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js +1 -1
  269. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.cjs.js.map +1 -1
  270. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js +4 -2
  271. package/dist/shared/src/containers/ProjectTreeTable/hooks/useBuildProjectDataTable.es.js.map +1 -1
  272. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js +1 -1
  273. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.cjs.js.map +1 -1
  274. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js +4 -2
  275. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCellContextMenu.es.js.map +1 -1
  276. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js +1 -1
  277. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.cjs.js.map +1 -1
  278. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js +4 -2
  279. package/dist/shared/src/containers/ProjectTreeTable/hooks/useCheckSelectedCellsVisible.es.js.map +1 -1
  280. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.cjs.js +1 -1
  281. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.cjs.js.map +1 -1
  282. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.es.js +4 -2
  283. package/dist/shared/src/containers/ProjectTreeTable/hooks/useColumnGroupBy.es.js.map +1 -1
  284. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js +1 -1
  285. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.cjs.js.map +1 -1
  286. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js +30 -28
  287. package/dist/shared/src/containers/ProjectTreeTable/hooks/useFetchOverviewData.es.js.map +1 -1
  288. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js +1 -1
  289. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.cjs.js.map +1 -1
  290. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js +4 -2
  291. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGetGroupedFields.es.js.map +1 -1
  292. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.cjs.js +1 -1
  293. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.cjs.js.map +1 -1
  294. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.es.js +4 -2
  295. package/dist/shared/src/containers/ProjectTreeTable/hooks/useGroupBySettings.es.js.map +1 -1
  296. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js +1 -1
  297. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.cjs.js.map +1 -1
  298. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js +4 -2
  299. package/dist/shared/src/containers/ProjectTreeTable/hooks/useKeyboardNavigation.es.js.map +1 -1
  300. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.cjs.js +1 -1
  301. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.cjs.js.map +1 -1
  302. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.es.js +4 -2
  303. package/dist/shared/src/containers/ProjectTreeTable/hooks/useMoveEntities.es.js.map +1 -1
  304. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.cjs.js +1 -1
  305. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.cjs.js.map +1 -1
  306. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.es.js +4 -2
  307. package/dist/shared/src/containers/ProjectTreeTable/hooks/usePasteLinks.es.js.map +1 -1
  308. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js +1 -1
  309. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.cjs.js.map +1 -1
  310. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js +4 -2
  311. package/dist/shared/src/containers/ProjectTreeTable/hooks/useQueryFilters.es.js.map +1 -1
  312. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js +1 -1
  313. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.cjs.js.map +1 -1
  314. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js +15 -13
  315. package/dist/shared/src/containers/ProjectTreeTable/utils/cellUtils.es.js.map +1 -1
  316. package/dist/shared/src/containers/ProjectTreeTable/utils/linksToTableData.cjs.js +1 -1
  317. package/dist/shared/src/containers/ProjectTreeTable/utils/linksToTableData.cjs.js.map +1 -1
  318. package/dist/shared/src/containers/ProjectTreeTable/utils/linksToTableData.es.js +34 -21
  319. package/dist/shared/src/containers/ProjectTreeTable/utils/linksToTableData.es.js.map +1 -1
  320. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.cjs.js +1 -1
  321. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.cjs.js.map +1 -1
  322. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.es.js +31 -28
  323. package/dist/shared/src/containers/ProjectTreeTable/widgets/LinksWidget.es.js.map +1 -1
  324. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.cjs.js +1 -1
  325. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.cjs.js.map +1 -1
  326. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.es.js +4 -2
  327. package/dist/shared/src/containers/ProjectTreeTable/widgets/NameWidget.es.js.map +1 -1
  328. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js +1 -1
  329. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.cjs.js.map +1 -1
  330. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js +4 -2
  331. package/dist/shared/src/containers/RepresentationsList/RepresentationsList.es.js.map +1 -1
  332. package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js +1 -1
  333. package/dist/shared/src/containers/SimpleTable/SimpleTable.cjs.js.map +1 -1
  334. package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js +4 -2
  335. package/dist/shared/src/containers/SimpleTable/SimpleTable.es.js.map +1 -1
  336. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.cjs.js +1 -1
  337. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.cjs.js.map +1 -1
  338. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.es.js +4 -2
  339. package/dist/shared/src/containers/Views/ViewsDialogContainer/ViewsDialogContainer.es.js.map +1 -1
  340. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js +1 -1
  341. package/dist/shared/src/containers/Views/context/ViewsContext.cjs.js.map +1 -1
  342. package/dist/shared/src/containers/Views/context/ViewsContext.es.js +6 -4
  343. package/dist/shared/src/containers/Views/context/ViewsContext.es.js.map +1 -1
  344. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.cjs.js +1 -1
  345. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.cjs.js.map +1 -1
  346. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.es.js +4 -2
  347. package/dist/shared/src/containers/Views/hooks/useBuildViewMenuItems.es.js.map +1 -1
  348. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.cjs.js +1 -1
  349. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.cjs.js.map +1 -1
  350. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.es.js +4 -2
  351. package/dist/shared/src/containers/Views/hooks/useSaveViewFromCurrent.es.js.map +1 -1
  352. package/dist/shared/src/containers/Views/hooks/useSelectedView.cjs.js +1 -1
  353. package/dist/shared/src/containers/Views/hooks/useSelectedView.cjs.js.map +1 -1
  354. package/dist/shared/src/containers/Views/hooks/useSelectedView.es.js +4 -2
  355. package/dist/shared/src/containers/Views/hooks/useSelectedView.es.js.map +1 -1
  356. package/dist/shared/src/containers/Views/hooks/useViewsMutations.cjs.js +1 -1
  357. package/dist/shared/src/containers/Views/hooks/useViewsMutations.cjs.js.map +1 -1
  358. package/dist/shared/src/containers/Views/hooks/useViewsMutations.es.js +4 -2
  359. package/dist/shared/src/containers/Views/hooks/useViewsMutations.es.js.map +1 -1
  360. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js +1 -1
  361. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.cjs.js.map +1 -1
  362. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js +4 -2
  363. package/dist/shared/src/containers/Views/utils/viewUpdateHelper.es.js.map +1 -1
  364. package/dist/shared/src/context/AddonProjectContext.cjs.js +1 -1
  365. package/dist/shared/src/context/AddonProjectContext.cjs.js.map +1 -1
  366. package/dist/shared/src/context/AddonProjectContext.es.js +6 -4
  367. package/dist/shared/src/context/AddonProjectContext.es.js.map +1 -1
  368. package/dist/shared/src/context/DetailsPanelContext.cjs.js +1 -1
  369. package/dist/shared/src/context/DetailsPanelContext.cjs.js.map +1 -1
  370. package/dist/shared/src/context/DetailsPanelContext.es.js +6 -4
  371. package/dist/shared/src/context/DetailsPanelContext.es.js.map +1 -1
  372. package/dist/shared/src/context/GlobalContext.cjs.js +1 -1
  373. package/dist/shared/src/context/GlobalContext.cjs.js.map +1 -1
  374. package/dist/shared/src/context/GlobalContext.es.js +6 -4
  375. package/dist/shared/src/context/GlobalContext.es.js.map +1 -1
  376. package/dist/shared/src/context/PowerpackContext.cjs.js +1 -1
  377. package/dist/shared/src/context/PowerpackContext.cjs.js.map +1 -1
  378. package/dist/shared/src/context/PowerpackContext.es.js +8 -6
  379. package/dist/shared/src/context/PowerpackContext.es.js.map +1 -1
  380. package/dist/shared/src/context/ProjectContext.cjs.js +1 -1
  381. package/dist/shared/src/context/ProjectContext.cjs.js.map +1 -1
  382. package/dist/shared/src/context/ProjectContext.es.js +44 -38
  383. package/dist/shared/src/context/ProjectContext.es.js.map +1 -1
  384. package/dist/shared/src/context/ProjectFoldersContext.cjs.js +1 -1
  385. package/dist/shared/src/context/ProjectFoldersContext.cjs.js.map +1 -1
  386. package/dist/shared/src/context/ProjectFoldersContext.es.js +6 -4
  387. package/dist/shared/src/context/ProjectFoldersContext.es.js.map +1 -1
  388. package/dist/shared/src/context/RemoteModulesContext.cjs.js +1 -1
  389. package/dist/shared/src/context/RemoteModulesContext.cjs.js.map +1 -1
  390. package/dist/shared/src/context/RemoteModulesContext.es.js +6 -4
  391. package/dist/shared/src/context/RemoteModulesContext.es.js.map +1 -1
  392. package/dist/shared/src/context/UriContext.cjs.js +1 -1
  393. package/dist/shared/src/context/UriContext.cjs.js.map +1 -1
  394. package/dist/shared/src/context/UriContext.es.js +7 -5
  395. package/dist/shared/src/context/UriContext.es.js.map +1 -1
  396. package/dist/shared/src/context/WebsocketContext.cjs.js +1 -1
  397. package/dist/shared/src/context/WebsocketContext.cjs.js.map +1 -1
  398. package/dist/shared/src/context/WebsocketContext.es.js +6 -4
  399. package/dist/shared/src/context/WebsocketContext.es.js.map +1 -1
  400. package/dist/shared/src/hooks/useActionTriggers.cjs.js +1 -1
  401. package/dist/shared/src/hooks/useActionTriggers.cjs.js.map +1 -1
  402. package/dist/shared/src/hooks/useActionTriggers.es.js +4 -2
  403. package/dist/shared/src/hooks/useActionTriggers.es.js.map +1 -1
  404. package/dist/shared/src/hooks/useEntityUpdate.cjs.js +1 -1
  405. package/dist/shared/src/hooks/useEntityUpdate.cjs.js.map +1 -1
  406. package/dist/shared/src/hooks/useEntityUpdate.es.js +4 -2
  407. package/dist/shared/src/hooks/useEntityUpdate.es.js.map +1 -1
  408. package/dist/shared/src/hooks/useGetEntityGroups.cjs.js +1 -1
  409. package/dist/shared/src/hooks/useGetEntityGroups.cjs.js.map +1 -1
  410. package/dist/shared/src/hooks/useGetEntityGroups.es.js +4 -2
  411. package/dist/shared/src/hooks/useGetEntityGroups.es.js.map +1 -1
  412. package/dist/shared/src/hooks/useGroupByRemoteModules.cjs.js +1 -1
  413. package/dist/shared/src/hooks/useGroupByRemoteModules.cjs.js.map +1 -1
  414. package/dist/shared/src/hooks/useGroupByRemoteModules.es.js +4 -2
  415. package/dist/shared/src/hooks/useGroupByRemoteModules.es.js.map +1 -1
  416. package/dist/shared/src/hooks/useScopedStatuses.cjs.js +1 -1
  417. package/dist/shared/src/hooks/useScopedStatuses.cjs.js.map +1 -1
  418. package/dist/shared/src/hooks/useScopedStatuses.es.js +6 -4
  419. package/dist/shared/src/hooks/useScopedStatuses.es.js.map +1 -1
  420. package/dist/shared/src/hooks/useUserProjectConfig.cjs.js +1 -1
  421. package/dist/shared/src/hooks/useUserProjectConfig.cjs.js.map +1 -1
  422. package/dist/shared/src/hooks/useUserProjectConfig.es.js +4 -2
  423. package/dist/shared/src/hooks/useUserProjectConfig.es.js.map +1 -1
  424. package/dist/types/api/queries/config/getConfig.d.ts +747 -0
  425. package/dist/types/api/queries/config/index.d.ts +2 -0
  426. package/dist/types/api/queries/config/updateConfig.d.ts +171 -0
  427. package/dist/types/api/queries/index.d.ts +1 -0
  428. package/dist/types/api/queries/links/getEntityLinks.d.ts +2 -1
  429. package/dist/types/components/Chips/Chips.d.ts +1 -0
  430. package/dist/types/components/LinksManager/LinksManager.d.ts +1 -0
  431. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPanelUploader.cjs.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n} from '@shared/util'\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["dropZones","EntityPanelUploader","children","entityType","entities","projectName","onUploaded","onVersionCreated","dispatch","useDetailsPanelContext","isDraggingFile","setIsDraggingFile","useState","draggingZone","setDraggingZone","dragCounterRef","useRef","uploadingType","setUploadingType","progress","setProgress","showProductDialog","setShowProductDialog","pendingFiles","setPendingFiles","singleEntity","taskId","_a","folderId","_b","productId","_c","versionId","canUploadVersions","uploadReviewableFiles","useReviewablesUpload","availableDropZones","zone","resetState","handleDialogSubmit","productName","sanitizedName","sanitizeProductName","toast","productRes","createProductHelper","createProduct","uploadVersionWithProduct","error","handleUploadError","handleDialogCancel","createVersion","useCreateVersionMutation","useCreateProductMutation","handleVersionUpload","files","nextVersion","getNextVersionNumber","versionRes","createVersionHelper","handleThumbnailFileUploaded","thumbnails","newUpdatedAt","operations","entity","entityToPatch","e","currentAssignees","updateEntities","handleUploadThumbnail","file","promises","id","promise","axios","updatedEntities","res","i","useUpdateEntitiesMutation","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","handleInputUpload","event","type","thumbnailInputRef","versionsInputRef","jsxs","ThumbnailUploadProvider","Styled.DragAndDropWrapper","clsx","jsx","ThumbnailWrapper","Styled.DropZones","Dropzone","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton","EntityPanelUploaderDialog"],"mappings":"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"}
1
+ {"version":3,"file":"EntityPanelUploader.cjs.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n} from '@shared/util'\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["dropZones","EntityPanelUploader","children","entityType","entities","projectName","onUploaded","onVersionCreated","dispatch","useDetailsPanelContext","isDraggingFile","setIsDraggingFile","useState","draggingZone","setDraggingZone","dragCounterRef","useRef","uploadingType","setUploadingType","progress","setProgress","showProductDialog","setShowProductDialog","pendingFiles","setPendingFiles","singleEntity","taskId","_a","folderId","_b","productId","_c","versionId","canUploadVersions","uploadReviewableFiles","useReviewablesUpload","availableDropZones","zone","resetState","handleDialogSubmit","productName","sanitizedName","sanitizeProductName","toast","productRes","createProductHelper","createProduct","uploadVersionWithProduct","error","handleUploadError","handleDialogCancel","createVersion","useCreateVersionMutation","useCreateProductMutation","handleVersionUpload","files","nextVersion","getNextVersionNumber","versionRes","createVersionHelper","handleThumbnailFileUploaded","thumbnails","newUpdatedAt","operations","entity","entityToPatch","e","currentAssignees","updateEntities","handleUploadThumbnail","file","promises","id","promise","axios","updatedEntities","res","i","useUpdateEntitiesMutation","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","handleInputUpload","event","type","thumbnailInputRef","versionsInputRef","jsxs","ThumbnailUploadProvider","Styled.DragAndDropWrapper","clsx","jsx","ThumbnailWrapper","Styled.DropZones","Dropzone","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton","EntityPanelUploaderDialog"],"mappings":"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"}
@@ -102,6 +102,8 @@ import "../../api/queries/attributes/getAttributes.es.js";
102
102
  import "../../api/queries/attributes/updateAttributes.es.js";
103
103
  import "../../api/queries/authentication/getAuthentication.es.js";
104
104
  import "../../api/queries/cloud/cloud.es.js";
105
+ import "../../api/queries/config/getConfig.es.js";
106
+ import "../../api/queries/config/updateConfig.es.js";
105
107
  import "../../api/queries/entities/getEntity.es.js";
106
108
  import "../../api/queries/entities/getEntityPanel.es.js";
107
109
  import { useUpdateEntitiesMutation as vr } from "../../api/queries/entities/updateEntity.es.js";
@@ -250,7 +252,7 @@ import "../../containers/Views/ViewsMenu/ViewsMenu.es.js";
250
252
  const Fr = [
251
253
  { id: "thumbnail", label: "Upload thumbnail", icon: "add_photo_alternate" },
252
254
  { id: "version", label: "Upload version", icon: "layers" }
253
- ], lm = ({
255
+ ], dm = ({
254
256
  children: _ = [],
255
257
  entityType: F,
256
258
  entities: a = [],
@@ -478,6 +480,6 @@ const Fr = [
478
480
  );
479
481
  };
480
482
  export {
481
- lm as EntityPanelUploader
483
+ dm as EntityPanelUploader
482
484
  };
483
485
  //# sourceMappingURL=EntityPanelUploader.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPanelUploader.es.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n} from '@shared/util'\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["dropZones","EntityPanelUploader","children","entityType","entities","projectName","onUploaded","onVersionCreated","dispatch","useDetailsPanelContext","isDraggingFile","setIsDraggingFile","useState","draggingZone","setDraggingZone","dragCounterRef","useRef","uploadingType","setUploadingType","progress","setProgress","showProductDialog","setShowProductDialog","pendingFiles","setPendingFiles","singleEntity","taskId","_a","folderId","_b","productId","_c","versionId","canUploadVersions","uploadReviewableFiles","useReviewablesUpload","availableDropZones","zone","resetState","handleDialogSubmit","productName","sanitizedName","sanitizeProductName","toast","productRes","createProductHelper","createProduct","uploadVersionWithProduct","error","handleUploadError","handleDialogCancel","createVersion","useCreateVersionMutation","useCreateProductMutation","handleVersionUpload","files","nextVersion","getNextVersionNumber","versionRes","createVersionHelper","handleThumbnailFileUploaded","thumbnails","newUpdatedAt","operations","entity","entityToPatch","e","currentAssignees","updateEntities","handleUploadThumbnail","file","promises","id","promise","axios","updatedEntities","res","i","useUpdateEntitiesMutation","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","handleInputUpload","event","type","thumbnailInputRef","versionsInputRef","jsxs","ThumbnailUploadProvider","Styled.DragAndDropWrapper","clsx","jsx","ThumbnailWrapper","Styled.DropZones","Dropzone","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton","EntityPanelUploaderDialog"],"mappings":"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"}
1
+ {"version":3,"file":"EntityPanelUploader.es.js","sources":["../../../../../src/components/EntityPanelUploader/EntityPanelUploader.tsx"],"sourcesContent":["import { ChangeEvent, useRef, useState } from 'react'\nimport clsx from 'clsx'\n\nimport { ThumbnailWrapper } from '@shared/containers'\nimport {\n useCreateVersionMutation,\n useUpdateEntitiesMutation,\n useCreateProductMutation,\n} from '@shared/api'\nimport * as Styled from './EntityPanelUploader.styled'\nimport { ThumbnailUploadProvider } from '../../context/ThumbnailUploaderContext'\nimport Dropzone, { DropzoneType } from './Dropzone'\nimport axios from 'axios'\nimport { toast } from 'react-toastify'\nimport { useReviewablesUpload } from '../ReviewablesList'\nimport { useDetailsPanelContext } from '@shared/context'\nimport EntityPanelUploaderDialog from './EntityPanelUploaderDialog'\nimport {\n sanitizeProductName,\n createProductHelper,\n createVersionHelper,\n getNextVersionNumber,\n handleUploadError,\n} from '@shared/util'\n\ntype Operation = {\n id: string\n projectName: string\n currentAssignees: any[]\n data: { updatedAt: string }\n}\nexport type EntityPanelUploaderProps = {\n entityType: string\n entities: any[]\n projectName: any\n children?: JSX.Element | JSX.Element[]\n onUploaded?: (operations: Operation[]) => void\n resetFileUploadState?: () => void\n onVersionCreated?: (versionId: string) => void\n}\n\ntype UploadType = 'thumbnail' | 'version'\nconst dropZones: (DropzoneType & { id: UploadType })[] = [\n { id: 'thumbnail', label: 'Upload thumbnail', icon: 'add_photo_alternate' },\n { id: 'version', label: 'Upload version', icon: 'layers' },\n]\n\nexport const EntityPanelUploader = ({\n children = [],\n entityType,\n entities = [],\n projectName,\n onUploaded,\n onVersionCreated,\n}: EntityPanelUploaderProps) => {\n const { dispatch } = useDetailsPanelContext()\n // Dragging and dropping state\n const [isDraggingFile, setIsDraggingFile] = useState(false)\n const [draggingZone, setDraggingZone] = useState<UploadType | null>(null)\n const dragCounterRef = useRef(0)\n\n // Uploading state\n const [uploadingType, setUploadingType] = useState<UploadType | null>(null)\n const [progress, setProgress] = useState(0)\n\n // Dialog state for product creation\n const [showProductDialog, setShowProductDialog] = useState(false)\n const [pendingFiles, setPendingFiles] = useState<FileList | null>(null)\n\n // Check if we have exactly one entity selected\n const singleEntity = entities.length === 1 ? entities[0] : null\n // extra all entity IDs for the single version entity\n const taskId: string | undefined = singleEntity?.task?.id\n const folderId: string | undefined = singleEntity?.folder?.id\n const productId: string | undefined = singleEntity?.product?.id\n const versionId: string | undefined = singleEntity?.id\n const canUploadVersions = Boolean(singleEntity && entityType !== 'representation')\n\n // Use the custom hook for reviewable upload logic (only when single version)\n const { handleFileUpload: uploadReviewableFiles } = useReviewablesUpload({\n projectName,\n versionId: versionId,\n taskId: taskId,\n folderId: folderId,\n productId: productId,\n dispatch,\n onUpload: () => {\n setUploadingType(null)\n setProgress(0)\n },\n onProgress: (progress) => {\n setProgress(progress)\n },\n })\n\n // Filter drop zones based on whether we can upload reviewables\n const availableDropZones = dropZones.filter((zone) => {\n if (zone.id === 'version') {\n return canUploadVersions\n }\n return true\n })\n\n const resetState = () => {\n setUploadingType(null)\n setIsDraggingFile(false)\n setDraggingZone(null)\n dragCounterRef.current = 0\n setProgress(0)\n setShowProductDialog(false)\n setPendingFiles(null)\n }\n\n // Handle dialog submission - create product and upload version\n const handleDialogSubmit = async (productName: string) => {\n if (!pendingFiles || !singleEntity) {\n setShowProductDialog(false)\n setPendingFiles(null)\n return\n }\n\n const sanitizedName = sanitizeProductName(productName)\n\n if (!sanitizedName.trim()) {\n toast.error(\n 'Product name must contain valid characters (letters, numbers, underscore, or hyphen)',\n )\n return\n }\n\n try {\n if (!folderId) {\n throw new Error('Folder ID is required to create a product')\n }\n setUploadingType('version')\n\n // Create the product\n const productRes = await createProductHelper(createProduct, projectName, {\n folderId: folderId,\n name: sanitizedName,\n productType: 'review', // default product type for uploaded files\n })\n\n // Close dialog and proceed with version upload\n setShowProductDialog(false)\n await uploadVersionWithProduct(pendingFiles, productRes.id)\n setPendingFiles(null)\n } catch (error: any) {\n handleUploadError(error, 'creating product')\n resetState()\n }\n }\n\n // Handle dialog cancellation\n const handleDialogCancel = () => {\n setShowProductDialog(false)\n setPendingFiles(null)\n resetState()\n }\n\n const [createVersion] = useCreateVersionMutation()\n const [createProduct] = useCreateProductMutation()\n // Handle version/reviewable file upload\n const handleVersionUpload = async (files: FileList) => {\n if (!canUploadVersions || !singleEntity) {\n toast.error('Please select exactly one version to upload reviewables')\n return resetState()\n }\n\n const productId = singleEntity.product?.id\n if (!productId) {\n // Show dialog to create product first\n setPendingFiles(files)\n setShowProductDialog(true)\n return\n }\n\n // If we have a productId, proceed with upload\n await uploadVersionWithProduct(files, productId)\n }\n\n // Helper function to handle the actual version upload\n const uploadVersionWithProduct = async (files: FileList, productId: string) => {\n try {\n const nextVersion = getNextVersionNumber(singleEntity!.product?.latestVersion)\n\n // create a new version\n const versionRes = await createVersionHelper(createVersion, projectName, {\n productId,\n taskId, // previous version could have a taskId or we are uploading on a task\n version: nextVersion,\n })\n\n await uploadReviewableFiles(files, versionRes.id)\n // The hook handles success callbacks, just reset our local state\n resetState()\n\n // update entity panel to focus the new version\n onVersionCreated?.(versionRes.id)\n } catch (error: any) {\n handleUploadError(error, 'uploading version')\n resetState()\n }\n }\n\n // once the file has been uploaded, we need to patch the entities with the new thumbnail\n const handleThumbnailFileUploaded = async (thumbnails: any[] = []) => {\n // always set isDragginle to false\n setIsDraggingFile(false)\n\n // check something was actually uploaded\n if (!entities.length) {\n return\n }\n\n // patching the updatedAt will force a refresh of the thumbnail url\n const newUpdatedAt = new Date().toISOString()\n\n let operations: Operation[] = []\n let versionPatches = []\n\n for (const entity of thumbnails) {\n const entityToPatch = entities.find((e) => e.id === entity.id)\n if (!entityToPatch) continue\n const thumbnailId = entity.thumbnailId\n const currentAssignees = entity.users || []\n\n operations.push({\n id: entityToPatch.id,\n projectName: entityToPatch.projectName,\n data: { updatedAt: newUpdatedAt },\n currentAssignees,\n })\n\n const versionPatch = {\n productId: entityToPatch.productId,\n versionUpdatedAt: newUpdatedAt,\n versionThumbnailId: thumbnailId,\n }\n\n versionPatches.push(versionPatch)\n }\n\n try {\n await updateEntities({ operations, entityType })\n onUploaded && onUploaded(operations)\n } catch (error) {\n console.error('Error uploading thumbnail:', error)\n }\n }\n\n const handleUploadThumbnail = async (file: File) => {\n if (!file) return resetState()\n\n try {\n // check file is an image\n if (!file.type.includes('image')) {\n throw new Error('File is not an image')\n }\n\n let promises = []\n for (const entity of entities) {\n const { id, entityType, projectName } = entity\n\n if (!projectName) throw new Error('Project name is required')\n\n const promise = axios.post(\n projectName && `/api/projects/${projectName}/${entityType}s/${id}/thumbnail`,\n file,\n {\n onUploadProgress: (e) => {\n setProgress(Math.round((100 * e.loaded) / (e.total || file.size)))\n },\n headers: {\n 'Content-Type': file.type,\n },\n },\n )\n\n promises.push(promise)\n }\n\n const res = await Promise.all(promises)\n\n const updatedEntities = res.map((res, i) => ({\n thumbnailId: res.data.id as string,\n id: entities[i].id,\n }))\n\n handleThumbnailFileUploaded(updatedEntities)\n resetState()\n } catch (error: any) {\n console.error(error)\n toast.error(error.message)\n resetState()\n }\n }\n\n const [updateEntities] = useUpdateEntitiesMutation()\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current++\n if (dragCounterRef.current === 1) {\n setIsDraggingFile(true)\n }\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current--\n if (dragCounterRef.current === 0) {\n setIsDraggingFile(false)\n setDraggingZone(null)\n }\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n }\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault()\n dragCounterRef.current = 0\n setIsDraggingFile(false)\n setDraggingZone(null)\n\n if (!e.dataTransfer.files || e.dataTransfer.files.length === 0) {\n return\n }\n\n if (draggingZone === 'thumbnail') {\n setUploadingType('thumbnail')\n const file = e.dataTransfer.files[0]\n // try to upload the thumbnail\n handleUploadThumbnail(file)\n }\n\n if (draggingZone === 'version') {\n setUploadingType('version')\n const files = e.dataTransfer.files\n // try to upload the reviewables using the hook\n handleVersionUpload(files)\n }\n }\n\n // upload thumbnail from input (right click on thumbnail)\n const handleInputUpload = async (event: ChangeEvent<HTMLInputElement>, type: UploadType) => {\n const files = event.target.files\n if (!files || files.length === 0) {\n return\n }\n\n if (type === 'version') {\n setUploadingType('version')\n handleVersionUpload(files)\n }\n if (type === 'thumbnail') {\n setUploadingType('thumbnail')\n handleUploadThumbnail(files[0])\n }\n }\n\n const thumbnailInputRef = useRef<HTMLInputElement>(null)\n const versionsInputRef = useRef<HTMLInputElement>(null)\n\n return (\n <ThumbnailUploadProvider\n entities={entities}\n handleThumbnailUpload={handleThumbnailFileUploaded}\n thumbnailInputRef={thumbnailInputRef}\n versionsInputRef={canUploadVersions ? versionsInputRef : undefined}\n >\n <Styled.DragAndDropWrapper\n className={clsx({ dragging: isDraggingFile })}\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n <ThumbnailWrapper>\n <div>{children}</div>\n </ThumbnailWrapper>\n {isDraggingFile && (\n <Styled.DropZones>\n {availableDropZones.map((zone) => (\n <Dropzone\n key={zone.id}\n id={zone.id}\n label={zone.label}\n icon={zone.icon}\n isActive={draggingZone === zone.id}\n onDragOver={() => setDraggingZone(zone.id)}\n onDragLeave={() => setDraggingZone(null)}\n />\n ))}\n </Styled.DropZones>\n )}\n {(uploadingType === 'thumbnail' || uploadingType === 'version') && (\n <Styled.DropZones>\n <Styled.UploadingProgress>\n <Styled.Progress\n style={{\n right: `${100 - progress}%`,\n }}\n />\n <span className=\"label\">{`Uploading ${uploadingType}...`}</span>\n </Styled.UploadingProgress>\n <Styled.CancelButton icon={'close'} variant=\"text\" onClick={resetState} />\n </Styled.DropZones>\n )}\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'thumbnail')}\n ref={thumbnailInputRef}\n />\n <input\n type=\"file\"\n onChange={(e) => handleInputUpload(e, 'version')}\n ref={versionsInputRef}\n />\n </Styled.DragAndDropWrapper>\n\n {/* Product creation dialog */}\n <EntityPanelUploaderDialog\n isOpen={showProductDialog}\n files={pendingFiles}\n onSubmit={handleDialogSubmit}\n onCancel={handleDialogCancel}\n />\n </ThumbnailUploadProvider>\n )\n}\n"],"names":["dropZones","EntityPanelUploader","children","entityType","entities","projectName","onUploaded","onVersionCreated","dispatch","useDetailsPanelContext","isDraggingFile","setIsDraggingFile","useState","draggingZone","setDraggingZone","dragCounterRef","useRef","uploadingType","setUploadingType","progress","setProgress","showProductDialog","setShowProductDialog","pendingFiles","setPendingFiles","singleEntity","taskId","_a","folderId","_b","productId","_c","versionId","canUploadVersions","uploadReviewableFiles","useReviewablesUpload","availableDropZones","zone","resetState","handleDialogSubmit","productName","sanitizedName","sanitizeProductName","toast","productRes","createProductHelper","createProduct","uploadVersionWithProduct","error","handleUploadError","handleDialogCancel","createVersion","useCreateVersionMutation","useCreateProductMutation","handleVersionUpload","files","nextVersion","getNextVersionNumber","versionRes","createVersionHelper","handleThumbnailFileUploaded","thumbnails","newUpdatedAt","operations","entity","entityToPatch","e","currentAssignees","updateEntities","handleUploadThumbnail","file","promises","id","promise","axios","updatedEntities","res","i","useUpdateEntitiesMutation","handleDragEnter","handleDragLeave","handleDragOver","handleDrop","handleInputUpload","event","type","thumbnailInputRef","versionsInputRef","jsxs","ThumbnailUploadProvider","Styled.DragAndDropWrapper","clsx","jsx","ThumbnailWrapper","Styled.DropZones","Dropzone","Styled.UploadingProgress","Styled.Progress","Styled.CancelButton","EntityPanelUploaderDialog"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=require("../../../../_virtual/jsx-runtime.cjs.js"),s=require("react");require("../../api/base/client.cjs.js");require("../../api/generated/graphql.cjs.js");require("../../api/generated/graphqlLinks.cjs.js");require("../../api/generated/access.cjs.js");require("../../api/generated/actions.cjs.js");require("../../api/generated/activityFeed.cjs.js");require("../../api/generated/addons.cjs.js");require("../../api/generated/anatomy.cjs.js");require("../../api/generated/attributes.cjs.js");require("../../api/generated/authentication.cjs.js");require("../../api/generated/bundles.cjs.js");require("../../api/generated/configuration.cjs.js");require("../../api/generated/desktop.cjs.js");require("../../api/generated/entityLists.cjs.js");require("../../api/generated/events.cjs.js");require("../../api/generated/files.cjs.js");require("../../api/generated/folders.cjs.js");require("../../api/generated/inbox.cjs.js");require("../../api/generated/links.cjs.js");require("../../api/generated/market.cjs.js");require("../../api/generated/onboarding.cjs.js");require("../../api/generated/operations.cjs.js");require("../../api/generated/products.cjs.js");require("../../api/generated/projectDashboard.cjs.js");require("../../api/generated/projects.cjs.js");require("../../api/generated/reviewables.cjs.js");require("../../api/generated/services.cjs.js");require("../../api/generated/system.cjs.js");require("../../api/generated/tasks.cjs.js");require("../../api/generated/teams.cjs.js");require("../../api/generated/thumbnails.cjs.js");require("../../api/generated/uRIs.cjs.js");require("../../api/generated/users.cjs.js");require("../../api/generated/versions.cjs.js");require("../../api/generated/workfiles.cjs.js");require("../../api/generated/ynputCloud.cjs.js");require("../../api/generated/grouping.cjs.js");require("../../api/generated/views.cjs.js");require("../../api/queries/actions/getActions.cjs.js");require("../../api/queries/activities/getActivities.cjs.js");require("../../api/queries/activities/updateActivities.cjs.js");require("../../api/queries/activities/updateReaction.cjs.js");require("../../api/queries/activities/getMentions.cjs.js");require("../../api/queries/activities/getCategories.cjs.js");require("../../api/queries/addons/getAddons.cjs.js");require("../../api/queries/addons/updateAddons.cjs.js");require("../../api/queries/attributes/getAttributes.cjs.js");require("../../api/queries/attributes/updateAttributes.cjs.js");require("../../api/queries/authentication/getAuthentication.cjs.js");const U=require("../../api/queries/cloud/cloud.cjs.js");require("../../api/queries/entities/getEntity.cjs.js");require("../../api/queries/entities/getEntityPanel.cjs.js");require("../../api/queries/entities/updateEntity.cjs.js");require("../../api/queries/entityLists/getLists.cjs.js");require("../../api/queries/entityLists/updateLists.cjs.js");require("../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../api/queries/entityLists/listFolders.cjs.js");require("../../api/queries/folders/getFolders.cjs.js");require("../../api/queries/grouping/getGrouping.cjs.js");require("../../api/queries/links/updateLinks.cjs.js");require("../../api/queries/links/getLinks.cjs.js");require("../../api/queries/links/getEntityLinks.cjs.js");require("../../api/queries/overview/getOverview.cjs.js");require("../../api/queries/overview/updateOverview.cjs.js");require("../../api/queries/versions/getVersionsProducts.cjs.js");require("../../api/queries/permissions/getPermissions.cjs.js");require("../../api/queries/products/createProduct.cjs.js");require("../../api/queries/project/getProject.cjs.js");require("../../api/queries/project/updateProject.cjs.js");require("../../api/queries/review/getReview.cjs.js");require("../../api/queries/review/updateReview.cjs.js");require("../../api/queries/share/share.cjs.js");require("../../api/queries/system/getSystem.cjs.js");require("../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../api/queries/users/getUsers.cjs.js");require("../../api/queries/users/updateUsers.cjs.js");require("../../api/queries/users/guests.cjs.js");require("../../api/queries/versions/updateVersions.cjs.js");require("../../api/queries/views/getViews.cjs.js");require("../../api/queries/views/updateViews.cjs.js");require("../../api/queries/watchers/getWatchers.cjs.js");require("../../api/queries/uris/getUris.cjs.js");require("../../context/RemoteModulesContext.cjs.js");require("../../context/DetailsPanelContext.cjs.js");require("../../context/ThumbnailUploaderContext.cjs.js");require("../../context/SettingsPanelContext.cjs.js");require("../../context/pip/PiPProvider.cjs.js");require("react-dom");require("../../context/pip/PiPWrapper.cjs.js");require("../../context/AddonProjectContext.cjs.js");require("../../context/AddonContext.cjs.js");require("../../context/PowerpackContext.cjs.js");require("../../context/MoveEntityContext.cjs.js");require("../../context/MenuContext.cjs.js");require("../../context/WebsocketContext.cjs.js");const G=require("../../context/GlobalContext.cjs.js");require("../../context/ProjectContext.cjs.js");require("../../context/ProjectFoldersContext.cjs.js");require("../../context/UriContext.cjs.js");const m=s.createContext(void 0),R=({children:d})=>{var w,p;const[n,h]=s.useState(!1),{siteInfo:u,user:r,cloudInfo:o}=G.useGlobalContext(),{data:a,isLoading:b}=U.useGetFeedbackVerificationQuery({},{skip:!(r!=null&&r.name)||!o}),k=()=>{if(!n){const e=document.createElement("script");e.src="https://do.featurebase.app/js/sdk.js",e.id="featurebase-sdk",e.async=!0,document.body.appendChild(e),h(!0)}},y=()=>{const e=window;typeof e.Featurebase!="function"&&(e.Featurebase=function(){(e.Featurebase.q=e.Featurebase.q||[]).push(arguments)})},S=((w=u==null?void 0:u.version)==null?void 0:w.split("+")[0])||"unknown",C=((p=u==null?void 0:u.version)==null?void 0:p.split("+")[1])||"unknown",z=()=>{if(!(r!=null&&r.name)||!(a!=null&&a.available))return;const e={...a.data,customFields:{origin:window.location.origin,serverVersion:S,frontendVersion:C,instanceId:o==null?void 0:o.instanceId}};console.log(e),window.Featurebase("identify",e,t=>{t?console.error(t):console.log("Featurebase identify completed")})},[c,E]=s.useState(!1),[M,P]=s.useState(0),x=()=>{const e=window;if(typeof e.Featurebase=="function"){if(console.log("Initializing Featurebase messenger widget"),!(a!=null&&a.available))return console.warn("messenger verification not available, skipping messenger init");e.Featurebase("boot",{theme:"dark",...a==null?void 0:a.data},i=>{i?console.error(i):(console.log("Featurebase messenger completed"),E(!0),e.Featurebase("onUnreadCountChange",function(t){P(t)}))})}},v=()=>{var t,F;const e=[];if((t=r==null?void 0:r.data)!=null&&t.isAdmin){const A=["Server","Addon","Pipeline"];e.push(...A)}else u!=null&&u.disableChangelog||e.push("Highlights");const i=window;return typeof i.Featurebase=="function"&&i.Featurebase("init_changelog_widget",{organization:"ayon",dropdown:{enabled:!0},popup:{enabled:!0,usersName:(F=r==null?void 0:r.attrib)==null?void 0:F.fullName,autoOpenForNewUpdates:!0},category:e,theme:"dark"}),!1},V=()=>{const e=window;return typeof e.Featurebase=="function"&&e.Featurebase("initialize_feedback_widget",{organization:"ayon",theme:"dark",metadata:{}},i=>{i&&console.error("Error initializing feedback widget:",i)}),!1},L=()=>{const e=window;return typeof e.Featurebase=="function"&&e.Featurebase("initialize_portal_widget",{organization:"ayon",fullScreen:!0,initialPage:"MainView"},i=>i?(console.error("Error initializing portal widget:",i),!1):!0),!1};s.useEffect(()=>{r!=null&&r.name&&u&&(n||(k(),y(),v(),V(),L()))},[r==null?void 0:r.name,n,u]);const[f,j]=s.useState(!1);s.useEffect(()=>{!(r!=null&&r.name)||!o||!a||!n||f||(z(),j(!0))},[r==null?void 0:r.name,o==null?void 0:o.instanceId,a==null?void 0:a.available,n,window.location.pathname,f]),s.useEffect(()=>{b||!n||x()},[a,b,n]);const H=()=>{window.postMessage({target:"FeaturebaseWidget",data:{action:"openFeedbackWidget"}})},W=(e="MainView",i)=>{window.postMessage({target:"FeaturebaseWidget",data:{action:"changePage",payload:e,openWidget:!0,...i&&{articleId:i}}})},[q,l]=s.useState(!1),g=document.getElementById("fb-messenger-root"),_=e=>g instanceof HTMLElement&&(g.style.display=e?"block":"none");s.useEffect(()=>{!n||!c||_(q)},[n,c,q]),s.useEffect(()=>{if(!n||!c)return;const e=window;typeof e.Featurebase=="function"&&e.Featurebase("onHide",function(){l(!1)})},[n,c]);const N=(e="Home",i)=>{const t=window;if(typeof t.Featurebase!="function"){window.alert("Featurebase SDK is not loaded yet. Please try again later."),console.warn("Featurebase SDK is not loaded yet.");return}if(q){t.Featurebase("hide"),l(!1);return}switch(l(!0),e){case"Home":t.Featurebase("show");break;case"Messages":t.Featurebase("show","messages");break;case"Changelog":t.Featurebase("show","changelog");break;case"Help":t.Featurebase("show","help");break;case"ShowArticle":i?t.Featurebase("showArticle",i):t.Featurebase("show","help");break;case"NewMessage":t.Featurebase("showNewMessage",i);break;default:t.Featurebase("show");break}};return D.jsxRuntimeExports.jsx(m.Provider,{value:{openSupport:N,openFeedback:H,openPortal:W,messengerLoaded:c,unreadCount:M,messengerVisibility:q,setMessengerVisibility:l,loaded:n},children:d})},K=()=>{const d=s.useContext(m);if(!d)throw new Error("useFeedback must be used within a FeedbackProvider");return d};exports.FeedbackProvider=R;exports.useFeedback=K;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=require("../../../../_virtual/jsx-runtime.cjs.js"),s=require("react");require("../../api/base/client.cjs.js");require("../../api/generated/graphql.cjs.js");require("../../api/generated/graphqlLinks.cjs.js");require("../../api/generated/access.cjs.js");require("../../api/generated/actions.cjs.js");require("../../api/generated/activityFeed.cjs.js");require("../../api/generated/addons.cjs.js");require("../../api/generated/anatomy.cjs.js");require("../../api/generated/attributes.cjs.js");require("../../api/generated/authentication.cjs.js");require("../../api/generated/bundles.cjs.js");require("../../api/generated/configuration.cjs.js");require("../../api/generated/desktop.cjs.js");require("../../api/generated/entityLists.cjs.js");require("../../api/generated/events.cjs.js");require("../../api/generated/files.cjs.js");require("../../api/generated/folders.cjs.js");require("../../api/generated/inbox.cjs.js");require("../../api/generated/links.cjs.js");require("../../api/generated/market.cjs.js");require("../../api/generated/onboarding.cjs.js");require("../../api/generated/operations.cjs.js");require("../../api/generated/products.cjs.js");require("../../api/generated/projectDashboard.cjs.js");require("../../api/generated/projects.cjs.js");require("../../api/generated/reviewables.cjs.js");require("../../api/generated/services.cjs.js");require("../../api/generated/system.cjs.js");require("../../api/generated/tasks.cjs.js");require("../../api/generated/teams.cjs.js");require("../../api/generated/thumbnails.cjs.js");require("../../api/generated/uRIs.cjs.js");require("../../api/generated/users.cjs.js");require("../../api/generated/versions.cjs.js");require("../../api/generated/workfiles.cjs.js");require("../../api/generated/ynputCloud.cjs.js");require("../../api/generated/grouping.cjs.js");require("../../api/generated/views.cjs.js");require("../../api/queries/actions/getActions.cjs.js");require("../../api/queries/activities/getActivities.cjs.js");require("../../api/queries/activities/updateActivities.cjs.js");require("../../api/queries/activities/updateReaction.cjs.js");require("../../api/queries/activities/getMentions.cjs.js");require("../../api/queries/activities/getCategories.cjs.js");require("../../api/queries/addons/getAddons.cjs.js");require("../../api/queries/addons/updateAddons.cjs.js");require("../../api/queries/attributes/getAttributes.cjs.js");require("../../api/queries/attributes/updateAttributes.cjs.js");require("../../api/queries/authentication/getAuthentication.cjs.js");const U=require("../../api/queries/cloud/cloud.cjs.js");require("../../api/queries/config/getConfig.cjs.js");require("../../api/queries/config/updateConfig.cjs.js");require("../../api/queries/entities/getEntity.cjs.js");require("../../api/queries/entities/getEntityPanel.cjs.js");require("../../api/queries/entities/updateEntity.cjs.js");require("../../api/queries/entityLists/getLists.cjs.js");require("../../api/queries/entityLists/updateLists.cjs.js");require("../../api/queries/entityLists/getListsAttributes.cjs.js");require("../../api/queries/entityLists/updateListsAttributes.cjs.js");require("../../api/queries/entityLists/listFolders.cjs.js");require("../../api/queries/folders/getFolders.cjs.js");require("../../api/queries/grouping/getGrouping.cjs.js");require("../../api/queries/links/updateLinks.cjs.js");require("../../api/queries/links/getLinks.cjs.js");require("../../api/queries/links/getEntityLinks.cjs.js");require("../../api/queries/overview/getOverview.cjs.js");require("../../api/queries/overview/updateOverview.cjs.js");require("../../api/queries/versions/getVersionsProducts.cjs.js");require("../../api/queries/permissions/getPermissions.cjs.js");require("../../api/queries/products/createProduct.cjs.js");require("../../api/queries/project/getProject.cjs.js");require("../../api/queries/project/updateProject.cjs.js");require("../../api/queries/review/getReview.cjs.js");require("../../api/queries/review/updateReview.cjs.js");require("../../api/queries/share/share.cjs.js");require("../../api/queries/system/getSystem.cjs.js");require("../../api/queries/userDashboard/getUserDashboard.cjs.js");require("../../api/queries/users/getUsers.cjs.js");require("../../api/queries/users/updateUsers.cjs.js");require("../../api/queries/users/guests.cjs.js");require("../../api/queries/versions/updateVersions.cjs.js");require("../../api/queries/views/getViews.cjs.js");require("../../api/queries/views/updateViews.cjs.js");require("../../api/queries/watchers/getWatchers.cjs.js");require("../../api/queries/uris/getUris.cjs.js");require("../../context/RemoteModulesContext.cjs.js");require("../../context/DetailsPanelContext.cjs.js");require("../../context/ThumbnailUploaderContext.cjs.js");require("../../context/SettingsPanelContext.cjs.js");require("../../context/pip/PiPProvider.cjs.js");require("react-dom");require("../../context/pip/PiPWrapper.cjs.js");require("../../context/AddonProjectContext.cjs.js");require("../../context/AddonContext.cjs.js");require("../../context/PowerpackContext.cjs.js");require("../../context/MoveEntityContext.cjs.js");require("../../context/MenuContext.cjs.js");require("../../context/WebsocketContext.cjs.js");const G=require("../../context/GlobalContext.cjs.js");require("../../context/ProjectContext.cjs.js");require("../../context/ProjectFoldersContext.cjs.js");require("../../context/UriContext.cjs.js");const m=s.createContext(void 0),R=({children:d})=>{var w,p;const[n,h]=s.useState(!1),{siteInfo:u,user:r,cloudInfo:o}=G.useGlobalContext(),{data:a,isLoading:b}=U.useGetFeedbackVerificationQuery({},{skip:!(r!=null&&r.name)||!o}),k=()=>{if(!n){const e=document.createElement("script");e.src="https://do.featurebase.app/js/sdk.js",e.id="featurebase-sdk",e.async=!0,document.body.appendChild(e),h(!0)}},y=()=>{const e=window;typeof e.Featurebase!="function"&&(e.Featurebase=function(){(e.Featurebase.q=e.Featurebase.q||[]).push(arguments)})},S=((w=u==null?void 0:u.version)==null?void 0:w.split("+")[0])||"unknown",C=((p=u==null?void 0:u.version)==null?void 0:p.split("+")[1])||"unknown",z=()=>{if(!(r!=null&&r.name)||!(a!=null&&a.available))return;const e={...a.data,customFields:{origin:window.location.origin,serverVersion:S,frontendVersion:C,instanceId:o==null?void 0:o.instanceId}};console.log(e),window.Featurebase("identify",e,t=>{t?console.error(t):console.log("Featurebase identify completed")})},[c,E]=s.useState(!1),[M,P]=s.useState(0),x=()=>{const e=window;if(typeof e.Featurebase=="function"){if(console.log("Initializing Featurebase messenger widget"),!(a!=null&&a.available))return console.warn("messenger verification not available, skipping messenger init");e.Featurebase("boot",{theme:"dark",...a==null?void 0:a.data},i=>{i?console.error(i):(console.log("Featurebase messenger completed"),E(!0),e.Featurebase("onUnreadCountChange",function(t){P(t)}))})}},v=()=>{var t,F;const e=[];if((t=r==null?void 0:r.data)!=null&&t.isAdmin){const A=["Server","Addon","Pipeline"];e.push(...A)}else u!=null&&u.disableChangelog||e.push("Highlights");const i=window;return typeof i.Featurebase=="function"&&i.Featurebase("init_changelog_widget",{organization:"ayon",dropdown:{enabled:!0},popup:{enabled:!0,usersName:(F=r==null?void 0:r.attrib)==null?void 0:F.fullName,autoOpenForNewUpdates:!0},category:e,theme:"dark"}),!1},V=()=>{const e=window;return typeof e.Featurebase=="function"&&e.Featurebase("initialize_feedback_widget",{organization:"ayon",theme:"dark",metadata:{}},i=>{i&&console.error("Error initializing feedback widget:",i)}),!1},L=()=>{const e=window;return typeof e.Featurebase=="function"&&e.Featurebase("initialize_portal_widget",{organization:"ayon",fullScreen:!0,initialPage:"MainView"},i=>i?(console.error("Error initializing portal widget:",i),!1):!0),!1};s.useEffect(()=>{r!=null&&r.name&&u&&(n||(k(),y(),v(),V(),L()))},[r==null?void 0:r.name,n,u]);const[f,j]=s.useState(!1);s.useEffect(()=>{!(r!=null&&r.name)||!o||!a||!n||f||(z(),j(!0))},[r==null?void 0:r.name,o==null?void 0:o.instanceId,a==null?void 0:a.available,n,window.location.pathname,f]),s.useEffect(()=>{b||!n||x()},[a,b,n]);const H=()=>{window.postMessage({target:"FeaturebaseWidget",data:{action:"openFeedbackWidget"}})},W=(e="MainView",i)=>{window.postMessage({target:"FeaturebaseWidget",data:{action:"changePage",payload:e,openWidget:!0,...i&&{articleId:i}}})},[q,l]=s.useState(!1),g=document.getElementById("fb-messenger-root"),_=e=>g instanceof HTMLElement&&(g.style.display=e?"block":"none");s.useEffect(()=>{!n||!c||_(q)},[n,c,q]),s.useEffect(()=>{if(!n||!c)return;const e=window;typeof e.Featurebase=="function"&&e.Featurebase("onHide",function(){l(!1)})},[n,c]);const N=(e="Home",i)=>{const t=window;if(typeof t.Featurebase!="function"){window.alert("Featurebase SDK is not loaded yet. Please try again later."),console.warn("Featurebase SDK is not loaded yet.");return}if(q){t.Featurebase("hide"),l(!1);return}switch(l(!0),e){case"Home":t.Featurebase("show");break;case"Messages":t.Featurebase("show","messages");break;case"Changelog":t.Featurebase("show","changelog");break;case"Help":t.Featurebase("show","help");break;case"ShowArticle":i?t.Featurebase("showArticle",i):t.Featurebase("show","help");break;case"NewMessage":t.Featurebase("showNewMessage",i);break;default:t.Featurebase("show");break}};return D.jsxRuntimeExports.jsx(m.Provider,{value:{openSupport:N,openFeedback:H,openPortal:W,messengerLoaded:c,unreadCount:M,messengerVisibility:q,setMessengerVisibility:l,loaded:n},children:d})},K=()=>{const d=s.useContext(m);if(!d)throw new Error("useFeedback must be used within a FeedbackProvider");return d};exports.FeedbackProvider=R;exports.useFeedback=K;
2
2
  //# sourceMappingURL=FeedbackContext.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackContext.cjs.js","sources":["../../../../../src/components/Feedback/FeedbackContext.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, useEffect, useState } from 'react'\nimport { useGetFeedbackVerificationQuery } from '@shared/api'\nimport { useGlobalContext } from '@shared/context'\n\nexport type FeedbackContextType = {\n loaded: boolean\n openSupport: (\n page?: 'Home' | 'Messages' | 'Changelog' | 'Help' | 'NewMessage' | 'ShowArticle',\n id?: string,\n ) => void\n messengerLoaded: boolean // whether the messenger widget is loaded\n unreadCount: number // number of unread messages\n messengerVisibility: boolean\n setMessengerVisibility: (show: boolean) => void // show/hide the messenger icon\n openFeedback: () => void\n openPortal: (\n page?: 'MainView' | 'RoadmapView' | 'CreatePost' | 'PostsView' | 'ChangelogView' | 'HelpView',\n articleId?: string,\n ) => void\n}\n\nconst FeedbackContext = createContext<FeedbackContextType | undefined>(undefined)\n\ntype FeedbackProviderProps = {\n children: ReactNode\n}\n\nexport const FeedbackProvider: React.FC<FeedbackProviderProps> = ({ children }) => {\n const [scriptLoaded, setScriptLoaded] = useState(false)\n const { siteInfo, user, cloudInfo } = useGlobalContext()\n const { data: verification, isLoading: isLoadingVerification } = useGetFeedbackVerificationQuery(\n {},\n {\n skip: !user?.name || !cloudInfo,\n },\n )\n\n const loadScript = () => {\n if (!scriptLoaded) {\n const script = document.createElement('script')\n script.src = 'https://do.featurebase.app/js/sdk.js'\n script.id = 'featurebase-sdk'\n script.async = true\n document.body.appendChild(script)\n setScriptLoaded(true)\n }\n }\n\n const initialize = () => {\n // Initialize Featurebase\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n win.Featurebase = function () {\n ;(win.Featurebase.q = win.Featurebase.q || []).push(arguments)\n }\n }\n }\n\n const serverVersion = siteInfo?.version?.split('+')[0] || 'unknown'\n const frontendVersion = siteInfo?.version?.split('+')[1] || 'unknown'\n\n const identifyUser = () => {\n if (!user?.name || !verification?.available) return\n\n const identifyData = {\n ...verification.data,\n customFields: {\n origin: window.location.origin,\n serverVersion: serverVersion,\n frontendVersion: frontendVersion,\n instanceId: cloudInfo?.instanceId,\n },\n }\n\n console.log(identifyData)\n\n const win = window as any\n win.Featurebase('identify', identifyData, (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase identify completed')\n }\n })\n }\n\n const [messengerLoaded, setMessengerLoaded] = useState(false)\n const [unreadCount, setUnreadCount] = useState(0)\n\n // MESSENGER WIDGET\n const initializeMessenger = (): void => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n console.log('Initializing Featurebase messenger widget')\n if (!verification?.available)\n return console.warn('messenger verification not available, skipping messenger init')\n win.Featurebase(\n 'boot',\n {\n theme: 'dark',\n ...verification?.data,\n },\n (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase messenger completed')\n setMessengerLoaded(true)\n\n // register event listener for unread messages\n win.Featurebase('onUnreadCountChange', function (unreadCount: number) {\n setUnreadCount(unreadCount)\n })\n }\n },\n )\n }\n }\n\n // CHANGELOG WIDGET\n const initializeChangelog = (): boolean => {\n // everyone sees highlights\n const categories: string[] = []\n\n if (user?.data?.isAdmin) {\n // admins see everything\n const adminCategories = ['Server', 'Addon', 'Pipeline']\n categories.push(...adminCategories)\n } else if (!siteInfo?.disableChangelog) {\n // users only see highlights (unless disabled)\n // admins do not see highlights as it is a subset of the other categories\n categories.push('Highlights')\n }\n\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('init_changelog_widget', {\n organization: 'ayon',\n dropdown: {\n enabled: true,\n },\n popup: {\n enabled: true,\n usersName: user?.attrib?.fullName,\n autoOpenForNewUpdates: true,\n },\n category: categories,\n theme: 'dark',\n })\n }\n return false\n }\n\n // FEEDBACK WIDGET\n const initializeFeedbackWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_feedback_widget',\n {\n organization: 'ayon',\n theme: 'dark',\n metadata: {},\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing feedback widget:', error)\n } else {\n }\n },\n )\n }\n return false\n }\n\n // PORTAL WIDGET (old)\n const initializePortalWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_portal_widget',\n {\n organization: 'ayon',\n fullScreen: true,\n initialPage: 'MainView',\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing portal widget:', error)\n return false\n } else {\n return true\n }\n },\n )\n }\n return false\n }\n\n // Use an environment variable to skip loading Featurebase in certain environments\n // @ts-expect-error: Vite provides import.meta.env at runtime\n const skipFeaturebase = import.meta.env.VITE_SKIP_FEATUREBASE === 'true'\n\n // Load Featurebase script and initialize widgets\n useEffect(() => {\n // if skip flag is set, do not load the script\n if (skipFeaturebase) return\n // if not logged in, do not load the script\n if (!user?.name) return\n if (!siteInfo) return\n\n // if already loaded, do not load again\n if (scriptLoaded) return\n\n // Load the Featurebase script\n loadScript()\n\n // Initialize Featurebase\n initialize()\n\n // Initialize changelog widget\n initializeChangelog()\n\n // Initialize feedback widget\n initializeFeedbackWidget()\n\n // Initialize portal widget\n initializePortalWidget()\n }, [user?.name, scriptLoaded, siteInfo])\n\n const [identified, setIdentified] = useState(false)\n // verify user\n useEffect(() => {\n // check if we can identify the user\n if (!user?.name || !cloudInfo || !verification || !scriptLoaded) return\n // if we are already identified, do not identify again\n if (identified) return\n // Identify the user\n identifyUser()\n setIdentified(true)\n }, [\n user?.name,\n cloudInfo?.instanceId,\n verification?.available,\n scriptLoaded,\n window.location.pathname,\n identified,\n ])\n\n // load messenger widget once verification is done loading\n // we don't need verification but we should use it if we have it\n useEffect(() => {\n // wait for script to be loaded and verification to finish loading\n if (isLoadingVerification || !scriptLoaded) return\n\n // initialize the messenger widget\n initializeMessenger()\n }, [verification, isLoadingVerification, scriptLoaded])\n\n const openFeedback: FeedbackContextType['openFeedback'] = () => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'openFeedbackWidget',\n },\n })\n }\n\n const openPortal = (\n page:\n | 'MainView'\n | 'RoadmapView'\n | 'CreatePost'\n | 'PostsView'\n | 'ChangelogView'\n | 'HelpView' = 'MainView',\n articleId?: string,\n ) => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'changePage',\n payload: page,\n openWidget: true,\n ...(articleId && { articleId }),\n },\n })\n }\n\n const [messengerVisibility, setMessengerVisibility] = useState(false)\n const supportElement = document.getElementById('fb-messenger-root')\n\n const setSupportDisplay = (show: boolean) =>\n supportElement instanceof HTMLElement &&\n (supportElement.style.display = show ? 'block' : 'none')\n\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n setSupportDisplay(messengerVisibility)\n }, [scriptLoaded, messengerLoaded, messengerVisibility])\n\n // when the messenger is hidden, we need to hide the root element again\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('onHide', function () {\n // hide the messenger root element\n setMessengerVisibility(false)\n })\n }\n }, [scriptLoaded, messengerLoaded])\n\n const openSupport: FeedbackContextType['openSupport'] = (page = 'Home', id) => {\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n window.alert('Featurebase SDK is not loaded yet. Please try again later.')\n console.warn('Featurebase SDK is not loaded yet.')\n return\n }\n\n if (messengerVisibility) {\n // if the messenger is already visible, close it\n win.Featurebase('hide')\n setMessengerVisibility(false)\n return\n }\n\n // ensure the messenger is visible\n setMessengerVisibility(true)\n\n switch (page) {\n case 'Home':\n // Show messenger home\n win.Featurebase('show')\n break\n case 'Messages':\n // Show messages view\n win.Featurebase('show', 'messages')\n break\n case 'Changelog':\n // Show changelog view\n win.Featurebase('show', 'changelog')\n break\n case 'Help':\n // Open help center\n win.Featurebase('show', 'help')\n break\n case 'ShowArticle':\n // Open a specific help article\n if (id) win.Featurebase('showArticle', id)\n else win.Featurebase('show', 'help')\n break\n case 'NewMessage':\n // Open new message dialog\n win.Featurebase('showNewMessage', id)\n break\n default:\n // Default to showing the main widget\n win.Featurebase('show')\n break\n }\n }\n\n return (\n <FeedbackContext.Provider\n value={{\n openSupport,\n openFeedback,\n openPortal,\n messengerLoaded,\n unreadCount,\n messengerVisibility,\n setMessengerVisibility,\n loaded: scriptLoaded,\n }}\n >\n {children}\n </FeedbackContext.Provider>\n )\n}\n\nexport const useFeedback = (): FeedbackContextType => {\n const context = useContext(FeedbackContext)\n if (!context) {\n throw new Error('useFeedback must be used within a FeedbackProvider')\n }\n return context\n}\n"],"names":["FeedbackContext","createContext","FeedbackProvider","children","scriptLoaded","setScriptLoaded","useState","siteInfo","user","cloudInfo","useGlobalContext","verification","isLoadingVerification","useGetFeedbackVerificationQuery","loadScript","script","initialize","win","serverVersion","_a","frontendVersion","_b","identifyUser","identifyData","err","messengerLoaded","setMessengerLoaded","unreadCount","setUnreadCount","initializeMessenger","initializeChangelog","categories","adminCategories","initializeFeedbackWidget","error","initializePortalWidget","useEffect","identified","setIdentified","openFeedback","openPortal","page","articleId","messengerVisibility","setMessengerVisibility","supportElement","setSupportDisplay","show","openSupport","id","jsx","useFeedback","context","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"FeedbackContext.cjs.js","sources":["../../../../../src/components/Feedback/FeedbackContext.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, useEffect, useState } from 'react'\nimport { useGetFeedbackVerificationQuery } from '@shared/api'\nimport { useGlobalContext } from '@shared/context'\n\nexport type FeedbackContextType = {\n loaded: boolean\n openSupport: (\n page?: 'Home' | 'Messages' | 'Changelog' | 'Help' | 'NewMessage' | 'ShowArticle',\n id?: string,\n ) => void\n messengerLoaded: boolean // whether the messenger widget is loaded\n unreadCount: number // number of unread messages\n messengerVisibility: boolean\n setMessengerVisibility: (show: boolean) => void // show/hide the messenger icon\n openFeedback: () => void\n openPortal: (\n page?: 'MainView' | 'RoadmapView' | 'CreatePost' | 'PostsView' | 'ChangelogView' | 'HelpView',\n articleId?: string,\n ) => void\n}\n\nconst FeedbackContext = createContext<FeedbackContextType | undefined>(undefined)\n\ntype FeedbackProviderProps = {\n children: ReactNode\n}\n\nexport const FeedbackProvider: React.FC<FeedbackProviderProps> = ({ children }) => {\n const [scriptLoaded, setScriptLoaded] = useState(false)\n const { siteInfo, user, cloudInfo } = useGlobalContext()\n const { data: verification, isLoading: isLoadingVerification } = useGetFeedbackVerificationQuery(\n {},\n {\n skip: !user?.name || !cloudInfo,\n },\n )\n\n const loadScript = () => {\n if (!scriptLoaded) {\n const script = document.createElement('script')\n script.src = 'https://do.featurebase.app/js/sdk.js'\n script.id = 'featurebase-sdk'\n script.async = true\n document.body.appendChild(script)\n setScriptLoaded(true)\n }\n }\n\n const initialize = () => {\n // Initialize Featurebase\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n win.Featurebase = function () {\n ;(win.Featurebase.q = win.Featurebase.q || []).push(arguments)\n }\n }\n }\n\n const serverVersion = siteInfo?.version?.split('+')[0] || 'unknown'\n const frontendVersion = siteInfo?.version?.split('+')[1] || 'unknown'\n\n const identifyUser = () => {\n if (!user?.name || !verification?.available) return\n\n const identifyData = {\n ...verification.data,\n customFields: {\n origin: window.location.origin,\n serverVersion: serverVersion,\n frontendVersion: frontendVersion,\n instanceId: cloudInfo?.instanceId,\n },\n }\n\n console.log(identifyData)\n\n const win = window as any\n win.Featurebase('identify', identifyData, (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase identify completed')\n }\n })\n }\n\n const [messengerLoaded, setMessengerLoaded] = useState(false)\n const [unreadCount, setUnreadCount] = useState(0)\n\n // MESSENGER WIDGET\n const initializeMessenger = (): void => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n console.log('Initializing Featurebase messenger widget')\n if (!verification?.available)\n return console.warn('messenger verification not available, skipping messenger init')\n win.Featurebase(\n 'boot',\n {\n theme: 'dark',\n ...verification?.data,\n },\n (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase messenger completed')\n setMessengerLoaded(true)\n\n // register event listener for unread messages\n win.Featurebase('onUnreadCountChange', function (unreadCount: number) {\n setUnreadCount(unreadCount)\n })\n }\n },\n )\n }\n }\n\n // CHANGELOG WIDGET\n const initializeChangelog = (): boolean => {\n // everyone sees highlights\n const categories: string[] = []\n\n if (user?.data?.isAdmin) {\n // admins see everything\n const adminCategories = ['Server', 'Addon', 'Pipeline']\n categories.push(...adminCategories)\n } else if (!siteInfo?.disableChangelog) {\n // users only see highlights (unless disabled)\n // admins do not see highlights as it is a subset of the other categories\n categories.push('Highlights')\n }\n\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('init_changelog_widget', {\n organization: 'ayon',\n dropdown: {\n enabled: true,\n },\n popup: {\n enabled: true,\n usersName: user?.attrib?.fullName,\n autoOpenForNewUpdates: true,\n },\n category: categories,\n theme: 'dark',\n })\n }\n return false\n }\n\n // FEEDBACK WIDGET\n const initializeFeedbackWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_feedback_widget',\n {\n organization: 'ayon',\n theme: 'dark',\n metadata: {},\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing feedback widget:', error)\n } else {\n }\n },\n )\n }\n return false\n }\n\n // PORTAL WIDGET (old)\n const initializePortalWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_portal_widget',\n {\n organization: 'ayon',\n fullScreen: true,\n initialPage: 'MainView',\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing portal widget:', error)\n return false\n } else {\n return true\n }\n },\n )\n }\n return false\n }\n\n // Use an environment variable to skip loading Featurebase in certain environments\n // @ts-expect-error: Vite provides import.meta.env at runtime\n const skipFeaturebase = import.meta.env.VITE_SKIP_FEATUREBASE === 'true'\n\n // Load Featurebase script and initialize widgets\n useEffect(() => {\n // if skip flag is set, do not load the script\n if (skipFeaturebase) return\n // if not logged in, do not load the script\n if (!user?.name) return\n if (!siteInfo) return\n\n // if already loaded, do not load again\n if (scriptLoaded) return\n\n // Load the Featurebase script\n loadScript()\n\n // Initialize Featurebase\n initialize()\n\n // Initialize changelog widget\n initializeChangelog()\n\n // Initialize feedback widget\n initializeFeedbackWidget()\n\n // Initialize portal widget\n initializePortalWidget()\n }, [user?.name, scriptLoaded, siteInfo])\n\n const [identified, setIdentified] = useState(false)\n // verify user\n useEffect(() => {\n // check if we can identify the user\n if (!user?.name || !cloudInfo || !verification || !scriptLoaded) return\n // if we are already identified, do not identify again\n if (identified) return\n // Identify the user\n identifyUser()\n setIdentified(true)\n }, [\n user?.name,\n cloudInfo?.instanceId,\n verification?.available,\n scriptLoaded,\n window.location.pathname,\n identified,\n ])\n\n // load messenger widget once verification is done loading\n // we don't need verification but we should use it if we have it\n useEffect(() => {\n // wait for script to be loaded and verification to finish loading\n if (isLoadingVerification || !scriptLoaded) return\n\n // initialize the messenger widget\n initializeMessenger()\n }, [verification, isLoadingVerification, scriptLoaded])\n\n const openFeedback: FeedbackContextType['openFeedback'] = () => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'openFeedbackWidget',\n },\n })\n }\n\n const openPortal = (\n page:\n | 'MainView'\n | 'RoadmapView'\n | 'CreatePost'\n | 'PostsView'\n | 'ChangelogView'\n | 'HelpView' = 'MainView',\n articleId?: string,\n ) => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'changePage',\n payload: page,\n openWidget: true,\n ...(articleId && { articleId }),\n },\n })\n }\n\n const [messengerVisibility, setMessengerVisibility] = useState(false)\n const supportElement = document.getElementById('fb-messenger-root')\n\n const setSupportDisplay = (show: boolean) =>\n supportElement instanceof HTMLElement &&\n (supportElement.style.display = show ? 'block' : 'none')\n\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n setSupportDisplay(messengerVisibility)\n }, [scriptLoaded, messengerLoaded, messengerVisibility])\n\n // when the messenger is hidden, we need to hide the root element again\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('onHide', function () {\n // hide the messenger root element\n setMessengerVisibility(false)\n })\n }\n }, [scriptLoaded, messengerLoaded])\n\n const openSupport: FeedbackContextType['openSupport'] = (page = 'Home', id) => {\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n window.alert('Featurebase SDK is not loaded yet. Please try again later.')\n console.warn('Featurebase SDK is not loaded yet.')\n return\n }\n\n if (messengerVisibility) {\n // if the messenger is already visible, close it\n win.Featurebase('hide')\n setMessengerVisibility(false)\n return\n }\n\n // ensure the messenger is visible\n setMessengerVisibility(true)\n\n switch (page) {\n case 'Home':\n // Show messenger home\n win.Featurebase('show')\n break\n case 'Messages':\n // Show messages view\n win.Featurebase('show', 'messages')\n break\n case 'Changelog':\n // Show changelog view\n win.Featurebase('show', 'changelog')\n break\n case 'Help':\n // Open help center\n win.Featurebase('show', 'help')\n break\n case 'ShowArticle':\n // Open a specific help article\n if (id) win.Featurebase('showArticle', id)\n else win.Featurebase('show', 'help')\n break\n case 'NewMessage':\n // Open new message dialog\n win.Featurebase('showNewMessage', id)\n break\n default:\n // Default to showing the main widget\n win.Featurebase('show')\n break\n }\n }\n\n return (\n <FeedbackContext.Provider\n value={{\n openSupport,\n openFeedback,\n openPortal,\n messengerLoaded,\n unreadCount,\n messengerVisibility,\n setMessengerVisibility,\n loaded: scriptLoaded,\n }}\n >\n {children}\n </FeedbackContext.Provider>\n )\n}\n\nexport const useFeedback = (): FeedbackContextType => {\n const context = useContext(FeedbackContext)\n if (!context) {\n throw new Error('useFeedback must be used within a FeedbackProvider')\n }\n return context\n}\n"],"names":["FeedbackContext","createContext","FeedbackProvider","children","scriptLoaded","setScriptLoaded","useState","siteInfo","user","cloudInfo","useGlobalContext","verification","isLoadingVerification","useGetFeedbackVerificationQuery","loadScript","script","initialize","win","serverVersion","_a","frontendVersion","_b","identifyUser","identifyData","err","messengerLoaded","setMessengerLoaded","unreadCount","setUnreadCount","initializeMessenger","initializeChangelog","categories","adminCategories","initializeFeedbackWidget","error","initializePortalWidget","useEffect","identified","setIdentified","openFeedback","openPortal","page","articleId","messengerVisibility","setMessengerVisibility","supportElement","setSupportDisplay","show","openSupport","id","jsx","useFeedback","context","useContext"],"mappings":"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"}
@@ -50,6 +50,8 @@ import "../../api/queries/attributes/getAttributes.es.js";
50
50
  import "../../api/queries/attributes/updateAttributes.es.js";
51
51
  import "../../api/queries/authentication/getAuthentication.es.js";
52
52
  import { useGetFeedbackVerificationQuery as B } from "../../api/queries/cloud/cloud.es.js";
53
+ import "../../api/queries/config/getConfig.es.js";
54
+ import "../../api/queries/config/updateConfig.es.js";
53
55
  import "../../api/queries/entities/getEntity.es.js";
54
56
  import "../../api/queries/entities/getEntityPanel.es.js";
55
57
  import "../../api/queries/entities/updateEntity.es.js";
@@ -100,7 +102,7 @@ import { useGlobalContext as O } from "../../context/GlobalContext.es.js";
100
102
  import "../../context/ProjectContext.es.js";
101
103
  import "../../context/ProjectFoldersContext.es.js";
102
104
  import "../../context/UriContext.es.js";
103
- const k = G(void 0), Ut = ({ children: c }) => {
105
+ const k = G(void 0), Gt = ({ children: c }) => {
104
106
  var w, F;
105
107
  const [a, y] = m(!1), { siteInfo: n, user: t, cloudInfo: s } = O(), { data: r, isLoading: b } = B(
106
108
  {},
@@ -288,14 +290,14 @@ const k = G(void 0), Ut = ({ children: c }) => {
288
290
  children: c
289
291
  }
290
292
  );
291
- }, qt = () => {
293
+ }, Kt = () => {
292
294
  const c = K(k);
293
295
  if (!c)
294
296
  throw new Error("useFeedback must be used within a FeedbackProvider");
295
297
  return c;
296
298
  };
297
299
  export {
298
- Ut as FeedbackProvider,
299
- qt as useFeedback
300
+ Gt as FeedbackProvider,
301
+ Kt as useFeedback
300
302
  };
301
303
  //# sourceMappingURL=FeedbackContext.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FeedbackContext.es.js","sources":["../../../../../src/components/Feedback/FeedbackContext.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, useEffect, useState } from 'react'\nimport { useGetFeedbackVerificationQuery } from '@shared/api'\nimport { useGlobalContext } from '@shared/context'\n\nexport type FeedbackContextType = {\n loaded: boolean\n openSupport: (\n page?: 'Home' | 'Messages' | 'Changelog' | 'Help' | 'NewMessage' | 'ShowArticle',\n id?: string,\n ) => void\n messengerLoaded: boolean // whether the messenger widget is loaded\n unreadCount: number // number of unread messages\n messengerVisibility: boolean\n setMessengerVisibility: (show: boolean) => void // show/hide the messenger icon\n openFeedback: () => void\n openPortal: (\n page?: 'MainView' | 'RoadmapView' | 'CreatePost' | 'PostsView' | 'ChangelogView' | 'HelpView',\n articleId?: string,\n ) => void\n}\n\nconst FeedbackContext = createContext<FeedbackContextType | undefined>(undefined)\n\ntype FeedbackProviderProps = {\n children: ReactNode\n}\n\nexport const FeedbackProvider: React.FC<FeedbackProviderProps> = ({ children }) => {\n const [scriptLoaded, setScriptLoaded] = useState(false)\n const { siteInfo, user, cloudInfo } = useGlobalContext()\n const { data: verification, isLoading: isLoadingVerification } = useGetFeedbackVerificationQuery(\n {},\n {\n skip: !user?.name || !cloudInfo,\n },\n )\n\n const loadScript = () => {\n if (!scriptLoaded) {\n const script = document.createElement('script')\n script.src = 'https://do.featurebase.app/js/sdk.js'\n script.id = 'featurebase-sdk'\n script.async = true\n document.body.appendChild(script)\n setScriptLoaded(true)\n }\n }\n\n const initialize = () => {\n // Initialize Featurebase\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n win.Featurebase = function () {\n ;(win.Featurebase.q = win.Featurebase.q || []).push(arguments)\n }\n }\n }\n\n const serverVersion = siteInfo?.version?.split('+')[0] || 'unknown'\n const frontendVersion = siteInfo?.version?.split('+')[1] || 'unknown'\n\n const identifyUser = () => {\n if (!user?.name || !verification?.available) return\n\n const identifyData = {\n ...verification.data,\n customFields: {\n origin: window.location.origin,\n serverVersion: serverVersion,\n frontendVersion: frontendVersion,\n instanceId: cloudInfo?.instanceId,\n },\n }\n\n console.log(identifyData)\n\n const win = window as any\n win.Featurebase('identify', identifyData, (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase identify completed')\n }\n })\n }\n\n const [messengerLoaded, setMessengerLoaded] = useState(false)\n const [unreadCount, setUnreadCount] = useState(0)\n\n // MESSENGER WIDGET\n const initializeMessenger = (): void => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n console.log('Initializing Featurebase messenger widget')\n if (!verification?.available)\n return console.warn('messenger verification not available, skipping messenger init')\n win.Featurebase(\n 'boot',\n {\n theme: 'dark',\n ...verification?.data,\n },\n (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase messenger completed')\n setMessengerLoaded(true)\n\n // register event listener for unread messages\n win.Featurebase('onUnreadCountChange', function (unreadCount: number) {\n setUnreadCount(unreadCount)\n })\n }\n },\n )\n }\n }\n\n // CHANGELOG WIDGET\n const initializeChangelog = (): boolean => {\n // everyone sees highlights\n const categories: string[] = []\n\n if (user?.data?.isAdmin) {\n // admins see everything\n const adminCategories = ['Server', 'Addon', 'Pipeline']\n categories.push(...adminCategories)\n } else if (!siteInfo?.disableChangelog) {\n // users only see highlights (unless disabled)\n // admins do not see highlights as it is a subset of the other categories\n categories.push('Highlights')\n }\n\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('init_changelog_widget', {\n organization: 'ayon',\n dropdown: {\n enabled: true,\n },\n popup: {\n enabled: true,\n usersName: user?.attrib?.fullName,\n autoOpenForNewUpdates: true,\n },\n category: categories,\n theme: 'dark',\n })\n }\n return false\n }\n\n // FEEDBACK WIDGET\n const initializeFeedbackWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_feedback_widget',\n {\n organization: 'ayon',\n theme: 'dark',\n metadata: {},\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing feedback widget:', error)\n } else {\n }\n },\n )\n }\n return false\n }\n\n // PORTAL WIDGET (old)\n const initializePortalWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_portal_widget',\n {\n organization: 'ayon',\n fullScreen: true,\n initialPage: 'MainView',\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing portal widget:', error)\n return false\n } else {\n return true\n }\n },\n )\n }\n return false\n }\n\n // Use an environment variable to skip loading Featurebase in certain environments\n // @ts-expect-error: Vite provides import.meta.env at runtime\n const skipFeaturebase = import.meta.env.VITE_SKIP_FEATUREBASE === 'true'\n\n // Load Featurebase script and initialize widgets\n useEffect(() => {\n // if skip flag is set, do not load the script\n if (skipFeaturebase) return\n // if not logged in, do not load the script\n if (!user?.name) return\n if (!siteInfo) return\n\n // if already loaded, do not load again\n if (scriptLoaded) return\n\n // Load the Featurebase script\n loadScript()\n\n // Initialize Featurebase\n initialize()\n\n // Initialize changelog widget\n initializeChangelog()\n\n // Initialize feedback widget\n initializeFeedbackWidget()\n\n // Initialize portal widget\n initializePortalWidget()\n }, [user?.name, scriptLoaded, siteInfo])\n\n const [identified, setIdentified] = useState(false)\n // verify user\n useEffect(() => {\n // check if we can identify the user\n if (!user?.name || !cloudInfo || !verification || !scriptLoaded) return\n // if we are already identified, do not identify again\n if (identified) return\n // Identify the user\n identifyUser()\n setIdentified(true)\n }, [\n user?.name,\n cloudInfo?.instanceId,\n verification?.available,\n scriptLoaded,\n window.location.pathname,\n identified,\n ])\n\n // load messenger widget once verification is done loading\n // we don't need verification but we should use it if we have it\n useEffect(() => {\n // wait for script to be loaded and verification to finish loading\n if (isLoadingVerification || !scriptLoaded) return\n\n // initialize the messenger widget\n initializeMessenger()\n }, [verification, isLoadingVerification, scriptLoaded])\n\n const openFeedback: FeedbackContextType['openFeedback'] = () => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'openFeedbackWidget',\n },\n })\n }\n\n const openPortal = (\n page:\n | 'MainView'\n | 'RoadmapView'\n | 'CreatePost'\n | 'PostsView'\n | 'ChangelogView'\n | 'HelpView' = 'MainView',\n articleId?: string,\n ) => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'changePage',\n payload: page,\n openWidget: true,\n ...(articleId && { articleId }),\n },\n })\n }\n\n const [messengerVisibility, setMessengerVisibility] = useState(false)\n const supportElement = document.getElementById('fb-messenger-root')\n\n const setSupportDisplay = (show: boolean) =>\n supportElement instanceof HTMLElement &&\n (supportElement.style.display = show ? 'block' : 'none')\n\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n setSupportDisplay(messengerVisibility)\n }, [scriptLoaded, messengerLoaded, messengerVisibility])\n\n // when the messenger is hidden, we need to hide the root element again\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('onHide', function () {\n // hide the messenger root element\n setMessengerVisibility(false)\n })\n }\n }, [scriptLoaded, messengerLoaded])\n\n const openSupport: FeedbackContextType['openSupport'] = (page = 'Home', id) => {\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n window.alert('Featurebase SDK is not loaded yet. Please try again later.')\n console.warn('Featurebase SDK is not loaded yet.')\n return\n }\n\n if (messengerVisibility) {\n // if the messenger is already visible, close it\n win.Featurebase('hide')\n setMessengerVisibility(false)\n return\n }\n\n // ensure the messenger is visible\n setMessengerVisibility(true)\n\n switch (page) {\n case 'Home':\n // Show messenger home\n win.Featurebase('show')\n break\n case 'Messages':\n // Show messages view\n win.Featurebase('show', 'messages')\n break\n case 'Changelog':\n // Show changelog view\n win.Featurebase('show', 'changelog')\n break\n case 'Help':\n // Open help center\n win.Featurebase('show', 'help')\n break\n case 'ShowArticle':\n // Open a specific help article\n if (id) win.Featurebase('showArticle', id)\n else win.Featurebase('show', 'help')\n break\n case 'NewMessage':\n // Open new message dialog\n win.Featurebase('showNewMessage', id)\n break\n default:\n // Default to showing the main widget\n win.Featurebase('show')\n break\n }\n }\n\n return (\n <FeedbackContext.Provider\n value={{\n openSupport,\n openFeedback,\n openPortal,\n messengerLoaded,\n unreadCount,\n messengerVisibility,\n setMessengerVisibility,\n loaded: scriptLoaded,\n }}\n >\n {children}\n </FeedbackContext.Provider>\n )\n}\n\nexport const useFeedback = (): FeedbackContextType => {\n const context = useContext(FeedbackContext)\n if (!context) {\n throw new Error('useFeedback must be used within a FeedbackProvider')\n }\n return context\n}\n"],"names":["FeedbackContext","createContext","FeedbackProvider","children","scriptLoaded","setScriptLoaded","useState","siteInfo","user","cloudInfo","useGlobalContext","verification","isLoadingVerification","useGetFeedbackVerificationQuery","loadScript","script","initialize","win","serverVersion","_a","frontendVersion","_b","identifyUser","identifyData","err","messengerLoaded","setMessengerLoaded","unreadCount","setUnreadCount","initializeMessenger","initializeChangelog","categories","adminCategories","initializeFeedbackWidget","error","initializePortalWidget","useEffect","identified","setIdentified","openFeedback","openPortal","page","articleId","messengerVisibility","setMessengerVisibility","supportElement","setSupportDisplay","show","openSupport","id","jsx","useFeedback","context","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"FeedbackContext.es.js","sources":["../../../../../src/components/Feedback/FeedbackContext.tsx"],"sourcesContent":["import React, { createContext, useContext, ReactNode, useEffect, useState } from 'react'\nimport { useGetFeedbackVerificationQuery } from '@shared/api'\nimport { useGlobalContext } from '@shared/context'\n\nexport type FeedbackContextType = {\n loaded: boolean\n openSupport: (\n page?: 'Home' | 'Messages' | 'Changelog' | 'Help' | 'NewMessage' | 'ShowArticle',\n id?: string,\n ) => void\n messengerLoaded: boolean // whether the messenger widget is loaded\n unreadCount: number // number of unread messages\n messengerVisibility: boolean\n setMessengerVisibility: (show: boolean) => void // show/hide the messenger icon\n openFeedback: () => void\n openPortal: (\n page?: 'MainView' | 'RoadmapView' | 'CreatePost' | 'PostsView' | 'ChangelogView' | 'HelpView',\n articleId?: string,\n ) => void\n}\n\nconst FeedbackContext = createContext<FeedbackContextType | undefined>(undefined)\n\ntype FeedbackProviderProps = {\n children: ReactNode\n}\n\nexport const FeedbackProvider: React.FC<FeedbackProviderProps> = ({ children }) => {\n const [scriptLoaded, setScriptLoaded] = useState(false)\n const { siteInfo, user, cloudInfo } = useGlobalContext()\n const { data: verification, isLoading: isLoadingVerification } = useGetFeedbackVerificationQuery(\n {},\n {\n skip: !user?.name || !cloudInfo,\n },\n )\n\n const loadScript = () => {\n if (!scriptLoaded) {\n const script = document.createElement('script')\n script.src = 'https://do.featurebase.app/js/sdk.js'\n script.id = 'featurebase-sdk'\n script.async = true\n document.body.appendChild(script)\n setScriptLoaded(true)\n }\n }\n\n const initialize = () => {\n // Initialize Featurebase\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n win.Featurebase = function () {\n ;(win.Featurebase.q = win.Featurebase.q || []).push(arguments)\n }\n }\n }\n\n const serverVersion = siteInfo?.version?.split('+')[0] || 'unknown'\n const frontendVersion = siteInfo?.version?.split('+')[1] || 'unknown'\n\n const identifyUser = () => {\n if (!user?.name || !verification?.available) return\n\n const identifyData = {\n ...verification.data,\n customFields: {\n origin: window.location.origin,\n serverVersion: serverVersion,\n frontendVersion: frontendVersion,\n instanceId: cloudInfo?.instanceId,\n },\n }\n\n console.log(identifyData)\n\n const win = window as any\n win.Featurebase('identify', identifyData, (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase identify completed')\n }\n })\n }\n\n const [messengerLoaded, setMessengerLoaded] = useState(false)\n const [unreadCount, setUnreadCount] = useState(0)\n\n // MESSENGER WIDGET\n const initializeMessenger = (): void => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n console.log('Initializing Featurebase messenger widget')\n if (!verification?.available)\n return console.warn('messenger verification not available, skipping messenger init')\n win.Featurebase(\n 'boot',\n {\n theme: 'dark',\n ...verification?.data,\n },\n (err: any) => {\n // Callback function. Called when identify completed.\n if (err) {\n console.error(err)\n } else {\n console.log('Featurebase messenger completed')\n setMessengerLoaded(true)\n\n // register event listener for unread messages\n win.Featurebase('onUnreadCountChange', function (unreadCount: number) {\n setUnreadCount(unreadCount)\n })\n }\n },\n )\n }\n }\n\n // CHANGELOG WIDGET\n const initializeChangelog = (): boolean => {\n // everyone sees highlights\n const categories: string[] = []\n\n if (user?.data?.isAdmin) {\n // admins see everything\n const adminCategories = ['Server', 'Addon', 'Pipeline']\n categories.push(...adminCategories)\n } else if (!siteInfo?.disableChangelog) {\n // users only see highlights (unless disabled)\n // admins do not see highlights as it is a subset of the other categories\n categories.push('Highlights')\n }\n\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('init_changelog_widget', {\n organization: 'ayon',\n dropdown: {\n enabled: true,\n },\n popup: {\n enabled: true,\n usersName: user?.attrib?.fullName,\n autoOpenForNewUpdates: true,\n },\n category: categories,\n theme: 'dark',\n })\n }\n return false\n }\n\n // FEEDBACK WIDGET\n const initializeFeedbackWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_feedback_widget',\n {\n organization: 'ayon',\n theme: 'dark',\n metadata: {},\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing feedback widget:', error)\n } else {\n }\n },\n )\n }\n return false\n }\n\n // PORTAL WIDGET (old)\n const initializePortalWidget = (): boolean => {\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase(\n 'initialize_portal_widget',\n {\n organization: 'ayon',\n fullScreen: true,\n initialPage: 'MainView',\n },\n (error: any) => {\n if (error) {\n console.error('Error initializing portal widget:', error)\n return false\n } else {\n return true\n }\n },\n )\n }\n return false\n }\n\n // Use an environment variable to skip loading Featurebase in certain environments\n // @ts-expect-error: Vite provides import.meta.env at runtime\n const skipFeaturebase = import.meta.env.VITE_SKIP_FEATUREBASE === 'true'\n\n // Load Featurebase script and initialize widgets\n useEffect(() => {\n // if skip flag is set, do not load the script\n if (skipFeaturebase) return\n // if not logged in, do not load the script\n if (!user?.name) return\n if (!siteInfo) return\n\n // if already loaded, do not load again\n if (scriptLoaded) return\n\n // Load the Featurebase script\n loadScript()\n\n // Initialize Featurebase\n initialize()\n\n // Initialize changelog widget\n initializeChangelog()\n\n // Initialize feedback widget\n initializeFeedbackWidget()\n\n // Initialize portal widget\n initializePortalWidget()\n }, [user?.name, scriptLoaded, siteInfo])\n\n const [identified, setIdentified] = useState(false)\n // verify user\n useEffect(() => {\n // check if we can identify the user\n if (!user?.name || !cloudInfo || !verification || !scriptLoaded) return\n // if we are already identified, do not identify again\n if (identified) return\n // Identify the user\n identifyUser()\n setIdentified(true)\n }, [\n user?.name,\n cloudInfo?.instanceId,\n verification?.available,\n scriptLoaded,\n window.location.pathname,\n identified,\n ])\n\n // load messenger widget once verification is done loading\n // we don't need verification but we should use it if we have it\n useEffect(() => {\n // wait for script to be loaded and verification to finish loading\n if (isLoadingVerification || !scriptLoaded) return\n\n // initialize the messenger widget\n initializeMessenger()\n }, [verification, isLoadingVerification, scriptLoaded])\n\n const openFeedback: FeedbackContextType['openFeedback'] = () => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'openFeedbackWidget',\n },\n })\n }\n\n const openPortal = (\n page:\n | 'MainView'\n | 'RoadmapView'\n | 'CreatePost'\n | 'PostsView'\n | 'ChangelogView'\n | 'HelpView' = 'MainView',\n articleId?: string,\n ) => {\n window.postMessage({\n target: 'FeaturebaseWidget',\n data: {\n action: 'changePage',\n payload: page,\n openWidget: true,\n ...(articleId && { articleId }),\n },\n })\n }\n\n const [messengerVisibility, setMessengerVisibility] = useState(false)\n const supportElement = document.getElementById('fb-messenger-root')\n\n const setSupportDisplay = (show: boolean) =>\n supportElement instanceof HTMLElement &&\n (supportElement.style.display = show ? 'block' : 'none')\n\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n setSupportDisplay(messengerVisibility)\n }, [scriptLoaded, messengerLoaded, messengerVisibility])\n\n // when the messenger is hidden, we need to hide the root element again\n useEffect(() => {\n if (!scriptLoaded || !messengerLoaded) return\n const win = window as any\n if (typeof win.Featurebase === 'function') {\n win.Featurebase('onHide', function () {\n // hide the messenger root element\n setMessengerVisibility(false)\n })\n }\n }, [scriptLoaded, messengerLoaded])\n\n const openSupport: FeedbackContextType['openSupport'] = (page = 'Home', id) => {\n const win = window as any\n if (typeof win.Featurebase !== 'function') {\n window.alert('Featurebase SDK is not loaded yet. Please try again later.')\n console.warn('Featurebase SDK is not loaded yet.')\n return\n }\n\n if (messengerVisibility) {\n // if the messenger is already visible, close it\n win.Featurebase('hide')\n setMessengerVisibility(false)\n return\n }\n\n // ensure the messenger is visible\n setMessengerVisibility(true)\n\n switch (page) {\n case 'Home':\n // Show messenger home\n win.Featurebase('show')\n break\n case 'Messages':\n // Show messages view\n win.Featurebase('show', 'messages')\n break\n case 'Changelog':\n // Show changelog view\n win.Featurebase('show', 'changelog')\n break\n case 'Help':\n // Open help center\n win.Featurebase('show', 'help')\n break\n case 'ShowArticle':\n // Open a specific help article\n if (id) win.Featurebase('showArticle', id)\n else win.Featurebase('show', 'help')\n break\n case 'NewMessage':\n // Open new message dialog\n win.Featurebase('showNewMessage', id)\n break\n default:\n // Default to showing the main widget\n win.Featurebase('show')\n break\n }\n }\n\n return (\n <FeedbackContext.Provider\n value={{\n openSupport,\n openFeedback,\n openPortal,\n messengerLoaded,\n unreadCount,\n messengerVisibility,\n setMessengerVisibility,\n loaded: scriptLoaded,\n }}\n >\n {children}\n </FeedbackContext.Provider>\n )\n}\n\nexport const useFeedback = (): FeedbackContextType => {\n const context = useContext(FeedbackContext)\n if (!context) {\n throw new Error('useFeedback must be used within a FeedbackProvider')\n }\n return context\n}\n"],"names":["FeedbackContext","createContext","FeedbackProvider","children","scriptLoaded","setScriptLoaded","useState","siteInfo","user","cloudInfo","useGlobalContext","verification","isLoadingVerification","useGetFeedbackVerificationQuery","loadScript","script","initialize","win","serverVersion","_a","frontendVersion","_b","identifyUser","identifyData","err","messengerLoaded","setMessengerLoaded","unreadCount","setUnreadCount","initializeMessenger","initializeChangelog","categories","adminCategories","initializeFeedbackWidget","error","initializePortalWidget","useEffect","identified","setIdentified","openFeedback","openPortal","page","articleId","messengerVisibility","setMessengerVisibility","supportElement","setSupportDisplay","show","openSupport","id","jsx","useFeedback","context","useContext"],"mappings":"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"}