refactor: remove useless types

This commit is contained in:
sevichecc 2023-04-14 14:21:47 +08:00
parent d64e191e5e
commit 7d9cf2509b
Signed by untrusted user who does not match committer: SevicheCC
GPG key ID: C577000000000000
6 changed files with 189 additions and 183 deletions

View file

@ -0,0 +1,31 @@
import { useState } from "react";
import { Form } from "@raycast/api";
interface StatusContentProps {
isMarkdown: boolean;
}
const StatusContent = ({ isMarkdown }: StatusContentProps) => {
const [statusContent, setStatusContent] = useState<string>("");
const [error, setError] = useState<string>("");
return (
<>
<Form.TextArea
id="status"
title="Content"
placeholder="Write something down"
enableMarkdown={isMarkdown}
autoFocus={true}
value={statusContent}
error={error}
onChange={setStatusContent}
onBlur={() => {
setError(!statusContent ? "content should't be empty!" : "");
}}
/>
</>
);
};
export default StatusContent;

View file

@ -0,0 +1,31 @@
import { getPreferenceValues, Color, Icon, Form } from "@raycast/api";
import { Preference, VisibilityOption } from "../types";
const VisibilityDropdown = () => {
const { defaultVisibility }: Preference = getPreferenceValues();
const visibilityOptions: VisibilityOption[] = [
{ value: "public", title: "Public", icon: Icon.Livestream },
{ value: "unlisted", title: "Unlisted", icon: Icon.LivestreamDisabled },
{ value: "private", title: "Followers-only", icon: Icon.TwoPeople },
{ value: "direct", title: "Direct", icon: Icon.Envelope },
{ value: "local", title: "Local-only", icon: Icon.Pin },
];
return (
<>
<Form.Dropdown id="visibility" title="Visibility" storeValue={true} defaultValue={defaultVisibility}>
{visibilityOptions.map(({ value, title, icon }) => (
<Form.Dropdown.Item
key={value}
value={value}
title={title}
icon={{ source: icon, tintColor: Color.SecondaryText }}
/>
))}
</Form.Dropdown>
</>
);
};
export default VisibilityDropdown;

View file

