@hanzo/commerce 7.3.2 → 7.3.3

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 (83) hide show
  1. package/components/Icons.tsx +34 -34
  2. package/components/add-to-cart-widget.tsx +183 -183
  3. package/components/buy/buy-card.tsx +259 -259
  4. package/components/buy/carousel-buy-card.tsx +242 -242
  5. package/components/buy/multi-family/all-variants-carousel.tsx +261 -261
  6. package/components/buy/multi-family/family-carousel/index.tsx +77 -77
  7. package/components/buy/multi-family/family-carousel/slide.tsx +83 -83
  8. package/components/buy/multi-family/family-carousel/state.ts +87 -87
  9. package/components/buy/multi-family/index.ts +2 -2
  10. package/components/buy/single-family-selector.tsx +90 -90
  11. package/components/buy/title-and-byline.tsx +25 -25
  12. package/components/cart/cart-panel/cart-line-item.tsx +76 -76
  13. package/components/cart/cart-panel/index.tsx +154 -154
  14. package/components/cart/cart-panel/promo-code.tsx +106 -106
  15. package/components/cart/cart-panel/total-area.tsx +60 -60
  16. package/components/checkout/payment-step-form/card-icon-row.tsx +26 -26
  17. package/components/checkout/payment-step-form/card-icons/amex.tsx +32 -32
  18. package/components/checkout/payment-step-form/card-icons/diners-club.tsx +13 -13
  19. package/components/checkout/payment-step-form/card-icons/discover.tsx +25 -25
  20. package/components/checkout/payment-step-form/card-icons/jcb.tsx +26 -26
  21. package/components/checkout/payment-step-form/card-icons/mastercard.tsx +27 -27
  22. package/components/checkout/payment-step-form/card-icons/visa.tsx +25 -25
  23. package/components/checkout/payment-step-form/cc-button.tsx +17 -17
  24. package/components/checkout/payment-step-form/contact-form.tsx +49 -49
  25. package/components/checkout/payment-step-form/crypto-icons/btc.tsx +11 -11
  26. package/components/checkout/payment-step-form/crypto-icons/eth.tsx +20 -20
  27. package/components/checkout/payment-step-form/crypto-icons/usdt.tsx +13 -13
  28. package/components/checkout/payment-step-form/index.tsx +122 -122
  29. package/components/checkout/payment-step-form/methods/bank-transfer.tsx +79 -79
  30. package/components/checkout/payment-step-form/methods/card.tsx +232 -232
  31. package/components/checkout/payment-step-form/methods/crypto.tsx +227 -227
  32. package/components/checkout/payment-step-form/methods/index.ts +22 -22
  33. package/components/checkout/shipping-step-form.tsx +172 -172
  34. package/components/index.ts +11 -11
  35. package/components/item/product-card.tsx +48 -48
  36. package/components/item-selector/button.tsx +188 -188
  37. package/components/item-selector/carousel/index.tsx +197 -197
  38. package/components/item-selector/carousel/slider.tsx +40 -40
  39. package/components/item-selector/index.ts +5 -5
  40. package/components/item-selector/quantity-indicator.tsx +48 -48
  41. package/components/node-tabs/index.tsx +91 -91
  42. package/components/node-tabs/node-image.tsx +31 -31
  43. package/index.ts +12 -12
  44. package/package.json +60 -60
  45. package/service/context.tsx +45 -45
  46. package/service/debug.ts +41 -41
  47. package/service/impls/standalone/actual-line-item.ts +135 -135
  48. package/service/impls/standalone/get-instance.ts +64 -64
  49. package/service/impls/standalone/index.ts +579 -579
  50. package/service/impls/standalone/order/firebase.ts +14 -14
  51. package/service/impls/standalone/order/index.ts +128 -128
  52. package/service/impls/standalone/persistence.ts +33 -33
  53. package/service/path-utils.ts +25 -25
  54. package/service/sep.ts +6 -6
  55. package/tsconfig.json +10 -10
  56. package/types/README.md +1 -1
  57. package/types/category-node.ts +49 -49
  58. package/types/checkout.ts +46 -46
  59. package/types/commerce-config.ts +13 -13
  60. package/types/commerce-service.ts +127 -127
  61. package/types/family.ts +25 -25
  62. package/types/index.ts +15 -15
  63. package/types/item-selector.ts +96 -96
  64. package/types/line-item.ts +29 -29
  65. package/types/multi-family-selector-props.ts +19 -19
  66. package/types/product.ts +20 -20
  67. package/types/promo.ts +9 -9
  68. package/types/selection-ui-specifier.ts +51 -51
  69. package/types/string-mutator.ts +13 -13
  70. package/types/token-separators.ts +7 -7
  71. package/util/analytics.ts +20 -20
  72. package/util/countries.ts +195 -195
  73. package/util/error.ts +34 -34
  74. package/util/index.ts +70 -70
  75. package/util/item-selector-options-accessor.ts +34 -34
  76. package/util/line-item-ref.ts +23 -23
  77. package/util/multi-family-selector-options-accessor.ts +14 -14
  78. package/util/obs-string-mutator.ts +22 -22
  79. package/util/product-media-accessor.ts +58 -58
  80. package/util/promo-codes.ts +108 -108
  81. package/util/selection-ui-specifiers.ts +29 -29
  82. package/util/square-payment.ts +42 -42
  83. package/util/use-sync-sku-param-w-current-item.ts +88 -88
