124 lines
3.6 KiB
TypeScript
124 lines
3.6 KiB
TypeScript
import { GenericPageData } from '../../pageInterface';
|
|
import { FaBuilding } from 'react-icons/fa';
|
|
import { IoMdSend } from 'react-icons/io';
|
|
import PekLocationInput from './pek/PekLocationInput';
|
|
import PekMapView from './pek/PekMapView';
|
|
import { usePek } from '../../../../hooks/usePek';
|
|
import PekPageWrapper from './pek/PekPageWrapper';
|
|
import { getUserDataCache } from '../../../../utils/userCache';
|
|
|
|
// Hook factory for PEK page
|
|
const createPekHook = () => {
|
|
return () => {
|
|
const pekData = usePek();
|
|
|
|
const handleSubmit = async () => {
|
|
await pekData.processCommand(pekData.commandInput);
|
|
};
|
|
|
|
return {
|
|
// Messages for command results
|
|
messages: pekData.commandResults,
|
|
// Loading states
|
|
loading: pekData.isProcessingCommand || pekData.isSearchingParcel,
|
|
error: pekData.commandError || pekData.parcelSearchError || pekData.locationError,
|
|
// Empty data array for compatibility
|
|
data: [],
|
|
// Input form properties (for command input)
|
|
inputValue: pekData.commandInput,
|
|
onInputChange: pekData.setCommandInput,
|
|
handleSubmit,
|
|
isSubmitting: pekData.isProcessingCommand
|
|
};
|
|
};
|
|
};
|
|
|
|
export const pekPageData: GenericPageData = {
|
|
id: 'pek',
|
|
path: 'start/real-estate/pek',
|
|
name: 'projects.title',
|
|
description: 'projects.description',
|
|
|
|
// Parent page
|
|
parentPath: 'start.real-estate',
|
|
|
|
// Visual
|
|
icon: FaBuilding,
|
|
title: 'projects.title',
|
|
subtitle: 'projects.subtitle',
|
|
|
|
// Header buttons
|
|
headerButtons: [],
|
|
|
|
// Content sections
|
|
content: [
|
|
{
|
|
id: 'pek-description',
|
|
type: 'paragraph',
|
|
content: 'projects.description_text'
|
|
},
|
|
{
|
|
id: 'pek-location-input',
|
|
type: 'custom',
|
|
customComponent: PekLocationInput
|
|
},
|
|
{
|
|
id: 'pek-map-view',
|
|
type: 'custom',
|
|
customComponent: PekMapView
|
|
},
|
|
{
|
|
id: 'pek-command-input',
|
|
type: 'inputForm',
|
|
inputFormConfig: {
|
|
hookFactory: createPekHook,
|
|
placeholder: 'projects.command.placeholder',
|
|
buttonLabel: 'Senden',
|
|
buttonIcon: IoMdSend,
|
|
buttonVariant: 'primary',
|
|
buttonSize: 'md',
|
|
textFieldSize: 'md'
|
|
}
|
|
},
|
|
{
|
|
id: 'pek-command-results',
|
|
type: 'messages',
|
|
messagesConfig: {
|
|
variant: 'chat',
|
|
showDocuments: false,
|
|
showMetadata: false,
|
|
showProgress: false,
|
|
emptyMessage: 'projects.command.empty'
|
|
}
|
|
}
|
|
],
|
|
|
|
// Page behavior
|
|
persistent: false,
|
|
preload: false,
|
|
preserveState: true,
|
|
moduleEnabled: true,
|
|
|
|
// Sidebar
|
|
order: 10,
|
|
|
|
// Privilege checker: deny access for "user" role
|
|
privilegeChecker: async () => {
|
|
const userData = getUserDataCache();
|
|
const roleLabels = Array.isArray(userData?.roleLabels) ? userData.roleLabels : [];
|
|
// Deny access if user has "user" role
|
|
return !roleLabels.includes('user');
|
|
},
|
|
|
|
// Custom component wrapper with PekProvider
|
|
customComponent: PekPageWrapper,
|
|
|
|
// Lifecycle hooks
|
|
onActivate: async () => {
|
|
if (import.meta.env.DEV) console.log('PEK page activated');
|
|
},
|
|
onDeactivate: async () => {
|
|
if (import.meta.env.DEV) console.log('PEK page deactivated');
|
|
}
|
|
};
|
|
|