Skip to content

Разработка

Добавление сервисов

Давайте разберем создание на примере нового сервиса Bitcoin, который будет получать информацию из внешнего API.

1. Создание интерфейса

Первым делом обозначим интерфейс взаимодействия сервиса. Необходимо для определения дополнительных свойств:

typescript
export interface BitcoinService extends BaseService {
  options?: {
    code: string
    interval?: number
  }
}

2. Создание компонента

vue
<template>
  <ServiceBase v-bind="props">
    <template #title>
      {{ $('service.bitcoin.title', { code: options.code }) }}
    </template>
    <template #description>
      {{ $('service.bitcoin.description', { rate: data?.rate || '0' }) }}
    </template>
  </ServiceBase>
</template>

<script setup lang="ts">
import type { BitcoinService } from '~/types'

const props = defineProps<BitcoinService>()
const { data, pauseUpdate } = useServiceData<BitcoinService, { rate: string }>(props, {
  updateInterval: props?.options?.interval
})

onBeforeUnmount(pauseUpdate)
</script>

3. Написание переводов

Если в компоненте используется статическй текст, то его необходимо вынести в файл переводов. Обязательным является добавление en-US.json переводов, остальные по желанию.

json
{
  "service": {
    "bitcoin": { 
      "title": "Курс {code}", 
      "description": "Равен {rate}"
    } 
  }
}

Переводы основываются на vue-i18n. Доступны абсолютно все возможности.

4. Получение данных

typescript
import type { BitcoinService } from '~/types'

export default defineEventHandler(async (event): Promise<{ rate: string }> => {
  const service = await getService<BitcoinService>(event)

  try {
    const data = await $fetch('https://api.coindesk.com/v1/bpi/currentprice.json', {
      parseResponse: (text) => JSON.parse(text)
    })

    return {
      rate: data.bpi[service.option.code].rate
    }
  } catch (e) {
    logger.error(e)
  }

  return {
    rate: '-'
  }
})

5. Обновление документации

Не забывайте добавить сервис в документацию, чтобы другие пользователи были в курсе и могли его использовать.

Для этого создайте файлы:

  • docs/services/bitcoin.md
  • docs/{lang}/services/bitcoin.md - можно оставить пустыми

Создание темы оформления

1. Добавление CSS переменных

css
html.new-theme {
    --fg: 67 52 34;
    --fg-dimmed: 80 66 49;
    --background: 241 231 208;
}

2. Добавление в Config

typescript
export interface Config {
  title?: string
  lang: 'en' | 'ru'
  theme?: 'system' | 'light' | 'dark' | 'deep' | 'new-theme'
  services: ServicesGroup[]
  checkUpdates: boolean
}

3. Обновление документации

Не забывайте добавить new-theme в документацию, чтобы другие пользователи были в курсе вашей темы.

Для этого найтие секцию с темой оформления во всех переводах и добавьте новый параметр:

  • docs/reference/configuration.md
  • docs/{lang}/reference/configuration.md

Написание переводов

1. Создание новый языковой файл

Создайте новый файл в папке locales. Рекомендуем скопировать locales/en-US.json и на его основе сделать перевод.

2. Подключение файла

После создания языкового файла необходимо подключить его в nuxt.config.ts

typescript
export default defineNuxtConfig({
  i18n: {
    locales: [
      { 
        code: 'en', 
        iso: 'en-US', 
        name: 'English', 
        file: 'en-US.json', 
      }, 
    ],
  },
})

3. Обновление документации

Не забывайте добавить новый язык в документацию, чтобы другие пользователи были в курсе перевода.

Для этого найтие секцию с языком во всех переводах и добавьте новый параметр:

  • docs/reference/configuration.md
  • docs/{lang}/reference/configuration.md

Обновление зависимостей

В этом нет необходимости. На проекте подключен Dependabot, который раз в неделю сканирует новые зависимости. Но если все же у вас есть такая необходимость, то выполните команду yarn upgrade. После чего проверьте все, что было обновлено.

После того как вы убедитесь в работоспособности приложения, создайте новый pull request.