@antv/dumi-theme-antv 0.5.6 → 0.5.7-beta.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.
@@ -0,0 +1,163 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import { Alert, Button, Divider, Form, Select } from 'antd';
8
+ import { useIntl, useLocale } from 'dumi';
9
+ import React, { useEffect } from 'react';
10
+ import { styled } from 'styled-components';
11
+ import { useSnapshot } from 'valtio';
12
+ import { feedbackStore, resetPageFeedback } from "../../model/feedback";
13
+ import { useGithubRepo } from "../../utils/github";
14
+ import { useFeedbackService } from "./service";
15
+ var StyledFeedbackMessageWrapper = styled.div.withConfig({
16
+ displayName: "StyledFeedbackMessageWrapper",
17
+ componentId: "dumi-theme-antv-c7ef__sc-1xff90d-0"
18
+ })(["display:", ";.ant-divider-horizontal{margin:16px 0;}.alert{margin:12px 0 16px;padding:16px;font-size:13px;line-height:1.8;background-color:rgba(255,251,235,0.5);border:1px solid rgba(173,104,0,0.15);border-radius:8px;.ant-alert-icon{color:#cc8800;}}.alert-link{color:#56390c;font-weight:bold;text-decoration:underline;}.ant-form-item:last-child{margin-bottom:8px;}"], function (props) {
19
+ return props.$rating ? 'block' : 'none';
20
+ });
21
+ export var PageFeedbackReasonForm = function PageFeedbackReasonForm() {
22
+ var _useIntl = useIntl(),
23
+ formatMessage = _useIntl.formatMessage;
24
+ var _Form$useForm = Form.useForm(),
25
+ _Form$useForm2 = _slicedToArray(_Form$useForm, 1),
26
+ form = _Form$useForm2[0];
27
+ var feedbackState = useSnapshot(feedbackStore);
28
+ var _useGithubRepo = useGithubRepo(),
29
+ owner = _useGithubRepo.owner,
30
+ repo = _useGithubRepo.repo;
31
+ var pageUrl = window.location.href;
32
+ var locale = useLocale();
33
+ var currentLocale = locale.id;
34
+ var issueUrl = "https://github.com/".concat(owner, "/").concat(repo, "/issues/new?labels=status%3A+waiting+for+maintainer%2Cdocs-feedback&template=docs-feedback.yml&title=[docs]+&page-url=").concat(pageUrl);
35
+ var alertMsg = /*#__PURE__*/React.createElement("div", null, formatMessage({
36
+ id: '如果遇到问题或发现某些功能无法正常工作,请通过'
37
+ }), /*#__PURE__*/React.createElement("a", {
38
+ onClick: function onClick() {
39
+ return window.open(issueUrl, '_blank');
40
+ },
41
+ className: "alert-link"
42
+ }, formatMessage({
43
+ id: '提交问题报告'
44
+ })), formatMessage({
45
+ id: '来反馈。否则,团队将无法提供进一步的答复或获取更多信息。'
46
+ }));
47
+ var _useFeedbackService = useFeedbackService(),
48
+ submitFeedback = _useFeedbackService.submitFeedback,
49
+ showFeedbackResult = _useFeedbackService.showFeedbackResult;
50
+ var onFinish = function onFinish(values) {
51
+ var params = {
52
+ rating: feedbackState.rating,
53
+ reason: values.reason
54
+ };
55
+ submitFeedback(params).then(function (f) {
56
+ onCancel();
57
+ showFeedbackResult(true);
58
+ }).catch(function () {
59
+ showFeedbackResult(false);
60
+ });
61
+ };
62
+ var onCancel = function onCancel() {
63
+ form.resetFields();
64
+ resetPageFeedback();
65
+ };
66
+ useEffect(function () {
67
+ if (!feedbackState.rating) onCancel();
68
+ }, [feedbackState.rating]);
69
+ var likeReasons = [{
70
+ label: formatMessage({
71
+ id: '容易理解'
72
+ }),
73
+ value: 'easy_to_understand'
74
+ }, {
75
+ label: formatMessage({
76
+ id: '解决了我的问题'
77
+ }),
78
+ value: 'solved_my_problem'
79
+ }, {
80
+ label: formatMessage({
81
+ id: '其它'
82
+ }),
83
+ value: 'other'
84
+ }];
85
+ var dislikeReasons = [{
86
+ label: formatMessage({
87
+ id: '缺少我需要的信息'
88
+ }),
89
+ value: 'missing_information'
90
+ }, {
91
+ label: formatMessage({
92
+ id: '过于复杂/步骤太多'
93
+ }),
94
+ value: 'too_complicated'
95
+ }, {
96
+ label: formatMessage({
97
+ id: '内容更新不及时'
98
+ }),
99
+ value: 'out_of_date'
100
+ }, {
101
+ label: formatMessage({
102
+ id: '示例/代码有问题'
103
+ }),
104
+ value: 'code_issue'
105
+ }, {
106
+ label: formatMessage({
107
+ id: '其它'
108
+ }),
109
+ value: 'other'
110
+ }];
111
+ var reasons = feedbackState.rating === '1' ? likeReasons : dislikeReasons;
112
+ useEffect(function () {
113
+ // 默认选中第一个原因
114
+ form === null || form === void 0 || form.setFieldsValue({
115
+ reason: reasons[0].value
116
+ });
117
+ }, [feedbackState.rating, currentLocale]);
118
+ var dislike = feedbackState.rating !== '1';
119
+ return /*#__PURE__*/React.createElement(StyledFeedbackMessageWrapper, {
120
+ $rating: feedbackState.rating
121
+ }, /*#__PURE__*/React.createElement(Divider, {
122
+ dashed: true
123
+ }), /*#__PURE__*/React.createElement("div", {
124
+ className: "form"
125
+ }, /*#__PURE__*/React.createElement(Form, {
126
+ form: form,
127
+ name: "page-feedback-form",
128
+ onFinish: onFinish,
129
+ layout: "vertical"
130
+ }, /*#__PURE__*/React.createElement(Form.Item, {
131
+ name: "reason",
132
+ label: formatMessage({
133
+ id: '🚀 留下你的真实感受'
134
+ })
135
+ }, /*#__PURE__*/React.createElement(Select, {
136
+ options: reasons
137
+ })), dislike && /*#__PURE__*/React.createElement(Alert, {
138
+ type: "warning",
139
+ className: "alert",
140
+ message: alertMsg,
141
+ showIcon: true
142
+ }), /*#__PURE__*/React.createElement(Form.Item, {
143
+ style: {
144
+ textAlign: 'right'
145
+ }
146
+ }, /*#__PURE__*/React.createElement(Button, {
147
+ htmlType: "button",
148
+ type: "text",
149
+ size: "small",
150
+ onClick: onCancel,
151
+ style: {
152
+ marginRight: 8
153
+ }
154
+ }, formatMessage({
155
+ id: '取消'
156
+ })), /*#__PURE__*/React.createElement(Button, {
157
+ type: "primary",
158
+ htmlType: "submit",
159
+ size: "small"
160
+ }, formatMessage({
161
+ id: '提交'
162
+ }))))));
163
+ };
@@ -0,0 +1,60 @@
1
+ import { DislikeFilled, LikeFilled } from '@ant-design/icons';
2
+ import { Button, Tooltip } from 'antd';
3
+ import { useIntl } from 'dumi';
4
+ import React from 'react';
5
+ import { styled } from 'styled-components';
6
+ import { useSnapshot } from 'valtio';
7
+ import { feedbackStore, invokePageFeedback, resetPageFeedback } from "../../model/feedback";
8
+ var StyledVoteButtonsWrapper = styled.div.withConfig({
9
+ displayName: "StyledVoteButtonsWrapper",
10
+ componentId: "dumi-theme-antv-c7ef__sc-1x5fro0-0"
11
+ })(["color:rgba(0,0,0,0.65);display:flex;align-items:center;gap:4px;font-weight:500;.button{color:rgba(0,0,0,0.65);}.active-button{color:#873bf4;background-color:#f8f1ff;}"]);
12
+ export var PageFeedbackVoteButtons = function PageFeedbackVoteButtons() {
13
+ var _useIntl = useIntl(),
14
+ formatMessage = _useIntl.formatMessage;
15
+ var feedbackState = useSnapshot(feedbackStore);
16
+ var items = [{
17
+ title: formatMessage({
18
+ id: 'yes'
19
+ }),
20
+ icon: /*#__PURE__*/React.createElement(LikeFilled, null),
21
+ onClick: function onClick() {
22
+ if (feedbackState.rating === '1') {
23
+ resetPageFeedback();
24
+ } else {
25
+ invokePageFeedback(true);
26
+ }
27
+ },
28
+ isActive: feedbackState.rating === '1'
29
+ }, {
30
+ title: formatMessage({
31
+ id: 'no'
32
+ }),
33
+ icon: /*#__PURE__*/React.createElement(DislikeFilled, null),
34
+ onClick: function onClick() {
35
+ if (feedbackState.rating === '0') {
36
+ resetPageFeedback();
37
+ } else {
38
+ invokePageFeedback(false);
39
+ }
40
+ },
41
+ isActive: feedbackState.rating === '0'
42
+ }];
43
+ return /*#__PURE__*/React.createElement(StyledVoteButtonsWrapper, null, /*#__PURE__*/React.createElement("span", null, formatMessage({
44
+ id: '这个页面对你有帮助吗?'
45
+ })), items.map(function (_ref) {
46
+ var title = _ref.title,
47
+ icon = _ref.icon,
48
+ onClick = _ref.onClick,
49
+ isActive = _ref.isActive;
50
+ return /*#__PURE__*/React.createElement(Tooltip, {
51
+ key: title,
52
+ title: title
53
+ }, /*#__PURE__*/React.createElement(Button, {
54
+ className: "button ".concat(isActive ? 'active-button' : ''),
55
+ type: "text",
56
+ icon: icon,
57
+ onClick: onClick
58
+ }));
59
+ }));
60
+ };
@@ -0,0 +1,97 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import React, { useEffect, useState } from 'react';
8
+ import { useLocation } from 'react-router-dom';
9
+ import { styled } from 'styled-components';
10
+ import { useSnapshot } from 'valtio';
11
+ import { feedbackStore, invokeSectionFeedback, resetSectionFeedback } from "../../model/feedback";
12
+ import { SectionFeedbackCommentForm } from "./SectionFeedbackCommentForm";
13
+ var StyledWrapper = styled.div.withConfig({
14
+ displayName: "StyledWrapper",
15
+ componentId: "dumi-theme-antv-c7ef__sc-vcamqv-0"
16
+ })(["background-color:#fff;border-radius:12px;box-shadow:0 0.5rem 1.2rem #f0f1f2;transition:height 0.3s ease-in-out;width:262px;position:fixed;z-index:1001;padding:10px 18px;border-radius:8px;transition:top 0.3s ease-in-out,right 0.3s ease-in-out;"]);
17
+ export var SectionFeedback = function SectionFeedback() {
18
+ var feedbackState = useSnapshot(feedbackStore);
19
+ var location = useLocation();
20
+ useEffect(function () {
21
+ var observer = new MutationObserver(function () {
22
+ var buttons = document.querySelectorAll('.comment-link');
23
+ if (!buttons || buttons.length === 0) return;
24
+ var focusCommentInput = function focusCommentInput(e) {
25
+ var button = e.target.closest('.comment-link');
26
+ invokeSectionFeedback(button.getAttribute('data-feedback-hash'));
27
+ };
28
+ buttons.forEach(function (button) {
29
+ button.addEventListener('click', focusCommentInput);
30
+ });
31
+ return function () {
32
+ buttons.forEach(function (button) {
33
+ button.removeEventListener('click', focusCommentInput);
34
+ });
35
+ };
36
+ });
37
+ observer.observe(document.body, {
38
+ childList: true,
39
+ subtree: true
40
+ });
41
+ return function () {
42
+ observer.disconnect();
43
+ };
44
+ }, []);
45
+ var _useState = useState({
46
+ top: 0,
47
+ right: 12
48
+ }),
49
+ _useState2 = _slicedToArray(_useState, 2),
50
+ position = _useState2[0],
51
+ setPosition = _useState2[1];
52
+ useEffect(function () {
53
+ var handleClick = function handleClick(e) {
54
+ var target = e.target;
55
+ var closestCommentLink = target.closest('.comment-link');
56
+ if (!feedbackState.section || !closestCommentLink) return;
57
+ var escapedSection = CSS.escape(feedbackState.section);
58
+ var elements = document.querySelectorAll(".comment-link[data-feedback-hash=".concat(escapedSection, "]"));
59
+ var closestElement = findClosetElement(e, elements);
60
+ if (closestElement) {
61
+ var rect = closestElement.getBoundingClientRect();
62
+ var top = Math.min(Math.max(rect.top, 0), window.innerHeight - 380);
63
+ setPosition({
64
+ top: top,
65
+ right: 12
66
+ });
67
+ }
68
+ };
69
+ window.addEventListener('click', handleClick);
70
+ return function () {
71
+ window.removeEventListener('click', handleClick);
72
+ };
73
+ }, [feedbackState.section]);
74
+ useEffect(function () {
75
+ resetSectionFeedback();
76
+ }, [location.pathname]);
77
+ if (!feedbackState.section) return null;
78
+ return /*#__PURE__*/React.createElement(StyledWrapper, {
79
+ style: {
80
+ top: position.top,
81
+ right: position.right
82
+ }
83
+ }, /*#__PURE__*/React.createElement(SectionFeedbackCommentForm, null));
84
+ };
85
+ var findClosetElement = function findClosetElement(e, elements) {
86
+ var closestElement = null;
87
+ var closestDistance = Infinity;
88
+ elements.forEach(function (element) {
89
+ var rect = element.getBoundingClientRect();
90
+ var distance = Math.sqrt(Math.pow(rect.left + rect.width / 2 - e.clientX, 2) + Math.pow(rect.top + rect.height / 2 - e.clientY, 2));
91
+ if (distance < closestDistance) {
92
+ closestDistance = distance;
93
+ closestElement = element;
94
+ }
95
+ });
96
+ return closestElement;
97
+ };
@@ -0,0 +1,84 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import { Button, Form, Input } from 'antd';
8
+ import { useIntl, useLocale } from 'dumi';
9
+ import React from 'react';
10
+ import { styled } from 'styled-components';
11
+ import { useSnapshot } from 'valtio';
12
+ import { feedbackStore, resetSectionFeedback } from "../../model/feedback";
13
+ import { useFeedbackService } from "./service";
14
+ var StyledForm = styled(Form).withConfig({
15
+ displayName: "StyledForm",
16
+ componentId: "dumi-theme-antv-c7ef__sc-1e7udwn-0"
17
+ })([".ant-form-item:last-child{margin-bottom:8px;}"]);
18
+ export var SectionFeedbackCommentForm = function SectionFeedbackCommentForm() {
19
+ var _useIntl = useIntl(),
20
+ formatMessage = _useIntl.formatMessage;
21
+ var _Form$useForm = Form.useForm(),
22
+ _Form$useForm2 = _slicedToArray(_Form$useForm, 1),
23
+ form = _Form$useForm2[0];
24
+ var feedbackState = useSnapshot(feedbackStore);
25
+ var locale = useLocale();
26
+ var currentLocale = locale.id;
27
+ var onCancel = function onCancel() {
28
+ form.resetFields();
29
+ resetSectionFeedback();
30
+ };
31
+ var _useFeedbackService = useFeedbackService(),
32
+ submitFeedback = _useFeedbackService.submitFeedback,
33
+ showFeedbackResult = _useFeedbackService.showFeedbackResult;
34
+ var onFinish = function onFinish(values) {
35
+ submitFeedback({
36
+ comment: values.comment
37
+ }).then(function () {
38
+ onCancel();
39
+ showFeedbackResult(true);
40
+ }).catch(function () {
41
+ showFeedbackResult(false);
42
+ });
43
+ };
44
+ var getCommentFieldLabel = function getCommentFieldLabel() {
45
+ var leftQuote = currentLocale === 'zh' ? '「' : '"';
46
+ var rightQuote = currentLocale === 'zh' ? '」' : '"';
47
+ return /*#__PURE__*/React.createElement("div", null, formatMessage({
48
+ id: '📖 你认为'
49
+ }), ' ', /*#__PURE__*/React.createElement("b", null, leftQuote, feedbackState.section, rightQuote), ' ', formatMessage({
50
+ id: '部分如何改进更好?'
51
+ }));
52
+ };
53
+ return /*#__PURE__*/React.createElement(StyledForm, {
54
+ name: "section-feedback-form",
55
+ form: form,
56
+ layout: "vertical",
57
+ onFinish: onFinish
58
+ }, /*#__PURE__*/React.createElement(Form.Item, {
59
+ name: "comment",
60
+ label: getCommentFieldLabel()
61
+ }, /*#__PURE__*/React.createElement(Input.TextArea, {
62
+ rows: 3
63
+ })), /*#__PURE__*/React.createElement(Form.Item, {
64
+ style: {
65
+ textAlign: 'right'
66
+ }
67
+ }, /*#__PURE__*/React.createElement(Button, {
68
+ htmlType: "button",
69
+ type: "text",
70
+ size: "small",
71
+ onClick: onCancel,
72
+ style: {
73
+ marginRight: 8
74
+ }
75
+ }, formatMessage({
76
+ id: '取消'
77
+ })), /*#__PURE__*/React.createElement(Button, {
78
+ type: "primary",
79
+ htmlType: "submit",
80
+ size: "small"
81
+ }, formatMessage({
82
+ id: '提交'
83
+ }))));
84
+ };
@@ -0,0 +1,22 @@
1
+ import { useRouteMeta } from 'dumi';
2
+ import React from 'react';
3
+ import { styled } from 'styled-components';
4
+ import { Contributors } from "./Contributors";
5
+ import { EditButton } from "./EditButton";
6
+ import { PageFeedback } from "./PageFeedback";
7
+ import { SectionFeedback } from "./SectionFeedback";
8
+ var StyledWrapper = styled.div.withConfig({
9
+ displayName: "StyledWrapper",
10
+ componentId: "dumi-theme-antv-c7ef__sc-yubwx0-0"
11
+ })(["margin-top:40px;"]);
12
+ export var Feedback = function Feedback() {
13
+ var meta = useRouteMeta();
14
+ var editable = !meta.frontmatter.readonly;
15
+ return /*#__PURE__*/React.createElement(StyledWrapper, null, editable && /*#__PURE__*/React.createElement(EditButton, {
16
+ style: {
17
+ transform: 'translateX(-12px)'
18
+ }
19
+ }), editable && /*#__PURE__*/React.createElement(Contributors, {
20
+ filename: meta.frontmatter.filename
21
+ }), /*#__PURE__*/React.createElement(SectionFeedback, null), /*#__PURE__*/React.createElement(PageFeedback, null));
22
+ };
@@ -0,0 +1,75 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
3
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
4
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
5
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
6
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
7
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
8
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
9
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
10
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
11
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
12
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
13
+ /**
14
+ * 服务模块
15
+ * https://docs.leancloud.cn/sdk/storage/guide/js/
16
+ */
17
+ import { MehOutlined, SmileOutlined } from '@ant-design/icons';
18
+ import { notification } from 'antd';
19
+ import { useIntl, useLocale, useRouteMeta, useSiteData } from 'dumi';
20
+ import AV from 'leancloud-storage';
21
+ import React from 'react';
22
+ import { useGithubRepo } from "../../utils/github";
23
+ AV.init({
24
+ appId: 'mAckVaWaCleA1L1tRu0vDkkl-gzGzoHsz',
25
+ appKey: '5BCFPGawWnS37eHVnzSptNa5',
26
+ serverURL: 'https://mackvawa.lc-cn-n1-shared.com'
27
+ });
28
+ export var useFeedbackService = function useFeedbackService() {
29
+ var _useIntl = useIntl(),
30
+ formatMessage = _useIntl.formatMessage;
31
+ var _useGithubRepo = useGithubRepo(),
32
+ owner = _useGithubRepo.owner,
33
+ repo = _useGithubRepo.repo;
34
+ var meta = useRouteMeta();
35
+ var version = useSiteData().themeConfig.version;
36
+ var locale = useLocale().id;
37
+ var commonParams = {
38
+ locale: locale,
39
+ repo: "".concat(owner, "/").concat(repo),
40
+ ua: navigator.userAgent,
41
+ url: window.location.href,
42
+ userId: 'anonymous',
43
+ version: version,
44
+ title: meta.frontmatter.title
45
+ };
46
+ var Feedback = AV.Object.extend('UserFeedback');
47
+ var submitFeedback = function submitFeedback(params) {
48
+ var f = new Feedback();
49
+ Object.entries(_objectSpread(_objectSpread({}, commonParams), params)).forEach(function (_ref) {
50
+ var _ref2 = _slicedToArray(_ref, 2),
51
+ key = _ref2[0],
52
+ value = _ref2[1];
53
+ f.set(key, value);
54
+ });
55
+ return f.save();
56
+ };
57
+ var showFeedbackResult = function showFeedbackResult(success) {
58
+ var Icon = success ? SmileOutlined : MehOutlined;
59
+ notification.info({
60
+ message: formatMessage({
61
+ id: success ? '谢谢你的反馈意见!' : '报错了,请稍后再试'
62
+ }),
63
+ icon: /*#__PURE__*/React.createElement(Icon, {
64
+ style: {
65
+ color: '#873bf4'
66
+ }
67
+ }),
68
+ placement: 'bottomRight'
69
+ });
70
+ };
71
+ return {
72
+ submitFeedback: submitFeedback,
73
+ showFeedbackResult: showFeedbackResult
74
+ };
75
+ };
@@ -7,12 +7,13 @@ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
7
  import { VerticalAlignTopOutlined } from '@ant-design/icons';
