xref: /MusicFree/src/pages/permissions/index.tsx (revision b72437776165146f05624469023a64a2365044b4)
1import React, {useEffect, useRef, useState} from 'react';
2import {AppState, StyleSheet} from 'react-native';
3import rpx from '@/utils/rpx';
4import AppBar from '@/components/base/appBar';
5import VerticalSafeAreaView from '@/components/base/verticalSafeAreaView';
6import globalStyle from '@/constants/globalStyle';
7import StatusBar from '@/components/base/statusBar';
8import ThemeText from '@/components/base/themeText';
9import ListItem from '@/components/base/listItem';
10import ThemeSwitch from '@/components/base/switch';
11import LyricUtil from '@/native/lyricUtil';
12import NativeUtils from '@/native/utils';
13
14type IPermissionTypes = 'floatingWindow' | 'fileStorage';
15
16export default function Permissions() {
17    const appState = useRef(AppState.currentState);
18    const [permissions, setPermissions] = useState<
19        Record<IPermissionTypes, boolean>
20    >({
21        floatingWindow: false,
22        fileStorage: false,
23        // background: false,
24    });
25
26    async function checkPermission(type?: IPermissionTypes) {
27        let newPermission = {
28            ...permissions,
29        };
30        if (!type || type === 'floatingWindow') {
31            const hasPermission = await LyricUtil.checkSystemAlertPermission();
32            newPermission.floatingWindow = hasPermission;
33        }
34        if (!type || type === 'fileStorage') {
35            const hasPermission = await NativeUtils.checkStoragePermission();
36            console.log('HAS', hasPermission);
37            newPermission.fileStorage = hasPermission;
38        }
39        // if (!type || type === 'background') {
40
41        // }
42
43        setPermissions(newPermission);
44    }
45
46    useEffect(() => {
47        checkPermission();
48        const subscription = AppState.addEventListener(
49            'change',
50            nextAppState => {
51                if (
52                    appState.current.match(/inactive|background/) &&
53                    nextAppState === 'active'
54                ) {
55                    checkPermission();
56                }
57
58                appState.current = nextAppState;
59            },
60        );
61
62        return () => {
63            subscription.remove();
64        };
65    }, []);
66
67    return (
68        <VerticalSafeAreaView style={globalStyle.fwflex1}>
69            <StatusBar />
70            <AppBar>权限管理</AppBar>
71            <ThemeText style={styles.description}>
72                此处列出了本 APP
73                需要的所有权限,你可以从这里开启或关闭某些权限。
74            </ThemeText>
75            <ListItem
76                withHorizontalPadding
77                heightType="big"
78                onPress={() => {
79                    LyricUtil.requestSystemAlertPermission();
80                }}>
81                <ListItem.Content
82                    title="悬浮窗权限"
83                    description="用以展示桌面歌词"
84                />
85                <ThemeSwitch value={permissions.floatingWindow} />
86            </ListItem>
87            <ListItem
88                withHorizontalPadding
89                heightType="big"
90                onPress={() => {
91                    NativeUtils.requestStoragePermission();
92                }}>
93                <ListItem.Content
94                    title="文件读写权限"
95                    description="用以下载歌曲、缓存数据"
96                />
97                <ThemeSwitch value={permissions.fileStorage} />
98            </ListItem>
99            {/* <ListItem withHorizontalPadding heightType="big">
100                <ListItem.Content
101                    title="后台运行"
102                    description="用以在后台播放音乐"></ListItem.Content>
103                <ThemeSwitch value={permissions.background}></ThemeSwitch>
104            </ListItem> */}
105        </VerticalSafeAreaView>
106    );
107}
108
109const styles = StyleSheet.create({
110    description: {
111        width: '100%',
112        paddingHorizontal: rpx(24),
113        marginVertical: rpx(36),
114    },
115});
116