bug_report.cljs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. (ns frontend.components.bug-report
  2. (:require [clojure.string :as string]
  3. [frontend.components.header :as header]
  4. [frontend.context.i18n :refer [t]]
  5. [frontend.handler.notification :as notification]
  6. [frontend.ui :as ui]
  7. [frontend.util :as util]
  8. [logseq.shui.hooks :as hooks]
  9. [reitit.frontend.easy :as rfe]
  10. [rum.core :as rum]))
  11. (defn parse-clipboard-data-transfer
  12. "parse dataTransfer
  13. input: dataTransfer
  14. output: {:types {:type :data} :items {:kind :type} :files {:name :size :type}}"
  15. [data]
  16. (let [items (.-items data)
  17. types (.-types data)
  18. files (.-files data)]
  19. (conj
  20. {:items (->> items
  21. (map (fn [item] {:kind (.-kind item) :type (.-type item)}))
  22. (conj))}
  23. {:types (->> types
  24. (map (fn [type] {:type type :data (.getData data type)}))
  25. (conj))}
  26. {:files (->> files
  27. (map (fn [file] {:name (.-name file) :type (.-type file) :size (.-size file)}))
  28. (conj))})))
  29. (rum/defc clipboard-data-inspector
  30. "bug report tool for clipboard"
  31. []
  32. (let [[result set-result!] (rum/use-state {})
  33. [step set-step!] (rum/use-state 0)
  34. paste-handler! (fn [e]
  35. (let [clipboard-data (.-clipboardData e)
  36. result (parse-clipboard-data-transfer clipboard-data)
  37. result (into {} result)]
  38. (set-result! result)
  39. (set-step! 1)))
  40. copy-result-to-clipboard! (fn [result]
  41. (util/copy-to-clipboard! result)
  42. (notification/show! (t :bug-report/inspector-page-copy-notif)))
  43. reset-step! (fn []
  44. (set-step! 0)
  45. (set-result! {}))]
  46. (hooks/use-effect!
  47. (fn []
  48. (cond (= step 0) (js/addEventListener "paste" paste-handler!))
  49. (fn [] (cond (= step 0) (js/removeEventListener "paste" paste-handler!))))
  50. [step]) ;; when step === 0
  51. [:div.flex.flex-col
  52. (when (= step 0)
  53. (list [:div.mx-auto (t :bug-report/inspector-page-desc-1)]
  54. [:div.mx-auto (t :bug-report/inspector-page-desc-2)]
  55. ;; for mobile
  56. [:input.form-input.is-large.transition.duration-150.ease-in-out {:type "text" :placeholder (t :bug-report/inspector-page-placeholder)}]
  57. [:div.flex.justify-between.items-center.mt-2
  58. [:div (t :bug-report/inspector-page-tip)]
  59. (ui/button (t :bug-report/inspector-page-btn-back) :on-click #(util/open-url (rfe/href :bug-report)))]))
  60. (when (= step 1)
  61. (list
  62. [:div (t :bug-report/inspector-page-desc-clipboard)]
  63. [:div.flex.justify-between.items-center.mt-2
  64. [:div (t :bug-report/inspector-page-desc-copy)]
  65. (ui/button (t :bug-report/inspector-page-btn-copy) :on-click #(copy-result-to-clipboard! (js/JSON.stringify (clj->js result) nil 2)))]
  66. [:div.flex.justify-between.items-center.mt-2
  67. [:div (t :bug-report/inspector-page-desc-create-issue)]
  68. (ui/button (t :bug-report/inspector-page-btn-create-issue) :href (header/bug-report-url))]
  69. [:div.flex.justify-between.items-center.mt-2
  70. [:div (t :bug-report/inspector-page-tip)]
  71. (ui/button (t :bug-report/inspector-page-btn-back) :on-click reset-step!)]
  72. [:pre.whitespace-pre-wrap [:code (js/JSON.stringify (clj->js result) nil 2)]]))]))
  73. (rum/defc bug-report-tool-route
  74. [route-match]
  75. (let [name (get-in route-match [:parameters :path :tool])]
  76. [:div.flex.flex-col ;; container
  77. (cond
  78. (= name "clipboard-data-inspector")
  79. [:h1.text-2xl.mx-auto.mb-4 (ui/icon "clipboard") " " (-> (t :bug-report/clipboard-inspector-title) (string/capitalize))])
  80. (cond
  81. (= name "clipboard-data-inspector")
  82. (clipboard-data-inspector))]))
  83. (rum/defc report-item-button
  84. [title description icon-name {:keys [on-click]}]
  85. [:a.cp__bug-report-item-button.flex.items-center.px-4.py-2.my-2.rounded-lg {:on-click on-click}
  86. [(ui/icon icon-name)
  87. [:div.flex.flex-col.ml-2
  88. [:div title]
  89. [:div.opacity-60 description]]]])
  90. (rum/defc bug-report
  91. []
  92. [:div.flex.flex-col
  93. [:div.flex.flex-col.items-center
  94. [:div.flex.items-center.mb-2
  95. (ui/icon "bug")
  96. [:h1.text-3xl.ml-2 (t :bug-report/main-title)]]
  97. [:div.opacity-60 (t :bug-report/main-desc)]]
  98. [:div.cp__bug-report-reporter.rounded-lg.p-8.mt-8
  99. [:h1.text-2xl (t :bug-report/section-clipboard-title)]
  100. [:div.opacity-60 (t :bug-report/section-clipboard-desc)]
  101. (report-item-button (t :bug-report/section-clipboard-btn-title)
  102. (t :bug-report/section-clipboard-btn-desc)
  103. "clipboard"
  104. {:on-click #(util/open-url (rfe/href :bug-report-tools {:tool "clipboard-data-inspector"}))})
  105. [:div.py-2] ;; divider
  106. [:div.flex.flex-col
  107. [:h1.text-2xl (t :bug-report/section-issues-title)]
  108. [:div.opacity-60 (t :bug-report/section-issues-desc)]
  109. (report-item-button (t :bug-report/section-issues-btn-title) (t :bug-report/section-issues-btn-desc) "message-report" {:on-click #(util/open-url (header/bug-report-url))})]]])