@deenruv/inpost-plugin 1.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.
Files changed (77) hide show
  1. package/LICENSE +23 -0
  2. package/README.md +46 -0
  3. package/dist/plugin-server/api/inpost-admin.resolver.d.ts +20 -0
  4. package/dist/plugin-server/api/inpost-admin.resolver.js +64 -0
  5. package/dist/plugin-server/api/inpost-shop.resolver.d.ts +7 -0
  6. package/dist/plugin-server/api/inpost-shop.resolver.js +38 -0
  7. package/dist/plugin-server/constants.d.ts +2 -0
  8. package/dist/plugin-server/constants.js +5 -0
  9. package/dist/plugin-server/controllers/inpost.controller.d.ts +9 -0
  10. package/dist/plugin-server/controllers/inpost.controller.js +54 -0
  11. package/dist/plugin-server/entities/inpost-config-entity.d.ts +12 -0
  12. package/dist/plugin-server/entities/inpost-config-entity.js +49 -0
  13. package/dist/plugin-server/entities/inpost-ref-entity.d.ts +9 -0
  14. package/dist/plugin-server/entities/inpost-ref-entity.js +39 -0
  15. package/dist/plugin-server/extensions/inpost.extension.d.ts +1 -0
  16. package/dist/plugin-server/extensions/inpost.extension.js +53 -0
  17. package/dist/plugin-server/extensions/inpost.shop.extenstion.d.ts +1 -0
  18. package/dist/plugin-server/extensions/inpost.shop.extenstion.js +12 -0
  19. package/dist/plugin-server/guards/inpost-webhook.guard.d.ts +22 -0
  20. package/dist/plugin-server/guards/inpost-webhook.guard.js +96 -0
  21. package/dist/plugin-server/handlers/inpost.fulfillment.d.ts +20 -0
  22. package/dist/plugin-server/handlers/inpost.fulfillment.js +95 -0
  23. package/dist/plugin-server/index.d.ts +6 -0
  24. package/dist/plugin-server/index.js +78 -0
  25. package/dist/plugin-server/services/inpost.service.d.ts +46 -0
  26. package/dist/plugin-server/services/inpost.service.js +365 -0
  27. package/dist/plugin-server/types.d.ts +29 -0
  28. package/dist/plugin-server/types.js +2 -0
  29. package/dist/plugin-server/ui/Inpost.tsx +273 -0
  30. package/dist/plugin-server/ui/graphql/mutations.ts +14 -0
  31. package/dist/plugin-server/ui/graphql/queries.ts +7 -0
  32. package/dist/plugin-server/ui/graphql/scalars.ts +15 -0
  33. package/dist/plugin-server/ui/graphql/selectors.ts +0 -0
  34. package/dist/plugin-server/ui/providers.ts +9 -0
  35. package/dist/plugin-server/ui/routes.ts +1 -0
  36. package/dist/plugin-server/ui/styles/overwrite.css +0 -0
  37. package/dist/plugin-server/ui/translations/en.json +31 -0
  38. package/dist/plugin-server/ui/translations/pl.json +33 -0
  39. package/dist/plugin-server/ui/zeus/const.ts +4767 -0
  40. package/dist/plugin-server/ui/zeus/index.ts +21694 -0
  41. package/dist/plugin-server/ui/zeus/typedDocumentNode.ts +27 -0
  42. package/dist/plugin-server/ui.d.ts +2 -0
  43. package/dist/plugin-server/ui.js +17 -0
  44. package/dist/plugin-server/zeus/const.d.ts +6 -0
  45. package/dist/plugin-server/zeus/const.js +3654 -0
  46. package/dist/plugin-server/zeus/index.d.ts +18623 -0
  47. package/dist/plugin-server/zeus/index.js +1094 -0
  48. package/dist/plugin-server/zeus/typedDocumentNode.d.ts +3 -0
  49. package/dist/plugin-server/zeus/typedDocumentNode.js +13 -0
  50. package/dist/plugin-ui/components/Inpost.d.ts +2 -0
  51. package/dist/plugin-ui/components/Inpost.js +126 -0
  52. package/dist/plugin-ui/graphql/mutations.d.ts +12 -0
  53. package/dist/plugin-ui/graphql/mutations.js +10 -0
  54. package/dist/plugin-ui/graphql/queries.d.ts +23 -0
  55. package/dist/plugin-ui/graphql/queries.js +19 -0
  56. package/dist/plugin-ui/graphql/scalars.d.ts +16 -0
  57. package/dist/plugin-ui/graphql/scalars.js +14 -0
  58. package/dist/plugin-ui/graphql/selectors.d.ts +15 -0
  59. package/dist/plugin-ui/graphql/selectors.js +13 -0
  60. package/dist/plugin-ui/index.d.ts +1 -0
  61. package/dist/plugin-ui/index.js +11 -0
  62. package/dist/plugin-ui/locales/en/index.d.ts +35 -0
  63. package/dist/plugin-ui/locales/en/index.js +2 -0
  64. package/dist/plugin-ui/locales/en/inpost.json +34 -0
  65. package/dist/plugin-ui/locales/pl/index.d.ts +36 -0
  66. package/dist/plugin-ui/locales/pl/index.js +2 -0
  67. package/dist/plugin-ui/locales/pl/inpost.json +35 -0
  68. package/dist/plugin-ui/translation-ns.d.ts +1 -0
  69. package/dist/plugin-ui/translation-ns.js +1 -0
  70. package/dist/plugin-ui/tsconfig.json +18 -0
  71. package/dist/plugin-ui/zeus/const.d.ts +6 -0
  72. package/dist/plugin-ui/zeus/const.js +3651 -0
  73. package/dist/plugin-ui/zeus/index.d.ts +18623 -0
  74. package/dist/plugin-ui/zeus/index.js +1086 -0
  75. package/dist/plugin-ui/zeus/typedDocumentNode.d.ts +3 -0
  76. package/dist/plugin-ui/zeus/typedDocumentNode.js +9 -0
  77. package/package.json +55 -0
