diff --git a/apps/mobile/src/components/ui/form/TextField.tsx b/apps/mobile/src/components/ui/form/TextField.tsx index c75bb9fe9..b1d3179bb 100644 --- a/apps/mobile/src/components/ui/form/TextField.tsx +++ b/apps/mobile/src/components/ui/form/TextField.tsx @@ -2,7 +2,7 @@ import { composeEventHandlers } from "@follow/utils" import { cn } from "@follow/utils/utils" import { useEffect, useImperativeHandle, useRef, useState } from "react" import type { StyleProp, TextInputProps, ViewStyle } from "react-native" -import { StyleSheet, Text, TextInput, TouchableWithoutFeedback, View } from "react-native" +import { StyleSheet, Text, TextInput, TouchableOpacity, View } from "react-native" import Animated, { useAnimatedStyle, useSharedValue, withSpring } from "react-native-reanimated" import { gentleSpringPreset } from "@/src/constants/spring" @@ -144,14 +144,14 @@ export const PlainTextField = ({ }} /> - { textInputRef.current?.clear() props.onChangeText?.("") }} > - + ) diff --git a/apps/mobile/src/icons/facebook_cute_fi.tsx b/apps/mobile/src/icons/facebook_cute_fi.tsx new file mode 100644 index 000000000..208a807d0 --- /dev/null +++ b/apps/mobile/src/icons/facebook_cute_fi.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface FacebookCuteFiIconProps { + width?: number + height?: number + color?: string +} + +export const FacebookCuteFiIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: FacebookCuteFiIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/facebook_cute_re.tsx b/apps/mobile/src/icons/facebook_cute_re.tsx new file mode 100644 index 000000000..2776703c0 --- /dev/null +++ b/apps/mobile/src/icons/facebook_cute_re.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface FacebookCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const FacebookCuteReIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: FacebookCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/finger_press_cute_re.tsx b/apps/mobile/src/icons/finger_press_cute_re.tsx new file mode 100644 index 000000000..bb69d9726 --- /dev/null +++ b/apps/mobile/src/icons/finger_press_cute_re.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface FingerPressCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const FingerPressCuteReIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: FingerPressCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/instagram_cute_fi.tsx b/apps/mobile/src/icons/instagram_cute_fi.tsx new file mode 100644 index 000000000..7aa186140 --- /dev/null +++ b/apps/mobile/src/icons/instagram_cute_fi.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface InstagramCuteFiIconProps { + width?: number + height?: number + color?: string +} + +export const InstagramCuteFiIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: InstagramCuteFiIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/telegram_cute_fi.tsx b/apps/mobile/src/icons/telegram_cute_fi.tsx new file mode 100644 index 000000000..e19e5dd93 --- /dev/null +++ b/apps/mobile/src/icons/telegram_cute_fi.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface TelegramCuteFiIconProps { + width?: number + height?: number + color?: string +} + +export const TelegramCuteFiIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: TelegramCuteFiIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/telegram_cute_re.tsx b/apps/mobile/src/icons/telegram_cute_re.tsx new file mode 100644 index 000000000..87d73ce46 --- /dev/null +++ b/apps/mobile/src/icons/telegram_cute_re.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface TelegramCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const TelegramCuteReIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: TelegramCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/icons/weibo_cute_re.tsx b/apps/mobile/src/icons/weibo_cute_re.tsx new file mode 100644 index 000000000..6afe6a865 --- /dev/null +++ b/apps/mobile/src/icons/weibo_cute_re.tsx @@ -0,0 +1,24 @@ +import * as React from "react" +import Svg, { Path } from "react-native-svg" + +interface WeiboCuteReIconProps { + width?: number + height?: number + color?: string +} + +export const WeiboCuteReIcon = ({ + width = 24, + height = 24, + color = "#10161F", +}: WeiboCuteReIconProps) => { + return ( + + + + ) +} diff --git a/apps/mobile/src/modules/settings/UserHeaderBanner.tsx b/apps/mobile/src/modules/settings/UserHeaderBanner.tsx index 035d7e4af..bf3c1d792 100644 --- a/apps/mobile/src/modules/settings/UserHeaderBanner.tsx +++ b/apps/mobile/src/modules/settings/UserHeaderBanner.tsx @@ -2,19 +2,40 @@ import { useImageColors, usePrefetchImageColors } from "@follow/store/image/hook import { useUserById } from "@follow/store/user/hooks" import { cn, getLuminance } from "@follow/utils" import { LinearGradient } from "expo-linear-gradient" +import type { FC } from "react" import { useMemo } from "react" -import { StyleSheet, Text, TouchableOpacity, View } from "react-native" +import { Linking, StyleSheet, Text, TouchableOpacity, View } from "react-native" import type { SharedValue } from "react-native-reanimated" import ReAnimated, { FadeIn, FadeOut, interpolate, useAnimatedStyle } from "react-native-reanimated" import { useSafeAreaInsets } from "react-native-safe-area-context" import { useColor } from "react-native-uikit-colors" import { UserAvatar } from "@/src/components/ui/avatar/UserAvatar" +import { DiscordCuteFiIcon } from "@/src/icons/discord_cute_fi" +import { FacebookCuteFiIcon } from "@/src/icons/facebook_cute_fi" +import { GithubCuteFiIcon } from "@/src/icons/github_cute_fi" +import { InstagramCuteFiIcon } from "@/src/icons/instagram_cute_fi" +import { LinkCuteReIcon } from "@/src/icons/link_cute_re" +import { TwitterCuteFiIcon } from "@/src/icons/twitter_cute_fi" +import { WebCuteReIcon } from "@/src/icons/web_cute_re" +import { YoutubeCuteFiIcon } from "@/src/icons/youtube_cute_fi" import { useNavigation } from "@/src/lib/navigation/hooks" import { LoginScreen } from "@/src/screens/(modal)/LoginScreen" const defaultGradientColors = ["#000", "#100", "#200"] +const PlatformInfoMap: Record< + string, + { component: FC; color: { light: string; dark: string } } +> = { + github: { component: GithubCuteFiIcon, color: { light: "#181717", dark: "#FFFFFF" } }, + twitter: { component: TwitterCuteFiIcon, color: { light: "#1DA1F2", dark: "#1DA1F2" } }, + youtube: { component: YoutubeCuteFiIcon, color: { light: "#FF0000", dark: "#FF0000" } }, + discord: { component: DiscordCuteFiIcon, color: { light: "#5865F2", dark: "#5865F2" } }, + instagram: { component: InstagramCuteFiIcon, color: { light: "#C13584", dark: "#C13584" } }, + facebook: { component: FacebookCuteFiIcon, color: { light: "#1877F2", dark: "#1877F2" } }, +} + export const UserHeaderBanner = ({ scrollY, userId, @@ -46,6 +67,15 @@ export const UserHeaderBanner = ({ return [imageColors.primary, imageColors.secondary, imageColors.background] }, [bgColor, imageColors, user]) + const socialLinks = useMemo(() => { + if (!user?.socialLinks) { + return [] + } + return Object.entries(user.socialLinks) + .filter(([, value]) => !!value) + .map(([platform, link]) => ({ platform, link: link! })) + }, [user?.socialLinks]) + const gradientLight = useMemo(() => { if (!imageColors) return false if (imageColors.platform === "web") return false @@ -61,10 +91,8 @@ export const UserHeaderBanner = ({ extrapolateRight: "clamp", }) - if (!gradientColors) return {} return { transform: [{ scale: scaleValue }], - height: 250, } }) @@ -83,7 +111,6 @@ export const UserHeaderBanner = ({ }) return { - marginTop: insets.top, transform: [{ scale: avatarScale }, { translateY: avatarTranslateY }], } }) @@ -92,10 +119,10 @@ export const UserHeaderBanner = ({ return ( - + )} - - - + + + + - - {user?.name ? ( + + {user?.name ? ( + + {user.name} + + ) : ( + Folo Account + )} + + {user?.handle ? ( + + @{user.handle} + + ) : !user ? ( + navigation.presentControllerView(LoginScreen)} + > + Sign in to your account + + ) : null} + + {user?.bio ? ( - {user.name} + {user.bio} - ) : ( - Folo Account - )} - - {user?.handle ? ( - - @{user.handle} - - ) : !user ? ( - navigation.presentControllerView(LoginScreen)} - > - Sign in to your account - ) : null} + + {user?.website && ( + user.website && Linking.openURL(user.website)} + > + + + {user.website.replace(/^(https?:\/\/)?(www\.)?/, "")} + + + )} + {socialLinks.map(({ platform, link }) => { + const platformInfo = PlatformInfoMap[platform as keyof typeof PlatformInfoMap] + const IconComponent = platformInfo ? platformInfo.component : LinkCuteReIcon + const color = platformInfo + ? gradientLight + ? platformInfo.color.light + : platformInfo.color.dark + : gradientLight + ? "rgba(0,0,0,0.8)" + : "rgba(255,255,255,0.8)" + + return ( + Linking.openURL(link)}> + + + ) + })} + ) diff --git a/apps/mobile/src/modules/settings/routes/EditProfile.tsx b/apps/mobile/src/modules/settings/routes/EditProfile.tsx index 2c8c1880a..bfe14ed3f 100644 --- a/apps/mobile/src/modules/settings/routes/EditProfile.tsx +++ b/apps/mobile/src/modules/settings/routes/EditProfile.tsx @@ -6,7 +6,7 @@ import { useMutation } from "@tanstack/react-query" import type { FC } from "react" import { useState } from "react" import { useTranslation } from "react-i18next" -import { Text, TouchableOpacity, TouchableWithoutFeedback, View } from "react-native" +import { Text, TextInput, TouchableOpacity, TouchableWithoutFeedback, View } from "react-native" import { KeyboardController } from "react-native-keyboard-controller" import { HeaderSubmitTextButton } from "@/src/components/layouts/header/HeaderElements" @@ -206,9 +206,9 @@ const ProfileForm: FC<{ - - + diff --git a/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx b/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx index 3624f2e71..5a26c8871 100644 --- a/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx +++ b/apps/mobile/src/screens/(stack)/(tabs)/settings.tsx @@ -22,11 +22,8 @@ import { UserHeaderBanner } from "@/src/modules/settings/UserHeaderBanner" export function Settings() { const insets = useSafeAreaInsets() - const screenContext = use(ScreenItemContext) - const whoami = useWhoami() - const scrollViewRef = useRegisterNavigationScrollView() return ( diff --git a/icons/mgc/facebook_cute_fi.svg b/icons/mgc/facebook_cute_fi.svg new file mode 100644 index 000000000..bf1e79037 --- /dev/null +++ b/icons/mgc/facebook_cute_fi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/mgc/instagram_cute_fi.svg b/icons/mgc/instagram_cute_fi.svg new file mode 100644 index 000000000..a71872d27 --- /dev/null +++ b/icons/mgc/instagram_cute_fi.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/internal/database/src/drizzle/0026_numerous_slyde.sql b/packages/internal/database/src/drizzle/0026_numerous_slyde.sql new file mode 100644 index 000000000..a5c76dd52 --- /dev/null +++ b/packages/internal/database/src/drizzle/0026_numerous_slyde.sql @@ -0,0 +1,3 @@ +ALTER TABLE `users` ADD `bio` text;--> statement-breakpoint +ALTER TABLE `users` ADD `website` text;--> statement-breakpoint +ALTER TABLE `users` ADD `social_links` text; \ No newline at end of file diff --git a/packages/internal/database/src/drizzle/meta/0026_snapshot.json b/packages/internal/database/src/drizzle/meta/0026_snapshot.json new file mode 100644 index 000000000..f99df863b --- /dev/null +++ b/packages/internal/database/src/drizzle/meta/0026_snapshot.json @@ -0,0 +1,785 @@ +{ + "version": "6", + "dialect": "sqlite", + "id": "3788abcf-7e98-4d02-ba93-7d3407c4eea5", + "prevId": "f4599e18-03d8-442b-80b4-eb73fb18b9d3", + "tables": { + "collections": { + "name": "collections", + "columns": { + "feed_id": { + "name": "feed_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "entry_id": { + "name": "entry_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "view": { + "name": "view", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "entries": { + "name": "entries", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "source_content": { + "name": "source_content", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "guid": { + "name": "guid", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "author": { + "name": "author", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "author_url": { + "name": "author_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "author_avatar": { + "name": "author_avatar", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "inserted_at": { + "name": "inserted_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "published_at": { + "name": "published_at", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "media": { + "name": "media", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "categories": { + "name": "categories", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "attachments": { + "name": "attachments", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "extra": { + "name": "extra", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "feed_id": { + "name": "feed_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "inbox_handle": { + "name": "inbox_handle", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "read": { + "name": "read", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sources": { + "name": "sources", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "settings": { + "name": "settings", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "feeds": { + "name": "feeds", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "error_at": { + "name": "error_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "site_url": { + "name": "site_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "error_message": { + "name": "error_message", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "subscription_count": { + "name": "subscription_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "updates_per_week": { + "name": "updates_per_week", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "latest_entry_published_at": { + "name": "latest_entry_published_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "tip_users": { + "name": "tip_users", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "published_at": { + "name": "published_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "images": { + "name": "images", + "columns": { + "url": { + "name": "url", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "colors": { + "name": "colors", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": "(CURRENT_TIMESTAMP)" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "inboxes": { + "name": "inboxes", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "secret": { + "name": "secret", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "lists": { + "name": "lists", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "feed_ids": { + "name": "feed_ids", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "view": { + "name": "view", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "fee": { + "name": "fee", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "owner_user_id": { + "name": "owner_user_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "subscription_count": { + "name": "subscription_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "purchase_amount": { + "name": "purchase_amount", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "subscriptions": { + "name": "subscriptions", + "columns": { + "feed_id": { + "name": "feed_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "list_id": { + "name": "list_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "inbox_id": { + "name": "inbox_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "view": { + "name": "view", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_private": { + "name": "is_private", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "category": { + "name": "category", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "type": { + "name": "type", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "summaries": { + "name": "summaries", + "columns": { + "entry_id": { + "name": "entry_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "summary": { + "name": "summary", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "readability_summary": { + "name": "readability_summary", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "unq": { + "name": "unq", + "columns": ["entry_id", "language"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "translations": { + "name": "translations", + "columns": { + "entry_id": { + "name": "entry_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "language": { + "name": "language", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "title": { + "name": "title", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "readability_content": { + "name": "readability_content", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "translation-unique-index": { + "name": "translation-unique-index", + "columns": ["entry_id", "language"], + "isUnique": true + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "unread": { + "name": "unread", + "columns": { + "subscription_id": { + "name": "subscription_id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "count": { + "name": "count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "users": { + "name": "users", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "handle": { + "name": "handle", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "image": { + "name": "image", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "is_me": { + "name": "is_me", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "website": { + "name": "website", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "social_links": { + "name": "social_links", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + } + }, + "views": {}, + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} + } +} diff --git a/packages/internal/database/src/drizzle/meta/_journal.json b/packages/internal/database/src/drizzle/meta/_journal.json index 6a6264ac0..910f728a9 100644 --- a/packages/internal/database/src/drizzle/meta/_journal.json +++ b/packages/internal/database/src/drizzle/meta/_journal.json @@ -183,6 +183,13 @@ "when": 1749633611180, "tag": "0025_colorful_valkyrie", "breakpoints": true + }, + { + "idx": 26, + "version": "6", + "when": 1749640123453, + "tag": "0026_numerous_slyde", + "breakpoints": true } ] } diff --git a/packages/internal/database/src/drizzle/migrations.js b/packages/internal/database/src/drizzle/migrations.js index 68123f55c..3d13351a5 100644 --- a/packages/internal/database/src/drizzle/migrations.js +++ b/packages/internal/database/src/drizzle/migrations.js @@ -26,6 +26,7 @@ import m0022 from "./0022_tiny_northstar.sql" import m0023 from "./0023_pink_namor.sql" import m0024 from "./0024_spooky_alex_power.sql" import m0025 from "./0025_colorful_valkyrie.sql" +import m0026 from "./0026_numerous_slyde.sql" import journal from "./meta/_journal.json" export default { @@ -57,5 +58,6 @@ export default { m0023, m0024, m0025, + m0026, }, }