X Media Grid Restore

Restores X's legacy profile media grid while the original feature remains available.

이 스크립트를 설치하려면 Tampermonkey, Greasemonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

이 스크립트를 설치하려면 Tampermonkey 또는 Violentmonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey 또는 Userscripts와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 Tampermonkey와 같은 확장 프로그램이 필요합니다.

이 스크립트를 설치하려면 유저 스크립트 관리자 확장 프로그램이 필요합니다.

(이미 유저 스크립트 관리자가 설치되어 있습니다. 설치를 진행합니다!)

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 Stylus와 같은 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

이 스타일을 설치하려면 유저 스타일 관리자 확장 프로그램이 필요합니다.

(이미 유저 스타일 관리자가 설치되어 있습니다. 설치를 진행합니다!)

// ==UserScript==
// @name         X Media Grid Restore
// @namespace    https://github.com/QuantumDeus/x-media-grid-restore
// @version      0.1.0
// @description  Restores X's legacy profile media grid while the original feature remains available.
// @author       QuantumDeus
// @license      MIT
// @homepageURL  https://github.com/QuantumDeus/x-media-grid-restore
// @supportURL   https://github.com/QuantumDeus/x-media-grid-restore/issues
// @match        https://x.com/*
// @run-at       document-start
// @sandbox      raw
// @grant        none
// @noframes
// ==/UserScript==

(() => {
  "use strict";

  const FLAG_NAMES = [
    "responsive_web_profile_redesign_enabled",
    "rweb_media_carousel_enabled"
  ];

  function disableMediaRedesign(state) {
    const featureSwitch = state?.featureSwitch;
    const configs = [
      featureSwitch?.defaultConfig,
      featureSwitch?.user?.config
    ];

    for (const config of configs) {
      if (!config) continue;

      for (const flagName of FLAG_NAMES) {
        const flag = config[flagName];
        if (flag && typeof flag === "object") {
          flag.value = false;
        }
      }
    }

    return state;
  }

  let initialState;

  try {
    const existingDescriptor = Object.getOwnPropertyDescriptor(
      window,
      "__INITIAL_STATE__"
    );

    if (existingDescriptor && "value" in existingDescriptor) {
      initialState = disableMediaRedesign(existingDescriptor.value);
    }

    Object.defineProperty(window, "__INITIAL_STATE__", {
      configurable: true,
      enumerable: true,
      get() {
        return initialState;
      },
      set(value) {
        initialState = disableMediaRedesign(value);
      }
    });

    Object.defineProperty(window, "__X_MEDIA_GRID_RESTORE__", {
      configurable: false,
      enumerable: false,
      value: Object.freeze({ version: "0.1.0", userscript: true }),
      writable: false
    });
  } catch {
    // Fail closed: leave X untouched if its bootstrap object cannot be patched.
  }
})();