diff --git a/.github/workflows/test-lint.yaml b/.github/workflows/test-lint.yaml index bc3a2cf9..352a0a41 100644 --- a/.github/workflows/test-lint.yaml +++ b/.github/workflows/test-lint.yaml @@ -11,7 +11,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v3 with: - node-version: 19 + node-version: 16 - name: Install Dependencies run: yarn install - name: Build packages diff --git a/packages/app/package.json b/packages/app/package.json index 051b63d1..d9e1eb3a 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -36,6 +36,7 @@ "throttle-debounce": "^5.0.0", "unist-util-visit": "^4.1.2", "use-long-press": "^2.0.3", + "uuid": "^9.0.0", "workbox-background-sync": "^6.4.2", "workbox-broadcast-update": "^6.4.2", "workbox-cacheable-response": "^6.4.2", @@ -84,6 +85,7 @@ "@types/node": "^18.11.18", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.10", + "@types/uuid": "^9.0.0", "@types/webscopeio__react-textarea-autocomplete": "^4.7.2", "@types/webtorrent": "^0.109.3", "@webscopeio/react-textarea-autocomplete": "^4.9.2", diff --git a/packages/app/src/Element/Nip5Service.tsx b/packages/app/src/Element/Nip5Service.tsx index 4106d944..20962783 100644 --- a/packages/app/src/Element/Nip5Service.tsx +++ b/packages/app/src/Element/Nip5Service.tsx @@ -21,6 +21,7 @@ import { useUserProfile } from "Hooks/useUserProfile"; import useEventPublisher from "Feed/EventPublisher"; import { debounce } from "Util"; import useLogin from "Hooks/useLogin"; +import SnortServiceProvider from "Nip05/SnortServiceProvider"; import messages from "./messages"; @@ -31,6 +32,7 @@ type Nip05ServiceProps = { link: string; supportLink: string; helpText?: boolean; + forSubscription?: string; onChange?(h: string): void; onSuccess?(h: string): void; }; @@ -188,6 +190,22 @@ export default function Nip5Service(props: Nip05ServiceProps) { } } + async function claimForSubscription(handle: string, domain: string, sub: string) { + if (!pubkey || !publisher) { + return; + } + + const svcEx = new SnortServiceProvider(publisher, props.service); + const rsp = await svcEx.registerForSubscription(handle, domain, sub); + if ("error" in rsp) { + setError(rsp); + } else { + if (props.onSuccess) { + const nip05 = `${handle}@${domain}`; + props.onSuccess(nip05); + } + } + } async function updateProfile(handle: string, domain: string) { if (user && publisher) { const nip05 = `${handle}@${domain}`; @@ -245,16 +263,27 @@ export default function Nip5Service(props: Nip05ServiceProps) { )} {availabilityResponse?.available && !registerStatus && (
-
- -
- {availabilityResponse.quote?.data.type} -
- startBuy(handle, domain)}> - + {!props.forSubscription && ( +
+ +
+ {availabilityResponse.quote?.data.type} +
+ )} + + props.forSubscription + ? claimForSubscription(handle, domain, props.forSubscription) + : startBuy(handle, domain) + }> + {props.forSubscription ? ( + + ) : ( + + )}
)} diff --git a/packages/app/src/Element/NoteCreator.tsx b/packages/app/src/Element/NoteCreator.tsx index a89c4f47..0c4b1753 100644 --- a/packages/app/src/Element/NoteCreator.tsx +++ b/packages/app/src/Element/NoteCreator.tsx @@ -52,8 +52,19 @@ export function NoteCreator() { const { formatMessage } = useIntl(); const publisher = useEventPublisher(); const uploader = useFileUpload(); - const { note, zapForward, sensitive, pollOptions, replyTo, otherEvents, preview, active, show, showAdvanced, error } = - useSelector((s: RootState) => s.noteCreator); + const { + note, + zapForward, + sensitive, + pollOptions, + replyTo, + otherEvents, + preview, + active, + show, + showAdvanced, + error, + } = useSelector((s: RootState) => s.noteCreator); const [uploadInProgress, setUploadInProgress] = useState(false); const dispatch = useDispatch(); diff --git a/packages/app/src/Login/Preferences.ts b/packages/app/src/Login/Preferences.ts index 774817e9..005714d1 100644 --- a/packages/app/src/Login/Preferences.ts +++ b/packages/app/src/Login/Preferences.ts @@ -74,7 +74,6 @@ export interface UserPreferences { } export const DefaultPreferences = { - language: "en", enableReactions: true, reactionEmoji: "+", autoLoadMedia: "follows-only", diff --git a/packages/app/src/Nip05/SnortServiceProvider.ts b/packages/app/src/Nip05/SnortServiceProvider.ts index 4fcc6d36..c4d58a1d 100644 --- a/packages/app/src/Nip05/SnortServiceProvider.ts +++ b/packages/app/src/Nip05/SnortServiceProvider.ts @@ -42,6 +42,15 @@ export default class SnortServiceProvider extends ServiceProvider { return this.getJsonAuthd(`/${id}`, "PATCH", obj); } + async registerForSubscription(handle: string, domain: string, id: string) { + return this.getJsonAuthd(`/registration/register/${id}`, "PUT", { + name: handle, + domain, + pk: "", + ref: "snort", + }); + } + async getJsonAuthd( path: string, method?: "GET" | string, diff --git a/packages/app/src/Pages/Verification.tsx b/packages/app/src/Pages/Verification.tsx index 25ebfd5b..158a0889 100644 --- a/packages/app/src/Pages/Verification.tsx +++ b/packages/app/src/Pages/Verification.tsx @@ -7,14 +7,16 @@ import messages from "./messages"; import "./Verification.css"; -export const services = [ - { - name: "Snort", - service: `${ApiHost}/api/v1/n5sp`, - link: "https://snort.social/", - supportLink: "https://snort.social/help", - about: , - }, +export const SnortNostrAddressService = { + name: "Snort", + service: `${ApiHost}/api/v1/n5sp`, + link: "https://snort.social/", + supportLink: "https://snort.social/help", + about: , +}; + +export const Nip5Services = [ + SnortNostrAddressService, { name: "Nostr Plebs", service: "https://nostrplebs.com/api/v1", @@ -48,7 +50,7 @@ export default function VerificationPage() { - {services.map(a => ( + {Nip5Services.map(a => ( ))} diff --git a/packages/app/src/Pages/new/GetVerified.tsx b/packages/app/src/Pages/new/GetVerified.tsx index d3d7436f..a420596c 100644 --- a/packages/app/src/Pages/new/GetVerified.tsx +++ b/packages/app/src/Pages/new/GetVerified.tsx @@ -3,7 +3,7 @@ import { FormattedMessage } from "react-intl"; import { useNavigate } from "react-router-dom"; import Logo from "Element/Logo"; -import { services } from "Pages/Verification"; +import { Nip5Services } from "Pages/Verification"; import Nip5Service from "Element/Nip5Service"; import ProfileImage from "Element/ProfileImage"; import { useUserProfile } from "Hooks/useUserProfile"; @@ -66,7 +66,7 @@ export default function GetVerified() {
setIsVerified(true)} @@ -85,7 +85,7 @@ export default function GetVerified() {
setIsVerified(true)} diff --git a/packages/app/src/Pages/settings/Preferences.tsx b/packages/app/src/Pages/settings/Preferences.tsx index 289c968a..e477d7d4 100644 --- a/packages/app/src/Pages/settings/Preferences.tsx +++ b/packages/app/src/Pages/settings/Preferences.tsx @@ -5,7 +5,7 @@ import { Link } from "react-router-dom"; import emoji from "@jukben/emoji-search"; import useLogin from "Hooks/useLogin"; -import { DefaultPreferences, updatePreferences, UserPreferences } from "Login"; +import { updatePreferences, UserPreferences } from "Login"; import { DefaultImgProxy } from "Const"; import { unwrap } from "Util"; @@ -30,7 +30,7 @@ const PreferencesPage = () => {