fix: instance config errors

This commit is contained in:
sriram veeraghanta 2024-05-18 16:22:53 +05:30
parent 895fbcd5a7
commit 31ca9e447d
35 changed files with 159 additions and 197 deletions

View file

@ -44,7 +44,7 @@ export const AuthRoot: FC<TAuthRoot> = observer((props) => {
const [errorInfo, setErrorInfo] = useState<TAuthErrorInfo | undefined>(undefined);
const [isPasswordAutoset, setIsPasswordAutoset] = useState(true);
// hooks
const { instance } = useInstance();
const { config } = useInstance();
useEffect(() => {
if (error_code) {
@ -68,9 +68,9 @@ export const AuthRoot: FC<TAuthRoot> = observer((props) => {
}
}, [error_code, authMode]);
const isSMTPConfigured = instance?.config?.is_smtp_configured || false;
const isMagicLoginEnabled = instance?.config?.is_magic_login_enabled || false;
const isEmailPasswordEnabled = instance?.config?.is_email_password_enabled || false;
const isSMTPConfigured = config?.is_smtp_configured || false;
const isMagicLoginEnabled = config?.is_magic_login_enabled || false;
const isEmailPasswordEnabled = config?.is_email_password_enabled || false;
// submit handler- email verification
const handleEmailVerification = async (data: IEmailCheckData) => {

View file

@ -11,10 +11,9 @@ type TOAuthOptionProps = {
export const OAuthOptions: React.FC<TOAuthOptionProps> = observer((props) => {
const { isSignUp = false } = props;
// hooks
const { instance } = useInstance();
const { config } = useInstance();
const isOAuthEnabled =
(instance?.config && (instance?.config?.is_google_enabled || instance?.config?.is_github_enabled)) || false;
const isOAuthEnabled = (config && (config?.is_google_enabled || config?.is_github_enabled)) || false;
if (!isOAuthEnabled) return null;
@ -28,12 +27,12 @@ export const OAuthOptions: React.FC<TOAuthOptionProps> = observer((props) => {
<hr className="w-full border-onboarding-border-100" />
</div>
<div className={`mt-7 grid gap-4 overflow-hidden`}>
{instance?.config?.is_google_enabled && (
{config?.is_google_enabled && (
<div className="flex h-[42px] items-center !overflow-hidden">
<GoogleOAuthButton text={`${oauthProviderButtonText} Google`} />
</div>
)}
{instance?.config?.is_github_enabled && <GithubOAuthButton text={`${oauthProviderButtonText} Github`} />}
{config?.is_github_enabled && <GithubOAuthButton text={`${oauthProviderButtonText} Github`} />}
</div>
</>
);

View file

@ -62,7 +62,7 @@ export const ImagePickerPopover: React.FC<Props> = observer((props) => {
const router = useRouter();
const { workspaceSlug } = router.query;
// store hooks
const { instance } = useInstance();
const { config } = useInstance();
const { currentWorkspace } = useWorkspace();
const { data: unsplashImages, error: unsplashError } = useSWR(
@ -90,7 +90,7 @@ export const ImagePickerPopover: React.FC<Props> = observer((props) => {
accept: {
"image/*": [".png", ".jpg", ".jpeg", ".svg", ".webp"],
},
maxSize: instance?.config?.file_size_limit ?? MAX_FILE_SIZE,
maxSize: config?.file_size_limit ?? MAX_FILE_SIZE,
});
const handleSubmit = async () => {

View file

@ -30,7 +30,7 @@ export const UserImageUploadModal: React.FC<Props> = observer((props) => {
const [image, setImage] = useState<File | null>(null);
const [isImageUploading, setIsImageUploading] = useState(false);
// store hooks
const { instance } = useInstance();
const { config } = useInstance();
const onDrop = (acceptedFiles: File[]) => setImage(acceptedFiles[0]);
@ -39,7 +39,7 @@ export const UserImageUploadModal: React.FC<Props> = observer((props) => {
accept: {
"image/*": [".png", ".jpg", ".jpeg", ".svg", ".webp"],
},
maxSize: instance?.config?.file_size_limit ?? MAX_FILE_SIZE,
maxSize: config?.file_size_limit ?? MAX_FILE_SIZE,
multiple: false,
});

View file

@ -34,7 +34,7 @@ export const WorkspaceImageUploadModal: React.FC<Props> = observer((props) => {
const router = useRouter();
const { workspaceSlug } = router.query;
// store hooks
const { instance } = useInstance();
const { config } = useInstance();
const { currentWorkspace } = useWorkspace();
const onDrop = (acceptedFiles: File[]) => setImage(acceptedFiles[0]);
@ -44,7 +44,7 @@ export const WorkspaceImageUploadModal: React.FC<Props> = observer((props) => {
accept: {
"image/*": [".png", ".jpg", ".jpeg", ".svg", ".webp"],
},
maxSize: instance?.config?.file_size_limit ?? MAX_FILE_SIZE,
maxSize: config?.file_size_limit ?? MAX_FILE_SIZE,
multiple: false,
});

View file

@ -14,12 +14,12 @@ type Props = {
export const GithubAuth: React.FC<Props> = observer(({ workspaceIntegration, provider }) => {
// store hooks
const { instance } = useInstance();
const { config } = useInstance();
// hooks
const { startAuth, isConnecting } = useIntegrationPopup({
provider,
github_app_name: instance?.config?.github_app_name || "",
slack_client_id: instance?.config?.slack_client_id || "",
github_app_name: config?.github_app_name || "",
slack_client_id: config?.slack_client_id || "",
});
return (

View file

@ -46,7 +46,7 @@ export const SingleIntegrationCard: React.FC<Props> = observer(({ integration })
const router = useRouter();
const { workspaceSlug } = router.query;
// store hooks
const { instance } = useInstance();
const { config } = useInstance();
const {
membership: { currentWorkspaceRole },
} = useUser();
@ -55,8 +55,8 @@ export const SingleIntegrationCard: React.FC<Props> = observer(({ integration })
const { isMobile } = usePlatformOS();
const { startAuth, isConnecting: isInstalling } = useIntegrationPopup({
provider: integration.provider,
github_app_name: instance?.config?.github_app_name || "",
slack_client_id: instance?.config?.slack_client_id || "",
github_app_name: config?.github_app_name || "",
slack_client_id: config?.slack_client_id || "",
});
const { data: workspaceIntegrations } = useSWR(

View file

@ -22,7 +22,7 @@ const appInstallationService = new AppInstallationService();
export const SelectChannel: React.FC<Props> = observer(({ integration }) => {
// store hooks
const { instance } = useInstance();
const { config } = useInstance();
// states
const [slackChannelAvailabilityToggle, setSlackChannelAvailabilityToggle] = useState<boolean>(false);
const [slackChannel, setSlackChannel] = useState<ISlackIntegration | null>(null);
@ -35,7 +35,7 @@ export const SelectChannel: React.FC<Props> = observer(({ integration }) => {
provider: "slackChannel",
stateParams: integration.id,
// github_app_name: instance?.config?.github_client_id || "",
slack_client_id: instance?.config?.slack_client_id || "",
slack_client_id: config?.slack_client_id || "",
});
const { data: projectIntegration } = useSWR(

View file

@ -21,7 +21,7 @@ type Props = {
export const IssueAttachmentUpload: React.FC<Props> = observer((props) => {
const { workspaceSlug, disabled = false, handleAttachmentOperations } = props;
// store hooks
const { instance } = useInstance();
const { config } = useInstance();
// states
const [isLoading, setIsLoading] = useState(false);
@ -50,12 +50,12 @@ export const IssueAttachmentUpload: React.FC<Props> = observer((props) => {
const { getRootProps, getInputProps, isDragActive, isDragReject, fileRejections } = useDropzone({
onDrop,
maxSize: instance?.config?.file_size_limit ?? MAX_FILE_SIZE,
maxSize: config?.file_size_limit ?? MAX_FILE_SIZE,
multiple: false,
disabled: isLoading || disabled,
});
const maxFileSize = instance?.config?.file_size_limit ?? MAX_FILE_SIZE;
const maxFileSize = config?.file_size_limit ?? MAX_FILE_SIZE;
const fileError =
fileRejections.length > 0 ? `Invalid file type or size (max ${maxFileSize / 1024 / 1024} MB)` : null;

View file

@ -116,7 +116,7 @@ export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
const workspaceStore = useWorkspace();
const workspaceId = workspaceStore.getWorkspaceBySlug(workspaceSlug as string)?.id as string;
const { projectId: routeProjectId } = useAppRouter();
const { instance } = useInstance();
const { config } = useInstance();
const { getProjectById } = useProject();
const { areEstimatesEnabledForProject } = useEstimate();
@ -410,7 +410,7 @@ export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
) : (
<>
<div className="border-0.5 absolute bottom-3.5 right-3.5 z-10 flex items-center gap-2">
{issueName && issueName.trim() !== "" && instance?.config?.has_openai_configured && (
{issueName && issueName.trim() !== "" && config?.has_openai_configured && (
<button
type="button"
className={`flex items-center gap-1 rounded bg-custom-background-90 px-1.5 py-1 text-xs ${
@ -429,7 +429,7 @@ export const IssueFormRoot: FC<IssueFormProps> = observer((props) => {
)}
</button>
)}
{instance?.config?.has_openai_configured && (
{config?.has_openai_configured && (
<GptAssistantPopover
isOpen={gptAssistantModal}
projectId={projectId}

View file

@ -30,7 +30,7 @@ export const PageExtraOptions: React.FC<Props> = observer((props) => {
// states
const [gptModalOpen, setGptModal] = useState(false);
// store hooks
const { instance } = useInstance();
const { config } = useInstance();
// derived values
const { archived_at, isContentEditable, isSubmitting, is_locked } = pageStore;
@ -69,7 +69,7 @@ export const PageExtraOptions: React.FC<Props> = observer((props) => {
<span>Archived at {renderFormattedDate(archived_at)}</span>
</div>
)}
{isContentEditable && instance?.config?.has_openai_configured && (
{isContentEditable && config?.has_openai_configured && (
<GptAssistantPopover
isOpen={gptModalOpen}
projectId={projectId}

View file

@ -32,7 +32,7 @@ export interface IAppProvider {
export const AppProvider: FC<IAppProvider> = observer((props) => {
const { children } = props;
// store hooks
const { instance } = useInstance();
const { config } = useInstance();
const {
data: currentUser,
membership: { currentProjectRole, currentWorkspaceRole },
@ -53,8 +53,8 @@ export const AppProvider: FC<IAppProvider> = observer((props) => {
currentWorkspaceId={currentWorkspace?.id}
workspaceRole={currentWorkspaceRole}
projectRole={currentProjectRole}
posthogAPIKey={instance?.config?.posthog_api_key || undefined}
posthogHost={instance?.config?.posthog_host || undefined}
posthogAPIKey={config?.posthog_api_key || undefined}
posthogHost={config?.posthog_host || undefined}
>
<SWRConfig value={SWR_CONFIG}>{children}</SWRConfig>
</PostHogProvider>

View file

@ -32,7 +32,7 @@ export const InstanceWrapper: FC<TInstanceWrapper> = observer((props) => {
if (error && error?.status === "error") return <>{children}</>;
// instance is not ready and setup is not done
if (instance?.instance?.is_setup_done === false) return <InstanceNotReady />;
if (instance?.is_setup_done === false) return <InstanceNotReady />;
return <>{children}</>;
});

View file

@ -1,5 +1,5 @@
// types
import type { IInstance } from "@plane/types";
import type { IInstanceInfo } from "@plane/types";
// helpers
import { API_BASE_URL } from "@/helpers/common.helper";
// services
@ -18,7 +18,7 @@ export class InstanceService extends APIService {
});
}
async getInstanceInfo(): Promise<IInstance> {
async getInstanceInfo(): Promise<IInstanceInfo> {
return this.get("/api/instances/")
.then((response) => response.data)
.catch((error) => {

View file

@ -1,6 +1,6 @@
import { observable, action, makeObservable, runInAction } from "mobx";
// types
import { IInstance } from "@plane/types";
import { IInstance, IInstanceConfig } from "@plane/types";
// services
import { InstanceService } from "@/services/instance.service";
@ -17,6 +17,7 @@ export interface IInstanceStore {
// issues
isLoading: boolean;
instance: IInstance | undefined;
config: IInstanceConfig | undefined;
error: TError | undefined;
// action
fetchInstanceInfo: () => Promise<void>;
@ -25,6 +26,7 @@ export interface IInstanceStore {
export class InstanceStore implements IInstanceStore {
isLoading: boolean = true;
instance: IInstance | undefined = undefined;
config: IInstanceConfig | undefined = undefined;
error: TError | undefined = undefined;
// services
instanceService;
@ -34,6 +36,7 @@ export class InstanceStore implements IInstanceStore {
// observable
isLoading: observable.ref,
instance: observable,
config: observable,
error: observable,
// actions
fetchInstanceInfo: action,
@ -49,10 +52,11 @@ export class InstanceStore implements IInstanceStore {
try {
this.isLoading = true;
this.error = undefined;
const instance = await this.instanceService.getInstanceInfo();
const instanceInfo = await this.instanceService.getInstanceInfo();
runInAction(() => {
this.isLoading = false;
this.instance = instance;
this.instance = instanceInfo.instance;
this.config = instanceInfo.config;
});
} catch (error) {
runInAction(() => {