CI: sync from GitHub
Browse files- frontend/src/ui/App.jsx +24 -1
- frontend/src/useStore.js +4 -3
frontend/src/ui/App.jsx
CHANGED
|
@@ -7,6 +7,7 @@ function useImage(url){ const [i,set]=React.useState(null); React.useEffect(()=>
|
|
| 7 |
export default function App(){
|
| 8 |
const s = useStore()
|
| 9 |
const d = s.details[s.active]
|
|
|
|
| 10 |
const img = useImage(d.previewUrl)
|
| 11 |
return (
|
| 12 |
<div style={{display:'grid',gridTemplateColumns:'280px 1fr',minHeight:'100vh'}}>
|
|
@@ -33,8 +34,30 @@ export default function App(){
|
|
| 33 |
<label htmlFor="file" style={{padding:'8px 12px',background:'#2563eb',display:'inline-block',borderRadius:8,cursor:'pointer'}}>Upload / Spread</label>
|
| 34 |
</div>
|
| 35 |
<div style={{marginTop:12}}>
|
| 36 |
-
<button onClick={
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
</div>
|
| 39 |
<div style={{display:'grid',placeItems:'center'}}>
|
| 40 |
{!img ? <label style={{border:'2px dashed #3a4251',padding:40,borderRadius:12,cursor:'pointer'}}>
|
|
|
|
| 7 |
export default function App(){
|
| 8 |
const s = useStore()
|
| 9 |
const d = s.details[s.active]
|
| 10 |
+
const orderInfo = s.lastOrderInfo
|
| 11 |
const img = useImage(d.previewUrl)
|
| 12 |
return (
|
| 13 |
<div style={{display:'grid',gridTemplateColumns:'280px 1fr',minHeight:'100vh'}}>
|
|
|
|
| 34 |
<label htmlFor="file" style={{padding:'8px 12px',background:'#2563eb',display:'inline-block',borderRadius:8,cursor:'pointer'}}>Upload / Spread</label>
|
| 35 |
</div>
|
| 36 |
<div style={{marginTop:12}}>
|
| 37 |
+
<button onClick={async ()=>{
|
| 38 |
+
try {
|
| 39 |
+
await s.startOrder()
|
| 40 |
+
} catch (err) {
|
| 41 |
+
console.error(err)
|
| 42 |
+
alert(err.message || String(err))
|
| 43 |
+
}
|
| 44 |
+
}}>Order</button>
|
| 45 |
</div>
|
| 46 |
+
{orderInfo?.mockups?.length ? (
|
| 47 |
+
<div style={{marginTop:12, padding:12, border:'1px solid #2563eb', borderRadius:8}}>
|
| 48 |
+
<div style={{fontWeight:600, marginBottom:8}}>Mockups:</div>
|
| 49 |
+
<ul style={{margin:0, paddingLeft:20}}>
|
| 50 |
+
{orderInfo.mockups.map((url, idx)=>(
|
| 51 |
+
<li key={url+idx}><a href={url} target="_blank" rel="noreferrer">{url}</a></li>
|
| 52 |
+
))}
|
| 53 |
+
</ul>
|
| 54 |
+
{orderInfo.mockups_dir ? (
|
| 55 |
+
<div style={{marginTop:8}}>
|
| 56 |
+
<a href={orderInfo.mockups_dir} target="_blank" rel="noreferrer">Open mockups folder</a>
|
| 57 |
+
</div>
|
| 58 |
+
) : null}
|
| 59 |
+
</div>
|
| 60 |
+
) : null}
|
| 61 |
</div>
|
| 62 |
<div style={{display:'grid',placeItems:'center'}}>
|
| 63 |
{!img ? <label style={{border:'2px dashed #3a4251',padding:40,borderRadius:12,cursor:'pointer'}}>
|
frontend/src/useStore.js
CHANGED
|
@@ -37,6 +37,7 @@ const useStore = create((set, get) => ({
|
|
| 37 |
sleeveR: createInitialDetail(),
|
| 38 |
},
|
| 39 |
uploadedPath: null,
|
|
|
|
| 40 |
busy: false,
|
| 41 |
lastPreviewUrls: null,
|
| 42 |
lastOrderInfo: null,
|
|
@@ -100,8 +101,8 @@ const useStore = create((set, get) => ({
|
|
| 100 |
async upload(file) {
|
| 101 |
set({ busy: true });
|
| 102 |
try {
|
| 103 |
-
const { path } = await postFile("/api/upload", file);
|
| 104 |
-
set({ uploadedPath: path });
|
| 105 |
return path;
|
| 106 |
} finally {
|
| 107 |
set({ busy: false });
|
|
@@ -186,4 +187,4 @@ const useStore = create((set, get) => ({
|
|
| 186 |
},
|
| 187 |
}));
|
| 188 |
|
| 189 |
-
export default useStore;
|
|
|
|
| 37 |
sleeveR: createInitialDetail(),
|
| 38 |
},
|
| 39 |
uploadedPath: null,
|
| 40 |
+
uploadedUrl: null,
|
| 41 |
busy: false,
|
| 42 |
lastPreviewUrls: null,
|
| 43 |
lastOrderInfo: null,
|
|
|
|
| 101 |
async upload(file) {
|
| 102 |
set({ busy: true });
|
| 103 |
try {
|
| 104 |
+
const { path, url } = await postFile("/api/upload", file);
|
| 105 |
+
set({ uploadedPath: path, uploadedUrl: url });
|
| 106 |
return path;
|
| 107 |
} finally {
|
| 108 |
set({ busy: false });
|
|
|
|
| 187 |
},
|
| 188 |
}));
|
| 189 |
|
| 190 |
+
export default useStore;
|