bugfix: lyric search excludeSources was not being sent/state issues
This commit is contained in:
		@@ -44,13 +44,6 @@ export default function LyricSearch() {
 | 
			
		||||
              id="lyric-search-input"
 | 
			
		||||
              placeholder="Artist - Song"
 | 
			
		||||
              setShowLyrics={setShowLyrics} />
 | 
			
		||||
    <br />
 | 
			
		||||
    Exclude:<br />
 | 
			
		||||
    <div id="exclude-checkboxes">
 | 
			
		||||
    <UICheckbox id="excl-Genius" label="Genius" />
 | 
			
		||||
    <UICheckbox id="excl-LRCLib" label="LRCLib" />
 | 
			
		||||
    <UICheckbox id="excl-Cache" label="Cache" />
 | 
			
		||||
    </div>
 | 
			
		||||
    <div id="spinner" className="hidden">
 | 
			
		||||
    <CircularProgress
 | 
			
		||||
    variant="plain"
 | 
			
		||||
@@ -86,13 +79,15 @@ export function LyricSearchInputField({ id, placeholder, setShowLyrics }) {
 | 
			
		||||
 | 
			
		||||
  // Toggle exclusion state for checkboxes
 | 
			
		||||
  const toggleExclusion = (source) => {
 | 
			
		||||
    const lower = source.toLowerCase();
 | 
			
		||||
    setExcludedSources((prev) =>
 | 
			
		||||
      prev.includes(source)
 | 
			
		||||
        ? prev.filter((s) => s !== source)
 | 
			
		||||
        : [...prev, source]
 | 
			
		||||
      prev.includes(lower)
 | 
			
		||||
        ? prev.filter((s) => s !== lower)
 | 
			
		||||
        : [...prev, lower]
 | 
			
		||||
    );
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Show scrollable dropdown panel with mouse wheel handling
 | 
			
		||||
  const handlePanelShow = () => {
 | 
			
		||||
    setTimeout(() => {
 | 
			
		||||
@@ -233,6 +228,13 @@ export function LyricSearchInputField({ id, placeholder, setShowLyrics }) {
 | 
			
		||||
      <Button onClick={handleSearch} className="btn">
 | 
			
		||||
        Search
 | 
			
		||||
      </Button>
 | 
			
		||||
      <br />
 | 
			
		||||
      Exclude:<br />
 | 
			
		||||
      <div id="exclude-checkboxes">
 | 
			
		||||
        <UICheckbox id="excl-Genius" label="Genius" onToggle={toggleExclusion} />
 | 
			
		||||
        <UICheckbox id="excl-LRCLib" label="LRCLib" onToggle={toggleExclusion} />
 | 
			
		||||
        <UICheckbox id="excl-Cache" label="Cache" onToggle={toggleExclusion} />
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
      {isLoading && (
 | 
			
		||||
        <div className="mt-3">
 | 
			
		||||
@@ -255,42 +257,47 @@ export function LyricSearchInputField({ id, placeholder, setShowLyrics }) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
export const UICheckbox = forwardRef(function UICheckbox(opts = {}, ref) {
 | 
			
		||||
export const UICheckbox = forwardRef(function UICheckbox(props = {}, ref) {
 | 
			
		||||
  const [checked, setChecked] = useState(false);
 | 
			
		||||
  const [showAlert, setShowAlert] = useState(false);
 | 
			
		||||
  let valid_exclusions = true;
 | 
			
		||||
 | 
			
		||||
  useImperativeHandle(ref, () => ({
 | 
			
		||||
    setChecked: (val) => setChecked(val),
 | 
			
		||||
    checked,
 | 
			
		||||
  }));
 | 
			
		||||
  
 | 
			
		||||
  const verifyExclusions = (e) => {
 | 
			
		||||
    let exclude_error = false;
 | 
			
		||||
    if (($("#exclude-checkboxes").find("input:checkbox").filter(":checked").length == 3)){
 | 
			
		||||
      $("#exclude-checkboxes").find("input:checkbox").each(function () {
 | 
			
		||||
        exclude_error = true;
 | 
			
		||||
 | 
			
		||||
  const verifyExclusions = () => {
 | 
			
		||||
    const checkedCount = $("#exclude-checkboxes input:checkbox:checked").length;
 | 
			
		||||
    if (checkedCount === 3) {
 | 
			
		||||
      $("#exclude-checkboxes input:checkbox").each(function () {
 | 
			
		||||
        this.click();
 | 
			
		||||
      });
 | 
			
		||||
      if (exclude_error) {
 | 
			
		||||
        toast.error("All sources were excluded; exclusions have been reset.",
 | 
			
		||||
          { style: { backgroundColor: "rgba(255, 0, 0, 0.5)", color: 'inherit' } },
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
      toast.error(
 | 
			
		||||
        "All sources were excluded; exclusions have been reset.",
 | 
			
		||||
        { style: { backgroundColor: "rgba(255, 0, 0, 0.5)", color: "inherit" } }
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
  return ( 
 | 
			
		||||
    <div> 
 | 
			
		||||
    <Checkbox
 | 
			
		||||
    id={opts.id}
 | 
			
		||||
    key={opts.label}
 | 
			
		||||
    checked={checked}
 | 
			
		||||
    label={opts.label}
 | 
			
		||||
    style={{ color: "inherit" }}
 | 
			
		||||
    onChange={(e) => {
 | 
			
		||||
      setChecked(e.target.checked);
 | 
			
		||||
      verifyExclusions();
 | 
			
		||||
    }}
 | 
			
		||||
    />
 | 
			
		||||
 | 
			
		||||
  const handleChange = (e) => {
 | 
			
		||||
    const newChecked = e.target.checked;
 | 
			
		||||
    setChecked(newChecked);
 | 
			
		||||
    if (props.onToggle) {
 | 
			
		||||
      const source = props.label; // Use label as source identifier
 | 
			
		||||
      props.onToggle(source);
 | 
			
		||||
    }
 | 
			
		||||
    verifyExclusions();
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <div>
 | 
			
		||||
      <Checkbox
 | 
			
		||||
        id={props.id}
 | 
			
		||||
        key={props.label}
 | 
			
		||||
        checked={checked}
 | 
			
		||||
        label={props.label}
 | 
			
		||||
        style={{ color: "inherit" }}
 | 
			
		||||
        onChange={handleChange}
 | 
			
		||||
      />
 | 
			
		||||
    </div>
 | 
			
		||||
  );
 | 
			
		||||
});
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user