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");
});