165 lines
4.8 KiB
JavaScript
165 lines
4.8 KiB
JavaScript
/**
|
|
* Core application state
|
|
*/
|
|
|
|
export function createCoreState(ref, computed) {
|
|
// --- Core State ---
|
|
const currentView = ref('upload');
|
|
const dragover = ref(false);
|
|
const recordings = ref([]);
|
|
const selectedRecording = ref(null);
|
|
const selectedTab = ref('summary');
|
|
const searchQuery = ref('');
|
|
const isLoadingRecordings = ref(true);
|
|
const globalError = ref(null);
|
|
|
|
// --- Pagination State ---
|
|
const currentPage = ref(1);
|
|
const perPage = ref(25);
|
|
const totalRecordings = ref(0);
|
|
const totalPages = ref(0);
|
|
const hasNextPage = ref(false);
|
|
const hasPrevPage = ref(false);
|
|
const isLoadingMore = ref(false);
|
|
const searchDebounceTimer = ref(null);
|
|
|
|
// --- Enhanced Search & Organization State ---
|
|
const sortBy = ref('created_at');
|
|
const selectedTagFilter = ref(null);
|
|
|
|
// Advanced filter state
|
|
const showAdvancedFilters = ref(false);
|
|
const filterTags = ref([]);
|
|
const filterSpeakers = ref([]); // Array of speaker names for filtering
|
|
const filterDateRange = ref({ start: '', end: '' });
|
|
const filterDatePreset = ref('');
|
|
const filterTextQuery = ref('');
|
|
const showArchivedRecordings = ref(false);
|
|
const showSharedWithMe = ref(false);
|
|
|
|
// --- App Configuration ---
|
|
const useAsrEndpoint = ref(false);
|
|
const connectorSupportsDiarization = ref(false); // Connector capability for diarization UI
|
|
const connectorSupportsSpeakerCount = ref(false); // Connector capability for min/max speakers
|
|
const currentUserName = ref('');
|
|
const canDeleteRecordings = ref(true);
|
|
const enableInternalSharing = ref(false);
|
|
const enableArchiveToggle = ref(false);
|
|
const showUsernamesInUI = ref(false);
|
|
|
|
// --- Incognito Mode State ---
|
|
const enableIncognitoMode = ref(false); // Server config - whether feature is available
|
|
const incognitoMode = ref(false); // User toggle - whether to use incognito for current upload
|
|
const incognitoRecording = ref(null);
|
|
const incognitoProcessing = ref(false);
|
|
|
|
// Tag Selection
|
|
const availableTags = ref([]);
|
|
const selectedTagIds = ref([]);
|
|
const uploadTagSearchFilter = ref('');
|
|
|
|
// Folder Selection
|
|
const availableFolders = ref([]);
|
|
const selectedFolderId = ref(null);
|
|
const foldersEnabled = ref(false);
|
|
const filterFolder = ref(''); // '' = all, 'none' = no folder, or folder id
|
|
|
|
// Speaker Selection
|
|
const availableSpeakers = ref([]);
|
|
|
|
const selectedTags = computed(() => {
|
|
return selectedTagIds.value.map(tagId =>
|
|
availableTags.value.find(tag => tag.id == tagId)
|
|
).filter(Boolean);
|
|
});
|
|
|
|
const filteredAvailableTagsForUpload = computed(() => {
|
|
const availableForSelection = availableTags.value.filter(tag => !selectedTagIds.value.includes(tag.id));
|
|
if (!uploadTagSearchFilter.value) return availableForSelection;
|
|
|
|
const filter = uploadTagSearchFilter.value.toLowerCase();
|
|
return availableForSelection.filter(tag =>
|
|
tag.name.toLowerCase().includes(filter)
|
|
);
|
|
});
|
|
|
|
const filteredRecordings = computed(() => {
|
|
return recordings.value;
|
|
});
|
|
|
|
const setGlobalError = (message, duration = 7000) => {
|
|
globalError.value = message;
|
|
if (duration > 0) {
|
|
setTimeout(() => { if (globalError.value === message) globalError.value = null; }, duration);
|
|
}
|
|
};
|
|
|
|
return {
|
|
// Core
|
|
currentView,
|
|
dragover,
|
|
recordings,
|
|
selectedRecording,
|
|
selectedTab,
|
|
searchQuery,
|
|
isLoadingRecordings,
|
|
globalError,
|
|
setGlobalError,
|
|
|
|
// Pagination
|
|
currentPage,
|
|
perPage,
|
|
totalRecordings,
|
|
totalPages,
|
|
hasNextPage,
|
|
hasPrevPage,
|
|
isLoadingMore,
|
|
searchDebounceTimer,
|
|
|
|
// Search & Organization
|
|
sortBy,
|
|
selectedTagFilter,
|
|
showAdvancedFilters,
|
|
filterTags,
|
|
filterSpeakers,
|
|
filterDateRange,
|
|
filterDatePreset,
|
|
filterTextQuery,
|
|
showArchivedRecordings,
|
|
showSharedWithMe,
|
|
|
|
// App Configuration
|
|
useAsrEndpoint,
|
|
connectorSupportsDiarization,
|
|
connectorSupportsSpeakerCount,
|
|
currentUserName,
|
|
canDeleteRecordings,
|
|
enableInternalSharing,
|
|
enableArchiveToggle,
|
|
showUsernamesInUI,
|
|
|
|
// Tags
|
|
availableTags,
|
|
selectedTagIds,
|
|
uploadTagSearchFilter,
|
|
selectedTags,
|
|
filteredAvailableTagsForUpload,
|
|
filteredRecordings,
|
|
|
|
// Folders
|
|
availableFolders,
|
|
selectedFolderId,
|
|
foldersEnabled,
|
|
filterFolder,
|
|
|
|
// Speakers
|
|
availableSpeakers,
|
|
|
|
// Incognito Mode
|
|
enableIncognitoMode,
|
|
incognitoMode,
|
|
incognitoRecording,
|
|
incognitoProcessing
|
|
};
|
|
}
|