This commit is contained in:
oneao committed 2025-12-03 17:31:28 +08:00
1 parent e81f605999
commit cf9b01e633
26 files changed
+860 -935

No files matched your search

@@ -13,6 +13,7 @@ import EmptyState from '@/components/common/EmptyStatus'
import { GluestackUIProvider } from '@/components/ui/gluestack-ui-provider'
import { useMoneyCategoryStore } from '@/store/moneyCategory'
import { useNavStore } from '@/store/navigation'
import { useSpaceStore } from '@/store/space'
import { useUserStore } from '@/store/user'
import { ToastProviderWrapper } from '@/utils/toast'
import '@/styles/global.css'
@@ -43,9 +44,11 @@ export function ErrorBoundary({ error, retry }: ErrorBoundaryProps) {
export default function RootLayout() {
const router = useRouter()
const userStore = useUserStore()
const moneyCategoryStore = useMoneyCategoryStore()
const pathname = usePathname()
const userStore = useUserStore()
const spaceStore = useSpaceStore()
const moneyCategoryStore = useMoneyCategoryStore()
const navStore = useNavStore()
const [fontsLoaded] = useFonts({
@@ -60,14 +63,15 @@ export default function RootLayout() {
if (!fontsLoaded)
return
// 初始化分类
moneyCategoryStore.init()
// 登录跳转
if (!userStore.isLoggedIn()) {
navStore.navigateToAuth()
}
// 如果登录的话,就初始化下
moneyCategoryStore.init()
spaceStore.init()
// 隐藏 splash
SplashScreen.hideAsync()
}, [fontsLoaded, userStore, moneyCategoryStore, router])
@@ -1,15 +1,22 @@
import { useState } from 'react'
import { useEffect, useState } from 'react'
import { View } from 'react-native'
import CustomHeader from '@/components/custom/Header'
import { useSpaceStore } from '@/store/space'
import JoinSpace from './components/JoinSpace'
import SpaceHome from './components/SpaceHome'
import SpaceInviteAndMembers from './components/SpaceInviteAndMembers'
import StepFade from './components/StepFade'
export default function PagerWithTab() {
const spaceStore = useSpaceStore()
const [step, setStep] = useState<'join' | 'invite' | 'home'>('home')
useEffect(() => {
spaceStore.init()
}, [])
return (
<View className="flex-1">
<CustomHeader title="共享空间" />
@@ -41,7 +41,6 @@ const Button: React.FC<CustomButtonProps> = ({
}) => {
const isDisabled = disabled || loading
const hasChildren = !!children
console.log(hasChildren)
const renderLeftIcon = () => {
if (loading)
return <ButtonSpinner color="#fff" className={hasChildren ? 'mr-2' : ''} />
@@ -0,0 +1,12 @@
import type { CreateSpaceParams, CreateSpaceResult, DissolveSpaceParams, DissolveSpaceResult } from '@/types/space/space'
import alovaInstance from '../../index'
const API_PREFIX = '/space'
export function createSpaceApi(params: CreateSpaceParams) {
return alovaInstance.Post<ResponseData<CreateSpaceResult>>(`${API_PREFIX}/create`, params)
}
export function dissolveSpaceApi(params: DissolveSpaceParams) {
return alovaInstance.Post<ResponseData<DissolveSpaceResult>>(`${API_PREFIX}/dissolve`, params)
}
@@ -0,0 +1,41 @@
import type {
ExitSpaceParams,
ExitSpaceResult,
GetUserSpaceParams,
GetUserSpaceResult,
JoinSpaceParams,
JoinSpaceResult,
ListSpaceUsersParams,
ListSpaceUsersResult,
RemoveSpaceUserParams,
RemoveSpaceUserResult,
UpdateSpaceUserRoleParams,
UpdateSpaceUserRoleResult,
} from '@/types/space/spaceUser'
import alovaInstance from '../../index'
const API_PREFIX = '/space/user'
export function getUserSpaceApi(params: GetUserSpaceParams) {
return alovaInstance.Get<ResponseData<GetUserSpaceResult | null>>(`${API_PREFIX}/get`, params)
}
export function exitSpaceApi(params: ExitSpaceParams) {
return alovaInstance.Post<ResponseData<ExitSpaceResult>>(`${API_PREFIX}/exit`, params)
}
export function joinSpaceApi(params: JoinSpaceParams) {
return alovaInstance.Post<ResponseData<JoinSpaceResult>>(`${API_PREFIX}/join`, params)
}
export function listSpaceUsersApi(params: ListSpaceUsersParams) {
return alovaInstance.Post<ResponseData<ListSpaceUsersResult>>(`${API_PREFIX}/list`, params)
}
export function removeSpaceUserApi(params: RemoveSpaceUserParams) {
return alovaInstance.Post<ResponseData<RemoveSpaceUserResult>>(`${API_PREFIX}/remove`, params)
}
export function updateSpaceUserRoleApi(params: UpdateSpaceUserRoleParams) {
return alovaInstance.Post<ResponseData<UpdateSpaceUserRoleResult>>(`${API_PREFIX}/updateRole`, params)
}
@@ -3,7 +3,6 @@ import type { AxiosError } from 'axios'
import type { RefreshTokenResult } from '@/types/auth'
import { axiosRequestAdapter } from '@alova/adapter-axios'
import { createAlova } from 'alova'
import { router } from 'expo-router'
import { useNavStore } from '@/store/navigation'
import { useUserStore } from '@/store/user'
import { toast } from '@/utils/toast'
@@ -35,12 +35,6 @@ export const useMoneyCategoryStore = create<MoneyCategoryStore>()(
set({ categories: get().categories.filter(c => c.id !== id) }),
init: async () => {
const local = get().categories
if (local && local.length > 0) {
return
}
try {
await queryMoneyCategoryApi().then((res) => {
if (res.isSuccess) {
@@ -0,0 +1,23 @@
import { create } from 'zustand'
import { getUserSpaceApi } from '@/request/api/space/spaceUser'
interface SpaceState {
userSpace: UserSpace | null
setUserSpace: (space: UserSpace | null) => void
init: () => Promise<void>
}
export const useSpaceStore = create<SpaceState>(set => ({
userSpace: null,
setUserSpace: space => set({ userSpace: space }),
init: async () => {
try {
const res = await getUserSpaceApi({})
set({ userSpace: res.isSuccess ? res.data : null })
}
catch (err) {
set({ userSpace: null })
console.error(err)
}
},
}))
+9 -1
View File
@@ -8,16 +8,24 @@ interface UserState {
setUserInfo: (userInfo: UserInfo | null) => void
logout: () => void
isLoggedIn: () => boolean
userSpace: UserSpace | null
setUserSpace: (userSpace: UserSpace | null) => void
}
const useUserStore = create<UserState>()(
persist(
(set, get) => ({
userInfo: null,
userSpace: null,
setUserInfo: userInfo => set({ userInfo }),
setUserSpace: userSpace => set({ userSpace }),
logout: () => {
set({ userInfo: null })
set({ userInfo: null, userSpace: null })
},
isLoggedIn: () => !!get().userInfo?.token,
}),
{
+6
View File
@@ -19,4 +19,10 @@ declare global {
refreshToken?: string
rememberMe?: boolean
}
interface UserSpace {
id: number
name: string
invite_code: string
}
}
@@ -0,0 +1,17 @@
// 创建空间
export interface CreateSpaceParams {
}
export interface CreateSpaceResult {
id: number
invite_code: string
}
// 解散空间
export interface DissolveSpaceParams {
}
export interface DissolveSpaceResult {
}
@@ -0,0 +1,61 @@
// 获取用户的空间
export interface GetUserSpaceParams {
}
export interface GetUserSpaceResult {
id: number
name: string
invite_code: string
}
// 退出空间
export interface ExitSpaceParams {
}
export interface ExitSpaceResult {
}
// 获取空间列表用户
export interface SpaceUser {
user_id: number
username: string
space_role: number
}
export interface ListSpaceUsersParams {
}
export interface ListSpaceUsersResult {
users: SpaceUser[]
}
// 踢出空间
export interface RemoveSpaceUserParams {
space_id: number
user_id: number
}
export interface RemoveSpaceUserResult {
}
// 更新用户权限
export interface UpdateSpaceUserRoleParams {
space_id: number
user_id: number
role: number
}
export interface UpdateSpaceUserRoleResult {
}
// 加入空间
export interface JoinSpaceParams {
invite_code: string
}
export interface JoinSpaceResult {
}