"use client" import { useState, useEffect } from "react"; import { zodResolver } from "@hookform/resolvers/zod" import { useFieldArray, useForm } from "react-hook-form" import { z } from "zod" import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { Checkbox } from "@/components/ui/checkbox" import FetchWrapper from '@/hooks/FetchWrapper'; import { toast } from "sonner" import { Spinner } from '@/components/ui/spinner'; // Update the schema const countFormSchema = z.object({ post_type: z.array(z.string()).optional(), visitor_type: z.array(z.string()).optional(), interval_count: z.string().optional(), interval_unit: z.string().optional(), }) type CountFormValues = z.infer // This can come from your database or API. const defaultValues: Partial = { post_type: [], visitor_type: [], interval_count: "", interval_unit: "", } export function CountForm() { const api = new FetchWrapper(advico_plugin.pluginApiUrl, advico_plugin.nonce); const [settings, setSettings] = useState(null); const [isLoading, setIsLoading] = useState(true); const form = useForm({ resolver: zodResolver(countFormSchema), defaultValues, mode: "onChange", }) useEffect(() => { document.title = `Count Settings | ${advico_plugin.pluginName}`; api.get(`/settings/counts`) .then(data => { const response = data.data; setSettings(response); setIsLoading(false); // Ambil semua nilai selected dari post_types const selectedPostTypes = (response.post_types || []) .filter((item: any) => item.selected) .map((item: any) => item.id); // Ambil semua nilai selected dari visitor_types const selectedVisitorTypes = (response.exclude_visitors || []) .filter((item: any) => item.selected) .map((item: any) => item.id); form.reset({ post_type: selectedPostTypes, visitor_type: selectedVisitorTypes, interval_count: response.interval_count, interval_unit: response.interval_unit }); }) .catch(error => { console.error("Error fetching data:", error); }); }, []); const { fields, append } = useFieldArray({ name: "urls", control: form.control, }) const [isSubmitting, setIsSubmitting] = useState(false); function onSubmit(data: CountFormValues) { setIsSubmitting(true); api.put('/settings/counts/update', JSON.stringify(data)) .then(response => { toast.success('Settings updated successfully', { description: 'Your display settings have been saved.' }); setIsSubmitting(false); }) .catch(error => { console.error("Error updating settings:", error); toast.error('Failed to update settings', { description: 'Please try again later.' }); }); } if (isLoading) { return (
Loading...
); } return (
{/* Post Type */} (
Post Type Select post types for which the views count will be displayed.
{settings?.post_types?.map((item) => ( ( { return checked ? field.onChange([...field.value, item.id]) : field.onChange( field.value?.filter( (value) => value !== item.id ) ) }} /> {item.label} )} /> ))}
)} /> {/* Exclude Visitors */} (
Exclude Visitors Use it exclude specific user groups from post views count.
{settings?.exclude_visitors?.map((item) => ( ( { return checked ? field.onChange([...field.value, item.id]) : field.onChange( field.value?.filter( (value) => value !== item.id ) ) }} /> {item.label} )} /> ))}
)} />
Count Interval
( )} /> ( )} />
Enter the time between user visits. Use 0 to count every page view.
) }