refactor: use managed official account avatars
This commit is contained in:
+16
-16
@@ -50,7 +50,7 @@ export interface paths {
|
|||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
* @example all
|
* @example active
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
state?: "active" | "archived" | "trashed" | "all" | null;
|
state?: "active" | "archived" | "trashed" | "all" | null;
|
||||||
@@ -346,7 +346,7 @@ export interface paths {
|
|||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
* @example group_only
|
* @example public
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
visibility?: "public" | "group_only" | null;
|
visibility?: "public" | "group_only" | null;
|
||||||
@@ -539,7 +539,7 @@ export interface paths {
|
|||||||
*/
|
*/
|
||||||
language_code?: string;
|
language_code?: string;
|
||||||
/**
|
/**
|
||||||
* @example published
|
* @example awaiting_publish
|
||||||
* @enum {string}
|
* @enum {string}
|
||||||
*/
|
*/
|
||||||
status?: "draft" | "awaiting_publish" | "published";
|
status?: "draft" | "awaiting_publish" | "published";
|
||||||
@@ -4357,7 +4357,7 @@ export interface paths {
|
|||||||
/** @example architecto */
|
/** @example architecto */
|
||||||
status?: string | null;
|
status?: string | null;
|
||||||
/**
|
/**
|
||||||
* @example instant_accept
|
* @example scheduled_booking
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
dispatch_mode?: "instant_accept" | "quote" | "scheduled_booking" | "manual_selection" | null;
|
dispatch_mode?: "instant_accept" | "quote" | "scheduled_booking" | "manual_selection" | null;
|
||||||
@@ -4677,7 +4677,7 @@ export interface paths {
|
|||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
* @example sent
|
* @example expired
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
status?: "sent" | "delivered" | "viewed" | "accepted" | "rejected" | "ignored" | "expired" | "taken_by_other" | null;
|
status?: "sent" | "delivered" | "viewed" | "accepted" | "rejected" | "ignored" | "expired" | "taken_by_other" | null;
|
||||||
@@ -4876,7 +4876,7 @@ export interface paths {
|
|||||||
*/
|
*/
|
||||||
status?: "created" | "confirmed" | "started" | "consumed" | "paid" | "fulfilled" | "canceled" | null;
|
status?: "created" | "confirmed" | "started" | "consumed" | "paid" | "fulfilled" | "canceled" | null;
|
||||||
/**
|
/**
|
||||||
* @example PAID
|
* @example UNPAID
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
payment_status?: "UNPAID" | "PAID" | null;
|
payment_status?: "UNPAID" | "PAID" | null;
|
||||||
@@ -5161,13 +5161,13 @@ export interface paths {
|
|||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
* @example inactive
|
* @example online
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
status?: "offline" | "online" | "inactive" | "busy" | null;
|
status?: "offline" | "online" | "inactive" | "busy" | null;
|
||||||
/** @example true */
|
/** @example true */
|
||||||
is_disabled?: boolean | null;
|
is_disabled?: boolean | null;
|
||||||
/** @example true */
|
/** @example false */
|
||||||
is_verified?: boolean | null;
|
is_verified?: boolean | null;
|
||||||
/**
|
/**
|
||||||
* @description Must be at least 1.
|
* @description Must be at least 1.
|
||||||
@@ -5452,12 +5452,12 @@ export interface paths {
|
|||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
* @example private
|
* @example public
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
visibility?: "public" | "friends" | "private" | null;
|
visibility?: "public" | "friends" | "private" | null;
|
||||||
/**
|
/**
|
||||||
* @example blocked
|
* @example all
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
status?: "blocked" | "visible" | "all" | null;
|
status?: "blocked" | "visible" | "all" | null;
|
||||||
@@ -5786,7 +5786,7 @@ export interface paths {
|
|||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
* @example blocked
|
* @example pending
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
status?: "pending" | "blocked" | "all" | null;
|
status?: "pending" | "blocked" | "all" | null;
|
||||||
@@ -6381,7 +6381,7 @@ export interface paths {
|
|||||||
q?: string | null;
|
q?: string | null;
|
||||||
/** @example null */
|
/** @example null */
|
||||||
type?: string | null;
|
type?: string | null;
|
||||||
/** @example false */
|
/** @example true */
|
||||||
verified?: boolean | null;
|
verified?: boolean | null;
|
||||||
/** @example false */
|
/** @example false */
|
||||||
is_global?: boolean | null;
|
is_global?: boolean | null;
|
||||||
@@ -7880,9 +7880,9 @@ export interface paths {
|
|||||||
* @example b
|
* @example b
|
||||||
*/
|
*/
|
||||||
q?: string | null;
|
q?: string | null;
|
||||||
/** @example true */
|
/** @example false */
|
||||||
status?: boolean | null;
|
status?: boolean | null;
|
||||||
/** @example true */
|
/** @example false */
|
||||||
is_robot?: boolean | null;
|
is_robot?: boolean | null;
|
||||||
/**
|
/**
|
||||||
* @description Must not be greater than 100 characters.
|
* @description Must not be greater than 100 characters.
|
||||||
@@ -9960,7 +9960,7 @@ export interface paths {
|
|||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
* @example blocked
|
* @example all
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
status?: "pending" | "blocked" | "all" | null;
|
status?: "pending" | "blocked" | "all" | null;
|
||||||
@@ -10395,7 +10395,7 @@ export interface paths {
|
|||||||
content: {
|
content: {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
/**
|
/**
|
||||||
* @example web
|
* @example android
|
||||||
* @enum {string|null}
|
* @enum {string|null}
|
||||||
*/
|
*/
|
||||||
platform?: "ios" | "android" | "web" | "desktop" | null;
|
platform?: "ios" | "android" | "web" | "desktop" | null;
|
||||||
|
|||||||
@@ -469,7 +469,6 @@ export interface OfficialAccountPayload {
|
|||||||
slug: string
|
slug: string
|
||||||
name: string
|
name: string
|
||||||
description?: string | null
|
description?: string | null
|
||||||
avatar_url?: string | null
|
|
||||||
owner_uid?: string | null
|
owner_uid?: string | null
|
||||||
verified?: boolean
|
verified?: boolean
|
||||||
type: OfficialAccountType
|
type: OfficialAccountType
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ const schema = z.object({
|
|||||||
slug: z.string().trim().min(1, '请填写账号标识').max(100).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, '仅支持小写字母、数字和连字符'),
|
slug: z.string().trim().min(1, '请填写账号标识').max(100).regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, '仅支持小写字母、数字和连字符'),
|
||||||
name: z.string().trim().min(1, '请填写显示名称').max(255),
|
name: z.string().trim().min(1, '请填写显示名称').max(255),
|
||||||
description: z.string(),
|
description: z.string(),
|
||||||
avatar_url: z.union([z.literal(''), z.url('请输入有效的头像 URL')]),
|
|
||||||
owner_uid: z.union([z.literal(''), z.string().length(26, '用户 UID 必须为 26 个字符')]),
|
owner_uid: z.union([z.literal(''), z.string().length(26, '用户 UID 必须为 26 个字符')]),
|
||||||
type: z.enum(['subscription', 'service', 'system']),
|
type: z.enum(['subscription', 'service', 'system']),
|
||||||
auto_reply_config: z.string().refine((value) => {
|
auto_reply_config: z.string().refine((value) => {
|
||||||
@@ -60,7 +59,6 @@ export function OfficialAccountEditSheet({ account, creating, onOpenChange, onSa
|
|||||||
slug: values.slug.trim(),
|
slug: values.slug.trim(),
|
||||||
name: values.name.trim(),
|
name: values.name.trim(),
|
||||||
description: values.description.trim() || null,
|
description: values.description.trim() || null,
|
||||||
avatar_url: values.avatar_url.trim() || null,
|
|
||||||
owner_uid: values.owner_uid.trim() || null,
|
owner_uid: values.owner_uid.trim() || null,
|
||||||
type: values.type,
|
type: values.type,
|
||||||
auto_reply_config: values.auto_reply_config.trim()
|
auto_reply_config: values.auto_reply_config.trim()
|
||||||
@@ -93,7 +91,6 @@ export function OfficialAccountEditSheet({ account, creating, onOpenChange, onSa
|
|||||||
<Field label="账号类型"><Controller control={form.control} name="type" render={({ field }) => <Select value={field.value} onValueChange={field.onChange}><SelectTrigger><SelectValue /></SelectTrigger><SelectContent><SelectItem value="subscription">订阅</SelectItem><SelectItem value="service">服务</SelectItem><SelectItem value="system">系统</SelectItem></SelectContent></Select>} /></Field>
|
<Field label="账号类型"><Controller control={form.control} name="type" render={({ field }) => <Select value={field.value} onValueChange={field.onChange}><SelectTrigger><SelectValue /></SelectTrigger><SelectContent><SelectItem value="subscription">订阅</SelectItem><SelectItem value="service">服务</SelectItem><SelectItem value="system">系统</SelectItem></SelectContent></Select>} /></Field>
|
||||||
<Field label="简介"><Textarea rows={3} {...form.register('description')} /></Field>
|
<Field label="简介"><Textarea rows={3} {...form.register('description')} /></Field>
|
||||||
<Field label="所有者 UID" error={form.formState.errors.owner_uid?.message}><Input placeholder="留空表示平台所有" {...form.register('owner_uid')} /></Field>
|
<Field label="所有者 UID" error={form.formState.errors.owner_uid?.message}><Input placeholder="留空表示平台所有" {...form.register('owner_uid')} /></Field>
|
||||||
<Field label="外部头像 URL" error={form.formState.errors.avatar_url?.message}><Input placeholder="可选;上传头像后将自动清除" {...form.register('avatar_url')} /></Field>
|
|
||||||
<Field label="上传头像" error={form.formState.errors.avatar?.message}><Input type="file" accept="image/png,image/jpeg,image/webp,image/gif,image/svg+xml" onChange={(event) => form.setValue('avatar', event.target.files?.[0], { shouldValidate: true })} /></Field>
|
<Field label="上传头像" error={form.formState.errors.avatar?.message}><Input type="file" accept="image/png,image/jpeg,image/webp,image/gif,image/svg+xml" onChange={(event) => form.setValue('avatar', event.target.files?.[0], { shouldValidate: true })} /></Field>
|
||||||
<Field label="自动回复配置" error={form.formState.errors.auto_reply_config?.message}><Textarea className="font-mono text-xs" rows={7} placeholder='{"mode":"local","rules":[]}' {...form.register('auto_reply_config')} /></Field>
|
<Field label="自动回复配置" error={form.formState.errors.auto_reply_config?.message}><Textarea className="font-mono text-xs" rows={7} placeholder='{"mode":"local","rules":[]}' {...form.register('auto_reply_config')} /></Field>
|
||||||
<Check control={form.control} name="verified" label="已认证" />
|
<Check control={form.control} name="verified" label="已认证" />
|
||||||
@@ -110,7 +107,6 @@ function defaults(account?: OfficialAccount | null): Values {
|
|||||||
slug: account?.slug ?? '',
|
slug: account?.slug ?? '',
|
||||||
name: account?.name ?? '',
|
name: account?.name ?? '',
|
||||||
description: account?.description ?? '',
|
description: account?.description ?? '',
|
||||||
avatar_url: account?.avatar_path ? '' : account?.avatar_url ?? '',
|
|
||||||
owner_uid: account?.owner_uid ?? '',
|
owner_uid: account?.owner_uid ?? '',
|
||||||
type: account?.type ?? 'subscription',
|
type: account?.type ?? 'subscription',
|
||||||
auto_reply_config: account?.auto_reply_config ? JSON.stringify(account.auto_reply_config, null, 2) : '',
|
auto_reply_config: account?.auto_reply_config ? JSON.stringify(account.auto_reply_config, null, 2) : '',
|
||||||
|
|||||||
Reference in New Issue
Block a user