{ stdenv
, mkYarnModules
, nodejs
, cleanSchildichatDesktopSource
, schildichat-desktop-src ? ../.
, ...
}:

let
  packageJSON = schildichat-desktop-src + "/element-web/package.json";
  yarnLock = schildichat-desktop-src + "/element-web/yarn.lock";

  package = builtins.fromJSON (builtins.readFile packageJSON);

  pname = "schildichat-web";
  version = package.version;

  modules = mkYarnModules {
    name = "${pname}-modules-${version}";
    inherit pname version packageJSON yarnLock;
  };

in stdenv.mkDerivation {
  inherit pname version;

  src = cleanSchildichatDesktopSource schildichat-desktop-src;

  buildInputs = [ nodejs ];

  postPatch = ''
    patchShebangs .
  '';

  configurePhase = ''
    runHook preConfigure

    cp configs/sc/config.json element-web/
    cp -r ${modules}/node_modules node_modules
    chmod u+rwX -R node_modules
    rm -rf node_modules/matrix-react-sdk
    ln -s $PWD/matrix-react-sdk node_modules/
    ln -s $PWD/node_modules matrix-react-sdk/
    ln -s $PWD/node_modules element-web/

    runHook postConfigure
  '';

  buildPhase = ''
    runHook preBuild

    pushd matrix-react-sdk
    node_modules/.bin/reskindex -h ../element-web/src/header
    popd

    pushd element-web
    node scripts/copy-res.js
    node_modules/.bin/reskindex -h ../element-web/src/header
    node_modules/.bin/webpack --progress --mode production
    popd

    runHook postBuild
  '';

  installPhase = ''
    runHook preInstall

    cp -r element-web/webapp $out

    runHook postInstall
  '';

  passthru = {
    inherit modules;
  };
}