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,
},
}