Skip to content

Commit 21e7e88

Browse files
author
Antonio Pena
committed
feat: added function to print labels
Refs: #1
1 parent bfa7dd3 commit 21e7e88

File tree

6 files changed

+96
-51
lines changed

6 files changed

+96
-51
lines changed

.prettierrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
"bracketSpacing": false,
44
"jsxBracketSameLine": true,
55
"quoteProps": "consistent"
6-
}
6+
}

README.md

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ yarn add react-dymo-hooks
1818

1919
## API
2020

21+
### `printLabel()`
22+
23+
Print Dymo labels
24+
25+
#### Arguments
26+
27+
- {string} printerName - The Dymo Printer to print on
28+
- {string} labelXml - Label XML parsed to string
29+
- {string} labelSetXml - LabelSet to print. LabelSet is used to print multiple labels with same layout but different data, e.g. multiple addresses.
30+
2131
### `useDymoCheckService()`
2232

2333
Return the status of DYMO Label Web Service
@@ -79,25 +89,18 @@ Object containing:
7989
### Print a Dymo Label
8090

8191
```jsx
82-
import {dymoRequestBuilder} from "react-dymo-hooks";
83-
84-
const params = {
85-
data: `printerName=${encodeURIComponent(printerSelected)}&printParamsXml=&labelXml=${encodeURIComponent(
86-
xml
87-
)}&labelSetXml=`,
88-
};
89-
90-
function handlePrintLabel() {
91-
dymoRequestBuilder({
92-
method: "POST",
93-
wsAction: "printLabel",
94-
axiosOtherParams: params,
95-
})
96-
.then(() => {})
97-
.catch(() => {});
92+
import {printLabel} from "react-dymo-hooks";
93+
94+
async function handlePrintSingleLabel(printerName, labelXml) {
95+
try {
96+
const response = await printLabel(printerName, labelXml);
97+
console.info(response);
98+
} catch (error) {
99+
console.error(error);
100+
}
98101
}
99102

100-
<button onClick={handlePrintLabel} />;
103+
<button onClick={() => handlePrintLabel(printer, xml)} />;
101104
```
102105

103106
```jsx

example/src/App.js

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
1-
import React, { useState, useMemo, memo } from "react";
2-
import { useDymoCheckService, useDymoFetchPrinters, useDymoOpenLabel } from "react-dymo-hooks";
1+
import React, {useState, useMemo, memo} from "react";
2+
import {useDymoCheckService, useDymoFetchPrinters, useDymoOpenLabel, printLabel} from "react-dymo-hooks";
33

4-
import { generateXmlExample } from "./utils";
4+
import {generateXmlExample} from "./utils";
55

6-
7-
const DymoLabelPreview = memo(({ xml, statusDymoService, loadingComponent, errorComponent }) => {
8-
const { label, statusOpenLabel } = useDymoOpenLabel(statusDymoService, xml);
9-
const style = { background: "hsla(0, 0%, 50%, 0.66)", padding: 7 };
6+
const DymoLabelPreview = memo(({xml, statusDymoService, loadingComponent, errorComponent}) => {
7+
const {label, statusOpenLabel} = useDymoOpenLabel(statusDymoService, xml);
8+
const style = {background: "hsla(0, 0%, 50%, 0.66)", padding: 7};
109
if (statusOpenLabel === "loading") {
1110
return loadingComponent;
1211
} else if (statusOpenLabel === "error") {
@@ -22,17 +21,29 @@ const DymoLabelPreview = memo(({ xml, statusDymoService, loadingComponent, error
2221

2322
export default function App() {
2423
const statusDymoService = useDymoCheckService();
24+
const {statusFetchPrinters, printers} = useDymoFetchPrinters(statusDymoService);
25+
2526
const [name, setName] = useState("Antonio Peña Batista");
26-
const { statusFetchPrinters, printers } = useDymoFetchPrinters(statusDymoService);
27+
const [selectedPrinter, setSelectedPrinter] = useState(null);
2728

2829
const xmlMemo = useMemo(() => generateXmlExample(name), [name]);
30+
31+
async function handlePrintSingleLabel(printerName, labelXml) {
32+
try {
33+
const response = await printLabel(printerName, labelXml);
34+
console.info(response);
35+
} catch (error) {
36+
console.error(error);
37+
}
38+
}
39+
2940
return (
3041
<div>
3142
{statusDymoService === "loading" && <h1>Checking dymo web service...</h1>}
3243
{statusDymoService === "error" && <h1>Error</h1>}
3344
{statusDymoService === "success" && (
3445
<React.Fragment>
35-
<h3 style={{ color: "green" }}>DYMO service is running in your PC.</h3>
46+
<h3 style={{color: "green"}}>DYMO service is running in your PC.</h3>
3647
<input value={name} title="Name" onChange={(e) => setName(e.target.value)} />
3748
<br />
3849
<br />
@@ -47,16 +58,25 @@ export default function App() {
4758
errorComponent={<h4>Error..</h4>}
4859
/>
4960
{statusFetchPrinters === "loading" && <h4>Loading printers..</h4>}
61+
<br />
5062
{statusFetchPrinters === "success" && (
5163
<React.Fragment>
52-
<h4>Printers:</h4>
53-
<ul>
64+
<label htmlFor="printer-select">Choose a Dymo printer:</label>
65+
<br />
66+
<select name="printers" id="printer-select" onChange={(e) => setSelectedPrinter(e.target.value)}>
67+
<option value="">--Please choose an option--</option>
5468
{printers.map((printer) => (
55-
<li key={printer.name}>{printer.name}</li>
69+
<option key={printer.name} value={printer.name}>
70+
{printer.name}
71+
</option>
5672
))}
57-
</ul>
73+
</select>
5874
</React.Fragment>
5975
)}
76+
<br />
77+
<button disabled={!selectedPrinter} onClick={() => handlePrintSingleLabel(selectedPrinter, xmlMemo)}>
78+
Print single label
79+
</button>
6080
</div>
6181
);
6282
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-dymo-hooks",
3-
"version": "2.0.1",
3+
"version": "2.0.2",
44
"description": "Collections of react hooks to handle the Dymo LabelWriter web service.",
55
"author": "apenab",
66
"license": "MIT",

src/dymo_utils.js

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
WS_SVC_PATH,
1111
WS_ACTIONS,
1212
} from "./constants";
13-
import { localRetrieve, localStore } from "./storage";
13+
import {localRetrieve, localStore} from "./storage";
1414

1515
async function storeDymoRequestParams() {
1616
let activeHost, activePort;
@@ -30,9 +30,9 @@ async function storeDymoRequestParams() {
3030
dymoUrlBuilder(WS_PROTOCOL, hostList[currentHostIndex], currentPort, WS_SVC_PATH, "status")
3131
);
3232
const [successRequestHost, successRequestPort] = response.config.url.split("/")[2].split(":");
33-
localStore("dymo-ws-request-params", { activeHost: successRequestHost, activePort: successRequestPort });
33+
localStore("dymo-ws-request-params", {activeHost: successRequestHost, activePort: successRequestPort});
3434
break loop1;
35-
} catch (error) { }
35+
} catch (error) {}
3636
}
3737
}
3838
}
@@ -48,23 +48,23 @@ export async function dymoRequestBuilder({
4848
if (!localRetrieve("dymo-ws-request-params")) {
4949
await storeDymoRequestParams();
5050
}
51-
const { activeHost, activePort } = localRetrieve("dymo-ws-request-params");
51+
const {activeHost, activePort} = localRetrieve("dymo-ws-request-params");
5252

5353
const dymoAxiosInstance = axios.create();
5454
dymoAxiosInstance.interceptors.response.use(
5555
function (response) {
5656
return response;
5757
},
5858
async function (error) {
59-
if (axios.isCancel(error)) {
59+
if (axios.isCancel(error) || error?.response?.status === 500) {
6060
return Promise.reject(error);
6161
}
6262
await storeDymoRequestParams();
6363
if (!localRetrieve("dymo-ws-request-params")) {
6464
return Promise.reject(error);
6565
}
6666
try {
67-
const { activeHost, activePort } = localRetrieve("dymo-ws-request-params");
67+
const {activeHost, activePort} = localRetrieve("dymo-ws-request-params");
6868
const response = await axios.request({
6969
url: dymoUrlBuilder(wsProtocol, activeHost, activePort, wsPath, wsAction),
7070
method,
@@ -113,3 +113,23 @@ export function getDymoPrintersFromXml(xml, modelPrinter) {
113113
});
114114
return printers;
115115
}
116+
117+
/**
118+
* Print dymo labels
119+
*
120+
* @param {string} printerName - The Dymo Printer to print on
121+
* @param {string} labelXml - Label XML parsed to string
122+
* @param {string} labelSetXml - LabelSet to print. LabelSet is used to print multiple labels with same layout but different data, e.g. multiple addresses.
123+
* @returns AxiosResponse
124+
*/
125+
export function printLabel(printerName, labelXml, labelSetXml) {
126+
return dymoRequestBuilder({
127+
method: "POST",
128+
wsAction: "printLabel",
129+
axiosOtherParams: {
130+
data: `printerName=${encodeURIComponent(printerName)}&printParamsXml=&labelXml=${encodeURIComponent(
131+
labelXml
132+
)}&labelSetXml=${labelSetXml || ""}`,
133+
},
134+
});
135+
}

src/index.js

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
import { useState, useEffect, useRef } from "react";
1+
import {useState, useEffect, useRef} from "react";
22
import axios from "axios";
33

4-
import { useData } from "./hooks";
4+
import {useData} from "./hooks";
55
import {
66
dymoUrlBuilder as innerDymoUrlBuilder,
77
getDymoPrintersFromXml as innerGetDymoPrintersFromXml,
88
dymoRequestBuilder as innerDymoRequestBuilder,
9+
printLabel as innerPrintSingleLabel,
910
} from "./dymo_utils";
1011

1112
export const dymoUrlBuilder = innerDymoUrlBuilder;
1213
export const dymoRequestBuilder = innerDymoRequestBuilder;
1314
export const getDymoPrintersFromXml = innerGetDymoPrintersFromXml;
15+
export const printLabel = innerPrintSingleLabel;
1416

1517
export function useDymoCheckService(port) {
1618
const [status, setStatus] = useState("initial");
@@ -22,7 +24,7 @@ export function useDymoCheckService(port) {
2224
}
2325
tokenSource.current = axios.CancelToken.source();
2426
setStatus("loading");
25-
dymoRequestBuilder({ method: "GET", wsAction: "status", cancelToken: tokenSource.current.token })
27+
dymoRequestBuilder({method: "GET", wsAction: "status", cancelToken: tokenSource.current.token})
2628
.then(() => {
2729
tokenSource.current = null;
2830
setStatus("success");
@@ -43,7 +45,7 @@ export function useDymoCheckService(port) {
4345
}
4446

4547
export function useDymoFetchPrinters(statusDymoService, modelPrinter = "LabelWriterPrinter", port) {
46-
const [data, setData] = useData({ statusFetchPrinters: "initial", printers: [], error: null });
48+
const [data, setData] = useData({statusFetchPrinters: "initial", printers: [], error: null});
4749
const tokenSource = useRef();
4850

4951
useEffect(() => {
@@ -52,9 +54,9 @@ export function useDymoFetchPrinters(statusDymoService, modelPrinter = "LabelWri
5254
tokenSource.current.cancel();
5355
}
5456
tokenSource.current = axios.CancelToken.source();
55-
setData({ statusFetchPrinters: "loading" });
57+
setData({statusFetchPrinters: "loading"});
5658

57-
dymoRequestBuilder({ method: "GET", wsAction: "getPrinters", cancelToken: tokenSource.current.token })
59+
dymoRequestBuilder({method: "GET", wsAction: "getPrinters", cancelToken: tokenSource.current.token})
5860
.then((response) => {
5961
tokenSource.current = null;
6062
setData({
@@ -65,7 +67,7 @@ export function useDymoFetchPrinters(statusDymoService, modelPrinter = "LabelWri
6567
})
6668
.catch((error) => {
6769
if (!axios.isCancel(error)) {
68-
setData({ statusFetchPrinters: "error", printers: [], error: error });
70+
setData({statusFetchPrinters: "error", printers: [], error: error});
6971
}
7072
});
7173
}
@@ -80,7 +82,7 @@ export function useDymoFetchPrinters(statusDymoService, modelPrinter = "LabelWri
8082
}
8183

8284
export function useDymoOpenLabel(statusDymoService, labelXML, port) {
83-
const [data, setData] = useData({ statusOpenLabel: "initial", label: null, error: null });
85+
const [data, setData] = useData({statusOpenLabel: "initial", label: null, error: null});
8486
const tokenSource = useRef();
8587

8688
useEffect(() => {
@@ -89,21 +91,21 @@ export function useDymoOpenLabel(statusDymoService, labelXML, port) {
8991
tokenSource.current.cancel();
9092
}
9193
tokenSource.current = axios.CancelToken.source();
92-
setData({ statusOpenLabel: "loading" });
94+
setData({statusOpenLabel: "loading"});
9395
dymoRequestBuilder({
9496
method: "POST",
9597
wsAction: "renderLabel",
9698
cancelToken: tokenSource.current.token,
97-
axiosOtherParams: { data: `labelXml=${encodeURIComponent(labelXML)}&renderParamsXml=&printerName=` },
98-
headers: { "Access-Control-Request-Private-Network": true, "Access-Control-Allow-Origin": "*" }
99+
axiosOtherParams: {data: `labelXml=${encodeURIComponent(labelXML)}&renderParamsXml=&printerName=`},
100+
headers: {"Access-Control-Request-Private-Network": true, "Access-Control-Allow-Origin": "*"},
99101
})
100102
.then((response) => {
101103
tokenSource.current = null;
102-
setData({ statusOpenLabel: "success", label: response.data, error: null });
104+
setData({statusOpenLabel: "success", label: response.data, error: null});
103105
})
104106
.catch((error) => {
105107
if (!axios.isCancel(error)) {
106-
setData({ statusOpenLabel: "error", label: null, error: error });
108+
setData({statusOpenLabel: "error", label: null, error: error});
107109
}
108110
});
109111
}

0 commit comments

Comments
 (0)