admin: "automatic" base address option
Massimo Melina committed
Aug 23, 2023 at 11:55 UTC
efbaa8d441bcc0fb13f81e227ae943c55f705e38
2 files changed
+23
-17
admin/src/FileForm.ts
+21
-14
@@ -249,10 +249,9 @@ interface LinkFieldProps extends FieldProps<string> {
249
statusApi: any // receive status from parent, to avoid asking server at each click on a file
250
}
251
function LinkField({ value, statusApi }: LinkFieldProps) {
252
- const { data: status, reload, error } = statusApi
253
- const urls: string[] = status?.suggestedUrls
254
- const base: string = status?.baseUrl
255
- const link = (base || urls?.[0] || '') + value
252
+ const { data, reload, error } = statusApi
253
+ const urls: string[] = data?.urls.https || data?.urls.http
254
+ const link = (data?.baseUrl || urls?.[0] || '') + value
255
return h(Box, { display: 'flex' },
256
!urls ? 'error' : // check data is ok
257
h(DisplayField, {
@@ -265,26 +264,35 @@ function LinkField({ value, statusApi }: LinkFieldProps) {
264
title: "Copy",
265
onClick: () => navigator.clipboard.writeText(link)
266
}),
268
- h(IconBtn, { icon: Edit, title: "Change", onClick: edit }),
267
+ h(IconBtn, { icon: Edit, title: "Change", onClick() { changeBaseUrl().then(reload) } }),
268
)
269
}),
270
)
271
+}
272
273
- function edit() {
273
+export async function changeBaseUrl() {
274
+ return new Promise(async resolve => {
275
+ const res = await apiCall('get_status')
276
+ const urls: string[] = res.urls.https || res.urls.http
277
const { close } = newDialog({
275
- title: "Change link",
278
+ title: "Base address",
279
Content() {
277
- const [v, setV] = useState(base || '')
280
+ const [v, setV] = useState(res.baseUrl || '')
281
const proto = new URL(v || urls[0]).protocol + '//'
282
const host = urls.includes(v) ? '' : v.slice(proto.length)
283
+ const check = h(Check, { sx: { ml: 2 } })
284
return h(Box, { display: 'flex', flexDirection: 'column' },
281
- h(Box, { mb: 2 }, "You can choose a different base address for your links"),
285
+ h(Box, { mb: 2 }, "Choose a base address for your links"),
286
h(MenuList, {},
287
+ h(MenuItem, {
288
+ selected: !v,
289
+ onClick: () => set(''),
290
+ }, "Automatic / None", !v && check),
291
urls.map(u => h(MenuItem, {
292
key: u,
293
selected: u === v,
294
onClick: () => set(u),
287
- }, u, u === v && h(Check, { sx: { ml: 2 } })))
295
+ }, u, u === v && check))
296
),
297
h(StringField, {
298
label: "Custom IP or domain",
@@ -306,10 +314,9 @@ function LinkField({ value, statusApi }: LinkFieldProps) {
314
icon: Save,
315
children: "Save",
316
async onClick() {
309
- if (v !== base) {
317
+ if (v !== res.baseUrl)
318
await apiCall('set_config', { values: { base_url: v } })
311
- await reload()
312
- }
319
+ resolve(v)
320
close()
321
},
322
}) ),
@@ -322,5 +329,5 @@ function LinkField({ value, statusApi }: LinkFieldProps) {
329
}
330
}
331
})
325
- }
332
+ })
333
}
\ No newline at end of file
admin/src/VfsPage.ts
+2
-3
@@ -39,10 +39,9 @@ export default function VfsPage() {
39
const isSideBreakpoint = useBreakpoint(sideBreakpoint)
40
const statusApi = useApiEx('get_status')
41
const { data: status } = statusApi
42
- const urls = useMemo(() => {
42
+ const urls = useMemo<string[]>(() => {
43
const b = status?.baseUrl
44
- const ret = _.sortBy(status?.urls.https || status?.urls.http, url => url.includes('[') && url !== b) // ipv4 first
45
- if (status) status.suggestedUrls = ret // store it for Link component
44
+ const ret = status?.urls.https || status?.urls.http
45
return b && !ret.includes(b) ? [b, ...ret] : ret
46
}, [status])
47