|  | 
|  | 1 | +// @ts-expect-error FIXME: remove when clever-client exports types | 
|  | 2 | +import { ONE_SECOND } from '@clevercloud/client/esm/with-cache.js'; | 
|  | 3 | +import { sendToApi } from '../../lib/send-to-api.js'; | 
|  | 4 | +import { defineSmartComponent } from '../../lib/smart/define-smart-component.js'; | 
|  | 5 | +import { generateDocsHref } from '../../lib/utils.js'; | 
|  | 6 | +import { i18n } from '../../translations/translation.js'; | 
|  | 7 | +import '../cc-smart-container/cc-smart-container.js'; | 
|  | 8 | +import './cc-addon-info.js'; | 
|  | 9 | + | 
|  | 10 | +/** | 
|  | 11 | + * @typedef {import('./cc-addon-info.js').CcAddonInfo} CcAddonInfo | 
|  | 12 | + * @typedef {import('./cc-addon-info.types.js').AddonInfoStateLoading} AddonInfoStateLoading | 
|  | 13 | + * @typedef {import('../cc-addon-header/cc-addon-header.types.js').KubeInfo} KubeInfo | 
|  | 14 | + * @typedef {import('../../lib/smart/smart-component.types.js').OnContextUpdateArgs<CcAddonInfo>} OnContextUpdateArgs | 
|  | 15 | + * @typedef {import('../../lib/send-to-api.types.js').ApiConfig} ApiConfig | 
|  | 16 | + */ | 
|  | 17 | + | 
|  | 18 | +/** @type {AddonInfoStateLoading} */ | 
|  | 19 | +const LOADING_STATE = { | 
|  | 20 | +  type: 'loading', | 
|  | 21 | +  version: { | 
|  | 22 | +    stateType: 'up-to-date', | 
|  | 23 | +    installed: '0.0.0', | 
|  | 24 | +    latest: '0.0.0', | 
|  | 25 | +  }, | 
|  | 26 | +  creationDate: '2025-08-06 15:03:00', | 
|  | 27 | +}; | 
|  | 28 | + | 
|  | 29 | +defineSmartComponent({ | 
|  | 30 | +  selector: 'cc-addon-info[smart-mode="kubernetes"]', | 
|  | 31 | +  params: { | 
|  | 32 | +    apiConfig: { type: Object }, | 
|  | 33 | +    ownerId: { type: String }, | 
|  | 34 | +    kubernetesId: { type: String }, | 
|  | 35 | +  }, | 
|  | 36 | +  /** @param {OnContextUpdateArgs} _ */ | 
|  | 37 | +  onContextUpdate({ context, updateComponent, signal }) { | 
|  | 38 | +    const { apiConfig, ownerId, kubernetesId } = context; | 
|  | 39 | + | 
|  | 40 | +    const api = new Api({ apiConfig, ownerId, kubernetesId, signal }); | 
|  | 41 | + | 
|  | 42 | +    updateComponent('state', LOADING_STATE); | 
|  | 43 | +    updateComponent('docLink', { | 
|  | 44 | +      text: i18n('cc-addon-info.doc-link.kubernetes'), | 
|  | 45 | +      href: generateDocsHref('/kubernetes'), | 
|  | 46 | +    }); | 
|  | 47 | + | 
|  | 48 | +    api | 
|  | 49 | +      .getKubeInfo(ownerId, kubernetesId) | 
|  | 50 | +      .then((kubeInfo) => { | 
|  | 51 | +        updateComponent('state', { | 
|  | 52 | +          type: 'loaded', | 
|  | 53 | +          version: { stateType: 'up-to-date', installed: kubeInfo.version, latest: kubeInfo.version }, | 
|  | 54 | +          creationDate: kubeInfo.creationDate, | 
|  | 55 | +        }); | 
|  | 56 | +      }) | 
|  | 57 | +      .catch((error) => { | 
|  | 58 | +        console.error(error); | 
|  | 59 | +        updateComponent('state', { type: 'error' }); | 
|  | 60 | +      }); | 
|  | 61 | +  }, | 
|  | 62 | +}); | 
|  | 63 | + | 
|  | 64 | +class Api { | 
|  | 65 | +  /** | 
|  | 66 | +   * @param {object} params | 
|  | 67 | +   * @param {ApiConfig} params.apiConfig - API configuration | 
|  | 68 | +   * @param {string} params.ownerId - Owner identifier | 
|  | 69 | +   * @param {string} params.kubernetesId - Cluster identifier | 
|  | 70 | +   * @param {AbortSignal} params.signal - Signal to abort calls | 
|  | 71 | +   */ | 
|  | 72 | +  constructor({ apiConfig, ownerId, kubernetesId, signal }) { | 
|  | 73 | +    this._apiConfig = apiConfig; | 
|  | 74 | +    this._ownerId = ownerId; | 
|  | 75 | +    this._kubernetesId = kubernetesId; | 
|  | 76 | +    this._signal = signal; | 
|  | 77 | +  } | 
|  | 78 | + | 
|  | 79 | +  /** | 
|  | 80 | +   * @param {string} ownerId | 
|  | 81 | +   * @param {string} kubernetesId | 
|  | 82 | +   * @return {Promise<KubeInfo>} | 
|  | 83 | +   */ | 
|  | 84 | +  getKubeInfo(ownerId, kubernetesId) { | 
|  | 85 | +    return getKubeInfo({ ownerId, kubernetesId }) | 
|  | 86 | +      .then(sendToApi({ apiConfig: this._apiConfig, signal: this._signal, cacheDelay: ONE_SECOND })) | 
|  | 87 | +      .then((kubeInfo) => { | 
|  | 88 | +        if (kubeInfo.status === 'DELETED') { | 
|  | 89 | +          throw new Error('This cluster has been deleted'); | 
|  | 90 | +        } | 
|  | 91 | +        return kubeInfo; | 
|  | 92 | +      }); | 
|  | 93 | +  } | 
|  | 94 | +} | 
|  | 95 | + | 
|  | 96 | +// FIXME: remove and use the clever-client call from the new clever-client | 
|  | 97 | +/** @param {{ ownerId: string, kubernetesId: string }} params */ | 
|  | 98 | +function getKubeInfo(params) { | 
|  | 99 | +  // no multipath for /self or /organisations/{id} | 
|  | 100 | +  return Promise.resolve({ | 
|  | 101 | +    method: 'get', | 
|  | 102 | +    url: `/v4/kubernetes/organisations/${params.ownerId}/clusters/${params.kubernetesId}`, | 
|  | 103 | +    // no queryParams | 
|  | 104 | +    // no body | 
|  | 105 | +  }); | 
|  | 106 | +} | 
0 commit comments