itmar-block-packages 1.10.0 → 2.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 (157) hide show
  1. package/README.md +81 -2
  2. package/build/cjs/AnimationBlock.js +107 -0
  3. package/build/cjs/AnimationBlock.js.map +1 -0
  4. package/build/cjs/BlockEditWrapper.js +20 -0
  5. package/build/cjs/BlockEditWrapper.js.map +1 -0
  6. package/build/cjs/BlockPlace.js +509 -0
  7. package/build/cjs/BlockPlace.js.map +1 -0
  8. package/build/cjs/BrockInserter.js +204 -0
  9. package/build/cjs/BrockInserter.js.map +1 -0
  10. package/build/cjs/DateElm.js +321 -0
  11. package/build/cjs/DateElm.js.map +1 -0
  12. package/build/cjs/DraggableBox.js +143 -0
  13. package/build/cjs/DraggableBox.js.map +1 -0
  14. package/build/cjs/GridControls.js +421 -0
  15. package/build/cjs/GridControls.js.map +1 -0
  16. package/build/cjs/IconSelectControl.js +167 -0
  17. package/build/cjs/IconSelectControl.js.map +1 -0
  18. package/build/cjs/JapaneseHolidays.js +99 -0
  19. package/build/cjs/JapaneseHolidays.js.map +1 -0
  20. package/build/cjs/MasonryControl.js +124 -0
  21. package/build/cjs/MasonryControl.js.map +1 -0
  22. package/build/cjs/PseudoElm.js +66 -0
  23. package/build/cjs/PseudoElm.js.map +1 -0
  24. package/build/cjs/ShadowStyle.js +453 -0
  25. package/build/cjs/ShadowStyle.js.map +1 -0
  26. package/build/cjs/SwiperControl.js +267 -0
  27. package/build/cjs/SwiperControl.js.map +1 -0
  28. package/build/cjs/ToggleElement.js +17 -0
  29. package/build/cjs/ToggleElement.js.map +1 -0
  30. package/build/cjs/TypographyControls.js +151 -0
  31. package/build/cjs/TypographyControls.js.map +1 -0
  32. package/build/cjs/UpdateAllPostsBlockAttributes.js +137 -0
  33. package/build/cjs/UpdateAllPostsBlockAttributes.js.map +1 -0
  34. package/build/cjs/ZipAddress.js +34 -0
  35. package/build/cjs/ZipAddress.js.map +1 -0
  36. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +117 -0
  37. package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  38. package/build/cjs/blockStore.js +65 -0
  39. package/build/cjs/blockStore.js.map +1 -0
  40. package/build/cjs/cssPropertes.js +157 -0
  41. package/build/cjs/cssPropertes.js.map +1 -0
  42. package/build/cjs/customFooks.js +300 -0
  43. package/build/cjs/customFooks.js.map +1 -0
  44. package/build/cjs/formatCreate.js +160 -0
  45. package/build/cjs/formatCreate.js.map +1 -0
  46. package/build/cjs/hslToRgb.js +133 -0
  47. package/build/cjs/hslToRgb.js.map +1 -0
  48. package/build/cjs/index.js +115 -0
  49. package/build/cjs/index.js.map +1 -0
  50. package/build/cjs/mediaUpload.js +182 -0
  51. package/build/cjs/mediaUpload.js.map +1 -0
  52. package/build/cjs/node_modules/nanoid/index.js +30 -0
  53. package/build/cjs/node_modules/nanoid/index.js.map +1 -0
  54. package/build/cjs/node_modules/nanoid/url-alphabet/index.js +7 -0
  55. package/build/cjs/node_modules/nanoid/url-alphabet/index.js.map +1 -0
  56. package/build/cjs/shopfiApi.js +188 -0
  57. package/build/cjs/shopfiApi.js.map +1 -0
  58. package/build/cjs/validationCheck.js +15 -0
  59. package/build/cjs/validationCheck.js.map +1 -0
  60. package/build/cjs/wordpressApi.js +631 -0
  61. package/build/cjs/wordpressApi.js.map +1 -0
  62. package/build/esm/AnimationBlock.js +102 -0
  63. package/build/esm/AnimationBlock.js.map +1 -0
  64. package/build/esm/BlockEditWrapper.js +16 -0
  65. package/build/esm/BlockEditWrapper.js.map +1 -0
  66. package/build/esm/BlockPlace.js +503 -0
  67. package/build/esm/BlockPlace.js.map +1 -0
  68. package/build/esm/BrockInserter.js +202 -0
  69. package/build/esm/BrockInserter.js.map +1 -0
  70. package/build/esm/DateElm.js +309 -0
  71. package/build/esm/DateElm.js.map +1 -0
  72. package/build/esm/DraggableBox.js +138 -0
  73. package/build/esm/DraggableBox.js.map +1 -0
  74. package/build/esm/GridControls.js +417 -0
  75. package/build/esm/GridControls.js.map +1 -0
  76. package/build/esm/IconSelectControl.js +163 -0
  77. package/build/esm/IconSelectControl.js.map +1 -0
  78. package/build/esm/JapaneseHolidays.js +97 -0
  79. package/build/esm/JapaneseHolidays.js.map +1 -0
  80. package/{src → build/esm}/MasonryControl.js +108 -113
  81. package/build/esm/MasonryControl.js.map +1 -0
  82. package/build/esm/PseudoElm.js +61 -0
  83. package/build/esm/PseudoElm.js.map +1 -0
  84. package/build/esm/ShadowStyle.js +448 -0
  85. package/build/esm/ShadowStyle.js.map +1 -0
  86. package/{src → build/esm}/SwiperControl.js +265 -265
  87. package/build/esm/SwiperControl.js.map +1 -0
  88. package/build/esm/ToggleElement.js +13 -0
  89. package/build/esm/ToggleElement.js.map +1 -0
  90. package/build/esm/TypographyControls.js +147 -0
  91. package/build/esm/TypographyControls.js.map +1 -0
  92. package/build/esm/UpdateAllPostsBlockAttributes.js +133 -0
  93. package/build/esm/UpdateAllPostsBlockAttributes.js.map +1 -0
  94. package/build/esm/ZipAddress.js +32 -0
  95. package/build/esm/ZipAddress.js.map +1 -0
  96. package/build/esm/_virtual/_rollupPluginBabelHelpers.js +107 -0
  97. package/build/esm/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  98. package/build/esm/blockStore.js +60 -0
  99. package/build/esm/blockStore.js.map +1 -0
  100. package/build/esm/cssPropertes.js +144 -0
  101. package/build/esm/cssPropertes.js.map +1 -0
  102. package/{src → build/esm}/customFooks.js +290 -337
  103. package/build/esm/customFooks.js.map +1 -0
  104. package/build/esm/formatCreate.js +157 -0
  105. package/build/esm/formatCreate.js.map +1 -0
  106. package/build/esm/hslToRgb.js +129 -0
  107. package/build/esm/hslToRgb.js.map +1 -0
  108. package/build/esm/index.js +27 -0
  109. package/build/esm/index.js.map +1 -0
  110. package/build/esm/mediaUpload.js +176 -0
  111. package/build/esm/mediaUpload.js.map +1 -0
  112. package/build/esm/node_modules/nanoid/index.js +27 -0
  113. package/build/esm/node_modules/nanoid/index.js.map +1 -0
  114. package/build/esm/node_modules/nanoid/url-alphabet/index.js +5 -0
  115. package/build/esm/node_modules/nanoid/url-alphabet/index.js.map +1 -0
  116. package/build/esm/shopfiApi.js +184 -0
  117. package/build/esm/shopfiApi.js.map +1 -0
  118. package/build/esm/validationCheck.js +13 -0
  119. package/build/esm/validationCheck.js.map +1 -0
  120. package/build/esm/wordpressApi.js +618 -0
  121. package/build/esm/wordpressApi.js.map +1 -0
  122. package/package.json +22 -6
  123. package/build/index.asset.php +0 -1
  124. package/build/index.js +0 -25
  125. package/css/editor.css +0 -23
  126. package/css/editor.css.map +0 -1
  127. package/img/animation.png +0 -0
  128. package/img/blockplace.png +0 -0
  129. package/img/grid.png +0 -0
  130. package/img/iconControl.png +0 -0
  131. package/img/pseudo.png +0 -0
  132. package/img/shadow.png +0 -0
  133. package/img/typography.png +0 -0
  134. package/src/AnimationBlock.js +0 -112
  135. package/src/BlockEditWrapper.js +0 -11
  136. package/src/BlockPlace.js +0 -904
  137. package/src/BrockInserter.js +0 -247
  138. package/src/DateElm.js +0 -354
  139. package/src/DraggableBox.js +0 -143
  140. package/src/GridControls.js +0 -462
  141. package/src/IconSelectControl.js +0 -186
  142. package/src/PseudoElm.js +0 -54
  143. package/src/ShadowStyle.js +0 -520
  144. package/src/ToggleElement.js +0 -18
  145. package/src/TypographyControls.js +0 -145
  146. package/src/UpdateAllPostsBlockAttributes.js +0 -127
  147. package/src/ZipAddress.js +0 -35
  148. package/src/blockStore.js +0 -75
  149. package/src/cssPropertes.js +0 -212
  150. package/src/formatCreate.js +0 -179
  151. package/src/hslToRgb.js +0 -162
  152. package/src/index.js +0 -131
  153. package/src/mediaUpload.js +0 -178
  154. package/src/shopfiApi.js +0 -187
  155. package/src/validationCheck.js +0 -10
  156. package/src/wordpressApi.js +0 -686
  157. package/webpack.config.js +0 -10
