Redesign mobile time clock, add shortcuts, and improve account management.

Add iOS Shortcuts/Siri intents, local send-reminder notifications, stable
client picker with last-client defaults, account refresh/remove, and softer
session handling on unauthorized API responses.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-22 16:06:17 -04:00
parent 0b2d65a4e9
commit 06bc91ac13
33 changed files with 1844 additions and 320 deletions
+76
View File
@@ -0,0 +1,76 @@
// @ts-check
const {
withDangerousMod,
withXcodeProject,
IOSConfig,
} = require("@expo/config-plugins");
const fs = require("fs");
const path = require("path");
const SWIFT_FILES = [
"ClockInIntent.swift",
"ClockOutIntent.swift",
"OpenTimerIntent.swift",
"BeenVoiceShortcuts.swift",
];
/** @type {import('@expo/config-plugins').ConfigPlugin} */
function withAppIntents(config) {
const appIntentsSource = path.join(
config._internal?.projectRoot ?? process.cwd(),
"plugins",
"app-intents",
);
config = withDangerousMod(config, [
"ios",
async (config) => {
const platformRoot = config.modRequest.platformProjectRoot;
const projectName = IOSConfig.XcodeUtils.getProjectName(platformRoot);
const targetDir = path.join(platformRoot, projectName);
fs.mkdirSync(targetDir, { recursive: true });
for (const file of SWIFT_FILES) {
fs.copyFileSync(path.join(appIntentsSource, file), path.join(targetDir, file));
}
return config;
},
]);
return withXcodeProject(config, (config) => {
const project = config.modResults;
const platformRoot = config.modRequest.platformProjectRoot;
const projectName = IOSConfig.XcodeUtils.getProjectName(platformRoot);
for (const file of SWIFT_FILES) {
const filepath = `${projectName}/${file}`;
const absolutePath = path.join(platformRoot, filepath);
if (!fs.existsSync(absolutePath)) continue;
const fileRef = project.pbxFileReferenceSection();
const alreadyLinked = Object.values(fileRef).some(
(entry) =>
entry &&
typeof entry === "object" &&
"path" in entry &&
entry.path === file,
);
if (!alreadyLinked) {
IOSConfig.XcodeUtils.addBuildSourceFileToGroup({
filepath,
groupName: projectName,
project,
verbose: true,
});
}
}
return config;
});
}
module.exports = withAppIntents;