@samitouri / QOSami-HFS / commits / efbaa8d4

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