import * as React from "bloatless-react"; import { StringEntryObject, collectObjectValuesForKey, localeCompare, } from "../../Model/Utility/utility"; export function PropertyValueList( propertyKey: string, stringEntryObjectConverter: (object: T) => StringEntryObject, objects: React.ListState | React.MapState, viewBuilder: ( keys: React.ListState, sortedKeys: React.State, ) => HTMLElement, ) { const propertyValues: React.ListState = new React.ListState(); const sortedPropertyValues: React.State = createSortedPropertyValueState(propertyValues); objects.subscribe(() => { collectPropertyValuesToState( propertyKey, stringEntryObjectConverter, objects, propertyValues, ); }); return viewBuilder(propertyValues, sortedPropertyValues); } export function collectPropertyValuesToState( propertyKey: string, stringEntryObjectConverter: (object: T) => StringEntryObject, objects: React.ListState | React.MapState, propertyValues: React.ListState, ) { const values: string[] = collectObjectValuesForKey( propertyKey, stringEntryObjectConverter, [...objects.value.values()], ); for (const existingValue of values) { if (propertyValues.value.has(existingValue)) continue; propertyValues.add(existingValue); } for (const displayedValue of propertyValues.value.values()) { if (values.includes(displayedValue)) continue; propertyValues.remove(displayedValue); } } export function createSortedPropertyValueState( propertyValues: React.ListState, ): React.State { return React.createProxyState([propertyValues], () => [...propertyValues.value.values()].sort(localeCompare), ); } export function createPropertyValueIndexState( sortedKeys: React.State, key: string, ): React.State { return React.createProxyState([sortedKeys], () => sortedKeys.value.indexOf(key), ); }