extensions.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. !function () {
  2. const ENGLISH_DISPLAY_NAMES = new Intl.DisplayNames(["en"], { type: "language" });
  3. function simpleLanguageName(language) {
  4. return language === "all" ? "All" : ENGLISH_DISPLAY_NAMES.of(language);
  5. }
  6. function languageName(language) {
  7. if (language === "all") {
  8. return "All";
  9. }
  10. if (language === "en") {
  11. return "English"
  12. }
  13. const localDisplayNames = new Intl.DisplayNames([language], { type: "language" });
  14. return `${ENGLISH_DISPLAY_NAMES.of(language)} - ${localDisplayNames.of(language)}`;
  15. }
  16. const LoadingStatus = {
  17. Loading: "loading",
  18. Loaded: "loaded",
  19. Error: "error",
  20. }
  21. const NsfwOption = {
  22. All: "all",
  23. Safe: "safe",
  24. Nsfw: "nsfw",
  25. }
  26. document.addEventListener("alpine:init", () => {
  27. Alpine.data("extensionList", () => ({
  28. LoadingStatus,
  29. NsfwOption,
  30. simpleLanguageName,
  31. languageName,
  32. extensions: [],
  33. languages: [],
  34. loading: LoadingStatus.Loading,
  35. filtered: [],
  36. query: "",
  37. selectedLanguages: [],
  38. nsfw: NsfwOption.All,
  39. async init() {
  40. try {
  41. const index = await fetch("../index.min.json").then((e) => e.json());
  42. this.extensions = index.sort((a, b) => {
  43. if ("all" === a.lang && "all" !== b.lang) {
  44. return -1;
  45. }
  46. if ("all" !== a.lang && "all" === b.lang) {
  47. return 1;
  48. }
  49. if ("en" === a.lang && "en" !== b.lang) {
  50. return -1
  51. }
  52. if ("en" === b.lang && "en" !== a.lang) {
  53. return 1;
  54. }
  55. const langA = simpleLanguageName(a.lang);
  56. const langB = simpleLanguageName(b.lang);
  57. return langA.localeCompare(langB) || a.name.localeCompare(b.name);
  58. });
  59. this.languages = [...new Set(this.extensions.map((e) => e.lang))];
  60. this.loading = LoadingStatus.Loaded;
  61. } catch (e) {
  62. console.error(e);
  63. this.loading = LoadingStatus.Error;
  64. }
  65. if (this.filtered.length === 0) {
  66. this.updateFilteredList();
  67. }
  68. this.$nextTick(() => {
  69. window.location.hash && window.location.replace(window.location.hash);
  70. });
  71. },
  72. updateFilteredList() {
  73. this.filtered = this.extensions
  74. .filter(
  75. (e) => !this.query
  76. || e.name.toLowerCase().includes(this.query.toLowerCase())
  77. || e.pkg.toLowerCase().includes(this.query.toLowerCase()),
  78. )
  79. .filter(
  80. (e) => this.nsfw === NsfwOption.All
  81. || (this.nsfw === NsfwOption.Nsfw ? e.nsfw : !e.nsfw),
  82. )
  83. .filter(
  84. (e) =>
  85. !this.selectedLanguages.length || this.selectedLanguages.includes(e.lang)
  86. );
  87. },
  88. }))
  89. });
  90. }()