diff --git a/composables/masto/masto.ts b/composables/masto/masto.ts index c686bdcd..a1ee9b4c 100644 --- a/composables/masto/masto.ts +++ b/composables/masto/masto.ts @@ -3,7 +3,7 @@ import type { mastodon } from 'masto' import type { Ref } from 'vue' import type { ElkInstance } from '../users' import type { UserLogin } from '~/types' -import { createRestAPIClient, createStreamingAPIClient } from 'masto' +import { createRestAPIClient, createStreamingAPIClient, MastoHttpError } from 'masto' export function createMasto() { return { @@ -30,15 +30,47 @@ export function mastoLogin(masto: ElkMasto, user: Pick { + masto.client.value.v2.instance.fetch().catch(error => new Promise((resolve, reject) => { + if (error instanceof MastoHttpError && error.statusCode === 404) { + return masto.client.value.v1.instance.fetch().then((newInstance) => { + console.warn(`Instance ${server} on version ${newInstance.version} does not support "GET /api/v2/instance" API, try converting to v2 instance... expect some errors`) + const v2Instance = { + ...newInstance, + domain: newInstance.uri, + sourceUrl: '', + usage: { + users: { + activeMonth: 0, + }, + }, + icon: [], + apiVersions: { + mastodon: newInstance.version, + }, + contact: { + email: newInstance.email, + }, + configuration: { + ...(newInstance.configuration ?? {}), + urls: { + streaming: newInstance.urls.streamingApi, + }, + }, + } as unknown as mastodon.v2.Instance + return resolve(v2Instance) + }).catch(reject) + } + + return reject(error) + })).then((newInstance) => { Object.assign(instance, newInstance) - if (newInstance.urls.streamingApi !== streamingApiUrl) - masto.streamingClient.value = createStreamingClient(newInstance.urls.streamingApi) + if (newInstance.configuration.urls.streaming !== streamingApiUrl) + masto.streamingClient.value = createStreamingClient(newInstance.configuration.urls.streaming) instanceStorage.value[server] = newInstance }) diff --git a/composables/users.ts b/composables/users.ts index bf6e46e8..59bdffd7 100644 --- a/composables/users.ts +++ b/composables/users.ts @@ -20,14 +20,13 @@ const mock = process.mock const users: Ref | RemovableRef = import.meta.server ? ref([]) : ref([]) as RemovableRef const nodes = useLocalStorage>(STORAGE_KEY_NODES, {}, { deep: true }) export const currentUserHandle = useLocalStorage(STORAGE_KEY_CURRENT_USER_HANDLE, mock ? mock.user.account.id : '') -export const instanceStorage = useLocalStorage>(STORAGE_KEY_SERVERS, mock ? mock.server : {}, { deep: true }) +export const instanceStorage = useLocalStorage>(STORAGE_KEY_SERVERS, mock ? mock.server : {}, { deep: true }) -export type ElkInstance = Partial & { - uri: string +export type ElkInstance = Partial & { /** support GoToSocial */ accountDomain?: string | null } -export function getInstanceCache(server: string): mastodon.v1.Instance | undefined { +export function getInstanceCache(server: string): mastodon.v2.Instance | undefined { return instanceStorage.value[server] } @@ -52,7 +51,7 @@ export const currentInstance = computed(() => { }) export function getInstanceDomain(instance: ElkInstance) { - return instance.accountDomain || withoutProtocol(instance.uri) + return instance.accountDomain || withoutProtocol(instance.domain || '') } export const publicServer = ref('')