itmar-block-packages 1.10.1 → 2.0.1
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/README.md +1445 -1369
- package/build/cjs/AnimationBlock.js +107 -0
- package/build/cjs/AnimationBlock.js.map +1 -0
- package/build/cjs/BlockEditWrapper.js +20 -0
- package/build/cjs/BlockEditWrapper.js.map +1 -0
- package/build/cjs/BlockPlace.js +509 -0
- package/build/cjs/BlockPlace.js.map +1 -0
- package/build/cjs/BrockInserter.js +204 -0
- package/build/cjs/BrockInserter.js.map +1 -0
- package/build/cjs/DateElm.js +321 -0
- package/build/cjs/DateElm.js.map +1 -0
- package/build/cjs/DraggableBox.js +143 -0
- package/build/cjs/DraggableBox.js.map +1 -0
- package/build/cjs/GridControls.js +421 -0
- package/build/cjs/GridControls.js.map +1 -0
- package/build/cjs/IconSelectControl.js +167 -0
- package/build/cjs/IconSelectControl.js.map +1 -0
- package/build/cjs/JapaneseHolidays.js +99 -0
- package/build/cjs/JapaneseHolidays.js.map +1 -0
- package/build/cjs/MasonryControl.js +124 -0
- package/build/cjs/MasonryControl.js.map +1 -0
- package/build/cjs/PseudoElm.js +66 -0
- package/build/cjs/PseudoElm.js.map +1 -0
- package/build/cjs/ShadowStyle.js +453 -0
- package/build/cjs/ShadowStyle.js.map +1 -0
- package/build/cjs/SwiperControl.js +267 -0
- package/build/cjs/SwiperControl.js.map +1 -0
- package/build/cjs/ToggleElement.js +17 -0
- package/build/cjs/ToggleElement.js.map +1 -0
- package/build/cjs/TypographyControls.js +151 -0
- package/build/cjs/TypographyControls.js.map +1 -0
- package/build/cjs/UpdateAllPostsBlockAttributes.js +137 -0
- package/build/cjs/UpdateAllPostsBlockAttributes.js.map +1 -0
- package/build/cjs/ZipAddress.js +34 -0
- package/build/cjs/ZipAddress.js.map +1 -0
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js +117 -0
- package/build/cjs/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/build/cjs/blockStore.js +65 -0
- package/build/cjs/blockStore.js.map +1 -0
- package/build/cjs/cssPropertes.js +157 -0
- package/build/cjs/cssPropertes.js.map +1 -0
- package/build/cjs/customFooks.js +300 -0
- package/build/cjs/customFooks.js.map +1 -0
- package/build/cjs/formatCreate.js +160 -0
- package/build/cjs/formatCreate.js.map +1 -0
- package/build/cjs/hslToRgb.js +133 -0
- package/build/cjs/hslToRgb.js.map +1 -0
- package/build/cjs/index.js +115 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/mediaUpload.js +182 -0
- package/build/cjs/mediaUpload.js.map +1 -0
- package/build/cjs/node_modules/nanoid/index.js +30 -0
- package/build/cjs/node_modules/nanoid/index.js.map +1 -0
- package/build/cjs/node_modules/nanoid/url-alphabet/index.js +7 -0
- package/build/cjs/node_modules/nanoid/url-alphabet/index.js.map +1 -0
- package/build/cjs/shopfiApi.js +188 -0
- package/build/cjs/shopfiApi.js.map +1 -0
- package/build/cjs/validationCheck.js +15 -0
- package/build/cjs/validationCheck.js.map +1 -0
- package/build/cjs/wordpressApi.js +631 -0
- package/build/cjs/wordpressApi.js.map +1 -0
- package/build/esm/AnimationBlock.js +102 -0
- package/build/esm/AnimationBlock.js.map +1 -0
- package/build/esm/BlockEditWrapper.js +16 -0
- package/build/esm/BlockEditWrapper.js.map +1 -0
- package/build/esm/BlockPlace.js +503 -0
- package/build/esm/BlockPlace.js.map +1 -0
- package/build/esm/BrockInserter.js +202 -0
- package/build/esm/BrockInserter.js.map +1 -0
- package/build/esm/DateElm.js +309 -0
- package/build/esm/DateElm.js.map +1 -0
- package/build/esm/DraggableBox.js +138 -0
- package/build/esm/DraggableBox.js.map +1 -0
- package/build/esm/GridControls.js +417 -0
- package/build/esm/GridControls.js.map +1 -0
- package/build/esm/IconSelectControl.js +163 -0
- package/build/esm/IconSelectControl.js.map +1 -0
- package/build/esm/JapaneseHolidays.js +97 -0
- package/build/esm/JapaneseHolidays.js.map +1 -0
- package/{src → build/esm}/MasonryControl.js +120 -125
- package/build/esm/MasonryControl.js.map +1 -0
- package/build/esm/PseudoElm.js +61 -0
- package/build/esm/PseudoElm.js.map +1 -0
- package/build/esm/ShadowStyle.js +448 -0
- package/build/esm/ShadowStyle.js.map +1 -0
- package/{src → build/esm}/SwiperControl.js +265 -265
- package/build/esm/SwiperControl.js.map +1 -0
- package/build/esm/ToggleElement.js +13 -0
- package/build/esm/ToggleElement.js.map +1 -0
- package/build/esm/TypographyControls.js +147 -0
- package/build/esm/TypographyControls.js.map +1 -0
- package/build/esm/UpdateAllPostsBlockAttributes.js +133 -0
- package/build/esm/UpdateAllPostsBlockAttributes.js.map +1 -0
- package/build/esm/ZipAddress.js +32 -0
- package/build/esm/ZipAddress.js.map +1 -0
- package/build/esm/_virtual/_rollupPluginBabelHelpers.js +107 -0
- package/build/esm/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
- package/build/esm/blockStore.js +60 -0
- package/build/esm/blockStore.js.map +1 -0
- package/build/esm/cssPropertes.js +144 -0
- package/build/esm/cssPropertes.js.map +1 -0
- package/{src → build/esm}/customFooks.js +290 -337
- package/build/esm/customFooks.js.map +1 -0
- package/build/esm/formatCreate.js +157 -0
- package/build/esm/formatCreate.js.map +1 -0
- package/build/esm/hslToRgb.js +129 -0
- package/build/esm/hslToRgb.js.map +1 -0
- package/build/esm/index.js +27 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/mediaUpload.js +176 -0
- package/build/esm/mediaUpload.js.map +1 -0
- package/build/esm/node_modules/nanoid/index.js +27 -0
- package/build/esm/node_modules/nanoid/index.js.map +1 -0
- package/build/esm/node_modules/nanoid/url-alphabet/index.js +5 -0
- package/build/esm/node_modules/nanoid/url-alphabet/index.js.map +1 -0
- package/build/esm/shopfiApi.js +184 -0
- package/build/esm/shopfiApi.js.map +1 -0
- package/build/esm/validationCheck.js +13 -0
- package/build/esm/validationCheck.js.map +1 -0
- package/build/esm/wordpressApi.js +618 -0
- package/build/esm/wordpressApi.js.map +1 -0
- package/package.json +22 -6
- package/build/index.asset.php +0 -1
- package/build/index.js +0 -25
- package/css/editor.css +0 -23
- package/css/editor.css.map +0 -1
- package/img/animation.png +0 -0
- package/img/blockplace.png +0 -0
- package/img/grid.png +0 -0
- package/img/iconControl.png +0 -0
- package/img/pseudo.png +0 -0
- package/img/shadow.png +0 -0
- package/img/typography.png +0 -0
- package/src/AnimationBlock.js +0 -112
- package/src/BlockEditWrapper.js +0 -11
- package/src/BlockPlace.js +0 -904
- package/src/BrockInserter.js +0 -247
- package/src/DateElm.js +0 -354
- package/src/DraggableBox.js +0 -143
- package/src/GridControls.js +0 -462
- package/src/IconSelectControl.js +0 -186
- package/src/PseudoElm.js +0 -54
- package/src/ShadowStyle.js +0 -520
- package/src/ToggleElement.js +0 -18
- package/src/TypographyControls.js +0 -145
- package/src/UpdateAllPostsBlockAttributes.js +0 -127
- package/src/ZipAddress.js +0 -35
- package/src/blockStore.js +0 -75
- package/src/cssPropertes.js +0 -212
- package/src/formatCreate.js +0 -179
- package/src/hslToRgb.js +0 -162
- package/src/index.js +0 -131
- package/src/mediaUpload.js +0 -178
- package/src/shopfiApi.js +0 -187
- package/src/validationCheck.js +0 -10
- package/src/wordpressApi.js +0 -707
- 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";
|
package/src/mediaUpload.js
DELETED
|
@@ -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
|
-
}
|