@drodil/backstage-plugin-qeta-react 3.24.5 → 3.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/dist/components/AIAnswerCard/AIAnswerCard.esm.js +54 -41
  2. package/dist/components/AIAnswerCard/AIAnswerCard.esm.js.map +1 -1
  3. package/dist/components/AnswerCard/AnswerCard.esm.js +96 -73
  4. package/dist/components/AnswerCard/AnswerCard.esm.js.map +1 -1
  5. package/dist/components/AnswerForm/AnswerForm.esm.js +52 -47
  6. package/dist/components/AnswerForm/AnswerForm.esm.js.map +1 -1
  7. package/dist/components/AnswersContainer/AnswerList.esm.js +31 -21
  8. package/dist/components/AnswersContainer/AnswerList.esm.js.map +1 -1
  9. package/dist/components/AnswersContainer/AnswerListItem.esm.js +74 -57
  10. package/dist/components/AnswersContainer/AnswerListItem.esm.js.map +1 -1
  11. package/dist/components/AnswersContainer/AnswersContainer.esm.js +70 -56
  12. package/dist/components/AnswersContainer/AnswersContainer.esm.js.map +1 -1
  13. package/dist/components/ArticleContent/ArticleButtons.esm.js +73 -52
  14. package/dist/components/ArticleContent/ArticleButtons.esm.js.map +1 -1
  15. package/dist/components/ArticleContent/ArticleContent.esm.js +60 -34
  16. package/dist/components/ArticleContent/ArticleContent.esm.js.map +1 -1
  17. package/dist/components/AuthorBox/AuthorBox.esm.js +49 -31
  18. package/dist/components/AuthorBox/AuthorBox.esm.js.map +1 -1
  19. package/dist/components/Buttons/AddToCollectionButton.esm.js +35 -24
  20. package/dist/components/Buttons/AddToCollectionButton.esm.js.map +1 -1
  21. package/dist/components/Buttons/AskQuestionButton.esm.js +18 -15
  22. package/dist/components/Buttons/AskQuestionButton.esm.js.map +1 -1
  23. package/dist/components/Buttons/ButtonContainer.esm.js +2 -2
  24. package/dist/components/Buttons/ButtonContainer.esm.js.map +1 -1
  25. package/dist/components/Buttons/CollectionFollowButton.esm.js +10 -6
  26. package/dist/components/Buttons/CollectionFollowButton.esm.js.map +1 -1
  27. package/dist/components/Buttons/CreateCollectionButton.esm.js +18 -15
  28. package/dist/components/Buttons/CreateCollectionButton.esm.js.map +1 -1
  29. package/dist/components/Buttons/EntityFollowButton.esm.js +10 -6
  30. package/dist/components/Buttons/EntityFollowButton.esm.js.map +1 -1
  31. package/dist/components/Buttons/FavoriteButton.esm.js +15 -11
  32. package/dist/components/Buttons/FavoriteButton.esm.js.map +1 -1
  33. package/dist/components/Buttons/LinkButton.esm.js +10 -6
  34. package/dist/components/Buttons/LinkButton.esm.js.map +1 -1
  35. package/dist/components/Buttons/TagFollowButton.esm.js +10 -6
  36. package/dist/components/Buttons/TagFollowButton.esm.js.map +1 -1
  37. package/dist/components/Buttons/UserFollowButton.esm.js +10 -6
  38. package/dist/components/Buttons/UserFollowButton.esm.js.map +1 -1
  39. package/dist/components/Buttons/VoteButtons.esm.js +41 -35
  40. package/dist/components/Buttons/VoteButtons.esm.js.map +1 -1
  41. package/dist/components/Buttons/WriteArticleButton.esm.js +18 -15
  42. package/dist/components/Buttons/WriteArticleButton.esm.js.map +1 -1
  43. package/dist/components/CollectionCard/CollectionCard.esm.js +59 -42
  44. package/dist/components/CollectionCard/CollectionCard.esm.js.map +1 -1
  45. package/dist/components/CollectionForm/CollectionForm.esm.js +73 -67
  46. package/dist/components/CollectionForm/CollectionForm.esm.js.map +1 -1
  47. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js +61 -49
  48. package/dist/components/CollectionsGrid/CollectionsGrid.esm.js.map +1 -1
  49. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js +18 -14
  50. package/dist/components/CollectionsGrid/CollectionsGridContent.esm.js.map +1 -1
  51. package/dist/components/CollectionsGrid/CollectionsGridItem.esm.js +52 -32
  52. package/dist/components/CollectionsGrid/CollectionsGridItem.esm.js.map +1 -1
  53. package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js +10 -6
  54. package/dist/components/CollectionsGrid/NoCollectionsCard.esm.js.map +1 -1
  55. package/dist/components/CommentSection/CommentForm.esm.js +42 -38
  56. package/dist/components/CommentSection/CommentForm.esm.js.map +1 -1
  57. package/dist/components/CommentSection/CommentList.esm.js +15 -12
  58. package/dist/components/CommentSection/CommentList.esm.js.map +1 -1
  59. package/dist/components/CommentSection/CommentListItem.esm.js +49 -28
  60. package/dist/components/CommentSection/CommentListItem.esm.js.map +1 -1
  61. package/dist/components/CommentSection/CommentSection.esm.js +46 -38
  62. package/dist/components/CommentSection/CommentSection.esm.js.map +1 -1
  63. package/dist/components/DeleteModal/DeleteModal.esm.js +32 -23
  64. package/dist/components/DeleteModal/DeleteModal.esm.js.map +1 -1
  65. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js +39 -30
  66. package/dist/components/EntitiesGrid/EntitiesGrid.esm.js.map +1 -1
  67. package/dist/components/EntitiesGrid/EntitiesGridContent.esm.js +9 -5
  68. package/dist/components/EntitiesGrid/EntitiesGridContent.esm.js.map +1 -1
  69. package/dist/components/EntitiesGrid/EntitiesGridItem.esm.js +50 -38
  70. package/dist/components/EntitiesGrid/EntitiesGridItem.esm.js.map +1 -1
  71. package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js +10 -6
  72. package/dist/components/EntitiesGrid/NoEntitiesCard.esm.js.map +1 -1
  73. package/dist/components/FilterPanel/DateRangeFilter.esm.js +71 -58
  74. package/dist/components/FilterPanel/DateRangeFilter.esm.js.map +1 -1
  75. package/dist/components/FilterPanel/FilterPanel.esm.js +262 -217
  76. package/dist/components/FilterPanel/FilterPanel.esm.js.map +1 -1
  77. package/dist/components/FollowedLists/FollowedCollectionsList.esm.js +6 -2
  78. package/dist/components/FollowedLists/FollowedCollectionsList.esm.js.map +1 -1
  79. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js +6 -2
  80. package/dist/components/FollowedLists/FollowedEntitiesList.esm.js.map +1 -1
  81. package/dist/components/FollowedLists/FollowedTagsList.esm.js +6 -2
  82. package/dist/components/FollowedLists/FollowedTagsList.esm.js.map +1 -1
  83. package/dist/components/FollowedLists/FollowedUsersList.esm.js +6 -2
  84. package/dist/components/FollowedLists/FollowedUsersList.esm.js.map +1 -1
  85. package/dist/components/HeaderImageInput/HeaderImageInput.esm.js +51 -37
  86. package/dist/components/HeaderImageInput/HeaderImageInput.esm.js.map +1 -1
  87. package/dist/components/HomePageCards/ImpactCard.esm.js +15 -4
  88. package/dist/components/HomePageCards/ImpactCard.esm.js.map +1 -1
  89. package/dist/components/HomePageCards/PostsCard.esm.js +14 -7
  90. package/dist/components/HomePageCards/PostsCard.esm.js.map +1 -1
  91. package/dist/components/LeftMenu/LeftMenu.esm.js +68 -28
  92. package/dist/components/LeftMenu/LeftMenu.esm.js.map +1 -1
  93. package/dist/components/LeftMenu/LeftMenuButton.esm.js +52 -45
  94. package/dist/components/LeftMenu/LeftMenuButton.esm.js.map +1 -1
  95. package/dist/components/Links/Links.esm.js +12 -8
  96. package/dist/components/Links/Links.esm.js.map +1 -1
  97. package/dist/components/LoadingGrid/LoadingGrid.esm.js +5 -5
  98. package/dist/components/LoadingGrid/LoadingGrid.esm.js.map +1 -1
  99. package/dist/components/MarkdownEditor/MarkdownEditor.esm.js +5 -6
  100. package/dist/components/MarkdownEditor/MarkdownEditor.esm.js.map +1 -1
  101. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js +42 -33
  102. package/dist/components/MarkdownRenderer/MarkdownRenderer.esm.js.map +1 -1
  103. package/dist/components/PostAnonymouslyCheckbox/PostAnonymouslyCheckbox.esm.js +10 -6
  104. package/dist/components/PostAnonymouslyCheckbox/PostAnonymouslyCheckbox.esm.js.map +1 -1
  105. package/dist/components/PostForm/AutocompleteListComponent.esm.js +18 -17
  106. package/dist/components/PostForm/AutocompleteListComponent.esm.js.map +1 -1
  107. package/dist/components/PostForm/EntitiesInput.esm.js +19 -9
  108. package/dist/components/PostForm/EntitiesInput.esm.js.map +1 -1
  109. package/dist/components/PostForm/PostForm.esm.js +109 -103
  110. package/dist/components/PostForm/PostForm.esm.js.map +1 -1
  111. package/dist/components/PostForm/TagInput.esm.js +13 -12
  112. package/dist/components/PostForm/TagInput.esm.js.map +1 -1
  113. package/dist/components/PostHighlightList/PostHighlightList.esm.js +26 -14
  114. package/dist/components/PostHighlightList/PostHighlightList.esm.js.map +1 -1
  115. package/dist/components/PostsContainer/NoPostsCard.esm.js +24 -18
  116. package/dist/components/PostsContainer/NoPostsCard.esm.js.map +1 -1
  117. package/dist/components/PostsContainer/PostList.esm.js +30 -20
  118. package/dist/components/PostsContainer/PostList.esm.js.map +1 -1
  119. package/dist/components/PostsContainer/PostListItem.esm.js +108 -86
  120. package/dist/components/PostsContainer/PostListItem.esm.js.map +1 -1
  121. package/dist/components/PostsContainer/PostsContainer.esm.js +100 -84
  122. package/dist/components/PostsContainer/PostsContainer.esm.js.map +1 -1
  123. package/dist/components/PostsGrid/PostsGrid.esm.js +100 -84
  124. package/dist/components/PostsGrid/PostsGrid.esm.js.map +1 -1
  125. package/dist/components/PostsGrid/PostsGridContent.esm.js +46 -39
  126. package/dist/components/PostsGrid/PostsGridContent.esm.js.map +1 -1
  127. package/dist/components/PostsGrid/PostsGridItem.esm.js +59 -34
  128. package/dist/components/PostsGrid/PostsGridItem.esm.js.map +1 -1
  129. package/dist/components/PostsTable/PostsTable.esm.js +96 -67
  130. package/dist/components/PostsTable/PostsTable.esm.js.map +1 -1
  131. package/dist/components/PostsTable/PostsTableRow.esm.js +21 -15
  132. package/dist/components/PostsTable/PostsTableRow.esm.js.map +1 -1
  133. package/dist/components/QetaPagination/QetaPagination.esm.js +39 -31
  134. package/dist/components/QetaPagination/QetaPagination.esm.js.map +1 -1
  135. package/dist/components/QuestionCard/QuestionCard.esm.js +90 -64
  136. package/dist/components/QuestionCard/QuestionCard.esm.js.map +1 -1
  137. package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js +4 -3
  138. package/dist/components/RelativeTimeWithTooltip/RelativeTimeWithTooltip.esm.js.map +1 -1
  139. package/dist/components/SearchBar/SearchBar.esm.js +44 -41
  140. package/dist/components/SearchBar/SearchBar.esm.js.map +1 -1
  141. package/dist/components/SelectTemplateList/SelectTemplateList.esm.js +46 -30
  142. package/dist/components/SelectTemplateList/SelectTemplateList.esm.js.map +1 -1
  143. package/dist/components/StatsChart/StatsChart.esm.js +149 -135
  144. package/dist/components/StatsChart/StatsChart.esm.js.map +1 -1
  145. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js +42 -32
  146. package/dist/components/SuggestionsCard/SuggestionsCard.esm.js.map +1 -1
  147. package/dist/components/SummaryStatsGrid/SummaryStatsGrid.esm.js +75 -58
  148. package/dist/components/SummaryStatsGrid/SummaryStatsGrid.esm.js.map +1 -1
  149. package/dist/components/TagsAndEntities/CollectionChip.esm.js +50 -37
  150. package/dist/components/TagsAndEntities/CollectionChip.esm.js.map +1 -1
  151. package/dist/components/TagsAndEntities/EntityChip.esm.js +58 -40
  152. package/dist/components/TagsAndEntities/EntityChip.esm.js.map +1 -1
  153. package/dist/components/TagsAndEntities/TagChip.esm.js +52 -39
  154. package/dist/components/TagsAndEntities/TagChip.esm.js.map +1 -1
  155. package/dist/components/TagsAndEntities/TagsAndEntities.esm.js +5 -2
  156. package/dist/components/TagsAndEntities/TagsAndEntities.esm.js.map +1 -1
  157. package/dist/components/TagsAndEntities/UserChip.esm.js +55 -44
  158. package/dist/components/TagsAndEntities/UserChip.esm.js.map +1 -1
  159. package/dist/components/TagsGrid/CreateTagModal.esm.js +59 -46
  160. package/dist/components/TagsGrid/CreateTagModal.esm.js.map +1 -1
  161. package/dist/components/TagsGrid/EditTagModal.esm.js +45 -35
  162. package/dist/components/TagsGrid/EditTagModal.esm.js.map +1 -1
  163. package/dist/components/TagsGrid/NoTagsCard.esm.js +10 -6
  164. package/dist/components/TagsGrid/NoTagsCard.esm.js.map +1 -1
  165. package/dist/components/TagsGrid/TagGridItem.esm.js +87 -59
  166. package/dist/components/TagsGrid/TagGridItem.esm.js.map +1 -1
  167. package/dist/components/TagsGrid/TagsGrid.esm.js +68 -54
  168. package/dist/components/TagsGrid/TagsGrid.esm.js.map +1 -1
  169. package/dist/components/TagsGrid/TagsGridContent.esm.js +9 -5
  170. package/dist/components/TagsGrid/TagsGridContent.esm.js.map +1 -1
  171. package/dist/components/TemplateList/TemplateForm.esm.js +104 -94
  172. package/dist/components/TemplateList/TemplateForm.esm.js.map +1 -1
  173. package/dist/components/TemplateList/TemplateList.esm.js +50 -37
  174. package/dist/components/TemplateList/TemplateList.esm.js.map +1 -1
  175. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js +75 -51
  176. package/dist/components/TopRankingUsersCard/TopRankingUsersCard.esm.js.map +1 -1
  177. package/dist/components/TopRankingUsersCard/TrophyIcon.esm.js +17 -14
  178. package/dist/components/TopRankingUsersCard/TrophyIcon.esm.js.map +1 -1
  179. package/dist/components/UsersGrid/NoUsersCard.esm.js +10 -6
  180. package/dist/components/UsersGrid/NoUsersCard.esm.js.map +1 -1
  181. package/dist/components/UsersGrid/UsersGrid.esm.js +34 -23
  182. package/dist/components/UsersGrid/UsersGrid.esm.js.map +1 -1
  183. package/dist/components/UsersGrid/UsersGridContent.esm.js +9 -5
  184. package/dist/components/UsersGrid/UsersGridContent.esm.js.map +1 -1
  185. package/dist/components/UsersGrid/UsersGridItem.esm.js +78 -58
  186. package/dist/components/UsersGrid/UsersGridItem.esm.js.map +1 -1
  187. package/dist/components/Utility/ModalContent.esm.js +4 -3
  188. package/dist/components/Utility/ModalContent.esm.js.map +1 -1
  189. package/dist/components/Utility/OptionalRequirePermission.esm.js +4 -4
  190. package/dist/components/Utility/OptionalRequirePermission.esm.js.map +1 -1
  191. package/dist/components/Utility/RightList.esm.js +13 -11
  192. package/dist/components/Utility/RightList.esm.js.map +1 -1
  193. package/dist/components/Utility/SmallAvatar.esm.js +2 -2
  194. package/dist/components/Utility/SmallAvatar.esm.js.map +1 -1
  195. package/dist/components/Utility/VoteButtonContainer.esm.js +2 -2
  196. package/dist/components/Utility/VoteButtonContainer.esm.js.map +1 -1
  197. package/dist/hooks/useAI.esm.js +7 -5
  198. package/dist/hooks/useAI.esm.js.map +1 -1
  199. package/dist/hooks/useCollectionsFollow.esm.js +3 -5
  200. package/dist/hooks/useCollectionsFollow.esm.js.map +1 -1
  201. package/dist/hooks/useEntityAuthor.esm.js +5 -5
  202. package/dist/hooks/useEntityAuthor.esm.js.map +1 -1
  203. package/dist/hooks/useEntityFollow.esm.js +3 -5
  204. package/dist/hooks/useEntityFollow.esm.js.map +1 -1
  205. package/dist/hooks/useEntityQueryParameter.esm.js +2 -2
  206. package/dist/hooks/useEntityQueryParameter.esm.js.map +1 -1
  207. package/dist/hooks/useIsModerator.esm.js +19 -4
  208. package/dist/hooks/useIsModerator.esm.js.map +1 -1
  209. package/dist/hooks/usePaginatedPosts.esm.js +7 -7
  210. package/dist/hooks/usePaginatedPosts.esm.js.map +1 -1
  211. package/dist/hooks/useTagsFollow.esm.js +3 -3
  212. package/dist/hooks/useTagsFollow.esm.js.map +1 -1
  213. package/dist/hooks/useUserFollow.esm.js +3 -3
  214. package/dist/hooks/useUserFollow.esm.js.map +1 -1
  215. package/dist/hooks/useVoting.esm.js +4 -3
  216. package/dist/hooks/useVoting.esm.js.map +1 -1
  217. package/dist/index.d.ts +64 -63
  218. package/dist/routes.esm.js +3 -3
  219. package/dist/routes.esm.js.map +1 -1
  220. package/dist/utils/utils.esm.js +3 -0
  221. package/dist/utils/utils.esm.js.map +1 -1
  222. package/package.json +16 -9
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityAuthor.esm.js","sources":["../../src/hooks/useEntityAuthor.ts"],"sourcesContent":["import { parseEntityRef, UserEntity } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport DataLoader from 'dataloader';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport React, { useEffect } from 'react';\nimport {\n AnswerResponse,\n CollectionResponse,\n PostResponse,\n UserResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation } from './useTranslation';\n\nconst userCache: Map<string, UserEntity> = new Map();\nconst dataLoaderFactory = (catalogApi: CatalogApi) =>\n new DataLoader(\n async (entityRefs: readonly string[]) => {\n const { items } = await catalogApi.getEntitiesByRefs({\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.profile.displayName',\n 'spec.profile.picture',\n ],\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n userCache.set(entityRef, items[index] as UserEntity);\n });\n return items;\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n );\n\nexport const useUserInfo = (entityRef: string, anonymous?: boolean) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const { t } = useTranslation();\n const [name, setName] = React.useState<string>('');\n const [user, setUser] = React.useState<UserEntity | null>(null);\n const [initials, setInitials] = React.useState<string | null>(null);\n const [currentUser, setCurrentUser] = React.useState<string | null>(null);\n const ref = entityRef.startsWith('user:') ? entityRef : `user:${entityRef}`;\n\n const {\n primaryTitle: userName,\n secondaryTitle,\n Icon,\n } = useEntityPresentation(ref);\n\n useEffect(() => {\n if (anonymous) {\n return;\n }\n\n if (userCache.get(ref)) {\n setUser(userCache.get(ref) as UserEntity);\n return;\n }\n\n dataLoaderFactory(catalogApi)\n .load(ref)\n .then(data => {\n if (data) {\n setUser(data as UserEntity);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, ref, anonymous]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (currentUser) {\n const currentUserRef = parseEntityRef(currentUser);\n const userRef = parseEntityRef(ref);\n if (\n currentUserRef.name === userRef.name &&\n currentUserRef.namespace === userRef.namespace\n ) {\n displayName = `${t('userLink.you')}${\n anonymous\n ? ` (${t('userLink.anonymous').toLocaleLowerCase('en-US')})`\n : ''\n }`;\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n setName(displayName);\n }, [ref, anonymous, currentUser, userName, t]);\n\n useEffect(() => {\n const init = (name ?? '')\n .replace(/[^a-zA-Z]/g, '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user, secondaryTitle, Icon };\n};\n\nexport const useEntityAuthor = (\n entity: PostResponse | AnswerResponse | CollectionResponse | UserResponse,\n) => {\n const anonymous = 'anonymous' in entity ? entity.anonymous ?? false : false;\n const author =\n // eslint-disable-next-line no-nested-ternary\n 'author' in entity\n ? entity.author\n : 'userRef' in entity\n ? entity.userRef\n : entity.owner;\n return useUserInfo(author, anonymous);\n};\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"useEntityAuthor.esm.js","sources":["../../src/hooks/useEntityAuthor.ts"],"sourcesContent":["import { parseEntityRef, UserEntity } from '@backstage/catalog-model';\nimport { CatalogApi } from '@backstage/catalog-client';\nimport DataLoader from 'dataloader';\nimport { identityApiRef, useApi } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n useEntityPresentation,\n} from '@backstage/plugin-catalog-react';\nimport { useState, useEffect } from 'react';\nimport {\n AnswerResponse,\n CollectionResponse,\n PostResponse,\n UserResponse,\n} from '@drodil/backstage-plugin-qeta-common';\nimport { useTranslation } from './useTranslation';\n\nconst userCache: Map<string, UserEntity> = new Map();\nconst dataLoaderFactory = (catalogApi: CatalogApi) =>\n new DataLoader(\n async (entityRefs: readonly string[]) => {\n const { items } = await catalogApi.getEntitiesByRefs({\n fields: [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'spec.profile.displayName',\n 'spec.profile.picture',\n ],\n entityRefs: entityRefs as string[],\n });\n\n entityRefs.forEach((entityRef, index) => {\n userCache.set(entityRef, items[index] as UserEntity);\n });\n return items;\n },\n {\n name: 'EntityAuthorLoader',\n cacheMap: new Map(),\n maxBatchSize: 100,\n batchScheduleFn: callback => {\n setTimeout(callback, 50);\n },\n },\n );\n\nexport const useUserInfo = (entityRef: string, anonymous?: boolean) => {\n const catalogApi = useApi(catalogApiRef);\n const identityApi = useApi(identityApiRef);\n const { t } = useTranslation();\n const [name, setName] = useState<string>('');\n const [user, setUser] = useState<UserEntity | null>(null);\n const [initials, setInitials] = useState<string | null>(null);\n const [currentUser, setCurrentUser] = useState<string | null>(null);\n const ref = entityRef.startsWith('user:') ? entityRef : `user:${entityRef}`;\n\n const {\n primaryTitle: userName,\n secondaryTitle,\n Icon,\n } = useEntityPresentation(ref);\n\n useEffect(() => {\n if (anonymous) {\n return;\n }\n\n if (userCache.get(ref)) {\n setUser(userCache.get(ref) as UserEntity);\n return;\n }\n\n dataLoaderFactory(catalogApi)\n .load(ref)\n .then(data => {\n if (data) {\n setUser(data as UserEntity);\n } else {\n setUser(null);\n }\n })\n .catch(() => {\n setUser(null);\n });\n }, [catalogApi, ref, anonymous]);\n\n useEffect(() => {\n identityApi.getBackstageIdentity().then(res => {\n setCurrentUser(res.userEntityRef ?? 'user:default/guest');\n });\n }, [identityApi]);\n\n useEffect(() => {\n let displayName = userName;\n if (currentUser) {\n const currentUserRef = parseEntityRef(currentUser);\n const userRef = parseEntityRef(ref);\n if (\n currentUserRef.name === userRef.name &&\n currentUserRef.namespace === userRef.namespace\n ) {\n displayName = `${t('userLink.you')}${\n anonymous\n ? ` (${t('userLink.anonymous').toLocaleLowerCase('en-US')})`\n : ''\n }`;\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n } else if (anonymous) {\n displayName = t('userLink.anonymous');\n }\n setName(displayName);\n }, [ref, anonymous, currentUser, userName, t]);\n\n useEffect(() => {\n const init = (name ?? '')\n .replace(/[^a-zA-Z]/g, '')\n .split(' ')\n .map(p => p[0])\n .join('')\n .substring(0, 2)\n .toUpperCase();\n setInitials(init);\n }, [name]);\n\n return { name, initials, user, secondaryTitle, Icon };\n};\n\nexport const useEntityAuthor = (\n entity: PostResponse | AnswerResponse | CollectionResponse | UserResponse,\n) => {\n const anonymous = 'anonymous' in entity ? entity.anonymous ?? false : false;\n const author =\n // eslint-disable-next-line no-nested-ternary\n 'author' in entity\n ? entity.author\n : 'userRef' in entity\n ? entity.userRef\n : entity.owner;\n return useUserInfo(author, anonymous);\n};\n"],"names":[],"mappings":"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"}
@@ -1,13 +1,11 @@
1
- import React__default, { useEffect, useCallback } from 'react';
1
+ import { useState, useEffect, useCallback } from 'react';
2
2
  import { useApi } from '@backstage/core-plugin-api';
3
3
  import { qetaApiRef } from '../api.esm.js';
4
4
 
5
5
  let followedEntities = void 0;
6
6
  const useEntityFollow = () => {
7
- const [entities, setEntities] = React__default.useState(
8
- followedEntities ?? []
9
- );
10
- const [loading, setLoading] = React__default.useState(followedEntities === void 0);
7
+ const [entities, setEntities] = useState(followedEntities ?? []);
8
+ const [loading, setLoading] = useState(followedEntities === void 0);
11
9
  const qetaApi = useApi(qetaApiRef);
12
10
  useEffect(() => {
13
11
  if (followedEntities === void 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityFollow.esm.js","sources":["../../src/hooks/useEntityFollow.ts"],"sourcesContent":["import React, { useCallback, useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\n\nlet followedEntities: string[] | undefined = undefined;\n\nexport const useEntityFollow = () => {\n const [entities, setEntities] = React.useState<string[]>(\n followedEntities ?? [],\n );\n const [loading, setLoading] = React.useState(followedEntities === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedEntities === undefined) {\n qetaApi.getFollowedEntities().then(res => {\n followedEntities = res.entityRefs;\n setEntities(res.entityRefs);\n setLoading(false);\n });\n } else {\n setEntities(followedEntities);\n }\n }, [qetaApi]);\n\n const followEntity = useCallback(\n (entityRef: string) => {\n qetaApi.followEntity(entityRef).then(() => {\n setEntities(prev => [...prev, entityRef]);\n followedEntities?.push(entityRef);\n });\n },\n [qetaApi],\n );\n\n const unfollowEntity = useCallback(\n (entityRef: string) => {\n qetaApi.unfollowEntity(entityRef).then(() => {\n setEntities(prev => prev.filter(t => t !== entityRef));\n followedEntities = followedEntities?.filter(t => t !== entityRef);\n });\n },\n [qetaApi],\n );\n\n const isFollowingEntity = useCallback(\n (entityRef: string) => entities.includes(entityRef),\n [entities],\n );\n return { entities, followEntity, unfollowEntity, isFollowingEntity, loading };\n};\n"],"names":["React"],"mappings":";;;;AAIA,IAAI,gBAAyC,GAAA,KAAA,CAAA;AAEtC,MAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,cAAM,CAAA,QAAA;AAAA,IACpC,oBAAoB;AAAC,GACvB;AACA,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,IAAIA,cAAM,CAAA,QAAA,CAAS,qBAAqB,KAAS,CAAA,CAAA;AAC3E,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,qBAAqB,KAAW,CAAA,EAAA;AAClC,MAAQ,OAAA,CAAA,mBAAA,EAAsB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACxC,QAAA,gBAAA,GAAmB,GAAI,CAAA,UAAA;AACvB,QAAA,WAAA,CAAY,IAAI,UAAU,CAAA;AAC1B,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,OACjB,CAAA;AAAA,KACI,MAAA;AACL,MAAA,WAAA,CAAY,gBAAgB,CAAA;AAAA;AAC9B,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,SAAsB,KAAA;AACrB,MAAA,OAAA,CAAQ,YAAa,CAAA,SAAS,CAAE,CAAA,IAAA,CAAK,MAAM;AACzC,QAAA,WAAA,CAAY,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,SAAS,CAAC,CAAA;AACxC,QAAA,gBAAA,EAAkB,KAAK,SAAS,CAAA;AAAA,OACjC,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,SAAsB,KAAA;AACrB,MAAA,OAAA,CAAQ,cAAe,CAAA,SAAS,CAAE,CAAA,IAAA,CAAK,MAAM;AAC3C,QAAA,WAAA,CAAY,UAAQ,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,SAAS,CAAC,CAAA;AACrD,QAAA,gBAAA,GAAmB,gBAAkB,EAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,SAAS,CAAA;AAAA,OACjE,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,IACxB,CAAC,SAAA,KAAsB,QAAS,CAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IAClD,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,YAAc,EAAA,cAAA,EAAgB,mBAAmB,OAAQ,EAAA;AAC9E;;;;"}
1
+ {"version":3,"file":"useEntityFollow.esm.js","sources":["../../src/hooks/useEntityFollow.ts"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\n\nlet followedEntities: string[] | undefined = undefined;\n\nexport const useEntityFollow = () => {\n const [entities, setEntities] = useState<string[]>(followedEntities ?? []);\n const [loading, setLoading] = useState(followedEntities === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedEntities === undefined) {\n qetaApi.getFollowedEntities().then(res => {\n followedEntities = res.entityRefs;\n setEntities(res.entityRefs);\n setLoading(false);\n });\n } else {\n setEntities(followedEntities);\n }\n }, [qetaApi]);\n\n const followEntity = useCallback(\n (entityRef: string) => {\n qetaApi.followEntity(entityRef).then(() => {\n setEntities(prev => [...prev, entityRef]);\n followedEntities?.push(entityRef);\n });\n },\n [qetaApi],\n );\n\n const unfollowEntity = useCallback(\n (entityRef: string) => {\n qetaApi.unfollowEntity(entityRef).then(() => {\n setEntities(prev => prev.filter(t => t !== entityRef));\n followedEntities = followedEntities?.filter(t => t !== entityRef);\n });\n },\n [qetaApi],\n );\n\n const isFollowingEntity = useCallback(\n (entityRef: string) => entities.includes(entityRef),\n [entities],\n );\n return { entities, followEntity, unfollowEntity, isFollowingEntity, loading };\n};\n"],"names":[],"mappings":";;;;AAIA,IAAI,gBAAyC,GAAA,KAAA,CAAA;AAEtC,MAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,IAAI,QAAmB,CAAA,gBAAA,IAAoB,EAAE,CAAA;AACzE,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAAS,qBAAqB,KAAS,CAAA,CAAA;AACrE,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,qBAAqB,KAAW,CAAA,EAAA;AAClC,MAAQ,OAAA,CAAA,mBAAA,EAAsB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACxC,QAAA,gBAAA,GAAmB,GAAI,CAAA,UAAA;AACvB,QAAA,WAAA,CAAY,IAAI,UAAU,CAAA;AAC1B,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,OACjB,CAAA;AAAA,KACI,MAAA;AACL,MAAA,WAAA,CAAY,gBAAgB,CAAA;AAAA;AAC9B,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,SAAsB,KAAA;AACrB,MAAA,OAAA,CAAQ,YAAa,CAAA,SAAS,CAAE,CAAA,IAAA,CAAK,MAAM;AACzC,QAAA,WAAA,CAAY,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,SAAS,CAAC,CAAA;AACxC,QAAA,gBAAA,EAAkB,KAAK,SAAS,CAAA;AAAA,OACjC,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,SAAsB,KAAA;AACrB,MAAA,OAAA,CAAQ,cAAe,CAAA,SAAS,CAAE,CAAA,IAAA,CAAK,MAAM;AAC3C,QAAA,WAAA,CAAY,UAAQ,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,SAAS,CAAC,CAAA;AACrD,QAAA,gBAAA,GAAmB,gBAAkB,EAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,SAAS,CAAA;AAAA,OACjE,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,iBAAoB,GAAA,WAAA;AAAA,IACxB,CAAC,SAAA,KAAsB,QAAS,CAAA,QAAA,CAAS,SAAS,CAAA;AAAA,IAClD,CAAC,QAAQ;AAAA,GACX;AACA,EAAA,OAAO,EAAE,QAAA,EAAU,YAAc,EAAA,cAAA,EAAgB,mBAAmB,OAAQ,EAAA;AAC9E;;;;"}
@@ -1,9 +1,9 @@
1
1
  import { useSearchParams } from 'react-router-dom';
2
- import React__default, { useEffect } from 'react';
2
+ import { useState, useEffect } from 'react';
3
3
 
4
4
  function useEntityQueryParameter(entity) {
5
5
  const [searchParams] = useSearchParams();
6
- const [entityRef, setEntityRef] = React__default.useState(entity);
6
+ const [entityRef, setEntityRef] = useState(entity);
7
7
  useEffect(() => {
8
8
  setEntityRef(searchParams.get("entity") ?? void 0);
9
9
  }, [searchParams, setEntityRef]);
@@ -1 +1 @@
1
- {"version":3,"file":"useEntityQueryParameter.esm.js","sources":["../../src/hooks/useEntityQueryParameter.ts"],"sourcesContent":["import { useSearchParams } from 'react-router-dom';\nimport React, { useEffect } from 'react';\n\nexport function useEntityQueryParameter(entity?: string) {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = React.useState<string | undefined>(entity);\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n }, [searchParams, setEntityRef]);\n\n return entityRef;\n}\n"],"names":["React"],"mappings":";;;AAGO,SAAS,wBAAwB,MAAiB,EAAA;AACvD,EAAM,MAAA,CAAC,YAAY,CAAA,GAAI,eAAgB,EAAA;AACvC,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAAA,cAAA,CAAM,SAA6B,MAAM,CAAA;AAE3E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,YAAa,CAAA,GAAA,CAAI,QAAQ,CAAA,IAAK,KAAS,CAAA,CAAA;AAAA,GACnD,EAAA,CAAC,YAAc,EAAA,YAAY,CAAC,CAAA;AAE/B,EAAO,OAAA,SAAA;AACT;;;;"}
1
+ {"version":3,"file":"useEntityQueryParameter.esm.js","sources":["../../src/hooks/useEntityQueryParameter.ts"],"sourcesContent":["import { useSearchParams } from 'react-router-dom';\nimport { useState, useEffect } from 'react';\n\nexport function useEntityQueryParameter(entity?: string) {\n const [searchParams] = useSearchParams();\n const [entityRef, setEntityRef] = useState<string | undefined>(entity);\n\n useEffect(() => {\n setEntityRef(searchParams.get('entity') ?? undefined);\n }, [searchParams, setEntityRef]);\n\n return entityRef;\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,wBAAwB,MAAiB,EAAA;AACvD,EAAM,MAAA,CAAC,YAAY,CAAA,GAAI,eAAgB,EAAA;AACvC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAA6B,MAAM,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,YAAA,CAAa,YAAa,CAAA,GAAA,CAAI,QAAQ,CAAA,IAAK,KAAS,CAAA,CAAA;AAAA,GACnD,EAAA,CAAC,YAAc,EAAA,YAAY,CAAC,CAAA;AAE/B,EAAO,OAAA,SAAA;AACT;;;;"}
@@ -1,21 +1,36 @@
1
1
  import { useApi, configApiRef } from '@backstage/core-plugin-api';
2
2
  import { useIdentityApi } from './useIdentityApi.esm.js';
3
- import { useMemo } from 'react';
3
+ import { useState, useMemo, useEffect } from 'react';
4
+ import { permissionApiRef } from '@backstage/plugin-permission-react';
5
+ import { qetaModeratePermission } from '@drodil/backstage-plugin-qeta-common';
6
+ import { AuthorizeResult } from '@backstage/plugin-permission-common';
4
7
 
5
8
  const useIsModerator = () => {
6
9
  const configApi = useApi(configApiRef);
10
+ const permissionApi = useApi(permissionApiRef);
11
+ const [isModerator, setIsModerator] = useState(false);
7
12
  const moderators = useMemo(
8
13
  () => configApi.getOptionalStringArray("qeta.moderators") ?? [],
9
14
  [configApi]
10
15
  );
16
+ const usePermissions = useMemo(
17
+ () => configApi.getOptionalBoolean("qeta.permissions") ?? false,
18
+ [configApi]
19
+ );
11
20
  const { value: user } = useIdentityApi((api) => api.getBackstageIdentity(), []);
12
- const isModerator = useMemo(() => {
21
+ useEffect(() => {
22
+ if (usePermissions) {
23
+ permissionApi.authorize({ permission: qetaModeratePermission }).then((resp) => {
24
+ setIsModerator(resp.result === AuthorizeResult.ALLOW);
25
+ });
26
+ return;
27
+ }
13
28
  const ownership = user?.ownershipEntityRefs ?? [];
14
29
  if (user?.userEntityRef && !ownership.includes(user.userEntityRef)) {
15
30
  ownership.push(user.userEntityRef);
16
31
  }
17
- return moderators.some((m) => ownership.includes(m));
18
- }, [moderators, user]);
32
+ setIsModerator(moderators.some((m) => ownership.includes(m)));
33
+ }, [moderators, permissionApi, usePermissions, user]);
19
34
  return { isModerator };
20
35
  };
21
36
 
@@ -1 +1 @@
1
- {"version":3,"file":"useIsModerator.esm.js","sources":["../../src/hooks/useIsModerator.ts"],"sourcesContent":["import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useIdentityApi } from './useIdentityApi';\nimport { useMemo } from 'react';\n\nexport const useIsModerator = () => {\n const configApi = useApi(configApiRef);\n const moderators = useMemo(\n () => configApi.getOptionalStringArray('qeta.moderators') ?? [],\n [configApi],\n );\n const { value: user } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n const isModerator = useMemo(() => {\n const ownership: string[] = user?.ownershipEntityRefs ?? [];\n if (user?.userEntityRef && !ownership.includes(user.userEntityRef)) {\n ownership.push(user.userEntityRef);\n }\n return moderators.some((m: string) => ownership.includes(m));\n }, [moderators, user]);\n return { isModerator };\n};\n"],"names":[],"mappings":";;;;AAIO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,MAAM,UAAa,GAAA,OAAA;AAAA,IACjB,MAAM,SAAA,CAAU,sBAAuB,CAAA,iBAAiB,KAAK,EAAC;AAAA,IAC9D,CAAC,SAAS;AAAA,GACZ;AACA,EAAM,MAAA,EAAE,KAAO,EAAA,IAAA,EAAS,GAAA,cAAA,CAAe,SAAO,GAAI,CAAA,oBAAA,EAAwB,EAAA,EAAE,CAAA;AAE5E,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAM;AAChC,IAAM,MAAA,SAAA,GAAsB,IAAM,EAAA,mBAAA,IAAuB,EAAC;AAC1D,IAAA,IAAI,MAAM,aAAiB,IAAA,CAAC,UAAU,QAAS,CAAA,IAAA,CAAK,aAAa,CAAG,EAAA;AAClE,MAAU,SAAA,CAAA,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA;AAEnC,IAAA,OAAO,WAAW,IAAK,CAAA,CAAC,MAAc,SAAU,CAAA,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,GAC1D,EAAA,CAAC,UAAY,EAAA,IAAI,CAAC,CAAA;AACrB,EAAA,OAAO,EAAE,WAAY,EAAA;AACvB;;;;"}
1
+ {"version":3,"file":"useIsModerator.esm.js","sources":["../../src/hooks/useIsModerator.ts"],"sourcesContent":["import { configApiRef, useApi } from '@backstage/core-plugin-api';\nimport { useIdentityApi } from './useIdentityApi';\nimport { useEffect, useMemo, useState } from 'react';\nimport { permissionApiRef } from '@backstage/plugin-permission-react';\nimport { qetaModeratePermission } from '@drodil/backstage-plugin-qeta-common';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\n\nexport const useIsModerator = () => {\n const configApi = useApi(configApiRef);\n const permissionApi = useApi(permissionApiRef);\n const [isModerator, setIsModerator] = useState(false);\n const moderators = useMemo(\n () => configApi.getOptionalStringArray('qeta.moderators') ?? [],\n [configApi],\n );\n const usePermissions = useMemo(\n () => configApi.getOptionalBoolean('qeta.permissions') ?? false,\n [configApi],\n );\n\n const { value: user } = useIdentityApi(api => api.getBackstageIdentity(), []);\n\n useEffect(() => {\n if (usePermissions) {\n permissionApi\n .authorize({ permission: qetaModeratePermission })\n .then(resp => {\n setIsModerator(resp.result === AuthorizeResult.ALLOW);\n });\n return;\n }\n\n const ownership: string[] = user?.ownershipEntityRefs ?? [];\n if (user?.userEntityRef && !ownership.includes(user.userEntityRef)) {\n ownership.push(user.userEntityRef);\n }\n setIsModerator(moderators.some((m: string) => ownership.includes(m)));\n }, [moderators, permissionApi, usePermissions, user]);\n\n return { isModerator };\n};\n"],"names":[],"mappings":";;;;;;;AAOO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,KAAK,CAAA;AACpD,EAAA,MAAM,UAAa,GAAA,OAAA;AAAA,IACjB,MAAM,SAAA,CAAU,sBAAuB,CAAA,iBAAiB,KAAK,EAAC;AAAA,IAC9D,CAAC,SAAS;AAAA,GACZ;AACA,EAAA,MAAM,cAAiB,GAAA,OAAA;AAAA,IACrB,MAAM,SAAA,CAAU,kBAAmB,CAAA,kBAAkB,CAAK,IAAA,KAAA;AAAA,IAC1D,CAAC,SAAS;AAAA,GACZ;AAEA,EAAM,MAAA,EAAE,KAAO,EAAA,IAAA,EAAS,GAAA,cAAA,CAAe,SAAO,GAAI,CAAA,oBAAA,EAAwB,EAAA,EAAE,CAAA;AAE5E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,aAAA,CACG,UAAU,EAAE,UAAA,EAAY,wBAAwB,CAAA,CAChD,KAAK,CAAQ,IAAA,KAAA;AACZ,QAAe,cAAA,CAAA,IAAA,CAAK,MAAW,KAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,OACrD,CAAA;AACH,MAAA;AAAA;AAGF,IAAM,MAAA,SAAA,GAAsB,IAAM,EAAA,mBAAA,IAAuB,EAAC;AAC1D,IAAA,IAAI,MAAM,aAAiB,IAAA,CAAC,UAAU,QAAS,CAAA,IAAA,CAAK,aAAa,CAAG,EAAA;AAClE,MAAU,SAAA,CAAA,IAAA,CAAK,KAAK,aAAa,CAAA;AAAA;AAEnC,IAAe,cAAA,CAAA,UAAA,CAAW,KAAK,CAAC,CAAA,KAAc,UAAU,QAAS,CAAA,CAAC,CAAC,CAAC,CAAA;AAAA,KACnE,CAAC,UAAA,EAAY,aAAe,EAAA,cAAA,EAAgB,IAAI,CAAC,CAAA;AAEpD,EAAA,OAAO,EAAE,WAAY,EAAA;AACvB;;;;"}
@@ -1,5 +1,5 @@
1
1
  import { useAnalytics } from '@backstage/core-plugin-api';
2
- import React__default, { useEffect } from 'react';
2
+ import { useState, useEffect } from 'react';
3
3
  import { useSearchParams } from 'react-router-dom';
4
4
  import { filterKeys } from '../components/FilterPanel/FilterPanel.esm.js';
5
5
  import useDebounce from 'react-use/lib/useDebounce';
@@ -11,15 +11,15 @@ const EXPANDED_LOCAL_STORAGE_KEY = "qeta-post-filters-expanded";
11
11
  function usePaginatedPosts(props) {
12
12
  const { type, tags, author, entities, entity, favorite, initialPageSize } = props;
13
13
  const analytics = useAnalytics();
14
- const [page, setPage] = React__default.useState(1);
15
- const [pageCount, setPageCount] = React__default.useState(1);
16
- const [postsPerPage, setPostsPerPage] = React__default.useState(initialPageSize ?? 10);
17
- const [showFilterPanel, setShowFilterPanel] = React__default.useState(
14
+ const [page, setPage] = useState(1);
15
+ const [pageCount, setPageCount] = useState(1);
16
+ const [postsPerPage, setPostsPerPage] = useState(initialPageSize ?? 10);
17
+ const [showFilterPanel, setShowFilterPanel] = useState(
18
18
  localStorage.getItem(EXPANDED_LOCAL_STORAGE_KEY) === "true"
19
19
  );
20
20
  const [searchParams, setSearchParams] = useSearchParams();
21
- const [searchQuery, setSearchQuery] = React__default.useState("");
22
- const [filters, setFilters] = React__default.useState({
21
+ const [searchQuery, setSearchQuery] = useState("");
22
+ const [filters, setFilters] = useState({
23
23
  order: props.order ?? "desc",
24
24
  orderBy: props.orderBy ?? "created",
25
25
  noAnswers: props.noAnswers ?? "false",
@@ -1 +1 @@
1
- {"version":3,"file":"usePaginatedPosts.esm.js","sources":["../../src/hooks/usePaginatedPosts.ts"],"sourcesContent":["import { useAnalytics } from '@backstage/core-plugin-api';\nimport React, { useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n FilterKey,\n filterKeys,\n PostFilters,\n} from '../components/FilterPanel/FilterPanel';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { getFiltersWithDateRange } from '../utils';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi } from './useQetaApi';\n\nexport type PaginatedPostsProps = PostFilters & {\n author?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n favorite?: boolean;\n showAskButton?: boolean;\n showWriteButton?: boolean;\n showNoQuestionsBtn?: boolean;\n initialPageSize?: number;\n collectionId?: number;\n};\n\nexport type PostFilterChange = {\n key: keyof PostFilters;\n value?: PostFilters[keyof PostFilters];\n};\n\nconst EXPANDED_LOCAL_STORAGE_KEY = 'qeta-post-filters-expanded';\n\nexport function usePaginatedPosts(props: PaginatedPostsProps) {\n const { type, tags, author, entities, entity, favorite, initialPageSize } =\n props;\n const analytics = useAnalytics();\n const [page, setPage] = React.useState(1);\n const [pageCount, setPageCount] = React.useState(1);\n const [postsPerPage, setPostsPerPage] = React.useState(initialPageSize ?? 10);\n const [showFilterPanel, setShowFilterPanel] = React.useState(\n localStorage.getItem(EXPANDED_LOCAL_STORAGE_KEY) === 'true',\n );\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = React.useState('');\n const [filters, setFilters] = React.useState<PostFilters>({\n order: props.order ?? 'desc',\n orderBy: props.orderBy ?? 'created',\n noAnswers: props.noAnswers ?? 'false',\n noCorrectAnswer: props.noCorrectAnswer ?? 'false',\n noVotes: props.noVotes ?? 'false',\n searchQuery: props.searchQuery ?? '',\n entities: entities ?? (entity ? [entity] : undefined),\n tags: tags,\n dateRange: '',\n collectionId: props.collectionId,\n type,\n });\n\n useEffect(() => {\n localStorage.setItem(\n EXPANDED_LOCAL_STORAGE_KEY,\n showFilterPanel ? 'true' : 'false',\n );\n }, [showFilterPanel]);\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const loadNextPage = () => {\n setPage(prev => prev + 1);\n };\n\n const onFilterChange = (changes: PostFilterChange | PostFilterChange[]) => {\n const changesArray = Array.isArray(changes) ? changes : [changes];\n setPage(1);\n setFilters(prev => {\n const newValue = { ...prev };\n for (const { key, value } of changesArray) {\n (newValue as any)[key] = value;\n }\n return newValue;\n });\n setSearchParams(prev => {\n const newValue = prev;\n for (const { key, value } of changesArray) {\n if (!filterKeys.includes(key as FilterKey)) {\n continue;\n }\n if (!value || value === 'false') {\n newValue.delete(key);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key);\n } else {\n newValue.set(key, value.join(','));\n }\n } else if (typeof value === 'number') {\n newValue.set(key, String(value));\n } else if (value.length > 0) {\n newValue.set(key, value);\n } else {\n newValue.delete(key);\n }\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (query: string) => {\n onPageChange(1);\n if (query) {\n analytics.captureEvent('qeta_search', query);\n }\n setSearchQuery(query);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'postsPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setPostsPerPage(qpp);\n } else if (filterKeys.includes(key as FilterKey)) {\n filtersApplied = true;\n if (key === 'tags') {\n filters.tags = filterTags(value.split(',')) ?? [];\n } else if (key === 'entities') {\n filters.entities = value.split(',');\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(\n api => {\n return api.getPosts({\n type,\n limit: postsPerPage,\n offset: (page - 1) * postsPerPage,\n includeEntities: true,\n includeAnswers: false,\n includeComments: false,\n includeAttachments: false,\n author,\n favorite,\n ...(getFiltersWithDateRange(filters) as any),\n });\n },\n [type, page, filters, postsPerPage],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / postsPerPage));\n }\n }, [response, postsPerPage]);\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setPostsPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('postsPerPage', String(value));\n return newValue;\n });\n };\n\n return {\n page,\n setPage,\n postsPerPage,\n setPostsPerPage,\n showFilterPanel,\n setShowFilterPanel,\n searchParams,\n setSearchParams,\n searchQuery,\n setSearchQuery,\n filters,\n setFilters,\n onPageChange,\n onPageSizeChange,\n onFilterChange,\n onSearchQueryChange,\n response,\n loading,\n error,\n loadNextPage,\n pageCount,\n retry,\n };\n}\n"],"names":["React"],"mappings":";;;;;;;;;AA+BA,MAAM,0BAA6B,GAAA,4BAAA;AAE5B,SAAS,kBAAkB,KAA4B,EAAA;AAC5D,EAAM,MAAA,EAAE,MAAM,IAAM,EAAA,MAAA,EAAQ,UAAU,MAAQ,EAAA,QAAA,EAAU,iBACtD,GAAA,KAAA;AACF,EAAA,MAAM,YAAY,YAAa,EAAA;AAC/B,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,CAAI,GAAAA,cAAA,CAAM,SAAS,CAAC,CAAA;AACxC,EAAA,MAAM,CAAC,SAAW,EAAA,YAAY,CAAI,GAAAA,cAAA,CAAM,SAAS,CAAC,CAAA;AAClD,EAAA,MAAM,CAAC,YAAc,EAAA,eAAe,IAAIA,cAAM,CAAA,QAAA,CAAS,mBAAmB,EAAE,CAAA;AAC5E,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAIA,cAAM,CAAA,QAAA;AAAA,IAClD,YAAA,CAAa,OAAQ,CAAA,0BAA0B,CAAM,KAAA;AAAA,GACvD;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,eAAgB,EAAA;AACxD,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAAA,cAAA,CAAM,SAAS,EAAE,CAAA;AACvD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAM,QAAsB,CAAA;AAAA,IACxD,KAAA,EAAO,MAAM,KAAS,IAAA,MAAA;AAAA,IACtB,OAAA,EAAS,MAAM,OAAW,IAAA,SAAA;AAAA,IAC1B,SAAA,EAAW,MAAM,SAAa,IAAA,OAAA;AAAA,IAC9B,eAAA,EAAiB,MAAM,eAAmB,IAAA,OAAA;AAAA,IAC1C,OAAA,EAAS,MAAM,OAAW,IAAA,OAAA;AAAA,IAC1B,WAAA,EAAa,MAAM,WAAe,IAAA,EAAA;AAAA,IAClC,QAAU,EAAA,QAAA,KAAa,MAAS,GAAA,CAAC,MAAM,CAAI,GAAA,KAAA,CAAA,CAAA;AAAA,IAC3C,IAAA;AAAA,IACA,SAAW,EAAA,EAAA;AAAA,IACX,cAAc,KAAM,CAAA,YAAA;AAAA,IACpB;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAa,YAAA,CAAA,OAAA;AAAA,MACX,0BAAA;AAAA,MACA,kBAAkB,MAAS,GAAA;AAAA,KAC7B;AAAA,GACF,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAM,MAAA,YAAA,GAAe,CAAC,KAAkB,KAAA;AACtC,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA;AACjB,MAAA,QAAA,CAAS,GAAI,CAAA,MAAA,EAAQ,MAAO,CAAA,KAAK,CAAC,CAAA;AAClC,MAAO,OAAA,QAAA;AAAA,KACR,CAAA;AAAA,GACH;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAQ,OAAA,CAAA,CAAA,IAAA,KAAQ,OAAO,CAAC,CAAA;AAAA,GAC1B;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,OAAmD,KAAA;AACzE,IAAA,MAAM,eAAe,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAI,GAAA,OAAA,GAAU,CAAC,OAAO,CAAA;AAChE,IAAA,OAAA,CAAQ,CAAC,CAAA;AACT,IAAA,UAAA,CAAW,CAAQ,IAAA,KAAA;AACjB,MAAM,MAAA,QAAA,GAAW,EAAE,GAAG,IAAK,EAAA;AAC3B,MAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAM,EAAA,IAAK,YAAc,EAAA;AACzC,QAAC,QAAA,CAAiB,GAAG,CAAI,GAAA,KAAA;AAAA;AAE3B,MAAO,OAAA,QAAA;AAAA,KACR,CAAA;AACD,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA;AACjB,MAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAM,EAAA,IAAK,YAAc,EAAA;AACzC,QAAA,IAAI,CAAC,UAAA,CAAW,QAAS,CAAA,GAAgB,CAAG,EAAA;AAC1C,UAAA;AAAA;AAEF,QAAI,IAAA,CAAC,KAAS,IAAA,KAAA,KAAU,OAAS,EAAA;AAC/B,UAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,SACV,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AAC/B,UAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,YAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,WACd,MAAA;AACL,YAAA,QAAA,CAAS,GAAI,CAAA,GAAA,EAAK,KAAM,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA;AACnC,SACF,MAAA,IAAW,OAAO,KAAA,KAAU,QAAU,EAAA;AACpC,UAAA,QAAA,CAAS,GAAI,CAAA,GAAA,EAAK,MAAO,CAAA,KAAK,CAAC,CAAA;AAAA,SACjC,MAAA,IAAW,KAAM,CAAA,MAAA,GAAS,CAAG,EAAA;AAC3B,UAAS,QAAA,CAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,SAClB,MAAA;AACL,UAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA;AACrB;AAEF,MAAO,OAAA,QAAA;AAAA,KACR,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,mBAAA,GAAsB,CAAC,KAAkB,KAAA;AAC7C,IAAA,YAAA,CAAa,CAAC,CAAA;AACd,IAAA,IAAI,KAAO,EAAA;AACT,MAAU,SAAA,CAAA,YAAA,CAAa,eAAe,KAAK,CAAA;AAAA;AAE7C,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,GACtB;AAEA,EAAA,WAAA;AAAA,IACE,MAAM;AACJ,MAAI,IAAA,OAAA,CAAQ,gBAAgB,WAAa,EAAA;AACvC,QAAA,UAAA,CAAW,EAAE,GAAG,OAAS,EAAA,WAAA,EAA0B,CAAA;AAAA;AACrD,KACF;AAAA,IACA,GAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAiB,GAAA,KAAA;AACrB,IAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAQ,KAAA;AACnC,MAAI,IAAA;AACF,QAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,UAAA,MAAM,EAAK,GAAA,MAAA,CAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA;AACpC,UAAA,IAAI,KAAK,CAAG,EAAA;AACV,YAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,WACL,MAAA;AACL,YAAA,OAAA,CAAQ,CAAC,CAAA;AAAA;AACX,SACF,MAAA,IAAW,QAAQ,cAAgB,EAAA;AACjC,UAAA,MAAM,GAAM,GAAA,MAAA,CAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA;AACrC,UAAI,IAAA,GAAA,GAAM,CAAG,EAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,SACvB,MAAA,IAAA,UAAA,CAAW,QAAS,CAAA,GAAgB,CAAG,EAAA;AAChD,UAAiB,cAAA,GAAA,IAAA;AACjB,UAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,YAAA,OAAA,CAAQ,OAAO,UAAW,CAAA,KAAA,CAAM,MAAM,GAAG,CAAC,KAAK,EAAC;AAAA,WAClD,MAAA,IAAW,QAAQ,UAAY,EAAA;AAC7B,YAAQ,OAAA,CAAA,QAAA,GAAW,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA;AAAA,WAC7B,MAAA;AACL,YAAC,OAAA,CAAgB,GAAG,CAAI,GAAA,KAAA;AAAA;AAC1B;AACF,eACO,EAAI,EAAA;AAAA;AAEb,KACD,CAAA;AACD,IAAA,UAAA,CAAW,OAAO,CAAA;AAClB,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA;AACzB,GACC,EAAA,CAAC,YAAc,EAAA,OAAO,CAAC,CAAA;AAE1B,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACE,GAAA,UAAA;AAAA,IACF,CAAO,GAAA,KAAA;AACL,MAAA,OAAO,IAAI,QAAS,CAAA;AAAA,QAClB,IAAA;AAAA,QACA,KAAO,EAAA,YAAA;AAAA,QACP,MAAA,EAAA,CAAS,OAAO,CAAK,IAAA,YAAA;AAAA,QACrB,eAAiB,EAAA,IAAA;AAAA,QACjB,cAAgB,EAAA,KAAA;AAAA,QAChB,eAAiB,EAAA,KAAA;AAAA,QACjB,kBAAoB,EAAA,KAAA;AAAA,QACpB,MAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,wBAAwB,OAAO;AAAA,OACpC,CAAA;AAAA,KACH;AAAA,IACA,CAAC,IAAA,EAAM,IAAM,EAAA,OAAA,EAAS,YAAY;AAAA,GACpC;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,YAAA,CAAa,IAAK,CAAA,IAAA,CAAK,QAAS,CAAA,KAAA,GAAQ,YAAY,CAAC,CAAA;AAAA;AACvD,GACC,EAAA,CAAC,QAAU,EAAA,YAAY,CAAC,CAAA;AAE3B,EAAM,MAAA,gBAAA,GAAmB,CAAC,KAAkB,KAAA;AAC1C,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,IAAI,OAAU,GAAA,IAAA;AACd,MAAO,OAAA,OAAA,GAAU,KAAQ,GAAA,QAAA,CAAS,KAAO,EAAA;AACvC,QAAW,OAAA,IAAA,CAAA;AAAA;AAEb,MAAA,YAAA,CAAa,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,OAAO,CAAC,CAAA;AAAA;AAEnC,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA;AACjB,MAAA,QAAA,CAAS,GAAI,CAAA,cAAA,EAAgB,MAAO,CAAA,KAAK,CAAC,CAAA;AAC1C,MAAO,OAAA,QAAA;AAAA,KACR,CAAA;AAAA,GACH;AAEA,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"usePaginatedPosts.esm.js","sources":["../../src/hooks/usePaginatedPosts.ts"],"sourcesContent":["import { useAnalytics } from '@backstage/core-plugin-api';\nimport { useState, useEffect } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport {\n FilterKey,\n filterKeys,\n PostFilters,\n} from '../components/FilterPanel/FilterPanel';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { getFiltersWithDateRange } from '../utils';\nimport { filterTags } from '@drodil/backstage-plugin-qeta-common';\nimport { useQetaApi } from './useQetaApi';\n\nexport type PaginatedPostsProps = PostFilters & {\n author?: string;\n showFilters?: boolean;\n showTitle?: boolean;\n title?: string;\n favorite?: boolean;\n showAskButton?: boolean;\n showWriteButton?: boolean;\n showNoQuestionsBtn?: boolean;\n initialPageSize?: number;\n collectionId?: number;\n};\n\nexport type PostFilterChange = {\n key: keyof PostFilters;\n value?: PostFilters[keyof PostFilters];\n};\n\nconst EXPANDED_LOCAL_STORAGE_KEY = 'qeta-post-filters-expanded';\n\nexport function usePaginatedPosts(props: PaginatedPostsProps) {\n const { type, tags, author, entities, entity, favorite, initialPageSize } =\n props;\n const analytics = useAnalytics();\n const [page, setPage] = useState(1);\n const [pageCount, setPageCount] = useState(1);\n const [postsPerPage, setPostsPerPage] = useState(initialPageSize ?? 10);\n const [showFilterPanel, setShowFilterPanel] = useState(\n localStorage.getItem(EXPANDED_LOCAL_STORAGE_KEY) === 'true',\n );\n const [searchParams, setSearchParams] = useSearchParams();\n const [searchQuery, setSearchQuery] = useState('');\n const [filters, setFilters] = useState<PostFilters>({\n order: props.order ?? 'desc',\n orderBy: props.orderBy ?? 'created',\n noAnswers: props.noAnswers ?? 'false',\n noCorrectAnswer: props.noCorrectAnswer ?? 'false',\n noVotes: props.noVotes ?? 'false',\n searchQuery: props.searchQuery ?? '',\n entities: entities ?? (entity ? [entity] : undefined),\n tags: tags,\n dateRange: '',\n collectionId: props.collectionId,\n type,\n });\n\n useEffect(() => {\n localStorage.setItem(\n EXPANDED_LOCAL_STORAGE_KEY,\n showFilterPanel ? 'true' : 'false',\n );\n }, [showFilterPanel]);\n\n const onPageChange = (value: number) => {\n setPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('page', String(value));\n return newValue;\n });\n };\n\n const loadNextPage = () => {\n setPage(prev => prev + 1);\n };\n\n const onFilterChange = (changes: PostFilterChange | PostFilterChange[]) => {\n const changesArray = Array.isArray(changes) ? changes : [changes];\n setPage(1);\n setFilters(prev => {\n const newValue = { ...prev };\n for (const { key, value } of changesArray) {\n (newValue as any)[key] = value;\n }\n return newValue;\n });\n setSearchParams(prev => {\n const newValue = prev;\n for (const { key, value } of changesArray) {\n if (!filterKeys.includes(key as FilterKey)) {\n continue;\n }\n if (!value || value === 'false') {\n newValue.delete(key);\n } else if (Array.isArray(value)) {\n if (value.length === 0) {\n newValue.delete(key);\n } else {\n newValue.set(key, value.join(','));\n }\n } else if (typeof value === 'number') {\n newValue.set(key, String(value));\n } else if (value.length > 0) {\n newValue.set(key, value);\n } else {\n newValue.delete(key);\n }\n }\n return newValue;\n });\n };\n\n const onSearchQueryChange = (query: string) => {\n onPageChange(1);\n if (query) {\n analytics.captureEvent('qeta_search', query);\n }\n setSearchQuery(query);\n };\n\n useDebounce(\n () => {\n if (filters.searchQuery !== searchQuery) {\n setFilters({ ...filters, searchQuery: searchQuery });\n }\n },\n 400,\n [searchQuery],\n );\n\n useEffect(() => {\n let filtersApplied = false;\n searchParams.forEach((value, key) => {\n try {\n if (key === 'page') {\n const pv = Number.parseInt(value, 10);\n if (pv > 0) {\n setPage(pv);\n } else {\n setPage(1);\n }\n } else if (key === 'postsPerPage') {\n const qpp = Number.parseInt(value, 10);\n if (qpp > 0) setPostsPerPage(qpp);\n } else if (filterKeys.includes(key as FilterKey)) {\n filtersApplied = true;\n if (key === 'tags') {\n filters.tags = filterTags(value.split(',')) ?? [];\n } else if (key === 'entities') {\n filters.entities = value.split(',');\n } else {\n (filters as any)[key] = value;\n }\n }\n } catch (_e) {\n // NOOP\n }\n });\n setFilters(filters);\n if (filtersApplied) {\n setShowFilterPanel(true);\n }\n }, [searchParams, filters]);\n\n const {\n value: response,\n loading,\n error,\n retry,\n } = useQetaApi(\n api => {\n return api.getPosts({\n type,\n limit: postsPerPage,\n offset: (page - 1) * postsPerPage,\n includeEntities: true,\n includeAnswers: false,\n includeComments: false,\n includeAttachments: false,\n author,\n favorite,\n ...(getFiltersWithDateRange(filters) as any),\n });\n },\n [type, page, filters, postsPerPage],\n );\n\n useEffect(() => {\n if (response) {\n setPageCount(Math.ceil(response.total / postsPerPage));\n }\n }, [response, postsPerPage]);\n\n const onPageSizeChange = (value: number) => {\n if (response) {\n let newPage = page;\n while (newPage * value > response.total) {\n newPage -= 1;\n }\n onPageChange(Math.max(1, newPage));\n }\n setPostsPerPage(value);\n setSearchParams(prev => {\n const newValue = prev;\n newValue.set('postsPerPage', String(value));\n return newValue;\n });\n };\n\n return {\n page,\n setPage,\n postsPerPage,\n setPostsPerPage,\n showFilterPanel,\n setShowFilterPanel,\n searchParams,\n setSearchParams,\n searchQuery,\n setSearchQuery,\n filters,\n setFilters,\n onPageChange,\n onPageSizeChange,\n onFilterChange,\n onSearchQueryChange,\n response,\n loading,\n error,\n loadNextPage,\n pageCount,\n retry,\n };\n}\n"],"names":[],"mappings":";;;;;;;;;AA+BA,MAAM,0BAA6B,GAAA,4BAAA;AAE5B,SAAS,kBAAkB,KAA4B,EAAA;AAC5D,EAAM,MAAA,EAAE,MAAM,IAAM,EAAA,MAAA,EAAQ,UAAU,MAAQ,EAAA,QAAA,EAAU,iBACtD,GAAA,KAAA;AACF,EAAA,MAAM,YAAY,YAAa,EAAA;AAC/B,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,CAAC,CAAA;AAClC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,CAAC,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAc,EAAA,eAAe,CAAI,GAAA,QAAA,CAAS,mBAAmB,EAAE,CAAA;AACtE,EAAM,MAAA,CAAC,eAAiB,EAAA,kBAAkB,CAAI,GAAA,QAAA;AAAA,IAC5C,YAAA,CAAa,OAAQ,CAAA,0BAA0B,CAAM,KAAA;AAAA,GACvD;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,eAAgB,EAAA;AACxD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,EAAE,CAAA;AACjD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAsB,CAAA;AAAA,IAClD,KAAA,EAAO,MAAM,KAAS,IAAA,MAAA;AAAA,IACtB,OAAA,EAAS,MAAM,OAAW,IAAA,SAAA;AAAA,IAC1B,SAAA,EAAW,MAAM,SAAa,IAAA,OAAA;AAAA,IAC9B,eAAA,EAAiB,MAAM,eAAmB,IAAA,OAAA;AAAA,IAC1C,OAAA,EAAS,MAAM,OAAW,IAAA,OAAA;AAAA,IAC1B,WAAA,EAAa,MAAM,WAAe,IAAA,EAAA;AAAA,IAClC,QAAU,EAAA,QAAA,KAAa,MAAS,GAAA,CAAC,MAAM,CAAI,GAAA,KAAA,CAAA,CAAA;AAAA,IAC3C,IAAA;AAAA,IACA,SAAW,EAAA,EAAA;AAAA,IACX,cAAc,KAAM,CAAA,YAAA;AAAA,IACpB;AAAA,GACD,CAAA;AAED,EAAA,SAAA,CAAU,MAAM;AACd,IAAa,YAAA,CAAA,OAAA;AAAA,MACX,0BAAA;AAAA,MACA,kBAAkB,MAAS,GAAA;AAAA,KAC7B;AAAA,GACF,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAM,MAAA,YAAA,GAAe,CAAC,KAAkB,KAAA;AACtC,IAAA,OAAA,CAAQ,KAAK,CAAA;AACb,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA;AACjB,MAAA,QAAA,CAAS,GAAI,CAAA,MAAA,EAAQ,MAAO,CAAA,KAAK,CAAC,CAAA;AAClC,MAAO,OAAA,QAAA;AAAA,KACR,CAAA;AAAA,GACH;AAEA,EAAA,MAAM,eAAe,MAAM;AACzB,IAAQ,OAAA,CAAA,CAAA,IAAA,KAAQ,OAAO,CAAC,CAAA;AAAA,GAC1B;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,OAAmD,KAAA;AACzE,IAAA,MAAM,eAAe,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAI,GAAA,OAAA,GAAU,CAAC,OAAO,CAAA;AAChE,IAAA,OAAA,CAAQ,CAAC,CAAA;AACT,IAAA,UAAA,CAAW,CAAQ,IAAA,KAAA;AACjB,MAAM,MAAA,QAAA,GAAW,EAAE,GAAG,IAAK,EAAA;AAC3B,MAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAM,EAAA,IAAK,YAAc,EAAA;AACzC,QAAC,QAAA,CAAiB,GAAG,CAAI,GAAA,KAAA;AAAA;AAE3B,MAAO,OAAA,QAAA;AAAA,KACR,CAAA;AACD,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA;AACjB,MAAA,KAAA,MAAW,EAAE,GAAA,EAAK,KAAM,EAAA,IAAK,YAAc,EAAA;AACzC,QAAA,IAAI,CAAC,UAAA,CAAW,QAAS,CAAA,GAAgB,CAAG,EAAA;AAC1C,UAAA;AAAA;AAEF,QAAI,IAAA,CAAC,KAAS,IAAA,KAAA,KAAU,OAAS,EAAA;AAC/B,UAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,SACV,MAAA,IAAA,KAAA,CAAM,OAAQ,CAAA,KAAK,CAAG,EAAA;AAC/B,UAAI,IAAA,KAAA,CAAM,WAAW,CAAG,EAAA;AACtB,YAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,WACd,MAAA;AACL,YAAA,QAAA,CAAS,GAAI,CAAA,GAAA,EAAK,KAAM,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA;AAAA;AACnC,SACF,MAAA,IAAW,OAAO,KAAA,KAAU,QAAU,EAAA;AACpC,UAAA,QAAA,CAAS,GAAI,CAAA,GAAA,EAAK,MAAO,CAAA,KAAK,CAAC,CAAA;AAAA,SACjC,MAAA,IAAW,KAAM,CAAA,MAAA,GAAS,CAAG,EAAA;AAC3B,UAAS,QAAA,CAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,SAClB,MAAA;AACL,UAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA;AACrB;AAEF,MAAO,OAAA,QAAA;AAAA,KACR,CAAA;AAAA,GACH;AAEA,EAAM,MAAA,mBAAA,GAAsB,CAAC,KAAkB,KAAA;AAC7C,IAAA,YAAA,CAAa,CAAC,CAAA;AACd,IAAA,IAAI,KAAO,EAAA;AACT,MAAU,SAAA,CAAA,YAAA,CAAa,eAAe,KAAK,CAAA;AAAA;AAE7C,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,GACtB;AAEA,EAAA,WAAA;AAAA,IACE,MAAM;AACJ,MAAI,IAAA,OAAA,CAAQ,gBAAgB,WAAa,EAAA;AACvC,QAAA,UAAA,CAAW,EAAE,GAAG,OAAS,EAAA,WAAA,EAA0B,CAAA;AAAA;AACrD,KACF;AAAA,IACA,GAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,cAAiB,GAAA,KAAA;AACrB,IAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,KAAA,EAAO,GAAQ,KAAA;AACnC,MAAI,IAAA;AACF,QAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,UAAA,MAAM,EAAK,GAAA,MAAA,CAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA;AACpC,UAAA,IAAI,KAAK,CAAG,EAAA;AACV,YAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,WACL,MAAA;AACL,YAAA,OAAA,CAAQ,CAAC,CAAA;AAAA;AACX,SACF,MAAA,IAAW,QAAQ,cAAgB,EAAA;AACjC,UAAA,MAAM,GAAM,GAAA,MAAA,CAAO,QAAS,CAAA,KAAA,EAAO,EAAE,CAAA;AACrC,UAAI,IAAA,GAAA,GAAM,CAAG,EAAA,eAAA,CAAgB,GAAG,CAAA;AAAA,SACvB,MAAA,IAAA,UAAA,CAAW,QAAS,CAAA,GAAgB,CAAG,EAAA;AAChD,UAAiB,cAAA,GAAA,IAAA;AACjB,UAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,YAAA,OAAA,CAAQ,OAAO,UAAW,CAAA,KAAA,CAAM,MAAM,GAAG,CAAC,KAAK,EAAC;AAAA,WAClD,MAAA,IAAW,QAAQ,UAAY,EAAA;AAC7B,YAAQ,OAAA,CAAA,QAAA,GAAW,KAAM,CAAA,KAAA,CAAM,GAAG,CAAA;AAAA,WAC7B,MAAA;AACL,YAAC,OAAA,CAAgB,GAAG,CAAI,GAAA,KAAA;AAAA;AAC1B;AACF,eACO,EAAI,EAAA;AAAA;AAEb,KACD,CAAA;AACD,IAAA,UAAA,CAAW,OAAO,CAAA;AAClB,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA;AACzB,GACC,EAAA,CAAC,YAAc,EAAA,OAAO,CAAC,CAAA;AAE1B,EAAM,MAAA;AAAA,IACJ,KAAO,EAAA,QAAA;AAAA,IACP,OAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACE,GAAA,UAAA;AAAA,IACF,CAAO,GAAA,KAAA;AACL,MAAA,OAAO,IAAI,QAAS,CAAA;AAAA,QAClB,IAAA;AAAA,QACA,KAAO,EAAA,YAAA;AAAA,QACP,MAAA,EAAA,CAAS,OAAO,CAAK,IAAA,YAAA;AAAA,QACrB,eAAiB,EAAA,IAAA;AAAA,QACjB,cAAgB,EAAA,KAAA;AAAA,QAChB,eAAiB,EAAA,KAAA;AAAA,QACjB,kBAAoB,EAAA,KAAA;AAAA,QACpB,MAAA;AAAA,QACA,QAAA;AAAA,QACA,GAAI,wBAAwB,OAAO;AAAA,OACpC,CAAA;AAAA,KACH;AAAA,IACA,CAAC,IAAA,EAAM,IAAM,EAAA,OAAA,EAAS,YAAY;AAAA,GACpC;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,YAAA,CAAa,IAAK,CAAA,IAAA,CAAK,QAAS,CAAA,KAAA,GAAQ,YAAY,CAAC,CAAA;AAAA;AACvD,GACC,EAAA,CAAC,QAAU,EAAA,YAAY,CAAC,CAAA;AAE3B,EAAM,MAAA,gBAAA,GAAmB,CAAC,KAAkB,KAAA;AAC1C,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,IAAI,OAAU,GAAA,IAAA;AACd,MAAO,OAAA,OAAA,GAAU,KAAQ,GAAA,QAAA,CAAS,KAAO,EAAA;AACvC,QAAW,OAAA,IAAA,CAAA;AAAA;AAEb,MAAA,YAAA,CAAa,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,OAAO,CAAC,CAAA;AAAA;AAEnC,IAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,IAAA,eAAA,CAAgB,CAAQ,IAAA,KAAA;AACtB,MAAA,MAAM,QAAW,GAAA,IAAA;AACjB,MAAA,QAAA,CAAS,GAAI,CAAA,cAAA,EAAgB,MAAO,CAAA,KAAK,CAAC,CAAA;AAC1C,MAAO,OAAA,QAAA;AAAA,KACR,CAAA;AAAA,GACH;AAEA,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,eAAA;AAAA,IACA,kBAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,mBAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1,11 +1,11 @@
1
- import React__default, { useEffect, useCallback } from 'react';
1
+ import { useState, useEffect, useCallback } from 'react';
2
2
  import { useApi } from '@backstage/core-plugin-api';
3
3
  import { qetaApiRef } from '../api.esm.js';
4
4
 
5
5
  let followedTags = void 0;
6
6
  const useTagsFollow = () => {
7
- const [tags, setTags] = React__default.useState(followedTags ?? []);
8
- const [loading, setLoading] = React__default.useState(followedTags === void 0);
7
+ const [tags, setTags] = useState(followedTags ?? []);
8
+ const [loading, setLoading] = useState(followedTags === void 0);
9
9
  const qetaApi = useApi(qetaApiRef);
10
10
  useEffect(() => {
11
11
  if (followedTags === void 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"useTagsFollow.esm.js","sources":["../../src/hooks/useTagsFollow.ts"],"sourcesContent":["import React, { useCallback, useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\n\nlet followedTags: string[] | undefined = undefined;\n\nexport const useTagsFollow = () => {\n const [tags, setTags] = React.useState<string[]>(followedTags ?? []);\n const [loading, setLoading] = React.useState(followedTags === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedTags === undefined) {\n qetaApi.getFollowedTags().then(res => {\n followedTags = res.tags;\n setTags(res.tags);\n setLoading(false);\n });\n } else {\n setTags(followedTags);\n }\n }, [qetaApi]);\n\n const followTag = useCallback(\n (tag: string) => {\n qetaApi.followTag(tag).then(() => {\n setTags(prev => [...prev, tag]);\n followedTags?.push(tag);\n });\n },\n [qetaApi],\n );\n\n const unfollowTag = useCallback(\n (tag: string) => {\n qetaApi.unfollowTag(tag).then(() => {\n setTags(prev => prev.filter(t => t !== tag));\n followedTags = followedTags?.filter(t => t !== tag);\n });\n },\n [qetaApi],\n );\n\n const isFollowingTag = useCallback(\n (tag: string) => tags.includes(tag),\n [tags],\n );\n return {\n tags,\n followTag,\n unfollowTag,\n isFollowingTag,\n loading,\n };\n};\n"],"names":["React"],"mappings":";;;;AAIA,IAAI,YAAqC,GAAA,KAAA,CAAA;AAElC,MAAM,gBAAgB,MAAM;AACjC,EAAM,MAAA,CAAC,MAAM,OAAO,CAAA,GAAIA,eAAM,QAAmB,CAAA,YAAA,IAAgB,EAAE,CAAA;AACnE,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,IAAIA,cAAM,CAAA,QAAA,CAAS,iBAAiB,KAAS,CAAA,CAAA;AACvE,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,KAAW,CAAA,EAAA;AAC9B,MAAQ,OAAA,CAAA,eAAA,EAAkB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACpC,QAAA,YAAA,GAAe,GAAI,CAAA,IAAA;AACnB,QAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,OACjB,CAAA;AAAA,KACI,MAAA;AACL,MAAA,OAAA,CAAQ,YAAY,CAAA;AAAA;AACtB,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,GAAgB,KAAA;AACf,MAAA,OAAA,CAAQ,SAAU,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM;AAChC,QAAA,OAAA,CAAQ,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,GAAG,CAAC,CAAA;AAC9B,QAAA,YAAA,EAAc,KAAK,GAAG,CAAA;AAAA,OACvB,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,GAAgB,KAAA;AACf,MAAA,OAAA,CAAQ,WAAY,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM;AAClC,QAAA,OAAA,CAAQ,UAAQ,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,GAAG,CAAC,CAAA;AAC3C,QAAA,YAAA,GAAe,YAAc,EAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,GAAG,CAAA;AAAA,OACnD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,GAAA,KAAgB,IAAK,CAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IAClC,CAAC,IAAI;AAAA,GACP;AACA,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useTagsFollow.esm.js","sources":["../../src/hooks/useTagsFollow.ts"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\n\nlet followedTags: string[] | undefined = undefined;\n\nexport const useTagsFollow = () => {\n const [tags, setTags] = useState<string[]>(followedTags ?? []);\n const [loading, setLoading] = useState(followedTags === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedTags === undefined) {\n qetaApi.getFollowedTags().then(res => {\n followedTags = res.tags;\n setTags(res.tags);\n setLoading(false);\n });\n } else {\n setTags(followedTags);\n }\n }, [qetaApi]);\n\n const followTag = useCallback(\n (tag: string) => {\n qetaApi.followTag(tag).then(() => {\n setTags(prev => [...prev, tag]);\n followedTags?.push(tag);\n });\n },\n [qetaApi],\n );\n\n const unfollowTag = useCallback(\n (tag: string) => {\n qetaApi.unfollowTag(tag).then(() => {\n setTags(prev => prev.filter(t => t !== tag));\n followedTags = followedTags?.filter(t => t !== tag);\n });\n },\n [qetaApi],\n );\n\n const isFollowingTag = useCallback(\n (tag: string) => tags.includes(tag),\n [tags],\n );\n return {\n tags,\n followTag,\n unfollowTag,\n isFollowingTag,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;AAIA,IAAI,YAAqC,GAAA,KAAA,CAAA;AAElC,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,CAAC,IAAM,EAAA,OAAO,IAAI,QAAmB,CAAA,YAAA,IAAgB,EAAE,CAAA;AAC7D,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAAS,iBAAiB,KAAS,CAAA,CAAA;AACjE,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,iBAAiB,KAAW,CAAA,EAAA;AAC9B,MAAQ,OAAA,CAAA,eAAA,EAAkB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACpC,QAAA,YAAA,GAAe,GAAI,CAAA,IAAA;AACnB,QAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAChB,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,OACjB,CAAA;AAAA,KACI,MAAA;AACL,MAAA,OAAA,CAAQ,YAAY,CAAA;AAAA;AACtB,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,GAAgB,KAAA;AACf,MAAA,OAAA,CAAQ,SAAU,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM;AAChC,QAAA,OAAA,CAAQ,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,GAAG,CAAC,CAAA;AAC9B,QAAA,YAAA,EAAc,KAAK,GAAG,CAAA;AAAA,OACvB,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,WAAc,GAAA,WAAA;AAAA,IAClB,CAAC,GAAgB,KAAA;AACf,MAAA,OAAA,CAAQ,WAAY,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM;AAClC,QAAA,OAAA,CAAQ,UAAQ,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,GAAG,CAAC,CAAA;AAC3C,QAAA,YAAA,GAAe,YAAc,EAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,GAAG,CAAA;AAAA,OACnD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,cAAiB,GAAA,WAAA;AAAA,IACrB,CAAC,GAAA,KAAgB,IAAK,CAAA,QAAA,CAAS,GAAG,CAAA;AAAA,IAClC,CAAC,IAAI;AAAA,GACP;AACA,EAAO,OAAA;AAAA,IACL,IAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1,11 +1,11 @@
1
- import React__default, { useEffect, useCallback } from 'react';
1
+ import { useState, useEffect, useCallback } from 'react';
2
2
  import { useApi } from '@backstage/core-plugin-api';
3
3
  import { qetaApiRef } from '../api.esm.js';
4
4
 
5
5
  let followedUsers = void 0;
6
6
  const useUserFollow = () => {
7
- const [users, setUsers] = React__default.useState(followedUsers ?? []);
8
- const [loading, setLoading] = React__default.useState(followedUsers === void 0);
7
+ const [users, setUsers] = useState(followedUsers ?? []);
8
+ const [loading, setLoading] = useState(followedUsers === void 0);
9
9
  const qetaApi = useApi(qetaApiRef);
10
10
  useEffect(() => {
11
11
  if (followedUsers === void 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"useUserFollow.esm.js","sources":["../../src/hooks/useUserFollow.ts"],"sourcesContent":["import React, { useCallback, useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\n\nlet followedUsers: string[] | undefined = undefined;\n\nexport const useUserFollow = () => {\n const [users, setUsers] = React.useState<string[]>(followedUsers ?? []);\n const [loading, setLoading] = React.useState(followedUsers === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedUsers === undefined) {\n qetaApi.getFollowedUsers().then(res => {\n followedUsers = res.followedUserRefs;\n setUsers(res.followedUserRefs);\n setLoading(false);\n });\n } else {\n setUsers(followedUsers);\n }\n }, [qetaApi]);\n\n const followUser = useCallback(\n (user: string) => {\n qetaApi.followUser(user).then(() => {\n setUsers(prev => [...prev, user]);\n followedUsers?.push(user);\n });\n },\n [qetaApi],\n );\n\n const unfollowUser = useCallback(\n (user: string) => {\n qetaApi.unfollowUser(user).then(() => {\n setUsers(prev => prev.filter(t => t !== user));\n followedUsers = followedUsers?.filter(t => t !== user);\n });\n },\n [qetaApi],\n );\n\n const isFollowingUser = useCallback(\n (user: string) => users.includes(user),\n [users],\n );\n return {\n users,\n followUser,\n unfollowUser,\n isFollowingUser,\n loading,\n };\n};\n"],"names":["React"],"mappings":";;;;AAIA,IAAI,aAAsC,GAAA,KAAA,CAAA;AAEnC,MAAM,gBAAgB,MAAM;AACjC,EAAM,MAAA,CAAC,OAAO,QAAQ,CAAA,GAAIA,eAAM,QAAmB,CAAA,aAAA,IAAiB,EAAE,CAAA;AACtE,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,IAAIA,cAAM,CAAA,QAAA,CAAS,kBAAkB,KAAS,CAAA,CAAA;AACxE,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,kBAAkB,KAAW,CAAA,EAAA;AAC/B,MAAQ,OAAA,CAAA,gBAAA,EAAmB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACrC,QAAA,aAAA,GAAgB,GAAI,CAAA,gBAAA;AACpB,QAAA,QAAA,CAAS,IAAI,gBAAgB,CAAA;AAC7B,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,OACjB,CAAA;AAAA,KACI,MAAA;AACL,MAAA,QAAA,CAAS,aAAa,CAAA;AAAA;AACxB,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,UAAa,GAAA,WAAA;AAAA,IACjB,CAAC,IAAiB,KAAA;AAChB,MAAA,OAAA,CAAQ,UAAW,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,MAAM;AAClC,QAAA,QAAA,CAAS,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AAChC,QAAA,aAAA,EAAe,KAAK,IAAI,CAAA;AAAA,OACzB,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,IAAiB,KAAA;AAChB,MAAA,OAAA,CAAQ,YAAa,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,MAAM;AACpC,QAAA,QAAA,CAAS,UAAQ,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,IAAI,CAAC,CAAA;AAC7C,QAAA,aAAA,GAAgB,aAAe,EAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,IAAI,CAAA;AAAA,OACtD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,IAAA,KAAiB,KAAM,CAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACrC,CAAC,KAAK;AAAA,GACR;AACA,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useUserFollow.esm.js","sources":["../../src/hooks/useUserFollow.ts"],"sourcesContent":["import { useState, useCallback, useEffect } from 'react';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\n\nlet followedUsers: string[] | undefined = undefined;\n\nexport const useUserFollow = () => {\n const [users, setUsers] = useState<string[]>(followedUsers ?? []);\n const [loading, setLoading] = useState(followedUsers === undefined);\n const qetaApi = useApi(qetaApiRef);\n\n useEffect(() => {\n if (followedUsers === undefined) {\n qetaApi.getFollowedUsers().then(res => {\n followedUsers = res.followedUserRefs;\n setUsers(res.followedUserRefs);\n setLoading(false);\n });\n } else {\n setUsers(followedUsers);\n }\n }, [qetaApi]);\n\n const followUser = useCallback(\n (user: string) => {\n qetaApi.followUser(user).then(() => {\n setUsers(prev => [...prev, user]);\n followedUsers?.push(user);\n });\n },\n [qetaApi],\n );\n\n const unfollowUser = useCallback(\n (user: string) => {\n qetaApi.unfollowUser(user).then(() => {\n setUsers(prev => prev.filter(t => t !== user));\n followedUsers = followedUsers?.filter(t => t !== user);\n });\n },\n [qetaApi],\n );\n\n const isFollowingUser = useCallback(\n (user: string) => users.includes(user),\n [users],\n );\n return {\n users,\n followUser,\n unfollowUser,\n isFollowingUser,\n loading,\n };\n};\n"],"names":[],"mappings":";;;;AAIA,IAAI,aAAsC,GAAA,KAAA,CAAA;AAEnC,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,CAAC,KAAO,EAAA,QAAQ,IAAI,QAAmB,CAAA,aAAA,IAAiB,EAAE,CAAA;AAChE,EAAA,MAAM,CAAC,OAAS,EAAA,UAAU,CAAI,GAAA,QAAA,CAAS,kBAAkB,KAAS,CAAA,CAAA;AAClE,EAAM,MAAA,OAAA,GAAU,OAAO,UAAU,CAAA;AAEjC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,kBAAkB,KAAW,CAAA,EAAA;AAC/B,MAAQ,OAAA,CAAA,gBAAA,EAAmB,CAAA,IAAA,CAAK,CAAO,GAAA,KAAA;AACrC,QAAA,aAAA,GAAgB,GAAI,CAAA,gBAAA;AACpB,QAAA,QAAA,CAAS,IAAI,gBAAgB,CAAA;AAC7B,QAAA,UAAA,CAAW,KAAK,CAAA;AAAA,OACjB,CAAA;AAAA,KACI,MAAA;AACL,MAAA,QAAA,CAAS,aAAa,CAAA;AAAA;AACxB,GACF,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,MAAM,UAAa,GAAA,WAAA;AAAA,IACjB,CAAC,IAAiB,KAAA;AAChB,MAAA,OAAA,CAAQ,UAAW,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,MAAM;AAClC,QAAA,QAAA,CAAS,CAAQ,IAAA,KAAA,CAAC,GAAG,IAAA,EAAM,IAAI,CAAC,CAAA;AAChC,QAAA,aAAA,EAAe,KAAK,IAAI,CAAA;AAAA,OACzB,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,IAAiB,KAAA;AAChB,MAAA,OAAA,CAAQ,YAAa,CAAA,IAAI,CAAE,CAAA,IAAA,CAAK,MAAM;AACpC,QAAA,QAAA,CAAS,UAAQ,IAAK,CAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,IAAI,CAAC,CAAA;AAC7C,QAAA,aAAA,GAAgB,aAAe,EAAA,MAAA,CAAO,CAAK,CAAA,KAAA,CAAA,KAAM,IAAI,CAAA;AAAA,OACtD,CAAA;AAAA,KACH;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,eAAkB,GAAA,WAAA;AAAA,IACtB,CAAC,IAAA,KAAiB,KAAM,CAAA,QAAA,CAAS,IAAI,CAAA;AAAA,IACrC,CAAC,KAAK;AAAA,GACR;AACA,EAAO,OAAA;AAAA,IACL,KAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1,4 +1,5 @@
1
- import React__default, { useState, useEffect } from 'react';
1
+ import * as React from 'react';
2
+ import { useState, useEffect } from 'react';
2
3
  import { useAnalytics, useApi } from '@backstage/core-plugin-api';
3
4
  import { qetaApiRef } from '../api.esm.js';
4
5
  import { useTranslation } from './useTranslation.esm.js';
@@ -8,10 +9,10 @@ function isPostResponse(resp) {
8
9
  return "title" in resp;
9
10
  }
10
11
  function useVoting(resp) {
11
- const [entity, setEntity] = React__default.useState(
12
+ const [entity, setEntity] = React.useState(
12
13
  resp
13
14
  );
14
- const [ownVote, setOwnVote] = React__default.useState(entity.ownVote ?? 0);
15
+ const [ownVote, setOwnVote] = React.useState(entity.ownVote ?? 0);
15
16
  const [correctAnswer, setCorrectAnswer] = useState(
16
17
  "postId" in entity ? entity.correct : false
17
18
  );
@@ -1 +1 @@
1
- {"version":3,"file":"useVoting.esm.js","sources":["../../src/hooks/useVoting.ts"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useAnalytics, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useTranslation } from './useTranslation';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport {\n AnswerResponse,\n PostResponse,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\n\nfunction isPostResponse(\n resp: PostResponse | AnswerResponse,\n): resp is PostResponse {\n return 'title' in resp;\n}\n\nexport function useVoting(resp: PostResponse | AnswerResponse) {\n const [entity, setEntity] = React.useState<PostResponse | AnswerResponse>(\n resp,\n );\n const [ownVote, setOwnVote] = React.useState(entity.ownVote ?? 0);\n const [correctAnswer, setCorrectAnswer] = useState(\n 'postId' in entity ? entity.correct : false,\n );\n const [score, setScore] = useState(entity.score);\n const analytics = useAnalytics();\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n\n const isPost = isPostResponse(resp);\n const own = entity.own ?? false;\n\n const { lastSignal } = useSignal<QetaSignal>(\n isPost ? `qeta:post_${entity.id}` : `qeta:answer_${entity.id}`,\n );\n\n useEffect(() => {\n if (entity) {\n setScore(entity.score);\n }\n }, [entity]);\n\n useEffect(() => {\n if (\n lastSignal?.type === 'post_stats' ||\n lastSignal?.type === 'answer_stats'\n ) {\n setCorrectAnswer(lastSignal.correctAnswer);\n setScore(lastSignal.score);\n }\n }, [lastSignal]);\n\n const deletePostVote = (id: number) => {\n qetaApi.deletePostVote(id).then(response => {\n setOwnVote(0);\n analytics.captureEvent('vote', 'question', { value: 0 });\n setEntity(response);\n });\n };\n\n const deleteAnswerVote = (postId: number, id: number) => {\n qetaApi.deleteAnswerVote(postId, id).then(response => {\n setOwnVote(0);\n analytics.captureEvent('vote', 'answer', { value: 0 });\n setEntity(response);\n });\n };\n\n const voteUp = () => {\n if (isPost) {\n if (ownVote > 0) {\n deletePostVote(entity.id);\n return;\n }\n qetaApi.votePostUp(entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'question', { value: 1 });\n setEntity(response);\n });\n } else if ('postId' in entity) {\n if (ownVote > 0) {\n deleteAnswerVote(entity.postId, entity.id);\n return;\n }\n qetaApi.voteAnswerUp(entity.postId, entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'answer', { value: 1 });\n setEntity(response);\n });\n }\n };\n\n const voteDown = () => {\n if (isPost) {\n if (ownVote < 0) {\n deletePostVote(entity.id);\n return;\n }\n qetaApi.votePostDown(entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'question', { value: -1 });\n setEntity(response);\n });\n } else if ('postId' in entity) {\n if (ownVote < 0) {\n deleteAnswerVote(entity.postId, entity.id);\n return;\n }\n qetaApi.voteAnswerDown(entity.postId, entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'answer', { value: -1 });\n setEntity(response);\n });\n }\n };\n\n let correctTooltip: string = correctAnswer\n ? t('voteButtons.answer.markIncorrect')\n : t('voteButtons.answer.markCorrect');\n if (own) {\n correctTooltip = correctAnswer ? t('voteButtons.answer.marked') : '';\n }\n\n let voteUpTooltip: string = isPost\n ? t('voteButtons.post.good', { type: resp.type })\n : t('voteButtons.answer.good');\n if (own) {\n voteUpTooltip = isPost\n ? t('voteButtons.post.own', { type: resp.type })\n : t('voteButtons.answer.own');\n }\n\n let voteDownTooltip: string = isPost\n ? t('voteButtons.post.bad', { type: resp.type })\n : t('voteButtons.answer.bad');\n if (own) {\n voteDownTooltip = voteUpTooltip;\n }\n\n const toggleCorrectAnswer = () => {\n if (!('postId' in entity)) {\n return;\n }\n if (correctAnswer) {\n qetaApi.markAnswerIncorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(true);\n }\n });\n }\n };\n\n return {\n entity,\n ownVote,\n correctAnswer,\n score,\n voteUp,\n voteDown,\n toggleCorrectAnswer,\n voteUpTooltip,\n voteDownTooltip,\n correctTooltip,\n };\n}\n"],"names":["React"],"mappings":"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"}
1
+ {"version":3,"file":"useVoting.esm.js","sources":["../../src/hooks/useVoting.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport * as React from 'react';\nimport { useAnalytics, useApi } from '@backstage/core-plugin-api';\nimport { qetaApiRef } from '../api';\nimport { useTranslation } from './useTranslation';\nimport { useSignal } from '@backstage/plugin-signals-react';\nimport {\n AnswerResponse,\n PostResponse,\n QetaSignal,\n} from '@drodil/backstage-plugin-qeta-common';\n\nfunction isPostResponse(\n resp: PostResponse | AnswerResponse,\n): resp is PostResponse {\n return 'title' in resp;\n}\n\nexport function useVoting(resp: PostResponse | AnswerResponse) {\n const [entity, setEntity] = React.useState<PostResponse | AnswerResponse>(\n resp,\n );\n const [ownVote, setOwnVote] = React.useState(entity.ownVote ?? 0);\n const [correctAnswer, setCorrectAnswer] = useState(\n 'postId' in entity ? entity.correct : false,\n );\n const [score, setScore] = useState(entity.score);\n const analytics = useAnalytics();\n const qetaApi = useApi(qetaApiRef);\n const { t } = useTranslation();\n\n const isPost = isPostResponse(resp);\n const own = entity.own ?? false;\n\n const { lastSignal } = useSignal<QetaSignal>(\n isPost ? `qeta:post_${entity.id}` : `qeta:answer_${entity.id}`,\n );\n\n useEffect(() => {\n if (entity) {\n setScore(entity.score);\n }\n }, [entity]);\n\n useEffect(() => {\n if (\n lastSignal?.type === 'post_stats' ||\n lastSignal?.type === 'answer_stats'\n ) {\n setCorrectAnswer(lastSignal.correctAnswer);\n setScore(lastSignal.score);\n }\n }, [lastSignal]);\n\n const deletePostVote = (id: number) => {\n qetaApi.deletePostVote(id).then(response => {\n setOwnVote(0);\n analytics.captureEvent('vote', 'question', { value: 0 });\n setEntity(response);\n });\n };\n\n const deleteAnswerVote = (postId: number, id: number) => {\n qetaApi.deleteAnswerVote(postId, id).then(response => {\n setOwnVote(0);\n analytics.captureEvent('vote', 'answer', { value: 0 });\n setEntity(response);\n });\n };\n\n const voteUp = () => {\n if (isPost) {\n if (ownVote > 0) {\n deletePostVote(entity.id);\n return;\n }\n qetaApi.votePostUp(entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'question', { value: 1 });\n setEntity(response);\n });\n } else if ('postId' in entity) {\n if (ownVote > 0) {\n deleteAnswerVote(entity.postId, entity.id);\n return;\n }\n qetaApi.voteAnswerUp(entity.postId, entity.id).then(response => {\n setOwnVote(1);\n analytics.captureEvent('vote', 'answer', { value: 1 });\n setEntity(response);\n });\n }\n };\n\n const voteDown = () => {\n if (isPost) {\n if (ownVote < 0) {\n deletePostVote(entity.id);\n return;\n }\n qetaApi.votePostDown(entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'question', { value: -1 });\n setEntity(response);\n });\n } else if ('postId' in entity) {\n if (ownVote < 0) {\n deleteAnswerVote(entity.postId, entity.id);\n return;\n }\n qetaApi.voteAnswerDown(entity.postId, entity.id).then(response => {\n setOwnVote(-1);\n analytics.captureEvent('vote', 'answer', { value: -1 });\n setEntity(response);\n });\n }\n };\n\n let correctTooltip: string = correctAnswer\n ? t('voteButtons.answer.markIncorrect')\n : t('voteButtons.answer.markCorrect');\n if (own) {\n correctTooltip = correctAnswer ? t('voteButtons.answer.marked') : '';\n }\n\n let voteUpTooltip: string = isPost\n ? t('voteButtons.post.good', { type: resp.type })\n : t('voteButtons.answer.good');\n if (own) {\n voteUpTooltip = isPost\n ? t('voteButtons.post.own', { type: resp.type })\n : t('voteButtons.answer.own');\n }\n\n let voteDownTooltip: string = isPost\n ? t('voteButtons.post.bad', { type: resp.type })\n : t('voteButtons.answer.bad');\n if (own) {\n voteDownTooltip = voteUpTooltip;\n }\n\n const toggleCorrectAnswer = () => {\n if (!('postId' in entity)) {\n return;\n }\n if (correctAnswer) {\n qetaApi.markAnswerIncorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(false);\n }\n });\n } else {\n qetaApi.markAnswerCorrect(entity.postId, entity.id).then(response => {\n if (response) {\n setCorrectAnswer(true);\n }\n });\n }\n };\n\n return {\n entity,\n ownVote,\n correctAnswer,\n score,\n voteUp,\n voteDown,\n toggleCorrectAnswer,\n voteUpTooltip,\n voteDownTooltip,\n correctTooltip,\n };\n}\n"],"names":[],"mappings":"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"}