package/src/hslToRgb.js DELETED
@@ -1,162 +0,0 @@
1
- const createRGB = (inputStr) => {
2
- //16進数変換の関数
3
- function componentToHex(c) {
4
- const hex = parseInt(c, 10).toString(16);
5
- return hex.length === 1 ? "0" + hex : hex;
6
- }
7
-
8
- let resultStr;
9
- let rgb = [];
10
-
11
- // #000000 形式の場合
12
- if (/^#[0-9a-fA-F]{6}$/.test(inputStr)) {
13
- rgb = [
14
- inputStr.slice(1, 3),
15
- inputStr.slice(3, 5),
16
- inputStr.slice(5, 7)
17
- ];
18
- }
19
- // rgb(0,0,0) 形式の場合
20
- else if ((resultStr = inputStr.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/))) {
21
- rgb = [
22
- componentToHex(resultStr[1]),
23
- componentToHex(resultStr[2]),
24
- componentToHex(resultStr[3])
25
- ];
26
- } else {
27
- // サポートされていない形式の場合はデフォルトの値を設定する
28
- rgb = ["ff", "ff", "ff"];
29
- }
30
- return rgb;
31
- }
32
-
33
- export function hslToRgb16(hue, saturation, lightness) {
34
- var result = false;
35
-
36
- if (((hue || hue === 0) && hue <= 360) && ((saturation || saturation === 0) && saturation <= 100) && ((lightness || lightness === 0) && lightness <= 100)) {
37
- var red = 0,
38
- green = 0,
39
- blue = 0,
40
- q = 0,
41
- p = 0,
42
- hueToRgb;
43
-
44
- hue = Number(hue) / 360;
45
- saturation = Number(saturation) / 100;
46
- lightness = Number(lightness) / 100;
47
-
48
- if (saturation === 0) {
49
- red = lightness;
50
- green = lightness;
51
- blue = lightness;
52
- } else {
53
- hueToRgb = function (p, q, t) {
54
- if (t < 0) t += 1;
55
- if (t > 1) t -= 1;
56
-
57
- if (t < 1 / 6) {
58
- p += (q - p) * 6 * t;
59
- } else if (t < 1 / 2) {
60
- p = q;
61
- } else if (t < 2 / 3) {
62
- p += (q - p) * (2 / 3 - t) * 6;
63
- }
64
-
65
- return p;
66
- };
67
-
68
- if (lightness < 0.5) {
69
- q = lightness * (1 + saturation);
70
- } else {
71
- q = lightness + saturation - lightness * saturation;
72
- }
73
- p = 2 * lightness - q;
74
-
75
- red = hueToRgb(p, q, hue + 1 / 3);
76
- green = hueToRgb(p, q, hue);
77
- blue = hueToRgb(p, q, hue - 1 / 3);
78
- }
79
-
80
- result = `#${Math.round(red * 255).toString(16).padStart(2, '0')}${Math.round(green * 255).toString(16).padStart(2, '0')}${Math.round(blue * 255).toString(16).padStart(2, '0')}`;
81
-
82
- }
83
-
84
- return result;
85
- };
86
-
87
- export function rgb16ToHsl(strRgb16) {
88
- let rgb = createRGB(strRgb16);
89
- let red = rgb[0];
90
- let green = rgb[1];
91
- let blue = rgb[2];
92
- let result = false;
93
-
94
- if (((red || red === 0) && String(red).match(/^[0-9a-f]{2}$/i)) && ((green || green === 0) && String(green).match(/^[0-9a-f]{2}$/i)) && ((blue || blue === 0) && String(blue).match(/^[0-9a-f]{2}$/i))) {
95
- let hue = 0,
96
- saturation = 0,
97
- lightness = 0,
98
- max = 0,
99
- min = 0,
100
- diff = 0;
101
-
102
- red = parseInt(red, 16) / 255;
103
- green = parseInt(green, 16) / 255;
104
- blue = parseInt(blue, 16) / 255;
105
- max = Math.max(red, green, blue);
106
- min = Math.min(red, green, blue);
107
- lightness = (max + min) / 2;
108
-
109
- if (max !== min) {
110
- diff = max - min;
111
-
112
- if (lightness > 0.5) {
113
- saturation = diff / (2 - max - min);
114
- } else {
115
- saturation = diff / (max + min);
116
- }
117
-
118
- if (max === red) {
119
- hue = (green - blue) / diff;
120
- } else if (max === green) {
121
- hue = 2 + (blue - red) / diff;
122
- } else {
123
- hue = 4 + (red - green) / diff;
124
- }
125
-
126
- hue /= 6;
127
- }
128
-
129
- result = {
130
- hue: Math.round(hue * 360),
131
- saturation: Math.round(saturation * 100),
132
- lightness: Math.round(lightness * 100)
133
- };
134
- }
135
-
136
- return result;
137
- };
138
-
139
- export function HexToRGB(strRgb16) {
140
- let rgb = createRGB(strRgb16);
141
- let red = rgb[0];
142
- let green = rgb[1];
143
- let blue = rgb[2];
144
- let result = false;
145
-
146
- if (((red || red === 0) && String(red).match(/^[0-9a-f]{2}$/i)) && ((green || green === 0) && String(green).match(/^[0-9a-f]{2}$/i)) && ((blue || blue === 0) && String(blue).match(/^[0-9a-f]{2}$/i))) {
147
-
148
-
149
- red = parseInt(red, 16);
150
- green = parseInt(green, 16);
151
- blue = parseInt(blue, 16);
152
-
153
-
154
- result = {
155
- red: Math.round(red),
156
- green: Math.round(green),
157
- blue: Math.round(blue)
158
- };
159
- }
160
-
161
- return result;
162
- };
package/src/index.js DELETED
@@ -1,131 +0,0 @@
1
- //カスタムフック(一般)
2
- export {
3
- useIsIframeMobile,
4
- useElementBackgroundColor,
5
- useElementStyleObject,
6
- useElementWidth,
7
- useIsMobile,
8
- useDeepCompareEffect,
9
- useFontawesomeIframe,
10
- useBlockAttributeChanges,
11
- useDuplicateBlockRemove,
12
- } from "./customFooks";
13
-
14
- //WordPressデータを取得するためのRestAPI
15
- export {
16
- fetchPagesOptions,
17
- fetchArchiveOptions,
18
- restFetchData,
19
- restTaxonomies,
20
- restFieldes,
21
- termToDispObj,
22
- PageSelectControl,
23
- ArchiveSelectControl,
24
- TermChoiceControl,
25
- FieldChoiceControl,
26
- } from "./wordpressApi";
27
-
28
- //styled-componet用のcssプロパティ生成関数
29
- export {
30
- space_prm,
31
- max_width_prm,
32
- width_prm,
33
- height_prm,
34
- align_prm,
35
- position_prm,
36
- radius_prm,
37
- convertToScss,
38
- borderProperty,
39
- radiusProperty,
40
- marginProperty,
41
- paddingProperty,
42
- } from "./cssPropertes";
43
-
44
- //ボックスシャドーを設定するコントロール
45
- export { default as ShadowStyle, ShadowElm } from "./ShadowStyle";
46
-
47
- //疑似要素を設定するコントロール
48
- export { default as PseudoElm, Arrow } from "./PseudoElm";
49
-
50
- //メディアライブラリから複数の画像を選択するコントロール
51
- export {
52
- SingleImageSelect,
53
- MultiImageSelect,
54
- getMediaType,
55
- getImageAspectRatio,
56
- getVideoAspectRatio,
57
- } from "./mediaUpload";
58
-
59
- //ブロックのドラッガブルを設定するコントロール
60
- export { default as DraggableBox, useDraggingMove } from "./DraggableBox";
61
-
62
- //アニメーションを設定するコントロール
63
- export { default as AnimationBlock, anime_comp } from "./AnimationBlock";
64
-
65
- //ブロックの配置を設定するコントロール
66
- export { default as BlockPlace, BlockWidth, BlockHeight } from "./BlockPlace";
67
- export { default as GridControls } from "./GridControls";
68
-
69
- //DOM要素の表示を反転させるコントロール
70
- export { default as ToggleElement } from "./ToggleElement";
71
-
72
- //タイポグラフィーの設定をするコントロール
73
- export { default as TypographyControls } from "./TypographyControls";
74
-
75
- //アイコンの表示を設定するコントロール
76
- export { default as IconSelectControl } from "./IconSelectControl";
77
-
78
- //ブロックをlazy Loadさせるためのラッパーモジュール
79
- export { default as BlockEditWrapper } from "./BlockEditWrapper";
80
-
81
- //色コードの変換関数
82
- export { hslToRgb16, rgb16ToHsl, HexToRGB } from "./hslToRgb";
83
-
84
- //日付関連の関数、コントロール
85
- export {
86
- generateDateArray,
87
- generateMonthCalendar,
88
- PeriodCtrl,
89
- getPeriodQuery,
90
- getTodayYearMonth,
91
- getTodayYear,
92
- getTodayMonth,
93
- generateGridAreas,
94
- JapaneseHolidays,
95
- } from "./DateElm";
96
-
97
- //インナーブロック関連の関数
98
- export {
99
- flattenBlocks,
100
- useTargetBlocks,
101
- serializeBlockTree,
102
- createBlockTree,
103
- } from "./blockStore";
104
-
105
- //バリデーションチェック関連の関数
106
- export { isValidUrlWithUrlApi } from "./validationCheck";
107
-
108
- //特定の投稿タイプの投稿に含まれる本ブロックの属性を書き換える
109
- export { default as UpdateAllPostsBlockAttributes } from "./UpdateAllPostsBlockAttributes";
110
-
111
- //住所変換関連の関数
112
- export { fetchZipToAddress } from "./ZipAddress";
113
-
114
- //書式設定用のコンポーネント
115
- export { FormatSelectControl, displayFormated } from "./formatCreate";
116
-
117
- //ShopifyAPI関連のコンポーネント
118
- export {
119
- checkCustomerLoginState,
120
- redirectCustomerAuthorize,
121
- sendRegistrationRequest,
122
- } from "./shopfiApi";
123
-
124
- //インナーブロック挿入のカスタムフック
125
- export { useRebuildChangeField } from "./BrockInserter";
126
-
127
- //Masonry グリッドを初期化する共通関数
128
- export { default as MasonryControl } from "./MasonryControl";
129
-
130
- //インナーブロック挿入のカスタムフック
131
- export { slideBlockSwiperInit } from "./SwiperControl";
@@ -1,178 +0,0 @@
1
- import { MediaUpload, MediaUploadCheck } from "@wordpress/block-editor";
2
- import { __ } from "@wordpress/i18n";
3
- import { Button, PanelBody } from "@wordpress/components";
4
-
5
- export function SingleImageSelect(props) {
6
- const { attributes } = props;
7
- const { mediaID, media } = attributes;
8
-
9
- //URL の配列から画像を生成
10
- const getImage = (image) => {
11
- //メディアオブジェクトの配列をループ処理
12
- return (
13
- <figure>
14
- <img src={image.url} className="image" alt="アップロード画像" />
15
- </figure>
16
- );
17
- };
18
-
19
- //メディアライブラリを開くボタンをレンダリングする関数
20
- const getImageButton = (open) => {
21
- if (media) {
22
- return (
23
- <div onClick={open} className="block-container">
24
- {getImage(media)}
25
- </div>
26
- );
27
- } else {
28
- return (
29
- <div className="button-container">
30
- <Button onClick={open} className="button button-large">
31
- {__("Sel", "itmar_mv_blocks")}
32
- </Button>
33
- </div>
34
- );
35
- }
36
- };
37
-
38
- return (
39
- <MediaUploadCheck>
40
- <MediaUpload
41
- onSelect={(media) => props.onSelectChange(media)}
42
- allowedTypes={["image"]}
43
- value={mediaID}
44
- render={({ open }) => getImageButton(open)}
45
- />
46
- </MediaUploadCheck>
47
- );
48
- }
49
-
50
- export function MultiImageSelect(props) {
51
- const { attributes, label } = props;
52
- const { mediaID, media } = attributes;
53
-
54
- //URL の配列から画像を生成
55
- const getImages = (media) => {
56
- //メディアオブジェクトの配列をループ処理
57
- let imagesArray = media.map((image, index) => {
58
- return (
59
- <figure key={index}>
60
- <img src={image.url} className="image" alt="アップロード画像" />
61
- <figcaption className="block-image-caption">
62
- {image.caption ? image.caption : ""}
63
- </figcaption>
64
- </figure>
65
- );
66
- });
67
- return imagesArray;
68
- };
69
-
70
- //メディアライブラリを開くボタンをレンダリングする関数
71
- const getImageButton = (open) => {
72
- if (media.length > 0) {
73
- return (
74
- <div key="media-container" onClick={open} className="block-container">
75
- {getImages(media)}
76
- </div>
77
- );
78
- } else {
79
- return (
80
- <div key="media-container" className="button-container">
81
- <Button onClick={open} className="button button-large">
82
- {__("Image Upload", "slide-blocks")}
83
- </Button>
84
- </div>
85
- );
86
- }
87
- };
88
-
89
- return (
90
- <PanelBody title={label} initialOpen={true} className="itmar_image_display">
91
- <MediaUploadCheck>
92
- <MediaUpload
93
- multiple={true}
94
- gallery={true} //追加
95
- onSelect={(media) => props.onSelectChange(media)}
96
- allowedTypes={["image"]}
97
- value={mediaID}
98
- render={({ open }) => getImageButton(open)}
99
- />
100
- </MediaUploadCheck>
101
- {media.length != 0 && ( //メディアオブジェクト(配列の長さ)で判定
102
- <MediaUploadCheck>
103
- <Button
104
- onClick={() => props.onAllDelete()}
105
- variant="secondary"
106
- isDestructive
107
- className="removeImage"
108
- >
109
- {__("Delete All", "slide-blocks")}
110
- </Button>
111
- </MediaUploadCheck>
112
- )}
113
- </PanelBody>
114
- );
115
- }
116
-
117
- //静止画か動画かを判定する関数
118
- export function getMediaType(url) {
119
- const imageExtensions = [
120
- ".jpg",
121
- ".jpeg",
122
- ".png",
123
- ".gif",
124
- ".webp",
125
- ".bmp",
126
- ".svg",
127
- ];
128
- const videoExtensions = [".mp4", ".webm", ".ogg", ".mov", ".m4v"];
129
-
130
- // クエリストリング(?以降)を除去
131
- const cleanUrl = url.split("?")[0].toLowerCase();
132
-
133
- const isImage = imageExtensions.some((ext) => cleanUrl.endsWith(ext));
134
- const isVideo = videoExtensions.some((ext) => cleanUrl.endsWith(ext));
135
-
136
- if (isImage) {
137
- return "image";
138
- } else if (isVideo) {
139
- return "video";
140
- } else {
141
- // 拡張子で判別できない → HEADリクエストでContent-Type判定 or fallback
142
- return undefined;
143
- }
144
- }
145
- //静止画のアスペクト比を返す関数
146
- export function getImageAspectRatio(url) {
147
- return new Promise((resolve, reject) => {
148
- const img = new Image();
149
- img.onload = function () {
150
- const aspectRatio = img.naturalWidth / img.naturalHeight;
151
- resolve(aspectRatio);
152
- };
153
- img.onerror = function () {
154
- reject(new Error("画像の読み込みに失敗しました: " + url));
155
- };
156
- img.src = url;
157
- });
158
- }
159
- //動画のアスペクト比を返す関数
160
- export function getVideoAspectRatio(url) {
161
- return new Promise((resolve, reject) => {
162
- const video = document.createElement("video");
163
-
164
- video.preload = "metadata";
165
- video.src = url;
166
- video.muted = true; // 一部のブラウザで安全に動作させるため
167
- video.playsInline = true;
168
-
169
- video.onloadedmetadata = function () {
170
- const aspectRatio = video.videoWidth / video.videoHeight;
171
- resolve(aspectRatio);
172
- };
173
-
174
- video.onerror = function () {
175
- reject(new Error("動画の読み込みに失敗しました: " + url));
176
- };
177
- });
178
- }
package/src/shopfiApi.js DELETED
@@ -1,187 +0,0 @@
1
- function generateState() {
2
- const timestamp = Date.now().toString();
3
- const randomString = Math.random().toString(36).substring(2);
4
- return timestamp + randomString;
5
- }
6
-
7
- function generateNonce(length = 32) {
8
- const characters =
9
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
10
- let nonce = "";
11
- for (let i = 0; i < length; i++) {
12
- nonce += characters.charAt(Math.floor(Math.random() * characters.length));
13
- }
14
- return nonce;
15
- }
16
-
17
- function generateCodeVerifier(length = 128) {
18
- const charset =
19
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~";
20
- let result = "";
21
- for (let i = 0; i < length; i++) {
22
- result += charset.charAt(Math.floor(Math.random() * charset.length));
23
- }
24
- return result;
25
- }
26
-
27
- async function generateCodeChallenge(codeVerifier) {
28
- const encoder = new TextEncoder();
29
- const data = encoder.encode(codeVerifier);
30
- const digest = await crypto.subtle.digest("SHA-256", data);
31
- return btoa(String.fromCharCode(...new Uint8Array(digest)))
32
- .replace(/\+/g, "-")
33
- .replace(/\//g, "_")
34
- .replace(/=+$/, "");
35
- }
36
-
37
- // ✅ Shopifyへの認証リダイレクト
38
- export async function redirectCustomerAuthorize(
39
- shopId,
40
- clientId,
41
- userMail,
42
- callbackUri,
43
- redirectUri
44
- ) {
45
- //呼び出し元の戻り先
46
- const statePayload = {
47
- ts: Date.now(),
48
- random: Math.random().toString(36).substring(2),
49
- return_url: redirectUri,
50
- };
51
- //stateで渡しておく
52
- const state = btoa(JSON.stringify(statePayload));
53
- const nonce = generateNonce();
54
- const codeVerifier = generateCodeVerifier();
55
- const codeChallenge = await generateCodeChallenge(codeVerifier);
56
-
57
- localStorage.setItem("shopify_code_verifier", codeVerifier);
58
- localStorage.setItem("shopify_state", state);
59
- localStorage.setItem("shopify_nonce", nonce);
60
- localStorage.setItem("shopify_client_id", clientId);
61
- localStorage.setItem("shopify_user_mail", userMail);
62
- localStorage.setItem("shopify_shop_id", shopId);
63
- localStorage.setItem("shopify_redirect_uri", callbackUri); //ログアウトの処理で使用する
64
-
65
- const url = new URL(
66
- `https://shopify.com/authentication/${shopId}/oauth/authorize`
67
- );
68
- url.searchParams.append("scope", "openid email customer-account-api:full");
69
- url.searchParams.append("client_id", clientId);
70
- url.searchParams.append("response_type", "code");
71
- url.searchParams.append("redirect_uri", callbackUri);
72
- url.searchParams.append("state", state);
73
- url.searchParams.append("nonce", nonce);
74
- url.searchParams.append("code_challenge", codeChallenge);
75
- url.searchParams.append("code_challenge_method", "S256");
76
-
77
- window.location.href = url.toString();
78
- }
79
-
80
- // ✅ トークンがあれば検証(Storefront API 経由で customer を取得)
81
- export async function checkCustomerLoginState() {
82
- const token = localStorage.getItem("shopify_customer_token");
83
-
84
- if (!token) return false;
85
-
86
- const checkUrl = "/wp-json/itmar-ec-relate/v1/shopify-login-check";
87
- const postData = {
88
- nonce: itmar_option.nonce,
89
- token: JSON.stringify({ token }),
90
- };
91
- sendRegistrationAjax(checkUrl, postData, true)
92
- .done(function (res) {
93
- console.log(res);
94
- })
95
- .fail(function (xhr, status, error) {
96
- alert("サーバーエラー: " + error);
97
- console.error(xhr.responseText);
98
- });
99
- }
100
-
101
- /**
102
- * @param {string} urlOrPath - RESTは '/itmar-shopify/v1/...' でも '/wp-json/...' でもOK。admin-ajaxは '/wp-admin/admin-ajax.php'
103
- * @param {object} data - 送信するデータ。nonce は data._wpnonce か data.nonce に入れておけばOK
104
- * @param {'auto'|'rest'|'ajax'} mode - 既定は 'auto'
105
- */
106
- export async function sendRegistrationRequest(
107
- urlOrPath,
108
- data = {},
109
- mode = "auto"
110
- ) {
111
- const isRestUrlLike = (u) =>
112
- u.startsWith("/wp-json") || !u.startsWith("/wp-admin");
113
-
114
- // 送信先の確定(RESTのときは /wp-json 省略パスでもOKにする)
115
- let isRest;
116
- if (mode === "auto") {
117
- isRest = isRestUrlLike(urlOrPath);
118
- } else {
119
- isRest = mode === "rest";
120
- }
121
-
122
- let url = urlOrPath;
123
-
124
- if (isRest) {
125
- // '/itmar-shopify/v1/...' のようなパスだけ渡されたら /wp-json を補う
126
- if (!url.startsWith("/wp-json")) {
127
- const root =
128
- (window.wpApiSettings && window.wpApiSettings.root) || "/wp-json/";
129
- url = root.replace(/\/+$/, "/") + url.replace(/^\/+/, "");
130
- }
131
- } else {
132
- // admin-ajax の既定URL
133
- if (!url) url = "/wp-admin/admin-ajax.php";
134
- }
135
-
136
- const fetchOptions = {
137
- method: "POST",
138
- credentials: "same-origin", // 同一オリジン Cookie
139
- headers: {},
140
- };
141
-
142
- // ノンス抽出(_wpnonce を優先)
143
- const nonce =
144
- data._wpnonce ||
145
- data.nonce ||
146
- (window.wpApiSettings && window.wpApiSettings.nonce);
147
-
148
- if (isRest) {
149
- fetchOptions.headers["Content-Type"] = "application/json";
150
- if (nonce) fetchOptions.headers["X-WP-Nonce"] = nonce;
151
-
152
- // nonce系は本文から除く(任意)
153
- const { _wpnonce, nonce: _legacyNonce, ...rest } = data;
154
- fetchOptions.body = JSON.stringify(rest);
155
- } else {
156
- // admin-ajax は URLSearchParams で送る
157
- const form = new URLSearchParams();
158
- Object.entries(data).forEach(([k, v]) => {
159
- if (v !== undefined && v !== null) form.append(k, String(v));
160
- });
161
- // ノンスは _wpnonce に統一
162
- if (nonce && !form.has("_wpnonce")) form.append("_wpnonce", nonce);
163
- fetchOptions.body = form;
164
- }
165
-
166
- const res = await fetch(url, fetchOptions);
167
-
168
- // WP REST はメソッド不一致・ルートなし等でも JSON 返さないことがあるので分岐
169
- const contentType = res.headers.get("content-type") || "";
170
- const tryJson = contentType.includes("application/json");
171
-
172
- if (!res.ok) {
173
- let msg = `HTTP ${res.status}`;
174
- if (tryJson) {
175
- try {
176
- const j = await res.json();
177
- msg += j.message ? `: ${j.message}` : "";
178
- } catch {}
179
- } else {
180
- const t = await res.text();
181
- if (t) msg += `: ${t.slice(0, 200)}`;
182
- }
183
- throw new Error(msg);
184
- }
185
-
186
- return tryJson ? res.json() : res.text();
187
- }
@@ -1,10 +0,0 @@
1
- //URLのバリデーションチェック
2
- export const isValidUrlWithUrlApi = (string) => {
3
- try {
4
- const cleanString = string.replace(/<[^>]+>/g, "");
5
- new URL(cleanString);
6
- return true;
7
- } catch (err) {
8
- return false;
9
- }
10
- };