@coze-arch/cli 0.0.1-alpha.f74941 → 0.0.1-alpha.f91253

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/lib/__templates__/expo/.coze +7 -2
  2. package/lib/__templates__/expo/.cozeproj/scripts/dev_build.sh +46 -0
  3. package/lib/__templates__/expo/.cozeproj/scripts/dev_run.sh +220 -0
  4. package/lib/__templates__/expo/.cozeproj/scripts/prod_build.sh +47 -0
  5. package/lib/__templates__/expo/.cozeproj/scripts/prod_run.sh +34 -0
  6. package/lib/__templates__/expo/.cozeproj/scripts/server_dev_run.sh +45 -0
  7. package/lib/__templates__/expo/README.md +68 -7
  8. package/lib/__templates__/expo/_gitignore +1 -1
  9. package/lib/__templates__/expo/_npmrc +3 -5
  10. package/lib/__templates__/expo/client/app/_layout.tsx +14 -14
  11. package/lib/__templates__/expo/client/app/index.tsx +1 -0
  12. package/lib/__templates__/expo/client/app.config.ts +76 -0
  13. package/lib/__templates__/expo/client/components/Screen.tsx +1 -17
  14. package/lib/__templates__/expo/client/components/ThemedText.tsx +33 -0
  15. package/lib/__templates__/expo/client/components/ThemedView.tsx +38 -0
  16. package/lib/__templates__/expo/client/constants/theme.ts +117 -58
  17. package/lib/__templates__/expo/client/contexts/AuthContext.tsx +14 -107
  18. package/lib/__templates__/expo/client/declarations.d.ts +5 -0
  19. package/lib/__templates__/expo/{eslint.config.mjs → client/eslint.config.mjs} +14 -10
  20. package/lib/__templates__/expo/client/hooks/useColorScheme.ts +34 -1
  21. package/lib/__templates__/expo/client/hooks/useTheme.ts +26 -6
  22. package/lib/__templates__/expo/client/metro.config.js +121 -0
  23. package/lib/__templates__/expo/client/package.json +93 -0
  24. package/lib/__templates__/expo/client/screens/demo/index.tsx +25 -0
  25. package/lib/__templates__/expo/client/screens/demo/styles.ts +28 -0
  26. package/lib/__templates__/expo/client/scripts/install-missing-deps.js +37 -12
  27. package/lib/__templates__/expo/client/tsconfig.json +24 -0
  28. package/lib/__templates__/expo/client/utils/index.ts +23 -2
  29. package/lib/__templates__/expo/eslint-plugins/fontawesome6/index.js +9 -0
  30. package/lib/__templates__/expo/eslint-plugins/fontawesome6/names.js +2486 -0
  31. package/lib/__templates__/expo/eslint-plugins/fontawesome6/rule.js +155 -0
  32. package/lib/__templates__/expo/package.json +13 -92
  33. package/lib/__templates__/expo/pnpm-lock.yaml +675 -678
  34. package/lib/__templates__/expo/pnpm-workspace.yaml +3 -0
  35. package/lib/__templates__/expo/server/build.js +21 -0
  36. package/lib/__templates__/expo/server/package.json +32 -0
  37. package/lib/__templates__/expo/server/src/index.ts +19 -0
  38. package/lib/__templates__/expo/server/tsconfig.json +24 -0
  39. package/lib/__templates__/expo/template.config.js +2 -1
  40. package/lib/__templates__/expo/tsconfig.json +1 -24
  41. package/lib/__templates__/nextjs/.babelrc +15 -0
  42. package/lib/__templates__/nextjs/.coze +4 -3
  43. package/lib/__templates__/nextjs/README.md +341 -19
  44. package/lib/__templates__/nextjs/_npmrc +2 -1
  45. package/lib/__templates__/nextjs/components.json +21 -0
  46. package/lib/__templates__/nextjs/next.config.ts +12 -0
  47. package/lib/__templates__/nextjs/package.json +64 -2
  48. package/lib/__templates__/nextjs/pnpm-lock.yaml +8768 -1565
  49. package/lib/__templates__/nextjs/scripts/dev.sh +9 -27
  50. package/lib/__templates__/{react-rsbuild/scripts/build.sh → nextjs/scripts/prepare.sh} +0 -5
  51. package/lib/__templates__/nextjs/src/app/globals.css +124 -13
  52. package/lib/__templates__/nextjs/src/app/layout.tsx +23 -32
  53. package/lib/__templates__/nextjs/src/app/page.tsx +35 -23
  54. package/lib/__templates__/nextjs/src/components/ui/accordion.tsx +66 -0
  55. package/lib/__templates__/nextjs/src/components/ui/alert-dialog.tsx +157 -0
  56. package/lib/__templates__/nextjs/src/components/ui/alert.tsx +66 -0
  57. package/lib/__templates__/nextjs/src/components/ui/aspect-ratio.tsx +11 -0
  58. package/lib/__templates__/nextjs/src/components/ui/avatar.tsx +53 -0
  59. package/lib/__templates__/nextjs/src/components/ui/badge.tsx +46 -0
  60. package/lib/__templates__/nextjs/src/components/ui/breadcrumb.tsx +109 -0
  61. package/lib/__templates__/nextjs/src/components/ui/button-group.tsx +83 -0
  62. package/lib/__templates__/nextjs/src/components/ui/button.tsx +62 -0
  63. package/lib/__templates__/nextjs/src/components/ui/calendar.tsx +220 -0
  64. package/lib/__templates__/nextjs/src/components/ui/card.tsx +92 -0
  65. package/lib/__templates__/nextjs/src/components/ui/carousel.tsx +241 -0
  66. package/lib/__templates__/nextjs/src/components/ui/chart.tsx +357 -0
  67. package/lib/__templates__/nextjs/src/components/ui/checkbox.tsx +32 -0
  68. package/lib/__templates__/nextjs/src/components/ui/collapsible.tsx +33 -0
  69. package/lib/__templates__/nextjs/src/components/ui/command.tsx +184 -0
  70. package/lib/__templates__/nextjs/src/components/ui/context-menu.tsx +252 -0
  71. package/lib/__templates__/nextjs/src/components/ui/dialog.tsx +143 -0
  72. package/lib/__templates__/nextjs/src/components/ui/drawer.tsx +135 -0
  73. package/lib/__templates__/nextjs/src/components/ui/dropdown-menu.tsx +257 -0
  74. package/lib/__templates__/nextjs/src/components/ui/empty.tsx +104 -0
  75. package/lib/__templates__/nextjs/src/components/ui/field.tsx +248 -0
  76. package/lib/__templates__/nextjs/src/components/ui/form.tsx +167 -0
  77. package/lib/__templates__/nextjs/src/components/ui/hover-card.tsx +44 -0
  78. package/lib/__templates__/nextjs/src/components/ui/input-group.tsx +170 -0
  79. package/lib/__templates__/nextjs/src/components/ui/input-otp.tsx +77 -0
  80. package/lib/__templates__/nextjs/src/components/ui/input.tsx +21 -0
  81. package/lib/__templates__/nextjs/src/components/ui/item.tsx +193 -0
  82. package/lib/__templates__/nextjs/src/components/ui/kbd.tsx +28 -0
  83. package/lib/__templates__/nextjs/src/components/ui/label.tsx +24 -0
  84. package/lib/__templates__/nextjs/src/components/ui/menubar.tsx +276 -0
  85. package/lib/__templates__/nextjs/src/components/ui/navigation-menu.tsx +168 -0
  86. package/lib/__templates__/nextjs/src/components/ui/pagination.tsx +127 -0
  87. package/lib/__templates__/nextjs/src/components/ui/popover.tsx +48 -0
  88. package/lib/__templates__/nextjs/src/components/ui/progress.tsx +31 -0
  89. package/lib/__templates__/nextjs/src/components/ui/radio-group.tsx +45 -0
  90. package/lib/__templates__/nextjs/src/components/ui/resizable.tsx +63 -0
  91. package/lib/__templates__/nextjs/src/components/ui/scroll-area.tsx +58 -0
  92. package/lib/__templates__/nextjs/src/components/ui/select.tsx +190 -0
  93. package/lib/__templates__/nextjs/src/components/ui/separator.tsx +28 -0
  94. package/lib/__templates__/nextjs/src/components/ui/sheet.tsx +139 -0
  95. package/lib/__templates__/nextjs/src/components/ui/sidebar.tsx +724 -0
  96. package/lib/__templates__/nextjs/src/components/ui/skeleton.tsx +13 -0
  97. package/lib/__templates__/nextjs/src/components/ui/slider.tsx +63 -0
  98. package/lib/__templates__/nextjs/src/components/ui/sonner.tsx +40 -0
  99. package/lib/__templates__/nextjs/src/components/ui/spinner.tsx +16 -0
  100. package/lib/__templates__/nextjs/src/components/ui/switch.tsx +31 -0
  101. package/lib/__templates__/nextjs/src/components/ui/table.tsx +116 -0
  102. package/lib/__templates__/nextjs/src/components/ui/tabs.tsx +66 -0
  103. package/lib/__templates__/nextjs/src/components/ui/textarea.tsx +18 -0
  104. package/lib/__templates__/nextjs/src/components/ui/toggle-group.tsx +83 -0
  105. package/lib/__templates__/nextjs/src/components/ui/toggle.tsx +47 -0
  106. package/lib/__templates__/nextjs/src/components/ui/tooltip.tsx +61 -0
  107. package/lib/__templates__/nextjs/src/hooks/use-mobile.ts +19 -0
  108. package/lib/__templates__/nextjs/src/lib/utils.ts +6 -0
  109. package/lib/__templates__/nextjs/template.config.js +32 -2
  110. package/lib/__templates__/templates.json +61 -74
  111. package/lib/__templates__/vite/.coze +4 -3
  112. package/lib/__templates__/vite/README.md +204 -26
  113. package/lib/__templates__/vite/_npmrc +2 -1
  114. package/lib/__templates__/vite/eslint.config.mjs +9 -0
  115. package/lib/__templates__/vite/package.json +11 -2
  116. package/lib/__templates__/vite/pnpm-lock.yaml +3232 -243
  117. package/lib/__templates__/vite/scripts/dev.sh +7 -26
  118. package/lib/__templates__/{rsbuild/scripts/build.sh → vite/scripts/prepare.sh} +0 -5
  119. package/lib/__templates__/vite/src/main.ts +1 -2
  120. package/lib/__templates__/vite/template.config.js +41 -6
  121. package/lib/__templates__/vite/vite.config.ts +3 -3
  122. package/lib/cli.js +874 -316
  123. package/package.json +11 -4
  124. package/lib/__templates__/expo/.cozeproj/scripts/deploy_build.sh +0 -109
  125. package/lib/__templates__/expo/.cozeproj/scripts/deploy_run.sh +0 -257
  126. package/lib/__templates__/expo/app.json +0 -63
  127. package/lib/__templates__/expo/babel.config.js +0 -9
  128. package/lib/__templates__/expo/client/app/(tabs)/_layout.tsx +0 -43
  129. package/lib/__templates__/expo/client/app/(tabs)/home.tsx +0 -1
  130. package/lib/__templates__/expo/client/app/(tabs)/index.tsx +0 -7
  131. package/lib/__templates__/expo/client/app/+not-found.tsx +0 -79
  132. package/lib/__templates__/expo/client/index.js +0 -11
  133. package/lib/__templates__/expo/client/screens/home/index.tsx +0 -54
  134. package/lib/__templates__/expo/client/screens/home/styles.ts +0 -332
  135. package/lib/__templates__/expo/metro.config.js +0 -53
  136. package/lib/__templates__/expo/src/index.ts +0 -12
  137. package/lib/__templates__/nextjs/.vscode/settings.json +0 -121
  138. package/lib/__templates__/react-rsbuild/.coze +0 -11
  139. package/lib/__templates__/react-rsbuild/.vscode/settings.json +0 -121
  140. package/lib/__templates__/react-rsbuild/README.md +0 -61
  141. package/lib/__templates__/react-rsbuild/_gitignore +0 -97
  142. package/lib/__templates__/react-rsbuild/_npmrc +0 -22
  143. package/lib/__templates__/react-rsbuild/package.json +0 -31
  144. package/lib/__templates__/react-rsbuild/pnpm-lock.yaml +0 -997
  145. package/lib/__templates__/react-rsbuild/rsbuild.config.ts +0 -13
  146. package/lib/__templates__/react-rsbuild/scripts/dev.sh +0 -51
  147. package/lib/__templates__/react-rsbuild/scripts/start.sh +0 -15
  148. package/lib/__templates__/react-rsbuild/src/App.tsx +0 -60
  149. package/lib/__templates__/react-rsbuild/src/index.css +0 -21
  150. package/lib/__templates__/react-rsbuild/src/index.html +0 -12
  151. package/lib/__templates__/react-rsbuild/src/index.tsx +0 -16
  152. package/lib/__templates__/react-rsbuild/tailwind.config.js +0 -9
  153. package/lib/__templates__/react-rsbuild/template.config.js +0 -54
  154. package/lib/__templates__/react-rsbuild/tsconfig.json +0 -17
  155. package/lib/__templates__/rsbuild/.coze +0 -11
  156. package/lib/__templates__/rsbuild/.vscode/settings.json +0 -7
  157. package/lib/__templates__/rsbuild/README.md +0 -61
  158. package/lib/__templates__/rsbuild/_gitignore +0 -97
  159. package/lib/__templates__/rsbuild/_npmrc +0 -22
  160. package/lib/__templates__/rsbuild/package.json +0 -24
  161. package/lib/__templates__/rsbuild/pnpm-lock.yaml +0 -888
  162. package/lib/__templates__/rsbuild/rsbuild.config.ts +0 -12
  163. package/lib/__templates__/rsbuild/scripts/dev.sh +0 -51
  164. package/lib/__templates__/rsbuild/scripts/start.sh +0 -15
  165. package/lib/__templates__/rsbuild/src/index.css +0 -21
  166. package/lib/__templates__/rsbuild/src/index.html +0 -12
  167. package/lib/__templates__/rsbuild/src/index.ts +0 -5
  168. package/lib/__templates__/rsbuild/src/main.ts +0 -65
  169. package/lib/__templates__/rsbuild/tailwind.config.js +0 -9
  170. package/lib/__templates__/rsbuild/template.config.js +0 -56
  171. package/lib/__templates__/rsbuild/tsconfig.json +0 -16
  172. package/lib/__templates__/vite/.vscode/settings.json +0 -7
  173. /package/lib/__templates__/expo/{eslint-formatter-simple.mjs → client/eslint-formatter-simple.mjs} +0 -0
