Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(desktop): resolve options for pro provider properly #1056

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions desktop/src/contexts/SettingsContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@ import {
useState,
} from "react"
import { client } from "../client"
import { getKeys } from "../lib"
import { LocalStorageToFileMigrationBackend, Store } from "../lib"
import { TUnsubscribeFn } from "../types"
import { Settings } from "../gen"
import { Command } from "@/client/command"
import { getKeys, LocalStorageToFileMigrationBackend, Store } from "../lib"
import { TUnsubscribeFn } from "../types"

export type TSettings = Settings
type TSetting = keyof TSettings
Expand Down
24 changes: 15 additions & 9 deletions desktop/src/views/ProInstances/useLoginProModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,20 @@ export function useLoginProModal() {
}
}, [completeSetupProvider, login.provider, login.status, suggestedOptions])

const resetModal = useCallback(() => {
reset()
login.reset()
if (state.currentStep !== "done" && state.providerID) {
disconnect.run({ id: state.providerID })
}
onClose()
}, [disconnect, login, onClose, reset, state.currentStep, state.providerID])
const resetModal = useCallback(
(checkDanglingProInstance: boolean = false) => {
reset()
login.reset()
if (checkDanglingProInstance) {
const proInstanceID = proInstances?.find((pro) => pro.provider === state.providerID)?.host
if (proInstanceID) {
disconnect.run({ id: proInstanceID })
}
}
onClose()
},
[disconnect, login, onClose, proInstances, reset, state.providerID]
)

