@@ -1,8 +1,10 @@
1import React, { useCallback, useEffect, useState } from 'react';
1import React, { useCallback, useEffect, useState } from 'react';
2import { FormProvider, useForm } from 'react-hook-form';
2import { FormProvider, useForm } from 'react-hook-form';
3+import { useMutation, useQueryClient } from 'react-query';
3import { Link } from 'react-router-dom';
4import { Link } from 'react-router-dom';
4import api from '../api';
5import api from '../api';
5import { PostOptions } from '../components/PostOptions';
6import { PostOptions } from '../components/PostOptions';
7+import { Spinner } from '../components/Spinner';
6import { useApps } from '../state/apps';
8import { useApps } from '../state/apps';
7import { Declare, Listing, PostOption, PostOptionsForm } from '../types/sphinx';
9import { Declare, Listing, PostOption, PostOptionsForm } from '../types/sphinx';
@@ -11,7 +13,7 @@ function getAppKeys(apps: PostOption[]): string[] {
13export const Apps = () => {
15export const Apps = () => {
14− const apps = useApps();
16+ const { apps, loading } = useApps();
15 const form = useForm<PostOptionsForm>({
17 const form = useForm<PostOptionsForm>({
16 defaultValues: {
18 defaultValues: {
17 options: []
19 options: []
@@ -28,8 +30,9 @@ export const Apps = () => {
29 }, [apps, options, setValue]);
31 }, [apps, options, setValue]);
33+ const queryClient = useQueryClient();
31− const onSubmit = useCallback((values: PostOptionsForm) => {
34+ const { mutate } = useMutation(async (values: PostOptionsForm) => {
32− api.poke<Declare[]>({
35+ return api.poke<Declare[]>({
33 app: 'sphinx',
36 app: 'sphinx',
34 mark: 'declarations',
37 mark: 'declarations',
35 json: apps.filter(a => values.options.includes(a.key)).map(a => ({
38 json: apps.filter(a => values.options.includes(a.key)).map(a => ({
@@ -37,9 +40,16 @@ export const Apps = () => {
37 reach: 'friends'
40 reach: 'friends'
45+ queryClient.invalidateQueries('app-listings');
49+ const onSubmit = useCallback((values: PostOptionsForm) => {
42− }, [apps, reset]);
52+ }, [reset, mutate]);
@@ -54,7 +64,16 @@ export const Apps = () => {
55 <FormProvider {...form}>
65 <FormProvider {...form}>
56 <form onSubmit={handleSubmit(onSubmit)}>
66 <form onSubmit={handleSubmit(onSubmit)}>
67+ {apps.length === 0 && loading ? (
68+ <div className='flex items-center space-x-2 text-lavender'>
69+ <Spinner className='w-6 h-6' />
70+ <span>Checking apps...</span>
72+ ) : apps.length === 0 && !loading ? (
57− <PostOptions options={apps} emptyMessage="All apps already indexed" />
73+ <h2 className='text-lavender'>All apps already indexed</h2>
75+ <PostOptions options={apps} />
58 <div className='flex justify-between border-t border-zinc-300 py-3 mt-6'>
77 <div className='flex justify-between border-t border-zinc-300 py-3 mt-6'>
59 <Link to="/search" className='flex items-center rounded-lg text-base font-semibold text-rosy bg-rosy/30 border-2 border-transparent hover:border-rosy leading-none py-2 px-3 transition-colors'>
78 <Link to="/search" className='flex items-center rounded-lg text-base font-semibold text-rosy bg-rosy/30 border-2 border-transparent hover:border-rosy leading-none py-2 px-3 transition-colors'>
60 Back to Search
79 Back to Search