{"version":3,"file":"TimeZonePicker.mjs","sources":["../../../../src/components/DateTimePickers/TimeZonePicker.tsx"],"sourcesContent":["import { useMemo, useCallback } from 'react';\n\nimport {\n  type SelectableValue,\n  getTimeZoneInfo,\n  type TimeZoneInfo,\n  getTimeZoneGroups,\n  type GroupedTimeZones,\n  type TimeZone,\n  InternalTimeZones,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\n\nimport { Select } from '../Select/Select';\n\nimport { TimeZoneGroup } from './TimeZonePicker/TimeZoneGroup';\nimport { formatUtcOffset } from './TimeZonePicker/TimeZoneOffset';\nimport { CompactTimeZoneOption, WideTimeZoneOption, type SelectableZone } from './TimeZonePicker/TimeZoneOption';\nimport { getTimeZoneTitle } from './TimeZonePicker/TimeZoneTitle';\n\nexport interface Props {\n  onChange: (timeZone?: TimeZone) => void;\n  value?: TimeZone;\n  width?: number;\n  autoFocus?: boolean;\n  onBlur?: () => void;\n  includeInternal?: boolean | InternalTimeZones[];\n  disabled?: boolean;\n  inputId?: string;\n  menuShouldPortal?: boolean;\n  openMenuOnFocus?: boolean;\n}\n\n/**\n * https://developers.grafana.com/ui/latest/index.html?path=/docs/date-time-pickers-timezonepicker--docs\n */\nexport const TimeZonePicker = (props: Props) => {\n  const {\n    onChange,\n    width,\n    autoFocus = false,\n    onBlur,\n    value,\n    includeInternal = false,\n    disabled = false,\n    inputId,\n    menuShouldPortal = true,\n    openMenuOnFocus = false,\n  } = props;\n  const groupedTimeZones = useTimeZones(includeInternal);\n  const selected = useSelectedTimeZone(groupedTimeZones, value);\n  const filterBySearchIndex = useFilterBySearchIndex();\n  const TimeZoneOption = width && width <= 45 ? CompactTimeZoneOption : WideTimeZoneOption;\n\n  const onChangeTz = useCallback(\n    (selectable: SelectableValue<string>) => {\n      if (!selectable || typeof selectable.value !== 'string') {\n        return onChange(value);\n      }\n      onChange(selectable.value);\n    },\n    [onChange, value]\n  );\n\n  return (\n    <Select\n      inputId={inputId}\n      value={selected}\n      placeholder={t('time-picker.zone.select-search-input', 'Type to search (country, city, abbreviation)')}\n      autoFocus={autoFocus}\n      menuShouldPortal={menuShouldPortal}\n      openMenuOnFocus={openMenuOnFocus}\n      width={width}\n      filterOption={filterBySearchIndex}\n      options={groupedTimeZones}\n      onChange={onChangeTz}\n      onBlur={onBlur}\n      components={{ Option: TimeZoneOption, Group: TimeZoneGroup }}\n      disabled={disabled}\n      aria-label={t('time-picker.zone.select-aria-label', 'Time zone picker')}\n    />\n  );\n};\n\ninterface SelectableZoneGroup extends SelectableValue<string> {\n  options: SelectableZone[];\n}\n\nconst useTimeZones = (includeInternal: boolean | InternalTimeZones[]): SelectableZoneGroup[] => {\n  const now = Date.now();\n\n  const timeZoneGroups = useMemo(() => {\n    return getTimeZoneGroups(includeInternal).map((group: GroupedTimeZones) => {\n      const options = group.zones.reduce((options: SelectableZone[], zone) => {\n        const info = getTimeZoneInfo(zone, now);\n\n        if (!info) {\n          return options;\n        }\n\n        const name = getTimeZoneTitle(info);\n\n        options.push({\n          label: name,\n          value: info.zone,\n          searchIndex: getSearchIndex(name, info, now),\n        });\n\n        return options;\n      }, []);\n\n      return {\n        label: group.name,\n        options,\n      };\n    });\n  }, [includeInternal, now]);\n\n  return timeZoneGroups;\n};\n\nconst useSelectedTimeZone = (\n  groups: SelectableZoneGroup[],\n  timeZone: TimeZone | undefined\n): SelectableZone | undefined => {\n  return useMemo(() => {\n    if (timeZone === undefined) {\n      return undefined;\n    }\n\n    const tz = timeZone?.toLowerCase() ?? '';\n\n    const group = groups.find((group) => {\n      if (!group.label) {\n        return isInternal(tz);\n      }\n      return tz.startsWith(group.label.toLowerCase());\n    });\n\n    return group?.options.find((option) => {\n      if (tz === '') {\n        return option.value === InternalTimeZones.default;\n      }\n      return option.value?.toLowerCase() === tz;\n    });\n  }, [groups, timeZone]);\n};\n\nconst isInternal = (timeZone: TimeZone): boolean => {\n  switch (timeZone) {\n    case InternalTimeZones.default:\n    case InternalTimeZones.localBrowserTime:\n    case InternalTimeZones.utc:\n      return true;\n\n    default:\n      return false;\n  }\n};\n\nconst useFilterBySearchIndex = () => {\n  return useCallback((option: SelectableValue, searchQuery: string) => {\n    if (!searchQuery || !option.data || !option.data.searchIndex) {\n      return true;\n    }\n    return option.data.searchIndex.indexOf(searchQuery.toLowerCase()) > -1;\n  }, []);\n};\n\nconst getSearchIndex = (label: string, info: TimeZoneInfo, timestamp: number): string => {\n  const parts: string[] = [\n    info.zone.toLowerCase(),\n    info.abbreviation.toLowerCase(),\n    formatUtcOffset(timestamp, info.zone).toLowerCase(),\n  ];\n\n  if (label !== info.zone) {\n    parts.push(label.toLowerCase());\n  }\n\n  for (const country of info.countries) {\n    parts.push(country.name.toLowerCase());\n    parts.push(country.code.toLowerCase());\n  }\n\n  return parts.join('|');\n};\n"],"names":["options","group","_a"],"mappings":"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"}