mirror of
https://github.com/invoke-ai/InvokeAI.git
synced 2026-02-05 23:05:26 -05:00
114 lines
2.7 KiB
TypeScript
114 lines
2.7 KiB
TypeScript
import { createSelector } from '@reduxjs/toolkit';
|
|
import { isEqual } from 'lodash';
|
|
import { useMemo } from 'react';
|
|
import { useAppSelector } from '../../app/store';
|
|
import { RootState } from '../../app/store';
|
|
import { OptionsState } from '../../features/options/optionsSlice';
|
|
|
|
import { SystemState } from '../../features/system/systemSlice';
|
|
import { validateSeedWeights } from '../util/seedWeightPairs';
|
|
|
|
export const optionsSelector = createSelector(
|
|
(state: RootState) => state.options,
|
|
(options: OptionsState) => {
|
|
return {
|
|
prompt: options.prompt,
|
|
shouldGenerateVariations: options.shouldGenerateVariations,
|
|
seedWeights: options.seedWeights,
|
|
maskPath: options.maskPath,
|
|
initialImagePath: options.initialImagePath,
|
|
seed: options.seed,
|
|
activeTab: options.activeTab,
|
|
};
|
|
},
|
|
{
|
|
memoizeOptions: {
|
|
resultEqualityCheck: isEqual,
|
|
},
|
|
}
|
|
);
|
|
|
|
export const systemSelector = createSelector(
|
|
(state: RootState) => state.system,
|
|
(system: SystemState) => {
|
|
return {
|
|
isProcessing: system.isProcessing,
|
|
isConnected: system.isConnected,
|
|
};
|
|
},
|
|
{
|
|
memoizeOptions: {
|
|
resultEqualityCheck: isEqual,
|
|
},
|
|
}
|
|
);
|
|
|
|
/**
|
|
* Checks relevant pieces of state to confirm generation will not deterministically fail.
|
|
* This is used to prevent the 'Generate' button from being clicked.
|
|
*/
|
|
const useCheckParameters = (): boolean => {
|
|
const { prompt } = useAppSelector(optionsSelector);
|
|
|
|
const {
|
|
shouldGenerateVariations,
|
|
seedWeights,
|
|
maskPath,
|
|
initialImagePath,
|
|
seed,
|
|
activeTab,
|
|
} = useAppSelector(optionsSelector);
|
|
|
|
const { isProcessing, isConnected } = useAppSelector(systemSelector);
|
|
|
|
return useMemo(() => {
|
|
// Cannot generate without a prompt
|
|
if (!prompt || Boolean(prompt.match(/^[\s\r\n]+$/))) {
|
|
return false;
|
|
}
|
|
|
|
if (prompt && !initialImagePath && activeTab === 1) {
|
|
return false;
|
|
}
|
|
|
|
// Cannot generate with a mask without img2img
|
|
if (maskPath && !initialImagePath) {
|
|
return false;
|
|
}
|
|
|
|
// TODO: job queue
|
|
// Cannot generate if already processing an image
|
|
if (isProcessing) {
|
|
return false;
|
|
}
|
|
|
|
// Cannot generate if not connected
|
|
if (!isConnected) {
|
|
return false;
|
|
}
|
|
|
|
// Cannot generate variations without valid seed weights
|
|
if (
|
|
shouldGenerateVariations &&
|
|
(!(validateSeedWeights(seedWeights) || seedWeights === '') || seed === -1)
|
|
) {
|
|
return false;
|
|
}
|
|
|
|
// All good
|
|
return true;
|
|
}, [
|
|
prompt,
|
|
maskPath,
|
|
initialImagePath,
|
|
isProcessing,
|
|
isConnected,
|
|
shouldGenerateVariations,
|
|
seedWeights,
|
|
seed,
|
|
activeTab,
|
|
]);
|
|
};
|
|
|
|
export default useCheckParameters;
|