{"version":3,"file":"useAppLauncher.cjs","sources":["../../../../src/components/AppHeader/hooks/useAppLauncher.ts"],"sourcesContent":["import { type ChangeEvent, useCallback, useEffect, useState } from 'react'\n\nimport type { Launcher } from '../types'\n\nexport const useAppLauncher = (baseFeatures: Array<Launcher['feature']>) => {\n  const [page, setPage] = useState<Launcher['page']>('favorite')\n  const [mode, setMode] = useState<Launcher['mode']>('default')\n  const [sortType, setSortType] = useState<Launcher['sortType']>('default')\n  const [searchQuery, setSearchQuery] = useState('')\n  const [features, setFeatures] = useState<Array<Launcher['feature']>>(\n    sortFeatures(baseFeatures, {\n      page,\n      mode,\n      sortType,\n      searchQuery,\n    }),\n  )\n\n  useEffect(() => {\n    setFeatures(\n      sortFeatures(baseFeatures, {\n        page,\n        sortType,\n        mode,\n        searchQuery,\n      }),\n    )\n  }, [baseFeatures, page, mode, sortType, searchQuery])\n\n  const changePage = useCallback((newPage: Launcher['page']) => {\n    setPage(newPage)\n    setMode('default')\n    setSearchQuery('')\n  }, [])\n\n  const changeSearchQuery = useCallback(\n    (q: string) => {\n      setSearchQuery(q)\n\n      if (mode !== 'search') {\n        setMode('search')\n      } else if (q === '') {\n        setMode('default')\n      }\n    },\n    [mode],\n  )\n\n  const onChangeSearchQuery = useCallback(\n    (e: ChangeEvent<HTMLInputElement>) => changeSearchQuery(e.currentTarget.value),\n    [changeSearchQuery],\n  )\n  const onClickClearSearchQuery = useCallback(() => {\n    // HINT: 別のスレッドにしないとドロップダウンが閉じてしまう\n    requestAnimationFrame(() => {\n      changeSearchQuery('')\n    })\n  }, [changeSearchQuery])\n\n  return {\n    features,\n    page,\n    mode,\n    sortType,\n    searchQuery,\n    changePage,\n    setSortType,\n    onChangeSearchQuery,\n    onClickClearSearchQuery,\n  }\n}\n\nconst sortFeatures = (\n  features: Array<Launcher['feature']>,\n  {\n    page,\n    sortType,\n    mode,\n    searchQuery,\n  }: {\n    page: Launcher['page']\n    sortType: Launcher['sortType']\n    mode: Launcher['mode']\n    searchQuery: string\n  },\n) => {\n  if (mode !== 'search' && page === 'favorite') {\n    const filtered = features.filter((item) => item.favorite)\n\n    // feature の position の数値の順に並び替える。position が null または undefined の場合は最後に並べる\n    return filtered.sort((a, b) => {\n      if (a.position === null || a.position === undefined) {\n        if (b.position === null || b.position === undefined) {\n          return 0\n        }\n\n        return 1\n      } else if (b.position === null || b.position === undefined) {\n        return -1\n      }\n\n      return a.position - b.position\n    })\n  }\n\n  const looseSearchQuery = normalize(searchQuery)\n  const featuresRes =\n    mode === 'search'\n      ? features.filter((feature) => looseInclude(looseSearchQuery, feature.name))\n      : [...features]\n\n  switch (sortType) {\n    case 'name/asc':\n      return featuresRes.sort((a, b) => a.name.localeCompare(b.name))\n    case 'name/desc':\n      return featuresRes.sort((a, b) => b.name.localeCompare(a.name))\n  }\n\n  return featuresRes\n}\n\nexport const looseInclude = (looseSearchQuery: string, featureName: string) =>\n  // HINT: normalizeは1文字ずつ変換処理を行う関係で思いため、変換せずにマッチするかどうかを確認する\n  featureName.includes(looseSearchQuery) || normalize(featureName).includes(looseSearchQuery)\n\n// アルファベットの大文字小文字は同じものとして扱う。カタカナとひらがなも同じものとして扱う。\nconst normalize = (str: string) =>\n  str.toLowerCase().replace(NORMALIZE_REGEX, (c) => String.fromCharCode(c.charCodeAt(0) - 0x60))\n\nconst NORMALIZE_REGEX = /[\\u30a1-\\u30f6]/g\n"],"names":["useState","useEffect","useCallback"],"mappings":"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"}