5 changed files with 173 additions and 0 deletions
			
			
		- 
					77src/pages/app/plugin/index.tsx
 - 
					15src/pages/app/plugin/style.ts
 - 
					12src/service/app/package.ts
 - 
					42src/store/app/package.ts
 - 
					27src/types/app/package.d.ts
 
@ -0,0 +1,77 @@ | 
			
		|||||
 | 
				import {Button, Card, List, message, Select} from 'antd' | 
			
		||||
 | 
				import React, {useState} from 'react' | 
			
		||||
 | 
				import {useStyle} from './style' | 
			
		||||
 | 
				import {useAtomValue} from "jotai"; | 
			
		||||
 | 
				import {appAllListAtom, appPluginBuyAtom, appPluginListAtom} from "@/store/app/package.ts"; | 
			
		||||
 | 
				import ListPageLayout from "@/layout/ListPageLayout.tsx"; | 
			
		||||
 | 
				import {DollarOutlined} from "@ant-design/icons"; | 
			
		||||
 | 
				import {APP} from "@/types/app/package"; | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				const i18nPrefix = 'appPackages.list' | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				const AppPackage = () => { | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				  const {styles, cx} = useStyle() | 
			
		||||
 | 
				  const {data} = useAtomValue(appPluginListAtom) | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				  const {mutate: buyPlugin, isPending: buyPending} = useAtomValue(appPluginBuyAtom) | 
			
		||||
 | 
				  const {data: allApp} = useAtomValue(appAllListAtom) | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				  const [whitelistApp, setWhitelistApp] = useState(0); | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				  const buy = (item: APP.IAppPlugin) => { | 
			
		||||
 | 
				    if (item.code == "traffic") { | 
			
		||||
 | 
				      buyPlugin({plugin_id: item.id, code: item.code}) | 
			
		||||
 | 
				    } else if (item.code == "whitelist") { | 
			
		||||
 | 
				      if (whitelistApp == 0) { | 
			
		||||
 | 
				        message.warning('请先选择应用') | 
			
		||||
 | 
				        return | 
			
		||||
 | 
				      } | 
			
		||||
 | 
				      buyPlugin({plugin_id: item.id, code: item.code, app_id: whitelistApp}) | 
			
		||||
 | 
				    } | 
			
		||||
 | 
				  } | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				  return ( | 
			
		||||
 | 
				          <ListPageLayout className={styles.container}> | 
			
		||||
 | 
				            <List | 
			
		||||
 | 
				                    grid={{ | 
			
		||||
 | 
				                      gutter: 16, | 
			
		||||
 | 
				                      xs: 1, | 
			
		||||
 | 
				                      sm: 2, | 
			
		||||
 | 
				                      md: 2, | 
			
		||||
 | 
				                      lg: 3, | 
			
		||||
 | 
				                      xl: 4, | 
			
		||||
 | 
				                      xxl: 6, | 
			
		||||
 | 
				                    }} | 
			
		||||
 | 
				                    dataSource={data?.rows} | 
			
		||||
 | 
				                    renderItem={(item) => ( | 
			
		||||
 | 
				                            <List.Item> | 
			
		||||
 | 
				                              <Card | 
			
		||||
 | 
				                                      title={item.name} | 
			
		||||
 | 
				                                      style={{height: 400}} | 
			
		||||
 | 
				                                      styles={{body: {height: 300, overflow: 'hidden'}}} | 
			
		||||
 | 
				                                      actions={[ | 
			
		||||
 | 
				                                        item.code == "whitelist" ? ( | 
			
		||||
 | 
				                                                <Select placeholder="请选择应用"> | 
			
		||||
 | 
				                                                  {allApp?.map((item) => ( | 
			
		||||
 | 
				                                                          <option key={item.id} value={item.id}> | 
			
		||||
 | 
				                                                            {item.app_name} | 
			
		||||
 | 
				                                                          </option> | 
			
		||||
 | 
				                                                  ))}</Select> | 
			
		||||
 | 
				                                        ) : null, | 
			
		||||
 | 
				                                        <Button type="primary" icon={<DollarOutlined/>} onClick={() => buy(item)} | 
			
		||||
 | 
				                                                loading={buyPending}> | 
			
		||||
 | 
				                                          月付 ${item.month_price} | 
			
		||||
 | 
				                                        </Button>, | 
			
		||||
 | 
				                                      ]} | 
			
		||||
 | 
				                              > | 
			
		||||
 | 
				                                <p>{item.description}</p> | 
			
		||||
 | 
				                              </Card> | 
			
		||||
 | 
				                            </List.Item> | 
			
		||||
 | 
				                    )} | 
			
		||||
 | 
				            /> | 
			
		||||
 | 
				          </ListPageLayout> | 
			
		||||
 | 
				  ) | 
			
		||||
 | 
				} | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				export default AppPackage | 
			
		||||
@ -0,0 +1,15 @@ | 
			
		|||||
 | 
				import { createStyles } from '@/theme' | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				export const useStyle = createStyles(({ token, css, cx, prefixCls }, props: any) => { | 
			
		||||
 | 
				    const prefix = `${prefixCls}-${token?.proPrefix}-appPackage-plugin-page` | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				    const container = css`
 | 
			
		||||
 | 
				        .zcss-kfly0u{ | 
			
		||||
 | 
				            background: transparent; | 
			
		||||
 | 
				        } | 
			
		||||
 | 
				    `
 | 
			
		||||
 | 
				
 | 
			
		||||
 | 
				    return { | 
			
		||||
 | 
				        container: cx(prefix, props?.className, container), | 
			
		||||
 | 
				    } | 
			
		||||
 | 
				}) | 
			
		||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue