Initial commit

This commit is contained in:
2026-08-07 23:53:15 +05:30
commit 90f14a73b2
222 changed files with 35000 additions and 0 deletions

104
src/api/base44Client.js Normal file
View File

@@ -0,0 +1,104 @@
/**
* Application data client.
*
* The reference app talks to a Base44 backend through this module. The demo
* keeps the module path, the export name, and the full method contract, and
* swaps the transport for the local store in `store.js` and the local AI engine
* in `aiEngine.js`. Nothing downstream — hooks, pages, components — knows or
* cares, which is exactly the point: the seam stays where it was.
*/
import { createEntity, initStore, resetStore } from './store';
import { invokeLLM, uploadFile } from './aiEngine';
import { DEMO_USER, seedData } from './seed';
initStore(seedData);
const ENTITY_NAMES = [
'JobPosting', 'JobApplication', 'AIInterview', 'Staff', 'WorkerProfile',
'Course', 'Badge', 'LearningPath', 'Certification', 'RoleCategory',
'UserActivity', 'Evidence', 'User',
];
const entities = Object.fromEntries(
ENTITY_NAMES.map((name) => [name, createEntity(name)])
);
/* ── Auth ──────────────────────────────────────────────────────────────── */
const SESSION_KEY = 'krow_demo_user';
function loadUser() {
try {
const raw = localStorage.getItem(SESSION_KEY);
return raw ? { ...DEMO_USER, ...JSON.parse(raw) } : { ...DEMO_USER };
} catch {
return { ...DEMO_USER };
}
}
let currentUser = loadUser();
const auth = {
/** The demo is always signed in as the seeded employer/admin user. */
async me() {
return { ...currentUser };
},
async updateMe(patch) {
currentUser = { ...currentUser, ...patch };
try {
localStorage.setItem(SESSION_KEY, JSON.stringify(currentUser));
} catch {
// Non-persistent session is fine.
}
return { ...currentUser };
},
isAuthenticated() {
return true;
},
/**
* There is no identity provider to sign out of, so this clears the local
* session and returns to the requested page.
*/
logout(redirectTo = '/') {
try {
localStorage.removeItem(SESSION_KEY);
} catch {
// Ignore.
}
currentUser = { ...DEMO_USER };
window.location.href = typeof redirectTo === 'string' ? redirectTo : '/';
},
redirectToLogin() {
window.location.href = '/';
},
};
/* ── Integrations & analytics ───────────────────────────────────────────── */
const integrations = {
Core: {
InvokeLLM: invokeLLM,
UploadFile: uploadFile,
},
};
const analytics = {
track({ eventName, properties } = {}) {
if (import.meta.env.DEV) {
console.debug('[krow-demo] analytics', eventName, properties || {});
}
},
};
export const base44 = { entities, auth, integrations, analytics };
/** Restores the shipped demo data, discarding local edits. */
export function resetDemoData() {
resetStore(seedData);
window.location.reload();
}