// file.html
<html>
<title>Этот файл отдастся "как есть"</title>
<body>
Такой способ можно использовать для верстки лендингов
</body>
</html> // serverfile.tsx
app.html('/', (ctx,req) => {
let record = await table.findOneBy(ctx, {})
return <html>
<h1>{record.title}</h1>
<div>{record.description}</div>
<p>
Такой способ можно использовать для динамических приложений
</p>
</html>
}) app.screen('/', () => {
return (
<screen title="Hello world!">
<text class="section">First screen</text>
</screen>
)
}) import {requireRealUser, requireAccountRole} from '@app/auth'
app.screen('/', () => {
requireRealUser(ctx)
return (
<screen title="Личный кабинет">
<text class="section">
Этот экран запросит авторизацию
</text>
</screen>
)
})
app.screen('/admin', () => {
requireAccountRole(ctx, 'Admin')
return (
<screen title="Админка">
<text class="section">
Экран доступен только администраторам
</text>
</screen>
)
}) // Хук, показывающий страницу с несуществующим адресом
app.accountHook('404', (ctx,params) => {
return ctx.resp.html('<h2>Такого адреса не существует</h2>')
}) import {Heap} from '@app/heap'
import {jsx} from '@app/html-jsx'
// Объявляем таблицу с двумя полями - name и age
const myTable = Heap.Table('students', {
name: Heap.String(),
age: Heap.Optional(Heap.Number()),
})
// Выводим ее записи на экран
app.get('/', async(ctx,req) => {
let records = myTable.findAll(ctx)
return <html>
<table>
{records.map( record => {
return <tr>
<td>{record.name}</td>
<td>{record.age}</td>
</tr>
})}
</table>
</html>
}) import { scheduleJobAfter } from '@app/jobs'
import {showToast} from '@app/ui'
app.screen('/', async(ctx,req) => {
<screen>
<button onClick={setAction.apiCall({})}>
Напомнить через полчаса
</button>
</screen>
})
const setAction = app.apiCall('set-alarm', () => {
await scheduleJobAfter(ctx, 30, 'min', alarmJob.path(), {})
return showToast('Задача поставлена')
})
const alarmJob = app.job('run-alarm', () => {
// здесь код, который вызовется в нужное время
})