Disabled contacts duplicates management for API version 1.0.0

This commit is contained in:
Michał Kurczewski
2025-12-22 18:27:35 +01:00
parent 7a96b27dc8
commit 3dc5a532a1
2 changed files with 49 additions and 11 deletions

View File

@@ -5,13 +5,18 @@
import { ApiDeviceSerialPort } from "devices/api-device/adapters"
import {
ApiConfig,
ApiDevice,
ApiDevicePaths,
ApiDeviceResponseBody,
} from "devices/api-device/models"
import { MenuGroup, MenuIndex } from "app-routing/models"
import semver from "semver/preload"
export const getApiMenuConfig = async (device: ApiDevice) => {
export const getApiMenuConfig = async (
device: ApiDevice,
config?: ApiConfig
) => {
const response = await ApiDeviceSerialPort.request(device, {
endpoint: "MENU_CONFIGURATION",
method: "GET",
@@ -24,21 +29,41 @@ export const getApiMenuConfig = async (device: ApiDevice) => {
})
return {
...response,
body: response.ok ? mapMenuConfig(response.body) : null,
body: response.ok ? mapMenuConfig(response.body, config?.apiVersion) : null,
}
}
const mapMenuConfig = (
menu: ApiDeviceResponseBody<"MENU_CONFIGURATION", "GET">
menu: ApiDeviceResponseBody<"MENU_CONFIGURATION", "GET">,
apiVersion = "1.0.0"
): MenuGroup => {
return {
index: MenuIndex.Device,
title: menu.title,
items: menu.menuItems.map((item) => {
const submenu = item.submenu?.map((submenu) => ({
title: submenu.displayName,
path: `${ApiDevicePaths.Index}/${item.feature}/${submenu.feature}`,
}))
const submenu = item.submenu
?.filter((submenu) => {
if (
item.feature === "mc-contacts" &&
submenu.feature === "mc-contacts-duplicates"
) {
return showsContactsDuplicatesManager(apiVersion)
}
return true
})
.map((submenu) => ({
title: submenu.displayName,
path: `${ApiDevicePaths.Index}/${item.feature}/${submenu.feature}`,
}))
if (submenu && submenu.length === 1) {
return {
title: item.displayName,
icon: item.icon,
path: submenu[0].path,
}
}
return {
title: item.displayName,
icon: item.icon,
@@ -48,3 +73,11 @@ const mapMenuConfig = (
}),
}
}
const showsContactsDuplicatesManager = (apiVersion?: string) => {
if (!apiVersion) {
return false
}
const minVersion = "1.0.1"
return semver.gte(apiVersion, minVersion)
}

View File

@@ -8,7 +8,7 @@ import { useQuery } from "@tanstack/react-query"
import { devicesQueryKeys } from "./devices-query-keys"
import { getApiMenuConfig } from "devices/api-device/feature"
import { ApiDeviceSerialPort } from "devices/api-device/adapters"
import { ApiDeviceErrorType } from "devices/api-device/models"
import { ApiConfig, ApiDeviceErrorType } from "devices/api-device/models"
import { MenuGroup } from "app-routing/models"
import { HarmonySerialPort } from "devices/harmony/adapters"
import { getHarmonyMenu } from "devices/harmony/feature"
@@ -16,13 +16,17 @@ import { PureSerialPort } from "devices/pure/adapters"
import { getPureMenu } from "devices/pure/feature"
import { HarmonyMscSerialPort } from "devices/harmony-msc/adapters"
import { getHarmonyMscMenu } from "devices/harmony-msc/feature"
import { useDeviceConfigQuery } from "./use-device-config.query"
const queryFn = async (device?: Device): Promise<MenuGroup | null> => {
const queryFn = async (
device?: Device,
config?: unknown
): Promise<MenuGroup | null> => {
if (!device) {
return null
}
if (ApiDeviceSerialPort.isCompatible(device)) {
const menu = await getApiMenuConfig(device)
const menu = await getApiMenuConfig(device, config as ApiConfig)
if (menu.ok) {
return menu.body
} else if (menu.status === ApiDeviceErrorType.DeviceLocked) {
@@ -44,9 +48,10 @@ const queryFn = async (device?: Device): Promise<MenuGroup | null> => {
}
export const useDeviceMenuQuery = <ErrorType = Error>(device?: Device) => {
const { data: config } = useDeviceConfigQuery(device)
return useQuery<MenuGroup | null, ErrorType>({
queryKey: useDeviceMenuQuery.queryKey(device?.id),
queryFn: () => queryFn(device),
queryFn: () => queryFn(device, config),
retry: ApiDeviceSerialPort.isCompatible(device)
? (failureCount, error) => {
return error === ApiDeviceErrorType.DeviceLocked || failureCount < 3