@@ -0,0 +1,273 @@
1
+ import React, { useCallback, useEffect, useState } from "react";
2
+ import { DataService, I18nService } from "@deenruv/admin-ui/core";
3
+ import {
4
+ ActionBar,
5
+ Card,
6
+ FormField,
7
+ useDetailComponentData,
8
+ useInjector,
9
+ useLazyQuery,
10
+ } from "@deenruv/admin-ui/react";
11
+ import { Client, Organization, Service } from "@deenruv/inpost";
12
+ import gql from "graphql-tag";
13
+
14
+ interface InpostConfig {
15
+ host: string;
16
+ apiKey?: string;
17
+ geowidgetKey?: string;
18
+ inpostOrganization?: number;
19
+ service?: Service;
20
+ }
21
+
22
+ export const Inpost: React.FC = () => {
23
+ const t = useInjector(I18nService);
24
+ const dataService = useInjector(DataService);
25
+ const [get, { data }] = useLazyQuery<{ getInpostConfig: InpostConfig }>(gql`
26
+ query InpostConfig {
27
+ getInpostConfig {
28
+ host
29
+ apiKey
30
+ geowidgetKey
31
+ inpostOrganization
32
+ service
33
+ }
34
+ }
35
+ `);
36
+ const { entity, detailForm } = useDetailComponentData();
37
+ const shippingMethodId = entity?.id as undefined | number;
38
+ const fulfillmentHandlerControl = detailForm.controls["fulfillmentHandler"];
39
+ const [handler, setHandler] = useState<string>(
40
+ fulfillmentHandlerControl.value || "",
41
+ );
42
+ const valueChangeCb = useCallback(
43
+ (value: string) => {
44
+ setHandler(value);
45
+ },
46
+ [setHandler],
47
+ );
48
+
49
+ const [inpostConfig, setInpostConfig] = useState<InpostConfig>({
50
+ host: "api-shipx-pl.easypack24.net",
51
+ });
52
+ const [organizations, setOrganizations] = useState([] as Organization[]);
53
+ const [modified, setModified] = useState(false);
54
+
55
+ useEffect(() => {
56
+ (async () => {
57
+ const config = await get();
58
+ setInpostConfig(config.getInpostConfig);
59
+ setModified(false);
60
+ })();
61
+ }, [get]);
62
+
63
+ useEffect(() => {
64
+ (async () => {
65
+ if (inpostConfig.apiKey && inpostConfig.host) {
66
+ const { host, apiKey } = inpostConfig;
67
+ const cli = new Client({ host, apiKey });
68
+ const organizations = await cli.organizations().list();
69
+ setOrganizations(organizations.items);
70
+ if (organizations.items[0]) {
71
+ const change: Pick<InpostConfig, "inpostOrganization" | "service"> = {
72
+ inpostOrganization: organizations.items[0].id,
73
+ };
74
+ if (organizations.items[0].services[0]) {
75
+ change.service = organizations.items[0].services[0];
76
+ }
77
+ setInpostConfig({ ...inpostConfig, ...change });
78
+ }
79
+ }
80
+ })();
81
+ }, [
82
+ inpostConfig.apiKey,
83
+ inpostConfig.host,
84
+ setOrganizations,
85
+ setInpostConfig,
86
+ ]);
87
+
88
+ useEffect(() => {
89
+ fulfillmentHandlerControl.valueChanges.subscribe(valueChangeCb);
90
+ }, [valueChangeCb, fulfillmentHandlerControl.valueChanges.subscribe]);
91
+
92
+ return shippingMethodId && handler === "inpost-fulfillment" ? (
93
+ <div style={{ marginBottom: "16px" }}>
94
+ <Card title={t.translate("inpost-plugin.title")}>
95
+ <div style={{ marginTop: "16px", marginBottom: "16px" }}>
96
+ <FormField
97
+ label={t.translate("inpost-plugin.connection-label")}
98
+ tooltip={t.translate("inpost-plugin.connection-tooltip")}
99
+ invalid={!data?.getInpostConfig}
100
+ errorMessage={
101
+ data?.getInpostConfig
102
+ ? ""
103
+ : t.translate("inpost-plugin.connection-error")
104
+ }
105
+ >
106
+ <span>
107
+ {data?.getInpostConfig
108
+ ? t.translate("inpost-plugin.connected")
109
+ : t.translate("inpost-plugin.not-connected")}
110
+ </span>
111
+ </FormField>
112
+ </div>
113
+ <div style={{ marginTop: "16px", marginBottom: "16px" }}>
114
+ <FormField
115
+ label={t.translate("inpost-plugin.host-label")}
116
+ tooltip={t.translate("inpost-plugin.host-tooltip")}
117
+ invalid={false}
118
+ errorMessage=""
119
+ >
120
+ <input
121
+ type="text"
122
+ value={inpostConfig.host}
123
+ onChange={(v) => {
124
+ setInpostConfig({ ...inpostConfig, host: v.target.value });
125
+ setModified(true);
126
+ }}
127
+ />
128
+ </FormField>
129
+ </div>
130
+ <div style={{ marginTop: "16px", marginBottom: "16px" }}>
131
+ <FormField
132
+ label={t.translate("inpost-plugin.api-key-label")}
133
+ tooltip={t.translate("inpost-plugin.api-key-tooltip")}
134
+ invalid={false}
135
+ errorMessage=""
136
+ >
137
+ <input
138
+ type="text"
139
+ value={inpostConfig.apiKey || ""}
140
+ onChange={(ev) => {
141
+ setInpostConfig({ ...inpostConfig, apiKey: ev.target.value });
142
+ setModified(true);
143
+ }}
144
+ />
145
+ </FormField>
146
+ </div>
147
+ <div style={{ marginTop: "16px", marginBottom: "16px" }}>
148
+ <FormField
149
+ label={t.translate("inpost-plugin.geowidget-key-label")}
150
+ tooltip={t.translate("inpost-plugin.geowidget-key-tooltip")}
151
+ invalid={false}
152
+ errorMessage=""
153
+ >
154
+ <input
155
+ type="text"
156
+ value={inpostConfig.geowidgetKey || ""}
157
+ onChange={(ev) => {
158
+ setInpostConfig({
159
+ ...inpostConfig,
160
+ geowidgetKey: ev.target.value,
161
+ });
162
+ setModified(true);
163
+ }}
164
+ />
165
+ </FormField>
166
+ </div>
167
+ <div style={{ marginTop: "16px", marginBottom: "16px" }}>
168
+ <FormField
169
+ label={t.translate("inpost-plugin.organization-select-label")}
170
+ tooltip={t.translate("inpost-plugin.organization-select-tooltip")}
171
+ invalid={false}
172
+ errorMessage=""
173
+ >
174
+ <select
175
+ disabled={!organizations.length}
176
+ defaultValue={`${inpostConfig.inpostOrganization ?? ""}`}
177
+ onBlur={(ev) => {
178
+ const org = organizations.find(
179
+ (org) => `${org.id}` === ev.target.value,
180
+ );
181
+ setInpostConfig({
182
+ ...inpostConfig,
183
+ inpostOrganization: org && org.id,
184
+ });
185
+ setModified(true);
186
+ }}
187
+ >
188
+ {organizations.map((org) => (
189
+ <option value={`${org.id}`}>{org.name}</option>
190
+ ))}
191
+ </select>
192
+ </FormField>
193
+ </div>
194
+ <div style={{ marginTop: "16px", marginBottom: "16px" }}>
195
+ <FormField
196
+ label={t.translate("inpost-plugin.service-select-label")}
197
+ tooltip={t.translate("inpost-plugin.service-select-tooltip")}
198
+ invalid={false}
199
+ errorMessage=""
200
+ >
201
+ <select
202
+ disabled={typeof inpostConfig.inpostOrganization !== "number"}
203
+ defaultValue={`${inpostConfig.service ?? ""}`}
204
+ onBlur={(ev) => {
205
+ setInpostConfig({
206
+ ...inpostConfig,
207
+ service: ev.target.value as Service,
208
+ });
209
+ setModified(true);
210
+ }}
211
+ >
212
+ {organizations
213
+ .find(
214
+ (org) =>
215
+ typeof inpostConfig.inpostOrganization === "number" &&
216
+ org.id === inpostConfig.inpostOrganization,
217
+ )
218
+ ?.services.map((svc) => (
219
+ <option value={`${svc}`}>
220
+ {t.translate(
221
+ `inpost-plugin.service-${svc.replace(/_/gi, "-")}`,
222
+ )}
223
+ </option>
224
+ ))}
225
+ </select>
226
+ </FormField>
227
+ </div>
228
+ <div style={{ marginTop: "28px" }}>
229
+ <ActionBar>
230
+ <button
231
+ className="button primary"
232
+ onClick={() => {
233
+ dataService
234
+ .mutate(
235
+ gql`
236
+ mutation SetInpostConfig(
237
+ $shippingMethodId: ID!
238
+ $host: String!
239
+ $apiKey: String!
240
+ $geowidgetKey: String
241
+ $inpostOrganization: Int!
242
+ $service: String!
243
+ ) {
244
+ setInpostShippingMethodConfig(
245
+ input: {
246
+ shippingMethodId: $shippingMethodId
247
+ host: $host
248
+ apiKey: $apiKey
249
+ geowidgetKey: $geowidgetKey
250
+ inpostOrganization: $inpostOrganization
251
+ service: $service
252
+ }
253
+ )
254
+ }
255
+ `,
256
+ {
257
+ ...inpostConfig,
258
+ shippingMethodId,
259
+ },
260
+ )
261
+ .subscribe(() => {
262
+ setModified(false);
263
+ });
264
+ }}
265
+ >
266
+ {t.translate("inpost-plugin.save")}
267
+ </button>
268
+ </ActionBar>
269
+ </div>
270
+ </Card>
271
+ </div>
272
+ ) : null;
273
+ };
@@ -0,0 +1,14 @@
1
+ import { $ } from "../zeus";
2
+ import { typedGql } from "../zeus/typedDocumentNode";
3
+ import { scalars } from "./scalars";
4
+
5
+ const mutation = typedGql("mutation", { scalars });
6
+
7
+ const SEND_INVOICE = mutation({
8
+ sendInvoiceToWFirma: [
9
+ { input: $("input", "SendInvoiceToWFirmaInput!") },
10
+ { url: true },
11
+ ],
12
+ });
13
+
14
+ export const MUTATIONS = { SEND_INVOICE };
@@ -0,0 +1,7 @@
1
+ import { typedGql } from "../zeus/typedDocumentNode";
2
+ import { $ } from "../zeus";
3
+ import { scalars } from "./scalars";
4
+
5
+ const query = typedGql("query", { scalars });
6
+
7
+ export const QUERIES = {};
@@ -0,0 +1,15 @@
1
+ import { ZeusScalars } from "../zeus";
2
+
3
+ export const scalars = ZeusScalars({
4
+ DateTime: {
5
+ decode: (e: unknown) => new Date(e as string).toISOString(),
6
+ encode: (e: unknown) => (e as Date).toISOString(),
7
+ },
8
+ JSON: {
9
+ decode: (e: unknown) => JSON.parse(e as string),
10
+ encode: (e: unknown) => JSON.stringify(e),
11
+ },
12
+ Money: {
13
+ decode: (e) => e as number,
14
+ },
15
+ });
File without changes
@@ -0,0 +1,9 @@
1
+ import { registerReactCustomDetailComponent } from "@deenruv/admin-ui/react";
2
+ import { Inpost } from "./Inpost";
3
+
4
+ export default [
5
+ registerReactCustomDetailComponent({
6
+ locationId: "shipping-method-detail",
7
+ component: Inpost,
8
+ }),
9
+ ];
@@ -0,0 +1 @@
1
+ export default [];
File without changes
@@ -0,0 +1,31 @@
1
+ {
2
+ "inpost-plugin": {
3
+ "title": "Configure InPost shipping method",
4
+ "host-label": "Host API ShipX",
5
+ "host-tooltip": "Host API ShipX that should be used to communicate with API",
6
+ "api-key-label": "ShipX API key",
7
+ "api-key-tooltip": "Private API key for ShipX API",
8
+ "organization-select-label": "Organization",
9
+ "organization-select-tooltip": "Select InPost organization",
10
+ "service-select-label": "Service",
11
+ "service-select-tooltip": "Select InPost service",
12
+ "service-inpost-locker-standard": "Parcel locker shipment - standard",
13
+ "service-inpost-locker-economy": "Parcel locker shipment - economy",
14
+ "service-inpost-locker-allegro": "Parcel locker shipment - Allegro Paczkomat® InPost.",
15
+ "service-inpost-locker-pass-thru": "Parcel locker shipment - Pass-Thru",
16
+ "service-inpost-letter-allegro": "Courier shipment - Allegro MiniKurier24 InPost",
17
+ "service-inpost-courier-allegro": "Courier shipment - Allegro Kurier24 InPost.",
18
+ "service-inpost-courier-c2c": "Courier shipment - InPost Courier C2C (service for a retail customer - prepaid)",
19
+ "service-inpost-courier-standard": "Courier shipment standard",
20
+ "service-inpost-courier-express-1000": "Courier shipment with delivery until 10:00",
21
+ "service-inpost-courier-express-1200": "Courier shipment with delivery until 12:00",
22
+ "service-inpost-courier-express-1700": "Courier shipment with delivery until 17:00",
23
+ "service-inpost-courier-palette": "Courier shipment Pallet Standard",
24
+ "save": "Zapisz",
25
+ "connection-label": "Connection",
26
+ "connection-tooltip": "Connection to InPost API",
27
+ "connected": "Connected",
28
+ "not-connected": "Not connected",
29
+ "connection-error": "Connection error"
30
+ }
31
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "inpost-plugin": {
3
+ "title": "Skonfiguruj metodę wysyłki InPost",
4
+ "host-label": "Host API ShipX",
5
+ "host-tooltip": "Host API ShipX który powinien być użyty do komunikacji z API",
6
+ "api-key-label": "ShipX API klucz",
7
+ "api-key-tooltip": "Klucz prywatny do API ShipX",
8
+ "geowidget-key-label": "Klucz Geowidget",
9
+ "geowidget-key-tooltip": "Klucz publiczny do Geowidget",
10
+ "organization-select-label": "Organizacja",
11
+ "organization-select-tooltip": "Wybierz organizację w InPost",
12
+ "service-select-label": "Usługa",
13
+ "service-select-tooltip": "Wybierz usługę w InPost",
14
+ "service-inpost-locker-standard": "Przesyłka Paczkomat® - standardowa",
15
+ "service-inpost-locker-economy": "Przesyłka Paczkomat® - ekonomiczna",
16
+ "service-inpost-locker-allegro": "Przesyłka Paczkomat® - Allegro Paczkomat® InPost",
17
+ "service-inpost-locker-pass-thru": "Przesyłka Paczkomat® - Podaj Dalej",
18
+ "service-inpost-letter-allegro": "Przesyłka kurierska - Allegro MiniKurier24 InPost",
19
+ "service-inpost-courier-allegro": "Przesyłka kurierska - Allegro Kurier24 InPost",
20
+ "service-inpost-courier-c2c": "Przesyłka kurierska InPost Kurier C2C (usługa dla klienta detalicznego - prepaid)",
21
+ "service-inpost-courier-standard": "Przesyłka kurierska standardowa",
22
+ "service-inpost-courier-express-1000": "Przesyłka kurierska z doręczeniem do 10:00",
23
+ "service-inpost-courier-express-1200": "Przesyłka kurierska z doręczeniem do 12:00",
24
+ "service-inpost-courier-express-1700": "Przesyłka kurierska z doręczeniem do 17:00",
25
+ "service-inpost-courier-palette": "Przesyłka kurierska Paleta Standard",
26
+ "save": "Zapisz",
27
+ "connection-label": "Połączenie",
28
+ "connection-tooltip": "Połączenie z API InPost",
29
+ "connected": "Połączono",
30
+ "not-connected": "Nie połączono",
31
+ "connection-error": "Błąd połączenia"
32
+ }
33
+ }