@@ -1,136 +1,136 @@
1
- import {
2
- action,
3
- computed,
4
- makeObservable,
5
- observable,
6
- } from 'mobx'
7
-
8
- import type { ImageDef, MediaTransform, VideoDef } from '@hanzo/ui/types'
9
-
10
- import type { Product, LineItem, CommerceService } from '../../../types'
11
-
12
- interface ActualLineItemSnapshot {
13
- sku: string
14
- familyId: string // helps impl of restoreFromSnapshot
15
- title: string
16
- price: number
17
- quantity: number
18
- timeAdded: number
19
- timeModified: number
20
- }
21
-
22
- class ActualLineItem
23
- implements LineItem
24
- {
25
- qu: number = 0
26
-
27
- id: string
28
- sku: string
29
- fullTitle?: string
30
- optionLabel: string
31
- optionLabelShort?: string
32
- familyTitle: string
33
- familyId: string
34
- byline?: string
35
- desc?: string
36
- price: number
37
- img?: ImageDef
38
- video?: VideoDef
39
- animation?: string
40
- mediaTransform?: MediaTransform
41
- optionImg?: ImageDef
42
-
43
- timeAdded: number = 0 // Timestamp when added
44
- timeModified: number = 0 // Timestamp quantity last modified (0 if not in cart)
45
-
46
- constructor(prod: Product, snap?: ActualLineItemSnapshot) {
47
- this.id = prod.id
48
- this.sku = prod.sku
49
- this.fullTitle = prod.fullTitle
50
- this.optionLabel = prod.optionLabel
51
- this.optionLabelShort = prod.optionLabelShort
52
- this.familyTitle = prod.familyTitle
53
- this.familyId = prod.familyId
54
- this.byline = prod.byline
55
- this.desc = prod.desc
56
- this.price = prod.price
57
- this.img = prod.img
58
- this.video = prod.video
59
- this.animation = prod.animation
60
- this.optionImg = prod.optionImg
61
- this.mediaTransform = prod.mediaTransform
62
-
63
- if (snap) {
64
- this.qu = snap.quantity
65
- this.timeAdded = snap.timeAdded
66
- this.timeModified = snap.timeModified
67
- }
68
-
69
- makeObservable(this, {
70
- qu: observable,
71
- timeAdded: observable,
72
- timeModified: observable,
73
- canDecrement: computed,
74
- isInCart: computed,
75
- title: computed,
76
- increment: action,
77
- decrement: action,
78
- })
79
- }
80
-
81
- // TODO: create a way to pass template strings to the ui conf per sku path!
82
- get title(): string {
83
- return this.fullTitle ? this.fullTitle : (this.familyTitle + ', ' + this.optionLabel)
84
- }
85
-
86
- takeSnapshot = (cmmc: CommerceService): ActualLineItemSnapshot => {
87
-
88
- const title = this.fullTitle ?
89
- this.fullTitle
90
- :
91
- ((cmmc.getFamilyById(this.familyId)?.title ?? this.familyTitle) + ', ' + this.optionLabel)
92
-
93
- return({
94
- sku: this.sku,
95
- familyId: this.familyId,
96
- title,
97
- price: this.price,
98
- quantity: this.qu,
99
- timeAdded: this.timeAdded,
100
- timeModified: this.timeModified
101
- } satisfies ActualLineItemSnapshot)
102
- }
103
-
104
- get canDecrement(): boolean { return this.qu > 0 }
105
- get quantity(): number {return this.qu}
106
- get isInCart(): boolean {return this.qu > 0}
107
-
108
- increment(): void {
109
- if (this.qu === 0) {
110
- this.timeAdded = new Date().getTime()
111
- this.timeModified = this.timeAdded
112
- }
113
- else {
114
- this.timeModified = new Date().getTime()
115
- }
116
- this.qu++
117
- }
118
-
119
- decrement(): void {
120
- if (this.canDecrement) {
121
- this.qu--
122
- if (this.qu === 0) {
123
- this.timeAdded = 0
124
- this.timeModified = 0
125
- }
126
- else {
127
- this.timeModified = new Date().getTime()
128
- }
129
- }
130
- }
131
- }
132
-
133
- export {
134
- type ActualLineItemSnapshot,
135
- ActualLineItem as default
1
+ import {
2
+ action,
3
+ computed,
4
+ makeObservable,
5
+ observable,
6
+ } from 'mobx'
7
+
8
+ import type { ImageDef, MediaTransform, VideoDef } from '@hanzo/ui/types'
9
+
10
+ import type { Product, LineItem, CommerceService } from '../../../types'
11
+
12
+ interface ActualLineItemSnapshot {
13
+ sku: string
14
+ familyId: string // helps impl of restoreFromSnapshot
15
+ title: string
16
+ price: number
17
+ quantity: number
18
+ timeAdded: number
19
+ timeModified: number
20
+ }
21
+
22
+ class ActualLineItem
23
+ implements LineItem
24
+ {
25
+ qu: number = 0
26
+
27
+ id: string
28
+ sku: string
29
+ fullTitle?: string
30
+ optionLabel: string
31
+ optionLabelShort?: string
32
+ familyTitle: string
33
+ familyId: string
34
+ byline?: string
35
+ desc?: string
36
+ price: number
37
+ img?: ImageDef
38
+ video?: VideoDef
39
+ animation?: string
40
+ mediaTransform?: MediaTransform
41
+ optionImg?: ImageDef
42
+
43
+ timeAdded: number = 0 // Timestamp when added
44
+ timeModified: number = 0 // Timestamp quantity last modified (0 if not in cart)
45
+
46
+ constructor(prod: Product, snap?: ActualLineItemSnapshot) {
47
+ this.id = prod.id
48
+ this.sku = prod.sku
49
+ this.fullTitle = prod.fullTitle
50
+ this.optionLabel = prod.optionLabel
51
+ this.optionLabelShort = prod.optionLabelShort
52
+ this.familyTitle = prod.familyTitle
53
+ this.familyId = prod.familyId
54
+ this.byline = prod.byline
55
+ this.desc = prod.desc
56
+ this.price = prod.price
57
+ this.img = prod.img
58
+ this.video = prod.video
59
+ this.animation = prod.animation
60
+ this.optionImg = prod.optionImg
61
+ this.mediaTransform = prod.mediaTransform
62
+
63
+ if (snap) {
64
+ this.qu = snap.quantity
65
+ this.timeAdded = snap.timeAdded
66
+ this.timeModified = snap.timeModified
67
+ }
68
+
69
+ makeObservable(this, {
70
+ qu: observable,
71
+ timeAdded: observable,
72
+ timeModified: observable,
73
+ canDecrement: computed,
74
+ isInCart: computed,
75
+ title: computed,
76
+ increment: action,
77
+ decrement: action,
78
+ })
79
+ }
80
+
81
+ // TODO: create a way to pass template strings to the ui conf per sku path!
82
+ get title(): string {
83
+ return this.fullTitle ? this.fullTitle : (this.familyTitle + ', ' + this.optionLabel)
84
+ }
85
+
86
+ takeSnapshot = (cmmc: CommerceService): ActualLineItemSnapshot => {
87
+
88
+ const title = this.fullTitle ?
89
+ this.fullTitle
90
+ :
91
+ ((cmmc.getFamilyById(this.familyId)?.title ?? this.familyTitle) + ', ' + this.optionLabel)
92
+
93
+ return({
94
+ sku: this.sku,
95
+ familyId: this.familyId,
96
+ title,
97
+ price: this.price,
98
+ quantity: this.qu,
99
+ timeAdded: this.timeAdded,
100
+ timeModified: this.timeModified
101
+ } satisfies ActualLineItemSnapshot)
102
+ }
103
+
104
+ get canDecrement(): boolean { return this.qu > 0 }
105
+ get quantity(): number {return this.qu}
106
+ get isInCart(): boolean {return this.qu > 0}
107
+
108
+ increment(): void {
109
+ if (this.qu === 0) {
110
+ this.timeAdded = new Date().getTime()
111
+ this.timeModified = this.timeAdded
112
+ }
113
+ else {
114
+ this.timeModified = new Date().getTime()
115
+ }
116
+ this.qu++
117
+ }
118
+
119
+ decrement(): void {
120
+ if (this.canDecrement) {
121
+ this.qu--
122
+ if (this.qu === 0) {
123
+ this.timeAdded = 0
124
+ this.timeModified = 0
125
+ }
126
+ else {
127
+ this.timeModified = new Date().getTime()
128
+ }
129
+ }
130
+ }
131
+ }
132
+
133
+ export {
134
+ type ActualLineItemSnapshot,
135
+ ActualLineItem as default
136
136
  }
@@ -1,64 +1,64 @@
1
- import { enableStaticRendering } from 'mobx-react-lite'
2
-
3
- import type { CommerceService, CommerceConfig } from '../../../types'
4
- import { StandaloneService } from './index'
5
- import { initSelectionUI } from '../../../util'
6
-
7
- import { readSnapshot, writeSnapshotsOnChange } from './persistence'
8
-
9
- enableStaticRendering(typeof window === "undefined")
10
-
11
- const _LOG = false
12
- const _log = (s: string) => {
13
- if (!_LOG) return;
14
- const d = new Date()
15
- console.log(`TIMESTAMPED: ${d.getUTCMinutes()}:${d.getUTCSeconds()}:${d.getUTCMilliseconds()}`)
16
- console.log(s)
17
- }
18
-
19
- // https://dev.to/ivandotv/mobx-server-side-rendering-with-next-js-4m18
20
-
21
- let instance: StandaloneService | undefined = undefined
22
-
23
- export const getInstance = ({
24
- families,
25
- rootNode,
26
- options,
27
- uiSpecifiers
28
- }: CommerceConfig) : CommerceService => {
29
-
30
- if (!options) {
31
- throw new Error('cmmc getInstance(): Standalone Commerce Service requires config options!')
32
- }
33
-
34
- if (typeof window === "undefined") {
35
- if (uiSpecifiers) {
36
- initSelectionUI(uiSpecifiers)
37
- }
38
- _log("NEW INSTANCE: SERVER") //////////
39
- return new StandaloneService(
40
- families,
41
- rootNode,
42
- options
43
- )
44
- }
45
-
46
- // Client side, create the store only once in the client
47
- if (!instance) {
48
- if (uiSpecifiers) {
49
- initSelectionUI(uiSpecifiers)
50
- }
51
- _log("NEW INSTANCE: CLIENT") ///////////
52
- const snapShot = readSnapshot(options.localStorageKey)
53
- instance = new StandaloneService(
54
- families,
55
- rootNode,
56
- options,
57
- snapShot
58
- )
59
- writeSnapshotsOnChange(instance, options.localStorageKey)
60
- }
61
-
62
- return instance
63
- }
64
-
1
+ import { enableStaticRendering } from 'mobx-react-lite'
2
+
3
+ import type { CommerceService, CommerceConfig } from '../../../types'
4
+ import { StandaloneService } from './index'
5
+ import { initSelectionUI } from '../../../util'
6
+
7
+ import { readSnapshot, writeSnapshotsOnChange } from './persistence'
8
+
9
+ enableStaticRendering(typeof window === "undefined")
10
+
11
+ const _LOG = false
12
+ const _log = (s: string) => {
13
+ if (!_LOG) return;
14
+ const d = new Date()
15
+ console.log(`TIMESTAMPED: ${d.getUTCMinutes()}:${d.getUTCSeconds()}:${d.getUTCMilliseconds()}`)
16
+ console.log(s)
17
+ }
18
+
19
+ // https://dev.to/ivandotv/mobx-server-side-rendering-with-next-js-4m18
20
+
21
+ let instance: StandaloneService | undefined = undefined
22
+
23
+ export const getInstance = ({
24
+ families,
25
+ rootNode,
26
+ options,
27
+ uiSpecifiers
28
+ }: CommerceConfig) : CommerceService => {
29
+
30
+ if (!options) {
31
+ throw new Error('cmmc getInstance(): Standalone Commerce Service requires config options!')
32
+ }
33
+
34
+ if (typeof window === "undefined") {
35
+ if (uiSpecifiers) {
36
+ initSelectionUI(uiSpecifiers)
37
+ }
38
+ _log("NEW INSTANCE: SERVER") //////////
39
+ return new StandaloneService(
40
+ families,
41
+ rootNode,
42
+ options
43
+ )
44
+ }
45
+
46
+ // Client side, create the store only once in the client
47
+ if (!instance) {
48
+ if (uiSpecifiers) {
49
+ initSelectionUI(uiSpecifiers)
50
+ }
51
+ _log("NEW INSTANCE: CLIENT") ///////////
52
+ const snapShot = readSnapshot(options.localStorageKey)
53
+ instance = new StandaloneService(
54
+ families,
55
+ rootNode,
56
+ options,
57
+ snapShot
58
+ )
59
+ writeSnapshotsOnChange(instance, options.localStorageKey)
60
+ }
61
+
62
+ return instance
63
+ }
64
+