useEffect(() => {
if (state.currentStep === "done") {
Expand All @@ -144,7 +150,7 @@ export function useLoginProModal() {
const modal = useMemo(() => {
return (
<Modal
onClose={resetModal}
onClose={() => resetModal(true)}
isOpen={isOpen}
closeOnEsc={login.status !== "loading"}
closeOnOverlayClick={login.status !== "loading"}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,12 @@ import { client } from "../../../client"
import { useProvider } from "../../../contexts"
import { exists, useFormErrors } from "../../../lib"
import { QueryKeys } from "../../../queryKeys"
import { TConfigureProviderConfig, TProviderID, TProviderOptions } from "../../../types"
import {
TConfigureProviderConfig,
TProviderID,
TProviderOption,
TProviderOptions,
} from "../../../types"
import { canCreateMachine } from "../helpers"
import { OptionFormField } from "./OptionFormField"
import { useProviderOptions } from "./useProviderOptions"
Expand Down Expand Up @@ -63,7 +68,7 @@ export function ConfigureProviderOptionsForm({
addProvider = false,
isModal = false,
showBottomActionBar = true,
suggestedOptions = {},
suggestedOptions,
}: TConfigureProviderOptionsFormProps) {
const queryClient = useQueryClient()
const [provider] = useProvider(providerID)
Expand Down Expand Up @@ -116,10 +121,17 @@ export function ConfigureProviderOptionsForm({
} = useMutation<
TProviderOptions | undefined,
Error,
Readonly<{ providerID: TProviderID; config: TConfigureProviderConfig }>
Readonly<{ targetOptionID?: string; options?: TProviderOptions }>
>({
mutationFn: async ({ providerID, config }) => {
return (await client.providers.setOptionsDry(providerID, config)).unwrap()
mutationFn: async ({ targetOptionID, options }) => {
const filteredOptions = filterOptions(formMethods.getValues(), options ?? currentOptions)
if (targetOptionID) {
stripOptionChildren(filteredOptions, currentOptions, targetOptionID)
}

return (
await client.providers.setOptionsDry(providerID, { options: filteredOptions })
).unwrap()
},
onSuccess(data) {
if (!data) {
Expand All @@ -138,16 +150,28 @@ export function ConfigureProviderOptionsForm({
})

useEffect(() => {
if (Object.keys(suggestedOptions).length > 0) {
if (Object.keys(suggestedOptions ?? {}).length > 0) {
const opts = suggestedOptions ?? {}
const changedOptions = []
for (const option in suggestedOptions) {
const { isDirty } = formMethods.getFieldState(option)
if (!isDirty) {
formMethods.setValue(option, suggestedOptions[option], {
formMethods.setValue(option, opts[option], {
shouldDirty: true,
shouldValidate: true,
shouldTouch: true,
})
}
changedOptions.push(option)
}
if (changedOptions.length > 0) {
refreshSubOptionsMutation({
options: changedOptions.reduce((acc, o) => {
const option = { value: opts[o] } as unknown as TProviderOption

return { ...acc, [o]: option }
}, {} as TProviderOptions),
})
}
}
// only rerun when suggestedOptions changes
Expand Down Expand Up @@ -202,19 +226,11 @@ export function ConfigureProviderOptionsForm({
const backgroundColor = useColorModeValue("gray.50", "gray.800")
const borderColor = useBorderColor()

const refreshSubOptions = useCallback(
const handleRefreshSubOptions = useCallback(
(id: string) => {
const filteredOptions = filterOptions(formMethods.getValues(), currentOptions)
stripOptionChildren(filteredOptions, currentOptions, id)

refreshSubOptionsMutation({
providerID,
config: {
options: filteredOptions,
},
})
refreshSubOptionsMutation({ targetOptionID: id })
},
[formMethods, currentOptions, providerID, refreshSubOptionsMutation]
[refreshSubOptionsMutation]
)

const handleSubmit: FormEventHandler<HTMLFormElement> = (event) => {
Expand Down Expand Up @@ -256,7 +272,7 @@ export function ConfigureProviderOptionsForm({
{options.required.map((option) => (
<OptionFormField
key={option.id}
refreshSubOptions={refreshSubOptions}
onRefresh={handleRefreshSubOptions}
isRequired
{...option}
/>
Expand All @@ -277,7 +293,7 @@ export function ConfigureProviderOptionsForm({
{group.options.map((option) => (
<OptionFormField
key={option.id}
refreshSubOptions={refreshSubOptions}
onRefresh={handleRefreshSubOptions}
isRequired={!!option.required}
{...option}
/>
Expand All @@ -295,7 +311,7 @@ export function ConfigureProviderOptionsForm({
{options.other.map((option) => (
<OptionFormField
key={option.id}
refreshSubOptions={refreshSubOptions}
onRefresh={handleRefreshSubOptions}
{...option}
/>
))}
Expand Down
8 changes: 4 additions & 4 deletions desktop/src/views/Providers/AddProvider/OptionFormField.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import {
} from "@chakra-ui/react"

type TOptionFormField = TOptionWithID &
Readonly<{ isRequired?: boolean; refreshSubOptions?: (id: string) => void }>
Readonly<{ isRequired?: boolean; onRefresh?: (id: string) => void }>

export function OptionFormField({
id,
Expand All @@ -27,7 +27,7 @@ export function OptionFormField({
displayName,
suggestions,
enum: enumProp,
refreshSubOptions,
onRefresh,
subOptionsCommand,
isRequired = false,
}: TOptionFormField) {
Expand All @@ -40,7 +40,7 @@ export function OptionFormField({
const defaultValueProp = exists(defaultValue) ? { defaultValue } : {}
const props = { ...defaultValueProp, ...valueProp, ...registerProps }
const refresh = () => {
refreshSubOptions?.(id)
onRefresh?.(id)
}

if (exists(suggestions)) {
Expand Down Expand Up @@ -155,7 +155,7 @@ export function OptionFormField({
suggestions,
enumProp,
type,
refreshSubOptions,
onRefresh,
subOptionsCommand,
displayName,
password,
Expand Down
2 changes: 1 addition & 1 deletion desktop/src/views/Settings/Settings.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,7 @@ function ExperimentalSettings() {

<SettingSection
showDivider={false}
title="DevPod Pro (alpha)"
title="DevPod Pro (beta)"
description="Enable DevPod Pro login and creation">
<Switch
isChecked={settings.experimental_devPodPro}
Expand Down
Loading