diff --git a/front/apps/mobile/app/(app)/(tabs)/_layout.tsx b/front/apps/mobile/app/(app)/(tabs)/_layout.tsx
index 814bb0aa..9f6f1d21 100644
--- a/front/apps/mobile/app/(app)/(tabs)/_layout.tsx
+++ b/front/apps/mobile/app/(app)/(tabs)/_layout.tsx
@@ -19,10 +19,10 @@
*/
import { Icon } from "@kyoo/primitives";
-import { Tabs } from "expo-router";
-import Home from "@material-symbols/svg-400/rounded/home-fill.svg";
import Browse from "@material-symbols/svg-400/rounded/browse-fill.svg";
import Downloading from "@material-symbols/svg-400/rounded/downloading-fill.svg";
+import Home from "@material-symbols/svg-400/rounded/home-fill.svg";
+import { Tabs } from "expo-router";
export default function TabsLayout() {
return (
diff --git a/front/apps/mobile/app/_layout.tsx b/front/apps/mobile/app/_layout.tsx
index 9d4ef393..e43a8d28 100644
--- a/front/apps/mobile/app/_layout.tsx
+++ b/front/apps/mobile/app/_layout.tsx
@@ -20,39 +20,39 @@
import "react-native-reanimated";
-import { PortalProvider } from "@gorhom/portal";
-import { SnackbarProvider, ThemeSelector } from "@kyoo/primitives";
-import { DownloadProvider } from "@kyoo/ui";
-import { AccountProvider, createQueryClient, storage, useUserTheme } from "@kyoo/models";
-import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client";
-import { createSyncStoragePersister } from "@tanstack/query-sync-storage-persister";
-import i18next from "i18next";
-import { Slot } from "expo-router";
-import { getLocales } from "expo-localization";
-import * as SplashScreen from "expo-splash-screen";
import {
- useFonts,
Poppins_300Light,
Poppins_400Regular,
Poppins_900Black,
+ useFonts,
} from "@expo-google-fonts/poppins";
-import { type ReactNode, useEffect, useState } from "react";
-import { useColorScheme } from "react-native";
-import { initReactI18next } from "react-i18next";
-import { ThemeProvider as RNThemeProvider } from "@react-navigation/native";
-import "intl-pluralrules";
-import "@formatjs/intl-locale/polyfill";
-import "@formatjs/intl-displaynames/polyfill";
import "@formatjs/intl-displaynames/locale-data/en";
import "@formatjs/intl-displaynames/locale-data/fr";
+import "@formatjs/intl-displaynames/polyfill";
+import "@formatjs/intl-locale/polyfill";
+import { PortalProvider } from "@gorhom/portal";
+import { AccountProvider, createQueryClient, storage, useUserTheme } from "@kyoo/models";
+import { SnackbarProvider, ThemeSelector } from "@kyoo/primitives";
+import { DownloadProvider } from "@kyoo/ui";
+import { ThemeProvider as RNThemeProvider } from "@react-navigation/native";
+import { createSyncStoragePersister } from "@tanstack/query-sync-storage-persister";
+import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client";
+import { getLocales } from "expo-localization";
+import { Slot } from "expo-router";
+import * as SplashScreen from "expo-splash-screen";
+import i18next from "i18next";
+import "intl-pluralrules";
+import { type ReactNode, useEffect, useState } from "react";
+import { initReactI18next } from "react-i18next";
+import { useColorScheme } from "react-native";
+import NetInfo from "@react-native-community/netinfo";
+import { onlineManager } from "@tanstack/react-query";
+import { useTheme } from "yoshiki/native";
// TODO: use a backend to load jsons.
import en from "../../../translations/en.json";
import fr from "../../../translations/fr.json";
import zh from "../../../translations/zh.json";
-import { useTheme } from "yoshiki/native";
-import NetInfo from "@react-native-community/netinfo";
-import { onlineManager } from "@tanstack/react-query";
onlineManager.setEventListener((setOnline) => {
return NetInfo.addEventListener((state) => {
diff --git a/front/apps/mobile/app/utils.tsx b/front/apps/mobile/app/utils.tsx
index ab63c163..85725f30 100644
--- a/front/apps/mobile/app/utils.tsx
+++ b/front/apps/mobile/app/utils.tsx
@@ -18,14 +18,14 @@
* along with Kyoo. If not, see .
*/
-import { Stack, useLocalSearchParams } from "expo-router";
-import { type ComponentType, useEffect } from "react";
-import { StatusBar, type StatusBarProps } from "react-native";
-import * as ScreenOrientation from "expo-screen-orientation";
-import * as NavigationBar from "expo-navigation-bar";
-import arrayShuffle from "array-shuffle";
import { type QueryPage, useHasPermission } from "@kyoo/models";
import { Unauthorized } from "@kyoo/ui";
+import arrayShuffle from "array-shuffle";
+import * as NavigationBar from "expo-navigation-bar";
+import { Stack, useLocalSearchParams } from "expo-router";
+import * as ScreenOrientation from "expo-screen-orientation";
+import { type ComponentType, useEffect } from "react";
+import { StatusBar, type StatusBarProps } from "react-native";
const FullscreenProvider = () => {
useEffect(() => {
diff --git a/front/apps/web/src/i18n.tsx b/front/apps/web/src/i18n.tsx
index 6e45277b..418e6604 100644
--- a/front/apps/web/src/i18n.tsx
+++ b/front/apps/web/src/i18n.tsx
@@ -18,10 +18,10 @@
* along with Kyoo. If not, see .
*/
-import { type ComponentType, useMemo } from "react";
import i18next, { type InitOptions } from "i18next";
-import { I18nextProvider } from "react-i18next";
import type { AppContext, AppInitialProps, AppProps } from "next/app";
+import { type ComponentType, useMemo } from "react";
+import { I18nextProvider } from "react-i18next";
import en from "../../../translations/en.json";
import fr from "../../../translations/fr.json";
diff --git a/front/apps/web/src/pages/_app.tsx b/front/apps/web/src/pages/_app.tsx
index 0f9bf070..7b3c156c 100755
--- a/front/apps/web/src/pages/_app.tsx
+++ b/front/apps/web/src/pages/_app.tsx
@@ -20,42 +20,42 @@
import "../polyfill";
-import { HydrationBoundary, QueryClientProvider, dehydrate } from "@tanstack/react-query";
-import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
-import {
- HiddenIfNoJs,
- TouchOnlyCss,
- SkeletonCss,
- ThemeSelector,
- SnackbarProvider,
-} from "@kyoo/primitives";
-import { WebTooltip } from "@kyoo/primitives/src/tooltip.web";
+import { PortalProvider } from "@gorhom/portal";
import {
AccountP,
AccountProvider,
ConnectionErrorContext,
- createQueryClient,
- fetchQuery,
- getTokenWJ,
type QueryIdentifier,
type QueryPage,
ServerInfoP,
- setSsrApiUrl,
UserP,
+ createQueryClient,
+ fetchQuery,
+ getTokenWJ,
+ setSsrApiUrl,
useUserTheme,
} from "@kyoo/models";
-import { type ComponentType, useContext, useState } from "react";
+import { getCurrentAccount, readCookie, updateAccount } from "@kyoo/models/src/account-internal";
+import {
+ HiddenIfNoJs,
+ SkeletonCss,
+ SnackbarProvider,
+ ThemeSelector,
+ TouchOnlyCss,
+} from "@kyoo/primitives";
+import { WebTooltip } from "@kyoo/primitives/src/tooltip.web";
+import { ConnectionError } from "@kyoo/ui";
+import { HydrationBoundary, QueryClientProvider, dehydrate } from "@tanstack/react-query";
+import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
+import arrayShuffle from "array-shuffle";
import NextApp, { type AppContext, type AppProps } from "next/app";
import { Poppins } from "next/font/google";
-import { useTheme, useMobileHover, useStyleRegistry, StyleRegistryProvider } from "yoshiki/web";
-import superjson from "superjson";
import Head from "next/head";
-import { withTranslations } from "../i18n";
-import arrayShuffle from "array-shuffle";
+import { type ComponentType, useContext, useState } from "react";
import { Tooltip } from "react-tooltip";
-import { getCurrentAccount, readCookie, updateAccount } from "@kyoo/models/src/account-internal";
-import { PortalProvider } from "@gorhom/portal";
-import { ConnectionError } from "@kyoo/ui";
+import superjson from "superjson";
+import { StyleRegistryProvider, useMobileHover, useStyleRegistry, useTheme } from "yoshiki/web";
+import { withTranslations } from "../i18n";
const font = Poppins({ weight: ["300", "400", "900"], subsets: ["latin"], display: "swap" });
diff --git a/front/apps/web/src/pages/_document.tsx b/front/apps/web/src/pages/_document.tsx
index 229f768d..7583f1dd 100644
--- a/front/apps/web/src/pages/_document.tsx
+++ b/front/apps/web/src/pages/_document.tsx
@@ -18,9 +18,9 @@
* along with Kyoo. If not, see .
*/
+import { type DocumentContext, Head, Html, Main, NextScript } from "next/document";
import { AppRegistry } from "react-native";
-import { Html, Main, Head, NextScript, type DocumentContext } from "next/document";
-import { createStyleRegistry, StyleRegistryProvider } from "yoshiki/web";
+import { StyleRegistryProvider, createStyleRegistry } from "yoshiki/web";
export const style = `
/**
diff --git a/front/packages/models/src/account-internal.ts b/front/packages/models/src/account-internal.ts
index 73b3a43b..6d5ca73e 100644
--- a/front/packages/models/src/account-internal.ts
+++ b/front/packages/models/src/account-internal.ts
@@ -18,10 +18,10 @@
* along with Kyoo. If not, see .
*/
+import { Platform } from "react-native";
+import { MMKV } from "react-native-mmkv";
import { type ZodTypeAny, z } from "zod";
import { type Account, AccountP } from "./accounts";
-import { MMKV } from "react-native-mmkv";
-import { Platform } from "react-native";
export const storage = new MMKV();
diff --git a/front/packages/models/src/accounts.tsx b/front/packages/models/src/accounts.tsx
index eba66190..5dbb98d4 100644
--- a/front/packages/models/src/accounts.tsx
+++ b/front/packages/models/src/accounts.tsx
@@ -18,6 +18,8 @@
* along with Kyoo. If not, see .
*/
+import { useQueryClient } from "@tanstack/react-query";
+import { atom, getDefaultStore, useAtomValue, useSetAtom } from "jotai";
import {
type ReactNode,
createContext,
@@ -27,16 +29,14 @@ import {
useRef,
useState,
} from "react";
-import { ServerInfoP, type User, UserP } from "./resources";
-import { z } from "zod";
-import { zdate } from "./utils";
-import { removeAccounts, setCookie, updateAccount } from "./account-internal";
-import { useMMKVString } from "react-native-mmkv";
import { Platform } from "react-native";
-import { useQueryClient } from "@tanstack/react-query";
-import { atom, getDefaultStore, useAtomValue, useSetAtom } from "jotai";
-import { useFetch } from "./query";
+import { useMMKVString } from "react-native-mmkv";
+import { z } from "zod";
+import { removeAccounts, setCookie, updateAccount } from "./account-internal";
import type { KyooErrors } from "./kyoo-errors";
+import { useFetch } from "./query";
+import { ServerInfoP, type User, UserP } from "./resources";
+import { zdate } from "./utils";
export const TokenP = z.object({
token_type: z.literal("Bearer"),
diff --git a/front/packages/models/src/login.ts b/front/packages/models/src/login.ts
index cecc0a2d..e846d74d 100644
--- a/front/packages/models/src/login.ts
+++ b/front/packages/models/src/login.ts
@@ -18,13 +18,13 @@
* along with Kyoo. If not, see .
*/
-import { queryFn } from "./query";
-import type { KyooErrors } from "./kyoo-errors";
-import { type Account, type Token, TokenP, getCurrentApiUrl } from "./accounts";
-import { UserP } from "./resources";
-import { addAccount, getCurrentAccount, removeAccounts, updateAccount } from "./account-internal";
-import { Platform } from "react-native";
import { useEffect, useRef, useState } from "react";
+import { Platform } from "react-native";
+import { addAccount, getCurrentAccount, removeAccounts, updateAccount } from "./account-internal";
+import { type Account, type Token, TokenP, getCurrentApiUrl } from "./accounts";
+import type { KyooErrors } from "./kyoo-errors";
+import { queryFn } from "./query";
+import { UserP } from "./resources";
type Result =
| { ok: true; value: A; error?: undefined }
diff --git a/front/packages/models/src/query.tsx b/front/packages/models/src/query.tsx
index 935fdee4..c39978c6 100644
--- a/front/packages/models/src/query.tsx
+++ b/front/packages/models/src/query.tsx
@@ -18,18 +18,18 @@
* along with Kyoo. If not, see .
*/
-import type { ComponentType, ReactElement } from "react";
import {
QueryClient,
type QueryFunctionContext,
useInfiniteQuery,
useQuery,
} from "@tanstack/react-query";
+import type { ComponentType, ReactElement } from "react";
import type { z } from "zod";
-import type { KyooErrors } from "./kyoo-errors";
-import { type Page, Paged } from "./page";
-import { getToken, getTokenWJ } from "./login";
import { getCurrentApiUrl } from ".";
+import type { KyooErrors } from "./kyoo-errors";
+import { getToken, getTokenWJ } from "./login";
+import { type Page, Paged } from "./page";
export let lastUsedUrl: string = null!;
diff --git a/front/packages/models/src/resources/episode.base.ts b/front/packages/models/src/resources/episode.base.ts
index 4908c773..aa9280c6 100644
--- a/front/packages/models/src/resources/episode.base.ts
+++ b/front/packages/models/src/resources/episode.base.ts
@@ -19,9 +19,9 @@
*/
import { z } from "zod";
-import { zdate } from "../utils";
import { ImagesP, imageFn } from "../traits";
import { ResourceP } from "../traits/resource";
+import { zdate } from "../utils";
export const BaseEpisodeP = ResourceP("episode")
.merge(ImagesP)
diff --git a/front/packages/models/src/resources/episode.ts b/front/packages/models/src/resources/episode.ts
index 5aa19dde..bac4ee07 100644
--- a/front/packages/models/src/resources/episode.ts
+++ b/front/packages/models/src/resources/episode.ts
@@ -19,8 +19,8 @@
*/
import { z } from "zod";
-import { ShowP } from "./show";
import { BaseEpisodeP } from "./episode.base";
+import { ShowP } from "./show";
import { WatchStatusP } from "./watch-status";
export const EpisodeP = BaseEpisodeP.and(
diff --git a/front/packages/models/src/resources/movie.ts b/front/packages/models/src/resources/movie.ts
index 7554df1a..74108101 100644
--- a/front/packages/models/src/resources/movie.ts
+++ b/front/packages/models/src/resources/movie.ts
@@ -19,13 +19,13 @@
*/
import { z } from "zod";
-import { zdate } from "../utils";
import { ImagesP, ResourceP, imageFn } from "../traits";
-import { Genre } from "./genre";
-import { StudioP } from "./studio";
-import { Status } from "./show";
+import { zdate } from "../utils";
import { CollectionP } from "./collection";
+import { Genre } from "./genre";
import { MetadataP } from "./metadata";
+import { Status } from "./show";
+import { StudioP } from "./studio";
import { WatchStatusP } from "./watch-status";
export const MovieP = ResourceP("movie")
diff --git a/front/packages/models/src/resources/news.ts b/front/packages/models/src/resources/news.ts
index 30f724a7..0e04ab27 100644
--- a/front/packages/models/src/resources/news.ts
+++ b/front/packages/models/src/resources/news.ts
@@ -19,8 +19,8 @@
*/
import { z } from "zod";
-import { MovieP } from "./movie";
import { EpisodeP } from "./episode";
+import { MovieP } from "./movie";
export const NewsP = z.union([
/*
diff --git a/front/packages/models/src/resources/season.ts b/front/packages/models/src/resources/season.ts
index 9c5c1fa2..6229d56d 100644
--- a/front/packages/models/src/resources/season.ts
+++ b/front/packages/models/src/resources/season.ts
@@ -19,8 +19,8 @@
*/
import { z } from "zod";
-import { zdate } from "../utils";
import { ImagesP, ResourceP } from "../traits";
+import { zdate } from "../utils";
export const SeasonP = ResourceP("season").merge(ImagesP).extend({
/**
diff --git a/front/packages/models/src/resources/server-info.ts b/front/packages/models/src/resources/server-info.ts
index 7266e89d..370ba6d2 100644
--- a/front/packages/models/src/resources/server-info.ts
+++ b/front/packages/models/src/resources/server-info.ts
@@ -18,9 +18,9 @@
* along with Kyoo. If not, see .
*/
+import { Platform } from "react-native";
import { z } from "zod";
import { imageFn } from "..";
-import { Platform } from "react-native";
export const OidcInfoP = z.object({
/*
diff --git a/front/packages/models/src/resources/show.ts b/front/packages/models/src/resources/show.ts
index 8b8ee32c..c6b52c54 100644
--- a/front/packages/models/src/resources/show.ts
+++ b/front/packages/models/src/resources/show.ts
@@ -19,12 +19,12 @@
*/
import { z } from "zod";
-import { zdate } from "../utils";
import { ImagesP, ResourceP } from "../traits";
-import { Genre } from "./genre";
-import { StudioP } from "./studio";
+import { zdate } from "../utils";
import { BaseEpisodeP } from "./episode.base";
+import { Genre } from "./genre";
import { MetadataP } from "./metadata";
+import { StudioP } from "./studio";
import { ShowWatchStatusP } from "./watch-status";
/**
diff --git a/front/packages/models/src/resources/user.ts b/front/packages/models/src/resources/user.ts
index f17ea5d5..0f087a10 100644
--- a/front/packages/models/src/resources/user.ts
+++ b/front/packages/models/src/resources/user.ts
@@ -19,8 +19,8 @@
*/
import { z } from "zod";
-import { ResourceP } from "../traits/resource";
import { imageFn } from "../traits/images";
+import { ResourceP } from "../traits/resource";
export const UserP = ResourceP("user")
.extend({
diff --git a/front/packages/models/src/resources/watch-info.ts b/front/packages/models/src/resources/watch-info.ts
index 824e480d..1fd8ce09 100644
--- a/front/packages/models/src/resources/watch-info.ts
+++ b/front/packages/models/src/resources/watch-info.ts
@@ -18,9 +18,9 @@
* along with Kyoo. If not, see .
*/
+import i18next from "i18next";
import { z } from "zod";
import { imageFn } from "../traits";
-import i18next from "i18next";
import { QualityP } from "./quality";
const getDisplayName = (sub: Track) => {
diff --git a/front/packages/models/src/theme.ts b/front/packages/models/src/theme.ts
index bff88c7b..36ccb119 100644
--- a/front/packages/models/src/theme.ts
+++ b/front/packages/models/src/theme.ts
@@ -18,9 +18,9 @@
* along with Kyoo. If not, see .
*/
+import { Platform } from "react-native";
import { useMMKVString } from "react-native-mmkv";
import { setCookie, storage } from "./account-internal";
-import { Platform } from "react-native";
export const useUserTheme = (ssrTheme?: "light" | "dark" | "auto") => {
if (Platform.OS === "web" && typeof window === "undefined" && ssrTheme) return ssrTheme;
diff --git a/front/packages/models/src/utils.ts b/front/packages/models/src/utils.ts
index 5d773204..6d3557de 100644
--- a/front/packages/models/src/utils.ts
+++ b/front/packages/models/src/utils.ts
@@ -19,10 +19,10 @@
*/
import { Platform } from "react-native";
-import type { Movie, Show } from "./resources";
-import { z } from "zod";
import { useMMKVString } from "react-native-mmkv";
+import { z } from "zod";
import { storage } from "./account-internal";
+import type { Movie, Show } from "./resources";
export const zdate = z.coerce.date;
diff --git a/front/packages/primitives/src/alert.tsx b/front/packages/primitives/src/alert.tsx
index 3a78791d..12e2210e 100644
--- a/front/packages/primitives/src/alert.tsx
+++ b/front/packages/primitives/src/alert.tsx
@@ -20,7 +20,7 @@
// Stolen from https://github.com/necolas/react-native-web/issues/1026#issuecomment-1458279681
-import { Alert as RNAlert, type AlertOptions, type AlertButton } from "react-native";
+import { type AlertButton, type AlertOptions, Alert as RNAlert } from "react-native";
import type { SweetAlertIcon } from "sweetalert2";
export interface ExtendedAlertStatic {
diff --git a/front/packages/primitives/src/avatar.tsx b/front/packages/primitives/src/avatar.tsx
index a727f432..a2bcea47 100644
--- a/front/packages/primitives/src/avatar.tsx
+++ b/front/packages/primitives/src/avatar.tsx
@@ -18,12 +18,12 @@
* along with Kyoo. If not, see .
*/
-import { View, type ViewStyle, Image, type ImageProps } from "react-native";
-import { useYoshiki, px, type Stylable } from "yoshiki/native";
+import AccountCircle from "@material-symbols/svg-400/rounded/account_circle-fill.svg";
+import { type ComponentType, type RefAttributes, forwardRef } from "react";
+import { Image, type ImageProps, View, type ViewStyle } from "react-native";
+import { type Stylable, px, useYoshiki } from "yoshiki/native";
import { Icon } from "./icons";
import { P } from "./text";
-import AccountCircle from "@material-symbols/svg-400/rounded/account_circle-fill.svg";
-import { type ComponentType, forwardRef, type RefAttributes } from "react";
const stringToColor = (string: string) => {
let hash = 0;
diff --git a/front/packages/primitives/src/button.tsx b/front/packages/primitives/src/button.tsx
index e5d958b5..bb63ca10 100644
--- a/front/packages/primitives/src/button.tsx
+++ b/front/packages/primitives/src/button.tsx
@@ -19,11 +19,11 @@
*/
import { type ComponentType, type ForwardedRef, type ReactElement, forwardRef } from "react";
+import { type Falsy, type PressableProps, View } from "react-native";
import { type Theme, useYoshiki } from "yoshiki/native";
import { PressableFeedback } from "./links";
import { P } from "./text";
import { ts } from "./utils";
-import { type Falsy, type PressableProps, View } from "react-native";
export const Button = forwardRef(function Button(
{
diff --git a/front/packages/primitives/src/chip.tsx b/front/packages/primitives/src/chip.tsx
index 87ce959f..a4930fb7 100644
--- a/front/packages/primitives/src/chip.tsx
+++ b/front/packages/primitives/src/chip.tsx
@@ -18,12 +18,12 @@
* along with Kyoo. If not, see .
*/
-import { px, rem, type Theme, useYoshiki } from "yoshiki/native";
+import type { TextProps } from "react-native";
+import { type Theme, px, rem, useYoshiki } from "yoshiki/native";
import { Link } from "./links";
+import { Skeleton } from "./skeleton";
import { P } from "./text";
import { capitalize, ts } from "./utils";
-import type { TextProps } from "react-native";
-import { Skeleton } from "./skeleton";
export const Chip = ({
color,
diff --git a/front/packages/primitives/src/divider.tsx b/front/packages/primitives/src/divider.tsx
index a7da1e66..03176ce7 100644
--- a/front/packages/primitives/src/divider.tsx
+++ b/front/packages/primitives/src/divider.tsx
@@ -19,7 +19,7 @@
*/
import { HR as EHR } from "@expo/html-elements";
-import { px, type Stylable, useYoshiki } from "yoshiki/native";
+import { type Stylable, px, useYoshiki } from "yoshiki/native";
import { ts } from "./utils";
export const HR = ({
diff --git a/front/packages/primitives/src/icons.tsx b/front/packages/primitives/src/icons.tsx
index 6fc2d1ac..3c504c33 100644
--- a/front/packages/primitives/src/icons.tsx
+++ b/front/packages/primitives/src/icons.tsx
@@ -23,10 +23,10 @@ import { type ComponentProps, type ComponentType, type ForwardedRef, forwardRef
import { Platform, type PressableProps } from "react-native";
import type { SvgProps } from "react-native-svg";
import type { YoshikiStyle } from "yoshiki";
-import { px, type Stylable, type Theme, useYoshiki } from "yoshiki/native";
+import { type Stylable, type Theme, px, useYoshiki } from "yoshiki/native";
import { PressableFeedback } from "./links";
-import { type Breakpoint, focusReset, ts } from "./utils";
import { P } from "./text";
+import { type Breakpoint, focusReset, ts } from "./utils";
declare module "react" {
function forwardRef(
diff --git a/front/packages/primitives/src/image/image.tsx b/front/packages/primitives/src/image/image.tsx
index 30de7a92..a117d76d 100644
--- a/front/packages/primitives/src/image/image.tsx
+++ b/front/packages/primitives/src/image/image.tsx
@@ -18,14 +18,14 @@
* along with Kyoo. If not, see .
*/
+import { getCurrentToken } from "@kyoo/models";
import { useState } from "react";
import { type FlexStyle, type ImageStyle, View, type ViewStyle } from "react-native";
-import FastImage from "react-native-fast-image";
import { Blurhash } from "react-native-blurhash";
+import FastImage from "react-native-fast-image";
import { percent, useYoshiki } from "yoshiki/native";
-import type { Props, ImageLayout } from "./base-image";
import { Skeleton } from "../skeleton";
-import { getCurrentToken } from "@kyoo/models";
+import type { ImageLayout, Props } from "./base-image";
export const Image = ({
src,
diff --git a/front/packages/primitives/src/image/image.web.tsx b/front/packages/primitives/src/image/image.web.tsx
index 1c94132c..3c5f6514 100644
--- a/front/packages/primitives/src/image/image.web.tsx
+++ b/front/packages/primitives/src/image/image.web.tsx
@@ -18,14 +18,14 @@
* along with Kyoo. If not, see .
*/
+import NextImage from "next/image";
import { useState } from "react";
import { type ImageStyle, View, type ViewStyle } from "react-native";
import { useYoshiki } from "yoshiki/native";
-import type { Props, ImageLayout } from "./base-image";
-import { BlurhashContainer } from "./blurhash.web";
-import { Skeleton } from "../skeleton";
-import NextImage from "next/image";
import { imageBorderRadius } from "../constants";
+import { Skeleton } from "../skeleton";
+import type { ImageLayout, Props } from "./base-image";
+import { BlurhashContainer } from "./blurhash.web";
export const Image = ({
src,
diff --git a/front/packages/primitives/src/input.tsx b/front/packages/primitives/src/input.tsx
index fa92c457..598a5830 100644
--- a/front/packages/primitives/src/input.tsx
+++ b/front/packages/primitives/src/input.tsx
@@ -18,11 +18,11 @@
* along with Kyoo. If not, see .
*/
-import { forwardRef, type ReactNode, useState } from "react";
+import { type ReactNode, forwardRef, useState } from "react";
import { TextInput, type TextInputProps, View, type ViewStyle } from "react-native";
-import { px, type Theme, useYoshiki } from "yoshiki/native";
-import { focusReset, ts } from "./utils";
+import { type Theme, px, useYoshiki } from "yoshiki/native";
import type { YoshikiEnhanced } from "./image/base-image";
+import { focusReset, ts } from "./utils";
export const Input = forwardRef<
TextInput,
diff --git a/front/packages/primitives/src/links.tsx b/front/packages/primitives/src/links.tsx
index b89511d4..466463fa 100644
--- a/front/packages/primitives/src/links.tsx
+++ b/front/packages/primitives/src/links.tsx
@@ -18,20 +18,20 @@
* along with Kyoo. If not, see .
*/
-import { forwardRef, type ReactNode } from "react";
+import type { UrlObject } from "node:url";
+import { type ReactNode, forwardRef } from "react";
import {
+ Linking,
Platform,
Pressable,
+ type PressableProps,
type TextProps,
type View,
- type PressableProps,
- Linking,
} from "react-native";
import { TextLink, useLink } from "solito/link";
-import { useTheme, useYoshiki } from "yoshiki/native";
-import type { UrlObject } from "node:url";
-import { alpha } from "./themes";
import { parseNextPath } from "solito/router";
+import { useTheme, useYoshiki } from "yoshiki/native";
+import { alpha } from "./themes";
export const A = ({
href,
diff --git a/front/packages/primitives/src/menu.tsx b/front/packages/primitives/src/menu.tsx
index 4a0341be..9e255dba 100644
--- a/front/packages/primitives/src/menu.tsx
+++ b/front/packages/primitives/src/menu.tsx
@@ -19,29 +19,29 @@
*/
import { Portal } from "@gorhom/portal";
+import Check from "@material-symbols/svg-400/rounded/check-fill.svg";
+import Close from "@material-symbols/svg-400/rounded/close-fill.svg";
import { ScrollView } from "moti";
import {
type ComponentType,
- createContext,
type ReactElement,
type ReactNode,
+ createContext,
useContext,
useEffect,
useRef,
useState,
} from "react";
-import { StyleSheet, Pressable, View } from "react-native";
+import { Pressable, StyleSheet, View } from "react-native";
import { useSafeAreaInsets } from "react-native-safe-area-context";
+import type { SvgProps } from "react-native-svg";
+import { useRouter } from "solito/router";
import { percent, px, sm, useYoshiki, vh, xl } from "yoshiki/native";
-import Close from "@material-symbols/svg-400/rounded/close-fill.svg";
import { Icon, IconButton } from "./icons";
import { PressableFeedback } from "./links";
import { P } from "./text";
import { ContrastArea, SwitchVariant } from "./themes";
import { ts } from "./utils";
-import Check from "@material-symbols/svg-400/rounded/check-fill.svg";
-import { useRouter } from "solito/router";
-import type { SvgProps } from "react-native-svg";
const MenuContext = createContext<((open: boolean) => void) | undefined>(undefined);
diff --git a/front/packages/primitives/src/menu.web.tsx b/front/packages/primitives/src/menu.web.tsx
index ab46e705..304e17cd 100644
--- a/front/packages/primitives/src/menu.web.tsx
+++ b/front/packages/primitives/src/menu.web.tsx
@@ -18,24 +18,24 @@
* along with Kyoo. If not, see .
*/
+import Dot from "@material-symbols/svg-400/rounded/fiber_manual_record-fill.svg";
import * as DropdownMenu from "@radix-ui/react-dropdown-menu";
+import Link from "next/link";
import {
type ComponentProps,
type ComponentType,
- forwardRef,
type ReactElement,
type ReactNode,
+ forwardRef,
} from "react";
-import Link from "next/link";
import type { PressableProps } from "react-native";
-import { useYoshiki } from "yoshiki/web";
+import type { SvgProps } from "react-native-svg";
import { useYoshiki as useNativeYoshiki } from "yoshiki/native";
+import { useYoshiki } from "yoshiki/web";
+import { Icon } from "./icons";
import { P } from "./text";
import { ContrastArea, SwitchVariant } from "./themes";
-import { Icon } from "./icons";
-import Dot from "@material-symbols/svg-400/rounded/fiber_manual_record-fill.svg";
import { focusReset, ts } from "./utils";
-import type { SvgProps } from "react-native-svg";
type YoshikiFunc = (props: ReturnType) => T;
export const YoshikiProvider = ({ children }: { children: YoshikiFunc }) => {
diff --git a/front/packages/primitives/src/popup.tsx b/front/packages/primitives/src/popup.tsx
index d06b0e6e..0f79d171 100644
--- a/front/packages/primitives/src/popup.tsx
+++ b/front/packages/primitives/src/popup.tsx
@@ -18,13 +18,13 @@
* along with Kyoo. If not, see .
*/
-import { type ReactNode, useCallback, useEffect, useState } from "react";
-import { Container } from "./container";
import { usePortal } from "@gorhom/portal";
-import { ContrastArea, SwitchVariant, type YoshikiFunc } from "./themes";
-import { View, ScrollView } from "react-native";
-import { imageBorderRadius } from "./constants";
+import { type ReactNode, useCallback, useEffect, useState } from "react";
+import { ScrollView, View } from "react-native";
import { px, vh } from "yoshiki/native";
+import { imageBorderRadius } from "./constants";
+import { Container } from "./container";
+import { ContrastArea, SwitchVariant, type YoshikiFunc } from "./themes";
import { ts } from "./utils";
export const Popup = ({ children, ...props }: { children: ReactNode | YoshikiFunc }) => {
diff --git a/front/packages/primitives/src/progress.tsx b/front/packages/primitives/src/progress.tsx
index 543c3cc8..9a66b64d 100644
--- a/front/packages/primitives/src/progress.tsx
+++ b/front/packages/primitives/src/progress.tsx
@@ -20,7 +20,7 @@
import { ActivityIndicator, Platform, View } from "react-native";
import { Circle, Svg } from "react-native-svg";
-import { px, type Stylable, useYoshiki } from "yoshiki/native";
+import { type Stylable, px, useYoshiki } from "yoshiki/native";
export const CircularProgress = ({
size = 48,
diff --git a/front/packages/primitives/src/select.tsx b/front/packages/primitives/src/select.tsx
index 6c12f979..e6fc194d 100644
--- a/front/packages/primitives/src/select.tsx
+++ b/front/packages/primitives/src/select.tsx
@@ -18,10 +18,10 @@
* along with Kyoo. If not, see .
*/
-import { Icon } from "./icons";
import ExpandMore from "@material-symbols/svg-400/rounded/expand_more-fill.svg";
-import { Menu } from "./menu";
import { Button } from "./button";
+import { Icon } from "./icons";
+import { Menu } from "./menu";
export const Select = ({
label,
diff --git a/front/packages/primitives/src/select.web.tsx b/front/packages/primitives/src/select.web.tsx
index 6c0728e9..0c235d9e 100644
--- a/front/packages/primitives/src/select.web.tsx
+++ b/front/packages/primitives/src/select.web.tsx
@@ -18,20 +18,20 @@
* along with Kyoo. If not, see .
*/
+import Check from "@material-symbols/svg-400/rounded/check-fill.svg";
+import ExpandLess from "@material-symbols/svg-400/rounded/expand_less-fill.svg";
+import ExpandMore from "@material-symbols/svg-400/rounded/expand_more-fill.svg";
import * as RSelect from "@radix-ui/react-select";
import { forwardRef } from "react";
-import { Icon } from "./icons";
-import Check from "@material-symbols/svg-400/rounded/check-fill.svg";
-import ExpandMore from "@material-symbols/svg-400/rounded/expand_more-fill.svg";
-import ExpandLess from "@material-symbols/svg-400/rounded/expand_less-fill.svg";
-import { ContrastArea, SwitchVariant } from "./themes";
-import { InternalTriger, YoshikiProvider } from "./menu.web";
-import { type Theme, px, useYoshiki as useNativeYoshiki } from "yoshiki/native";
-import { useYoshiki } from "yoshiki";
-import { PressableFeedback } from "./links";
-import { P } from "./text";
-import { focusReset, ts } from "./utils";
import { View } from "react-native";
+import { useYoshiki } from "yoshiki";
+import { type Theme, px, useYoshiki as useNativeYoshiki } from "yoshiki/native";
+import { Icon } from "./icons";
+import { PressableFeedback } from "./links";
+import { InternalTriger, YoshikiProvider } from "./menu.web";
+import { P } from "./text";
+import { ContrastArea, SwitchVariant } from "./themes";
+import { focusReset, ts } from "./utils";
export const Select = ({
label,
diff --git a/front/packages/primitives/src/skeleton.tsx b/front/packages/primitives/src/skeleton.tsx
index 08e8943f..d6336b75 100644
--- a/front/packages/primitives/src/skeleton.tsx
+++ b/front/packages/primitives/src/skeleton.tsx
@@ -19,10 +19,10 @@
*/
import { LinearGradient as LG } from "expo-linear-gradient";
-import { AnimatePresence, motify, MotiView } from "moti";
+import { AnimatePresence, MotiView, motify } from "moti";
import { useState } from "react";
import { Platform, View, type ViewProps } from "react-native";
-import { px, rem, useYoshiki, percent, em } from "yoshiki/native";
+import { em, percent, px, rem, useYoshiki } from "yoshiki/native";
import { hiddenIfNoJs } from "./utils/nojs";
const LinearGradient = motify(LG)();
diff --git a/front/packages/primitives/src/skeleton.web.tsx b/front/packages/primitives/src/skeleton.web.tsx
index 398b7623..f322cac0 100644
--- a/front/packages/primitives/src/skeleton.web.tsx
+++ b/front/packages/primitives/src/skeleton.web.tsx
@@ -20,7 +20,7 @@
import { LinearGradient } from "expo-linear-gradient";
import { View, type ViewProps } from "react-native";
-import { px, rem, useYoshiki, percent, em } from "yoshiki/native";
+import { em, percent, px, rem, useYoshiki } from "yoshiki/native";
import { hiddenIfNoJs } from "./utils/nojs";
export const SkeletonCss = () => (
diff --git a/front/packages/primitives/src/slider.tsx b/front/packages/primitives/src/slider.tsx
index 4880a41e..c7c727fc 100644
--- a/front/packages/primitives/src/slider.tsx
+++ b/front/packages/primitives/src/slider.tsx
@@ -20,9 +20,9 @@
import { useRef, useState } from "react";
import { type GestureResponderEvent, Platform, View } from "react-native";
-import { px, percent, Stylable, useYoshiki } from "yoshiki/native";
-import { focusReset } from "./utils";
import type { ViewProps } from "react-native-svg/lib/typescript/fabric/utils";
+import { Stylable, percent, px, useYoshiki } from "yoshiki/native";
+import { focusReset } from "./utils";
export const Slider = ({
progress,
diff --git a/front/packages/primitives/src/snackbar.tsx b/front/packages/primitives/src/snackbar.tsx
index cab87dc8..aefff109 100644
--- a/front/packages/primitives/src/snackbar.tsx
+++ b/front/packages/primitives/src/snackbar.tsx
@@ -20,13 +20,13 @@
import { usePortal } from "@gorhom/portal";
import { type ReactElement, createContext, useCallback, useContext, useRef } from "react";
-import { ContrastArea, SwitchVariant } from "./themes";
-import { P } from "./text";
import { View } from "react-native";
import { percent, px } from "yoshiki/native";
-import { ts } from "./utils";
import { Button } from "./button";
import { imageBorderRadius } from "./constants";
+import { P } from "./text";
+import { ContrastArea, SwitchVariant } from "./themes";
+import { ts } from "./utils";
export type Snackbar = {
key?: string;
diff --git a/front/packages/primitives/src/text.tsx b/front/packages/primitives/src/text.tsx
index 14da8fc6..5099fa6b 100644
--- a/front/packages/primitives/src/text.tsx
+++ b/front/packages/primitives/src/text.tsx
@@ -18,9 +18,6 @@
* along with Kyoo. If not, see .
*/
-import type { ComponentType, ComponentProps } from "react";
-import { Platform, Text, type TextProps, type TextStyle, type StyleProp } from "react-native";
-import { percent, rem, useYoshiki } from "yoshiki/native";
import {
H1 as EH1,
H2 as EH2,
@@ -30,6 +27,9 @@ import {
H6 as EH6,
P as EP,
} from "@expo/html-elements";
+import type { ComponentProps, ComponentType } from "react";
+import { Platform, type StyleProp, Text, type TextProps, type TextStyle } from "react-native";
+import { percent, rem, useYoshiki } from "yoshiki/native";
import { ts } from "./utils/spacing";
const styleText = (
diff --git a/front/packages/primitives/src/themes/theme.tsx b/front/packages/primitives/src/themes/theme.tsx
index 38b9f643..b31d1eea 100644
--- a/front/packages/primitives/src/themes/theme.tsx
+++ b/front/packages/primitives/src/themes/theme.tsx
@@ -18,14 +18,14 @@
* along with Kyoo. If not, see .
*/
-import type { ReactNode } from "react";
import type { Property } from "csstype";
+import type { ReactNode } from "react";
+import { Platform } from "react-native";
import { type Theme, ThemeProvider, useAutomaticTheme } from "yoshiki";
-import { useTheme, useYoshiki } from "yoshiki/native";
import "yoshiki";
+import { useTheme, useYoshiki } from "yoshiki/native";
import "yoshiki/native";
import { catppuccin } from "./catppuccin";
-import { Platform } from "react-native";
type FontList = Partial<
Record<
diff --git a/front/packages/primitives/src/tooltip.web.tsx b/front/packages/primitives/src/tooltip.web.tsx
index 0c65e850..39b01220 100644
--- a/front/packages/primitives/src/tooltip.web.tsx
+++ b/front/packages/primitives/src/tooltip.web.tsx
@@ -18,9 +18,9 @@
* along with Kyoo. If not, see .
*/
-import type { Theme } from "yoshiki/native";
-import { Tooltip as RTooltip } from "react-tooltip";
import { forwardRef } from "react";
+import { Tooltip as RTooltip } from "react-tooltip";
+import type { Theme } from "yoshiki/native";
import { ContrastArea } from "./themes";
export const tooltip = (tooltip: string, up?: boolean) => ({
diff --git a/front/packages/primitives/src/utils/breakpoints.ts b/front/packages/primitives/src/utils/breakpoints.ts
index 29111559..bf5f6549 100644
--- a/front/packages/primitives/src/utils/breakpoints.ts
+++ b/front/packages/primitives/src/utils/breakpoints.ts
@@ -19,7 +19,7 @@
*/
import { useWindowDimensions } from "react-native";
-import { type Breakpoints as YoshikiBreakpoint, isBreakpoints, breakpoints } from "yoshiki/native";
+import { type Breakpoints as YoshikiBreakpoint, breakpoints, isBreakpoints } from "yoshiki/native";
type AtLeastOne }> = Partial & U[keyof U];
export type Breakpoint = T | AtLeastOne>;
diff --git a/front/packages/ui/src/admin/index.tsx b/front/packages/ui/src/admin/index.tsx
index 0d305688..b8ba9a5d 100644
--- a/front/packages/ui/src/admin/index.tsx
+++ b/front/packages/ui/src/admin/index.tsx
@@ -22,8 +22,8 @@ import type { QueryPage } from "@kyoo/models";
import { ts } from "@kyoo/primitives";
import { ScrollView } from "react-native";
import { DefaultLayout } from "../layout";
-import { UserList } from "./users";
import { Scanner } from "./scanner";
+import { UserList } from "./users";
export const AdminPage: QueryPage = () => {
return (
diff --git a/front/packages/ui/src/admin/scanner.tsx b/front/packages/ui/src/admin/scanner.tsx
index 02ac7365..946b5e2c 100644
--- a/front/packages/ui/src/admin/scanner.tsx
+++ b/front/packages/ui/src/admin/scanner.tsx
@@ -19,13 +19,13 @@
*/
import { type Issue, IssueP, type QueryIdentifier, queryFn, useFetch } from "@kyoo/models";
-import { useTranslation } from "react-i18next";
-import { SettingsContainer } from "../settings/base";
import { Button, Icon, P, Skeleton, tooltip, ts } from "@kyoo/primitives";
-import { ErrorView } from "../errors";
-import { z } from "zod";
+import { useTranslation } from "react-i18next";
import { View } from "react-native";
import { useYoshiki } from "yoshiki/native";
+import { z } from "zod";
+import { ErrorView } from "../errors";
+import { SettingsContainer } from "../settings/base";
import Info from "@material-symbols/svg-400/outlined/info.svg";
import Scan from "@material-symbols/svg-400/outlined/sensors.svg";
diff --git a/front/packages/ui/src/admin/users.tsx b/front/packages/ui/src/admin/users.tsx
index 0b4dede1..6f621445 100644
--- a/front/packages/ui/src/admin/users.tsx
+++ b/front/packages/ui/src/admin/users.tsx
@@ -29,10 +29,10 @@ import { SettingsContainer } from "../settings/base";
import UserI from "@material-symbols/svg-400/rounded/account_circle.svg";
import Delete from "@material-symbols/svg-400/rounded/delete.svg";
-import MoreVert from "@material-symbols/svg-400/rounded/more_vert.svg";
-import Verifed from "@material-symbols/svg-400/rounded/verified_user.svg";
import Unverifed from "@material-symbols/svg-400/rounded/gpp_bad.svg";
+import MoreVert from "@material-symbols/svg-400/rounded/more_vert.svg";
import Admin from "@material-symbols/svg-400/rounded/shield_person.svg";
+import Verifed from "@material-symbols/svg-400/rounded/verified_user.svg";
import { useMutation, useQueryClient } from "@tanstack/react-query";
export const UserGrid = ({
diff --git a/front/packages/ui/src/browse/grid.tsx b/front/packages/ui/src/browse/grid.tsx
index 5929bf54..648dc136 100644
--- a/front/packages/ui/src/browse/grid.tsx
+++ b/front/packages/ui/src/browse/grid.tsx
@@ -20,22 +20,22 @@
import { type KyooImage, WatchStatusV } from "@kyoo/models";
import {
- Link,
- Skeleton,
- ts,
- focusReset,
- P,
- SubP,
- PosterBackground,
Icon,
+ Link,
+ P,
+ PosterBackground,
+ Skeleton,
+ SubP,
+ focusReset,
important,
+ ts,
} from "@kyoo/primitives";
-import { type ImageStyle, Platform, View } from "react-native";
-import { max, percent, px, rem, type Stylable, type Theme, useYoshiki } from "yoshiki/native";
-import type { Layout, WithLoading } from "../fetch";
import Done from "@material-symbols/svg-400/rounded/done-fill.svg";
-import { ItemContext } from "../components/context-menus";
import { useState } from "react";
+import { type ImageStyle, Platform, View } from "react-native";
+import { type Stylable, type Theme, max, percent, px, rem, useYoshiki } from "yoshiki/native";
+import { ItemContext } from "../components/context-menus";
+import type { Layout, WithLoading } from "../fetch";
export const ItemWatchStatus = ({
watchStatus,
diff --git a/front/packages/ui/src/browse/header.tsx b/front/packages/ui/src/browse/header.tsx
index 5229ca9e..e5e25e15 100644
--- a/front/packages/ui/src/browse/header.tsx
+++ b/front/packages/ui/src/browse/header.tsx
@@ -29,17 +29,17 @@ import {
tooltip,
ts,
} from "@kyoo/primitives";
-import { useTranslation } from "react-i18next";
-import { useYoshiki } from "yoshiki/native";
-import Style from "@material-symbols/svg-400/rounded/style.svg";
-import GridView from "@material-symbols/svg-400/rounded/grid_view.svg";
-import ViewList from "@material-symbols/svg-400/rounded/view_list.svg";
-import Sort from "@material-symbols/svg-400/rounded/sort.svg";
-import ArrowUpward from "@material-symbols/svg-400/rounded/arrow_upward.svg";
import ArrowDownward from "@material-symbols/svg-400/rounded/arrow_downward.svg";
-import { Layout, SearchSort, SortOrd } from "./types";
+import ArrowUpward from "@material-symbols/svg-400/rounded/arrow_upward.svg";
+import GridView from "@material-symbols/svg-400/rounded/grid_view.svg";
+import Sort from "@material-symbols/svg-400/rounded/sort.svg";
+import Style from "@material-symbols/svg-400/rounded/style.svg";
+import ViewList from "@material-symbols/svg-400/rounded/view_list.svg";
import { forwardRef } from "react";
-import { View, type PressableProps } from "react-native";
+import { useTranslation } from "react-i18next";
+import { type PressableProps, View } from "react-native";
+import { useYoshiki } from "yoshiki/native";
+import { Layout, SearchSort, SortOrd } from "./types";
const SortTrigger = forwardRef(function SortTrigger(
{ sortKey, ...props },
diff --git a/front/packages/ui/src/browse/index.tsx b/front/packages/ui/src/browse/index.tsx
index a5816ce4..9b038f69 100644
--- a/front/packages/ui/src/browse/index.tsx
+++ b/front/packages/ui/src/browse/index.tsx
@@ -19,21 +19,21 @@
*/
import {
- type QueryIdentifier,
- type QueryPage,
type LibraryItem,
LibraryItemP,
+ type QueryIdentifier,
+ type QueryPage,
getDisplayDate,
} from "@kyoo/models";
import { type ComponentProps, useState } from "react";
import { createParam } from "solito";
-import { DefaultLayout } from "../layout";
import type { WithLoading } from "../fetch";
import { InfiniteFetch } from "../fetch-infinite";
+import { DefaultLayout } from "../layout";
import { ItemGrid } from "./grid";
-import { ItemList } from "./list";
-import { SortBy, SortOrd, Layout } from "./types";
import { BrowseSettings } from "./header";
+import { ItemList } from "./list";
+import { Layout, SortBy, SortOrd } from "./types";
const { useParam } = createParam<{ sortBy?: string }>();
diff --git a/front/packages/ui/src/browse/list.tsx b/front/packages/ui/src/browse/list.tsx
index 1bb49b54..699d1868 100644
--- a/front/packages/ui/src/browse/list.tsx
+++ b/front/packages/ui/src/browse/list.tsx
@@ -20,22 +20,22 @@
import type { KyooImage, WatchStatusV } from "@kyoo/models";
import {
+ Heading,
+ ImageBackground,
Link,
P,
- Skeleton,
- ts,
- ImageBackground,
- Heading,
PosterBackground,
+ Skeleton,
imageBorderRadius,
important,
+ ts,
} from "@kyoo/primitives";
import { useState } from "react";
import { Platform, View } from "react-native";
import { percent, px, rem, useYoshiki } from "yoshiki/native";
+import { ItemContext } from "../components/context-menus";
import type { Layout, WithLoading } from "../fetch";
import { ItemWatchStatus } from "./grid";
-import { ItemContext } from "../components/context-menus";
export const ItemList = ({
href,
diff --git a/front/packages/ui/src/collection/index.tsx b/front/packages/ui/src/collection/index.tsx
index f84e7ef6..8aa17a12 100644
--- a/front/packages/ui/src/collection/index.tsx
+++ b/front/packages/ui/src/collection/index.tsx
@@ -27,18 +27,18 @@ import {
type QueryPage,
getDisplayDate,
} from "@kyoo/models";
-import { Header as ShowHeader, TitleLine } from "../details/header";
import { Container, Head, ImageBackground, P, Skeleton, ts, usePageStyle } from "@kyoo/primitives";
-import { percent, px, useYoshiki } from "yoshiki/native";
-import { useTranslation } from "react-i18next";
import { forwardRef } from "react";
+import { useTranslation } from "react-i18next";
import { Platform, View, type ViewProps } from "react-native";
+import { percent, px, useYoshiki } from "yoshiki/native";
+import { ItemGrid } from "../browse/grid";
+import { Header as ShowHeader, TitleLine } from "../details/header";
+import { SvgWave } from "../details/show";
import { Fetch } from "../fetch";
import { InfiniteFetch } from "../fetch-infinite";
-import { DefaultLayout } from "../layout";
import { ItemDetails } from "../home/recommended";
-import { SvgWave } from "../details/show";
-import { ItemGrid } from "../browse/grid";
+import { DefaultLayout } from "../layout";
const Header = ({ slug }: { slug: string }) => {
const { css } = useYoshiki();
diff --git a/front/packages/ui/src/components/media-info.tsx b/front/packages/ui/src/components/media-info.tsx
index e1b83202..ae7d9099 100644
--- a/front/packages/ui/src/components/media-info.tsx
+++ b/front/packages/ui/src/components/media-info.tsx
@@ -26,11 +26,11 @@ import {
WatchInfoP,
} from "@kyoo/models";
import { Button, HR, P, Popup, Skeleton } from "@kyoo/primitives";
-import { Fetch } from "../fetch";
+import { Fragment } from "react";
import { useTranslation } from "react-i18next";
import { View } from "react-native";
import { useYoshiki } from "yoshiki/native";
-import { Fragment } from "react";
+import { Fetch } from "../fetch";
const MediaInfoTable = ({
mediaInfo: { path, video, container, audios, subtitles, duration, size },
diff --git a/front/packages/ui/src/components/rating.tsx b/front/packages/ui/src/components/rating.tsx
index 571a37d0..56b5576c 100644
--- a/front/packages/ui/src/components/rating.tsx
+++ b/front/packages/ui/src/components/rating.tsx
@@ -19,8 +19,8 @@
*/
import { type Breakpoint, Icon, P, Skeleton, ts } from "@kyoo/primitives";
-import { View } from "react-native";
import Star from "@material-symbols/svg-400/rounded/star-fill.svg";
+import { View } from "react-native";
import { rem, useYoshiki } from "yoshiki/native";
export const Rating = ({ rating, color }: { rating?: number; color: Breakpoint }) => {
diff --git a/front/packages/ui/src/components/watchlist-info.tsx b/front/packages/ui/src/components/watchlist-info.tsx
index 45c6a0d3..297bbc01 100644
--- a/front/packages/ui/src/components/watchlist-info.tsx
+++ b/front/packages/ui/src/components/watchlist-info.tsx
@@ -18,15 +18,15 @@
* along with Kyoo. If not, see .
*/
+import { WatchStatusV, queryFn, useAccount } from "@kyoo/models";
import { IconButton, Menu, tooltip } from "@kyoo/primitives";
-import type { ComponentProps } from "react";
-import { useTranslation } from "react-i18next";
-import BookmarkAdd from "@material-symbols/svg-400/rounded/bookmark_add.svg";
import Bookmark from "@material-symbols/svg-400/rounded/bookmark-fill.svg";
+import BookmarkAdd from "@material-symbols/svg-400/rounded/bookmark_add.svg";
import BookmarkAdded from "@material-symbols/svg-400/rounded/bookmark_added-fill.svg";
import BookmarkRemove from "@material-symbols/svg-400/rounded/bookmark_remove.svg";
import { useMutation, useQueryClient } from "@tanstack/react-query";
-import { WatchStatusV, queryFn, useAccount } from "@kyoo/models";
+import type { ComponentProps } from "react";
+import { useTranslation } from "react-i18next";
export const watchListIcon = (status: WatchStatusV | null) => {
switch (status) {
diff --git a/front/packages/ui/src/details/episode.tsx b/front/packages/ui/src/details/episode.tsx
index e7f129c3..fe928b4c 100644
--- a/front/packages/ui/src/details/episode.tsx
+++ b/front/packages/ui/src/details/episode.tsx
@@ -18,30 +18,30 @@
* along with Kyoo. If not, see .
*/
+import { type KyooImage, WatchStatusV } from "@kyoo/models";
import {
- focusReset,
H6,
IconButton,
ImageBackground,
type ImageProps,
- important,
Link,
P,
Skeleton,
SubP,
+ focusReset,
+ important,
tooltip,
ts,
} from "@kyoo/primitives";
+import ExpandLess from "@material-symbols/svg-400/rounded/expand_less-fill.svg";
+import ExpandMore from "@material-symbols/svg-400/rounded/expand_more-fill.svg";
+import { useState } from "react";
import { useTranslation } from "react-i18next";
import { type ImageStyle, Platform, type PressableProps, View } from "react-native";
-import type { Layout, WithLoading } from "../fetch";
-import { percent, rem, type Stylable, type Theme, useYoshiki } from "yoshiki/native";
-import { type KyooImage, WatchStatusV } from "@kyoo/models";
+import { type Stylable, type Theme, percent, rem, useYoshiki } from "yoshiki/native";
import { ItemProgress } from "../browse/grid";
import { EpisodesContext } from "../components/context-menus";
-import { useState } from "react";
-import ExpandMore from "@material-symbols/svg-400/rounded/expand_more-fill.svg";
-import ExpandLess from "@material-symbols/svg-400/rounded/expand_less-fill.svg";
+import type { Layout, WithLoading } from "../fetch";
export const episodeDisplayNumber = (
episode: {
diff --git a/front/packages/ui/src/details/movie.tsx b/front/packages/ui/src/details/movie.tsx
index faf54b39..e3f54843 100644
--- a/front/packages/ui/src/details/movie.tsx
+++ b/front/packages/ui/src/details/movie.tsx
@@ -19,12 +19,12 @@
*/
import { type Movie, MovieP, type QueryIdentifier, type QueryPage } from "@kyoo/models";
+import { usePageStyle } from "@kyoo/primitives";
import { Platform, ScrollView } from "react-native";
import { useYoshiki } from "yoshiki/native";
import { DefaultLayout } from "../layout";
-import { Header } from "./header";
import { DetailsCollections } from "./collection";
-import { usePageStyle } from "@kyoo/primitives";
+import { Header } from "./header";
const query = (slug: string): QueryIdentifier => ({
parser: MovieP,
diff --git a/front/packages/ui/src/details/season.tsx b/front/packages/ui/src/details/season.tsx
index 8af67eea..8150f71e 100644
--- a/front/packages/ui/src/details/season.tsx
+++ b/front/packages/ui/src/details/season.tsx
@@ -26,14 +26,14 @@ import {
SeasonP,
useInfiniteFetch,
} from "@kyoo/models";
-import { Skeleton, H6, HR, P, ts, Menu, IconButton, tooltip, usePageStyle } from "@kyoo/primitives";
-import { rem, useYoshiki } from "yoshiki/native";
-import { View } from "react-native";
-import { InfiniteFetch } from "../fetch-infinite";
-import { episodeDisplayNumber, EpisodeLine } from "./episode";
-import { useTranslation } from "react-i18next";
-import type { ComponentType } from "react";
+import { H6, HR, IconButton, Menu, P, Skeleton, tooltip, ts, usePageStyle } from "@kyoo/primitives";
import MenuIcon from "@material-symbols/svg-400/rounded/menu-fill.svg";
+import type { ComponentType } from "react";
+import { useTranslation } from "react-i18next";
+import { View } from "react-native";
+import { rem, useYoshiki } from "yoshiki/native";
+import { InfiniteFetch } from "../fetch-infinite";
+import { EpisodeLine, episodeDisplayNumber } from "./episode";
type SeasonProcessed = Season & { href: string };
diff --git a/front/packages/ui/src/details/show.tsx b/front/packages/ui/src/details/show.tsx
index edf07476..741e211a 100644
--- a/front/packages/ui/src/details/show.tsx
+++ b/front/packages/ui/src/details/show.tsx
@@ -25,17 +25,17 @@ import {
ShowP,
type ShowWatchStatus,
} from "@kyoo/models";
-import { Platform, View, type ViewProps } from "react-native";
-import { percent, useYoshiki } from "yoshiki/native";
-import { DefaultLayout } from "../layout";
-import { EpisodeList, SeasonHeader } from "./season";
-import { Header } from "./header";
-import Svg, { Path, type SvgProps } from "react-native-svg";
import { Container, H2, SwitchVariant, focusReset, ts } from "@kyoo/primitives";
import { forwardRef, useState } from "react";
+import { useTranslation } from "react-i18next";
+import { Platform, View, type ViewProps } from "react-native";
+import Svg, { Path, type SvgProps } from "react-native-svg";
+import { percent, useYoshiki } from "yoshiki/native";
+import { DefaultLayout } from "../layout";
import { DetailsCollections } from "./collection";
import { EpisodeLine, episodeDisplayNumber } from "./episode";
-import { useTranslation } from "react-i18next";
+import { Header } from "./header";
+import { EpisodeList, SeasonHeader } from "./season";
export const SvgWave = (props: SvgProps) => {
const { css } = useYoshiki();
diff --git a/front/packages/ui/src/downloads/index.web.tsx b/front/packages/ui/src/downloads/index.web.tsx
index 1be1a720..b85ce946 100644
--- a/front/packages/ui/src/downloads/index.web.tsx
+++ b/front/packages/ui/src/downloads/index.web.tsx
@@ -19,9 +19,9 @@
*/
import { type WatchInfo, getCurrentApiUrl, queryFn, toQueryKey } from "@kyoo/models";
-import { Player } from "../player";
import { getCurrentAccount } from "@kyoo/models/src/account-internal";
import type { ReactNode } from "react";
+import { Player } from "../player";
export const useDownloader = () => {
return async (type: "episode" | "movie", slug: string) => {
diff --git a/front/packages/ui/src/downloads/page.tsx b/front/packages/ui/src/downloads/page.tsx
index 79e227dc..3439c4e5 100644
--- a/front/packages/ui/src/downloads/page.tsx
+++ b/front/packages/ui/src/downloads/page.tsx
@@ -18,9 +18,7 @@
* along with Kyoo. If not, see .
*/
-import { type State, downloadAtom } from "./state";
-import { FlashList } from "@shopify/flash-list";
-import { type ImageStyle, View } from "react-native";
+import type { KyooImage } from "@kyoo/models";
import {
Alert,
H6,
@@ -34,17 +32,19 @@ import {
ts,
usePageStyle,
} from "@kyoo/primitives";
-import { EpisodeLine, displayRuntime, episodeDisplayNumber } from "../details/episode";
-import { useTranslation } from "react-i18next";
-import { EmptyView } from "../fetch";
-import { percent, useYoshiki } from "yoshiki/native";
-import type { KyooImage } from "@kyoo/models";
-import { type Atom, useAtomValue } from "jotai";
import DownloadForOffline from "@material-symbols/svg-400/rounded/download_for_offline.svg";
import Downloading from "@material-symbols/svg-400/rounded/downloading.svg";
import ErrorIcon from "@material-symbols/svg-400/rounded/error.svg";
import NotStarted from "@material-symbols/svg-400/rounded/not_started.svg";
+import { FlashList } from "@shopify/flash-list";
import { useRouter } from "expo-router";
+import { type Atom, useAtomValue } from "jotai";
+import { useTranslation } from "react-i18next";
+import { type ImageStyle, View } from "react-native";
+import { percent, useYoshiki } from "yoshiki/native";
+import { EpisodeLine, displayRuntime, episodeDisplayNumber } from "../details/episode";
+import { EmptyView } from "../fetch";
+import { type State, downloadAtom } from "./state";
const DownloadedItem = ({
name,
diff --git a/front/packages/ui/src/downloads/state.tsx b/front/packages/ui/src/downloads/state.tsx
index 10046d6c..d463293e 100644
--- a/front/packages/ui/src/downloads/state.tsx
+++ b/front/packages/ui/src/downloads/state.tsx
@@ -21,7 +21,6 @@
import RNBackgroundDownloader, {
type DownloadTask,
} from "@kesha-antonov/react-native-background-downloader";
-import { deleteAsync } from "expo-file-system";
import {
type Account,
type Episode,
@@ -34,14 +33,15 @@ import {
queryFn,
toQueryKey,
} from "@kyoo/models";
-import { Player } from "../player";
-import { atom, useSetAtom, type PrimitiveAtom, useStore } from "jotai";
import { getCurrentAccount, storage } from "@kyoo/models/src/account-internal";
+import { type QueryClient, useQueryClient } from "@tanstack/react-query";
+import { deleteAsync } from "expo-file-system";
+import type { Router } from "expo-router/build/types";
+import { type PrimitiveAtom, atom, useSetAtom, useStore } from "jotai";
import { type ReactNode, useEffect } from "react";
import { ToastAndroid } from "react-native";
-import { type QueryClient, useQueryClient } from "@tanstack/react-query";
-import type { Router } from "expo-router/build/types";
import { z } from "zod";
+import { Player } from "../player";
export type State = {
status: "DOWNLOADING" | "PAUSED" | "DONE" | "FAILED" | "STOPPED";
diff --git a/front/packages/ui/src/errors/connection.tsx b/front/packages/ui/src/errors/connection.tsx
index 94095364..b7a61ebb 100644
--- a/front/packages/ui/src/errors/connection.tsx
+++ b/front/packages/ui/src/errors/connection.tsx
@@ -20,13 +20,13 @@
import { ConnectionErrorContext, useAccount } from "@kyoo/models";
import { Button, H1, Icon, Link, P, ts } from "@kyoo/primitives";
-import { useRouter } from "solito/router";
+import Register from "@material-symbols/svg-400/rounded/app_registration.svg";
import { useContext } from "react";
import { useTranslation } from "react-i18next";
import { View } from "react-native";
+import { useRouter } from "solito/router";
import { useYoshiki } from "yoshiki/native";
import { DefaultLayout } from "../layout";
-import Register from "@material-symbols/svg-400/rounded/app_registration.svg";
export const ConnectionError = () => {
const { css } = useYoshiki();
diff --git a/front/packages/ui/src/fetch-infinite.tsx b/front/packages/ui/src/fetch-infinite.tsx
index 2817b573..413f4558 100644
--- a/front/packages/ui/src/fetch-infinite.tsx
+++ b/front/packages/ui/src/fetch-infinite.tsx
@@ -19,18 +19,18 @@
*/
import { type Page, type QueryIdentifier, useInfiniteFetch } from "@kyoo/models";
-import { useBreakpointMap, HR } from "@kyoo/primitives";
+import { HR, useBreakpointMap } from "@kyoo/primitives";
import { type ContentStyle, FlashList } from "@shopify/flash-list";
import {
type ComponentProps,
type ComponentType,
- isValidElement,
type ReactElement,
+ isValidElement,
useRef,
} from "react";
-import { EmptyView, type Layout, OfflineView, type WithLoading, addHeader } from "./fetch";
-import { ErrorView } from "./errors";
import { FlatList, View, type ViewStyle } from "react-native";
+import { ErrorView } from "./errors";
+import { EmptyView, type Layout, OfflineView, type WithLoading, addHeader } from "./fetch";
const emulateGap = (
layout: "grid" | "vertical" | "horizontal",
diff --git a/front/packages/ui/src/fetch-infinite.web.tsx b/front/packages/ui/src/fetch-infinite.web.tsx
index 19c786f0..900d3a5f 100644
--- a/front/packages/ui/src/fetch-infinite.web.tsx
+++ b/front/packages/ui/src/fetch-infinite.web.tsx
@@ -20,20 +20,20 @@
import { type Page, type QueryIdentifier, useInfiniteFetch } from "@kyoo/models";
import { HR } from "@kyoo/primitives";
+import type { ContentStyle } from "@shopify/flash-list";
import {
type ComponentProps,
type ComponentType,
Fragment,
- isValidElement,
type ReactElement,
+ isValidElement,
useCallback,
useEffect,
useRef,
} from "react";
import { type Stylable, nativeStyleToCss, useYoshiki, ysMap } from "yoshiki";
-import { EmptyView, type Layout, type WithLoading, addHeader } from "./fetch";
import { ErrorView } from "./errors";
-import type { ContentStyle } from "@shopify/flash-list";
+import { EmptyView, type Layout, type WithLoading, addHeader } from "./fetch";
const InfiniteScroll = ({
children,
diff --git a/front/packages/ui/src/home/genre.tsx b/front/packages/ui/src/home/genre.tsx
index 3ce8351e..4deba79c 100644
--- a/front/packages/ui/src/home/genre.tsx
+++ b/front/packages/ui/src/home/genre.tsx
@@ -27,12 +27,12 @@ import {
} from "@kyoo/models";
import { H3, ts } from "@kyoo/primitives";
import { useRef } from "react";
+import { useTranslation } from "react-i18next";
import { View } from "react-native";
import { useYoshiki } from "yoshiki/native";
+import { itemMap } from "../browse";
import { ItemGrid } from "../browse/grid";
import { InfiniteFetchList } from "../fetch-infinite";
-import { useTranslation } from "react-i18next";
-import { itemMap } from "../browse";
export const Header = ({ title }: { title: string }) => {
const { css } = useYoshiki();
diff --git a/front/packages/ui/src/home/header.tsx b/front/packages/ui/src/home/header.tsx
index a99793f3..f26e2e13 100644
--- a/front/packages/ui/src/home/header.tsx
+++ b/front/packages/ui/src/home/header.tsx
@@ -31,13 +31,13 @@ import {
tooltip,
ts,
} from "@kyoo/primitives";
+import Info from "@material-symbols/svg-400/rounded/info.svg";
+import PlayArrow from "@material-symbols/svg-400/rounded/play_arrow-fill.svg";
+import { useTranslation } from "react-i18next";
import { View } from "react-native";
import { percent, rem, useYoshiki } from "yoshiki/native";
-import type { WithLoading } from "../fetch";
import { Header as DetailsHeader } from "../details/header";
-import { useTranslation } from "react-i18next";
-import PlayArrow from "@material-symbols/svg-400/rounded/play_arrow-fill.svg";
-import Info from "@material-symbols/svg-400/rounded/info.svg";
+import type { WithLoading } from "../fetch";
export const Header = ({
isLoading,
diff --git a/front/packages/ui/src/home/index.tsx b/front/packages/ui/src/home/index.tsx
index e7b95a7b..5ffff2db 100644
--- a/front/packages/ui/src/home/index.tsx
+++ b/front/packages/ui/src/home/index.tsx
@@ -19,17 +19,17 @@
*/
import { Genre, type QueryPage, toQueryKey } from "@kyoo/models";
-import { Fetch } from "../fetch";
-import { Header } from "./header";
-import { DefaultLayout } from "../layout";
-import { RefreshControl, ScrollView } from "react-native";
-import { GenreGrid } from "./genre";
-import { Recommended } from "./recommended";
-import { VerticalRecommended } from "./vertical";
-import { NewsList } from "./news";
-import { WatchlistList } from "./watchlist";
import { useQueryClient } from "@tanstack/react-query";
import { useState } from "react";
+import { RefreshControl, ScrollView } from "react-native";
+import { Fetch } from "../fetch";
+import { DefaultLayout } from "../layout";
+import { GenreGrid } from "./genre";
+import { Header } from "./header";
+import { NewsList } from "./news";
+import { Recommended } from "./recommended";
+import { VerticalRecommended } from "./vertical";
+import { WatchlistList } from "./watchlist";
export const HomePage: QueryPage<{}, Genre> = ({ randomItems }) => {
const queryClient = useQueryClient();
diff --git a/front/packages/ui/src/home/news.tsx b/front/packages/ui/src/home/news.tsx
index f4cdab33..bb8295e9 100644
--- a/front/packages/ui/src/home/news.tsx
+++ b/front/packages/ui/src/home/news.tsx
@@ -19,12 +19,12 @@
*/
import { type News, NewsP, type QueryIdentifier, getDisplayDate } from "@kyoo/models";
-import { ItemGrid } from "../browse/grid";
-import { InfiniteFetch } from "../fetch-infinite";
import { useTranslation } from "react-i18next";
-import { Header } from "./genre";
-import { EpisodeBox, episodeDisplayNumber } from "../details/episode";
import { useYoshiki } from "yoshiki/native";
+import { ItemGrid } from "../browse/grid";
+import { EpisodeBox, episodeDisplayNumber } from "../details/episode";
+import { InfiniteFetch } from "../fetch-infinite";
+import { Header } from "./genre";
export const NewsList = () => {
const { t } = useTranslation();
diff --git a/front/packages/ui/src/home/recommended.tsx b/front/packages/ui/src/home/recommended.tsx
index 47827fd5..0236afb8 100644
--- a/front/packages/ui/src/home/recommended.tsx
+++ b/front/packages/ui/src/home/recommended.tsx
@@ -31,25 +31,25 @@ import {
Chip,
H3,
IconFab,
- imageBorderRadius,
Link,
P,
PosterBackground,
Skeleton,
SubP,
focusReset,
+ imageBorderRadius,
tooltip,
ts,
} from "@kyoo/primitives";
+import PlayArrow from "@material-symbols/svg-400/rounded/play_arrow-fill.svg";
+import { useState } from "react";
import { useTranslation } from "react-i18next";
import { ScrollView, View } from "react-native";
import { type Theme, calc, percent, px, rem, useYoshiki } from "yoshiki/native";
+import { ItemGrid, ItemWatchStatus } from "../browse/grid";
+import { ItemContext } from "../components/context-menus";
import type { Layout, WithLoading } from "../fetch";
import { InfiniteFetch } from "../fetch-infinite";
-import PlayArrow from "@material-symbols/svg-400/rounded/play_arrow-fill.svg";
-import { ItemGrid, ItemWatchStatus } from "../browse/grid";
-import { useState } from "react";
-import { ItemContext } from "../components/context-menus";
export const ItemDetails = ({
isLoading,
diff --git a/front/packages/ui/src/home/vertical.tsx b/front/packages/ui/src/home/vertical.tsx
index 96343906..813734ca 100644
--- a/front/packages/ui/src/home/vertical.tsx
+++ b/front/packages/ui/src/home/vertical.tsx
@@ -20,13 +20,13 @@
import { type LibraryItem, LibraryItemP, type QueryIdentifier } from "@kyoo/models";
import { H3 } from "@kyoo/primitives";
+import { useTranslation } from "react-i18next";
import { View } from "react-native";
import { useYoshiki } from "yoshiki/native";
-import { InfiniteFetch } from "../fetch-infinite";
-import { ItemList } from "../browse/list";
-import { useTranslation } from "react-i18next";
-import { ItemGrid } from "../browse/grid";
import { itemMap } from "../browse";
+import { ItemGrid } from "../browse/grid";
+import { ItemList } from "../browse/list";
+import { InfiniteFetch } from "../fetch-infinite";
export const VerticalRecommended = () => {
const { t } = useTranslation();
diff --git a/front/packages/ui/src/home/watchlist.tsx b/front/packages/ui/src/home/watchlist.tsx
index 97fff5b2..fa2e695e 100644
--- a/front/packages/ui/src/home/watchlist.tsx
+++ b/front/packages/ui/src/home/watchlist.tsx
@@ -25,14 +25,14 @@ import {
getDisplayDate,
useAccount,
} from "@kyoo/models";
+import { Button, P, ts } from "@kyoo/primitives";
+import { useTranslation } from "react-i18next";
+import { View } from "react-native";
import { useYoshiki } from "yoshiki/native";
import { ItemGrid } from "../browse/grid";
-import { InfiniteFetch } from "../fetch-infinite";
-import { useTranslation } from "react-i18next";
-import { Header } from "./genre";
import { EpisodeBox, episodeDisplayNumber } from "../details/episode";
-import { View } from "react-native";
-import { Button, P, ts } from "@kyoo/primitives";
+import { InfiniteFetch } from "../fetch-infinite";
+import { Header } from "./genre";
export const WatchlistList = () => {
const { t } = useTranslation();
diff --git a/front/packages/ui/src/layout.tsx b/front/packages/ui/src/layout.tsx
index 0e111eb4..6be5c510 100644
--- a/front/packages/ui/src/layout.tsx
+++ b/front/packages/ui/src/layout.tsx
@@ -18,10 +18,10 @@
* along with Kyoo. If not, see .
*/
-import type { ReactElement } from "react";
-import { Navbar } from "./navbar";
-import { useYoshiki, vw } from "yoshiki/native";
import { Main } from "@kyoo/primitives";
+import type { ReactElement } from "react";
+import { useYoshiki, vw } from "yoshiki/native";
+import { Navbar } from "./navbar";
export const DefaultLayout = ({
page,
diff --git a/front/packages/ui/src/login/form.tsx b/front/packages/ui/src/login/form.tsx
index 665ec10e..a85f6047 100644
--- a/front/packages/ui/src/login/form.tsx
+++ b/front/packages/ui/src/login/form.tsx
@@ -21,9 +21,9 @@
import { imageFn } from "@kyoo/models";
import { ts } from "@kyoo/primitives";
import type { ReactNode } from "react";
-import { ScrollView, ImageBackground, type ImageProps, Platform, View } from "react-native";
+import { ImageBackground, type ImageProps, Platform, ScrollView, View } from "react-native";
import Svg, { type SvgProps, Path } from "react-native-svg";
-import { min, px, type Stylable, useYoshiki, vh } from "yoshiki/native";
+import { type Stylable, min, px, useYoshiki, vh } from "yoshiki/native";
const SvgBlob = (props: SvgProps) => {
const { css, theme } = useYoshiki();
diff --git a/front/packages/ui/src/login/login.tsx b/front/packages/ui/src/login/login.tsx
index 60256229..9a53710c 100644
--- a/front/packages/ui/src/login/login.tsx
+++ b/front/packages/ui/src/login/login.tsx
@@ -18,18 +18,18 @@
* along with Kyoo. If not, see .
*/
-import { login, type QueryPage } from "@kyoo/models";
-import { Button, P, Input, ts, H1, A } from "@kyoo/primitives";
+import { type QueryPage, login } from "@kyoo/models";
+import { A, Button, H1, Input, P, ts } from "@kyoo/primitives";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { Trans } from "react-i18next";
+import { Platform } from "react-native";
import { useRouter } from "solito/router";
import { percent, px, useYoshiki } from "yoshiki/native";
import { DefaultLayout } from "../layout";
import { FormPage } from "./form";
-import { PasswordInput } from "./password-input";
import { OidcLogin } from "./oidc";
-import { Platform } from "react-native";
+import { PasswordInput } from "./password-input";
export const LoginPage: QueryPage<{ apiUrl?: string; error?: string }> = ({
apiUrl,
diff --git a/front/packages/ui/src/login/oidc.tsx b/front/packages/ui/src/login/oidc.tsx
index 81a9c546..1f06ad5a 100644
--- a/front/packages/ui/src/login/oidc.tsx
+++ b/front/packages/ui/src/login/oidc.tsx
@@ -27,11 +27,11 @@ import {
useFetch,
} from "@kyoo/models";
import { Button, HR, Link, P, Skeleton, ts } from "@kyoo/primitives";
-import { View, ImageBackground } from "react-native";
-import { percent, rem, useYoshiki } from "yoshiki/native";
-import { useTranslation } from "react-i18next";
import { useEffect, useRef } from "react";
+import { useTranslation } from "react-i18next";
+import { ImageBackground, View } from "react-native";
import { useRouter } from "solito/router";
+import { percent, rem, useYoshiki } from "yoshiki/native";
import { ErrorView } from "../errors";
export const OidcLogin = ({ apiUrl }: { apiUrl?: string }) => {
diff --git a/front/packages/ui/src/login/password-input.tsx b/front/packages/ui/src/login/password-input.tsx
index 33802424..3cc55945 100644
--- a/front/packages/ui/src/login/password-input.tsx
+++ b/front/packages/ui/src/login/password-input.tsx
@@ -19,10 +19,10 @@
*/
import { IconButton, Input } from "@kyoo/primitives";
-import { type ComponentProps, useState } from "react";
-import { px, useYoshiki } from "yoshiki/native";
import Visibility from "@material-symbols/svg-400/rounded/visibility-fill.svg";
import VisibilityOff from "@material-symbols/svg-400/rounded/visibility_off-fill.svg";
+import { type ComponentProps, useState } from "react";
+import { px, useYoshiki } from "yoshiki/native";
export const PasswordInput = (props: ComponentProps) => {
const { css } = useYoshiki();
diff --git a/front/packages/ui/src/login/register.tsx b/front/packages/ui/src/login/register.tsx
index 4f8e2cb4..23d2c772 100644
--- a/front/packages/ui/src/login/register.tsx
+++ b/front/packages/ui/src/login/register.tsx
@@ -18,18 +18,18 @@
* along with Kyoo. If not, see .
*/
-import { login, type QueryPage } from "@kyoo/models";
-import { Button, P, Input, ts, H1, A } from "@kyoo/primitives";
+import { type QueryPage, login } from "@kyoo/models";
+import { A, Button, H1, Input, P, ts } from "@kyoo/primitives";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { Trans } from "react-i18next";
+import { Platform } from "react-native";
import { useRouter } from "solito/router";
import { percent, px, useYoshiki } from "yoshiki/native";
import { DefaultLayout } from "../layout";
import { FormPage } from "./form";
-import { PasswordInput } from "./password-input";
import { OidcLogin } from "./oidc";
-import { Platform } from "react-native";
+import { PasswordInput } from "./password-input";
export const RegisterPage: QueryPage<{ apiUrl?: string }> = ({ apiUrl }) => {
const [email, setEmail] = useState("");
diff --git a/front/packages/ui/src/login/server-url.tsx b/front/packages/ui/src/login/server-url.tsx
index d38f5017..a2b6ad33 100644
--- a/front/packages/ui/src/login/server-url.tsx
+++ b/front/packages/ui/src/login/server-url.tsx
@@ -25,7 +25,7 @@ import {
ServerInfoP,
useFetch,
} from "@kyoo/models";
-import { Button, P, Link, Input, ts, H1, HR } from "@kyoo/primitives";
+import { Button, H1, HR, Input, Link, P, ts } from "@kyoo/primitives";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { ImageBackground, Platform, View } from "react-native";
diff --git a/front/packages/ui/src/navbar/index.tsx b/front/packages/ui/src/navbar/index.tsx
index 31c20a4f..ec001dc4 100644
--- a/front/packages/ui/src/navbar/index.tsx
+++ b/front/packages/ui/src/navbar/index.tsx
@@ -20,31 +20,31 @@
import { logout, useAccount, useAccounts, useHasPermission } from "@kyoo/models";
import {
- Input,
- IconButton,
- Header,
- Avatar,
A,
- tooltip,
- ts,
+ Avatar,
+ HR,
+ Header,
+ IconButton,
+ Input,
+ Link,
Menu,
PressableFeedback,
- HR,
- Link,
+ tooltip,
+ ts,
} from "@kyoo/primitives";
-import { Platform, type TextInput, View, type ViewProps } from "react-native";
+import Admin from "@material-symbols/svg-400/rounded/admin_panel_settings.svg";
+import Register from "@material-symbols/svg-400/rounded/app_registration.svg";
+import Login from "@material-symbols/svg-400/rounded/login.svg";
+import Logout from "@material-symbols/svg-400/rounded/logout.svg";
+import Search from "@material-symbols/svg-400/rounded/search-fill.svg";
+import Settings from "@material-symbols/svg-400/rounded/settings.svg";
+import { forwardRef, useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
+import { Platform, type TextInput, View, type ViewProps } from "react-native";
import { useRouter } from "solito/router";
import { type Stylable, useYoshiki } from "yoshiki/native";
-import Search from "@material-symbols/svg-400/rounded/search-fill.svg";
-import Login from "@material-symbols/svg-400/rounded/login.svg";
-import Register from "@material-symbols/svg-400/rounded/app_registration.svg";
-import Logout from "@material-symbols/svg-400/rounded/logout.svg";
-import Admin from "@material-symbols/svg-400/rounded/admin_panel_settings.svg";
-import Settings from "@material-symbols/svg-400/rounded/settings.svg";
-import { KyooLongLogo } from "./icon";
-import { forwardRef, useEffect, useRef, useState } from "react";
import { AdminPage } from "../admin";
+import { KyooLongLogo } from "./icon";
export const NavbarTitle = (props: Stylable & { onLayout?: ViewProps["onLayout"] }) => {
const { t } = useTranslation();
diff --git a/front/packages/ui/src/player/components/hover.tsx b/front/packages/ui/src/player/components/hover.tsx
index 8c006b02..db0f8b45 100644
--- a/front/packages/ui/src/player/components/hover.tsx
+++ b/front/packages/ui/src/player/components/hover.tsx
@@ -18,32 +18,32 @@
* along with Kyoo. If not, see .
*/
+import type { Audio, Chapter, KyooImage, Subtitle } from "@kyoo/models";
import {
- alpha,
CircularProgress,
ContrastArea,
H1,
H2,
IconButton,
- imageBorderRadius,
Poster,
PressableFeedback,
Skeleton,
Slider,
Tooltip,
+ alpha,
+ imageBorderRadius,
tooltip,
ts,
useIsTouch,
} from "@kyoo/primitives";
-import type { Chapter, KyooImage, Subtitle, Audio } from "@kyoo/models";
-import { useAtomValue, useSetAtom, useAtom } from "jotai";
-import { type ImageStyle, Platform, Pressable, View, type ViewProps } from "react-native";
-import { useTranslation } from "react-i18next";
-import { percent, rem, useYoshiki } from "yoshiki/native";
-import { useRouter } from "solito/router";
import ArrowBack from "@material-symbols/svg-400/rounded/arrow_back-fill.svg";
-import { LeftButtons, TouchControls } from "./left-buttons";
-import { RightButtons } from "./right-buttons";
+import { useAtom, useAtomValue, useSetAtom } from "jotai";
+import { atom } from "jotai";
+import { type ReactNode, useCallback, useEffect, useRef, useState } from "react";
+import { useTranslation } from "react-i18next";
+import { type ImageStyle, Platform, Pressable, View, type ViewProps } from "react-native";
+import { useRouter } from "solito/router";
+import { percent, rem, useYoshiki } from "yoshiki/native";
import {
bufferedAtom,
durationAtom,
@@ -52,8 +52,8 @@ import {
playAtom,
progressAtom,
} from "../state";
-import { type ReactNode, useCallback, useEffect, useRef, useState } from "react";
-import { atom } from "jotai";
+import { LeftButtons, TouchControls } from "./left-buttons";
+import { RightButtons } from "./right-buttons";
import { BottomScrubber, ScrubberTooltip } from "./scrubber";
const hoverReasonAtom = atom({
diff --git a/front/packages/ui/src/player/components/left-buttons.tsx b/front/packages/ui/src/player/components/left-buttons.tsx
index e8512793..e92c733b 100644
--- a/front/packages/ui/src/player/components/left-buttons.tsx
+++ b/front/packages/ui/src/player/components/left-buttons.tsx
@@ -19,19 +19,19 @@
*/
import { IconButton, Link, P, Slider, noTouch, tooltip, touchOnly, ts } from "@kyoo/primitives";
+import Pause from "@material-symbols/svg-400/rounded/pause-fill.svg";
+import PlayArrow from "@material-symbols/svg-400/rounded/play_arrow-fill.svg";
+import SkipNext from "@material-symbols/svg-400/rounded/skip_next-fill.svg";
+import SkipPrevious from "@material-symbols/svg-400/rounded/skip_previous-fill.svg";
+import VolumeDown from "@material-symbols/svg-400/rounded/volume_down-fill.svg";
+import VolumeMute from "@material-symbols/svg-400/rounded/volume_mute-fill.svg";
+import VolumeOff from "@material-symbols/svg-400/rounded/volume_off-fill.svg";
+import VolumeUp from "@material-symbols/svg-400/rounded/volume_up-fill.svg";
import { useAtom, useAtomValue } from "jotai";
import { useTranslation } from "react-i18next";
import { Platform, View } from "react-native";
-import SkipPrevious from "@material-symbols/svg-400/rounded/skip_previous-fill.svg";
-import SkipNext from "@material-symbols/svg-400/rounded/skip_next-fill.svg";
-import PlayArrow from "@material-symbols/svg-400/rounded/play_arrow-fill.svg";
-import Pause from "@material-symbols/svg-400/rounded/pause-fill.svg";
-import VolumeOff from "@material-symbols/svg-400/rounded/volume_off-fill.svg";
-import VolumeMute from "@material-symbols/svg-400/rounded/volume_mute-fill.svg";
-import VolumeDown from "@material-symbols/svg-400/rounded/volume_down-fill.svg";
-import VolumeUp from "@material-symbols/svg-400/rounded/volume_up-fill.svg";
-import { durationAtom, mutedAtom, playAtom, progressAtom, volumeAtom } from "../state";
import { type Stylable, px, useYoshiki } from "yoshiki/native";
+import { durationAtom, mutedAtom, playAtom, progressAtom, volumeAtom } from "../state";
import { HoverTouch, hoverAtom } from "./hover";
export const LeftButtons = ({
diff --git a/front/packages/ui/src/player/components/right-buttons.tsx b/front/packages/ui/src/player/components/right-buttons.tsx
index fbe81036..28ecb01f 100644
--- a/front/packages/ui/src/player/components/right-buttons.tsx
+++ b/front/packages/ui/src/player/components/right-buttons.tsx
@@ -19,15 +19,15 @@
*/
import type { Audio, Subtitle } from "@kyoo/models";
-import { IconButton, tooltip, Menu, ts } from "@kyoo/primitives";
-import { useAtom } from "jotai";
-import { Platform, View } from "react-native";
-import { useTranslation } from "react-i18next";
+import { IconButton, Menu, tooltip, ts } from "@kyoo/primitives";
import ClosedCaption from "@material-symbols/svg-400/rounded/closed_caption-fill.svg";
import Fullscreen from "@material-symbols/svg-400/rounded/fullscreen-fill.svg";
import FullscreenExit from "@material-symbols/svg-400/rounded/fullscreen_exit-fill.svg";
-import SettingsIcon from "@material-symbols/svg-400/rounded/settings-fill.svg";
import MusicNote from "@material-symbols/svg-400/rounded/music_note-fill.svg";
+import SettingsIcon from "@material-symbols/svg-400/rounded/settings-fill.svg";
+import { useAtom } from "jotai";
+import { useTranslation } from "react-i18next";
+import { Platform, View } from "react-native";
import { type Stylable, useYoshiki } from "yoshiki/native";
import { fullscreenAtom, subtitleAtom } from "../state";
import { AudiosMenu, QualitiesMenu } from "../video";
diff --git a/front/packages/ui/src/player/components/scrubber.tsx b/front/packages/ui/src/player/components/scrubber.tsx
index 1f86d542..0487cce1 100644
--- a/front/packages/ui/src/player/components/scrubber.tsx
+++ b/front/packages/ui/src/player/components/scrubber.tsx
@@ -18,16 +18,16 @@
* along with Kyoo. If not, see .
*/
-import { useFetch, type QueryIdentifier, imageFn, type Chapter } from "@kyoo/models";
-import { Sprite, P, imageBorderRadius, ts } from "@kyoo/primitives";
-import { View, Platform } from "react-native";
-import { percent, useYoshiki, px, type Theme, useForceRerender } from "yoshiki/native";
-import { useMemo } from "react";
+import { type Chapter, type QueryIdentifier, imageFn, useFetch } from "@kyoo/models";
+import { P, Sprite, imageBorderRadius, ts } from "@kyoo/primitives";
import { useAtomValue } from "jotai";
-import { durationAtom } from "../state";
-import { toTimerString } from "./left-buttons";
-import { seekProgressAtom } from "./hover";
+import { useMemo } from "react";
+import { Platform, View } from "react-native";
+import { type Theme, percent, px, useForceRerender, useYoshiki } from "yoshiki/native";
import { ErrorView } from "../../errors";
+import { durationAtom } from "../state";
+import { seekProgressAtom } from "./hover";
+import { toTimerString } from "./left-buttons";
type Thumb = {
from: number;
diff --git a/front/packages/ui/src/player/index.tsx b/front/packages/ui/src/player/index.tsx
index 25f19139..54a1eb42 100644
--- a/front/packages/ui/src/player/index.tsx
+++ b/front/packages/ui/src/player/index.tsx
@@ -29,19 +29,19 @@ import {
useFetch,
} from "@kyoo/models";
import { Head } from "@kyoo/primitives";
-import { useState, useEffect, type ComponentProps } from "react";
-import { Platform, StyleSheet, View } from "react-native";
-import { useTranslation } from "react-i18next";
-import { useRouter } from "solito/router";
import { useSetAtom } from "jotai";
+import { type ComponentProps, useEffect, useState } from "react";
+import { useTranslation } from "react-i18next";
+import { Platform, StyleSheet, View } from "react-native";
+import { useRouter } from "solito/router";
import { useYoshiki } from "yoshiki/native";
-import { Back, Hover, LoadingIndicator } from "./components/hover";
-import { durationAtom, fullscreenAtom, Video } from "./state";
import { episodeDisplayNumber } from "../details/episode";
+import { ErrorView } from "../errors";
+import { Back, Hover, LoadingIndicator } from "./components/hover";
import { useVideoKeyboard } from "./keyboard";
import { MediaSessionManager } from "./media-session";
+import { Video, durationAtom, fullscreenAtom } from "./state";
import { WatchStatusObserver } from "./watch-status-observer";
-import { ErrorView } from "../errors";
type Item = (Movie & { type: "movie" }) | (Episode & { type: "episode" });
diff --git a/front/packages/ui/src/player/keyboard.tsx b/front/packages/ui/src/player/keyboard.tsx
index f422fa58..5cd828b9 100644
--- a/front/packages/ui/src/player/keyboard.tsx
+++ b/front/packages/ui/src/player/keyboard.tsx
@@ -20,8 +20,9 @@
import type { Subtitle } from "@kyoo/models";
import { atom, useSetAtom } from "jotai";
-import { useRouter } from "solito/router";
import { useEffect } from "react";
+import { Platform } from "react-native";
+import { useRouter } from "solito/router";
import {
durationAtom,
fullscreenAtom,
@@ -31,7 +32,6 @@ import {
subtitleAtom,
volumeAtom,
} from "./state";
-import { Platform } from "react-native";
type Action =
| { type: "play" }
diff --git a/front/packages/ui/src/player/media-session.tsx b/front/packages/ui/src/player/media-session.tsx
index fde2d3f7..07f3f588 100644
--- a/front/packages/ui/src/player/media-session.tsx
+++ b/front/packages/ui/src/player/media-session.tsx
@@ -19,8 +19,8 @@
*/
import { useAtom, useAtomValue, useSetAtom } from "jotai";
-import { useRouter } from "solito/router";
import { useEffect } from "react";
+import { useRouter } from "solito/router";
import { reducerAtom } from "./keyboard";
import { durationAtom, playAtom, progressAtom } from "./state";
diff --git a/front/packages/ui/src/player/state.tsx b/front/packages/ui/src/player/state.tsx
index ba15e01d..59394dd2 100644
--- a/front/packages/ui/src/player/state.tsx
+++ b/front/packages/ui/src/player/state.tsx
@@ -19,21 +19,21 @@
*/
import { type Audio, type Episode, type Subtitle, getLocalSetting, useAccount } from "@kyoo/models";
+import { useSnackbar } from "@kyoo/primitives";
import { atom, useAtom, useAtomValue, useSetAtom } from "jotai";
import { useAtomCallback } from "jotai/utils";
import {
type ElementRef,
memo,
+ useCallback,
useEffect,
useLayoutEffect,
useRef,
useState,
- useCallback,
} from "react";
-import NativeVideo, { type VideoProps } from "./video";
-import { Platform } from "react-native";
-import { useSnackbar } from "@kyoo/primitives";
import { useTranslation } from "react-i18next";
+import { Platform } from "react-native";
+import NativeVideo, { type VideoProps } from "./video";
export const playAtom = atom(true);
export const loadAtom = atom(false);
diff --git a/front/packages/ui/src/player/video.tsx b/front/packages/ui/src/player/video.tsx
index 509033f3..3f4d5dbc 100644
--- a/front/packages/ui/src/player/video.tsx
+++ b/front/packages/ui/src/player/video.tsx
@@ -35,8 +35,12 @@ export * from "react-native-video";
import { type Audio, type Subtitle, useToken } from "@kyoo/models";
import { type IconButton, Menu } from "@kyoo/primitives";
-import { type ComponentProps, forwardRef, useEffect } from "react";
+import "@kyoo/primitives/src/types.d.ts";
import { atom, useAtom, useAtomValue, useSetAtom } from "jotai";
+import { type ComponentProps, forwardRef, useEffect } from "react";
+import { useTranslation } from "react-i18next";
+import { View } from "react-native";
+import uuid from "react-native-uuid";
import NativeVideo, {
type VideoRef,
type OnLoadData,
@@ -44,12 +48,8 @@ import NativeVideo, {
SelectedTrackType,
SelectedVideoTrackType,
} from "react-native-video";
-import { useTranslation } from "react-i18next";
-import { PlayMode, audioAtom, playModeAtom, subtitleAtom } from "./state";
-import uuid from "react-native-uuid";
-import { View } from "react-native";
-import "@kyoo/primitives/src/types.d.ts";
import { useYoshiki } from "yoshiki/native";
+import { PlayMode, audioAtom, playModeAtom, subtitleAtom } from "./state";
const MimeTypes: Map = new Map([
["subrip", "application/x-subrip"],
diff --git a/front/packages/ui/src/player/video.web.tsx b/front/packages/ui/src/player/video.web.tsx
index 48f281ee..1646ec4c 100644
--- a/front/packages/ui/src/player/video.web.tsx
+++ b/front/packages/ui/src/player/video.web.tsx
@@ -18,25 +18,25 @@
* along with Kyoo. If not, see .
*/
-import { getToken, type Subtitle, type Audio } from "@kyoo/models";
+import { type Audio, type Subtitle, getToken } from "@kyoo/models";
+import { Menu, tooltip } from "@kyoo/primitives";
+import Hls, { type Level, type LoadPolicy } from "hls.js";
+import Jassub from "jassub";
+import { useAtom, useAtomValue, useSetAtom } from "jotai";
import {
- forwardRef,
+ type ComponentProps,
type RefObject,
+ forwardRef,
useEffect,
useImperativeHandle,
useLayoutEffect,
useRef,
- type ComponentProps,
} from "react";
-import type { VideoProps } from "react-native-video";
-import { useAtomValue, useSetAtom, useAtom } from "jotai";
-import { useForceRerender, useYoshiki } from "yoshiki";
-import Jassub from "jassub";
-import { audioAtom, playAtom, PlayMode, playModeAtom, progressAtom, subtitleAtom } from "./state";
-import Hls, { type Level, type LoadPolicy } from "hls.js";
import { useTranslation } from "react-i18next";
-import { Menu, tooltip } from "@kyoo/primitives";
+import type { VideoProps } from "react-native-video";
import toVttBlob from "srt-webvtt";
+import { useForceRerender, useYoshiki } from "yoshiki";
+import { PlayMode, audioAtom, playAtom, playModeAtom, progressAtom, subtitleAtom } from "./state";
let hls: Hls | null = null;
diff --git a/front/packages/ui/src/player/watch-status-observer.tsx b/front/packages/ui/src/player/watch-status-observer.tsx
index c2621d4b..08b4d4d8 100644
--- a/front/packages/ui/src/player/watch-status-observer.tsx
+++ b/front/packages/ui/src/player/watch-status-observer.tsx
@@ -20,9 +20,9 @@
import { type MutationParam, WatchStatusV, useAccount } from "@kyoo/models";
import { useMutation, useQueryClient } from "@tanstack/react-query";
-import { useEffect, useCallback } from "react";
import { useAtomValue } from "jotai";
import { useAtomCallback } from "jotai/utils";
+import { useCallback, useEffect } from "react";
import { playAtom, progressAtom } from "./state";
export const WatchStatusObserver = ({
diff --git a/front/packages/ui/src/search/index.tsx b/front/packages/ui/src/search/index.tsx
index aea0d45a..8d88b3bb 100644
--- a/front/packages/ui/src/search/index.tsx
+++ b/front/packages/ui/src/search/index.tsx
@@ -19,17 +19,17 @@
*/
import { type LibraryItem, LibraryItemP, type QueryIdentifier, type QueryPage } from "@kyoo/models";
+import { usePageStyle } from "@kyoo/primitives";
import { useState } from "react";
import { useTranslation } from "react-i18next";
import { createParam } from "solito";
-import { DefaultLayout } from "../layout";
-import { InfiniteFetch } from "../fetch-infinite";
import { itemMap } from "../browse";
-import { SearchSort, SortOrd, Layout } from "../browse/types";
-import { BrowseSettings } from "../browse/header";
import { ItemGrid } from "../browse/grid";
+import { BrowseSettings } from "../browse/header";
import { ItemList } from "../browse/list";
-import { usePageStyle } from "@kyoo/primitives";
+import { Layout, SearchSort, SortOrd } from "../browse/types";
+import { InfiniteFetch } from "../fetch-infinite";
+import { DefaultLayout } from "../layout";
const { useParam } = createParam<{ sortBy?: string }>();
diff --git a/front/packages/ui/src/settings/account.tsx b/front/packages/ui/src/settings/account.tsx
index 740c4f9f..9af82464 100644
--- a/front/packages/ui/src/settings/account.tsx
+++ b/front/packages/ui/src/settings/account.tsx
@@ -28,18 +28,18 @@ import {
} from "@kyoo/models";
import { Alert, Avatar, Button, H1, Icon, Input, P, Popup, ts, usePopup } from "@kyoo/primitives";
import { useMutation, useQueryClient } from "@tanstack/react-query";
+import * as ImagePicker from "expo-image-picker";
import { type ComponentProps, useState } from "react";
import { useTranslation } from "react-i18next";
import { View } from "react-native";
import { rem, useYoshiki } from "yoshiki/native";
-import * as ImagePicker from "expo-image-picker";
import { PasswordInput } from "../login/password-input";
import { Preference, SettingsContainer } from "./base";
import Username from "@material-symbols/svg-400/outlined/badge.svg";
-import AccountCircle from "@material-symbols/svg-400/rounded/account_circle-fill.svg";
import Mail from "@material-symbols/svg-400/outlined/mail.svg";
import Password from "@material-symbols/svg-400/outlined/password.svg";
+import AccountCircle from "@material-symbols/svg-400/rounded/account_circle-fill.svg";
import Delete from "@material-symbols/svg-400/rounded/delete.svg";
import Logout from "@material-symbols/svg-400/rounded/logout.svg";
diff --git a/front/packages/ui/src/settings/index.tsx b/front/packages/ui/src/settings/index.tsx
index 764124bd..de60c769 100644
--- a/front/packages/ui/src/settings/index.tsx
+++ b/front/packages/ui/src/settings/index.tsx
@@ -24,8 +24,8 @@ import { ScrollView } from "react-native";
import { DefaultLayout } from "../layout";
import { AccountSettings } from "./account";
import { About, GeneralSettings } from "./general";
-import { PlaybackSettings } from "./playback";
import { OidcSettings } from "./oidc";
+import { PlaybackSettings } from "./playback";
export const SettingsPage: QueryPage = () => {
const account = useAccount();
diff --git a/front/packages/ui/src/settings/oidc.tsx b/front/packages/ui/src/settings/oidc.tsx
index 6cb9edf4..6cd54c30 100644
--- a/front/packages/ui/src/settings/oidc.tsx
+++ b/front/packages/ui/src/settings/oidc.tsx
@@ -34,8 +34,8 @@ import { ErrorView } from "../errors";
import { Preference, SettingsContainer } from "./base";
import Badge from "@material-symbols/svg-400/outlined/badge.svg";
-import OpenProfile from "@material-symbols/svg-400/outlined/open_in_new.svg";
import Remove from "@material-symbols/svg-400/outlined/close.svg";
+import OpenProfile from "@material-symbols/svg-400/outlined/open_in_new.svg";
import { useMutation, useQueryClient } from "@tanstack/react-query";
export const OidcSettings = () => {
diff --git a/front/packages/ui/src/settings/playback.tsx b/front/packages/ui/src/settings/playback.tsx
index 749ab51c..1ceb5b74 100644
--- a/front/packages/ui/src/settings/playback.tsx
+++ b/front/packages/ui/src/settings/playback.tsx
@@ -18,16 +18,16 @@
* along with Kyoo. If not, see .
*/
-import { Select } from "@kyoo/primitives";
import { useLocalSetting } from "@kyoo/models";
-import { useTranslation } from "react-i18next";
+import { Select } from "@kyoo/primitives";
import { useSetAtom } from "jotai";
-import { Preference, SettingsContainer, useSetting } from "./base";
+import { useTranslation } from "react-i18next";
import { PlayMode, playModeAtom } from "../player/state";
+import { Preference, SettingsContainer, useSetting } from "./base";
+import SubtitleLanguage from "@material-symbols/svg-400/rounded/closed_caption-fill.svg";
import PlayModeI from "@material-symbols/svg-400/rounded/display_settings-fill.svg";
import AudioLanguage from "@material-symbols/svg-400/rounded/music_note-fill.svg";
-import SubtitleLanguage from "@material-symbols/svg-400/rounded/closed_caption-fill.svg";
// I gave up on finding a way to retrive this using the Intl api (probably does not exist)
// Simply copy pasted the list of languages from https://www.localeplanet.com/api/codelist.json