itube-specs 0.0.721 → 0.0.722

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,4 @@
1
+ /** Управляет состоянием антиадблок-доменов; предоставляет метод update для обновления данных через BFF. */
1
2
  export const useAntiadBlockDomains = () => {
2
3
  const state = useState('antiadblock-domains', () => ({
3
4
  data: null,
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Оборачивает API-метод в реактивные состояния loading, error, data.
3
+ * @param apiMethod - асинхронная функция API
4
+ * @param isGet - если true, результат сохраняется в data и опционально в useState по ключу key
5
+ */
1
6
  export function useApiAction<T extends any[], R>(
2
7
  apiMethod: (...args: T) => Promise<R>,
3
8
  isGet = false,
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Возвращает функцию fetchData, вызывающую apiMethod и сохраняющую результат в useState по ключу key.
3
+ * В отличие от useApiFetcher, не кеширует данные — подходит для запросов, требующих свежего состояния.
4
+ * @param key - ключ для useState (null — не сохранять)
5
+ * @param apiMethod - асинхронная функция API
6
+ * @param apiArgs - аргументы для apiMethod
7
+ */
1
8
  export function useApiFetcherNoCache<T>(
2
9
  key: string | null,
3
10
  apiMethod: (...args: any[]) => Promise<T>,
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Возвращает функцию fetchData, вызывающую apiMethod с переданными аргументами и оборачивающую ошибки в createError.
3
+ * @param key - ключ для идентификации запроса в сообщении об ошибке
4
+ * @param apiMethod - асинхронная функция API
5
+ * @param apiArgs - аргументы для apiMethod
6
+ */
1
7
  export function useApiFetcher<T>(
2
8
  key: string | null,
3
9
  apiMethod: (...args: any[]) => Promise<T>,
@@ -1,5 +1,6 @@
1
1
  import { EAuthSteps } from '../runtime';
2
2
 
3
+ /** Управляет состоянием попапа авторизации: открытие на нужном шаге EAuthSteps, закрытие, дополнительный текст. */
3
4
  export const useAuthPopup = () => {
4
5
  const isAuthPopupOpen = useState('auth-popup-open', () => false);
5
6
  const currentStep = useState<EAuthSteps>('auth-popup-step', () => EAuthSteps.Registration);
@@ -1,5 +1,6 @@
1
1
  export const FAVORITES_KEY = 'favorites';
2
2
 
3
+ /** Управляет состоянием плейлиста избранного: id, первое видео и вычисляемая ссылка на плейлист. */
3
4
  export const useFavorites = () => {
4
5
  const favoritesId = useState<string | null>('favorites-playlist-id', () => null);
5
6
  const favoritesFirstVideoId = useState<string | null>('favorites-first-video-id', () => null);
@@ -1,6 +1,11 @@
1
1
  import type { IFilterScheme, IGroupCategories } from '../types';
2
2
  import { convertString } from '../runtime';
3
3
 
4
+ /**
5
+ * Строит вычисляемую схему фильтров из группированных категорий.
6
+ * @param t - функция перевода (i18n)
7
+ * @param groupsCategories - массив групп категорий
8
+ */
4
9
  export const useFilterScheme = (t, groupsCategories: IGroupCategories[] | null) => {
5
10
  const getFilterSchemeCategories = (): IFilterScheme[] => {
6
11
  return groupsCategories?.map((item) => ({
@@ -1,3 +1,8 @@
1
+ /**
2
+ * Форматирует Unix timestamp (в секундах) в относительную строку: «сегодня», «вчера», «3 дня назад» и т.д.
3
+ * @param t - функция перевода (i18n)
4
+ * @param time - Unix timestamp в секундах
5
+ */
1
6
  export const useFormatTimeAgo = (t, time: number) => {
2
7
  const pastDate = new Date(time * 1000);
3
8
  const now = new Date();
@@ -1,5 +1,6 @@
1
1
  import type { ELanguage, ENiche } from '~/runtime';
2
2
 
3
+ /** Возвращает generateLink — генерирует путь с учётом текущей ниши и локали. */
3
4
  export const useGenerateLink = () => {
4
5
  const niche = useState<string>('niche');
5
6
  const localePath = useLocalePath();
@@ -1,5 +1,6 @@
1
1
  import { useRoute } from 'vue-router';
2
2
 
3
+ /** Возвращает имя текущего маршрута без суффикса локали (___en, ___ru и т.д.). */
3
4
  export function useGetPureRouteName() {
4
5
  return String(useRoute()?.name)?.replace(/___[a-zA-Z-]+$/, '') || '';
5
6
  }
@@ -2,6 +2,12 @@ import { getMultipleQuery } from '../runtime';
2
2
  import type { ISelectItem } from '../types';
3
3
  import type { RouteLocationNormalized, RouteLocationNormalizedLoaded } from 'vue-router';
4
4
 
5
+ /**
6
+ * Формирует объект параметров запроса фильтра видео из query текущего маршрута.
7
+ * @param route - текущий маршрут
8
+ * @param selectDurationItems - элементы выбора длительности
9
+ * @param selectAddedItems - элементы выбора даты добавления
10
+ */
5
11
  export function useGetVideosFilterRequest(route: RouteLocationNormalized | RouteLocationNormalizedLoaded, selectDurationItems: ISelectItem[], selectAddedItems: ISelectItem[]) {
6
12
  // Распарсим categories из query, если есть
7
13
  const rawCategories = route.query.categories
@@ -16,6 +16,7 @@ function preventTouchScroll(e: TouchEvent) {
16
16
  }
17
17
  }
18
18
 
19
+ /** Управляет глобальной блокировкой прокрутки с счётчиком вложенности; корректно блокирует тач-скролл на мобильных. */
19
20
  export function useGlobalScrollLock() {
20
21
  const lockCount = useState('global-scroll-lock-count', () => 0);
21
22
 
@@ -1,3 +1,4 @@
1
+ /** Возвращает код текущей локали с учётом алиасов (zh → ch). */
1
2
  export const useLang = () => {
2
3
  const lang = useI18n().locale.value;
3
4
  const anotherCode: Record<string, string> = {
@@ -3,6 +3,17 @@ import type { Ref } from 'vue';
3
3
  import { useRoute } from 'vue-router';
4
4
  import type { IChipsItem } from '../types';
5
5
 
6
+ /**
7
+ * Генерирует реактивные meta (title, description) и h1 с учётом сортировки, страницы и i18n-ключей.
8
+ * @param t - функция перевода (i18n)
9
+ * @param page - ключ страницы для i18n (например 'videos', 'models')
10
+ * @param brandName - название бренда для подстановки в мета
11
+ * @param sortOptions - опции сортировки (если есть)
12
+ * @param text - основной текст (slug, имя и т.д.)
13
+ * @param secondText - второй подставляемый текст
14
+ * @param thirdText - третий подставляемый текст
15
+ * @param fourthText - четвёртый подставляемый текст
16
+ */
6
17
  export function useMeta(t, page: string, brandName: string, sortOptions?: IChipsItem[], text?: Ref<string>, secondText?: Ref<string>, thirdText?: Ref<string>, fourthText?: Ref<string>) {
7
18
  const route = useRoute();
8
19
 
@@ -3,6 +3,12 @@ import type { LocationQuery } from '#vue-router'
3
3
  import { getMonth } from '../runtime'
4
4
  import type { Ref } from 'vue';
5
5
 
6
+ /**
7
+ * Формирует вычисляемый список чипсов из активных filter_* параметров в query маршрута.
8
+ * @param filters - список схем фильтров модели
9
+ * @param route - текущий маршрут с query
10
+ * @param t - функция перевода (i18n)
11
+ */
6
12
  export function useFilterChipsItems(
7
13
  filters: Ref<IModelFilter[]>,
8
14
  route: { query: LocationQuery },
@@ -2,6 +2,7 @@ import type { Ref } from 'vue';
2
2
  import type { IVideoData, IVideoCard } from '../types';
3
3
  import { EAuthSteps } from '../runtime';
4
4
 
5
+ /** Управляет состоянием попапа добавления видео в плейлист; при неавторизованном пользователе открывает попап авторизации. */
5
6
  export const usePlaylistAdd = () => {
6
7
  const videoCard = useState<IVideoCard | IVideoData | null>('playlist-add-card', () => null);
7
8
  const isPlaylistAdd = useState('playlist-add-open', () => false);
@@ -1,6 +1,7 @@
1
1
  import { EPlaylistStep } from '../runtime';
2
2
  import type { IVideoCard, IPlaylistCard } from '../types';
3
3
 
4
+ /** Управляет состоянием попапа редактирования плейлиста: шаги EPlaylistStep, выбранный плейлист, возврат назад. */
4
5
  export const usePlaylistEdit = () => {
5
6
  const deletedVideo = useState<IVideoCard | null | undefined>('playlist-edit-deleted-video', () => null);
6
7
  const selectedPlaylist = useState<IPlaylistCard | undefined>('playlist-edit-selected', () => undefined);
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useRuntimeConfig } from '#imports';
4
4
 
5
+ /** Управляет загрузкой reCAPTCHA v3 и получением токенов; загружает скрипт лениво при первом вызове initRecaptcha. */
5
6
  export function useRecaptcha() {
6
7
  let recaptchaLoaded = false;
7
8
  let siteKey: string | null = null;
@@ -1,5 +1,6 @@
1
1
  import type { IVideoCard } from '../types';
2
2
 
3
+ /** Управляет состоянием попапа жалобы на видео. */
3
4
  export const useReportPopup = () => {
4
5
  const isReportPopupOpen = useState('report-popup-open', () => false);
5
6
  const reportedVideoCard = useState<IVideoCard>('report-popup-card', () => ({} as IVideoCard));
@@ -5,6 +5,13 @@ type I18nMock = {
5
5
 
6
6
  type LocalePathMock = (path: string, localeCode: string) => string;
7
7
 
8
+ /**
9
+ * Генерирует canonical URL и hreflang alternate-ссылки для всех локалей с сохранением допустимых query-параметров.
10
+ * @param baseDomain - базовый домен (например 'https://example.com')
11
+ * @param alonePage - если true, параметр sort исключается из URL
12
+ * @param i18n - объект i18n с locale и locales
13
+ * @param localePath - функция для генерации пути с локалью
14
+ */
8
15
  export const useSeoLinks = (baseDomain: string, alonePage: boolean = false, i18n: I18nMock, localePath: LocalePathMock) => {
9
16
  const route = useRoute();
10
17
 
@@ -1,6 +1,10 @@
1
1
  import { useRoute } from 'vue-router';
2
2
  import { convertString } from '../runtime';
3
3
 
4
+ /**
5
+ * Возвращает вычисляемый slug из параметров маршрута, декодированный через fromSlug.
6
+ * @param value - имя параметра маршрута (по умолчанию 'slug')
7
+ */
4
8
  export function useSlug(value = 'slug') {
5
9
  const route = useRoute();
6
10
 
@@ -5,6 +5,7 @@ const ERROR_TIME = 4000;
5
5
 
6
6
  let _timeoutClosure: null | ReturnType<typeof setTimeout> = null;
7
7
 
8
+ /** Управляет состоянием snackbar-уведомления: показ ошибки, сброс, тема, иконка и таймер. */
8
9
  export const useSnackbar = () => {
9
10
  const snackbarIcon = useState('snackbar-icon', () => 'check');
10
11
  const snackbarText = useState('snackbar-text', () => '');
@@ -1,5 +1,6 @@
1
1
  const imperialCountries = new Set(['us', 'lr', 'mm']);
2
2
 
3
+ /** Возвращает текущую систему мер (metric/imperial) и список скрытых параметров; сохраняет выбор в localStorage. */
3
4
  export function useUnits() {
4
5
  const clientCountryCode = useState<string>('clientCountryCode', () => '');
5
6
  const savedUnits = import.meta.client ? localStorage.getItem('units') : null;
@@ -18,6 +18,10 @@ function omit<T extends object, K extends keyof T>(obj: T, keys: K[]): Omit<T, K
18
18
  return result;
19
19
  }
20
20
 
21
+ /**
22
+ * Управляет авторизацией и профилем пользователя: регистрация, вход, выход, смена пароля/email, обновление профиля.
23
+ * @param apiService - сервис для API-запросов
24
+ */
21
25
  export const useUser = (apiService) => {
22
26
  const { snackbarText, snackbarTheme, showErrorSnack } = useSnackbar();
23
27
  const register = async (form: IRegistrateForm) => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "itube-specs",
3
3
  "type": "module",
4
- "version": "0.0.721",
4
+ "version": "0.0.722",
5
5
  "main": "./nuxt.config.ts",
6
6
  "types": "./types/index.d.ts",
7
7
  "scripts": {