Механизм обновления экранов через сокеты

Позволяет обновлять содержимое экрана, используя сокеты.

Использование

import { genSocketId, updateSocket } from '@app/socket'

Параметры

Имя Тип Обязательный Описание
socketName string Да Имя сокета. Используется для генерации идентификатора сокета и обновления содержимого экрана.

Описание

Критерием для использования обновления экранов через сокеты является передача в экран параметра socketIds=[]

app.screen("/", async (ctx, req) => {
  return <screen socketIds={socketIdList}></screen>
})

Функция updateSocket() отличается от refresh() тем, что механизм обновления экранов через сокеты не является действием и не требует никакого вмешательства пользователя, работая автономно.

Примеры

Простой пример

import { genSocketId, updateSocket } from '@app/socket'

app.screen('/', async (ctx, req) => {
  const socketId = await genSocketId('my-socket')

  return (
    <screen socketIds={[socketId]}>
      <section>
        <text style={{ fontSize: 30, fontWeight: 'bold', textAlign: 'center' }}>
          {Math.round(Math.random() * 1000)}
        </text>
        <button
          class={['section', 'primary']}
          onClick={updateSocketRoute.apiCall()}
        >
          Refresh via socketUpdate
        </button>
      </section>
    </screen>
  )
})

const updateSocketRoute = app.apiCall('/', async (ctx) => {
  return await updateSocket('my-socket')
})

Обновление экрана через WebHook

import { genSocketId, updateSocket } from '@app/socket'
import { Heap } from "@app/heap"

const socketName = "webhookSocket"
const BgColor = Heap.Table("BgColor", {
  color: Heap.String()
})

const getColor = async () => {
  return (await BgColor.findAll(ctx, {
    order: { createdAt: "desc" },
    limit: 1
  }))[0]
}

app.post("/getNewColor", async (ctx, req) => {
  const newColor = req.body.bgColor
  const color = await getColor()

  if (color) {
    await BgColor.update(ctx, {
      id: color.id,
      color: newColor
    })
  } else {
    await BgColor.create(ctx, {
      color: newColor
    })
  }

  await updateSocket(socketName)
})

app.screen('/', async (ctx, req) => {
  const socketId = await genSocketId(socketName)
  const color = await getColor()

  return (
    <screen socketIds={[socketId]}>
      <box style={{ backgroundColor: color }}>
        <text>Фоновый цвет этого блока обновляется по вебхуку в реальном времени</text>
      </box>
    </screen>
  )
})
❤️ Сделано на Чатиуме© 2019–2026