Files
2026-07-13 12:08:39 +08:00

101 lines
2.6 KiB
TypeScript

import { PropsWithChildren, ReactNode } from 'react';
import { SchemaOf, string } from 'yup';
import { useStateWrapper } from '@/react/hooks/useStateWrapper';
import { FormControl } from '@@/form-components/FormControl';
import { Input } from '@@/form-components/Input';
import { TextTip } from '@@/Tip/TextTip';
import { isBE } from '../../feature-flags/feature-flags.service';
import { RefSelector } from './RefSelector';
interface Props {
value: string;
onChange(value: string): void;
sourceId?: number;
error?: string;
}
export function RefField({ value, onChange, sourceId, error }: Props) {
const [inputValue, updateInputValue] = useStateWrapper(value, onChange);
const inputId = 'repository-reference-field';
return isBE ? (
<Wrapper
inputId={inputId}
errors={error}
tip={
<>
Specify a reference of the repository using the following syntax:
branches with <code>refs/heads/branch_name</code> or tags with{' '}
<code>refs/tags/tag_name</code>.
</>
}
>
<RefSelector
inputId={inputId}
value={value}
onChange={onChange}
sourceId={sourceId}
/>
</Wrapper>
) : (
<Wrapper
inputId={inputId}
errors={error}
tip={
<>
Specify a reference of the repository using the following syntax:
branches with <code>refs/heads/branch_name</code> or tags with{' '}
<code>refs/tags/tag_name</code>. If not specified, will use the
default <code>HEAD</code> reference normally the <code>main</code>{' '}
branch.
</>
}
>
<Input
id={inputId}
data-cy="repository-reference-input"
value={inputValue}
onChange={(e) => updateInputValue(e.target.value)}
placeholder="refs/heads/main"
/>
</Wrapper>
);
}
function Wrapper({
tip,
children,
errors,
inputId,
}: PropsWithChildren<{ tip: ReactNode; errors?: string; inputId: string }>) {
return (
<div className="form-group">
<span className="col-sm-12 mb-2">
<TextTip color="blue">{tip}</TextTip>
</span>
<div className="col-sm-12">
<FormControl
label="Repository reference"
inputId={inputId}
required
errors={errors}
>
{children}
</FormControl>
</div>
</div>
);
}
export function refFieldValidation(): SchemaOf<string> {
return string()
.when({
is: isBE,
then: string().required('Repository reference name is required'),
})
.default('');
}