Fix swagger page and update swagger JSON
This commit is contained in:
parent
e14e85425e
commit
d51747ad5a
4 changed files with 328 additions and 23 deletions
|
@ -19,8 +19,41 @@
|
||||||
|
|
||||||
export const setLocale = (lang: string) => () => {
|
export const setLocale = (lang: string) => () => {
|
||||||
locale.set(lang);
|
locale.set(lang);
|
||||||
localStorage.setItem("locale", lang)
|
localStorage.setItem('locale', lang);
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getFlagEmoji = (languageCode: string): string | null => {
|
||||||
|
const flagMap: { [key: string]: string } = {
|
||||||
|
en: '🇬🇧', // English flag emoji
|
||||||
|
nl: '🇳🇱', // Dutch flag emoji
|
||||||
|
es: '🇪🇸' // Spanish flag emoji
|
||||||
|
};
|
||||||
|
|
||||||
|
// Convert the language code to lowercase for case-insensitive matching
|
||||||
|
const lowercaseCode = languageCode.toLowerCase();
|
||||||
|
|
||||||
|
// Check if the language code is in the flagMap
|
||||||
|
if (flagMap.hasOwnProperty(lowercaseCode)) {
|
||||||
|
return flagMap[lowercaseCode];
|
||||||
|
} else {
|
||||||
|
// Return null for unsupported language codes
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const getLanguageName = (languageCode: string): string | null => {
|
||||||
|
const languageNames: { [key: string]: { [key: string]: string } } = {
|
||||||
|
en: { en: 'English', nl: 'English', es: 'English' },
|
||||||
|
nl: { en: 'Nederlands', nl: 'Nederlands', es: 'Neerlandés' },
|
||||||
|
es: { en: 'Español', nl: 'Spaans', es: 'Español' }
|
||||||
|
};
|
||||||
|
|
||||||
|
const lowercaseCode = languageCode.toLowerCase();
|
||||||
|
|
||||||
|
return languageNames.hasOwnProperty(lowercaseCode)
|
||||||
|
? languageNames[lowercaseCode][lowercaseCode]
|
||||||
|
: null;
|
||||||
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<Navbar expand="md">
|
<Navbar expand="md">
|
||||||
|
@ -28,17 +61,17 @@
|
||||||
<Collapse navbar expand="md">
|
<Collapse navbar expand="md">
|
||||||
<Nav class="me-auto" navbar>
|
<Nav class="me-auto" navbar>
|
||||||
<NavItem>
|
<NavItem>
|
||||||
<NavLink href="/" active="{$page.url.pathname === ("/")}">Home</NavLink>
|
<NavLink href="/" active={$page.url.pathname === '/'}>Home</NavLink>
|
||||||
</NavItem>
|
</NavItem>
|
||||||
<NavItem>
|
<NavItem>
|
||||||
<NavLink href="/api" active="{$page.url.pathname === ("/api")}">API</NavLink>
|
<NavLink href="/api" active={$page.url.pathname === '/api'}>API</NavLink>
|
||||||
</NavItem>
|
</NavItem>
|
||||||
</Nav>
|
</Nav>
|
||||||
<Dropdown inNavbar>
|
<Dropdown inNavbar>
|
||||||
<DropdownToggle nav caret>{$locale}</DropdownToggle>
|
<DropdownToggle nav caret>{getFlagEmoji($locale)} {getLanguageName($locale)}</DropdownToggle>
|
||||||
<DropdownMenu end>
|
<DropdownMenu end>
|
||||||
{#each $locales as locale}
|
{#each $locales as locale}
|
||||||
<DropdownItem on:click={setLocale(locale)}>{locale}</DropdownItem>
|
<DropdownItem on:click={setLocale(locale)}>{getFlagEmoji(locale)} {getLanguageName(locale)}</DropdownItem>
|
||||||
{/each}
|
{/each}
|
||||||
</DropdownMenu>
|
</DropdownMenu>
|
||||||
</Dropdown>
|
</Dropdown>
|
||||||
|
|
|
@ -1,16 +1,25 @@
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { _ } from 'svelte-i18n';
|
import { _ } from 'svelte-i18n';
|
||||||
import { Col, Container, Row } from 'sveltestrap';
|
import { Col, Container, Row, Button } from 'sveltestrap';
|
||||||
|
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import * as swaggerJson from './swagger.json';
|
//import * as swaggerJson from '../../../static/swagger.json';
|
||||||
// import SwaggerUI from 'swagger-ui';
|
// import SwaggerUI from 'swagger-ui';
|
||||||
import 'swagger-ui/dist/swagger-ui.css';
|
import 'swagger-ui/dist/swagger-ui.css';
|
||||||
|
|
||||||
|
let swaggerLoaded:boolean = false;
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
SwaggerUIBundle({
|
loadSwagger();
|
||||||
spec: swaggerJson,
|
});
|
||||||
|
|
||||||
|
const loadSwagger = () => {
|
||||||
|
if (!SwaggerUIBundle)
|
||||||
|
return;
|
||||||
|
swaggerLoaded = true;
|
||||||
|
window.ui = SwaggerUIBundle({
|
||||||
|
url: '/swagger.json',
|
||||||
dom_id: '#swagger-ui-container',
|
dom_id: '#swagger-ui-container',
|
||||||
presets: [
|
presets: [
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
|
@ -18,9 +27,10 @@
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
SwaggerUIStandalonePreset
|
SwaggerUIStandalonePreset
|
||||||
],
|
],
|
||||||
// layout: "StandaloneLayout",
|
// layout: "StandaloneLayout",
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:head>
|
<svelte:head>
|
||||||
|
@ -44,8 +54,11 @@
|
||||||
crossorigin="anonymous"
|
crossorigin="anonymous"
|
||||||
referrerpolicy="no-referrer"
|
referrerpolicy="no-referrer"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</svelte:head>
|
</svelte:head>
|
||||||
|
|
||||||
<Container fluid>
|
<Container fluid class="bg-light">
|
||||||
|
<section class:invisible={swaggerLoaded}><Button on:click="{loadSwagger}">Load</Button></section>
|
||||||
<div id="swagger-ui-container" />
|
<div id="swagger-ui-container" />
|
||||||
|
|
||||||
</Container>
|
</Container>
|
||||||
|
|
|
@ -68,6 +68,26 @@
|
||||||
"description": "successful operation"
|
"description": "successful operation"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"patch": {
|
||||||
|
"tags": [
|
||||||
|
"system"
|
||||||
|
],
|
||||||
|
"summary": "Save current settings",
|
||||||
|
"requestBody": {
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"$ref": "#/components/schemas/Settings"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"responses": {
|
||||||
|
"200": {
|
||||||
|
"description": "successful operation"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"/action/pause": {
|
"/action/pause": {
|
||||||
|
@ -272,7 +292,7 @@
|
||||||
"default": true,
|
"default": true,
|
||||||
"description": "Enable over-the-air updates"
|
"description": "Enable over-the-air updates"
|
||||||
},
|
},
|
||||||
"stealFocusOnBlock": {
|
"stealFocus": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"default": false,
|
"default": false,
|
||||||
"description": "Steal focus on new block"
|
"description": "Steal focus on new block"
|
239
static/swagger.yaml
Normal file
239
static/swagger.yaml
Normal file
|
@ -0,0 +1,239 @@
|
||||||
|
openapi: 3.0.3
|
||||||
|
info:
|
||||||
|
title: BTClock API
|
||||||
|
version: '3.0'
|
||||||
|
description: BTClock V3 API
|
||||||
|
servers:
|
||||||
|
- url: /api/
|
||||||
|
paths:
|
||||||
|
/status:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- system
|
||||||
|
summary: Get current status
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/system_status:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- system
|
||||||
|
summary: Get system status
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/settings:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- system
|
||||||
|
summary: Get current settings
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- system
|
||||||
|
summary: Save current settings
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Settings'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
patch:
|
||||||
|
tags:
|
||||||
|
- system
|
||||||
|
summary: Save current settings
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/Settings'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/action/pause:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- timer
|
||||||
|
summary: Pause screen rotation
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/action/timer_restart:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- timer
|
||||||
|
summary: Restart screen rotation
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/show/screen/{id}:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- screens
|
||||||
|
summary: Set screen to show
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: id
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
default: 1
|
||||||
|
required: true
|
||||||
|
description: ID of screen to show
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/show/text/{text}:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- screens
|
||||||
|
summary: Set text to show
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: text
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
default: text
|
||||||
|
required: true
|
||||||
|
description: Text to show
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/show/custom:
|
||||||
|
post:
|
||||||
|
tags:
|
||||||
|
- screens
|
||||||
|
summary: Set text to show (advanced)
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/CustomText'
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/full_refresh:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- system
|
||||||
|
summary: Force full refresh of all displays
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/lights/{color}:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- lights
|
||||||
|
summary: Turn on LEDs with specific color
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: color
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
default: FFCC00
|
||||||
|
required: true
|
||||||
|
description: Color in RGB hex
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/lights/off:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- lights
|
||||||
|
summary: Turn LEDs off
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
/restart:
|
||||||
|
get:
|
||||||
|
tags:
|
||||||
|
- system
|
||||||
|
summary: Restart BTClock
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: successful operation
|
||||||
|
components:
|
||||||
|
schemas:
|
||||||
|
Settings:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
fetchEurPrice:
|
||||||
|
type: boolean
|
||||||
|
description: Fetch EUR price instead of USD
|
||||||
|
fgColor:
|
||||||
|
type: string
|
||||||
|
default: 16777215
|
||||||
|
description: ePaper foreground (text) color
|
||||||
|
bgColor:
|
||||||
|
type: string
|
||||||
|
default: 0
|
||||||
|
description: ePaper background color
|
||||||
|
ledTestOnPower:
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
description: Do LED test on power-on
|
||||||
|
ledFlashOnUpd:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
description: Flash LEDs on new block
|
||||||
|
mdnsEnabled:
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
description: Enable mDNS
|
||||||
|
otaEnabled:
|
||||||
|
type: boolean
|
||||||
|
default: true
|
||||||
|
description: Enable over-the-air updates
|
||||||
|
stealFocus:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
description: Steal focus on new block
|
||||||
|
mcapBigChar:
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
description: Use big characters for market cap screen
|
||||||
|
mempoolInstance:
|
||||||
|
type: string
|
||||||
|
default: mempool.space
|
||||||
|
description: Mempool.space instance to connect to
|
||||||
|
ledBrightness:
|
||||||
|
type: integer
|
||||||
|
default: 128
|
||||||
|
description: Brightness of LEDs
|
||||||
|
fullRefreshMin:
|
||||||
|
type: integer
|
||||||
|
default: 60
|
||||||
|
description: Full refresh time of ePaper displays in minutes
|
||||||
|
screen[0]:
|
||||||
|
type: boolean
|
||||||
|
screen[1]:
|
||||||
|
type: boolean
|
||||||
|
screen[2]:
|
||||||
|
type: boolean
|
||||||
|
screen[3]:
|
||||||
|
type: boolean
|
||||||
|
screen[4]:
|
||||||
|
type: boolean
|
||||||
|
screen[5]:
|
||||||
|
type: boolean
|
||||||
|
tzOffset:
|
||||||
|
type: integer
|
||||||
|
default: 60
|
||||||
|
description: Timezone offset in minutes
|
||||||
|
minSecPriceUpd:
|
||||||
|
type: integer
|
||||||
|
default: 30
|
||||||
|
description: Minimum time between price updates in seconds
|
||||||
|
timePerScreen:
|
||||||
|
type: integer
|
||||||
|
default: 30
|
||||||
|
description: Time between screens when rotating in minutes
|
||||||
|
CustomText:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
minItems: 7
|
||||||
|
maxItems: 7
|
Loading…
Reference in a new issue