refactor: ♻️ Use new Versia branding everywhere

This commit is contained in:
Jesse Wierzbinski 2024-08-28 00:23:29 +02:00
parent b734d8ad67
commit cc54e95e92
No known key found for this signature in database
68 changed files with 147 additions and 154 deletions

View file

@ -19,11 +19,11 @@ FROM oven/bun:1.1.24-alpine AS final
COPY --from=builder /app/.output/ /app COPY --from=builder /app/.output/ /app
LABEL org.opencontainers.image.authors="Gaspard Wierzbinski (https://cpluspatch.com)" LABEL org.opencontainers.image.authors="Gaspard Wierzbinski (https://cpluspatch.com)"
LABEL org.opencontainers.image.source="https://github.com/lysand-org/frontend" LABEL org.opencontainers.image.source="https://github.com/versia-pub/frontend"
LABEL org.opencontainers.image.vendor="Lysand Org" LABEL org.opencontainers.image.vendor="Versia"
LABEL org.opencontainers.image.licenses="AGPL-3.0" LABEL org.opencontainers.image.licenses="AGPL-3.0"
LABEL org.opencontainers.image.title="Lysand-FE" LABEL org.opencontainers.image.title="Versia-FE"
LABEL org.opencontainers.image.description="Frontend for the Lysand Project" LABEL org.opencontainers.image.description="Frontend for the Versia Server Project"
WORKDIR /app WORKDIR /app
CMD ["bun", "run", "server/index.mjs"] CMD ["bun", "run", "server/index.mjs"]

View file