@@ -0,0 +1,33 @@
1
+ import React from 'react';
2
+ import { Text, TextProps, TextStyle } from 'react-native';
3
+ import { useTheme } from '@/hooks/useTheme';
4
+ import { Typography } from '@/constants/theme';
5
+
6
+ type TypographyVariant = keyof typeof Typography;
7
+
8
+ interface ThemedTextProps extends TextProps {
9
+ variant?: TypographyVariant;
10
+ color?: string;
11
+ }
12
+
13
+ export function ThemedText({
14
+ variant = 'body',
15
+ color,
16
+ style,
17
+ children,
18
+ ...props
19
+ }: ThemedTextProps) {
20
+ const { theme } = useTheme();
21
+ const typographyStyle = Typography[variant];
22
+
23
+ const textStyle: TextStyle = {
24
+ ...typographyStyle,
25
+ color: color ?? theme.textPrimary,
26
+ };
27
+
28
+ return (
29
+ <Text style={[textStyle, style]} {...props}>
30
+ {children}
31
+ </Text>
32
+ );
33
+ }
@@ -0,0 +1,38 @@
1
+ import React from 'react';
2
+ import { View, ViewProps, ViewStyle } from 'react-native';
3
+ import { useTheme } from '@/hooks/useTheme';
4
+
5
+ type BackgroundLevel = 'root' | 'default' | 'secondary' | 'tertiary';
6
+
7
+ interface ThemedViewProps extends ViewProps {
8
+ level?: BackgroundLevel;
9
+ backgroundColor?: string;
10
+ }
11
+
12
+ const backgroundMap: Record<BackgroundLevel, string> = {
13
+ root: 'backgroundRoot',
14
+ default: 'backgroundDefault',
15
+ secondary: 'backgroundSecondary',
16
+ tertiary: 'backgroundTertiary',
17
+ };
18
+
19
+ export function ThemedView({
20
+ level = 'root',
21
+ backgroundColor,
22
+ style,
23
+ children,
24
+ ...props
25
+ }: ThemedViewProps) {
26
+ const { theme } = useTheme();
27
+ const bgColor = backgroundColor ?? (theme as any)[backgroundMap[level]];
28
+
29
+ const viewStyle: ViewStyle = {
30
+ backgroundColor: bgColor,
31
+ };
32
+
33
+ return (
34
+ <View style={[viewStyle, style]} {...props}>
35
+ {children}
36
+ </View>
37
+ );
38
+ }
@@ -1,30 +1,35 @@
1
- import { Platform } from "react-native";
2
-
3
- const tintColorLight = "#007AFF";
4
- const tintColorDark = "#0A84FF";
5
-
6
1
  export const Colors = {
7
2
  light: {
8
- text: "#11181C",
9
- buttonText: "#FFFFFF",
10
- tabIconDefault: "#687076",
11
- tabIconSelected: tintColorLight,
12
- link: "#007AFF",
13
- backgroundRoot: "#FFFFFF", // Elevation 0
14
- backgroundDefault: "#F2F2F2", // Elevation 1
15
- backgroundSecondary: "#E6E6E6", // Elevation 2
16
- backgroundTertiary: "#D9D9D9", // Elevation 3
3
+ textPrimary: "#1C1917",
4
+ textSecondary: "#78716c",
5
+ textMuted: "#9CA3AF",
6
+ primary: "#4F46E5", // Indigo-600 - 品牌主色,代表科技与智能
7
+ accent: "#8B5CF6", // Violet-500 - 辅助色,代表创造力
8
+ success: "#10B981", // Emerald-500
9
+ error: "#EF4444",
10
+ backgroundRoot: "#FAFAFA",
11
+ backgroundDefault: "#FFFFFF",
12
+ backgroundTertiary: "#F9FAFB", // 更浅的背景色,用于去线留白
13
+ buttonPrimaryText: "#FFFFFF",
14
+ tabIconSelected: "#4F46E5",
15
+ border: "#E5E7EB",
16
+ borderLight: "#F3F4F6",
17
17
  },
18
18
  dark: {
19
- text: "#ECEDEE",
20
- buttonText: "#FFFFFF",
21
- tabIconDefault: "#9BA1A6",
22
- tabIconSelected: tintColorDark,
23
- link: "#0A84FF",
24
- backgroundRoot: "#1F2123", // Elevation 0
25
- backgroundDefault: "#2A2C2E", // Elevation 1
26
- backgroundSecondary: "#353739", // Elevation 2
27
- backgroundTertiary: "#404244", // Elevation 3
19
+ textPrimary: "#FAFAF9",
20
+ textSecondary: "#A8A29E",
21
+ textMuted: "#6F767E",
22
+ primary: "#818CF8", // Indigo-400 - 暗色模式品牌主色
23
+ accent: "#A78BFA", // Violet-400
24
+ success: "#34D399",
25
+ error: "#F87171",
26
+ backgroundRoot: "#09090B", // 更深的背景色
27
+ backgroundDefault: "#1C1C1E",
28
+ backgroundTertiary: "#1F1F22", // 暗色模式去线留白背景
29
+ buttonPrimaryText: "#09090B",
30
+ tabIconSelected: "#818CF8",
31
+ border: "#3F3F46",
32
+ borderLight: "#27272A",
28
33
  },
29
34
  };
30
35
 
@@ -38,22 +43,39 @@ export const Spacing = {
38
43
  "3xl": 32,
39
44
  "4xl": 40,
40
45
  "5xl": 48,
41
- inputHeight: 48,
42
- buttonHeight: 52,
46
+ "6xl": 64,
43
47
  };
44
48
 
45
49
  export const BorderRadius = {
46
- xs: 8,
47
- sm: 12,
48
- md: 18,
49
- lg: 24,
50
- xl: 30,
51
- "2xl": 40,
52
- "3xl": 50,
50
+ xs: 4,
51
+ sm: 8,
52
+ md: 12,
53
+ lg: 16,
54
+ xl: 20,
55
+ "2xl": 24,
56
+ "3xl": 28,
57
+ "4xl": 32,
53
58
  full: 9999,
54
59
  };
55
60
 
56
61
  export const Typography = {
62
+ display: {
63
+ fontSize: 112,
64
+ lineHeight: 112,
65
+ fontWeight: "200" as const,
66
+ letterSpacing: -4,
67
+ },
68
+ displayLarge: {
69
+ fontSize: 112,
70
+ lineHeight: 112,
71
+ fontWeight: "200" as const,
72
+ letterSpacing: -2,
73
+ },
74
+ displayMedium: {
75
+ fontSize: 48,
76
+ lineHeight: 56,
77
+ fontWeight: "200" as const,
78
+ },
57
79
  h1: {
58
80
  fontSize: 32,
59
81
  lineHeight: 40,
@@ -67,52 +89,89 @@ export const Typography = {
67
89
  h3: {
68
90
  fontSize: 24,
69
91
  lineHeight: 32,
70
- fontWeight: "600" as const,
92
+ fontWeight: "300" as const,
71
93
  },
72
94
  h4: {
73
95
  fontSize: 20,
74
96
  lineHeight: 28,
75
97
  fontWeight: "600" as const,
76
98
  },
99
+ title: {
100
+ fontSize: 18,
101
+ lineHeight: 24,
102
+ fontWeight: "700" as const,
103
+ },
77
104
  body: {
78
105
  fontSize: 16,
79
106
  lineHeight: 24,
80
107
  fontWeight: "400" as const,
81
108
  },
109
+ bodyMedium: {
110
+ fontSize: 16,
111
+ lineHeight: 24,
112
+ fontWeight: "500" as const,
113
+ },
82
114
  small: {
83
115
  fontSize: 14,
84
116
  lineHeight: 20,
85
117
  fontWeight: "400" as const,
86
118
  },
119
+ smallMedium: {
120
+ fontSize: 14,
121
+ lineHeight: 20,
122
+ fontWeight: "500" as const,
123
+ },
124
+ caption: {
125
+ fontSize: 12,
126
+ lineHeight: 16,
127
+ fontWeight: "400" as const,
128
+ },
129
+ captionMedium: {
130
+ fontSize: 12,
131
+ lineHeight: 16,
132
+ fontWeight: "500" as const,
133
+ },
134
+ label: {
135
+ fontSize: 14,
136
+ lineHeight: 20,
137
+ fontWeight: "500" as const,
138
+ letterSpacing: 2,
139
+ textTransform: "uppercase" as const,
140
+ },
141
+ labelSmall: {
142
+ fontSize: 12,
143
+ lineHeight: 16,
144
+ fontWeight: "500" as const,
145
+ letterSpacing: 1,
146
+ textTransform: "uppercase" as const,
147
+ },
148
+ labelTitle: {
149
+ fontSize: 14,
150
+ lineHeight: 20,
151
+ fontWeight: "700" as const,
152
+ letterSpacing: 2,
153
+ textTransform: "uppercase" as const,
154
+ },
87
155
  link: {
88
156
  fontSize: 16,
89
157
  lineHeight: 24,
90
158
  fontWeight: "400" as const,
91
159
  },
160
+ stat: {
161
+ fontSize: 30,
162
+ lineHeight: 36,
163
+ fontWeight: "300" as const,
164
+ },
165
+ tiny: {
166
+ fontSize: 10,
167
+ lineHeight: 14,
168
+ fontWeight: "400" as const,
169
+ },
170
+ navLabel: {
171
+ fontSize: 10,
172
+ lineHeight: 14,
173
+ fontWeight: "500" as const,
174
+ },
92
175
  };
93
176
 
94
- export const Fonts = Platform.select({
95
- ios: {
96
- /** iOS `UIFontDescriptorSystemDesignDefault` */
97
- sans: "system-ui",
98
- /** iOS `UIFontDescriptorSystemDesignSerif` */
99
- serif: "ui-serif",
100
- /** iOS `UIFontDescriptorSystemDesignRounded` */
101
- rounded: "ui-rounded",
102
- /** iOS `UIFontDescriptorSystemDesignMonospaced` */
103
- mono: "ui-monospace",
104
- },
105
- default: {
106
- sans: "normal",
107
- serif: "serif",
108
- rounded: "normal",
109
- mono: "monospace",
110
- },
111
- web: {
112
- sans: "system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif",
113
- serif: "Georgia, 'Times New Roman', serif",
114
- rounded:
115
- "'SF Pro Rounded', 'Hiragino Maru Gothic ProN', Meiryo, 'MS PGothic', sans-serif",
116
- mono: "SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace",
117
- },
118
- });
177
+ export type Theme = typeof Colors.light;
@@ -4,19 +4,15 @@
4
4
  *
5
5
  * 基于固定的 API 接口实现,可复用到其他项目
6
6
  * 其他项目使用时,只需修改 @api 的导入路径指向项目的 api 模块
7
+ *
8
+ * 注意:
9
+ * - 如果需要登录/鉴权场景,请扩展本文件,完善 login/logout、token 管理、用户信息获取与刷新等逻辑
10
+ * - 将示例中的占位实现替换为项目实际的接口调用与状态管理
7
11
  */
8
- import React, {
9
- createContext,
10
- useContext,
11
- useState,
12
- useEffect,
13
- ReactNode,
14
- } from "react";
15
- import AsyncStorage from "@react-native-async-storage/async-storage";
16
- //import { UserOut, UsersService, AuthenticationService } from "@api";
12
+ import React, { createContext, useContext, ReactNode } from "react";
17
13
 
18
14
  interface UserOut {
19
-
15
+
20
16
  }
21
17
 
22
18
  interface AuthContextType {
@@ -31,105 +27,16 @@ interface AuthContextType {
31
27
 
32
28
  const AuthContext = createContext<AuthContextType | undefined>(undefined);
33
29
 
34
- export const AuthProvider: React.FC<{ children: ReactNode }> = ({
35
- children,
36
- }) => {
37
- const [user, setUser] = useState<UserOut | null>(null);
38
- const [token, setToken] = useState<string | null>(null);
39
- const [isLoading, setIsLoading] = useState(true);
40
-
41
- useEffect(() => {
42
- loadAuthData();
43
- }, []);
44
-
45
- const loadAuthData = async () => {
46
- try {
47
- const results = await AsyncStorage.multiGet(["access_token", "user_data"]);
48
- const storedToken = results?.[0]?.[1] ?? null;
49
- const storedUser = results?.[1]?.[1] ?? null;
50
-
51
- if (!storedToken) {
52
- setToken(null);
53
- setUser(null);
54
- await AsyncStorage.multiRemove(["access_token", "user_data"]);
55
- return;
56
- }
57
-
58
- if (storedToken && storedUser) {
59
- setToken(storedToken);
60
- setUser(JSON.parse(storedUser));
61
- } else if (storedToken && !storedUser) {
62
- // 若仅有 token,主动拉取当前用户信息
63
- setToken(storedToken);
64
- try {
65
- // const me = await UsersService.getCurrentUserApiV1UsersMeGet();
66
- //if (me?.success && me.data) {
67
- // setUser(me.data);
68
- // await AsyncStorage.setItem("user_data", JSON.stringify(me.data));
69
- //}
70
- } catch (e) {
71
- // 拉取失败则保持未登录状态
72
- console.error("Failed to fetch current user with stored token:", e);
73
- }
74
- }
75
- } catch (error) {
76
- console.error("Failed to load auth data:", error);
77
- } finally {
78
- setIsLoading(false);
79
- }
80
- };
81
-
82
- const login = async (newToken: string) => {
83
- try {
84
- setToken(newToken);
85
- // 统一写入 access_token,供 OpenAPI 读取并自动携带
86
- await AsyncStorage.setItem("access_token", newToken);
87
- // 登录后拉取当前用户并缓存
88
- try {
89
- const me = await UsersService.getCurrentUserApiV1UsersMeGet();
90
- if (me?.success && me.data) {
91
- setUser(me.data);
92
- await AsyncStorage.setItem("user_data", JSON.stringify(me.data));
93
- }
94
- } catch (e) {
95
- console.error("Fetch current user after login failed:", e);
96
- }
97
- } catch (error) {
98
- console.error("Login failed:", error);
99
- throw error;
100
- }
101
- };
102
-
103
- const logout = async () => {
104
- try {
105
- // await AuthenticationService.logoutApiV1AuthLogoutPost(true);
106
- } catch(error) {
107
- console.warn('Logout failed:', error);
108
- }
109
- // remove token
110
- setToken(null);
111
- setUser(null);
112
- await AsyncStorage.multiRemove(["auth_token", "access_token", "user_data"]);
113
- };
114
-
115
- const updateUser = (userData: Partial<UserOut>) => {
116
- if (user) {
117
- const updatedUser = { ...user, ...userData };
118
- setUser(updatedUser);
119
- AsyncStorage.setItem("user_data", JSON.stringify(updatedUser));
120
- }
121
- };
122
-
30
+ export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => {
123
31
  const value: AuthContextType = {
124
- user,
125
- token,
126
- isAuthenticated: !!token && !!user,
127
- isLoading,
128
- login,
129
- logout,
130
- updateUser,
32
+ user: null,
33
+ token: null,
34
+ isAuthenticated: false,
35
+ isLoading: false,
36
+ login: async (token: string) => {},
37
+ logout: async () => {},
38
+ updateUser: () => {},
131
39
  };
132
-
133
40
  return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>;
134
41
  };
135
42
 
@@ -0,0 +1,5 @@
1
+ // declarations.d.ts
2
+
3
+ declare module 'expo-file-system/legacy' {
4
+ export * from 'expo-file-system';
5
+ }
@@ -1,10 +1,11 @@
1
- import js from "@eslint/js";
2
- import globals from "globals";
3
- import tseslint from "typescript-eslint";
4
- import pluginReact from "eslint-plugin-react";
5
- import reactHooks from "eslint-plugin-react-hooks";
6
- import regexp from "eslint-plugin-regexp";
7
- import pluginImport from "eslint-plugin-import";
1
+ import js from '@eslint/js';
2
+ import globals from 'globals';
3
+ import tseslint from 'typescript-eslint';
4
+ import pluginReact from 'eslint-plugin-react';
5
+ import reactHooks from 'eslint-plugin-react-hooks';
6
+ import regexp from 'eslint-plugin-regexp';
7
+ import pluginImport from 'eslint-plugin-import';
8
+ import fontawesome6 from '../eslint-plugins/fontawesome6/index.js';
8
9
 
9
10
  export default [
10
11
  {
@@ -15,19 +16,20 @@ export default [
15
16
  'src/api/**', // 排除 src 下的自动生成 API
16
17
  '.expo/**', // 排除 Expo 自动生成的文件
17
18
  'tailwind.config.js', // 排除 Tailwind 配置文件
19
+ '**/*.d.ts',
18
20
  ],
19
21
  },
20
22
  regexp.configs["flat/recommended"],
21
23
  js.configs.recommended,
22
24
  ...tseslint.configs.recommended,
23
-
25
+
24
26
  // React 的推荐配置
25
27
  pluginReact.configs.flat.recommended,
26
28
  pluginReact.configs.flat['jsx-runtime'],
27
29
  reactHooks.configs.flat.recommended,
28
30
  {
29
31
  files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],
30
-
32
+
31
33
  // 语言选项:设置全局变量
32
34
  languageOptions: {
33
35
  globals: {
@@ -52,6 +54,7 @@ export default [
52
54
 
53
55
  plugins: {
54
56
  import: pluginImport,
57
+ fontawesome6,
55
58
  },
56
59
  rules: {
57
60
  // 关闭代码风格规则
@@ -70,6 +73,7 @@ export default [
70
73
  'no-prototype-builtins': 'off',
71
74
  'react/react-in-jsx-scope': 'off',
72
75
  'react/jsx-uses-react': 'off',
76
+ 'fontawesome6/valid-name': 'error',
73
77
  },
74
78
  },
75
79
 
@@ -91,7 +95,7 @@ export default [
91
95
  // 在 .js 文件中关闭 TS 规则
92
96
  '@typescript-eslint/no-require-imports': 'off',
93
97
  // 在 Node.js 文件中允许 require
94
- '@typescript-eslint/no-var-requires': 'off',
98
+ '@typescript-eslint/no-var-requires': 'off',
95
99
  'no-undef': 'off',
96
100
  },
97
101
  },
@@ -1 +1,34 @@
1
- export { useColorScheme } from "react-native";
1
+ import { useEffect, useState } from 'react';
2
+ import { ColorSchemeName, useColorScheme as useReactNativeColorScheme, Platform } from 'react-native';
3
+
4
+ export function useColorScheme() {
5
+ const systemColorScheme = useReactNativeColorScheme();
6
+ const [colorScheme, setColorScheme] = useState<ColorSchemeName>(systemColorScheme);
7
+
8
+ useEffect(() => {
9
+ setColorScheme(systemColorScheme);
10
+ }, [systemColorScheme])
11
+
12
+ useEffect(() => {
13
+ function handleMessage(e: MessageEvent<{ event: string; colorScheme: ColorSchemeName; } | undefined>) {
14
+ if (e.data?.event === 'coze.workbench.colorScheme') {
15
+ const cs = e.data.colorScheme;
16
+ if (typeof cs === 'string') {
17
+ setColorScheme(cs);
18
+ }
19
+ }
20
+ }
21
+
22
+ if (Platform.OS === 'web') {
23
+ window.addEventListener('message', handleMessage, false);
24
+ }
25
+
26
+ return () => {
27
+ if (Platform.OS === 'web') {
28
+ window.removeEventListener('message', handleMessage, false);
29
+ }
30
+ }
31
+ }, []);
32
+
33
+ return colorScheme;
34
+ }
@@ -1,13 +1,33 @@
1
- import { Colors } from "@/constants/theme";
2
- import { useColorScheme } from "@/hooks/useColorScheme";
1
+ import { Colors } from '@/constants/theme';
2
+ import { useColorScheme } from '@/hooks/useColorScheme';
3
3
 
4
- export function useTheme() {
5
- const colorScheme = useColorScheme();
6
- const isDark = colorScheme === "dark";
7
- const theme = Colors[colorScheme ?? "light"];
4
+ enum COLOR_SCHEME_CHOICE {
5
+ FOLLOW_SYSTEM = 'follow-system', // 跟随系统自动变化
6
+ DARK = 'dark', // 固定为 dark 主题,不随系统变化
7
+ LIGHT = 'light', // 固定为 light 主题,不随系统变化
8
+ };
9
+
10
+ const userPreferColorScheme: COLOR_SCHEME_CHOICE = COLOR_SCHEME_CHOICE.FOLLOW_SYSTEM;
11
+
12
+ function getTheme(colorScheme?: 'dark' | 'light' | null) {
13
+ const isDark = colorScheme === 'dark';
14
+ const theme = Colors[colorScheme ?? 'light'];
8
15
 
9
16
  return {
10
17
  theme,
11
18
  isDark,
12
19
  };
13
20
  }
21
+
22
+ function useTheme() {
23
+ const systemColorScheme = useColorScheme()
24
+ const colorScheme = userPreferColorScheme === COLOR_SCHEME_CHOICE.FOLLOW_SYSTEM ?
25
+ systemColorScheme :
26
+ userPreferColorScheme;
27
+
28
+ return getTheme(colorScheme);
29
+ }
30
+
31
+ export {
32
+ useTheme,
33
+ }