8
8
  import { BackTop, Layout } from 'antd';
9
9
  import { useRouteMeta } from 'dumi';
10
- import React, { useMemo } from 'react';
10
+ import React from 'react';
11
11
  import { useMedia } from 'react-use';
12
12
  import readingTime from 'reading-time';
13
13
  import { useMenu } from "../../hooks/useMenu";
14
14
  import { ContentTable } from "dumi/theme/slots/ContentTable";
15
- import { NavigatorBanner } from "./NavigatorBanner";
15
+ import { Feedback } from "dumi/theme/slots/Feedback";
16
+ import { PrevAndNext } from "./PrevAndNext";
16
17
  import ReadingTime from "./ReadingTime";
17
18
  import styles from "./index.module.less";
18
19
  import { usePreview } from "./usePreview";
@@ -25,32 +26,8 @@ export var Main = function Main(_ref) {
25
26
  var _readingTime = readingTime(text),
26
27
  time = _readingTime.time;
27
28
  var _useMenu = useMenu(),
28
- _useMenu2 = _slicedToArray(_useMenu, 3),
29
- selectedKey = _useMenu2[1],
30
- flattenMenuItems = _useMenu2[2];
31
- var _useMemo = useMemo(function () {
32
- if (!flattenMenuItems) {
33
- return [undefined, undefined];
34
- }
35
- var activeMenuItemIndex = -1;
36
- flattenMenuItems.forEach(function (menuItem, i) {
37
- if (menuItem && menuItem.key === selectedKey) {
38
- activeMenuItemIndex = i;
39
- }
40
- });
41
- var prevItem = flattenMenuItems[activeMenuItemIndex - 1];
42
- var nextItem = flattenMenuItems[activeMenuItemIndex + 1];
43
- return [prevItem ? {
44
- slug: prevItem.link,
45
- title: prevItem.title
46
- } : undefined, nextItem ? {
47
- slug: nextItem.link,
48
- title: nextItem.title
49
- } : undefined];
50
- }, [flattenMenuItems, selectedKey]),
51
- _useMemo2 = _slicedToArray(_useMemo, 2),
52
- prev = _useMemo2[0],
53
- next = _useMemo2[1];
29
+ _useMenu2 = _slicedToArray(_useMenu, 2),
30
+ selectedKey = _useMenu2[1];
54
31
  var is991Wide = useMedia('(min-width: 991.99px)', true);
55
32
  var showToc = is991Wide && meta.frontmatter.showToc !== false;
56
33
  usePreview({}, selectedKey);
@@ -67,21 +44,14 @@ export var Main = function Main(_ref) {
67
44
  className: styles.readtime
68
45
  })), /*#__PURE__*/React.createElement("div", {
69
46
  className: styles.markdown
70
- }, children), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
71
- className: styles.preandnext
72
- }, /*#__PURE__*/React.createElement(NavigatorBanner, {
73
- type: "prev",
74
- post: prev
75
- }), /*#__PURE__*/React.createElement(NavigatorBanner, {
76
- type: "next",
77
- post: next
78
- }), /*#__PURE__*/React.createElement(BackTop, {
47
+ }, children), /*#__PURE__*/React.createElement(Feedback, null), /*#__PURE__*/React.createElement(PrevAndNext, null)), /*#__PURE__*/React.createElement(BackTop, {
79
48
  style: {
80
- right: 32
49
+ right: 32,
50
+ bottom: 100
81
51
  }
82
52
  }, /*#__PURE__*/React.createElement("div", {
83
53
  className: styles.backTop
84
- }, /*#__PURE__*/React.createElement(VerticalAlignTopOutlined, null))))))), showToc && /*#__PURE__*/React.createElement(Layout.Sider, {
54
+ }, /*#__PURE__*/React.createElement(VerticalAlignTopOutlined, null)))), showToc && /*#__PURE__*/React.createElement(Layout.Sider, {
85
55
  theme: "light",
86
56
  width: 260
87
57
  }, /*#__PURE__*/React.createElement("div", {
@@ -0,0 +1,48 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import React, { useMemo } from 'react';
8
+ import { useMenu } from "../../hooks/useMenu";
9
+ import { NavigatorBanner } from "./NavigatorBanner";
10
+ import styles from "./index.module.less";
11
+ export var PrevAndNext = function PrevAndNext() {
12
+ var _useMenu = useMenu(),
13
+ _useMenu2 = _slicedToArray(_useMenu, 3),
14
+ selectedKey = _useMenu2[1],
15
+ flattenMenuItems = _useMenu2[2];
16
+ var _useMemo = useMemo(function () {
17
+ if (!flattenMenuItems) {
18
+ return [undefined, undefined];
19
+ }
20
+ var activeMenuItemIndex = -1;
21
+ flattenMenuItems.forEach(function (menuItem, i) {
22
+ if (menuItem && menuItem.key === selectedKey) {
23
+ activeMenuItemIndex = i;
24
+ }
25
+ });
26
+ var prevItem = flattenMenuItems[activeMenuItemIndex - 1];
27
+ var nextItem = flattenMenuItems[activeMenuItemIndex + 1];
28
+ return [prevItem ? {
29
+ slug: prevItem.link,
30
+ title: prevItem.title
31
+ } : undefined, nextItem ? {
32
+ slug: nextItem.link,
33
+ title: nextItem.title
34
+ } : undefined];
35
+ }, [flattenMenuItems, selectedKey]),
36
+ _useMemo2 = _slicedToArray(_useMemo, 2),
37
+ prev = _useMemo2[0],
38
+ next = _useMemo2[1];
39
+ return /*#__PURE__*/React.createElement("div", {
40
+ className: styles.preandnext
41
+ }, /*#__PURE__*/React.createElement(NavigatorBanner, {
42
+ type: "prev",
43
+ post: prev
44
+ }), /*#__PURE__*/React.createElement(NavigatorBanner, {
45
+ type: "next",
46
+ post: next
47
+ }));
48
+ };