@ -1,10 +1,10 @@
<p align="center"> <p align="center">
<a href="https://lysand.org"><img src="https://cdn.lysand.org/logo-long-dark.webp" alt="Lysand Logo" height="110"></a> <a href="https://versia.pub"><img src="https://cdn.versia.pub/branding/logo-dark.svg" alt="Versia Logo" height="110"></a>
</p> </p>
<center><h1><code>lysand-fe</code></h1></center> <center><h1><code>versia-fe</code></h1></center>
**Lysand-FE** is a beautiful, fast and responsive front-end for the Lysand project. **Versia-FE** is a beautiful, fast and responsive front-end for the Versia Server project.
## Features ## Features
@ -18,7 +18,7 @@
- [x] Following - [x] Following
- [x] Multiple accounts - [x] Multiple accounts
- [x] Custom Emojis - [x] Custom Emojis
- [x] Lysand Permissions support - [x] Versia Server Permissions support
- [x] Note editing - [x] Note editing
- [x] Alt text support everywhere - [x] Alt text support everywhere
- [x] Media uploads - [x] Media uploads
@ -55,31 +55,31 @@ Benchmarks are due to be conducted soon™.
## Installation ## Installation
Lysand-FE is included in the provided `docker-compose` file during [Lysand Server installation](https://github.com/lysand-org/lysand/blob/main/docs/installation.md). Versia-FE is included in the provided `docker-compose` file during [Versia Server installation](https://github.com/versia-pub/server/blob/main/docs/installation.md).
To have Lysand-FE and Lysand Server running on the same domain, edit the Lysand Server configuration to point to the Lysand-FE container's address (`frontend` category inside config). To have Versia-FE and Versia Server running on the same domain, edit the Versia Server configuration to point to the Versia-FE container's address (`frontend` category inside config).
### Manual Installation ### Manual Installation
Here are the steps to install Lysand-FE manually: Here are the steps to install Versia-FE manually:
#### Docker/Podman #### Docker/Podman
```yaml ```yaml
services: services:
fe: fe:
image: ghcr.io/lysand-org/frontend:main image: ghcr.io/versia-pub/frontend:main
container_name: lysand-fe container_name: versia-fe
restart: unless-stopped restart: unless-stopped
networks: networks:
- lysand-net - versia-net
environment: environment:
NUXT_PUBLIC_API_HOST: https://yourserver.com NUXT_PUBLIC_API_HOST: https://yourserver.com
# For Tor users, set the following environment variable in addition to the above # For Tor users, set the following environment variable in addition to the above
# NUXT_PUBLIC_ONION_API_HOST: http://youronionserver.onion # NUXT_PUBLIC_ONION_API_HOST: http://youronionserver.onion
``` ```
Then, the frontend will be available at `http://localhost:3000` inside the container. To link it to a Lysand Server, set the `NUXT_PUBLIC_API_HOST` environment variable to the server's URL. Then, the frontend will be available at `http://localhost:3000` inside the container. To link it to a Versia Server, set the `NUXT_PUBLIC_API_HOST` environment variable to the server's URL.
## License ## License
@ -94,4 +94,4 @@ This project is licensed under the AGPL 3.0 - see the [LICENSE](LICENSE) file fo
### People ### People
- [**April John**](https://github.com/cutestnekoaqua): Creator and maintainer of the Lysand Server ActivityPub bridge. - [**April John**](https://github.com/cutestnekoaqua): Creator and maintainer of the Versia Server ActivityPub bridge.

View file

@ -30,7 +30,7 @@ const customCss = useSetting(SettingIds.CustomCSS);
useSeoMeta({ useSeoMeta({
titleTemplate: (titleChunk) => { titleTemplate: (titleChunk) => {
return titleChunk ? `${titleChunk} · Lysand` : "Lysand"; return titleChunk ? `${titleChunk} · Versia` : "Versia";
}, },
title: computed(() => instance.value?.title ?? ""), title: computed(() => instance.value?.title ?? ""),
ogImage: computed(() => instance.value?.banner.url), ogImage: computed(() => instance.value?.banner.url),
@ -41,7 +41,7 @@ useSeoMeta({
twitterImage: computed(() => instance.value?.banner.url), twitterImage: computed(() => instance.value?.banner.url),
description: computed(() => convert(description.value?.content ?? "")), description: computed(() => convert(description.value?.content ?? "")),
ogDescription: computed(() => convert(description.value?.content ?? "")), ogDescription: computed(() => convert(description.value?.content ?? "")),
ogSiteName: "Lysand", ogSiteName: "Versia",
colorScheme: "dark", colorScheme: "dark",
themeColor: "#f9a8d4", themeColor: "#f9a8d4",
}); });

BIN
bun.lockb

Binary file not shown.

View file

@ -45,7 +45,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Instance, Status } from "@lysand-org/client/types"; import type { Instance, Status } from "@versia/client/types";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
import ButtonBase from "~/packages/ui/components/buttons/button.vue"; import ButtonBase from "~/packages/ui/components/buttons/button.vue";
import { OverlayScrollbarsComponent } from "#imports"; import { OverlayScrollbarsComponent } from "#imports";

View file

@ -10,7 +10,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Emoji } from "@lysand-org/client/types"; import type { Emoji } from "@versia/client/types";
import { distance } from "fastest-levenshtein"; import { distance } from "fastest-levenshtein";
import Avatar from "../avatars/avatar.vue"; import Avatar from "../avatars/avatar.vue";
import AutocompleteSuggestbox from "./autocomplete-suggestbox.vue"; import AutocompleteSuggestbox from "./autocomplete-suggestbox.vue";

View file

@ -9,7 +9,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Account } from "@lysand-org/client/types"; import type { Account } from "@versia/client/types";
import { distance } from "fastest-levenshtein"; import { distance } from "fastest-levenshtein";
import Avatar from "../avatars/avatar.vue"; import Avatar from "../avatars/avatar.vue";
import AutocompleteSuggestbox from "./autocomplete-suggestbox.vue"; import AutocompleteSuggestbox from "./autocomplete-suggestbox.vue";

View file

@ -7,7 +7,7 @@
<p class="mt-6 text-base leading-7 text-gray-400" v-html="error.message"></p> <p class="mt-6 text-base leading-7 text-gray-400" v-html="error.message"></p>
<div class="mt-10 grid grid-cols-2 gap-x-6 mx-auto max-w-md"> <div class="mt-10 grid grid-cols-2 gap-x-6 mx-auto max-w-md">
<Button theme="primary" class="w-full" @click="back">Go back</Button> <Button theme="primary" class="w-full" @click="back">Go back</Button>
<a href="https://github.com/lysand-org/frontend/issues" target="_blank"> <a href="https://github.com/versia-pub/frontend/issues" target="_blank">
<Button theme="secondary" class="w-full">Report an issue</Button> <Button theme="secondary" class="w-full">Report an issue</Button>
</a> </a>
</div> </div>

View file

@ -28,7 +28,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { ResponseError } from "@lysand-org/client"; import type { ResponseError } from "@versia/client";
import Button from "~/packages/ui/components/buttons/button.vue"; import Button from "~/packages/ui/components/buttons/button.vue";
import Avatar from "../avatars/avatar.vue"; import Avatar from "../avatars/avatar.vue";

View file

@ -45,7 +45,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { ResponseError } from "@lysand-org/client"; import type { ResponseError } from "@versia/client";
import Button from "~/packages/ui/components/buttons/button.vue"; import Button from "~/packages/ui/components/buttons/button.vue";
import Avatar from "../avatars/avatar.vue"; import Avatar from "../avatars/avatar.vue";
import RichTextboxInput from "../inputs/rich-textbox-input.vue"; import RichTextboxInput from "../inputs/rich-textbox-input.vue";

View file

@ -4,7 +4,8 @@
aria-label="Navigation" role="complementary"> aria-label="Navigation" role="complementary">
<NuxtLink href="/"> <NuxtLink href="/">
<img crossorigin="anonymous" class="size-11 rounded ring-1 ring-white/10 hover:scale-105 duration-200" <img crossorigin="anonymous" class="size-11 rounded ring-1 ring-white/10 hover:scale-105 duration-200"
:src="instance?.thumbnail.url ?? '/logo.webp'" alt="Logo of your instance" /> :src="instance?.thumbnail.url ?? 'https://cdn.versia.pub/branding/icon.svg'"
alt="Logo of your instance" />
</NuxtLink> </NuxtLink>
<div class="flex flex-col gap-3"> <div class="flex flex-col gap-3">
@ -148,7 +149,7 @@ const compose = () => {
const signIn = async () => { const signIn = async () => {
loadingAuth.value = true; loadingAuth.value = true;
const output = await client.value.createApp("Lysand", { const output = await client.value.createApp("Versia", {
scopes: ["read", "write", "follow", "push"], scopes: ["read", "write", "follow", "push"],
redirect_uris: new URL("/", useRequestURL().origin).toString(), redirect_uris: new URL("/", useRequestURL().origin).toString(),
website: useBaseUrl().value, website: useBaseUrl().value,
@ -195,7 +196,7 @@ const signOut = async (id?: string) => {
return; return;
} }
// Don't do anything on error, as Lysand doesn't implement the revoke endpoint yet // Don't do anything on error, as Versia Server doesn't implement the revoke endpoint yet
await client.value await client.value
?.revokeToken( ?.revokeToken(
appData.value.client_id, appData.value.client_id,

View file

@ -44,7 +44,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Dialog } from "@ark-ui/vue"; import { Dialog } from "@ark-ui/vue";
import type { Attachment } from "@lysand-org/client/types"; import type { Attachment } from "@versia/client/types";
const lightbox = ref(false); const lightbox = ref(false);
const attachment = ref<Attachment | null>(null); const attachment = ref<Attachment | null>(null);

View file

@ -39,7 +39,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Popover } from "@ark-ui/vue"; import { Popover } from "@ark-ui/vue";
import type { Attachment } from "@lysand-org/client/types"; import type { Attachment } from "@versia/client/types";
const props = defineProps<{ const props = defineProps<{
attachment: Attachment; attachment: Attachment;

View file

@ -68,7 +68,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import Avatar from "~/components/avatars/avatar.vue"; import Avatar from "~/components/avatars/avatar.vue";
import Skeleton from "~/components/skeleton/Skeleton.vue"; import Skeleton from "~/components/skeleton/Skeleton.vue";
import UserCard from "~/components/social-elements/users/UserCard.vue"; import UserCard from "~/components/social-elements/users/UserCard.vue";

View file

@ -8,7 +8,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Account } from "@lysand-org/client/types"; import type { Account } from "@versia/client/types";
defineProps<{ defineProps<{
account: Account; account: Account;

View file

@ -25,7 +25,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import Skeleton from "~/components/skeleton/Skeleton.vue"; import Skeleton from "~/components/skeleton/Skeleton.vue";
import Button from "~/packages/ui/components/buttons/button.vue"; import Button from "~/packages/ui/components/buttons/button.vue";
import Attachment from "./attachment.vue"; import Attachment from "./attachment.vue";

View file

@ -147,7 +147,7 @@
<script lang="ts" setup> <script lang="ts" setup>
import { Menu } from "@ark-ui/vue"; import { Menu } from "@ark-ui/vue";
import { RolePermission, type Status } from "@lysand-org/client/types"; import { RolePermission, type Status } from "@versia/client/types";
import Avatar from "~/components/avatars/avatar.vue"; import Avatar from "~/components/avatars/avatar.vue";
import ButtonDropdown from "~/components/buttons/button-dropdown.vue"; import ButtonDropdown from "~/components/buttons/button-dropdown.vue";
import AdaptiveDropdown from "~/components/dropdowns/AdaptiveDropdown.vue"; import AdaptiveDropdown from "~/components/dropdowns/AdaptiveDropdown.vue";

View file

@ -28,7 +28,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Notification } from "@lysand-org/client/types"; import type { Notification } from "@versia/client/types";
import Avatar from "~/components/avatars/avatar.vue"; import Avatar from "~/components/avatars/avatar.vue";
import Skeleton from "~/components/skeleton/Skeleton.vue"; import Skeleton from "~/components/skeleton/Skeleton.vue";
import Button from "~/packages/ui/components/buttons/button.vue"; import Button from "~/packages/ui/components/buttons/button.vue";

View file

@ -44,7 +44,7 @@
<div class="flex flex-row flex-wrap gap-4 mt-4" v-if="isDeveloper || visibleRoles.length > 0"> <div class="flex flex-row flex-wrap gap-4 mt-4" v-if="isDeveloper || visibleRoles.length > 0">
<Badge v-for="role of visibleRoles" :key="role.id" :name="role.name" :description="role.description" <Badge v-for="role of visibleRoles" :key="role.id" :name="role.name" :description="role.description"
:img="role.icon" /> :img="role.icon" />
<Badge v-if="isDeveloper" name="Lysand Developer" description="This user is a Lysand developer." <Badge v-if="isDeveloper" name="Versia Developer" description="This user is a Versia developer."
:verified="true" /> :verified="true" />
</div> </div>
</div> </div>
@ -103,7 +103,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Account } from "@lysand-org/client/types"; import type { Account } from "@versia/client/types";
import Avatar from "~/components/avatars/avatar.vue"; import Avatar from "~/components/avatars/avatar.vue";
import Skeleton from "~/components/skeleton/Skeleton.vue"; import Skeleton from "~/components/skeleton/Skeleton.vue";
import Button from "~/packages/ui/components/buttons/button.vue"; import Button from "~/packages/ui/components/buttons/button.vue";

View file

@ -90,7 +90,7 @@ import {
type Account, type Account,
type Relationship, type Relationship,
RolePermission, RolePermission,
} from "@lysand-org/client/types"; } from "@versia/client/types";
import ButtonDropdown from "~/components/buttons/button-dropdown.vue"; import ButtonDropdown from "~/components/buttons/button-dropdown.vue";
import AdaptiveDropdown from "~/components/dropdowns/AdaptiveDropdown.vue"; import AdaptiveDropdown from "~/components/dropdowns/AdaptiveDropdown.vue";
import Button from "~/packages/ui/components/buttons/button.vue"; import Button from "~/packages/ui/components/buttons/button.vue";

View file

@ -27,7 +27,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Account } from "@lysand-org/client/types"; import type { Account } from "@versia/client/types";
import Avatar from "~/components/avatars/avatar.vue"; import Avatar from "~/components/avatars/avatar.vue";
import Skeleton from "~/components/skeleton/Skeleton.vue"; import Skeleton from "~/components/skeleton/Skeleton.vue";
import { NuxtLink } from "#components"; import { NuxtLink } from "#components";

View file

@ -37,8 +37,8 @@
<div class="flex flex-row flex-wrap gap-4 mt-4" v-if="isDeveloper || visibleRoles.length > 0"> <div class="flex flex-row flex-wrap gap-4 mt-4" v-if="isDeveloper || visibleRoles.length > 0">
<Badge v-for="role of visibleRoles" :key="role.id" :name="role.name" <Badge v-for="role of visibleRoles" :key="role.id" :name="role.name"
:description="role.description" :img="role.icon" /> :description="role.description" :img="role.icon" />
<Badge v-if="isDeveloper" name="Lysand Developer" <Badge v-if="isDeveloper" name="Versia Developer"
description="This user is a Lysand developer." :verified="true" /> description="This user is a Versia developer." :verified="true" />
</div> </div>
</div> </div>
@ -85,7 +85,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { HoverCard } from "@ark-ui/vue"; import { HoverCard } from "@ark-ui/vue";
import type { Account } from "@lysand-org/client/types"; import type { Account } from "@versia/client/types";
import Avatar from "~/components/avatars/avatar.vue"; import Avatar from "~/components/avatars/avatar.vue";
import { SettingIds } from "~/settings"; import { SettingIds } from "~/settings";
import Badge from "./Badge.vue"; import Badge from "./Badge.vue";

View file

@ -5,7 +5,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import Timeline from "./timeline.vue"; import Timeline from "./timeline.vue";
const props = defineProps<{ const props = defineProps<{

View file

@ -5,7 +5,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import { useHomeTimeline } from "~/composables/HomeTimeline"; import { useHomeTimeline } from "~/composables/HomeTimeline";
import Timeline from "./timeline.vue"; import Timeline from "./timeline.vue";

View file

@ -5,7 +5,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import { useLocalTimeline } from "~/composables/LocalTimeline"; import { useLocalTimeline } from "~/composables/LocalTimeline";
import Timeline from "./timeline.vue"; import Timeline from "./timeline.vue";

View file

@ -5,7 +5,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Notification } from "@lysand-org/client/types"; import type { Notification } from "@versia/client/types";
import { useNotificationTimeline } from "~/composables/NotificationTimeline"; import { useNotificationTimeline } from "~/composables/NotificationTimeline";
import Timeline from "./timeline.vue"; import Timeline from "./timeline.vue";

View file

@ -5,7 +5,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import { usePublicTimeline } from "~/composables/PublicTimeline"; import { usePublicTimeline } from "~/composables/PublicTimeline";
import Timeline from "./timeline.vue"; import Timeline from "./timeline.vue";

View file

@ -4,7 +4,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Notification, Status } from "@lysand-org/client/types"; import type { Notification, Status } from "@versia/client/types";
import { computed } from "vue"; import { computed } from "vue";
import NoteItem from "../social-elements/notes/note.vue"; import NoteItem from "../social-elements/notes/note.vue";
import NotificationItem from "../social-elements/notifications/notif.vue"; import NotificationItem from "../social-elements/notifications/notif.vue";

View file

@ -6,7 +6,7 @@
const root = useParentElement(useParentElement()); const root = useParentElement(useParentElement());
// Store and keep y to restore it on page change // Store and keep y to restore it on page change
const route = useRoute(); const route = useRoute();
const yStored = useLocalStorage("lysand:scroll", { const yStored = useLocalStorage("versia:scroll", {
[route.fullPath]: 0, [route.fullPath]: 0,
}); });
const { y } = useScroll(root); const { y } = useScroll(root);

View file

@ -35,7 +35,7 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import type { Notification, Status } from "@lysand-org/client/types"; import type { Notification, Status } from "@versia/client/types";
import { useIntersectionObserver } from "@vueuse/core"; import { useIntersectionObserver } from "@vueuse/core";
import { onMounted, watch } from "vue"; import { onMounted, watch } from "vue";
import Button from "~/packages/ui/components/buttons/button.vue"; import Button from "~/packages/ui/components/buttons/button.vue";

View file

@ -1,8 +1,8 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Account } from "@lysand-org/client/types"; import type { Account } from "@versia/client/types";
export const useAccount = ( export const useAccount = (
client: MaybeRef<LysandClient | null>, client: MaybeRef<Client | null>,
accountId: MaybeRef<string | null>, accountId: MaybeRef<string | null>,
) => { ) => {
if (!client) { if (!client) {

View file

@ -1,8 +1,8 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Account } from "@lysand-org/client/types"; import type { Account } from "@versia/client/types";
export const useAccountSearch = ( export const useAccountSearch = (
client: MaybeRef<LysandClient | null>, client: MaybeRef<Client | null>,
q: string, q: string,
): Ref<Account[] | null> => { ): Ref<Account[] | null> => {
const output = ref(null as Account[] | null); const output = ref(null as Account[] | null);

View file

@ -1,9 +1,9 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import { type TimelineOptions, useTimeline } from "./Timeline"; import { type TimelineOptions, useTimeline } from "./Timeline";
export function useAccountTimeline( export function useAccountTimeline(
client: LysandClient, client: Client,
accountId: string, accountId: string,
options: Partial<TimelineOptions<Status>> = {}, options: Partial<TimelineOptions<Status>> = {},
) { ) {

View file

@ -1,8 +1,8 @@
import type { ApplicationData } from "@lysand-org/client/types"; import type { ApplicationData } from "@versia/client/types";
import { StorageSerializers } from "@vueuse/core"; import { StorageSerializers } from "@vueuse/core";
export const useAppData = () => { export const useAppData = () => {
return useLocalStorage<ApplicationData | null>("lysand:app_data", null, { return useLocalStorage<ApplicationData | null>("versia:app_data", null, {
serializer: StorageSerializers.object, serializer: StorageSerializers.object,
}); });
}; };

View file

@ -1,7 +1,7 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { RolePermission } from "@lysand-org/client/types"; import type { RolePermission } from "@versia/client/types";
export const useCacheRefresh = (client: MaybeRef<LysandClient | null>) => { export const useCacheRefresh = (client: MaybeRef<Client | null>) => {
if (import.meta.server) { if (import.meta.server) {
return; return;
} }

View file

@ -1,11 +1,11 @@
import { LysandClient, type Token } from "@lysand-org/client"; import { Client, type Token } from "@versia/client";
export const useClient = ( export const useClient = (
customToken: MaybeRef<Token | null> = null, customToken: MaybeRef<Token | null> = null,
): Ref<LysandClient> => { ): Ref<Client> => {
return computed( return computed(
() => () =>
new LysandClient( new Client(
new URL(useBaseUrl().value), new URL(useBaseUrl().value),
toValue(customToken)?.access_token ?? toValue(customToken)?.access_token ??
identity.value?.tokens.access_token ?? identity.value?.tokens.access_token ??

View file

@ -1,5 +1,5 @@
import type { createToaster } from "@ark-ui/vue"; import type { createToaster } from "@ark-ui/vue";
import type { Account, Attachment, Status } from "@lysand-org/client/types"; import type { Account, Attachment, Status } from "@versia/client/types";
import mitt from "mitt"; import mitt from "mitt";
import type { Identity } from "./Identities"; import type { Identity } from "./Identities";

View file

@ -1,13 +1,11 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
type ExtendedDescription = { type ExtendedDescription = {
updated_at: string; updated_at: string;
content: string; content: string;
}; };
export const useExtendedDescription = ( export const useExtendedDescription = (client: MaybeRef<Client | null>) => {
client: MaybeRef<LysandClient | null>,
) => {
if (!ref(client).value) { if (!ref(client).value) {
return ref(null as ExtendedDescription | null); return ref(null as ExtendedDescription | null);
} }

View file

@ -1,9 +1,9 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import { type TimelineOptions, useTimeline } from "./Timeline"; import { type TimelineOptions, useTimeline } from "./Timeline";
export function useHomeTimeline( export function useHomeTimeline(
client: LysandClient, client: Client,
options: Partial<TimelineOptions<Status>> = {}, options: Partial<TimelineOptions<Status>> = {},
) { ) {
return useTimeline(client, { return useTimeline(client, {

View file

@ -1,10 +1,10 @@
import type { Token } from "@lysand-org/client"; import type { Token } from "@versia/client";
import type { import type {
Account, Account,
Emoji, Emoji,
Instance, Instance,
RolePermission, RolePermission,
} from "@lysand-org/client/types"; } from "@versia/client/types";
import { StorageSerializers, useLocalStorage } from "@vueuse/core"; import { StorageSerializers, useLocalStorage } from "@vueuse/core";
import { ref, watch } from "vue"; import { ref, watch } from "vue";
@ -25,7 +25,7 @@ export interface Identity {
* @returns A reactive reference to an array of identities. * @returns A reactive reference to an array of identities.
*/ */
function useIdentities(): Ref<Identity[]> { function useIdentities(): Ref<Identity[]> {
return useLocalStorage<Identity[]>("lysand:identities", [], { return useLocalStorage<Identity[]>("versia:identities", [], {
serializer: StorageSerializers.object, serializer: StorageSerializers.object,
}); });
} }
@ -33,7 +33,7 @@ function useIdentities(): Ref<Identity[]> {
export const identities = useIdentities(); export const identities = useIdentities();
const currentId = useLocalStorage<string | null>( const currentId = useLocalStorage<string | null>(
"lysand:identities:current", "versia:identities:current",
null, null,
); );

View file

@ -1,11 +1,11 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { ExtendedDescription, Instance } from "@lysand-org/client/types"; import type { ExtendedDescription, Instance } from "@versia/client/types";
export const useInstance = () => { export const useInstance = () => {
return computed(() => identity.value?.instance); return computed(() => identity.value?.instance);
}; };
export const useInstanceFromClient = (client: MaybeRef<LysandClient>) => { export const useInstanceFromClient = (client: MaybeRef<Client>) => {
if (!client) { if (!client) {
return ref(null as Instance | null); return ref(null as Instance | null);
} }
@ -23,7 +23,7 @@ export const useInstanceFromClient = (client: MaybeRef<LysandClient>) => {
return output; return output;
}; };
export const useTos = (client: MaybeRef<LysandClient>) => { export const useTos = (client: MaybeRef<Client>) => {
if (!client) { if (!client) {
return ref(null as ExtendedDescription | null); return ref(null as ExtendedDescription | null);
} }

View file

@ -1,4 +1,4 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
type SSOProvider = { type SSOProvider = {
id: string; id: string;
@ -6,7 +6,7 @@ type SSOProvider = {
icon: string; icon: string;
}; };
export const useLinkedSSO = (client: MaybeRef<LysandClient>) => { export const useLinkedSSO = (client: MaybeRef<Client>) => {
if (!client) { if (!client) {
return ref([] as SSOProvider[]); return ref([] as SSOProvider[]);
} }

View file

@ -1,9 +1,9 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import { type TimelineOptions, useTimeline } from "./Timeline"; import { type TimelineOptions, useTimeline } from "./Timeline";
export function useLocalTimeline( export function useLocalTimeline(
client: LysandClient, client: Client,
options: Partial<TimelineOptions<Status>> = {}, options: Partial<TimelineOptions<Status>> = {},
) { ) {
return useTimeline(client, { return useTimeline(client, {

View file

@ -1,10 +1,7 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
export const useNote = ( export const useNote = (client: MaybeRef<Client | null>, noteId: string) => {
client: MaybeRef<LysandClient | null>,
noteId: string,
) => {
if (!ref(client).value) { if (!ref(client).value) {
return ref(null as Status | null); return ref(null as Status | null);
} }

View file

@ -1,8 +1,8 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Context } from "@lysand-org/client/types"; import type { Context } from "@versia/client/types";
export const useNoteContext = ( export const useNoteContext = (
client: MaybeRef<LysandClient | null>, client: MaybeRef<Client | null>,
noteId: MaybeRef<string | null>, noteId: MaybeRef<string | null>,
) => { ) => {
if (!ref(client).value) { if (!ref(client).value) {

View file

@ -1,10 +1,10 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import { SettingIds, type Settings } from "~/settings"; import { SettingIds, type Settings } from "~/settings";
export const useNoteData = ( export const useNoteData = (
noteProp: MaybeRef<Status | undefined>, noteProp: MaybeRef<Status | undefined>,
client: Ref<LysandClient>, client: Ref<Client>,
settings: MaybeRef<Settings>, settings: MaybeRef<Settings>,
) => { ) => {
const isReply = computed(() => !!toValue(noteProp)?.in_reply_to_id); const isReply = computed(() => !!toValue(noteProp)?.in_reply_to_id);

View file

@ -1,9 +1,9 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Notification } from "@lysand-org/client/types"; import type { Notification } from "@versia/client/types";
import { type TimelineOptions, useTimeline } from "./Timeline"; import { type TimelineOptions, useTimeline } from "./Timeline";
export function useNotificationTimeline( export function useNotificationTimeline(
client: LysandClient, client: Client,
options: Partial<TimelineOptions<Notification>> = {}, options: Partial<TimelineOptions<Notification>> = {},
) { ) {
return useTimeline(client, { return useTimeline(client, {

View file

@ -1,4 +1,4 @@
import type { Account, Emoji } from "@lysand-org/client/types"; import type { Account, Emoji } from "@versia/client/types";
import { renderToString } from "vue/server-renderer"; import { renderToString } from "vue/server-renderer";
import { SettingIds, type Settings } from "~/settings"; import { SettingIds, type Settings } from "~/settings";
import MentionComponent from "../components/social-elements/notes/mention.vue"; import MentionComponent from "../components/social-elements/notes/mention.vue";

View file

@ -1,9 +1,9 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Status } from "@lysand-org/client/types"; import type { Status } from "@versia/client/types";
import { type TimelineOptions, useTimeline } from "./Timeline"; import { type TimelineOptions, useTimeline } from "./Timeline";
export function usePublicTimeline( export function usePublicTimeline(
client: LysandClient, client: Client,
options: Partial<TimelineOptions<Status>> = {}, options: Partial<TimelineOptions<Status>> = {},
) { ) {
return useTimeline(client, { return useTimeline(client, {

View file

@ -1,8 +1,8 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Relationship } from "@lysand-org/client/types"; import type { Relationship } from "@versia/client/types";
export const useRelationship = ( export const useRelationship = (
client: MaybeRef<LysandClient | null>, client: MaybeRef<Client | null>,
accountId: MaybeRef<string | null>, accountId: MaybeRef<string | null>,
) => { ) => {
const relationship = ref(null as Relationship | null); const relationship = ref(null as Relationship | null);

View file

@ -1,9 +1,9 @@
import type { LysandClient } from "@lysand-org/client"; import type { Client } from "@versia/client";
import type { Account, Mention } from "@lysand-org/client/types"; import type { Account, Mention } from "@versia/client/types";
export const useResolveMentions = ( export const useResolveMentions = (
mentions: Ref<Mention[]>, mentions: Ref<Mention[]>,
client: LysandClient | null, client: Client | null,
): Ref<Account[]> => { ): Ref<Account[]> => {
if (!client) { if (!client) {
return ref([]); return ref([]);

View file

@ -1,4 +1,4 @@
import type { Instance } from "@lysand-org/client/types"; import type { Instance } from "@versia/client/types";
export const useSSOConfig = (): Ref<Instance["sso"] | null> => { export const useSSOConfig = (): Ref<Instance["sso"] | null> => {
const instance = useInstance(); const instance = useInstance();

View file

@ -1,6 +1,5 @@
import { StorageSerializers } from "@vueuse/core"; import { StorageSerializers } from "@vueuse/core";
import { import {
type Setting,
type SettingIds, type SettingIds,
type Settings, type Settings,
mergeSettings, mergeSettings,
@ -8,7 +7,7 @@ import {
} from "~/settings"; } from "~/settings";
const useSettings = () => { const useSettings = () => {
return useLocalStorage<Settings>("lysand:settings", settingsJson, { return useLocalStorage<Settings>("versia:settings", settingsJson, {
serializer: { serializer: {
read(raw) { read(raw) {
const json = StorageSerializers.object.read(raw); const json = StorageSerializers.object.read(raw);

View file

@ -1,18 +1,15 @@
import type { LysandClient, Output } from "@lysand-org/client"; import type { Client, Output } from "@versia/client";
import type { Notification, Status } from "@lysand-org/client/types"; import type { Notification, Status } from "@versia/client/types";
import { useIntervalFn } from "@vueuse/core"; import { useIntervalFn } from "@vueuse/core";
export interface TimelineOptions<T> { export interface TimelineOptions<T> {
fetchFunction: ( fetchFunction: (client: Client, options: object) => Promise<Output<T[]>>;
client: LysandClient,
options: object,
) => Promise<Output<T[]>>;
updateInterval?: number; updateInterval?: number;
limit?: number; limit?: number;
} }
export function useTimeline<T extends Status | Notification>( export function useTimeline<T extends Status | Notification>(
client: LysandClient, client: Client,
options: TimelineOptions<T>, options: TimelineOptions<T>,
) { ) {
const items = ref<T[]>([]) as Ref<T[]>; const items = ref<T[]>([]) as Ref<T[]>;

View file

@ -24,9 +24,9 @@ export default defineNuxtConfig({
compatibilityDate: "2024-07-21", compatibilityDate: "2024-07-21",
pwa: { pwa: {
manifest: { manifest: {
name: "Lysand", name: "Versia",
short_name: "Lysand", short_name: "Versia",
description: "Frontend for the Lysand social network", description: "Frontend for the Versia social network",
theme_color: "#f9a8d4", theme_color: "#f9a8d4",
background_color: "#131313", background_color: "#131313",
display: "standalone", display: "standalone",
@ -270,7 +270,7 @@ export default defineNuxtConfig({
public: { public: {
language: "en-US", language: "en-US",
titleSeparator: "·", titleSeparator: "·",
siteName: "Lysand", siteName: "Versia",
trailingSlash: true, trailingSlash: true,
apiHost: "https://social.lysand.org", apiHost: "https://social.lysand.org",
onionApiHost: undefined, onionApiHost: undefined,

View file

@ -1,5 +1,5 @@
{ {
"name": "lysand-fe", "name": "versia-fe",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "AGPL-3.0", "license": "AGPL-3.0",
@ -17,11 +17,11 @@
], ],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "git+https://github.com/lysand-org/frontend.git" "url": "git+https://github.com/versia-pub/frontend.git"
}, },
"scripts": { "scripts": {
"build": "nuxt build", "build": "nuxt build",
"dev": "nuxt dev --https --https.cert config/lysand-fe.localhost.pem --https.key config/lysand-fe.localhost-key.pem --host lysand-fe.localhost", "dev": "nuxt dev --https --https.cert config/versia-fe.localhost.pem --https.key config/versia-fe.localhost-key.pem --host versia-fe.localhost",
"generate": "nuxt generate", "generate": "nuxt generate",
"preview": "nuxt preview", "preview": "nuxt preview",
"postinstall": "nuxt prepare", "postinstall": "nuxt prepare",
@ -30,11 +30,11 @@
}, },
"dependencies": { "dependencies": {
"@ark-ui/vue": "3.6.0", "@ark-ui/vue": "3.6.0",
"@lysand-org/client": "^0.2.5",
"@nuxt/fonts": "^0.7.2", "@nuxt/fonts": "^0.7.2",
"@tailwindcss/typography": "^0.5.14", "@tailwindcss/typography": "^0.5.14",
"@vee-validate/nuxt": "^4.13.2", "@vee-validate/nuxt": "^4.13.2",
"@vee-validate/zod": "^4.13.2", "@vee-validate/zod": "^4.13.2",
"@versia/client": "^0.1.0-rc.0",
"@vite-pwa/nuxt": "^0.10.0", "@vite-pwa/nuxt": "^0.10.0",
"@vueuse/core": "^11.0.1", "@vueuse/core": "^11.0.1",
"@vueuse/nuxt": "^11.0.1", "@vueuse/nuxt": "^11.0.1",

View file

@ -10,11 +10,11 @@
"readme": "README.md", "readme": "README.md",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/lysand-org/frontend.git", "url": "https://github.com/versia-pub/frontend.git",
"directory": "packages/ui" "directory": "packages/ui"
}, },
"bugs": { "bugs": {
"url": "https://github.com/lysand-org/frontend/issues" "url": "https://github.com/versia-pub/frontend/issues"
}, },
"license": "MIT", "license": "MIT",
"contributors": [ "contributors": [

View file

@ -10,7 +10,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import type { Account } from "@lysand-org/client/types"; import type { Account } from "@versia/client/types";
import ErrorBoundary from "~/components/errors/ErrorBoundary.vue"; import ErrorBoundary from "~/components/errors/ErrorBoundary.vue";
import AccountProfile from "~/components/social-elements/users/Account.vue"; import AccountProfile from "~/components/social-elements/users/Account.vue";
import AccountTimeline from "~/components/timelines/account.vue"; import AccountTimeline from "~/components/timelines/account.vue";

View file

@ -1,7 +1,8 @@
<template> <template>
<div class="px-4 py-20 prose prose-invert mx-auto max-w-md"> <div class="px-4 py-20 prose prose-invert mx-auto max-w-md">
<h2>Where is the mobile app?</h2> <h2>Where is the mobile app?</h2>
<p>Lysand is compatible with the Mastodon API, meaning it can be used with any Mastodon-compatible client. This <p>Versia Server is compatible with the Mastodon API, meaning it can be used with any Mastodon-compatible
client. This
includes the official Mastodon app, as well as many third-party clients.</p> includes the official Mastodon app, as well as many third-party clients.</p>
<h2>Recommended Clients</h2> <h2>Recommended Clients</h2>
<ul class="w-full flex flex-col gap-3 mt-4 not-prose"> <ul class="w-full flex flex-col gap-3 mt-4 not-prose">
@ -27,7 +28,7 @@
</ul> </ul>
<p> <p>
Found a problem? Report it on <a href="https://github.com/lysand-org/lysand/issues/new/choose" Found a problem? Report it on <a href="https://github.com/versia-pub/server/issues/new/choose"
target="_blank" class="underline text-primary-700">the issue tracker</a>. target="_blank" class="underline text-primary-700">the issue tracker</a>.
</p> </p>
</div> </div>

View file

@ -1,6 +1,6 @@
<template> <template>
<div class="flex min-h-screen relative flex-col gap-10 justify-center py-12 px-8"> <div class="flex min-h-screen relative flex-col gap-10 justify-center py-12 px-8">
<img crossorigin="anonymous" src="https://cdn.lysand.org/logo.webp" alt="Lysand logo" <img crossorigin="anonymous" src="https://cdn.versia.pub/branding/icon.svg" alt="Versia logo"
class="mx-auto hidden md:inline-block h-20 ring-1 ring-white/20 rounded" /> class="mx-auto hidden md:inline-block h-20 ring-1 ring-white/20 rounded" />
<div v-if="validUrlParameters" class="mx-auto w-full max-w-md"> <div v-if="validUrlParameters" class="mx-auto w-full max-w-md">
<VeeForm class="flex flex-col gap-y-6" method="POST" :validation-schema="schema" <VeeForm class="flex flex-col gap-y-6" method="POST" :validation-schema="schema"
@ -89,7 +89,7 @@
</p> </p>
<p class="mt-6 text-lg leading-8 text-gray-300"> <p class="mt-6 text-lg leading-8 text-gray-300">
Found a problem? Report it on <a href="https://github.com/lysand-org/lysand/issues/new/choose" Found a problem? Report it on <a href="https://github.com/versia-pub/server/issues/new/choose"
target="_blank" class="underline text-primary-700">the issue tracker</a>. target="_blank" class="underline text-primary-700">the issue tracker</a>.
</p> </p>
</div> </div>
@ -97,7 +97,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { LysandClient } from "@lysand-org/client"; import { Client } from "@versia/client";
import { toTypedSchema } from "@vee-validate/zod"; import { toTypedSchema } from "@vee-validate/zod";
import { z } from "zod"; import { z } from "zod";
import FieldError from "~/components/inputs/field-error.vue"; import FieldError from "~/components/inputs/field-error.vue";
@ -125,7 +125,7 @@ const validUrlParameters =
params.scope; params.scope;
const instance = useInstanceFromClient( const instance = useInstanceFromClient(
new LysandClient(new URL(useBaseUrl().value)), new Client(new URL(useBaseUrl().value)),
); );
const ssoConfig = computed(() => instance.value?.sso); const ssoConfig = computed(() => instance.value?.sso);

View file

@ -15,7 +15,7 @@
</p> </p>
<p class="mt-6 text-lg leading-8 text-gray-300"> <p class="mt-6 text-lg leading-8 text-gray-300">
Found a problem? Report it on <a href="https://github.com/lysand-org/lysand/issues/new/choose" Found a problem? Report it on <a href="https://github.com/versia-pub/server/issues/new/choose"
target="_blank" class="underline text-primary-700">the issue tracker</a>. target="_blank" class="underline text-primary-700">the issue tracker</a>.
</p> </p>
</div> </div>

View file

@ -75,7 +75,7 @@
</p> </p>
<p class="mt-6 text-lg leading-8 text-gray-300"> <p class="mt-6 text-lg leading-8 text-gray-300">
Found a problem? Report it on <a href="https://github.com/lysand-org/lysand/issues/new/choose" Found a problem? Report it on <a href="https://github.com/versia-pub/server/issues/new/choose"
target="_blank" class="underline text-primary-700">the issue tracker</a>. target="_blank" class="underline text-primary-700">the issue tracker</a>.
</p> </p>
</div> </div>

View file

@ -1,6 +1,6 @@
<template> <template>
<div class="flex min-h-screen relative flex-col gap-10 justify-center py-12 px-8"> <div class="flex min-h-screen relative flex-col gap-10 justify-center py-12 px-8">
<img crossorigin="anonymous" src="https://cdn.lysand.org/logo.webp" alt="Lysand logo" <img crossorigin="anonymous" src="https://cdn.versia.pub/branding/icon.svg" alt="Versia logo"
class="mx-auto hidden md:inline-block h-20 ring-1 ring-white/20 rounded" /> class="mx-auto hidden md:inline-block h-20 ring-1 ring-white/20 rounded" />
<div v-if="validUrlParameters" class="mx-auto w-full max-w-md"> <div v-if="validUrlParameters" class="mx-auto w-full max-w-md">
<VeeForm class="flex flex-col gap-y-6" method="POST" :validation-schema="schema" action="/api/auth/reset"> <VeeForm class="flex flex-col gap-y-6" method="POST" :validation-schema="schema" action="/api/auth/reset">
@ -59,7 +59,7 @@
</p> </p>
<p class="mt-6 text-lg leading-8 text-gray-300"> <p class="mt-6 text-lg leading-8 text-gray-300">
Found a problem? Report it on <a href="https://github.com/lysand-org/lysand/issues/new/choose" Found a problem? Report it on <a href="https://github.com/versia-pub/server/issues/new/choose"
target="_blank" class="underline text-primary-700">the issue tracker</a>. target="_blank" class="underline text-primary-700">the issue tracker</a>.
</p> </p>
</div> </div>

View file

@ -1,6 +1,6 @@
<template> <template>
<div class="flex min-h-screen flex-col justify-center px-6 py-12 gap-10 lg:px-8 relative"> <div class="flex min-h-screen flex-col justify-center px-6 py-12 gap-10 lg:px-8 relative">
<img crossorigin="anonymous" src="https://cdn.lysand.org/logo.webp" alt="Lysand logo" <img crossorigin="anonymous" src="https://cdn.versia.pub/branding/icon.svg" alt="Versia logo"
class="mx-auto hidden md:inline-block h-20" /> class="mx-auto hidden md:inline-block h-20" />
<div v-if="true" class="mx-auto w-full max-w-md"> <div v-if="true" class="mx-auto w-full max-w-md">
<div v-if="Object.keys(errors).length > 0" <div v-if="Object.keys(errors).length > 0"
@ -102,7 +102,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { Collapsible } from "@ark-ui/vue"; import { Collapsible } from "@ark-ui/vue";
import type { ResponseError } from "@lysand-org/client"; import type { ResponseError } from "@versia/client";
import { toTypedSchema } from "@vee-validate/zod"; import { toTypedSchema } from "@vee-validate/zod";
import { z } from "zod"; import { z } from "zod";
import CheckboxInput from "~/components/inputs/checkbox-input.vue"; import CheckboxInput from "~/components/inputs/checkbox-input.vue";

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

View file

@ -1,15 +1,15 @@
const art = ` const art = `
* Hello from the Lysand development team! * Hello from the Versia development team!
* If you are seeing this, we may need your help! * If you are seeing this, we may need your help!
* Join development at https://github.com/lysand-org * Join development at https://github.com/versia-pub
* *
* With from us: * With from us:
* - @jessew@social.lysand.org * - @jessew@social.lysand.org

View file

@ -1,4 +1,4 @@
import type { ApplicationData } from "@lysand-org/client/types"; import type { ApplicationData } from "@versia/client/types";
import { nanoid } from "nanoid"; import { nanoid } from "nanoid";
export const signInWithCode = (code: string, appData: ApplicationData) => { export const signInWithCode = (code: string, appData: ApplicationData) => {