@nordicsemiconductor/pc-nrfconnect-shared 168.0.0 → 169.0.0

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.
package/Changelog.md CHANGED
@@ -7,6 +7,23 @@ This project does _not_ adhere to
7
7
  [Semantic Versioning](https://semver.org/spec/v2.0.0.html) but contrary to it
8
8
  every new version is a new major version.
9
9
 
10
+ ## 169.0.0 - 2024-03-25
11
+
12
+ ### Added
13
+
14
+ - `Feedback` dialog accessible from the `About` pane.
15
+ - `feedbackCallback` property in `App` component.
16
+
17
+ ### Removed
18
+
19
+ - `Feedback` pane.
20
+ - `feedback` property in `App` component.
21
+
22
+ ### Steps to upgrade when using this package
23
+
24
+ - If categories where passed to the `feedback` property in the `App`
25
+ component, pass them directly to `feedbackCategories`.
26
+
10
27
  ## 168.0.0 - 2024-03-22
11
28
 
12
29
  ### Fixed
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nordicsemiconductor/pc-nrfconnect-shared",
3
- "version": "168.0.0",
3
+ "version": "169.0.0",
4
4
  "description": "Shared commodities for developing pc-nrfconnect-* packages",
5
5
  "repository": {
6
6
  "type": "git",
@@ -15,9 +15,10 @@ import './about.scss';
15
15
 
16
16
  interface AboutPaneProps {
17
17
  documentation?: ReactNode[];
18
+ feedbackCategories?: string[];
18
19
  }
19
20
 
20
- export default ({ documentation }: AboutPaneProps) => (
21
+ export default ({ documentation, feedbackCategories }: AboutPaneProps) => (
21
22
  <div className="about">
22
23
  <div className="about-inner">
23
24
  <ApplicationCard />
@@ -25,7 +26,7 @@ export default ({ documentation }: AboutPaneProps) => (
25
26
  {documentation && documentation.length && (
26
27
  <DocumentationCard documentationSections={documentation} />
27
28
  )}
28
- <SupportCard />
29
+ <SupportCard feedbackCategories={feedbackCategories} />
29
30
  </div>
30
31
  </div>
31
32
  );
@@ -0,0 +1,170 @@
1
+ /*
2
+ * Copyright (c) 2024 Nordic Semiconductor ASA
3
+ *
4
+ * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
+ */
6
+
7
+ import React, { useMemo, useState } from 'react';
8
+
9
+ import { DialogButton, GenericDialog } from '../Dialog/Dialog';
10
+ import Dropdown, { DropdownItem } from '../Dropdown/Dropdown';
11
+ import logger from '../logging';
12
+ import describeError from '../logging/describeError';
13
+ import AboutButton from './AboutButton';
14
+ import sendFeedback from './sendFeedback';
15
+
16
+ export interface FeedbackPaneProps {
17
+ isVisible: boolean;
18
+ onHide: () => void;
19
+ categories?: string[];
20
+ }
21
+
22
+ const FeedbackDialog = ({
23
+ categories,
24
+ onHide,
25
+ isVisible,
26
+ }: FeedbackPaneProps) => {
27
+ const [feedback, setFeedback] = useState('');
28
+ const [sayThankYou, setSayThankYou] = useState(false);
29
+ const [sendingFeedback, setSendingFeedback] = useState(false);
30
+
31
+ const categoryItems = useMemo(() => {
32
+ if (!categories?.length) return undefined;
33
+
34
+ const items = ['Select a category', ...categories].map(category => ({
35
+ label: category,
36
+ value: category,
37
+ }));
38
+ return items;
39
+ }, [categories]);
40
+
41
+ const [selectedCategory, setSelectedCategory] = useState<
42
+ DropdownItem | undefined
43
+ >(categoryItems ? categoryItems[0] : undefined);
44
+
45
+ return (
46
+ <GenericDialog
47
+ isVisible={isVisible}
48
+ onHide={onHide}
49
+ closeOnUnfocus
50
+ title="Feedback"
51
+ showSpinner={sendingFeedback}
52
+ footer={
53
+ <>
54
+ {sayThankYou ? (
55
+ <DialogButton
56
+ variant="secondary"
57
+ onClick={() => {
58
+ setSayThankYou(false);
59
+ setFeedback('');
60
+ }}
61
+ >
62
+ Give more feedback
63
+ </DialogButton>
64
+ ) : (
65
+ <DialogButton
66
+ variant="primary"
67
+ onClick={() => {
68
+ setSendingFeedback(true);
69
+ handleFormData(
70
+ feedback,
71
+ setSayThankYou,
72
+ selectedCategory?.value
73
+ ).then(() => setSendingFeedback(false));
74
+ }}
75
+ disabled={feedback === '' || sendingFeedback}
76
+ >
77
+ Send feedback
78
+ </DialogButton>
79
+ )}
80
+ <DialogButton onClick={onHide}>Close</DialogButton>
81
+ </>
82
+ }
83
+ >
84
+ <div className="tw-flex tw-flex-col tw-items-start tw-justify-center tw-bg-white">
85
+ {sayThankYou ? (
86
+ <>
87
+ <b className="tw-mb-3">Thank you!</b>
88
+ <p>
89
+ Thank you for providing feedback about how to
90
+ improve nRF Connect for Desktop applications.
91
+ </p>
92
+ </>
93
+ ) : (
94
+ <>
95
+ <p>
96
+ We value your feedback and any ideas you may have
97
+ for improving nRF Connect for Desktop applications.
98
+ Use the form below.
99
+ </p>
100
+ <p>
101
+ We only collect the following information when you
102
+ send feedback:
103
+ </p>
104
+ <ul className="tw-list-disc tw-pl-8">
105
+ <li>Application name</li>
106
+ <li>Your feedback</li>
107
+ <li>Operating system</li>
108
+ </ul>
109
+ <form className="tw-flex tw-w-full tw-flex-col tw-gap-4">
110
+ {categoryItems?.length && (
111
+ <div className="tw-w-52">
112
+ <Dropdown
113
+ items={categoryItems}
114
+ onSelect={setSelectedCategory}
115
+ selectedItem={
116
+ selectedCategory || categoryItems[0]
117
+ }
118
+ />
119
+ </div>
120
+ )}
121
+ <div className="tw-pt-4">
122
+ <textarea
123
+ name="feedback-text"
124
+ className="tw-h-32 tw-w-full tw-border tw-border-gray-700 tw-p-2"
125
+ required
126
+ value={feedback}
127
+ onChange={e => setFeedback(e.target.value)}
128
+ />
129
+ </div>
130
+ </form>
131
+ </>
132
+ )}
133
+ </div>
134
+ </GenericDialog>
135
+ );
136
+ };
137
+
138
+ const handleFormData = async (
139
+ feedback: string,
140
+ setResponse: (response: boolean) => void,
141
+ category?: string
142
+ ) => {
143
+ try {
144
+ await sendFeedback(feedback, category);
145
+
146
+ setResponse(true);
147
+ } catch (error: unknown) {
148
+ logger.error(
149
+ `FeedbackForm: Could not send feedback. ${describeError(error)}`
150
+ );
151
+ }
152
+ };
153
+
154
+ export default ({ categories }: { categories?: string[] }) => {
155
+ const [isVisible, setIsVisible] = useState(false);
156
+
157
+ return (
158
+ <>
159
+ <AboutButton
160
+ label="Give Feedback"
161
+ onClick={() => setIsVisible(true)}
162
+ />
163
+ <FeedbackDialog
164
+ isVisible={isVisible}
165
+ categories={categories}
166
+ onHide={() => setIsVisible(false)}
167
+ />
168
+ </>
169
+ );
170
+ };
@@ -20,9 +20,10 @@ import { Toggle } from '../Toggle/Toggle';
20
20
  import { doNotResetVerboseLogginOnRestart } from '../utils/persistentStore';
21
21
  import systemReport from '../utils/systemReport';
22
22
  import AboutButton from './AboutButton';
23
+ import Feedback from './Feedback';
23
24
  import Section from './Section';
24
25
 
25
- export default () => {
26
+ export default ({ feedbackCategories }: { feedbackCategories?: string[] }) => {
26
27
  const dispatch = useDispatch();
27
28
  const devices = useSelector(getDevices);
28
29
  const currentSerialNumber = useSelector(selectedSerialNumber);
@@ -60,7 +61,14 @@ export default () => {
60
61
  label="Create system report"
61
62
  />
62
63
  </Section>
63
- <Section title="Verbose Logging">
64
+ <Section title="Other feedback">
65
+ <p>
66
+ Provide feedback about how to improve this and other nRF
67
+ Connect for Desktop applications.
68
+ </p>
69
+ <Feedback categories={feedbackCategories} />
70
+ </Section>
71
+ <Section title="Verbose logging">
64
72
  <p>
65
73
  Aid our support team with additional log information.
66
74
  Enable this only when necessary as the log will grow
@@ -15,6 +15,7 @@ const formURL =
15
15
  export default async (feedback: string, category?: string) => {
16
16
  const data: Record<string, unknown> = {
17
17
  name: packageJson().name,
18
+ version: packageJson().version,
18
19
  feedback,
19
20
  platform: process.platform,
20
21
  };
package/src/App/App.tsx CHANGED
@@ -25,7 +25,6 @@ import {
25
25
  } from '../Device/deviceSlice';
26
26
  import ErrorBoundary from '../ErrorBoundary/ErrorBoundary';
27
27
  import ErrorDialog from '../ErrorDialog/ErrorDialog';
28
- import FeedbackPane, { FeedbackPaneProps } from '../Feedback/FeedbackPane';
29
28
  import FlashMessages from '../FlashMessage/FlashMessage';
30
29
  import LogViewer from '../Log/LogViewer';
31
30
  import logger from '../logging';
@@ -68,7 +67,7 @@ interface ConnectedAppProps {
68
67
  sidePanel?: ReactNode;
69
68
  showLogByDefault?: boolean;
70
69
  documentation?: ReactNode[];
71
- feedback?: boolean | FeedbackPaneProps;
70
+ feedbackCategories?: string[];
72
71
  children?: ReactNode;
73
72
  autoReselectByDefault?: boolean;
74
73
  }
@@ -79,7 +78,7 @@ const ConnectedApp: FC<ConnectedAppProps> = ({
79
78
  sidePanel,
80
79
  showLogByDefault = true,
81
80
  documentation,
82
- feedback,
81
+ feedbackCategories,
83
82
  children,
84
83
  autoReselectByDefault = false,
85
84
  }) => {
@@ -95,7 +94,7 @@ const ConnectedApp: FC<ConnectedAppProps> = ({
95
94
  usePersistedPane();
96
95
  const isLogVisible = useSelector(isLogVisibleSelector);
97
96
  const currentPane = useSelector(currentPaneSelector);
98
- const allPanes = useAllPanes(panes, documentation, feedback);
97
+ const allPanes = useAllPanes(panes, documentation, feedbackCategories);
99
98
  const paneName = useRef(allPanes.map(({ name }) => name));
100
99
  const dispatch = useDispatch();
101
100
 
@@ -226,34 +225,26 @@ const usePersistedPane = () => {
226
225
  const useAllPanes = (
227
226
  panes: Pane[],
228
227
  documentation: ReactNode[] | undefined,
229
- feedback: boolean | FeedbackPaneProps | undefined
228
+ feedbackCategories?: string[]
230
229
  ) => {
231
230
  const dispatch = useDispatch();
232
231
 
233
232
  const allPanes = useMemo(() => {
234
233
  const newPanes = [...panes];
235
234
 
236
- if (feedback) {
237
- newPanes.push({
238
- name: 'Feedback',
239
- Main: props => (
240
- <FeedbackPane
241
- {...(typeof feedback === 'object'
242
- ? feedback
243
- : undefined)}
244
- {...props}
245
- />
246
- ),
247
- });
248
- }
249
-
250
235
  newPanes.push({
251
236
  name: 'About',
252
- Main: props => <About documentation={documentation} {...props} />,
237
+ Main: props => (
238
+ <About
239
+ documentation={documentation}
240
+ feedbackCategories={feedbackCategories}
241
+ {...props}
242
+ />
243
+ ),
253
244
  });
254
245
 
255
246
  return newPanes;
256
- }, [panes, documentation, feedback]);
247
+ }, [panes, documentation, feedbackCategories]);
257
248
 
258
249
  useEffect(() => {
259
250
  dispatch(setPanes(allPanes));
package/src/index.ts CHANGED
@@ -56,7 +56,7 @@ export { default as Spinner } from './Spinner/Spinner';
56
56
 
57
57
  export { default as MasonryLayout } from './MasonryLayout/MasonryLayout';
58
58
 
59
- export { default as sendFeedback } from './Feedback/sendFeedback';
59
+ export { default as sendFeedback } from './About/sendFeedback';
60
60
 
61
61
  export { default as useStopwatch } from './utils/useStopwatch';
62
62
  export { default as useFocusedOnVisible } from './utils/useFocusedOnVisible';
@@ -2,7 +2,8 @@ import { ReactNode } from 'react';
2
2
  import './about.scss';
3
3
  interface AboutPaneProps {
4
4
  documentation?: ReactNode[];
5
+ feedbackCategories?: string[];
5
6
  }
6
- declare const _default: ({ documentation }: AboutPaneProps) => JSX.Element;
7
+ declare const _default: ({ documentation, feedbackCategories }: AboutPaneProps) => JSX.Element;
7
8
  export default _default;
8
9
  //# sourceMappingURL=About.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"About.d.ts","sourceRoot":"","sources":["../../../../src/About/About.tsx"],"names":[],"mappings":"AAMA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOzC,OAAO,cAAc,CAAC;AAEtB,UAAU,cAAc;IACpB,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;CAC/B;4CAEkC,cAAc;AAAjD,wBAWE"}
1
+ {"version":3,"file":"About.d.ts","sourceRoot":"","sources":["../../../../src/About/About.tsx"],"names":[],"mappings":"AAMA,OAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOzC,OAAO,cAAc,CAAC;AAEtB,UAAU,cAAc;IACpB,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;gEAEsD,cAAc;AAArE,wBAWE"}
@@ -0,0 +1,11 @@
1
+ /// <reference types="react" />
2
+ export interface FeedbackPaneProps {
3
+ isVisible: boolean;
4
+ onHide: () => void;
5
+ categories?: string[];
6
+ }
7
+ declare const _default: ({ categories }: {
8
+ categories?: string[] | undefined;
9
+ }) => JSX.Element;
10
+ export default _default;
11
+ //# sourceMappingURL=Feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Feedback.d.ts","sourceRoot":"","sources":["../../../../src/About/Feedback.tsx"],"names":[],"mappings":";AAeA,MAAM,WAAW,iBAAiB;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;;;;AAsID,wBAgBE"}
@@ -1,4 +1,6 @@
1
1
  /// <reference types="react" />
2
- declare const _default: () => JSX.Element;
2
+ declare const _default: ({ feedbackCategories }: {
3
+ feedbackCategories?: string[] | undefined;
4
+ }) => JSX.Element;
3
5
  export default _default;
4
6
  //# sourceMappingURL=SupportCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SupportCard.d.ts","sourceRoot":"","sources":["../../../../src/About/SupportCard.tsx"],"names":[],"mappings":";;AAwBA,wBAwEE"}
1
+ {"version":3,"file":"SupportCard.d.ts","sourceRoot":"","sources":["../../../../src/About/SupportCard.tsx"],"names":[],"mappings":";;;;AAyBA,wBA+EE"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendFeedback.d.ts","sourceRoot":"","sources":["../../../../src/About/sendFeedback.ts"],"names":[],"mappings":"mCAcgC,MAAM,aAAa,MAAM;AAAzD,wBA0BE"}
@@ -1,7 +1,6 @@
1
1
  import 'focus-visible';
2
2
  import React, { FC, ReactNode } from 'react';
3
3
  import { Reducer } from 'redux';
4
- import { FeedbackPaneProps } from '../Feedback/FeedbackPane';
5
4
  import './app.scss';
6
5
  import './shared.scss';
7
6
  import './tailwind.css';
@@ -19,7 +18,7 @@ interface ConnectedAppProps {
19
18
  sidePanel?: ReactNode;
20
19
  showLogByDefault?: boolean;
21
20
  documentation?: ReactNode[];
22
- feedback?: boolean | FeedbackPaneProps;
21
+ feedbackCategories?: string[];
23
22
  children?: ReactNode;
24
23
  autoReselectByDefault?: boolean;
25
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../src/App/App.tsx"],"names":[],"mappings":"AAMA,OAAO,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAA8B,MAAM,OAAO,CAAC;AAIzE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAehC,OAAqB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAuB3E,OAAO,YAAY,CAAC;AACpB,OAAO,eAAe,CAAC;AACvB,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;IACpB,SAAS,CAAC,EAAE,EAAE,CAAC;CAClB;AAED,UAAU,iBAAiB;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;IAC5B,QAAQ,CAAC,EAAE,OAAO,GAAG,iBAAiB,CAAC;IACvC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;;;;AAqID,wBASE;AAiDF,eAAO,MAAM,MAAM,QAAS,MAAM,YAAY,SAM7C,CAAC"}
1
+ {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../../../../src/App/App.tsx"],"names":[],"mappings":"AAMA,OAAO,eAAe,CAAC;AAEvB,OAAO,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAA8B,MAAM,OAAO,CAAC;AAIzE,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAqChC,OAAO,YAAY,CAAC;AACpB,OAAO,eAAe,CAAC;AACvB,OAAO,gBAAgB,CAAC;AAExB,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,IAAI;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC;IACpB,SAAS,CAAC,EAAE,EAAE,CAAC;CAClB;AAED,UAAU,iBAAiB;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;IAC5B,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC9B,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACnC;;;;AAqID,wBASE;AAyCF,eAAO,MAAM,MAAM,QAAS,MAAM,YAAY,SAM7C,CAAC"}
@@ -40,7 +40,7 @@ export { default as NumberInputWithDropdown } from './InlineInput/NumberInputWit
40
40
  export type { NumberDropdownItem } from './InlineInput/NumberInputWithDropdown';
41
41
  export { default as Spinner } from './Spinner/Spinner';
42
42
  export { default as MasonryLayout } from './MasonryLayout/MasonryLayout';
43
- export { default as sendFeedback } from './Feedback/sendFeedback';
43
+ export { default as sendFeedback } from './About/sendFeedback';
44
44
  export { default as useStopwatch } from './utils/useStopwatch';
45
45
  export { default as useFocusedOnVisible } from './utils/useFocusedOnVisible';
46
46
  export { reducer as errorDialogReducer } from './ErrorDialog/errorDialogSlice';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,kBAAkB;;;;;;;;;CAA6B,CAAC;AAE7D,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EACH,OAAO,IAAI,cAAc,EACzB,KAAK,KAAK,IAAI,mBAAmB,GACpC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACH,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,GACf,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAC3F,YAAY,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAEhF,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEzE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAE7E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,OAAO,EACH,SAAS,EACT,UAAU,EACV,aAAa,EACb,YAAY,EACZ,cAAc,GACjB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,EAAE,KAAK,OAAO,IAAI,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,EACH,mBAAmB,IAAI,kBAAkB,EACzC,uBAAuB,EACvB,4BAA4B,EAC5B,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,GAChB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EACH,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,EACxB,KAAK,MAAM,GACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACH,gBAAgB,EAChB,eAAe,EACf,0BAA0B,EAC1B,wBAAwB,EACxB,gBAAgB,EAChB,kBAAkB,GACrB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACH,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,IAAI,wBAAwB,EACrD,4BAA4B,GAC/B,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EACH,OAAO,IAAI,cAAc,EACzB,sBAAsB,EACtB,uBAAuB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACH,iBAAiB,EACjB,KAAK,QAAQ,EACb,MAAM,EACN,QAAQ,GACX,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EACH,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,UAAU,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AAE9F,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEtE,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,aAAa,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACH,WAAW,EACX,2BAA2B,EAC3B,KAAK,SAAS,IAAI,oBAAoB,EACtC,KAAK,WAAW,GACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACH,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,sBAAsB,EACtB,oBAAoB,EACpB,sBAAsB,GACzB,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACH,MAAM,IAAI,IAAI,EACd,KAAK,GAAG,IAAI,OAAO,EACnB,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,wBAAwB,EAC7B,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,0BAA0B,EAC/B,KAAK,YAAY,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,MAAM,IAAI,WAAW,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,153 +0,0 @@
1
- /*
2
- * Copyright (c) 2023 Nordic Semiconductor ASA
3
- *
4
- * SPDX-License-Identifier: LicenseRef-Nordic-4-Clause
5
- */
6
-
7
- import React, { useMemo, useState } from 'react';
8
-
9
- import Button from '../Button/Button';
10
- import Dropdown, { DropdownItem } from '../Dropdown/Dropdown';
11
- import logger from '../logging';
12
- import describeError from '../logging/describeError';
13
- import sendFeedback from './sendFeedback';
14
-
15
- export interface FeedbackPaneProps {
16
- categories?: string[];
17
- }
18
-
19
- export default ({ categories }: FeedbackPaneProps) => {
20
- const [feedback, setFeedback] = useState('');
21
- const [sayThankYou, setSayThankYou] = useState(false);
22
-
23
- const categoryItems = useMemo(() => {
24
- if (!categories?.length) return undefined;
25
-
26
- const items = ['Select a category', ...categories].map(category => ({
27
- label: category,
28
- value: category,
29
- }));
30
- return items;
31
- }, [categories]);
32
-
33
- const [selectedCategory, setSelectedCategory] = useState<
34
- DropdownItem | undefined
35
- >(categoryItems ? categoryItems[0] : undefined);
36
-
37
- if (sayThankYou === true) {
38
- return (
39
- <div className="tw-preflight tw-flex tw-w-full tw-justify-center">
40
- <div className="tw-mb-3 tw-flex tw-flex-col tw-items-start tw-justify-center tw-bg-white tw-px-3 tw-py-4">
41
- <b className="tw-mb-3">Thank you!</b>
42
- <section>
43
- <p>
44
- We value your feedback and any ideas you may have
45
- for improving our applications.
46
- </p>
47
- <p>
48
- Click the button below in order to send more
49
- feedback.
50
- </p>
51
- </section>
52
- <Button
53
- size="lg"
54
- className="tw-align-self-end tw-self-end"
55
- onClick={() => {
56
- setSayThankYou(false);
57
- setFeedback('');
58
- }}
59
- variant="secondary"
60
- >
61
- Give more feedback
62
- </Button>
63
- </div>
64
- </div>
65
- );
66
- }
67
-
68
- return (
69
- <div className="tw-preflight tw-flex tw-w-full tw-justify-center">
70
- <div className="tw-mb-3 tw-flex tw-flex-col tw-items-start tw-justify-center tw-gap-4 tw-bg-white tw-px-3 tw-py-4">
71
- <b>Give Feedback</b>
72
- <p>
73
- We value your feedback and any ideas you may have for
74
- improving our applications. Please use the form below to
75
- give feedback.
76
- </p>
77
- <p>
78
- Note: this is not a support channel, and you will not
79
- receive a response. For help and support, visit the{' '}
80
- <a
81
- href="https://devzone.nordicsemi.com/"
82
- target="_blank"
83
- rel="noreferrer noopener"
84
- className="tw-text-nordicBlue"
85
- >
86
- Nordic DevZone
87
- </a>
88
- .
89
- </p>
90
- <form className="tw-flex tw-w-full tw-flex-col tw-gap-4">
91
- {categoryItems?.length && (
92
- <div className="tw-w-52">
93
- <Dropdown
94
- items={categoryItems}
95
- onSelect={setSelectedCategory}
96
- selectedItem={
97
- selectedCategory || categoryItems[0]
98
- }
99
- />
100
- </div>
101
- )}
102
- <div>
103
- <b>What is your feedback?</b>
104
- <textarea
105
- name="feedback-text"
106
- className="tw-h-32 tw-w-full tw-border tw-border-gray-700 tw-p-2"
107
- required
108
- value={feedback}
109
- onChange={e => setFeedback(e.target.value)}
110
- />
111
- </div>
112
- </form>
113
- <p>We only collect this information when you send feedback:</p>
114
- <ul className="tw-list-disc tw-pl-8">
115
- <li>Application name</li>
116
- <li>Your feedback</li>
117
- <li>Operating system</li>
118
- </ul>
119
- <Button
120
- size="lg"
121
- className="tw-self-end"
122
- variant="primary"
123
- onClick={() =>
124
- handleFormData(
125
- feedback,
126
- setSayThankYou,
127
- selectedCategory?.value
128
- )
129
- }
130
- disabled={feedback === ''}
131
- >
132
- Send Feedback
133
- </Button>
134
- </div>
135
- </div>
136
- );
137
- };
138
-
139
- const handleFormData = async (
140
- feedback: string,
141
- setResponse: (response: boolean) => void,
142
- category?: string
143
- ) => {
144
- try {
145
- await sendFeedback(feedback, category);
146
-
147
- setResponse(true);
148
- } catch (error: unknown) {
149
- logger.error(
150
- `FeedbackForm: Could not send feedback. ${describeError(error)}`
151
- );
152
- }
153
- };
@@ -1,7 +0,0 @@
1
- /// <reference types="react" />
2
- export interface FeedbackPaneProps {
3
- categories?: string[];
4
- }
5
- declare const _default: ({ categories }: FeedbackPaneProps) => JSX.Element;
6
- export default _default;
7
- //# sourceMappingURL=FeedbackPane.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FeedbackPane.d.ts","sourceRoot":"","sources":["../../../../src/Feedback/FeedbackPane.tsx"],"names":[],"mappings":";AAcA,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;yCAE+B,iBAAiB;AAAjD,wBAsHE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"sendFeedback.d.ts","sourceRoot":"","sources":["../../../../src/Feedback/sendFeedback.ts"],"names":[],"mappings":"mCAcgC,MAAM,aAAa,MAAM;AAAzD,wBAyBE"}