You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.6 KiB
52 lines
1.6 KiB
3 years ago
|
import type { ComputedRef, Ref } from 'vue';
|
||
|
import { computed } from 'vue';
|
||
|
import useMemo from '../../_util/hooks/useMemo';
|
||
|
import shallowequal from '../../_util/shallowequal';
|
||
|
import type { GenerateConfig } from '../generate';
|
||
|
import type { CustomFormat, Locale } from '../interface';
|
||
|
import { formatValue } from '../utils/dateUtil';
|
||
|
|
||
|
export type ValueTextConfig<DateType> = {
|
||
|
formatList: ComputedRef<(string | CustomFormat<DateType>)[]>;
|
||
|
generateConfig: Ref<GenerateConfig<DateType>>;
|
||
|
locale: Ref<Locale>;
|
||
|
};
|
||
|
|
||
|
export default function useValueTexts<DateType>(
|
||
|
value: Ref<DateType | null>,
|
||
|
{ formatList, generateConfig, locale }: ValueTextConfig<DateType>,
|
||
|
): [ComputedRef<string[]>, ComputedRef<string>] {
|
||
|
const texts = useMemo<[string[], string]>(
|
||
|
() => {
|
||
|
if (!value.value) {
|
||
|
return [[''], ''];
|
||
|
}
|
||
|
|
||
|
// We will convert data format back to first format
|
||
|
let firstValueText = '';
|
||
|
const fullValueTexts: string[] = [];
|
||
|
|
||
|
for (let i = 0; i < formatList.value.length; i += 1) {
|
||
|
const format = formatList.value[i];
|
||
|
const formatStr = formatValue(value.value, {
|
||
|
generateConfig: generateConfig.value,
|
||
|
locale: locale.value,
|
||
|
format,
|
||
|
});
|
||
|
fullValueTexts.push(formatStr);
|
||
|
|
||
|
if (i === 0) {
|
||
|
firstValueText = formatStr;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return [fullValueTexts, firstValueText];
|
||
|
},
|
||
|
[value, formatList],
|
||
|
(next, prev) => prev[0] !== next[0] || !shallowequal(prev[1], next[1]),
|
||
|
);
|
||
|
const fullValueTexts = computed(() => texts.value[0]);
|
||
|
const firstValueText = computed(() => texts.value[1]);
|
||
|
return [fullValueTexts, firstValueText];
|
||
|
}
|