@ -1,23 +1,18 @@
import { useEffect } from "react"; import { useEffect,useState } from "react";
import { Form, ActionPanel, Action, showToast } from "@raycast/api"; import { Form, ActionPanel, Action, showToast } from "@raycast/api";
import { authorize } from "./oauth";
import { postNewStatus } from "./api"; import { postNewStatus } from "./api";
import { Status, VisibilityOption } from "./types"; import { Status } from "./types";
import { authorize } from "./oauth";
import VisibilityDropdown from "./components/VisibilityDropdown";
import StatusContent from "./components/statusContent";
export default function Command() { export default function Command() {
const [isMarkdown, setIsMarkdown] = useState<boolean>(true);
useEffect(() => { useEffect(() => {
authorize(); authorize();
}, []); }, []);
const visibilityOptions: VisibilityOption[] = [ const handleSubmit = async (values: Partial<Status>) => {
{ value: "direct", title: "Direct" },
{ value: "private", title: "Private" },
{ value: "unlisted", title: "Unlisted" },
{ value: "public", title: "Public" },
{ value: "local", title: "Local" },
];
const handleSubmit = async (values: Status) => {
try { try {
await postNewStatus({ ...values }); await postNewStatus({ ...values });
showToast({ title: "Submitted form", message: "Status has been posted!" }); showToast({ title: "Submitted form", message: "Status has been posted!" });
@ -36,15 +31,19 @@ export default function Command() {
} }
> >
<Form.TextField id="textfield" title="Content Warning" placeholder="" /> <Form.TextField id="textfield" title="Content Warning" placeholder="" />
<Form.TextArea id="staus" title="Post detail" placeholder="" enableMarkdown={true} /> <StatusContent isMarkdown={isMarkdown} />
<Form.Separator /> <Form.Separator />
<Form.DatePicker id="datepicker" title="Scheduled Time" /> <Form.DatePicker id="datepicker" title="Scheduled Time" />
<Form.Dropdown id="visibility" title="Visibility" storeValue={true} defaultValue=""> <VisibilityDropdown />
{visibilityOptions.map(({value, title}) => (
<Form.Dropdown.Item key={value} value={value} title={title} />
))}
</Form.Dropdown>
<Form.FilePicker id="files" /> <Form.FilePicker id="files" />
<Form.Checkbox
id="content-type"
title="Markdown"
label="Yes"
value={isMarkdown}
onChange={setIsMarkdown}
storeValue={true}
/>
<Form.Checkbox id="sensitive" title="Sensitive" label="Sensitive" /> <Form.Checkbox id="sensitive" title="Sensitive" label="Sensitive" />
</Form> </Form>
); );

View file

@ -46,7 +46,6 @@ const refreshToken = async (
return tokenResponse; return tokenResponse;
}; };
export const authorize = async (): Promise<void> => { export const authorize = async (): Promise<void> => {
const { instance } = getPreferenceValues<Preference>(); const { instance } = getPreferenceValues<Preference>();
const tokenSet = await client.getTokens(); const tokenSet = await client.getTokens();

74
src/simple-status.tsx Normal file
View file

@ -0,0 +1,74 @@
import { useEffect, useState } from "react";
import { Form, ActionPanel, Action, showToast, popToRoot, LaunchProps } from "@raycast/api";
import { postNewStatus } from "./api";
import { Status } from "./types";
import { authorize } from "./oauth";
import VisibilityDropdown from "./components/VisibilityDropdown";
export default function Command(props: LaunchProps<{ draftValues: Partial<Status> }>) {
const { draftValues } = props;
const [statusContent, setStatusContent] = useState<string>(draftValues?.status || "");
const [cw, setCw] = useState<string>(draftValues?.spoiler_text || "");
const [isMarkdown, setIsMarkdown] = useState<boolean>(true);
const [error, setError] = useState<boolean>(false);
useEffect(() => {
authorize();
}, []);
const handleSubmit = async () => {
try {
const newStatus: Partial<Status> = {
spoiler_text: cw,
status: statusContent,
content_type: isMarkdown ? "text/markdown" : "text/plain",
visibility: "direct",
};
console.log(newStatus);
await postNewStatus(newStatus);
setCw('')
setStatusContent('')
showToast({ title: "Submitted form", message: "Status has been posted!" });
popToRoot();
} catch (error) {
console.error(error);
showToast({ title: "Error", message: "Something went wrong!" });
}
};
return (
<Form
enableDrafts
actions={
<ActionPanel>
<Action.SubmitForm onSubmit={handleSubmit} title="Publish!" />
</ActionPanel>
}
>
<Form.TextField id="spoiler_text" title="CW" placeholder="content warning" value={cw} onChange={setCw} />
<Form.TextArea
id="status"
title="Content"
placeholder="Write something down"
enableMarkdown={isMarkdown}
autoFocus={true}
value={statusContent}
error={error ? "Content should not be empty!" : ""}
onChange={setStatusContent}
onBlur={() => {
setError(!statusContent);
}}
/>
{/* <VisibilityDropdown/> */}
<Form.Checkbox
id="content-type"
title="Markdown"
label="Yes"
value={isMarkdown}
onChange={setIsMarkdown}
storeValue
/>
</Form>
);
}

View file

@ -1,15 +1,22 @@
export type VisibilityScope = "public" | "unlisted" | "direct" | "private" | "local" import type {Icon} from '@raycast/api'
export interface VisibilityOption {
title: string;
value: VisibilityScope
}
export interface Preference { export interface Preference {
instance: string; instance: string;
defaultVisibility: VisibilityScope; defaultVisibility: VisibilityScope;
} }
export type VisibilityScope = "public" | "unlisted" | "direct" | "private" | "local";
export interface VisibilityOption {
title: string;
value: VisibilityScope;
icon: Icon
}
interface Application {
name: string;
website: string;
}
export interface Credentials { export interface Credentials {
client_id: string; client_id: string;
client_secret: string; client_secret: string;
@ -24,170 +31,35 @@ export interface ApiResponse {
id: number; id: number;
created_at: string; created_at: string;
text: string; text: string;
};
export interface AppResponse {
client_id: string;
client_secret: string;
id: string;
name: string;
redirect_uri: string;
website: string;
vapid_key: string;
} }
interface Poll { interface Poll {
expired_in: number; expired_in: number;
hide_totals?: boolean | string; hide_totals?: boolean | string;
multiple?: boolean | string | number; multiple?: boolean | string | number;
options: string[] options: string[];
} }
export interface Status { export interface Status {
content_type?: string; spoiler_text: string;
expires_in?: number; status: string;
in_reply_to_conversation_id?: string; content_type: string;
in_reply_to_id?: string; expires_in: number;
language?: string; in_reply_to_conversation_id: string;
media_ids?: string[]; in_reply_to_id: string;
poll?: Poll; language: string;
preview?: boolean | string | number; media_ids: string[];
scheduled_at?: string; poll: Poll;
sensitive?: string | boolean | number; preview: boolean | string | number;
spoiler_text?: string; scheduled_at: Date;
status?: string; sensitive: string | boolean | number;
to?: string[]; to: string[];
visibility?: VisibilityScope; visibility: VisibilityScope;
} }
// interface Account { export interface StatusResponse {
// acct: string; id: string;
// avatar: string; create_at: Date;
// avatar_static: string; content: string;
// bot: boolean; application: Application
// created_at: string; }
// display_name: string;
// emojis: Emoji[];
// fields: Field[];
// followers_count: number;
// following_count: number;
// header: string;
// header_static: string;
// id: string;
// is_confirmed: boolean;
// note: string;
// pleroma: Pleroma;
// source: Source;
// statuses_count: number;
// url: string;
// username: string;
// }
// interface Emoji {
// shortcode: string;
// static_url: string;
// url: string;
// visible_in_picker: boolean;
// }
// interface Field {
// name: string;
// value: string;
// verified_at: string | null;
// }
// interface Pleroma {
// background_image: null;
// hide_favorites: boolean;
// hide_followers: boolean;
// hide_followers_count: boolean;
// hide_follows: boolean;
// hide_follows_count: boolean;
// is_admin: boolean;
// is_confirmed: boolean;
// is_moderator: boolean;
// relationship: Relationship;
// skip_thread_containment: boolean;
// tags: any[];
// }
// type Actor = "Application" | "Group" | "Organization" | "Person" | "Service"
// interface Relationship {
// blocked_by: boolean;
// blocking: boolean;
// domain_blocking: boolean;
// endorsed: boolean;
// followed_by: boolean;
// following: boolean;
// id: string;
// muting: boolean;
// muting_notifications: boolean;
// note: string;
// notifying: boolean;
// requested: boolean;
// showing_reblogs: boolean;
// subscribing: boolean;
// }
// interface Source {
// fields: Field[];
// note: string;
// pleroma: SourcePleroma;
// privacy: VisibilityScope;
// sensitive: boolean;
// }
// interface SourcePleroma {
// actor_type: Actor;
// discoverable: boolean;
// no_rich_text: boolean;
// show_role: boolean;
// }
// interface StatusResponse {
// account: Account;
// application: null;
// bookmarked: boolean;
// card: null;
// content: string;
// created_at: string;
// emojis: any[];
// favourited: boolean;
// favourites_count: number;
// id: string;
// in_reply_to_account_id: null;
// in_reply_to_id: null;
// language: null;
// media_attachments: any[];
// mentions: any[];
// muted: boolean;
// pinned: boolean;
// pleroma: StatusPleroma;
// poll: null;
// reblog: null;
// reblogged: boolean;
// reblogs_count: number;
// replies_count: number;
// sensitive: boolean;
// spoiler_text: string;
// tags: any[];
// uri: string;
// url: string;
// visibility: string;
// }
// interface StatusPleroma {
// content: PleromaContent;
// context: string;
// conversation_id: number;
// direct_conversation_id: null;
// emoji_reactions: any[];
// expires_at: null;
// in_reply_to_account_acct: null;
// local: boolean;
// spoiler_text: PleromaContent;
// thread_muted: boolean;
// }
// interface PleromaContent {
// "text/plain": string;
// }