Create button with folder path name

Here’s the complete solution that I wrote for @haller over DM.
I’m providing it for anyone in the future looking for a similar answer, but also so that everyone can be safe in the knowledge that no code is being “stolen” (including my own).

I’ve suggested that @haller takes the time to learn ES6 before attempting UXP.

// Imports
const { app, core } = require("photoshop");
const fs = require("uxp").storage.localFileSystem;

// UI elements
const folderSelectButton = document.querySelector("#folderSelectBtn");
const actionButton = document.querySelector("#saveBtn");
const pathLabel = document.querySelector("#pathLabel");

// Variables
let saveFolder;

// Helper Functions
const writeFileToDataFolder = async (data, filename) => {
  // Stringify data
  const stringifiedData = JSON.stringify([data]);

  // Get data folder
  const dataFolder = await fs.getDataFolder();

  // Create file
  const dataFile = await dataFolder.createFile(`${filename}.json`, {
    overwrite: true,
  });

  // Write data to file
  await dataFile.write(stringifiedData);

  return data;
};

// Main functions
const getAndStoreFolderToken = async () => {
  // Get folder
  const folder = await fs.getFolder();

  // Generate token
  const token = await fs.createPersistentToken(folder);

  // Create folder Object for convenience
  const folderObject = {
    name: folder.name,
    path: folder.nativePath,
    token: token,
    entry: folder,
  };

  // Write as JSON to data folder
  await writeFileToDataFolder(folderObject, "storedFolderDetails");

  // Update UI
  pathLabel.innerHTML = folderObject.path;

  return folder;
};

const saveFile = async (destination, fileName) => {
  // Get active document
  const doc = app.activeDocument;

  // Create file
  const target = await destination.createFile(fileName + ".jpg", {
    overwrite: true,
  });

  // Save file - wrapped in executeAsModal as it changes Photoshop state
  await core.executeAsModal(async () => {
    const savedFile = await doc.saveAs.jpg(target, { quality: 12 }, true);

    return savedFile;
  });
};

// Event listeners
folderSelectButton.addEventListener("click", async () => {
  saveFolder = await getAndStoreFolderToken();
});

actionButton.addEventListener("click", async () => {
  await saveFile(saveFolder, "A new filename");
});

2 Likes