1919import type { MantineTheme } from "@mantine/core" ;
2020import { ActionIcon , Button , Flex , Kbd , Menu , TextInput , useMantineTheme } from "@mantine/core" ;
2121import debounce from "lodash-es/debounce" ;
22- import React , { forwardRef , memo , useCallback , useEffect , useMemo , useRef , useState } from "react" ;
22+ import React , { forwardRef , memo , useCallback , useContext , useEffect , useMemo , useRef , useState } from "react" ;
2323import * as Icon from "react-bootstrap-icons" ;
2424import PriorityIcon from "svg/icons/priority.svg" ;
2525import type { PriorityNumberType } from "rpc/transmission" ;
@@ -33,6 +33,9 @@ import { useHotkeysContext } from "hotkeys";
3333import { useHotkeys } from "@mantine/hooks" ;
3434import { modKeyString } from "trutil" ;
3535import { useServerSelectedTorrents } from "rpc/torrent" ;
36+ import { ConfigContext } from "config" ;
37+
38+ const { saveJsonFile, loadJsonFile } = await import ( /* webpackChunkName: "taurishim" */ "taurishim" ) ;
3639
3740interface ToolbarButtonProps extends React . PropsWithChildren < React . ComponentPropsWithRef < "button" > > {
3841 depressed ?: boolean ,
@@ -167,6 +170,8 @@ function useButtonHandlers(
167170}
168171
169172function Toolbar ( props : ToolbarProps ) {
173+ const config = useContext ( ConfigContext ) ;
174+
170175 const debouncedSetSearchTerms = useMemo (
171176 ( ) => debounce ( props . setSearchTerms , 500 , { trailing : true , leading : false } ) ,
172177 [ props . setSearchTerms ] ) ;
@@ -208,6 +213,30 @@ function Toolbar(props: ToolbarProps) {
208213 [ "mod + I" , props . toggleDetailsPanel ] ,
209214 ] ) ;
210215
216+ const onSettingsExport = useCallback ( ( ) => {
217+ void saveJsonFile ( config . getExportedInterfaceSettings ( ) , "trguing-interface.json" ) ;
218+ } , [ config ] ) ;
219+
220+ const onSettingsImport = useCallback ( async ( ) => {
221+ try {
222+ const settings = await loadJsonFile ( ) ;
223+ await config . tryMergeInterfaceSettings ( JSON . parse ( settings ) ) ;
224+ window . location . reload ( ) ;
225+ } catch ( e ) {
226+ let msg = "" ;
227+ if ( typeof e === "string" ) {
228+ msg = e ;
229+ } else if ( e instanceof Error ) {
230+ msg = e . message ;
231+ }
232+ notifications . show ( {
233+ title : "Error importing settings" ,
234+ message : msg ,
235+ color : "red" ,
236+ } ) ;
237+ }
238+ } , [ config ] ) ;
239+
211240 return (
212241 < Flex w = "100%" align = "stretch" >
213242 < Button . Group mx = "sm" >
@@ -329,6 +358,14 @@ function Toolbar(props: ToolbarProps) {
329358 onClick = { props . toggleDetailsPanel } rightSection = { < Kbd > { `${ modKeyString ( ) } I` } </ Kbd > } >
330359 Toggle details
331360 </ Menu . Item >
361+ < Menu . Divider />
362+ < Menu . Label > Interface settings</ Menu . Label >
363+ < Menu . Item onClick = { onSettingsExport } >
364+ Export
365+ </ Menu . Item >
366+ < Menu . Item onClick = { ( ) => { void onSettingsImport ( ) ; } } >
367+ Import
368+ </ Menu . Item >
332369 </ Menu . Dropdown >
333370 </ Menu >
334371
0 commit comments