u
This commit is contained in:
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)
|
||||
}
|
||||
},
|
||||
}))
|
||||
@@ -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,
|
||||
}),
|
||||
{
|
||||
|
||||
@@ -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 {
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user