This commit is contained in:
imeepos 2025-12-25 18:32:56 +08:00
parent deaa68f048
commit fa8cc1705f
18 changed files with 86 additions and 23 deletions

View File

@ -354,7 +354,7 @@ export default function Index() {
}, [selectedCategoryId]) }, [selectedCategoryId])
const displayTemplates = useMemo(() => { const displayTemplates = useMemo(() => {
const recommended = recommendedTemplates.data?.recommendedTemplates || [] const recommended = recommendedTemplates.data?.templates || []
const regular = templates.data?.templates || [] const regular = templates.data?.templates || []
const all = selectedCategoryId const all = selectedCategoryId

View File

@ -15,6 +15,7 @@ import { useUserBalance } from '@/hooks/core/use-user-balance'
import { useTemplates } from '@/hooks/data/use-templates' import { useTemplates } from '@/hooks/data/use-templates'
import { usePublicTemplates } from '@/hooks/data/use-public-templates' import { usePublicTemplates } from '@/hooks/data/use-public-templates'
import { useFavoriteTemplates } from '@/hooks/data/use-favorite-templates' import { useFavoriteTemplates } from '@/hooks/data/use-favorite-templates'
import type { GetUserFavoritesResponse } from '@repo/sdk'
import { useAigcTask } from '@/hooks/actions/use-aigc-task' import { useAigcTask } from '@/hooks/actions/use-aigc-task'
import { useTemplateInteraction } from '@/hooks/actions/use-template-interaction' import { useTemplateInteraction } from '@/hooks/actions/use-template-interaction'
@ -369,7 +370,7 @@ export default function Sync() {
setHasMore(false) setHasMore(false)
return return
} }
newItems = data.favorites.filter((fav) => fav.template && !fav.template.isDeleted).map((fav) => transformTemplateToMediaItem(fav.template!)) newItems = data.favorites.filter((fav: GetUserFavoritesResponse['favorites'][number]) => fav.template && !fav.template.isDeleted).map((fav: GetUserFavoritesResponse['favorites'][number]) => transformTemplateToMediaItem(fav.template!))
} else if (activeTab === 'new') { } else if (activeTab === 'new') {
if (isAuthenticated) { if (isAuthenticated) {
const { data, error } = await loadTemplates({ limit, page: 1, sortBy: 'createdAt', sortOrder: 'desc' }) const { data, error } = await loadTemplates({ limit, page: 1, sortBy: 'createdAt', sortOrder: 'desc' })
@ -450,7 +451,7 @@ export default function Sync() {
setHasMore(false) setHasMore(false)
return return
} }
newItems = data.favorites.filter((fav) => fav.template && !fav.template.isDeleted).map((fav) => transformTemplateToMediaItem(fav.template!)) newItems = data.favorites.filter((fav: GetUserFavoritesResponse['favorites'][number]) => fav.template && !fav.template.isDeleted).map((fav: GetUserFavoritesResponse['favorites'][number]) => transformTemplateToMediaItem(fav.template!))
} else if (activeTab === 'new') { } else if (activeTab === 'new') {
if (!isAuthenticated) { if (!isAuthenticated) {
setHasMore(false) setHasMore(false)

View File

@ -19,7 +19,7 @@ export default function MessageScreen() {
const { load, loading, error, data } = useActivities() const { load, loading, error, data } = useActivities()
useEffect(() => { useEffect(() => {
load({ isActive: true }) load({ page: 1, limit: 20, orderBy: 'createdAt', order: 'desc' })
}, []) }, [])
const activities = data?.activities || [] const activities = data?.activities || []

View File

@ -147,7 +147,7 @@ export default function GenerateVideoScreen() {
const { generation, error: createError } = await createGeneration({ const { generation, error: createError } = await createGeneration({
templateId: String(templateData.id), templateId: String(templateData.id),
type: 'video', type: 'VIDEO',
resultUrl: videoUrls, resultUrl: videoUrls,
originalUrl: uploadedImageUrl, originalUrl: uploadedImageUrl,
status: 'completed', status: 'completed',

View File

@ -98,7 +98,7 @@ export default function GenerationRecordScreen() {
const { generation: newGeneration, error: createError } = await createGeneration({ const { generation: newGeneration, error: createError } = await createGeneration({
templateId: generation.templateId, templateId: generation.templateId,
type: 'video', type: 'VIDEO',
resultUrl: videoUrls, resultUrl: videoUrls,
originalUrl: generation.originalUrl || '', originalUrl: generation.originalUrl || '',
status: 'completed', status: 'completed',

View File

@ -44,7 +44,7 @@ export const useTemplateInteraction = () => {
const checkLiked = useCallback(async (templateId: string) => { const checkLiked = useCallback(async (templateId: string) => {
const templateSocial = root.get(TemplateSocialController) const templateSocial = root.get(TemplateSocialController)
const { data, error } = await useError(async () => await templateSocial.checkLiked({ query: { templateId } })) const { data, error } = await useError(async () => await templateSocial.checkLiked({ templateId }))
if (error) { if (error) {
return { liked: false, error } return { liked: false, error }
@ -89,7 +89,7 @@ export const useTemplateInteraction = () => {
const checkFavorited = useCallback(async (templateId: string) => { const checkFavorited = useCallback(async (templateId: string) => {
const templateSocial = root.get(TemplateSocialController) const templateSocial = root.get(TemplateSocialController)
const { data, error } = await useError(async () => await templateSocial.checkFavorited({ query: { templateId } })) const { data, error } = await useError(async () => await templateSocial.checkFavorited({ templateId }))
if (error) { if (error) {
return { favorited: false, error } return { favorited: false, error }

View File

@ -22,7 +22,14 @@ export const useCategories = () => {
try { try {
setLoading(true) setLoading(true)
const category = root.get(CategoryController) const category = root.get(CategoryController)
const { data, error } = await useError(async () => await category.list({ ...params, ownerId: OWNER_ID })) const { data, error } = await useError(async () => await category.list({
page: params?.page || 1,
limit: params?.limit || 20,
orderBy: 'createdAt',
order: 'desc',
...params,
ownerId: OWNER_ID
}))
if (error) { if (error) {
setError(error) setError(error)

View File

@ -19,11 +19,9 @@ export const useFavoriteTemplates = () => {
setError(null) setError(null)
const templateSocial = root.get(TemplateSocialController) const templateSocial = root.get(TemplateSocialController)
const { data, error } = await useError(async () => await templateSocial.favorites({ const { data, error } = await useError(async () => await templateSocial.getUserFavorites({
query: { page: params?.page || 1,
page: params?.page?.toString() || '1', limit: params?.limit || 20
limit: params?.limit?.toString() || '20'
}
})) }))
if (error) { if (error) {

View File

@ -1,9 +1,12 @@
import { ApiError } from "@/lib/types" import { ApiError } from "@/lib/types"
import { useState, useCallback } from "react" import { useState, useCallback } from "react"
import { root } from '@repo/core' import { root } from '@repo/core'
import { RecommendedTemplateController, ListPublicRecommendedTemplatesResult } from "@repo/sdk" import { RecommendedTemplateController } from "@repo/sdk"
import { useError } from "./use-error" import { useError } from "./use-error"
type ApiListResult = Awaited<ReturnType<RecommendedTemplateController['listPublic']>>
type ListPublicRecommendedTemplatesResult = NonNullable<ApiListResult>
interface UsePublicTemplatesParams { interface UsePublicTemplatesParams {
limit?: number limit?: number
sortBy?: 'sortOrder' | 'likeCount' | 'viewCount' | 'createdAt' | 'updatedAt' sortBy?: 'sortOrder' | 'likeCount' | 'viewCount' | 'createdAt' | 'updatedAt'
@ -21,7 +24,9 @@ export const usePublicTemplates = () => {
const recommendedTemplate = root.get(RecommendedTemplateController) const recommendedTemplate = root.get(RecommendedTemplateController)
const { data, error } = await useError(async () => await recommendedTemplate.listPublic({ const { data, error } = await useError(async () => await recommendedTemplate.listPublic({
limit: params?.limit || 20 limit: params?.limit || 20,
sortBy: params?.sortBy || 'sortOrder',
sortOrder: params?.sortOrder || 'desc'
})) }))
if (error) { if (error) {

View File

@ -25,7 +25,9 @@ export const useRecommendedTemplates = () => {
const recommendedTemplate = root.get(RecommendedTemplateController) const recommendedTemplate = root.get(RecommendedTemplateController)
const { data, error } = await useError(async () => await recommendedTemplate.listPublic({ const { data, error } = await useError(async () => await recommendedTemplate.listPublic({
limit: params?.limit || 20 limit: params?.limit || 20,
sortBy: 'sortOrder',
sortOrder: 'desc'
})) }))
if (error) { if (error) {

View File

@ -19,7 +19,14 @@ export const useTags = () => {
try { try {
setLoading(true) setLoading(true)
const tag = root.get(TagController) const tag = root.get(TagController)
const { data, error } = await useError(async () => await tag.list({ ...params, ownerId: OWNER_ID })) const { data, error } = await useError(async () => await tag.list({
page: params?.page || 1,
limit: params?.limit || 20,
orderBy: 'createdAt',
order: 'desc',
...params,
ownerId: OWNER_ID
}))
if (error) { if (error) {
setError(error) setError(error)

View File

@ -18,7 +18,7 @@ export const useTemplateDetail = () => {
setError(null) setError(null)
const template = root.get(TemplateController) const template = root.get(TemplateController)
const { data, error } = await useError(async () => await template.get({ query: params })) const { data, error } = await useError(async () => await template.get(params.id))
if (error) { if (error) {
setError(error) setError(error)

View File

@ -19,7 +19,7 @@ export const useTemplateGenerationDetail = () => {
setError(null) setError(null)
const templateGeneration = root.get(TemplateGenerationController) const templateGeneration = root.get(TemplateGenerationController)
const { data, error } = await useError(async () => await templateGeneration.get({ query: params })) const { data, error } = await useError(async () => await templateGeneration.get(params.id))
if (error) { if (error) {
setError(error) setError(error)

View File

@ -27,7 +27,11 @@ export const useTemplateGenerations = () => {
setError(null) setError(null)
const templateGeneration = root.get(TemplateGenerationController) const templateGeneration = root.get(TemplateGenerationController)
const { data, error } = await useError(async () => await templateGeneration.list(params || {})) const { data, error } = await useError(async () => await templateGeneration.list({
page: params?.page || 1,
limit: params?.limit || 20,
...params
}))
if (error) { if (error) {
setError(error) setError(error)

View File

@ -25,7 +25,14 @@ export const useTemplates = () => {
setError(null) setError(null)
const template = root.get(TemplateController) const template = root.get(TemplateController)
const { data, error } = await useError(async () => await template.list({ ...params, ownerId: OWNER_ID })) const { data, error } = await useError(async () => await template.list({
page: params?.page || 1,
limit: params?.limit || 20,
sortBy: params?.sortBy || 'createdAt',
sortOrder: params?.sortOrder || 'desc',
...params,
ownerId: OWNER_ID
}))
if (error) { if (error) {
setError(error) setError(error)
setLoading(false) setLoading(false)

15
storage.native.ts Normal file
View File

@ -0,0 +1,15 @@
import * as SecureStore from "expo-secure-store";
export const storage = {
async getItem(key: string): Promise<string | null> {
return await SecureStore.getItemAsync(key);
},
async setItem(key: string, value: string): Promise<void> {
await SecureStore.setItemAsync(key, value);
},
async removeItem(key: string): Promise<void> {
await SecureStore.deleteItemAsync(key);
},
};

16
storage.ts Normal file
View File

@ -0,0 +1,16 @@
export const storage = {
async getItem(key: string): Promise<string | null> {
if (typeof window === "undefined") return null;
return window.localStorage.getItem(key);
},
async setItem(key: string, value: string): Promise<void> {
if (typeof window === "undefined") return;
window.localStorage.setItem(key, value);
},
async removeItem(key: string): Promise<void> {
if (typeof window === "undefined") return;
window.localStorage.removeItem(key);
},
};

View File

@ -4,10 +4,11 @@
"strict": true, "strict": true,
"jsx": "react-native", "jsx": "react-native",
"baseUrl": ".", "baseUrl": ".",
"lib": ["ES2020", "DOM"],
"paths": { "paths": {
"@/*": ["./*"] "@/*": ["./*"]
} }
}, },
"include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts", "nativewind-env.d.ts"], "include": ["**/*.ts", "**/*.tsx", ".expo/types/**/*.ts", "expo-env.d.ts", "nativewind-env.d.ts"],
"exclude": ["scripts/**/*"] "exclude": ["scripts/**/*", "storage.ts"]
} }